{"version":3,"file":"all.full.min_unc.js","mappings":"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/C;;;;;;;;;;;;;;;;;ACzBA,IAAI,eAA2C;AAAA,EAC9C,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,WAAM;AAAA,EACN,WAAM;AAAA,EACN,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,gBAAM;AAAA,EACN,gBAAM;AAAA,E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AK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,WAAM;AAAA,EACN,WAAM;AAAA,EACN,WAAM;AAAA,EACN,WAAM;AAAA,EACN,WAAM;AAAA,EACN,WAAM;AAAA,EACN,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UA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BACoD;AAEU;AAAA,EAAtE,4DAAS,CAAC,oGAAmD;AAAA,GAHrD,0BAG8D;AAH9D,4BAAN;AAAA,EADN,uDAAI,CAAC,uEAAwB;AAAA,GACjB;AAgCb,SAAS,wBAAwB,WAAmB,UAA2B;AAC3E,MAAI,aAAa,UAAU,UAAU,GAAG;AACpC,WAAO;AAAA,EACX;AACA,SAAO,KAAK,WAAW,UAAU,CAAC,EAAE,YAAY,IAAI,UAAU,MAAM,CAAC;AACzE;;;;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa;;AAEb;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,mBAAmB;;AAEnB;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,sBAAsB;AACxC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,eAAe;AACf;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA,oBAAoB,SAAS;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;;AAEA,kCAAkC,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,iBAAiB;AACrC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ;AACR;AACA,uCAAuC,QAAQ;AAC/C;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,OAAO;AACzB;AACA;AACA;;AAEA;AACA,SAAS,yBAAyB;AAClC;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,gBAAgB;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oBAAoB,MAAM,iBAAiB,mCAAmC,gBAAgB,KAAK,oBAAoB,gBAAgB,GAAwB;AAC/J;;;;;;;;;;;;;;;;;ACD6B,2BAA2B,OAAO,uDAAC,EAAE,yCAAyC,EAAuB;AAClI;;;;;;;;;;;;;;;;;ACD+D,8BAA8B,WAAW,sBAAsB,KAAK,yFAAC,UAAU,KAA0B;AACxK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACD0gB;AAC1gB;;;;;;;;;;;;;;;;;;;;;;;;;;ACDA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,+BAA+B,mBAAmB;AAClD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,0BAA0B,KAAK;AAC/B;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,mBAAmB,gBAAgB;AACnC;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kBAAkB,sBAAsB;AACxC,YAAY,cAAc;AAC1B;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,qJAAqJ;AACrJ,aAAa,QAAQ;AACrB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,gBAAgB;AACzD;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA,mBAAmB,gBAAgB;AACnC;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,0CAA0C;AAC1C,UAAU,wBAAwB,QAAQ;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA,YAAY,4BAA4B;AACxC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,0BAA0B,eAAe;AACzC;;AAEA;AACA,0BAA0B,gBAAgB;AAC1C;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,SAAS;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,QAAQ;AAC1B;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,YAAY,6BAA6B;;AAEzC;AACA,yBAAyB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,UAAU,cAAc,UAAU;AACpF;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA,kEAAkE,oBAAoB;AACtF;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,yCAAyC,oBAAoB;AAC7D;AACA;;AAEA,uBAAuB;AACvB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,OAAO;AACvB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,kBAAkB;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,sBAAsB,wDAAwD,IAAI;AAClF;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,UAAU;AACrC,yBAAyB,UAAU;AACnC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yBAAyB;AACzB,wBAAwB,4BAA4B;AACpD;;AAEA,6BAA6B;AAC7B,wBAAwB,6BAA6B;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,gCAAgC,IAAI,eAAe;AACjF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,cAAc;AACd,cAAc,iBAAiB;AAC/B;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B;AAC3B;AACA;AACA;AACA;;AAEA,+BAA+B;AAC/B;AACA;;AAEA,wBAAwB;AACxB;AACA;;AAEA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,qBAAqB,YAAY,IAAI,qBAAqB,IAAI,oBAAoB;AAClF;AACA;;AAEA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,wCAAwC,IAAI,SAAS,EAAE;AACvD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,4CAA4C,mCAAmC;AAC/E;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,MAAM;AACN,uBAAuB,oCAAoC;AAC3D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,MAAM;AACnB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB;AAChB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,aAAa,kBAAkB;AAC/B;AACA;AACA;AACA;;AAEA,sBAAsB,iBAAiB;AACvC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0BAA0B,qBAAqB,EAAE,OAAO;AACxD;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,eAAe,QAAQ;AACvB,gBAAgB,QAAQ;AACxB,gBAAgB,QAAQ;AACxB,gBAAgB,UAAU;AAC1B;;AAEA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,aAAa,mBAAmB;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA,gEAAgE;AAChE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,YAAY,IAAI,iBAAiB;AACjD,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,qBAAqB,OAAO,WAAW,aAAa,SAAS,KAAK;AAClE;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,WAAW;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,UAAU,mBAAmB;AAC7B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;;AAEA,WAAW;AACX;;AAEA;AACA,UAAU,gCAAgC;AAC1C;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;;AAEA,UAAU,aAAa;AACvB,WAAW;AACX;;AAEA;AACA,UAAU,mBAAmB;AAC7B;AACA,WAAW;AACX;;AAEA;AACA,UAAU,gBAAgB;AAC1B,UAAU,aAAa;AACvB,WAAW;AACX;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;;AAEA;AACA,UAAU,oCAAoC;AAC9C;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,GAAG,IAAI;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C,UAAU;AACvD;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,yEAAyE;AACzE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qBAAqB;;AAErB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,yDAAyD,MAAM;AAC/D;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,gBAAgB,KAAK,EAAE,mBAAmB,GAAG,qBAAqB;AAClE;AACA,gBAAgB,KAAK,EAAE,MAAM,EAAE,kBAAkB,QAAQ,OAAO;AAChE;AACA,gBAAgB,KAAK,EAAE,mBAAmB,EAAE,qBAAqB;AACjE;AACA,2CAA2C,QAAQ;AACnD;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,4CAA4C,eAAe;AAC3D;AACA,6CAA6C,eAAe;AAC5D;AACA,yCAAyC,eAAe;AACxD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB,UAAU,EAAE,SAAS,aAAa,UAAU,EAAE,QAAQ;AAC7E;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,iCAAiC;AACjC;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oBAAoB,gBAAgB;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA,wBAAwB,sDAAsD;AAC9E;AACA;AACA;AACA;AACA;;AAEA;AACA,oBAAoB,mEAAmE;AACvF;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gDAAgD,uBAAuB;AACvE;AACA;;AAEA,2BAA2B;AAC3B,sCAAsC,uBAAuB;AAC7D;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,mBAAmB;;AAEnB;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO;AACP;AACA;AACA;AACA,qBAAqB,mCAAmC;AACxD;AACA;AACA;AACA,kCAAkC,gBAAgB,IAAI,+BAA+B;AACrF;AACA;AACA;AACA;AACA,6BAA6B,kBAAkB,IAAI,gDAAgD;AACnG;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA,6DAA6D,aAAa;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAkC,4CAA4C;AAC9E;AACA;AACA,kCAAkC,2CAA2C;AAC7E;AACA;AACA,kCAAkC,4CAA4C;AAC9E;AACA;AACA,+CAA+C,0CAA0C;AACzF;AACA;AACA,+CAA+C,yCAAyC;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,gBAAgB;AACnE;AACA,mDAAmD,gBAAgB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kCAAkC;AAC3D;AACA;AACA;AACA;AACA,yBAAyB,kCAAkC;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA,yBAAyB,kBAAkB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mDAAmD,iBAAiB;AACpE;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA,yBAAyB,iBAAiB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA,OAAO;AACP;AACA;AACA,kBAAkB,cAAc;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,kFAAkF,wBAAwB;AAC1G;AACA;AACA;AACA;AACA;;AAEA,+BAA+B,MAAM,sBAAsB,MAAM,oBAAoB,MAAM;;AAE3F;AACA;AACA,oBAAoB,KAAK;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C,SAAS;AACT,WAAW;AACX;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B,mBAAmB,UAAU,iBAAiB;AAC5E,iEAAiE,KAAK;AACtE,+BAA+B,wBAAwB,EAAE,gBAAgB;AACzE,+CAA+C,oBAAoB;AACnE,6BAA6B,EAAE,IAAI,EAAE;AACrC,0BAA0B,EAAE;AAC5B,6BAA6B,EAAE,OAAO,EAAE;AACxC;AACA;AACA,yBAAyB,EAAE,kBAAkB;AAC7C;AACA,KAAK,yBAAyB,MAAM,mBAAmB,IAAI,iBAAiB;AAC5E;AACA,4CAA4C,oBAAoB;;AAEhE;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;;AAEA;AACA;AACA,YAAY;AACZ;;AAEA;;AAEA,iCAAiC,wBAAwB;;AAEzD;;AAEA;AACA,mBAAmB,KAAK,QAAQ,KAAK,eAAe,KAAK,QAAQ,KAAK,eAAe,KAAK,QAAQ,KAAK,eAAe,KAAK,QAAQ,KAAK,mBAAmB,KAAK,QAAQ,KAAK,eAAe,KAAK,QAAQ,KAAK,eAAe,KAAK,cAAc,KAAK;;AAErP;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,6CAA6C,IAAI,0DAA0D,IAAI;;AAE/G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,kGAAkG,EAAE;AACpG;AACA;AACA;AACA,0HAA0H,EAAE;;AAE5H;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,aAAa,6DAA6D;AAC1E,eAAe,sCAAsC;AACrD,eAAe,oBAAoB;AACnC,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,oCAAoC,GAAG;AAC3E;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,gDAAgD,oBAAoB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,sBAAsB,KAAK,sBAAsB;AACjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;;AAEH;AACA,uBAAuB,kCAAkC,iBAAiB;AAC1E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,4VAA4V,0BAA0B,qBAAqB;AAC3Y;AACA;AACA;AACA,6CAA6C,0BAA0B,GAAG,0BAA0B,MAAM,uBAAuB;AACjI,8BAA8B,qBAAqB,GAAG,sBAAsB,GAAG,qBAAqB,GAAG,oBAAoB,GAAG,qBAAqB,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,6BAA6B;AACvO,6BAA6B,uBAAuB,KAAK,gCAAgC;AACzF,qEAAqE,oBAAoB,GAAG,qBAAqB,GAAG,yBAAyB,GAAG,mBAAmB,GAAG,2BAA2B,GAAG,uBAAuB,OAAO,sBAAsB;AACxP,yEAAyE,kBAAkB,GAAG,qBAAqB,GAAG,wBAAwB,OAAO;AACrJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA,iCAAiC,qBAAqB;AACtD;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA,aAAa,4BAA4B;AACzC;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,MAAM;AACN;AACA,qCAAqC,cAAc,UAAU,oBAAoB;AACjF;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,uEAAuE;AACvE,0DAA0D;AAC1D,0DAA0D;AAC1D,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,0DAA0D,KAAK;AAC/D;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA,qEAAqE;AACrE,8DAA8D;AAC9D,+DAA+D;AAC/D,6DAA6D;AAC7D,8DAA8D;AAC9D,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,0DAA0D,KAAK;AAC/D;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN,4BAA4B,SAAS;AACrC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF,wBAAwB;AAC9G,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,wCAAwC;AACrD,oCAAoC,+BAA+B;AACnE,oCAAoC,+BAA+B;AACnE,oCAAoC,+BAA+B;AACnE,oCAAoC,qBAAqB,oBAAoB,iBAAiB;AAC9F,oCAAoC,uBAAuB,oBAAoB,iBAAiB;AAChG,oCAAoC,uBAAuB,oBAAoB,iCAAiC;AAChH,cAAc;AACd;AACA,yBAAyB;AACzB,iCAAiC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB;AACA;AACA,qCAAqC,2CAA2C;AAChF;AACA,mBAAmB,mBAAmB;AACtC,mBAAmB,sBAAsB;AACzC,mBAAmB,kBAAkB;AACrC;AACA;AACA,mBAAmB;AACnB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6BAA6B,sEAAsE;AACnG;AACA,OAAO;AACP;;AAEA;AACA,uBAAuB,iEAAiE;AACxF;AACA;;AAEA;AACA;AACA,oCAAoC,+BAA+B,oBAAoB;AACvF,cAAc;AACd;AACA;AACA;AACA,aAAa;AACb;;AAEA;AACA;AACA;AACA,oCAAoC,uBAAuB;AAC3D,oCAAoC,wBAAwB;AAC5D,oCAAoC,WAAW;AAC/C,oCAAoC,YAAY;AAChD,oCAAoC,iBAAiB;AACrD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,oCAAoC,WAAW;AAC/C,oCAAoC,WAAW,cAAc,4BAA4B;AACzF,oCAAoC,WAAW,cAAc,uBAAuB;AACpF,oCAAoC,WAAW,cAAc,qBAAqB;AAClF,oCAAoC,WAAW,cAAc,iBAAiB;AAC9E,cAAc;AACd;AACA,qBAAqB;AACrB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,mDAAmD,aAAa;AAChE;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,yBAAyB,UAAU,8BAA8B;AACjE,MAAM;AACN,yBAAyB,mBAAmB,qBAAqB;AACjE;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA,+DAA+D;AAC/D,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,wBAAwB;AACrC,cAAc;AACd;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,2BAA2B,gBAAgB;AAC3C;;AAEA;AACA;AACA,aAAa,wBAAwB;AACrC,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,oCAAoC,uBAAuB,8BAA8B;AACzF,oCAAoC,uBAAuB,uDAAuD;AAClH,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,gBAAgB;AAC3C;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,mCAAmC,kBAAkB;AACrD,mCAAmC,kBAAkB;AACrD,mCAAmC,kBAAkB;AACrD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,wBAAwB,aAAa;AACrC,wBAAwB,uBAAuB;AAC/C,cAAc;AACd;AACA;AACA;;AAEA,oBAAoB;AACpB,2BAA2B,eAAe;AAC1C;;AAEA;AACA;AACA,gCAAgC,iBAAiB;AACjD,cAAc;AACd;AACA,gBAAgB,sDAAsD,IAAI;AAC1E,iCAAiC,yBAAyB;AAC1D,mBAAmB;AACnB;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,mCAAmC,SAAS;AAC5C,mCAAmC,SAAS;AAC5C,mCAAmC,UAAU;AAC7C,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC,sBAAsB,gCAAgC;AAC1F,oCAAoC,YAAY,gCAAgC;AAChF,oCAAoC,yBAAyB,gCAAgC;AAC7F,oCAAoC,+BAA+B,gCAAgC;AACnG,cAAc;AACd;AACA;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;;AAEA;AACA;AACA,oCAAoC,qBAAqB,8BAA8B;AACvF,cAAc;AACd;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;;AAEA;AACA;AACA,oCAAoC,uBAAuB,uDAAuD;AAClH,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,oBAAoB;AACpB,sBAAsB;AACtB;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,2BAA2B,eAAe;AAC1C;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oCAAoC,uBAAuB,6BAA6B;AACxF,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,iBAAiB;AAC5C;;AAEA;AACA;AACA,oCAAoC,yCAAyC,kCAAkC;AAC/G,cAAc;AACd;AACA;AACA;AACA;AACA,2BAA2B,cAAc;AACzC;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AACA;AACA,2EAA2E,eAAe,UAAU,YAAY;AAChH;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA,yFAAyF,eAAe;AACxG;AACA;AACA;AACA,8CAA8C,6BAA6B,GAAG,qBAAqB,GAAG,sBAAsB,MAAM,uBAAuB;AACzJ,wBAAwB,sBAAsB,KAAK,oBAAoB;AACvE,qDAAqD,qBAAqB,GAAG,sBAAsB,GAAG,uBAAuB,GAAG,wBAAwB,GAAG,uBAAuB,MAAM,wBAAwB;AAChN,wEAAwE,mBAAmB,GAAG,uBAAuB,GAAG,uBAAuB,GAAG,6BAA6B,GAAG,qBAAqB,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,4BAA4B,MAAM,0BAA0B;AACpT,kEAAkE,sBAAsB,GAAG,wBAAwB,GAAG,0BAA0B,GAAG,wBAAwB,GAAG;AAC9K,yEAAyE,wBAAwB,GAAG,8BAA8B,GAAG,qBAAqB,GAAG,yBAAyB,GAAG,yBAAyB,GAAG,wBAAwB,OAAO,0BAA0B;AAC9Q;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN,4BAA4B,SAAS;AACrC;AACA;;AAEA;AACA;AACA,aAAa,sBAAsB;AACnC,aAAa,sBAAsB;AACnC,cAAc;AACd;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,aAAa,sBAAsB;AACnC,aAAa,wBAAwB;AACrC,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,sBAAsB;AACnC,aAAa,wBAAwB;AACrC,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ,0BAA0B,wBAAwB,gBAAgB;AACvF;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA,wDAAwD,KAAK;AAC7D;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,uBAAuB;AACpC;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,SAAS,uHAAuH;AAC7I,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,mCAAmC,sBAAsB;AACzD,MAAM;AACN;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,UAAU;AACvB,aAAa,UAAU;AACvB,cAAc;AACd;AACA,QAAQ,aAAa,IAAI;AACzB;AACA;AACA;;AAEA;AACA;AACA,aAAa,aAAa;AAC1B,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,IAAI;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,aAAa,wBAAwB;AACrC,cAAc;AACd;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU,IAAI;AACd;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA,kLAAkL;AAClL,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,UAAU;AACvB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,OAAO;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA,YAAY;AACZ;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA,UAAU,sBAAsB;AAChC,UAAU,sBAAsB;AAChC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,aAAa;AAC1B,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,eAAe,gBAAgB,IAAI,eAAe;AAClD;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,yBAAyB,SAAS,eAAe,SAAS,iBAAiB;AAC3E,MAAM;AACN,yBAAyB,mBAAmB,qBAAqB;AACjE;AACA;;AAEA;AACA;AACA;AACA,MAAM,0BAA0B,IAAI,2BAA2B;AAC/D;AACA;AACA;AACA;AACA,aAAa,QAAQ;AACrB;AACA,aAAa,QAAQ;AACrB,wF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AAgB,IAAI;AACzC;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA,kCAAkC,cAAc;AAChD,cAAc;AACd;AACA,kCAAkC,gBAAgB,IAAI;AACtD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC;AACrC,cAAc;AACd;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA,4CAA4C,qBAAqB;AACjE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,gCAAgC,kBAAkB;AAClD;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA,WAAW;AACX;;AAEA;AACA,yBAAyB,KAAK;AAC9B;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW;AACX;;AAEA;AACA,WAAW;AACX;;AAEA;AACA,iCAAiC;AACjC;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA,4BAA4B,EAAE;AAC9B,8BAA8B,EAAE;AAChC,6BAA6B,EAAE;AAC/B,4BAA4B,EAAE;AAC9B,iCAAiC,IAAI;AACrC,mCAAmC,IAAI;AACvC,iCAAiC,IAAI;AACrC,kCAAkC,IAAI;AACtC,kCAAkC,IAAI;AACtC,kCAAkC,IAAI;AACtC,wBAAwB,qEAAqE;AAC7F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,gBAAgB,QAAQ,WAAW;AAC9E;AACA,2CAA2C,gBAAgB,IAAI,WAAW;AAC1E;AACA;AACA;AACA,mCAAmC,MAAM;AACzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA,UAAU,cAAc;;AAExB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA,QAAQ;AACR;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,2DAA2D,EAAE,GAAG,SAAS;AACzE,cAAc,GAAG;AACjB;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ,uBAAuB;AACvB;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,GAAG,IAAI;;AAEP;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,UAAU,8CAA8C;AACxD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,sDAAsD,UAAU;AAChE;;AAEA;AACA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mCAAmC;AAC3D;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,WAAW;AACX;;AAEA;AACA;AACA;AACA,UAAU,gBAAgB;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,IAAI;AACJ;AACA,8CAA8C,KAAK,uBAAuB,OAAO;AACjF;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;;AAEH;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW,MAAM;AACjB,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA,wBAAwB,kBAAkB;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA,UAAU;AACV,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oGAAoG,qBAAqB,GAAG,mBAAmB,uBAAuB,0BAA0B,oDAAoD,uBAAuB,GAAG,wBAAwB,OAAO,2BAA2B,kDAAkD,0BAA0B,4CAA4C,0BAA0B;AAC1d,8IAA8I,wBAAwB,YAAY,oBAAoB,GAAG,qBAAqB;AAC9N,IAAI,mBAAmB,GAAG,oBAAoB,GAAG,s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8BAA8B;AAClE,oCAAoC,YAAY;AAChD,oCAAoC,iCAAiC;AACrE,oCAAoC,iCAAiC,IAAI,aAAa;AACtF,oCAAoC,iCAAiC,IAAI,eAAe;AACxF,oCAAoC,iCAAiC,IAAI,0BAA0B;AACnG,oCAAoC,2CAA2C;AAC/E,oCAAoC,0DAA0D,IAAI,iBAAiB;AACnH,cAAc;AACd;AACA,kCAAkC;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY,kCAAkC;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;;AAEP;AACA;AACA;AACA;AACA,+CAA+C,oBAAoB,gBAAgB,aAAa;AAChG;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA,iEAAiE,cAAc;AAC/E,2DAA2D,YAAY;AACvE;AACA,cAAc;AACd;AACA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA,cAAc;AACd;AACA,oCAAoC;AACpC;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA,cAAc;AACd;AACA,iCAAiC;AACjC;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA,wCAAwC;AACxC;AACA;AACA;;AAEA,YAAY,wCAAwC;AACpD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,MAAM;AACN,mEAAmE,IAAI;AACvE;AACA;;AAEA;AACA;AACA;AACA,wCAAwC;AACxC;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,aAAa;AAC1B,aAAa,SAAS;AACtB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA,gFAAgF,eAAe;AAC/F,4DAA4D,6BAA6B;AACzF;AACA,cAAc;AACd;AACA,gCAAgC;AAChC;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,MAAM;AACN,4BAA4B,SAAS;AACrC;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,uDAAuD;AACvD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA,0CAA0C;AAC1C;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,uDAAuD;AACvD,qDAAqD;AACrD,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,iDAAiD,kBAAkB;AACnE;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,gDAAgD,kBAAkB;AAClE;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,mDAAmD,kBAAkB;AACrE;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA,kDAAkD,kBAAkB;AACpE;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;AACA,MAAM;AACN;AACA,iCAAiC,kBAAkB;AACnD,iCAAiC,UAAU;AAC3C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,eAAe;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,SAAS,iBAAiB,SAAS;AAC/D;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA;AACA,uCAAuC,gBAAgB;AACvD,uCAAuC,gBAAgB;AACvD,YAAY;AACZ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,QAAQ;AACrB,cAAc;AACd;AACA,iCAAiC;AACjC,YAAY,oCAAoC;AACh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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA;AACA,qCAAqC,sBAAsB;AAC3D,qCAAqC,oBAAoB;AACzD,cAAc;AACd;AACA,cAAc,uEAAuE,IAAI;AACzF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,aAAa,QAAQ;AACrB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB,aAAa,SAAS;AACtB;AACA;AACA,kDAAkD,sBAAsB;AACxE,kDAAkD,mBAAmB;AACrE,cAAc;AACd;AACA,iBAAiB;AACjB;AACA;AACA;;AAEA,cAAc,kBAAkB,EAAE,qBAAqB;AACvD;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA,yBAAyB,MAAM,aAAa,UAAU,eAAe,YAAY,cAAc;AAC/F,MAAM;AACN,yBAAyB,mBAAmB,qBAAqB;AACjE;AACA;;AAEA;AACA,gEAAgE;AAChE,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA,cAAc;AACd;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,aAAa,SAAS;AACtB,+CAA+C;AAC/C,cAAc;AACd;AACA,oBAAoB;AACpB;;AAEA,mBAAmB;;AAEnB;AACA;AACA;AACA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AEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;;AAEA;AACA,MAAM,+BAA+B;AACrC,YAAY;AACZ;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA,IAAI;AACJ;AA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","sources":["webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/dayjs/dayjs.min.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/dayjs/plugin/customParseFormat.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/dayjs/plugin/utc.js","webpack://DataGrid/./Sub_Components/src/CacheBlockHandler/CacheBlockHandler.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/Filter.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/FilterExecutioner.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/FilterRegistry.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/Contains.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/DoesNotContains.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/EndsWith.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/Equals.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/Greater.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/GreaterOrEqual.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/IsBetween.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/IsEmpty.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/IsNotBetween.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/IsNotEmpty.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/Less.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/LessOrEquals.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/NotEquals.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/filters/StartsWith.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/removeAccents.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/Filter/utils.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/GroupBy/GroupBy.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/sort/Sort.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/sort/SortRegistry.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/sort/removeAccents.ts","webpack://DataGrid/./Sub_Components/src/DataProcessor/sort/utils.ts","webpack://DataGrid/./Sub_Components/src/KeyEventsComponent/Constants/KeyEventConstants.ts","webpack://DataGrid/./Sub_Components/src/KeyEventsComponent/KeyEventHandler.ts","webpack://DataGrid/./Sub_Components/src/Utilities/EscapeHandler.ts","webpack://DataGrid/./Sub_Components/src/Utilities/Stack/StackDS.ts","webpack://DataGrid/./Sub_Components/src/Utilities/Utility.ts","webpack://DataGrid/./Sub_Components/src/auto-scroll-handler/auto-scroll-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/checkbox-configuration.types.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/checkbox-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/checkbox.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/constants/checkbox-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/checkbox-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/controller/checkbox-controller-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/controller/checkbox-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/model/checkbox-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/model/checkbox-options-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/model/checkbox-state-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/model/checkbox-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/model/checkbox-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/core/view/checkbox-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/List/src/renderer/loading-option-renderer.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/constants/beanname-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/model/multiline-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/model/multiline-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/model/multiline-option-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/model/multiline-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/model/multiline-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/multiline-root/multiline-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/multiline-root/multiline-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/multiline-root/multiline-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/multiline-textArea/multiline-textArea-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/multiline-textArea/multiline-textArea-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/render-multiline-root/render-multiline-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/render-multiline-root/render-multiline-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/render-multiline-textArea/render-multiline-textArea-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/render-multiline-textArea/render-multiline-textArea-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/core/utility.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/multi-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/multiline-configuration.types.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/multiline.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Prefix/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Prefix/prefix-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Prefix/prefix-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Prefix/prefix-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Suffix/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Suffix/suffix-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Suffix/suffix-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Suffix/suffix-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/constants/beanname-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/customformatter.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/model/text-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/model/text-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/model/text-option-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/model/text-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/model/text-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/rendering-text-input/rendering-text-input-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/rendering-text-input/rendering-text-input-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/rendering-text-root/rendering-text-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/rendering-text-root/rendering-text-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/text-input/text-input-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/text-input/text-input-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/text-root/text-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/text-root/text-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/text-root/text-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/core/utility.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text-configuration.types.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Components/TooltipRenderer.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Components/TooltipUserComponentHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Constants/DefaultTooltipValues.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Constants/TooltipBeanName.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Constants/TooltipEvents.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/ControllerHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/CustomTooltip.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/PopupHandler/CorePopupHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Tooltip.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/TooltipAPI.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/TooltipHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/TooltipOptionsHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/TooltipPopHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/VirtualList/AbstractVirtualList.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/VirtualList/ContainerHeightHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/VirtualList/ElementVirtualList.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/VirtualList/utils/browser.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/VirtualList/utils/object.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/addOnAfter/end-adornment-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/addOnAfter/end-adornment-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/addOnAfter/end-adornment-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/addOnAfter/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/addOnBefore/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/addOnBefore/start-adornment-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/addOnBefore/start-adornment-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/addOnBefore/start-adornment-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/ButtonCoreComponent.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/button.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/constants/bean-name-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/core/button-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/core/button-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/core/button-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/model/button-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/model/button-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/model/button-option-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/model/button-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/button/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/calendar-core-components.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/calendar.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/constant/bean-name-constant.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/constant/event-name.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-button/calendar-button-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-button/calendar-button-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-cell/calendar-cell-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-cell/calendar-cell-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-container/calendar-container-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-container/calendar-container-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-day-container/calendar-day-container-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-day-container/calendar-day-container-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-nav-bar/calendar-nav-bar-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-nav-bar/calendar-nav-bar-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-weeday/calendar-weekday-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/calendar-weeday/calendar-weekday-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/model/calendar-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/model/calendar-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/model/calendar-data-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/model/calendar-options-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/model/calendar-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/model/calendar-view-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/model/popup-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/root/calendar-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/root/calendar-root-contoller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/root/calendar-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/time-dropdown-hanlder/time-dropdown-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/time-nav-bar/time-nav-bar-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/time-nav-bar/time-nav-bar-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/core/user-component/buttonRenderer.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/calendar/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/chip-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/chip.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/constants/chip-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/chip-remove/chip-remove-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/chip-remove/chip-remove-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/chip-root/chip-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/chip-root/chip-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/chip-root/chip-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/chip-thumbnail/chip-thumbnail-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/chip-thumbnail/chip-thumbnail-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/model/chip-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/model/chip-controller-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/model/chip-options-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/model/chip-state-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/model/chip-tooltip-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/model/chip-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/core/user-component/chip-icon-renderer.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/chip/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/constant/bean-name-constant.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/constant/event-name.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/calendar-icon-readonly/calendar-icon-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/calendar-icon-readonly/calendar-icon-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/calendar-icon/calendar-icon-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/calendar-icon/calendar-icon-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-button/date-time-button-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-button/date-time-button-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-input/date-time-input-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-input/date-time-input-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-readonly-input/date-time-readonly-input-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-readonly-input/date-time-readony-input-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-readonly-root/date-time-readonly-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-readonly-root/date-time-readonly-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-readonly-root/date-time-readonly-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-root/date-time-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-root/date-time-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-root/date-time-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-spin-button/spin-button-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/date-time-spin-button/spin-button-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-picker-interacter.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-picker-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-event-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-input-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-input-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-keyboard-shorcuts.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-model.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-options-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-selection-service.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/date-time-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/placeholder-engine-integration.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/placeholder-engine/adapters/format-provider-adapter.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/placeholder-engine/placeholder-engine.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/model/popup-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/core/user-component/buttonRenderer.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/date-time-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/date-time.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/description/description-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/description/description-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/description/description-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/description/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/dropdown-core.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/dropdown.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/component/DefaultChipRenderer.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/component/DefaultLabelRenderer.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/constants/beanname-constant.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-Footer-container/dropdownFooterContainer-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-Footer-container/dropdownFooterContainer-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-Header-container/dropdownHeaderContainer-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-Header-container/dropdownHeaderContainer-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-body-container/dropdownBodyContainer-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-body-container/dropdownBodyContainer-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-container/dropdownContainer-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-container/dropdownContainer-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-create-newoption/dropdown-create-newoption-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-create-newoption/dropdown-create-newoption-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-loading/dropdown-loading-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-loading/dropdown-loading-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-no-option/dropdown-no-option-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-no-option/dropdown-no-option-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-option/dropdown-option-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-option/dropdown-option-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-root/dropdown-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-root/dropdown-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-root/dropdown-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-search/dropdown-search-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-search/dropdown-search-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-selectAll/dropdown-selectAll-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown-selectAll/dropdown-selectAll-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown/dropdown-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown/dropdown-list.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/dropdown/dropdown-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/model/dropdown-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/model/dropdown-ds.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/model/dropdown-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/model/dropdown-option-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/core/model/dropdown-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/dropdown/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/error/error-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/error/error-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/error/error-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/error/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/label/form-label-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/label/label-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/label/label-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/label/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/constants/link-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/controller/link-controller-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/controller/link-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/link-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/model/PhoneFormatter.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/model/link-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/model/link-options-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/model/link-state-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/model/link-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/model/link-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/core/view/link-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/link-configuration.types.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/link-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/link/link.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/constants/beanname-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/constants/event-name.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-adjuster-model.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-adjuster.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-event-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-keyboard-shortcuts.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-option-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-tooltip-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/model/number-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/CurrencyModule.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/DecimalModule.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/PercentageModule.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/number-button/number-button-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/number-button/number-button-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/number-input/number-input-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/number-input/number-input-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/number-root/number-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/number-root/number-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/number-utils/number-classnames-slots.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/number-utils/number-template.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/rendering-number-input/rendering-number-input-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/rendering-number-input/rendering-number-input-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/rendering-number-root/rendering-number-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/rendering-number-root/rendering-number-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/spin-button/spin-button-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/spin-button/spin-button-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/user-component/buttonRenderer.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/formatter/CurrencyFormatter.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/formatter/NumberFormatter.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/formatter/PercentageFormatter.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/modules/ModuleRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/number-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/number.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/constants/beanname-constants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/constants/event-name.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/model/rating-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/model/rating-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/model/rating-event-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/model/rating-model.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/model/rating-option-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/model/rating-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/model/rating-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-container/rating-container-contoller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-container/rating-container-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-input-wrapper/rating-input-wrapper-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-input-wrapper/rating-input-wrapper-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-input/rating-input-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-input/rating-input-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-root/rating-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-root/rating-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-svg/rating-svg-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-svg/rating-svg-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-utils/keyboard-event-util.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/core/rating-utils/rating-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/modules/ModuleRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/rating-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/rating.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/select-core-component.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/select.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/constants/beanname-constant.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/ellipses/ellipses-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/ellipses/ellipses-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/model/popup-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/model/select-api.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/model/select-configApi.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/model/select-ds.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/model/select-input-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/model/select-option-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/model/select-state-manager.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/model/select-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/plus-icon/plus-icon-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/plus-icon/plus-icon-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-container/select-container-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-container/select-container-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-input-wrapper/select-input-wrapper-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-input-wrapper/select-input-wrapper-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-input/select-input-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-input/select-input-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-root/select-root-classes.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-root/select-root-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/select-root/select-root-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/selectbox-icon/selectbox-icon-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/core/selectbox-icon/selectbox-icon-view.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/select/src/modules/CSSRegistry.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/selectInteractor/selectDropdownInteractor.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/token/src/utilities/Constants/KeyEventConstants.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/token/src/utilities/KeyEventHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/token/src/utilities/Utility.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/utility/PopupHandler/CorePopupHandler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/utility/abstract-controller.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/utility/abstract-user-component-handler.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/utility/clipboard.ts","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/utility/create-svg-template.ts","webpack://DataGrid/./src/Autofit/ColumnAutofit/column-autofitHandler.ts","webpack://DataGrid/./src/DataStore/DraftRowUtility.ts","webpack://DataGrid/./src/DataStore/GroupRowNode.ts","webpack://DataGrid/./src/DataStore/Local/ClientDataBlock.ts","webpack://DataGrid/./src/DataStore/Local/DraftRowHandler.ts","webpack://DataGrid/./src/DataStore/Local/FilterHandler.ts","webpack://DataGrid/./src/DataStore/Local/RowGroupingHandler.ts","webpack://DataGrid/./src/DataStore/Local/SortHandler.ts","webpack://DataGrid/./src/DataStore/Remote/RemoteCacheBlock.ts","webpack://DataGrid/./src/DataStore/Remote/RemoteDataBlock.ts","webpack://DataGrid/./src/DataStore/Remote/TreeGridRemoteDataBlock.ts","webpack://DataGrid/./src/DataStore/RowAxis/Axis.ts","webpack://DataGrid/./src/DataStore/RowAxis/DynamicRowAxis.ts","webpack://DataGrid/./src/DataStore/RowAxis/RowBlockAxisCore.ts","webpack://DataGrid/./src/DataStore/RowAxis/groupedRowAxisCore.ts","webpack://DataGrid/./src/DataStore/RowAxis/newAxis.ts","webpack://DataGrid/./src/DataStore/RowBlockCommon.ts","webpack://DataGrid/./src/DataStore/RowNodeCore.ts","webpack://DataGrid/./src/DataStore/RowNodeHolder.ts","webpack://DataGrid/./src/DragAndDrop-handler/dragAndDrop-handler.ts","webpack://DataGrid/./src/FillSeries/fill-series.ts","webpack://DataGrid/./src/GalleryModelClasses/Gallery.ts","webpack://DataGrid/./src/GalleryModelClasses/GalleryAxis/GalleryAxis.ts","webpack://DataGrid/./src/GalleryModelClasses/GalleryAxis/GalleryBlockAxis.ts","webpack://DataGrid/./src/GalleryModelClasses/GalleryAxis/GalleryConstants.ts","webpack://DataGrid/./src/GalleryModelClasses/GalleryAxis/GalleryGroupAxis.ts","webpack://DataGrid/./src/GalleryModelClasses/GalleryBeanClassRegistry.ts","webpack://DataGrid/./src/GalleryModelClasses/GalleryGroupRowNode.ts","webpack://DataGrid/./src/GalleryModelClasses/GalleryRowNode.ts","webpack://DataGrid/./src/GalleryModelClasses/gallery-module.ts","webpack://DataGrid/./src/GalleryModelClasses/gallery-option-handler.ts","webpack://DataGrid/./src/GanttModelClasses/Api/GanttApi.ts","webpack://DataGrid/./src/GanttModelClasses/Api/GanttPaginationApi.ts","webpack://DataGrid/./src/GanttModelClasses/Api/GanttTaskApi.ts","webpack://DataGrid/./src/GanttModelClasses/Constant/GanttBeanNameConstant.ts","webpack://DataGrid/./src/GanttModelClasses/Core/ActionComponent/ActionComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/ActionComponent/ActionController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/Contoller/GanttControllerHandler.ts","webpack://DataGrid/./src/GanttModelClasses/Core/GanttComponent/GanttComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/GanttComponent/GanttConfigParser.ts","webpack://DataGrid/./src/GanttModelClasses/Core/GanttComponent/GanttController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/GanttComponent/GanttTemplate.ts","webpack://DataGrid/./src/GanttModelClasses/Core/GanttDateComputationEngine/GanttDateComputationEngine.ts","webpack://DataGrid/./src/GanttModelClasses/Core/GanttStateHandler.ts","webpack://DataGrid/./src/GanttModelClasses/Core/OptionsHandler/GanttOptionsHandler.ts","webpack://DataGrid/./src/GanttModelClasses/Core/OptionsHandler/viewsCommunicationHandler.ts","webpack://DataGrid/./src/GanttModelClasses/Core/Pagination/PaginationController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TaskBarComponent/TaskBarHolderComponent/DragResizeTooltipHandler.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TaskBarComponent/TaskBarHolderComponent/EmtyBarFullWidthController/EmtyBarFullWidthController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TaskBarComponent/TaskBarHolderComponent/TaskBarHolderComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TaskBarComponent/TaskBarHolderComponent/TaskBarHolderController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TaskBarComponent/TaskBarHolderComponent/ToolTipComponent/ToolTipComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TaskBarComponent/TaskBarInteractionState.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/BottomTeirComponent/BottomTierHolderComponent/BottomTierHolderComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/BottomTeirComponent/BottomTierHolderComponent/BottomTierHolderController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/BottomTeirComponent/BottomTierLabelContainerComponent/BottomTierLabelContainerComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/BottomTeirComponent/BottomTierLabelContainerComponent/BottomTierLabelContainerController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/BottomTeirComponent/BottomTierTextComponent/BottomTierTextComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/BottomTeirComponent/BottomTierTextComponent/BottomTierTextController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/TimelineDataProvider/TimelineDataProvider.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/TimelineHeaderComponent/TimelineHeaderComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/TimelineHeaderComponent/TimelineHeaderController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/TopTeirComponent/TopTierHolderComponent/TopTierHolderComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/TopTeirComponent/TopTierHolderComponent/TopTierHolderController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/TopTeirComponent/TopTierTextComponent/TopTierTextComponent.ts","webpack://DataGrid/./src/GanttModelClasses/Core/TimelineHeaderComponent/TopTeirComponent/TopTierTextComponent/TopTierTextController.ts","webpack://DataGrid/./src/GanttModelClasses/Core/UserComponentHandler/UserComponentHandler.ts","webpack://DataGrid/./src/GanttModelClasses/Gantt.ts","webpack://DataGrid/./src/GanttModelClasses/GanttApiHandler.ts","webpack://DataGrid/./src/GanttModelClasses/GanttComponentRegistry.ts","webpack://DataGrid/./src/GanttModelClasses/GanttCoreComponent.ts","webpack://DataGrid/./src/GanttModelClasses/GanttEventHandler.ts","webpack://DataGrid/./src/GanttModelClasses/ResizeController/ResizeUtil.ts","webpack://DataGrid/./src/GanttModelClasses/TaskBarRenderer/TaskbarComponent.ts","webpack://DataGrid/./src/GanttModelClasses/TaskBarRenderer/TaskbarController.ts","webpack://DataGrid/./src/Grid/API/APIErrorHandler.ts","webpack://DataGrid/./src/Grid/API/APIHandler.ts","webpack://DataGrid/./src/Grid/API/CellAPI/CellAPIHookHandler.ts","webpack://DataGrid/./src/Grid/API/CellAPI/CellAPIInteracter.ts","webpack://DataGrid/./src/Grid/API/CellAPI/CellAPIManager.ts","webpack://DataGrid/./src/Grid/API/CellAPI/CellAPIValidator.ts","webpack://DataGrid/./src/Grid/API/ClipboardAPI/ClipboardAPIManager.ts","webpack://DataGrid/./src/Grid/API/ColumnAPI/ColumnAPIInteracter.ts","webpack://DataGrid/./src/Grid/API/ColumnAPI/ColumnAPIManager.ts","webpack://DataGrid/./src/Grid/API/ColumnAPI/ColumnAPIValidator.ts","webpack://DataGrid/./src/Grid/API/ColumnAPI/ColumnHookAction.ts","webpack://DataGrid/./src/Grid/API/ColumnAPI/Interface/IColumnAPI.ts","webpack://DataGrid/./src/Grid/API/FilterAPI/FilterApiManager.ts","webpack://DataGrid/./src/Grid/API/FilterAPI/FilterApiValidator.ts","webpack://DataGrid/./src/Grid/API/FilterAPI/FilterHookHandler.ts","webpack://DataGrid/./src/Grid/API/FloatingRowAPI/FloatingRowAPIInteracter.ts","webpack://DataGrid/./src/Grid/API/FloatingRowAPI/FloatingRowAPIManager.ts","webpack://DataGrid/./src/Grid/API/FloatingRowAPI/FloatingRowAPIValidator.ts","webpack://DataGrid/./src/Grid/API/FloatingRowAPI/FloatingRowAPiHookAction.ts","webpack://DataGrid/./src/Grid/API/GridApi.ts","webpack://DataGrid/./src/Grid/API/GridExperimentalAPI.ts","webpack://DataGrid/./src/Grid/API/PinningAPI/PinningAPIInteracter.ts","webpack://DataGrid/./src/Grid/API/PinningAPI/PinningAPIManager.ts","webpack://DataGrid/./src/Grid/API/PinningAPI/PinningAPIValidator.ts","webpack://DataGrid/./src/Grid/API/PinningAPI/PinningHookHandler.ts","webpack://DataGrid/./src/Grid/API/RangeSelectionAPI/range-selection-api.ts","webpack://DataGrid/./src/Grid/API/ReorderableAPI/ReorderableAPI.ts","webpack://DataGrid/./src/Grid/API/ReorderableAPI/ReorderableAPIHookAction.ts","webpack://DataGrid/./src/Grid/API/ReorderableAPI/ReorderableAPIInteracter.ts","webpack://DataGrid/./src/Grid/API/ReorderableAPI/ReorderableAPIValidator.ts","webpack://DataGrid/./src/Grid/API/RowAPI/Interface/IRowAPI.ts","webpack://DataGrid/./src/Grid/API/RowAPI/Interface/IRowAPIHookParams.types.ts","webpack://DataGrid/./src/Grid/API/RowAPI/RowAPIHookAction.ts","webpack://DataGrid/./src/Grid/API/RowAPI/RowAPIInteracter.ts","webpack://DataGrid/./src/Grid/API/RowAPI/RowAPIManager.ts","webpack://DataGrid/./src/Grid/API/RowAPI/RowAPIValidator.ts","webpack://DataGrid/./src/Grid/API/RowGroupingAPI/Interface/IRowGroupingApiManager.types.ts","webpack://DataGrid/./src/Grid/API/RowGroupingAPI/RowGroupingApiManager.ts","webpack://DataGrid/./src/Grid/API/RowGroupingAPI/RowGroupingHookHandler.ts","webpack://DataGrid/./src/Grid/API/RowGroupingAPI/RowGroupingValidator.ts","webpack://DataGrid/./src/Grid/API/SortAPI/SortApiManager.ts","webpack://DataGrid/./src/Grid/API/SortAPI/SortApiValidator.ts","webpack://DataGrid/./src/Grid/API/SortAPI/SortHookHandler.ts","webpack://DataGrid/./src/Grid/API/TreeAPI/Interface/ITreeApi.ts","webpack://DataGrid/./src/Grid/API/TreeAPI/TreeAPIInteracter.ts","webpack://DataGrid/./src/Grid/API/TreeAPI/TreeApiHookHandler.ts","webpack://DataGrid/./src/Grid/API/TreeAPI/TreeApiManager.ts","webpack://DataGrid/./src/Grid/API/TreeAPI/TreeApiValidator.ts","webpack://DataGrid/./src/Grid/API/navigation/list-navigation-api.ts","webpack://DataGrid/./src/Grid/API/navigation/navigation-api.ts","webpack://DataGrid/./src/Grid/API/selection/column-selection-api-validator.ts","webpack://DataGrid/./src/Grid/API/selection/column-selection-api.ts","webpack://DataGrid/./src/Grid/API/selection/row-selection-api-validator.ts","webpack://DataGrid/./src/Grid/API/selection/row-selection-api.ts","webpack://DataGrid/./src/Grid/API/selection/selection-index/row-selection-index-api-validator.ts","webpack://DataGrid/./src/Grid/API/selection/selection-index/row-selection-index-api.ts","webpack://DataGrid/./src/Grid/API/user-presence/user-presence-api.ts","webpack://DataGrid/./src/Grid/API/user-presence/user-presence-hooks.ts","webpack://DataGrid/./src/Grid/API/user-presence/user-presence-validator.ts","webpack://DataGrid/./src/Grid/ComponentUtils.ts","webpack://DataGrid/./src/Grid/Components/CellComponents/CellLoading.ts","webpack://DataGrid/./src/Grid/Components/CellComponents/CellRenderer.ts","webpack://DataGrid/./src/Grid/Components/ColumnReorderRenderer.ts","webpack://DataGrid/./src/Grid/Components/GroupCellRenderer/FullWidthGroupCellController.ts","webpack://DataGrid/./src/Grid/Components/GroupCellRenderer/FullWidthGroupCellRenderer.ts","webpack://DataGrid/./src/Grid/Components/NoRecordFoundRenderer.ts","webpack://DataGrid/./src/Grid/Components/RowMovedRenderer.ts","webpack://DataGrid/./src/Grid/Components/RowReorderRenderer.ts","webpack://DataGrid/./src/Grid/Core/AbosultePositionHandler.ts","webpack://DataGrid/./src/Grid/Core/BasicLayoutPositionHandler.ts","webpack://DataGrid/./src/Grid/Core/Buffer/column/ColumnAddButtonGridRenderer.ts","webpack://DataGrid/./src/Grid/Core/Buffer/column/ColumnBufferHandler.ts","webpack://DataGrid/./src/Grid/Core/Buffer/column/ColumnBufferItem.ts","webpack://DataGrid/./src/Grid/Core/Buffer/row/RowBufferHandler.ts","webpack://DataGrid/./src/Grid/Core/Buffer/row/RowBufferItem.ts","webpack://DataGrid/./src/Grid/Core/Buffer/row/RowPlusGridRenderer.ts","webpack://DataGrid/./src/Grid/Core/ColumnHoverHandler.ts","webpack://DataGrid/./src/Grid/Core/Columns/AutoUnpinnedLeftColumns.ts","webpack://DataGrid/./src/Grid/Core/Columns/ColumnDataTypeHandler.ts","webpack://DataGrid/./src/Grid/Core/Columns/ColumnHandler.ts","webpack://DataGrid/./src/Grid/Core/Columns/ColumnNode.ts","webpack://DataGrid/./src/Grid/Core/Columns/ColumnSizeHandler.ts","webpack://DataGrid/./src/Grid/Core/Columns/FieldAxis.ts","webpack://DataGrid/./src/Grid/Core/Columns/FieldHandler.ts","webpack://DataGrid/./src/Grid/Core/Columns/FieldPaneInfoHandler.ts","webpack://DataGrid/./src/Grid/Core/Columns/PinnedHandler.ts","webpack://DataGrid/./src/Grid/Core/Columns/RecordHeaderPaneInfoHandler.ts","webpack://DataGrid/./src/Grid/Core/Columns/column-visible-handler.ts","webpack://DataGrid/./src/Grid/Core/Components/ColumnReorderController/ColumnReorderListener.ts","webpack://DataGrid/./src/Grid/Core/Components/ExtraRecordController/ExtraRecordComponent.ts","webpack://DataGrid/./src/Grid/Core/Components/ExtraRecordController/GridExtraRowComponent.ts","webpack://DataGrid/./src/Grid/Core/Components/GridComponentMetadataProvider.ts","webpack://DataGrid/./src/Grid/Core/Components/UserComponentHandler.ts","webpack://DataGrid/./src/Grid/Core/Components/UserComponentRegistry.ts","webpack://DataGrid/./src/Grid/Core/Constants/BeanName.ts","webpack://DataGrid/./src/Grid/Core/Constants/CSSClassNameContants.ts","webpack://DataGrid/./src/Grid/Core/Constants/Events.ts","webpack://DataGrid/./src/Grid/Core/Constants/GridConfigurationConstants.ts","webpack://DataGrid/./src/Grid/Core/Constants/GridConstants.ts","webpack://DataGrid/./src/Grid/Core/Constants/platformUtils.ts","webpack://DataGrid/./src/Grid/Core/ControllerHandler/ControllerHandler.ts","webpack://DataGrid/./src/Grid/Core/Decorator/ReferenceSelector.ts","webpack://DataGrid/./src/Grid/Core/Events/Events.ts","webpack://DataGrid/./src/Grid/Core/GridBeanClassRegistry.ts","webpack://DataGrid/./src/Grid/Core/GridBodyScrollHandler.ts","webpack://DataGrid/./src/Grid/Core/GridCoreComponent.ts","webpack://DataGrid/./src/Grid/Core/GridLayoutPositionHandler.ts","webpack://DataGrid/./src/Grid/Core/GridOptionHandler.ts","webpack://DataGrid/./src/Grid/Core/Hooks/Constants/HookEventsName.ts","webpack://DataGrid/./src/Grid/Core/Hooks/HookManager.ts","webpack://DataGrid/./src/Grid/Core/Interface/IColumnDefinition.ts","webpack://DataGrid/./src/Grid/Core/Interface/IColumnNode.ts","webpack://DataGrid/./src/Grid/Core/Interface/IGridConfiguration.ts","webpack://DataGrid/./src/Grid/Core/Interface/IRowNode.ts","webpack://DataGrid/./src/Grid/Core/Interface/IUserPresenceMeta.ts","webpack://DataGrid/./src/Grid/Core/MinSpareHandler/min-spare-handler.ts","webpack://DataGrid/./src/Grid/Core/ModuleRegistry.ts","webpack://DataGrid/./src/Grid/Core/Navigation/KeyBoardEventKeys.ts","webpack://DataGrid/./src/Grid/Core/Navigation/SelectionHandler.ts","webpack://DataGrid/./src/Grid/Core/Navigation/SelectionInfoHandler.ts","webpack://DataGrid/./src/Grid/Core/Navigation/SelectionInfoWithDeselect.ts","webpack://DataGrid/./src/Grid/Core/Navigation/focus-handler.ts","webpack://DataGrid/./src/Grid/Core/PopupHandler.ts","webpack://DataGrid/./src/Grid/Core/RequestAnimationFrame/RequestAnimationFrameHandler.ts","webpack://DataGrid/./src/Grid/Core/RequestAnimationFrame/RequestAnimationTaskList.ts","webpack://DataGrid/./src/Grid/Core/ResizeObserver.ts","webpack://DataGrid/./src/Grid/Core/ResizeObserverPolyfill.ts","webpack://DataGrid/./src/Grid/Core/RowHoverHandler.ts","webpack://DataGrid/./src/Grid/Core/Rows/FieldHeaderInfoHandler.ts","webpack://DataGrid/./src/Grid/Core/Rows/RecordAxis.ts","webpack://DataGrid/./src/Grid/Core/Rows/RecordHandler.ts","webpack://DataGrid/./src/Grid/Core/Rows/RowModel.ts","webpack://DataGrid/./src/Grid/Core/Rows/RowNode.ts","webpack://DataGrid/./src/Grid/Core/Rows/RowRenderController.ts","webpack://DataGrid/./src/Grid/Core/StylingHandler.ts","webpack://DataGrid/./src/Grid/Core/UserPresence/UserPresenceHandler.ts","webpack://DataGrid/./src/Grid/Core/UserPresence/UserPresenceItem.ts","webpack://DataGrid/./src/Grid/Core/ViewportRangeModule.ts","webpack://DataGrid/./src/Grid/Core/actions/action-registry.ts","webpack://DataGrid/./src/Grid/Core/actions/key-board-shortcut-registry.ts","webpack://DataGrid/./src/Grid/Core/generic-data-store.ts","webpack://DataGrid/./src/Grid/Core/key-board-shortcut.ts","webpack://DataGrid/./src/Grid/Core/stateHandler.ts","webpack://DataGrid/./src/Grid/Core/utils/Dom.ts","webpack://DataGrid/./src/Grid/Core/utils/Generic.ts","webpack://DataGrid/./src/Grid/Core/utils/GridUtilities.ts","webpack://DataGrid/./src/Grid/Core/utils/Object.ts","webpack://DataGrid/./src/Grid/Core/utils/aria.ts","webpack://DataGrid/./src/Grid/FieldComponent/Checkbox/CheckboxEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Checkbox/CheckboxRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Currency/CurrencyEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Currency/CurrencyRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Date/DateEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Date/DateRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Email/EmailEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Email/EmailRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/MultiLineTextRenderer.ts/MultiLineEditor.ts","webpack://DataGrid/./src/Grid/FieldComponent/MultiLineTextRenderer.ts/MultilineTextRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/MultiSelect/MultiSelectEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/MultiSelect/MultiSelectRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Number/NumberEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Number/NumberRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Percent/PercentEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Percent/PercentRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/PhoneNumber/PhoneNumberEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/PhoneNumber/PhoneNumberRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Rating/RatingEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Rating/RatingRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/RenderingComponent/CheckboxRenderingComponent.ts","webpack://DataGrid/./src/Grid/FieldComponent/RenderingComponent/ChipRenderingComponent.ts","webpack://DataGrid/./src/Grid/FieldComponent/RenderingComponent/ImageRenderingComponent.ts","webpack://DataGrid/./src/Grid/FieldComponent/RenderingComponent/RatingRenderingComponent.ts","webpack://DataGrid/./src/Grid/FieldComponent/RenderingComponent/TextRenderingComponent.ts","webpack://DataGrid/./src/Grid/FieldComponent/SingleSelect/SingleSelectEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/SingleSelect/SingleSelectRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Text/TextEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/Text/TextRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/URL/URLEditorRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/URL/URLRenderer.ts","webpack://DataGrid/./src/Grid/FieldComponent/ValueHolder.ts","webpack://DataGrid/./src/Grid/FloatingRecords/FloatingRecordBehaviourHandler.ts","webpack://DataGrid/./src/Grid/FloatingRecords/FloatingRecordHandler.ts","webpack://DataGrid/./src/Grid/FloatingRecords/UIHandler/FloatingRecordComponent.ts","webpack://DataGrid/./src/Grid/FloatingRecords/UIHandler/FloatingRecordController.ts","webpack://DataGrid/./src/Grid/FloatingRecords/UIHandler/RecordMoved/FloatingRecordMovedComponent.ts","webpack://DataGrid/./src/Grid/FloatingRecords/UIHandler/RecordMoved/FloatingRecordMovedController.ts","webpack://DataGrid/./src/Grid/Grid.ts","webpack://DataGrid/./src/Grid/GridComponent/Editor/GridCellEditorHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/FloatingEditor/GridFloatingEditorComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/FloatingEditor/GridFloatingEditorController.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/CurrentTimeIndicator/CurrentTimeIndicatorComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/CurrentTimeIndicator/CurrentTimeIndicatorController.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/CurrentTimeIndicator/CurrentTimeIndicatorTemplate.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/DependencyMarkHolder/DependencyBimap.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/DependencyMarkHolder/GanttDependencyMarkContainerComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/DependencyMarkHolder/GanttDependencyMarkContainerController.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/DependencyMarkHolder/dependencyMarkUtil.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/GanttTimelineHolder/GanttTimelineHolderComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/GanttTimelineHolder/GanttTimelineHolderController.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/TimelineIndicator/TimeLineIndicatorComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Gantt/TimelineIndicator/TimelineIndicatorController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/BufferContainer/column/ColumnBufferContainerComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/BufferContainer/column/ColumnBufferContainerController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/BufferContainer/row/RowBufferContainerComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/BufferContainer/row/RowBufferContainerController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/GridBodyComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/GridBodyController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/NoRecordConatiner/no-record-controller.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/NoRecordConatiner/no-record-view.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/CenterWidthHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/DragContainerHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/HeightContainerHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/PinnedHandler/LeftPinnedHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/PinnedHandler/RightPinnedHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/PinnedHandler/RowHeaderHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellControllerWrapper.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellInnerNavigationController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellPositionHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellStyle.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/Editor/PopupEditorWrapper.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/Summary/SummyCellController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowControllerWrapper.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowCssHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/Summary/SummaryRowController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/RowContainerComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/RowContainerController.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/RowContainerEventHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/utils/classNames.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/utils/type.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/RowContainer/viewportSizeHandler.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/Scroller/HSComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridBodyComponent/Scroller/VSComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/GridController.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Cell/DefaultHeaderCellRenderer.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Cell/DefaultHeaderGroupCellRenderer.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Cell/HeaderCellComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Cell/HeaderCellController.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Cell/HeaderGroupCellComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Cell/HeaderGroupCellController.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Cell/HeaderPaddingCellComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Cell/HeaderPaddingCellController.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/GridHeader.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/GridHeaderController.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Row/HeaderRowComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/Row/HeaderRowController.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/RowContainer/RowHeaderContainerComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/RowContainer/RowHeaderContainerController.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/column-drag/column-drag-handler.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/column-header-auto-height.ts","webpack://DataGrid/./src/Grid/GridComponent/Header/column-resize/column-resize-handler.ts","webpack://DataGrid/./src/Grid/GridComponent/Interface/Selection/ISelectionInterface.ts","webpack://DataGrid/./src/Grid/GridComponent/PopupComponent.ts","webpack://DataGrid/./src/Grid/GridComponent/cell-layout-measure.ts","webpack://DataGrid/./src/Grid/GridComponentRegister.ts","webpack://DataGrid/./src/Grid/GridEscapeHandler.ts","webpack://DataGrid/./src/Grid/GridEventHandler.ts","webpack://DataGrid/./src/Grid/Interface/Hooks.ts","webpack://DataGrid/./src/Grid/LayoutModule.ts","webpack://DataGrid/./src/Grid/Main.ts","webpack://DataGrid/./src/Grid/Template/FloatingRecord/FloatingRecordMovedTemplate.ts","webpack://DataGrid/./src/Grid/Template/FloatingRecord/FloatingRecordTemplate.ts","webpack://DataGrid/./src/Grid/Template/GanttTimelineHolderTemplate.ts","webpack://DataGrid/./src/Grid/Template/GridColumnBufferTemplate.ts","webpack://DataGrid/./src/Grid/Template/GridFloatingEditorTemplate.ts","webpack://DataGrid/./src/Grid/Template/GridRowContainerTemplate.ts","webpack://DataGrid/./src/Grid/Template/GridRowPlusTemplate.ts","webpack://DataGrid/./src/Grid/Template/GridTemplate.ts","webpack://DataGrid/./src/Grid/Template/Header/GridHeaderTemplate.ts","webpack://DataGrid/./src/Grid/Template/Header/GridRowHeaderComponent.ts","webpack://DataGrid/./src/Grid/Template/Scroller/HSTemplate.ts","webpack://DataGrid/./src/Grid/Template/Scroller/VSTemplate.ts","webpack://DataGrid/./src/Grid/Template/ganttDependencyMarkContainerTemplate.ts","webpack://DataGrid/./src/Grid/grid-cell-editor-module.ts","webpack://DataGrid/./src/Grid/grid-module.ts","webpack://DataGrid/./src/Grid/grid.cell-renderer-module.ts","webpack://DataGrid/./src/Kanban/API/KanbanAPI.ts","webpack://DataGrid/./src/Kanban/BoardHandler.ts","webpack://DataGrid/./src/Kanban/ComponentEventListeners/HeaderEventListener.ts","webpack://DataGrid/./src/Kanban/Components/BoardBodyContainer/BoardBodyComponent.ts","webpack://DataGrid/./src/Kanban/Components/BoardBodyContainer/BoardBodyController.ts","webpack://DataGrid/./src/Kanban/Components/BoardContainer/BoardComponent.ts","webpack://DataGrid/./src/Kanban/Components/BoardContainer/BoardController.ts","webpack://DataGrid/./src/Kanban/Components/BoardHeaderContainer/BoardHeaderComponent.ts","webpack://DataGrid/./src/Kanban/Components/BoardHeaderContainer/BoardHeaderController.ts","webpack://DataGrid/./src/Kanban/Components/CenterPane/BoardViewportVirtualizationBean.ts","webpack://DataGrid/./src/Kanban/Components/CenterPane/CenterPaneComponent.ts","webpack://DataGrid/./src/Kanban/Components/CenterPane/CenterPaneController.ts","webpack://DataGrid/./src/Kanban/Components/KanbanContainer/KanbanComponent.ts","webpack://DataGrid/./src/Kanban/Components/KanbanContainer/KanbanController.ts","webpack://DataGrid/./src/Kanban/Constants/KanbanConstants.ts","webpack://DataGrid/./src/Kanban/Constants/KanbanEvents.ts","webpack://DataGrid/./src/Kanban/Data/ClientDataFetcher.ts","webpack://DataGrid/./src/Kanban/Data/DataFetcher.ts","webpack://DataGrid/./src/Kanban/Data/ServerDataFetcher.ts","webpack://DataGrid/./src/Kanban/DataNodes/BoardDataNode.ts","webpack://DataGrid/./src/Kanban/DataNodes/SwimlaneDataNode.ts","webpack://DataGrid/./src/Kanban/Kanban.ts","webpack://DataGrid/./src/Kanban/KanbanBoardViewportController.ts","webpack://DataGrid/./src/Kanban/KanbanComponentRegistry.ts","webpack://DataGrid/./src/Kanban/KanbanControllerHandler.ts","webpack://DataGrid/./src/Kanban/KanbanEventHandler.ts","webpack://DataGrid/./src/Kanban/KanbanListRegistry.ts","webpack://DataGrid/./src/Kanban/KanbanOptionHandler.ts","webpack://DataGrid/./src/Kanban/KanbanRootController.ts","webpack://DataGrid/./src/Kanban/KanbanTemplate.ts","webpack://DataGrid/./src/Kanban/KanbanUserComponentHandler.ts","webpack://DataGrid/./src/Kanban/ListInteracter.ts","webpack://DataGrid/./src/Kanban/SwimlaneHandler.ts","webpack://DataGrid/./src/ListModelClasses/List.ts","webpack://DataGrid/./src/ListModelClasses/ListBeanClassRegistry.ts","webpack://DataGrid/./src/ListModelClasses/ListBlockAxis.ts","webpack://DataGrid/./src/ListModelClasses/ListGroupAxis.ts","webpack://DataGrid/./src/ListModelClasses/ListRowNode.ts","webpack://DataGrid/./src/ListModelClasses/StaticRowAxis.ts","webpack://DataGrid/./src/ListModelClasses/list-module.ts","webpack://DataGrid/./src/ListModelClasses/list-option-handler.ts","webpack://DataGrid/./src/Navigation/cell-navigation-handler.ts","webpack://DataGrid/./src/Navigation/cell-navigation.ts","webpack://DataGrid/./src/Navigation/grid-key-board-navigation.ts","webpack://DataGrid/./src/Navigation/navigation-handler.ts","webpack://DataGrid/./src/Navigation/navigation-module.ts","webpack://DataGrid/./src/Navigation/row-navigation.ts","webpack://DataGrid/./src/Selection/base-range-selection-handler.ts","webpack://DataGrid/./src/Selection/column-selection-range-handler.ts","webpack://DataGrid/./src/Selection/column-selection.ts","webpack://DataGrid/./src/Selection/row-range-selection-handler.ts","webpack://DataGrid/./src/Selection/row-selection-handler.ts","webpack://DataGrid/./src/Selection/row-selection-hooks.ts","webpack://DataGrid/./src/Selection/row-selection.ts","webpack://DataGrid/./src/Selection/row-selection/row-selection-index.ts","webpack://DataGrid/./src/Utils/DateUtils.ts","webpack://DataGrid/./src/VerticalCalendar/api/vertical-calendar-api.ts","webpack://DataGrid/./src/VerticalCalendar/constant/vertical-calendar-bean-name-constant.ts","webpack://DataGrid/./src/VerticalCalendar/constant/vertical-calendar-event-name.ts","webpack://DataGrid/./src/VerticalCalendar/core/axis-handler/axis-handler.ts","webpack://DataGrid/./src/VerticalCalendar/core/button-interactor/button-interactor.ts","webpack://DataGrid/./src/VerticalCalendar/core/cache-manager/cache-manager.ts","webpack://DataGrid/./src/VerticalCalendar/core/common-controllers/controller-handler/controller-handler.ts","webpack://DataGrid/./src/VerticalCalendar/core/common-controllers/row/row-controller-wrapper.ts","webpack://DataGrid/./src/VerticalCalendar/core/common-controllers/row/row-renderer-controller.ts","webpack://DataGrid/./src/VerticalCalendar/core/data-store/generic-data-store.ts","webpack://DataGrid/./src/VerticalCalendar/core/drag-and-drop/drag-and-drop-handler.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/adaptor/events-manager.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/adaptor/fetch-source-adaptor.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/adaptor/json-adaptor.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/custom-cellblock-array.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/event-block.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/event-coordinates.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/month-event-axis.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/month-event-block.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/month-event-position-handler.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/new/event-segment.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/new/event-store.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/new/preview-event-store.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-handler/utils/month-event-block-controller.ts","webpack://DataGrid/./src/VerticalCalendar/core/event-resizer/event-resize-contoller.ts","webpack://DataGrid/./src/VerticalCalendar/core/navigators/abstract-navigator.ts","webpack://DataGrid/./src/VerticalCalendar/core/navigators/button-navigator/button-navigator.ts","webpack://DataGrid/./src/VerticalCalendar/core/navigators/calendar-navigator-interactor.ts","webpack://DataGrid/./src/VerticalCalendar/core/navigators/scroll-navigator/scroll-navigation-manager.ts","webpack://DataGrid/./src/VerticalCalendar/core/vertical-calendar-core-component.ts","webpack://DataGrid/./src/VerticalCalendar/core/vertical-calendar-option-handler.ts","webpack://DataGrid/./src/VerticalCalendar/data-structure/calendar-data-store.ts","webpack://DataGrid/./src/VerticalCalendar/data-structure/calendar-day-node.ts","webpack://DataGrid/./src/VerticalCalendar/data-structure/calendar-weeknode.ts","webpack://DataGrid/./src/VerticalCalendar/data-structure/event-object.ts","webpack://DataGrid/./src/VerticalCalendar/data-structure/events-data-manager/events-data-manager.ts","webpack://DataGrid/./src/VerticalCalendar/template/vertical-calendar-template.ts","webpack://DataGrid/./src/VerticalCalendar/utility/dg-date/DGDate.ts","webpack://DataGrid/./src/VerticalCalendar/utility/dg-date/LuxonAdapter.ts","webpack://DataGrid/./src/VerticalCalendar/utility/dg-date/NativeDateAdapter.ts","webpack://DataGrid/./src/VerticalCalendar/utils/CSSRegistry.ts","webpack://DataGrid/./src/VerticalCalendar/utils/auto-scroll-handler.ts","webpack://DataGrid/./src/VerticalCalendar/utils/calendar-root-classes.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component-registry.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/event-component/event-component/event-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/event-component/event-component/event-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/event-component/event-container/event-container-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/event-component/event-container/event-container-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/event-component/event-ellipsis-component/event-ellipsis-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/event-component/event-ellipsis-component/event-ellipsis-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/event-component/time-event-component/time-event-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/header-component/nav-bar-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/header-component/nav-bar-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-cell-component/vertical-calendar-cell-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-cell-component/vertical-calendar-cell-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-container-component/vertical-calendar-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-container-component/vertical-calendar-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-row-component/vertical-calendar-row-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-row-component/vertical-calendar-row-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-rows-container-component/vertical-calendar-rows-container-componet.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-rows-container-component/vertical-calendar-rows-container-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-week-header-component/vertical-calendar-week-header-component.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-component/vertical-calendar-week-header-component/vertical-calendar-week-header-controller.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-configuration.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar-event-handler.ts","webpack://DataGrid/./src/VerticalCalendar/vertical-calendar.ts","webpack://DataGrid/./src/clipboard/base-creator.ts","webpack://DataGrid/./src/clipboard/clipboard-handler.ts","webpack://DataGrid/./src/clipboard/clipboard-handler.types.ts","webpack://DataGrid/./src/clipboard/csv-creator.ts","webpack://DataGrid/./src/clipboard/csv-serializing.ts","webpack://DataGrid/./src/clipboard/grid-serializer.ts","webpack://DataGrid/./src/clipboard/grid-serializing.ts","webpack://DataGrid/./src/clipboard/table-creator.ts","webpack://DataGrid/./src/clipboard/table-serializing.ts","webpack://DataGrid/./src/drag-handler/drag-core-handler.ts","webpack://DataGrid/./src/drag-handler/drag-handler.ts","webpack://DataGrid/./src/find/find-api.ts","webpack://DataGrid/./src/find/find-handler.ts","webpack://DataGrid/./src/find/find-module.ts","webpack://DataGrid/./src/find/findController.ts","webpack://DataGrid/./src/find/findView.ts","webpack://DataGrid/./src/nested-header/column-group-api.ts","webpack://DataGrid/./src/nested-header/column-group-handler.ts","webpack://DataGrid/./src/nested-header/column-group-node.ts","webpack://DataGrid/./src/nested-header/column-tree-model.ts","webpack://DataGrid/./src/nested-header/constants/bean-names.ts","webpack://DataGrid/./src/nested-header/constants/events.ts","webpack://DataGrid/./src/nested-header/nested-header-module.ts","webpack://DataGrid/./src/rangeselection/cell-range-handler.ts","webpack://DataGrid/./src/rangeselection/range-selection-drag-handler.ts","webpack://DataGrid/./src/rangeselection/range-selection-handler.ts","webpack://DataGrid/./src/rangeselection/range-selection-module.ts","webpack://DataGrid/./src/row-drag-handler/body-row-dragger.ts","webpack://DataGrid/./src/row-drag-handler/row-drag-handler.ts","webpack://DataGrid/./src/sticky-row/sticky-row-renderer.ts","webpack://DataGrid/./userpresence/core/src/Component/UserPresenceComponentHandler.ts","webpack://DataGrid/./userpresence/core/src/Component/UserPresenceDropDownRendererComponent.ts","webpack://DataGrid/./userpresence/core/src/Component/UserPresenceRendererComponent.ts","webpack://DataGrid/./userpresence/core/src/Constants/BeanName.ts","webpack://DataGrid/./userpresence/core/src/Constants/Events.ts","webpack://DataGrid/./userpresence/core/src/Controller/UserPresenceController.ts","webpack://DataGrid/./userpresence/core/src/DataHandler/DropDownConversionItems.ts","webpack://DataGrid/./userpresence/core/src/DataHandler/UIDGenrerator.ts","webpack://DataGrid/./userpresence/core/src/DataHandler/UserPresence.ts","webpack://DataGrid/./userpresence/core/src/DataHandler/UserPresenceDataHandler.ts","webpack://DataGrid/./userpresence/core/src/DataHandler/UserPresenceItem.ts","webpack://DataGrid/./userpresence/core/src/UIHandler/UserPresenceComponent.ts","webpack://DataGrid/./userpresence/core/src/UIHandler/UserPresenceController.ts","webpack://DataGrid/./userpresence/core/src/UserPresence.ts","webpack://DataGrid/./userpresence/core/src/UserPresenceApi.ts","webpack://DataGrid/./userpresence/core/src/UserPresenceEventHandler.ts","webpack://DataGrid/./userpresence/core/src/UserPresenceOptionHandler.ts","webpack://DataGrid/./node_modules/events/events.js","webpack://DataGrid/./Demo/Gantt/gannt-view.css?4ab6","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/Checkbox_new/checkbox.css?f8e4","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/Multiline_new/multiline.css?b1a4","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/chip/chip.css?991e","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/number/number.css?70fc","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/radio/css/radio.css?ea2e","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/rating/rating.css?c471","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/select/select.css?57dd","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css?3dd8","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css?778d","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/styles/tooltip.css?f511","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/demo/text/text.css?f6fa","webpack://DataGrid/./node_modules/@dg/contextmenu/dist/contextMenu.css?312f","webpack://DataGrid/./src/Kanban/css/kanban.css?dfd1","webpack://DataGrid/./src/css/common.css?158c","webpack://DataGrid/./src/css/fieldcomponentCustomization.css?2408","webpack://DataGrid/./src/css/grid.css?cff7","webpack://DataGrid/./src/css/groupingGrid.css?b541","webpack://DataGrid/./src/css/tempgallery.css?ed6b","webpack://DataGrid/./userpresence/core/src/css/userpresence.css?099b","webpack://DataGrid/./node_modules/uuid/dist/esm-browser/regex.js","webpack://DataGrid/./node_modules/uuid/dist/esm-browser/rng.js","webpack://DataGrid/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://DataGrid/./node_modules/uuid/dist/esm-browser/v1.js","webpack://DataGrid/./node_modules/uuid/dist/esm-browser/v4.js","webpack://DataGrid/./node_modules/uuid/dist/esm-browser/validate.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Component.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Component/Component.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Component/ComponentRegistry.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Component/UserComponentHandler.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Component/UserComponentRegistry.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/ComponentMetadataProvider.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/ComponentRegistry.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Constants/BeanName.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Context.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Decorator/BeanFactoryDecorator.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Decorator/ReferenceSelector.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Decorator/types.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/EventEmitter.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/EventHandler.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Events/EventEmitter.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/Events/EventHandler.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/FrameWork.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/FrameWork/ComponentMetaDataProvider.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/FrameWork/FrameWorkComponentWrapper.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/FrameWork/VanillaFrameWorkOverrides.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/UserComponentHandler.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/UserComponentRegistry.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/main.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/utils/Generic.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/utils/aria.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/corecomponent/utils/dom.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/BEM/bem.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/KeyEvents/key-events-constants.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/KeyEvents/key-events.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/clamp/clamp.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/composedClasses/composeClasses.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/debounce/debounce.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/generateUtilityClass/generateUtilityClass.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/generateUtilityClasses/generateUtilityClasses.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/node_modules/@dg/utils/index.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Component.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Component/Component.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Component/ComponentRegistry.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Component/UserComponentHandler.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Component/UserComponentRegistry.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/ComponentMetadataProvider.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/ComponentRegistry.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Constants/BeanName.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Context.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Decorator/BeanFactoryDecorator.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Decorator/ReferenceSelector.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Decorator/types.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/EventEmitter.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/EventHandler.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Events/EventEmitter.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/Events/EventHandler.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/FrameWork.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/FrameWork/ComponentMetaDataProvider.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/FrameWork/FrameWorkComponentWrapper.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/FrameWork/VanillaFrameWorkOverrides.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/UserComponentHandler.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/UserComponentRegistry.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/main.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/utils/Generic.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/utils/aria.js","webpack://DataGrid/./Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/node_modules/@dg/corecomponent/utils/dom.js","webpack://DataGrid/./node_modules/@dg/corecomponent/dist/DGCoreComponent.esm.js","webpack://DataGrid/./node_modules/@dg/utils/BEM/bem.js","webpack://DataGrid/./node_modules/@dg/utils/KeyEvents/key-events-constants.js","webpack://DataGrid/./node_modules/@dg/utils/KeyEvents/key-events.js","webpack://DataGrid/./node_modules/@dg/utils/clamp/clamp.js","webpack://DataGrid/./node_modules/@dg/utils/composedClasses/composeClasses.js","webpack://DataGrid/./node_modules/@dg/utils/debounce/debounce.js","webpack://DataGrid/./node_modules/@dg/utils/generateUtilityClass/generateUtilityClass.js","webpack://DataGrid/./node_modules/@dg/utils/generateUtilityClasses/generateUtilityClasses.js","webpack://DataGrid/./node_modules/@dg/utils/index.js","webpack://DataGrid/./node_modules/luxon/build/es6/luxon.mjs","webpack://DataGrid/./userpresence/core/node_modules/@dg/contextmenu/dist/contextMenu.esm.js","webpack://DataGrid/./userpresence/core/node_modules/@dg/corecomponent/dist/DGCoreComponent.esm.js","webpack://DataGrid/webpack/bootstrap","webpack://DataGrid/webpack/runtime/compat get default export","webpack://DataGrid/webpack/runtime/define property getters","webpack://DataGrid/webpack/runtime/hasOwnProperty shorthand","webpack://DataGrid/webpack/runtime/make namespace object","webpack://DataGrid/./src/index.ts","webpack://DataGrid/./src/Grid/AllModule.ts"],"sourcesContent":["!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs=e()}(this,(function(){\"use strict\";var t=1e3,e=6e4,n=36e5,r=\"millisecond\",i=\"second\",s=\"minute\",u=\"hour\",a=\"day\",o=\"week\",c=\"month\",f=\"quarter\",h=\"year\",d=\"date\",l=\"Invalid Date\",$=/^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/,y=/\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:\"en\",weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),ordinal:function(t){var e=[\"th\",\"st\",\"nd\",\"rd\"],n=t%100;return\"[\"+t+(e[(n-20)%10]||e[n]||e[0])+\"]\"}},m=function(t,e,n){var r=String(t);return!r||r.length>=e?t:\"\"+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?\"+\":\"-\")+m(r,2,\"0\")+\":\"+m(i,2,\"0\")},m:function t(e,n){if(e.date()<n.date())return-t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return+(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||\"\").toLowerCase().replace(/s$/,\"\")},u:function(t){return void 0===t}},g=\"en\",D={};D[g]=M;var p=\"$isDayjsObject\",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if(\"string\"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split(\"-\");if(!i&&u.length>1)return t(u[0])}else{var a=e.name;D[a]=e,i=a}return!r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n=\"object\"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if(\"string\"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||\"0\").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init()},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},m.$utils=function(){return b},m.isValid=function(){return!(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate(\"s\"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v=\"set\"+(this.$u?\"UTC\":\"\");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+\"Hours\",0);case u:return $(v+\"Minutes\",1);case s:return $(v+\"Seconds\",2);case i:return $(v+\"Milliseconds\",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f=\"set\"+(this.$u?\"UTC\":\"\"),l=(n={},n[a]=f+\"Date\",n[d]=f+\"Date\",n[c]=f+\"Month\",n[h]=f+\"FullYear\",n[u]=f+\"Hours\",n[s]=f+\"Minutes\",n[i]=f+\"Seconds\",n[r]=f+\"Milliseconds\",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||\"YYYY-MM-DDTHH:mm:ssZ\",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,\"0\")},$=f||function(t,e,n){var r=t<12?\"AM\":\"PM\";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case\"YY\":return String(e.$y).slice(-2);case\"YYYY\":return b.s(e.$y,4,\"0\");case\"M\":return a+1;case\"MM\":return b.s(a+1,2,\"0\");case\"MMM\":return h(n.monthsShort,a,c,3);case\"MMMM\":return h(c,a);case\"D\":return e.$D;case\"DD\":return b.s(e.$D,2,\"0\");case\"d\":return String(e.$W);case\"dd\":return h(n.weekdaysMin,e.$W,o,2);case\"ddd\":return h(n.weekdaysShort,e.$W,o,3);case\"dddd\":return o[e.$W];case\"H\":return String(s);case\"HH\":return b.s(s,2,\"0\");case\"h\":return d(1);case\"hh\":return d(2);case\"a\":return $(s,u,!0);case\"A\":return $(s,u,!1);case\"m\":return String(u);case\"mm\":return b.s(u,2,\"0\");case\"s\":return String(e.$s);case\"ss\":return b.s(e.$s,2,\"0\");case\"SSS\":return b.s(e.$ms,3,\"0\");case\"Z\":return i}return null}(t)||i.replace(\":\",\"\")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[[\"$ms\",r],[\"$s\",i],[\"$m\",s],[\"$H\",u],[\"$W\",a],[\"$M\",c],[\"$y\",h],[\"$D\",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])}})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f<a;f+=1){var h=o[f],u=c[h],d=u&&u[0],l=u&&u[1];o[f]=l?{regex:d,parser:l}:h.replace(/^\\[|\\]$/g,\"\")}return function(e){for(var t={},n=0,r=0;n<a;n+=1){var i=o[n];if(\"string\"==typeof i)r+=i.length;else{var s=i.regex,f=i.parser,h=e.slice(r),u=s.exec(h)[0];f.call(t,u),e=e.replace(u,\"\")}}return function(e){var t=e.afternoon;if(void 0!==t){var n=e.hours;t?n<12&&(e.hours+=12):12===n&&(e.hours=0),delete e.afternoon}}(t),t}}return function(e,t,n){n.p.customParseFormat=!0,e&&e.parseTwoDigitYear&&(a=e.parseTwoDigitYear);var r=t.prototype,i=r.parse;r.parse=function(e){var t=e.date,r=e.utc,o=e.args;this.$u=r;var a=o[1];if(\"string\"==typeof a){var f=!0===o[2],h=!0===o[3],u=f||h,d=o[2];h&&(d=o[2]),s=this.$locale(),!f&&d&&(s=n.Ls[d]),this.$d=function(e,t,n,r){try{if([\"x\",\"X\"].indexOf(t)>-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));","!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).dayjs_plugin_utc=i()}(this,(function(){\"use strict\";var t=\"minute\",i=/[+-]\\d\\d(?::?\\d\\d)?/g,e=/([+-]|\\d\\d)/g;return function(s,f,n){var u=f.prototype;n.utc=function(t){var i={date:t,utc:!0,args:arguments};return new f(i)},u.utc=function(i){var e=n(this.toDate(),{locale:this.$L,utc:!0});return i?e.add(this.utcOffset(),t):e},u.local=function(){return n(this.toDate(),{locale:this.$L,utc:!1})};var r=u.parse;u.parse=function(t){t.utc&&(this.$u=!0),this.$utils().u(t.$offset)||(this.$offset=t.$offset),r.call(this,t)};var o=u.init;u.init=function(){if(this.$u){var t=this.$d;this.$y=t.getUTCFullYear(),this.$M=t.getUTCMonth(),this.$D=t.getUTCDate(),this.$W=t.getUTCDay(),this.$H=t.getUTCHours(),this.$m=t.getUTCMinutes(),this.$s=t.getUTCSeconds(),this.$ms=t.getUTCMilliseconds()}else o.call(this)};var a=u.utcOffset;u.utcOffset=function(s,f){var n=this.$utils().u;if(n(s))return this.$u?0:n(this.$offset)?a.call(this):this.$offset;if(\"string\"==typeof s&&(s=function(t){void 0===t&&(t=\"\");var s=t.match(i);if(!s)return null;var f=(\"\"+s[0]).match(e)||[\"-\",0,0],n=f[0],u=60*+f[1]+ +f[2];return 0===u?0:\"+\"===n?u:-u}(s),null===s))return this;var u=Math.abs(s)<=16?60*s:s;if(0===u)return this.utc(f);var r=this.clone();if(f)return r.$offset=u,r.$u=!1,r;var o=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(r=this.local().add(u+o,t)).$offset=u,r.$x.$localOffset=o,r};var h=u.format;u.format=function(t){var i=t||(this.$u?\"YYYY-MM-DDTHH:mm:ss[Z]\":\"\");return h.call(this,i)},u.valueOf=function(){var t=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*t},u.isUTC=function(){return!!this.$u},u.toISOString=function(){return this.toDate().toISOString()},u.toString=function(){return this.toDate().toUTCString()};var l=u.toDate;u.toDate=function(t){return\"s\"===t&&this.$offset?n(this.format(\"YYYY-MM-DD HH:mm:ss:SSS\")).toDate():l.call(this)};var c=u.diff;u.diff=function(t,i,e){if(t&&this.$u===t.$u)return c.call(this,t,i,e);var s=this.local(),f=n(t).local();return c.call(s,f,i,e)}}}));","import { findInsertIndex } from \"../Utilities/Utility\";\nimport { ICacheBlockHandler } from \"./ICacheBlockHandler\";\nimport { IBlockConfigs, IIdData, IInsertRowMeta, IViewport } from \"./Interface\";\n\n//most implementation will be based on index\n\nclass CacheBlockHandler implements ICacheBlockHandler {\n            id          : string;\n    private idsOrder !  : Record<number, string[]>;\n    private idDataMap ! : Record<string, IIdData>;\n\n    private rowCount ! : number;\n\n    private blockSize !         : number;\n    private blockCount !        : number;\n    private fetchTriggerPoint ! : number;\n    private staticCahces !      : number[];\n    private staticIds !         : string[];\n\n    private insertBlockOrder : number[];\n    private sortedOrder      : number[];\n\n    private viewport !        : IViewport;\n    private dataFetcher !     : CallableFunction;\n    private userFetchParams ! : Record<string, any>;\n    \n    public  debounceTimeout  : any;\n    public  updateViewPort ! : (viewport: IViewport) => void;\n    private blockConfig!     : IBlockConfigs;\n\n\n    constructor(id: string, blockConfigs : IBlockConfigs) {\n        this.id               = id;\n        this.insertBlockOrder = [];\n        this.sortedOrder      = [];\n        this.updateCacheConfigs(blockConfigs);\n    }\n\n    getInstanceId() : string {\n        return this.id;\n    }\n\n    getAllCachedRows(): number[] {\n        const allRows : number[] = [];\n        Object.keys(this.idsOrder).forEach((blockIndex : string)=>{\n            const blockIndexNumber = Number(blockIndex);\n            for(let i = 0; i < this.blockSize; i++){\n                allRows.push(blockIndexNumber + i);\n            }\n        })\n        return allRows;\n    }\n\n    getBlockConfigs(): IBlockConfigs {\n        const config = {...this.blockConfig};\n        config.rowCount = this.rowCount;\n        return config;\n    }\n\n    emptyHoldingCaches(): void {\n        this.idsOrder         = {};\n        this.insertBlockOrder = [];\n        this.idDataMap        = {};\n    }\n    \n    destroy(rowCount : number = this.rowCount): void {\n        Object.keys(this.idsOrder).forEach(key => this.removeCacheBlock(Number(key)));\n        this.staticCahces = [];\n        this.staticIds    = [];\n        this.rowCount     = rowCount;\n        this.viewport     = {\n            startRow: -1,\n            endRow  : -1\n        };\n    }\n\n    forEach(callback : any) : void{\n        Object.values(this.idsOrder).forEach((ids : string[])=>{\n            ids.forEach(callback);\n        });\n    }\n\n    getIdByIndex(index: number): string | null {\n        const key      = this.getBlockKey(index);\n        const idsOrder = this.getIdsOrder(index);\n        const id       = null;\n        if (idsOrder) {\n            const relativeIndex = (index - key);\n            return idsOrder[relativeIndex];\n        }\n        return id;\n    }\n\n    getBlockSize() {\n        return this.blockSize;\n    }\n\n    getBlockKey(index: number): number {\n        return Math.floor(index / this.blockSize) * this.blockSize;\n    }\n\n    updateRowCount(rowCount: number): void {\n        this.rowCount = rowCount;\n        this.updateViewPort(this.viewport);\n    }\n\n    updateCacheBlockCount(cacheBlockCount: number): void {\n        this.blockCount = cacheBlockCount;\n    }\n\n    updateCacheBlockSize(blockSize : number) : void {\n        this.blockSize = blockSize;\n    }\n\n    private executeHook(beforeCallback: any, afterCallback: any, api: any, hookArguments : any) : void {\n        const returnVal = beforeCallback?.(hookArguments) ?? hookArguments;\n        if(returnVal != false) {\n            api(returnVal);\n            afterCallback?.(returnVal);\n        }\n    }\n\n    private onFetchSuccess(startIndex: number, endIndex: number, {data}: any, isDummyData = false): void {\n        // const isInCache = this.isInCache(startIndex);\n        const blockKey  = this.getBlockKey(startIndex);\n        const count     = (endIndex - startIndex) + 1;\n        \n        const idsOrder : string[] = [];\n        const prevIds = [];\n        for(let i = 0; i < count; i++) {\n            const id = this.blockConfig.getId({index : startIndex + i});\n            idsOrder.push(id);\n        }\n\n        for(let i = startIndex; i <= endIndex; i++) {\n            const id = this.getIdByIndex(i);\n            prevIds.push(id);\n        }\n        \n        const param = {\n            startIndex,\n            endIndex   : startIndex + count - 1,\n            ids        : idsOrder,\n            isLoaded   : !isDummyData,\n            prevIds,\n            data,\n        }\n       \n        const api = ({ids} : {ids : string[]})=>{\n            const block = this.idsOrder[blockKey];\n            if(block){\n                ids.forEach((id, index)=>{\n                    this.idDataMap[id] = { blockKey: this.getBlockKey(blockKey) };\n                    const localIndex = (startIndex+index) % this.blockSize;\n                    block[localIndex] = id;\n                })\n            }\n            else{\n                ids.forEach((id)=>{\n                    this.idDataMap[id] = { blockKey: this.getBlockKey(blockKey) };\n                })\n                this.idsOrder[blockKey]   = ids;\n                this.insertBlockOrder.push(blockKey);\n                const insertIndex         = findInsertIndex(this.sortedOrder, blockKey);\n                this.sortedOrder.splice(insertIndex, 0, blockKey);\n                this.removeUnWantedCache();\n            }\n        }\n        const {onAfterBlockAdd, onBeforeBlockAdd} =this.blockConfig;\n        this.executeHook(onBeforeBlockAdd, onAfterBlockAdd, api, param);\n    }\n \n    private onFetchFailure(): void {\n\n    }\n\n    private fetchViewport(viewport: IViewport): void {\n        if(this.viewport?.startRow == viewport.startRow && this.viewport?.endRow == viewport.endRow) {\n            return;\n        }\n        this.viewport                 = viewport;\n        const lastRow                 = this.rowCount - 1;\n        const viewportStart           = Math.max(0, (viewport.startRow - this.fetchTriggerPoint));\n        const viewportEnd             = Math.min(lastRow, (viewport.endRow + this.fetchTriggerPoint));\n\n        if (viewportStart <= viewportEnd) {\n            const fetchStart = this.getBlockKey(viewportStart);\n            const fetchEnd   = this.getBlockKey(viewportEnd);\n\n            //update blockcount if it smaller than viewport\n            const viewportBlockCount  = Math.ceil(((viewport.endRow - viewport.startRow) + this.fetchTriggerPoint + 1) / this.blockSize);\n            this.blockCount < viewportBlockCount && this.updateCacheBlockCount(viewportBlockCount);\n\n            for (let rowIndex = fetchStart; rowIndex <= fetchEnd; rowIndex += this.blockSize) {\n                const endRow = Math.min(lastRow, (rowIndex + this.blockSize - 1))\n                this.fetchRows(rowIndex, endRow);\n            }\n        }\n    }\n\n    private fetchRows(startIndex: number, endIndex: number): void {\n        const isInCache = this.isInCache(startIndex) || this.isInCache(endIndex);\n        if (!isInCache) {\n            let isDummyData = false;\n            const param = {\n                ...{}, ...this.userFetchParams, ...{\n                    startRowIndex : startIndex,\n                    endRowIndex   : endIndex,\n                    onSuccess     : (datas: any) => this.onFetchSuccess(startIndex, endIndex, datas, isDummyData),\n                    onFailure     : () => this.onFetchFailure(),\n                    shouldFetchRange : ()=>true\n                }\n            }\n\n            this.dataFetcher(param);\n            isDummyData = true;\n            param.shouldFetchRange = ()=>{\n                return this.isInCache(startIndex) || isDummyData;\n            }\n            // const startBlockKey   = this.getBlockKey(startIndex);\n            // const endBlockKey     = this.getBlockKey(endIndex);\n            for (let i = startIndex; i <= endIndex; i += this.blockSize) {\n                const dummyDatas  : any[] = [];\n                dummyDatas.length = Math.min(this.rowCount, this.blockSize);\n                const isInCache   = this.isInCache(i);\n                !isInCache && param.onSuccess({data : dummyDatas});\n            }\n            isDummyData = false;\n        }\n    }\n \n    removeFromStaticCache(index: number): void {\n        const key           = this.getBlockKey(index);\n        const deleteIndex   = this.staticCahces.indexOf(key);\n        if (deleteIndex != -1) {\n            this.staticCahces.splice(deleteIndex, 1);\n            // this.updateStaticCacheIndexes();\n        }\n    }\n\n    insertToStaticCache(index: number): void {\n        const key = this.getBlockKey(index);\n        if (!this.staticCahces.includes(key)) {\n            this.staticCahces.push(key);\n        }\n    }\n\n    addStaticId(id: string): void {\n        if (!this.staticIds.includes(id)) {\n            this.staticIds.push(id);\n        }\n    }\n    \n\n    removeStaticId(id: string): void {\n        const index = this.staticIds.indexOf(id);\n        if (index != -1) {\n            this.staticIds.splice(index, 1);\n        }\n    }       \n\n    updateCacheConfigs(blockConfigs: IBlockConfigs): void {\n        this.resetCaches();\n        this.rowCount = blockConfigs.rowCount;\n        \n        this.blockConfig       = blockConfigs;\n        this.dataFetcher       = blockConfigs.fetchCallback;\n        this.userFetchParams   = blockConfigs.fetchParam;\n        this.blockSize         = blockConfigs.blockSize;\n        this.blockCount        = blockConfigs.blockCount;\n        this.fetchTriggerPoint = blockConfigs.fetchTriggerPoint;\n        this.staticCahces      = Array.from(new Set(blockConfigs.staticCaches.map(number => this.getBlockKey(number))));\n\n        this.updateViewPort = this.fetchViewport.bind(this);\n    }\n \n    getIdsOrder(index: number): string[] {\n        const key = this.getBlockKey(index);\n        return this.idsOrder[key];\n    }\n\n    resetCaches(): void {\n        this.emptyHoldingCaches();\n        this.staticCahces = [];\n        this.staticIds    = [];\n    }\n\n    private isValidRow(row: number): boolean {\n        return 0 <= row && row <= this.getRowCount();\n    }\n\n    getRowCount(): number {\n        return this.rowCount;\n    }\n\n    isInStaticCache(index: number): boolean {\n        const key = this.getBlockKey(index);\n        const blockIds = this.idsOrder[key] ?? [];\n        const hasIdCache = ()=>{\n            for(let i = 0; i < blockIds.length; i++){\n                const id = blockIds[i];\n                if(this.staticIds.includes(id)){\n                    return true;\n                }\n            }\n            return false;\n        }\n        return this.staticCahces.includes(key) || hasIdCache();\n    }\n\n    getStaticCacheIndexes(): number[] {\n        return this.staticCahces;\n    }\n\n    getFirstCacheIndex(): number {\n        return this.sortedOrder[0];\n    }\n\n    getLastCacheIndex(): number {\n        const cacheKeyLastIndex = this.sortedOrder.length - 1;\n        return this.sortedOrder[cacheKeyLastIndex] ? this.sortedOrder[cacheKeyLastIndex] + (this.blockSize - 1) : -1;\n    }\n\n    getFirstCacheId(): string {\n        const index = this.getFirstCacheIndex();\n        return this.getIdByIndex(index) as string;\n    }\n    getLastCacheId(): string {\n        const index = this.getLastCacheIndex();\n        return this.getIdByIndex(index) as string;\n    }\n\n    getIndexById(id: string): number {\n        const idData        = this.idDataMap[id];\n        let index           = null;\n        if (idData) {\n            const blockKey  = idData.blockKey;\n            const idsOrder  = this.idsOrder[blockKey];\n            idsOrder!=undefined && (index           = blockKey + idsOrder.indexOf(id));\n        }\n        return index as number;\n    }\n\n    getPreviousID(id: string): string | null {\n        const index = this.getIndexById(id);\n        return (index == null) ? null : this.getIdByIndex(index - 1);\n    }\n\n    getNextID(id: string): string | null {\n        const index = this.getIndexById(id);\n        return (index == null) ? null : this.getIdByIndex(index + 1);\n    }\n\n    isInCache(index: number): boolean {\n        let result = false;\n        if (this.isValidRow(index)) {\n            const key = this.getBlockKey(index);\n            const localIndex = index % this.blockSize;\n            const block = this.idsOrder[key];\n            result = Boolean(block && block[localIndex]);\n        }\n        return result;\n    }\n\n    private mergeSequenceRanges(missingRowRanges : Record<number, IViewport[]>) : Record<number, IViewport[]> {\n        (Object.keys(missingRowRanges) as unknown as number[]).forEach((blockKey)=>{\n            const currentRanges = missingRowRanges[blockKey];\n            currentRanges.sort((a, b) => a.startRow - b.startRow);\n            const mergedRanges: any[] = [];\n            currentRanges.forEach((currentRange)=>{\n                const lastIndex = mergedRanges.length - 1;\n                const lastRange = mergedRanges[lastIndex];\n                if(lastRange &&  currentRange.startRow-1 == lastRange.endRow) {\n                    lastRange.endRow = Math.max(lastRange.endRow, currentRange.endRow);\n                } else {\n                    mergedRanges.push(currentRange);\n                }\n            })\n            missingRowRanges[blockKey] = mergedRanges;\n        })\n        return missingRowRanges\n    }\n\n    // private findCountExistBefore(indexes: number[], rowIndex: number): number {\n    //     let result = 0;\n    //     for(let i = 0; i < indexes.length && indexes[i] <= rowIndex; i++) {\n    //         result++\n    //     }\n    //     return result\n    // }\n\n    private reConstructIdsOrder(actionMetas : IInsertRowMeta, action : 'insert' | 'delete') : Record<number, IViewport[]> {\n        // let   backupMapping : Record<number,    string>      = {};\n        // const newIdsOrder   : Record<number,    string[]>    = {};\n        const missingRowRanges : Record<number, IViewport[]> = {};\n        // const firstIndex                       = actionMetas[0].index;\n        const totalRowCount    = this.getRowCount();\n        const lastIndexInCache = this.getLastCacheIndex();\n        actionMetas.sort((a, b) => a.index - b.index);\n\n        const idsOrderArray = Array(lastIndexInCache + 1).fill(null);\n        this.sortedOrder.forEach((blockKey)=>{ \n            const block = this.idsOrder[blockKey];\n            idsOrderArray.splice(blockKey, this.blockSize, ...block);\n        });\n\n        //storing backup of ids\n        for(let i = actionMetas.length - 1; i >= 0; i--) {\n            const {index, insertIds = []} = actionMetas[i];\n            const deleteCount = action == 'delete' ? 1 : 0;\n            idsOrderArray.splice(index, deleteCount, ...insertIds);\n        }\n\n        this.sortedOrder.forEach((blockKey)=>{ \n            const endRow =  Math.min(blockKey + this.blockSize, totalRowCount);\n            missingRowRanges[blockKey] = missingRowRanges[blockKey] ?? [];\n            this.idsOrder[blockKey] = idsOrderArray.slice(blockKey, endRow);\n            let   missingRange : Partial<IViewport> = {};\n            for (let rowIndex = blockKey; rowIndex < endRow; rowIndex++) {\n                const id = idsOrderArray[rowIndex];\n                this.idDataMap[id] = {blockKey};\n                if (id == null) {\n                    if (missingRange.startRow == undefined) {\n                        missingRange.startRow = rowIndex;\n                    }\n                    missingRange.endRow = rowIndex;\n                } \n                else if (missingRange.startRow != undefined) {\n                    missingRowRanges[blockKey].push(missingRange as IViewport);\n                    missingRange = {};  \n                }\n            }\n        \n            if (missingRange.startRow != undefined) {\n                missingRowRanges[blockKey].push(missingRange as IViewport);\n            }\n        });\n\n        return this.mergeSequenceRanges(missingRowRanges);\n    }\n\n    insertRowsAtIndexes(rowMetas : IInsertRowMeta) : void {\n        let   adder                  = 0;\n        let   missingRowRanges       : Record<number, IViewport[]> = {};\n        if(this.rowCount == 0){\n            const idsOrder = rowMetas.map(({insertIds})=>insertIds).flat();\n            this.rowCount = idsOrder.length;\n            for(let i = 0; i < idsOrder.length; i+=this.blockSize){\n                const blockKey  = Math.floor(i / this.blockSize) * this.blockSize as number;\n                for(let j = 0; j < this.blockSize; j++){\n                    const id = idsOrder[i + j];\n                    if(id != null){\n                        this.idDataMap[id] = {blockKey};\n                    }\n                }\n                this.idsOrder[blockKey] = idsOrder.slice(i, i + this.blockSize) as string[];\n                this.insertBlockOrder.push(blockKey);\n                this.sortedOrder.push(blockKey);\n            }\n            missingRowRanges = this.reConstructIdsOrder([], 'insert');\n        }\n        else{\n            rowMetas.forEach(({insertIds})=>{\n                adder += insertIds?.length ?? 1;\n            })\n            this.rowCount += adder;\n            missingRowRanges = this.reConstructIdsOrder(rowMetas, 'insert');\n        }\n\n        Object.keys(missingRowRanges).forEach((key)=>{\n            const blockKey           = Number(key);\n            const missingBlockRanges = (this.idsOrder[blockKey]) ? missingRowRanges[blockKey] : [];\n            missingBlockRanges.forEach(({startRow, endRow})=>{\n                this.fetchRows(startRow, endRow);\n            })\n        })\n    }\n\n    deleteRowsAtIndexes(indexes : number[], count : number = 1): void {\n        const deleteMeta = indexes.map(index=>({index}));\n\n        this.rowCount -= (indexes.length) * count;\n        const missingRowRanges = this.reConstructIdsOrder(deleteMeta, 'delete');\n        Object.values(missingRowRanges).forEach((missingBlockRanges)=>{\n            missingBlockRanges.forEach(({startRow, endRow})=>{\n                this.fetchRows(startRow, endRow);\n            })\n        })\n    }\n\n    moveRow(sourceIndexes : number[], targetIndex : number): void {\n        sourceIndexes;\n        targetIndex;\n        // const sourceIndex      = sourceIndexes[0];\n        // const sourceId         = this.getIdByIndex(sourceIndex) as string;\n        // let   missingRowRanges = [];\n        // missingRowRanges.push(...this.reConstructIdsOrder(sourceIndex, -1));\n        // missingRowRanges.push(...this.reConstructIdsOrder(targetIndex, 1, {[targetIndex] : sourceId}));\n    }\n\n    removeCacheBlock(blockKey: number): void {\n        // const insertOrderValue = this.insertBlockOrder[blockKey];\n        const idsOrder         = this.idsOrder[blockKey];\n        if (idsOrder) {\n            const startIndex = blockKey * this.blockSize;\n            const endIndex   = (startIndex + this.blockSize) - 1;\n            this.blockConfig.onAfterBlockDelete?.({startIndex, endIndex, ids : idsOrder});\n            idsOrder.forEach((id) => {\n                delete this.idDataMap[id];\n            });\n        } \n        delete this.idsOrder[blockKey];\n        const sortedIndex = this.sortedOrder.indexOf(blockKey);\n        const insertIndex = this.insertBlockOrder.indexOf(blockKey);\n        this.insertBlockOrder.splice(insertIndex, 1);\n        this.sortedOrder.splice(sortedIndex, 1);  \n    }\n\n\n    removeUnWantedCache(): void {\n\n        if (this.insertBlockOrder.length <= this.blockCount) {\n            return;\n        }\n        const { startRow, endRow }  = this.viewport;\n        const viewportStartKey      = this.getBlockKey(startRow);\n        const viewportEndKey        = this.getBlockKey(endRow);\n        // console.log(startRow,endRow);\n        for (let i = 0; i < this.insertBlockOrder.length && (this.insertBlockOrder.length > this.blockCount); i++) {\n\n            const key               = this.insertBlockOrder[i];\n            const isInViewport      = viewportStartKey <= key && key <= viewportEndKey;\n            const isInStaticCache   = this.isInStaticCache(key);\n            if (!isInViewport && !isInStaticCache) {\n                this.removeCacheBlock(key);\n            }\n        }\n    }\n}\n\nexport {\n    CacheBlockHandler\n}","import { FilterExecutioner } from \"./FilterExecutioner\";\nimport { FilterRegistry } from \"./FilterRegistry\";\nimport { Contains } from \"./filters/Contains\";\nimport { DoesNotContains } from \"./filters/DoesNotContains\";\nimport { EndsWith } from \"./filters/EndsWith\";\nimport { Equals } from \"./filters/Equals\";\nimport { Greater } from \"./filters/Greater\";\nimport { GreaterOrEqual } from \"./filters/GreaterOrEqual\";\nimport { IsBetween } from \"./filters/IsBetween\";\nimport { isEmpty } from \"./filters/IsEmpty\";\nimport { IsNotBetween } from \"./filters/IsNotBetween\";\nimport { IsNotEmpty } from \"./filters/IsNotEmpty\";\nimport { less } from \"./filters/Less\";\nimport { LessOrEquals } from \"./filters/LessOrEquals\";\nimport { NotEquals } from \"./filters/NotEquals\";\nimport { StartsWith } from \"./filters/StartsWith\";\nimport { IFilterObjectExecutioner } from \"./interface/IFilterObject\";\n\nFilterRegistry.register([\n    {\n        name : 'startsWith',\n        comparator : StartsWith\n    },\n    {\n        name : 'endsWith',\n        comparator : EndsWith\n    },\n    {\n        name : 'contains',\n        comparator : Contains\n    },\n    {\n        name : 'doesNotContains',\n        comparator : DoesNotContains\n    },\n    {\n        name : 'equals',\n        comparator : Equals\n    },\n    {\n        name      : 'notEquals',\n        comparator: NotEquals\n    },\n    {\n        name : 'greater',\n        comparator : Greater\n    },\n    {\n        name : 'less',\n        comparator : less\n    },\n    {\n        name : 'greaterOrEqual',\n        comparator : GreaterOrEqual\n    },\n    {\n        name : 'lessOrEqual',\n        comparator : LessOrEquals\n    },\n    {\n        name : 'isEmpty',\n        comparator : isEmpty\n    },\n    {\n        name : 'isNotEmpty',\n        comparator : IsNotEmpty\n    },\n    {\n        name : 'isBetween',\n        comparator : IsBetween\n    },\n    {\n        name : 'isNotBetween',\n        comparator : IsNotBetween\n    }\n]);\n\nexport function filter(filterObject : IFilterObjectExecutioner, records : any) : any {\n    const filterExecutioner = new FilterExecutioner(filterObject);\n    return records.filter((record : any) => {\n\t\treturn filterExecutioner.execute(record);\n\t});\n}","import { FilterRegistry } from \"./FilterRegistry\";\nimport { IFilterObject , IFilterComparator, IFilterComparatorObject, IFilterCondition, IFilterObjectExecutioner, IFilterExecutioner } from \"./interface/IFilterObject\";\n\nexport const enum FILTER_CONDITIONS  {\n\tOR  = 'or',\n\tAND = 'and',\n};\n\nexport class FilterExecutioner implements IFilterExecutioner {\n\tprivate filterComparator          !: IFilterComparator;\n\tprivate isGlobalNeedToPassAllCases!: boolean;\n\tprivate globalOperator            !: FILTER_CONDITIONS;\n\tconstructor( filterObject: IFilterObjectExecutioner) {\n\t\tthis.init(filterObject);\n\t}\n\n\tprivate init( filterObject: IFilterObjectExecutioner) {\n\t\t// Creating comparators based on the filterObject\n\t\tthis.filterComparator = {\n\t\t\tisNeedToPassAllCases: true,\n\t\t\tfilters: [],\n\t\t};\n\n\t\t// create a filter based on filterobject\n\t\tif (filterObject) {\n\t\t\t// Assigning isGlobalNeedToPassAllCases based on the globalOperator provided\n\n\t\t\tthis.isGlobalNeedToPassAllCases = filterObject.globalOperator ? filterObject.globalOperator === FILTER_CONDITIONS.OR ? false : true : true;\n\t\t\tthis.globalOperator             = this.isGlobalNeedToPassAllCases ? FILTER_CONDITIONS.AND : FILTER_CONDITIONS.OR;\n\t\t\tthis.createFilter(filterObject);\n\t\t}\n\t}\n\tprivate createFilter( filterObject: IFilterObjectExecutioner ) {\n\t\t// Creating comparators based on the filterObject default set to globalOperator\n\t\tthis.filterComparator = {\n\t\t\tisNeedToPassAllCases: this.isGlobalNeedToPassAllCases,\n\t\t\tfilters: [],\n\t\t};\n\t\tthis.createCustomFilter( filterObject, this.filterComparator );\n\t}\n\n\tprivate createCustomFilter( filterObject: IFilterObjectExecutioner, output: IFilterComparator ) {\n\t\tif (filterObject === undefined) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\toutput.isNeedToPassAllCases = this.isGlobalNeedToPassAllCases;\n\t\t// Assigning isNeedToPassAllCases based on operator provided\n\t\tif (filterObject.operator) {\n\t\t\toutput.isNeedToPassAllCases =\n\t\t\t\tfilterObject.operator === FILTER_CONDITIONS.OR ? false : true;\n\t\t}\n\t\toutput.filters = [];\n\t\ttry {\n\t\t\tfilterObject.conditions.forEach(\n\t\t\t\t(condition: IFilterObjectExecutioner | IFilterCondition) => {\n\t\t\t\t\t// condition.operator = condition.operator ?? this.globalOperator;\n\n\t\t\t\t\t// if the filter object has condition call the createCustomFilter recursively and create a new filer object\n\t\t\t\t\t// { isNeedToPassAllCases : boolean , filters : []}\n\t\t\t\t\tif ((condition as IFilterObjectExecutioner).conditions) {\n\t\t\t\t\t\t(condition as IFilterObjectExecutioner).operator =\n\t\t\t\t\t\t\t(condition as IFilterObjectExecutioner).operator ?? this.globalOperator;\n\n\t\t\t\t\t\t// if the filter object has condition call the createCustomFilter recursively and create a new filer object\n\t\t\t\t\t\t// { isNeedToPassAllCases : boolean , filters : []}\n\n\t\t\t\t\t\tconst newFilter = {};\n\t\t\t\t\t\toutput.filters?.push(newFilter);\n\t\t\t\t\t\tthis.createCustomFilter(\n\t\t\t\t\t\t\tcondition as IFilterObjectExecutioner,\n\t\t\t\t\t\t\tnewFilter\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// add the comparator based on filter condition to filter array\n\t\t\t\t\t\toutput.filters?.push(\n\t\t\t\t\t\t\tthis.getFilterComparator( condition as IFilterCondition ),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconsole.log(err);\n\t\t}\n\t}\n\n\t// {field : unknown, condition : unknown, filterValue : unknown}\n\tprivate getFilterComparator( filterObject: IFilterCondition, ) {\n\t\tconst { key, condition, filter, filterTo, ignoreCase, ignoreAccent, ignoreNull } = filterObject;\n\n\t\tlet filterComparator : IFilterComparatorObject;\n\n\t\t// Assigning the comparator to customComparator param from the registeredComparators\n\t\tconst customComparator = FilterRegistry.getComparator(condition);\n\t\t// Handling Comparators if the comparator is registered in DataProcessor along with fieldName, condition, and filterValue\n\t\tfilterComparator = {\n\t\t\tcomparator: customComparator,\n\t\t\tkey,\n\t\t\tcondition,\n\t\t\tfilter,\n\t\t\tfilterTo,\n\t\t\tignoreAccent : ignoreAccent ?? false,\n\t\t\tignoreCase : ignoreCase ?? false,\n\t\t\tignoreNull : ignoreNull ?? false\n\t\t};\n\t\treturn filterComparator;\n\t}\n\n\texecute(record: Record<any, any>) : boolean {\n\t\t// execute the comparator for each record\n\t\treturn this.executeComparators(record, this.filterComparator);\n\t}\n\n\tprivate executeComparators(record: Record<string, any>, filterComparator : IFilterComparator) : boolean {\n\t\tlet result = true;\n\t\tif (filterComparator.filters !== undefined) {\n\t\t\tfilterComparator.filters.every((filterObject) => {\n\t\t\t\tif (Array.isArray((filterObject as IFilterComparator).filters)) {\n\t\t\t\t\tresult = this.executeComparators(record, filterObject as IFilterComparator);\n\t\t\t\t} else {\n\t\t\t\t\tconst { comparator, key, filter, filterTo, ignoreCase , ignoreNull, ignoreAccent } = filterObject as IFilterComparatorObject;\n\t\t\t\t\tconst filterCompObject: IFilterObject = {\n\t\t\t\t\t\tfilter,\n\t\t\t\t\t\tfilterTo,\n\t\t\t\t\t\tignoreCase,\n\t\t\t\t\t\tignoreAccent,\n\t\t\t\t\t\tignoreNull,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t};\n\t\t\t\t\tresult = comparator ? comparator(filterCompObject, record) : true;\n\t\t\t\t}\n\n\t\t\t\tif (result) {\n\t\t\t\t\treturn filterComparator.isNeedToPassAllCases;\n\t\t\t\t} else {\n\t\t\t\t\treturn !filterComparator.isNeedToPassAllCases;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn result;\n\t}\n}\n","import { IFilterObject } from \"./interface/IFilterObject\";\nimport { isNull } from \"./utils\";\n\nfunction __register(name: string, comparator : any) {\n\tFilterRegistry.globalComparator[name] = comparator;\n}\nexport interface IComparatorFunc {\n    (filterObject : IFilterObject, data : Record<any, any>): boolean\n}\ninterface IFilterComparator {\n\tname      : string;\n\tcomparator: IComparatorFunc;\n}\n\nexport class FilterRegistry {\n\tstatic globalComparator: {[key : string] : IComparatorFunc} = {};\n\n\tstatic register(filterComparator: IFilterComparator[] | IFilterComparator) {\n\t\tif (isNull(filterComparator)) {\n\t\t\treturn;\n\t\t}\n\t\tif (Array.isArray(filterComparator)) {\n\t\t\tfilterComparator.forEach((mod) => __register(mod.name, mod.comparator));\n\t\t} else {\n\t\t\t__register(filterComparator.name, filterComparator.comparator);\n\t\t}\n\t}\n\n\tstatic isComparatorRegistered(name: string) {\n\t\treturn !!FilterRegistry.globalComparator[name];\n\t}\n\n\tstatic getRegisteredModules() {\n\t\treturn FilterRegistry.globalComparator;\n\t}\n\n\tstatic removeRegisteredComparators(name: string): void {\n\t\tdelete FilterRegistry.globalComparator[name];\n\t}\n\n\tstatic getComparator(name: string): any {\n\t\tif (FilterRegistry.isComparatorRegistered(name)) {\n\t\t\treturn FilterRegistry.globalComparator[name];\n\t\t}\n\t\treturn null;\n\t}\n}\n","import { IFilterObject } from '../interface/IFilterObject';\nimport {\n\tconvertToString,\n\tgetObjectValue,\n\tignoreAccents,\n\tisNull,\n\tisUndefined,\n} from '../utils';\n\nexport function Contains(filterObject: IFilterObject, data: any): boolean {\n\tconst { key, filter, ignoreNull, ignoreCase, ignoreAccent } = filterObject;\n\tconst targetValue = getObjectValue(data, key);\n\n\tif (isNull(targetValue) || isUndefined(targetValue)) {\n\t\treturn ignoreNull ? true : false;\n\t}\n\n\tlet actualValue = convertToString(filter);\n\tlet expectedValue = convertToString(targetValue);\n\n\tif (ignoreAccent) {\n\t\tactualValue = ignoreAccents(actualValue);\n\t\texpectedValue = ignoreAccents(expectedValue);\n\t}\n\n\tif (ignoreCase) {\n\t\tactualValue = actualValue.toLowerCase();\n\t\texpectedValue = expectedValue.toLowerCase();\n\t}\n\n\treturn expectedValue.includes(actualValue);\n}\n","import { IFilterObject } from '../interface/IFilterObject';\nimport { Contains } from './Contains';\n\nexport function DoesNotContains(filterObject: IFilterObject, data: any): boolean {\n\treturn !Contains(filterObject, data);\n}\n","import { IFilterObject } from '../interface/IFilterObject';\nimport {\n\tconvertToString,\n\tgetObjectValue,\n\tignoreAccents,\n\tisNull,\n\tisUndefined,\n} from '../utils';\n\nexport function EndsWith(filterObject: IFilterObject, data: any): boolean {\n\tconst { key, filter, ignoreNull, ignoreCase, ignoreAccent } = filterObject;\n\tconst targetValue = getObjectValue(data, key);\n\n\tif (isNull(targetValue) || isUndefined(targetValue)) {\n\t\treturn ignoreNull ? true : false;\n\t}\n\n\tlet actualValue = convertToString(filter);\n\tlet expectedValue = convertToString(targetValue);\n\n\tif (ignoreAccent) {\n\t\tactualValue = ignoreAccents(actualValue);\n\t\texpectedValue = ignoreAccents(expectedValue);\n\t}\n\n\tif (ignoreCase) {\n\t\tactualValue = actualValue.toLowerCase();\n\t\texpectedValue = expectedValue.toLowerCase();\n\t}\n\n\treturn expectedValue.endsWith(actualValue);\n}\n","import { IFilterObject } from '../interface/IFilterObject';\nimport { getObjectValue, ignoreAccents, timeDifference } from '../utils';\n\nexport function Equals(filterObject: IFilterObject, data: any): boolean {\n\tconst { key, filter, ignoreAccent, ignoreCase, ignoreNull } = filterObject;\n\tconst targetValue = getObjectValue(data, key);\n\n\tif (targetValue === null || targetValue === undefined) {\n\t\treturn ignoreNull ? true : false;\n\t}\n\n\tif (typeof targetValue === 'number') {\n\t\treturn targetValue === Number(filter);\n\t}\n\tif(!isNaN(targetValue)){\n        return targetValue == filter;\n    }\n\n\n\tif (filter instanceof Date) {\n\t\treturn Array.isArray(targetValue)\n\t\t\t? targetValue.some(function (x) {\n\t\t\t\t\treturn timeDifference(filter, x) === 0;\n\t\t\t  })\n\t\t\t: timeDifference(filter, targetValue as Date) === 0;\n\t}\n\tif (Array.isArray(targetValue)) {\n\t\tif (!ignoreCase) {\n\t\t\tif (ignoreAccent) {\n\t\t\t\treturn targetValue\n\t\t\t\t\t.map(function (x) {\n\t\t\t\t\t\treturn ignoreAccents(x.toString());\n\t\t\t\t\t})\n\t\t\t\t\t.includes(ignoreAccents(filter.toString()));\n\t\t\t}\n\t\t\treturn targetValue.includes(filter.toString());\n\t\t}\n\t\treturn targetValue\n\t\t\t.map(function (x) {\n\t\t\t\treturn x.toString().toUpperCase();\n\t\t\t})\n\t\t\t.includes(filter.toString().toUpperCase());\n\t}\n\n\tlet actualValue = filter.toString();\n\tlet expectedValue = targetValue.toString();\n\n\tif (ignoreAccent) {\n\t\tactualValue = ignoreAccents(actualValue);\n\t\texpectedValue = ignoreAccents(expectedValue);\n\t}\n\n\tif (ignoreCase) {\n\t\tactualValue = actualValue.toLowerCase();\n\t\texpectedValue = expectedValue.toLowerCase();\n\t}\n\n\treturn expectedValue === actualValue;\n}\n","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { getObjectValue, ignoreAccents, isNull, isUndefined, timeDifference } from \"../utils\";\n\nexport function Greater(filterObject : IFilterObject, data : any) : boolean {\n    const {key, filter, ignoreAccent, ignoreCase, ignoreNull} = filterObject;\n    const targetValue = getObjectValue(data, key);\n\n    if(isNull(targetValue) || isUndefined(targetValue)) {\n        return ignoreNull ? true : false;\n    }\n\n    if(Array.isArray(targetValue)) {\n        return false;\n    }\n\n    if(filter instanceof Date) {\n        return timeDifference(filter, targetValue as Date) < 0\n    }\n\n    if(typeof targetValue === 'number') {\n        return targetValue > Number(filter);\n    }\n    if(!isNaN(targetValue)){\n        return targetValue > filter;\n    }\n\n    let actualValue = filter.toString();\n    let expectedValue = (targetValue as any).toString();\n\n    if(ignoreAccent) {\n        actualValue = ignoreAccents(actualValue);\n        expectedValue = ignoreAccents(expectedValue);\n    }\n\n    if(ignoreCase) {\n        actualValue = actualValue.toLowerCase();\n        expectedValue = actualValue.toUpperCase();\n    }\n\n    return expectedValue > actualValue;\n}","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { less } from \"./Less\";\n\nexport function GreaterOrEqual(filterObject : IFilterObject, data : any) : boolean {\n    return !(less(filterObject, data));\n}","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { GreaterOrEqual } from \"./GreaterOrEqual\";\nimport { LessOrEquals } from \"./LessOrEquals\";\n\nexport function IsBetween(filterObject : IFilterObject, data : any) : boolean {\n    const lessFilterObject = {...filterObject}\n    lessFilterObject.filter = filterObject.filterTo\n    return (\n\t\tGreaterOrEqual(filterObject, data) &&\n\t\tLessOrEquals(lessFilterObject, data)\n\t);\n}","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { getObjectValue, isNull, isUndefined } from \"../utils\";\n\nexport function isEmpty(filterObject : IFilterObject, data : any) : boolean {\n    const { key, ignoreNull } = filterObject;\n\tconst targetValue = getObjectValue(data, key);\n\n    if(isNull(targetValue) || isUndefined(targetValue)) {\n        return ignoreNull ? true : false;\n    }\n\n    if(targetValue as any !== '') {\n        return false;\n    }\n\n    return true;\n}","import { IFilterObject } from '../interface/IFilterObject';\nimport { IsBetween } from './IsBetween';\n\nexport function IsNotBetween(filterObject: IFilterObject, data: any): boolean {\n\treturn !IsBetween(filterObject, data);\n}\n","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { isEmpty } from \"./IsEmpty\";\n\nexport function IsNotEmpty(filterObject : IFilterObject, data : any) : boolean {\n    return !isEmpty(filterObject, data);\n}","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { Greater } from \"./Greater\";\nimport { Equals } from \"./Equals\";\n\n\nexport function less(filterObject : IFilterObject, data : any) : boolean {\n    return (!Greater(filterObject, data) && !Equals(filterObject, data))\n}","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { Greater } from \"./Greater\";\n\nexport function LessOrEquals(filterObject : IFilterObject , data : any) : boolean {\n    return !(Greater(filterObject, data));\n}\n","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { Equals } from \"./Equals\";\n\n\nexport function NotEquals(filterObject : IFilterObject, data : any) : boolean {\n    return !Equals(filterObject, data);\n}","import { IFilterObject } from \"../interface/IFilterObject\";\nimport { convertToString, getObjectValue, ignoreAccents, isNull, isUndefined } from \"../utils\";\n\nexport function StartsWith(filterObject : IFilterObject, data : any) : boolean {\n    const {key, filter, ignoreNull, ignoreCase, ignoreAccent} = filterObject;\n    const targetValue = getObjectValue(data, key);\n\n    if(isNull(targetValue) || isUndefined(targetValue)) {\n        return ignoreNull ? true : false;\n    }\n\n    let actualValue   = convertToString(filter);\n    let expectedValue = convertToString(targetValue);\n\n    if(ignoreAccent) {\n        actualValue   = ignoreAccents(actualValue);\n        expectedValue = ignoreAccents(expectedValue);\n    }\n\n    if(ignoreCase) {\n        actualValue   = actualValue.toLowerCase();\n        expectedValue = expectedValue.toLowerCase();\n    }\n\n    return expectedValue.startsWith(actualValue);\n}","var characterMap : {[key : string] : string} = {\n\t\"À\": \"A\",\n\t\"Á\": \"A\",\n\t\"Â\": \"A\",\n\t\"Ã\": \"A\",\n\t\"Ä\": \"A\",\n\t\"Å\": \"A\",\n\t\"Ấ\": \"A\",\n\t\"Ắ\": \"A\",\n\t\"Ẳ\": \"A\",\n\t\"Ẵ\": \"A\",\n\t\"Ặ\": \"A\",\n\t\"Æ\": \"AE\",\n\t\"Ầ\": \"A\",\n\t\"Ằ\": \"A\",\n\t\"Ȃ\": \"A\",\n\t\"Ả\": \"A\",\n\t\"Ạ\": \"A\",\n\t\"Ẩ\": \"A\",\n\t\"Ẫ\": \"A\",\n\t\"Ậ\": \"A\",\n\t\"Ç\": \"C\",\n\t\"Ḉ\": \"C\",\n\t\"È\": \"E\",\n\t\"É\": \"E\",\n\t\"Ê\": \"E\",\n\t\"Ë\": \"E\",\n\t\"Ế\": \"E\",\n\t\"Ḗ\": \"E\",\n\t\"Ề\": \"E\",\n\t\"Ḕ\": \"E\",\n\t\"Ḝ\": \"E\",\n\t\"Ȇ\": \"E\",\n\t\"Ẻ\": \"E\",\n\t\"Ẽ\": \"E\",\n\t\"Ẹ\": \"E\",\n\t\"Ể\": \"E\",\n\t\"Ễ\": \"E\",\n\t\"Ệ\": \"E\",\n\t\"Ì\": \"I\",\n\t\"Í\": \"I\",\n\t\"Î\": \"I\",\n\t\"Ï\": \"I\",\n\t\"Ḯ\": \"I\",\n\t\"Ȋ\": \"I\",\n\t\"Ỉ\": \"I\",\n\t\"Ị\": \"I\",\n\t\"Ð\": \"D\",\n\t\"Ñ\": \"N\",\n\t\"Ò\": \"O\",\n\t\"Ó\": \"O\",\n\t\"Ô\": \"O\",\n\t\"Õ\": \"O\",\n\t\"Ö\": \"O\",\n\t\"Ø\": \"O\",\n\t\"Ố\": \"O\",\n\t\"Ṍ\": \"O\",\n\t\"Ṓ\": \"O\",\n\t\"Ȏ\": \"O\",\n\t\"Ỏ\": \"O\",\n\t\"Ọ\": \"O\",\n\t\"Ổ\": \"O\",\n\t\"Ỗ\": \"O\",\n\t\"Ộ\": \"O\",\n\t\"Ờ\": \"O\",\n\t\"Ở\": \"O\",\n\t\"Ỡ\": \"O\",\n\t\"Ớ\": \"O\",\n\t\"Ợ\": \"O\",\n\t\"Ù\": \"U\",\n\t\"Ú\": \"U\",\n\t\"Û\": \"U\",\n\t\"Ü\": \"U\",\n\t\"Ủ\": \"U\",\n\t\"Ụ\": \"U\",\n\t\"Ử\": \"U\",\n\t\"Ữ\": \"U\",\n\t\"Ự\": \"U\",\n\t\"Ý\": \"Y\",\n\t\"à\": \"a\",\n\t\"á\": \"a\",\n\t\"â\": \"a\",\n\t\"ã\": \"a\",\n\t\"ä\": \"a\",\n\t\"å\": \"a\",\n\t\"ấ\": \"a\",\n\t\"ắ\": \"a\",\n\t\"ẳ\": \"a\",\n\t\"ẵ\": \"a\",\n\t\"ặ\": \"a\",\n\t\"æ\": \"ae\",\n\t\"ầ\": \"a\",\n\t\"ằ\": \"a\",\n\t\"ȃ\": \"a\",\n\t\"ả\": \"a\",\n\t\"ạ\": \"a\",\n\t\"ẩ\": \"a\",\n\t\"ẫ\": \"a\",\n\t\"ậ\": \"a\",\n\t\"ç\": \"c\",\n\t\"ḉ\": \"c\",\n\t\"è\": \"e\",\n\t\"é\": \"e\",\n\t\"ê\": \"e\",\n\t\"ë\": \"e\",\n\t\"ế\": \"e\",\n\t\"ḗ\": \"e\",\n\t\"ề\": \"e\",\n\t\"ḕ\": \"e\",\n\t\"ḝ\": \"e\",\n\t\"ȇ\": \"e\",\n\t\"ẻ\": \"e\",\n\t\"ẽ\": \"e\",\n\t\"ẹ\": \"e\",\n\t\"ể\": \"e\",\n\t\"ễ\": \"e\",\n\t\"ệ\": \"e\",\n\t\"ì\": \"i\",\n\t\"í\": \"i\",\n\t\"î\": \"i\",\n\t\"ï\": \"i\",\n\t\"ḯ\": \"i\",\n\t\"ȋ\": \"i\",\n\t\"ỉ\": \"i\",\n\t\"ị\": \"i\",\n\t\"ð\": \"d\",\n\t\"ñ\": \"n\",\n\t\"ò\": \"o\",\n\t\"ó\": \"o\",\n\t\"ô\": \"o\",\n\t\"õ\": \"o\",\n\t\"ö\": \"o\",\n\t\"ø\": \"o\",\n\t\"ố\": \"o\",\n\t\"ṍ\": \"o\",\n\t\"ṓ\": \"o\",\n\t\"ȏ\": \"o\",\n\t\"ỏ\": \"o\",\n\t\"ọ\": \"o\",\n\t\"ổ\": \"o\",\n\t\"ỗ\": \"o\",\n\t\"ộ\": \"o\",\n\t\"ờ\": \"o\",\n\t\"ở\": \"o\",\n\t\"ỡ\": \"o\",\n\t\"ớ\": \"o\",\n\t\"ợ\": \"o\",\n\t\"ù\": \"u\",\n\t\"ú\": \"u\",\n\t\"û\": \"u\",\n\t\"ü\": \"u\",\n\t\"ủ\": \"u\",\n\t\"ụ\": \"u\",\n\t\"ử\": \"u\",\n\t\"ữ\": \"u\",\n\t\"ự\": \"u\",\n\t\"ý\": \"y\",\n\t\"ÿ\": \"y\",\n\t\"Ā\": \"A\",\n\t\"ā\": \"a\",\n\t\"Ă\": \"A\",\n\t\"ă\": \"a\",\n\t\"Ą\": \"A\",\n\t\"ą\": \"a\",\n\t\"Ć\": \"C\",\n\t\"ć\": \"c\",\n\t\"Ĉ\": \"C\",\n\t\"ĉ\": \"c\",\n\t\"Ċ\": \"C\",\n\t\"ċ\": \"c\",\n\t\"Č\": \"C\",\n\t\"č\": \"c\",\n\t\"C̆\": \"C\",\n\t\"c̆\": \"c\",\n\t\"Ď\": \"D\",\n\t\"ď\": \"d\",\n\t\"Đ\": \"D\",\n\t\"đ\": \"d\",\n\t\"Ē\": \"E\",\n\t\"ē\": \"e\",\n\t\"Ĕ\": \"E\",\n\t\"ĕ\": \"e\",\n\t\"Ė\": \"E\",\n\t\"ė\": \"e\",\n\t\"Ę\": \"E\",\n\t\"ę\": \"e\",\n\t\"Ě\": \"E\",\n\t\"ě\": \"e\",\n\t\"Ĝ\": \"G\",\n\t\"Ǵ\": \"G\",\n\t\"ĝ\": \"g\",\n\t\"ǵ\": \"g\",\n\t\"Ğ\": \"G\",\n\t\"ğ\": \"g\",\n\t\"Ġ\": \"G\",\n\t\"ġ\": \"g\",\n\t\"Ģ\": \"G\",\n\t\"ģ\": \"g\",\n\t\"Ĥ\": \"H\",\n\t\"ĥ\": \"h\",\n\t\"Ħ\": \"H\",\n\t\"ħ\": \"h\",\n\t\"Ḫ\": \"H\",\n\t\"ḫ\": \"h\",\n\t\"Ĩ\": \"I\",\n\t\"ĩ\": \"i\",\n\t\"Ī\": \"I\",\n\t\"ī\": \"i\",\n\t\"Ĭ\": \"I\",\n\t\"ĭ\": \"i\",\n\t\"Į\": \"I\",\n\t\"į\": \"i\",\n\t\"İ\": \"I\",\n\t\"ı\": \"i\",\n\t\"Ĳ\": \"IJ\",\n\t\"ĳ\": \"ij\",\n\t\"Ĵ\": \"J\",\n\t\"ĵ\": \"j\",\n\t\"Ķ\": \"K\",\n\t\"ķ\": \"k\",\n\t\"Ḱ\": \"K\",\n\t\"ḱ\": \"k\",\n\t\"K̆\": \"K\",\n\t\"k̆\": \"k\",\n\t\"Ĺ\": \"L\",\n\t\"ĺ\": \"l\",\n\t\"Ļ\": \"L\",\n\t\"ļ\": \"l\",\n\t\"Ľ\": \"L\",\n\t\"ľ\": \"l\",\n\t\"Ŀ\": \"L\",\n\t\"ŀ\": \"l\",\n\t\"Ł\": \"l\",\n\t\"ł\": \"l\",\n\t\"Ḿ\": \"M\",\n\t\"ḿ\": \"m\",\n\t\"M̆\": \"M\",\n\t\"m̆\": \"m\",\n\t\"Ń\": \"N\",\n\t\"ń\": \"n\",\n\t\"Ņ\": \"N\",\n\t\"ņ\": \"n\",\n\t\"Ň\": \"N\",\n\t\"ň\": \"n\",\n\t\"ŉ\": \"n\",\n\t\"N̆\": \"N\",\n\t\"n̆\": \"n\",\n\t\"Ō\": \"O\",\n\t\"ō\": \"o\",\n\t\"Ŏ\": \"O\",\n\t\"ŏ\": \"o\",\n\t\"Ő\": \"O\",\n\t\"ő\": \"o\",\n\t\"Œ\": \"OE\",\n\t\"œ\": \"oe\",\n\t\"P̆\": \"P\",\n\t\"p̆\": \"p\",\n\t\"Ŕ\": \"R\",\n\t\"ŕ\": \"r\",\n\t\"Ŗ\": \"R\",\n\t\"ŗ\": \"r\",\n\t\"Ř\": \"R\",\n\t\"ř\": \"r\",\n\t\"R̆\": \"R\",\n\t\"r̆\": \"r\",\n\t\"Ȓ\": \"R\",\n\t\"ȓ\": \"r\",\n\t\"Ś\": \"S\",\n\t\"ś\": \"s\",\n\t\"Ŝ\": \"S\",\n\t\"ŝ\": \"s\",\n\t\"Ş\": \"S\",\n\t\"Ș\": \"S\",\n\t\"ș\": \"s\",\n\t\"ş\": \"s\",\n\t\"Š\": \"S\",\n\t\"š\": \"s\",\n\t\"Ţ\": \"T\",\n\t\"ţ\": \"t\",\n\t\"ț\": \"t\",\n\t\"Ț\": \"T\",\n\t\"Ť\": \"T\",\n\t\"ť\": \"t\",\n\t\"Ŧ\": \"T\",\n\t\"ŧ\": \"t\",\n\t\"T̆\": \"T\",\n\t\"t̆\": \"t\",\n\t\"Ũ\": \"U\",\n\t\"ũ\": \"u\",\n\t\"Ū\": \"U\",\n\t\"ū\": \"u\",\n\t\"Ŭ\": \"U\",\n\t\"ŭ\": \"u\",\n\t\"Ů\": \"U\",\n\t\"ů\": \"u\",\n\t\"Ű\": \"U\",\n\t\"ű\": \"u\",\n\t\"Ų\": \"U\",\n\t\"ų\": \"u\",\n\t\"Ȗ\": \"U\",\n\t\"ȗ\": \"u\",\n\t\"V̆\": \"V\",\n\t\"v̆\": \"v\",\n\t\"Ŵ\": \"W\",\n\t\"ŵ\": \"w\",\n\t\"Ẃ\": \"W\",\n\t\"ẃ\": \"w\",\n\t\"X̆\": \"X\",\n\t\"x̆\": \"x\",\n\t\"Ŷ\": \"Y\",\n\t\"ŷ\": \"y\",\n\t\"Ÿ\": \"Y\",\n\t\"Y̆\": \"Y\",\n\t\"y̆\": \"y\",\n\t\"Ź\": \"Z\",\n\t\"ź\": \"z\",\n\t\"Ż\": \"Z\",\n\t\"ż\": \"z\",\n\t\"Ž\": \"Z\",\n\t\"ž\": \"z\",\n\t\"ſ\": \"s\",\n\t\"ƒ\": \"f\",\n\t\"Ơ\": \"O\",\n\t\"ơ\": \"o\",\n\t\"Ư\": \"U\",\n\t\"ư\": \"u\",\n\t\"Ǎ\": \"A\",\n\t\"ǎ\": \"a\",\n\t\"Ǐ\": \"I\",\n\t\"ǐ\": \"i\",\n\t\"Ǒ\": \"O\",\n\t\"ǒ\": \"o\",\n\t\"Ǔ\": \"U\",\n\t\"ǔ\": \"u\",\n\t\"Ǖ\": \"U\",\n\t\"ǖ\": \"u\",\n\t\"Ǘ\": \"U\",\n\t\"ǘ\": \"u\",\n\t\"Ǚ\": \"U\",\n\t\"ǚ\": \"u\",\n\t\"Ǜ\": \"U\",\n\t\"ǜ\": \"u\",\n\t\"Ứ\": \"U\",\n\t\"ứ\": \"u\",\n\t\"Ṹ\": \"U\",\n\t\"ṹ\": \"u\",\n\t\"Ǻ\": \"A\",\n\t\"ǻ\": \"a\",\n\t\"Ǽ\": \"AE\",\n\t\"ǽ\": \"ae\",\n\t\"Ǿ\": \"O\",\n\t\"ǿ\": \"o\",\n\t\"Þ\": \"TH\",\n\t\"þ\": \"th\",\n\t\"Ṕ\": \"P\",\n\t\"ṕ\": \"p\",\n\t\"Ṥ\": \"S\",\n\t\"ṥ\": \"s\",\n\t\"X́\": \"X\",\n\t\"x́\": \"x\",\n\t\"Ѓ\": \"Г\",\n\t\"ѓ\": \"г\",\n\t\"Ќ\": \"К\",\n\t\"ќ\": \"к\",\n\t\"A̋\": \"A\",\n\t\"a̋\": \"a\",\n\t\"E̋\": \"E\",\n\t\"e̋\": \"e\",\n\t\"I̋\": \"I\",\n\t\"i̋\": \"i\",\n\t\"Ǹ\": \"N\",\n\t\"ǹ\": \"n\",\n\t\"Ồ\": \"O\",\n\t\"ồ\": \"o\",\n\t\"Ṑ\": \"O\",\n\t\"ṑ\": \"o\",\n\t\"Ừ\": \"U\",\n\t\"ừ\": \"u\",\n\t\"Ẁ\": \"W\",\n\t\"ẁ\": \"w\",\n\t\"Ỳ\": \"Y\",\n\t\"ỳ\": \"y\",\n\t\"Ȁ\": \"A\",\n\t\"ȁ\": \"a\",\n\t\"Ȅ\": \"E\",\n\t\"ȅ\": \"e\",\n\t\"Ȉ\": \"I\",\n\t\"ȉ\": \"i\",\n\t\"Ȍ\": \"O\",\n\t\"ȍ\": \"o\",\n\t\"Ȑ\": \"R\",\n\t\"ȑ\": \"r\",\n\t\"Ȕ\": \"U\",\n\t\"ȕ\": \"u\",\n\t\"B̌\": \"B\",\n\t\"b̌\": \"b\",\n\t\"Č̣\": \"C\",\n\t\"č̣\": \"c\",\n\t\"Ê̌\": \"E\",\n\t\"ê̌\": \"e\",\n\t\"F̌\": \"F\",\n\t\"f̌\": \"f\",\n\t\"Ǧ\": \"G\",\n\t\"ǧ\": \"g\",\n\t\"Ȟ\": \"H\",\n\t\"ȟ\": \"h\",\n\t\"J̌\": \"J\",\n\t\"ǰ\": \"j\",\n\t\"Ǩ\": \"K\",\n\t\"ǩ\": \"k\",\n\t\"M̌\": \"M\",\n\t\"m̌\": \"m\",\n\t\"P̌\": \"P\",\n\t\"p̌\": \"p\",\n\t\"Q̌\": \"Q\",\n\t\"q̌\": \"q\",\n\t\"Ř̩\": \"R\",\n\t\"ř̩\": \"r\",\n\t\"Ṧ\": \"S\",\n\t\"ṧ\": \"s\",\n\t\"V̌\": \"V\",\n\t\"v̌\": \"v\",\n\t\"W̌\": \"W\",\n\t\"w̌\": \"w\",\n\t\"X̌\": \"X\",\n\t\"x̌\": \"x\",\n\t\"Y̌\": \"Y\",\n\t\"y̌\": \"y\",\n\t\"A̧\": \"A\",\n\t\"a̧\": \"a\",\n\t\"B̧\": \"B\",\n\t\"b̧\": \"b\",\n\t\"Ḑ\": \"D\",\n\t\"ḑ\": \"d\",\n\t\"Ȩ\": \"E\",\n\t\"ȩ\": \"e\",\n\t\"Ɛ̧\": \"E\",\n\t\"ɛ̧\": \"e\",\n\t\"Ḩ\": \"H\",\n\t\"ḩ\": \"h\",\n\t\"I̧\": \"I\",\n\t\"i̧\": \"i\",\n\t\"Ɨ̧\": \"I\",\n\t\"ɨ̧\": \"i\",\n\t\"M̧\": \"M\",\n\t\"m̧\": \"m\",\n\t\"O̧\": \"O\",\n\t\"o̧\": \"o\",\n\t\"Q̧\": \"Q\",\n\t\"q̧\": \"q\",\n\t\"U̧\": \"U\",\n\t\"u̧\": \"u\",\n\t\"X̧\": \"X\",\n\t\"x̧\": \"x\",\n\t\"Z̧\": \"Z\",\n\t\"z̧\": \"z\",\n\t\"й\":\"и\",\n\t\"Й\":\"И\",\n\t\"ё\":\"е\",\n\t\"Ё\":\"Е\",\n};\n\nconst chars       = Object.keys(characterMap).join('|');\nconst allAccents  = new RegExp(chars, 'g');\nconst firstAccent = new RegExp(chars, '');\n\nfunction matcher(match : string) {\n\treturn characterMap[match];\n}\n\nexport function removeAccents(string : string) {\n\treturn string.replace(allAccents, matcher);\n};\n\nexport function hasAccents(string : string) {\n\treturn !!string.match(firstAccent);\n};\n","import { removeAccents } from \"./removeAccents\";\n\nexport function getObjectValue(data: Record<any, any>, key: string) {\n\tconst fieldNames = key.split('.');\n\tlet value = data.getData();\n\n\tfor (const field of fieldNames) {\n\t\tif (value && value.hasOwnProperty(field)) {\n\t\t\tvalue = value[field];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn value;\n}\n\nexport function timeDifference(value : Date, targetValue : Date) {\n\treturn value.getTime() - new Date(targetValue.toString()).getTime();\n}\n\nexport function ignoreAccents(value : string) {\n    return removeAccents(value);\n}\n\nexport function isNull(input: any) {\n\treturn input === null;\n}\n\nexport function isUndefined(input: any) {\n\treturn !isDefined(input);\n}\n\nexport function isDefined(input: any) {\n\treturn typeof input !== 'undefined';\n}\n\nexport function convertToString(value : any) : string {\n    return value ? typeof value !== 'string' ? value.toString() : value : ((value as any) === 0 || (value as any) === false) ? value.toString() : ''\n}","import { IComparer, IDataFetcher, IGroupObject } from \"./groupBy.types\";\n\nfunction initiateKeys(groupDataObject : any, keys : string[]) : any[]{\n    let obj = groupDataObject;\n    const lastIndex = keys.length - 1;\n    keys.forEach((key, index)=>{\n        let initialValue = (index != lastIndex) ? {} : [];\n        (!obj[key]) && (obj[key] = initialValue);\n        obj = obj[key];\n    })\n    return obj;\n}\n\nexport const getStructedData = (dataFetcher : IDataFetcher, count : number, comparer : IComparer) =>{\n    const groupedData = {};\n    for(let index = 0; index < count; index++){\n        const data = dataFetcher(index);\n        const key = comparer(data);\n        const parentKeys = Array.isArray(key) ? key : [key];\n        const leaf = initiateKeys(groupedData, parentKeys);\n        leaf.push(data);\n    }\n    return groupedData;\n}\n\nexport const groupBy = ({data, count, comparer}: IGroupObject)=>{\n    const dataFetcherCallback = Array.isArray(data) ? (index)=>data[index] : data;\n    count = count ?? data.length;\n    if(Array.isArray(comparer)){\n        const keys = comparer;\n        comparer = (data)=>{\n            let parentKeys = keys.map((key)=>data[key]);\n            return parentKeys;\n        }\n    }\n    return getStructedData(dataFetcherCallback, count, comparer);\n}","import { SortRegistry } from \"./SortRegistry\";\n\n\n// >>>>>>> Interfaces starts <<<<<<<\nexport type IOrder = 1 | -1 | 0;\nexport interface IComparer {\n\t( a: any, b: any, order: IOrder, nullRank: IOrder, undefinedRank: IOrder, ): number;\n}\n\nexport interface ISortBy {\n\t(record: Record<any, any>): any;\n}\n\nexport type SortBy = ISortBy | string | null;\n\nexport interface ISortObject {\n\tby           ?: SortBy;\n\torder        ?: 'asc' | 'desc';\n\tcomparer     ?: IComparer | string;\n\tnullRank     ?: boolean;\n\tundefinedRank?: boolean;\n}\n\nexport interface IExtractSortObject {\n\tsortBy       : SortBy;\n\torder        : IOrder;\n\tcomparer     : IComparer;\n\tnullRank     : IOrder;\n\tundefinedRank: IOrder;\n}\n\nexport interface ISortInstanceOptions {\n\tcomparer      ?: IComparer,\n\tinPlaceSorting?: boolean,\n}\n\nexport interface sortFunc {\n\t(arrayToSort: any[], sortObject: ISortObject[]): any;\n}\n\n// >>>>>>> Interface Ends <<<<<<<\n\n\n// >>>>>>> helpers starts <<<<<<<\nfunction isNull(input: any) {\n\treturn input === null;\n}\n\nfunction isUndefined(input: any) {\n\treturn !isDefined(input);\n}\n\nfunction isDefined(input: any) {\n\treturn typeof input !== 'undefined';\n}\n\n// function isObject(input: any) {\n// \treturn typeof input === 'object' && input !== null;\n// }\n\n// function isArrayLike(input: any) {\n// \treturn isObject(input) && typeof input.length === 'number';\n// }\n\n// function isNumber(n: any) {\n// \treturn !isNaN(parseFloat(n)) && isFinite(n);\n// }\n\nfunction isDefinedValue(input: any) {\n\treturn isDefined(input) && !isNull(input) && !Number.isNaN(input);\n}\n\nconst valueCasterComparator = (comparer: IComparer) => (a: any, b: any, order: IOrder, nullRank: IOrder, undefinedRank: IOrder) => comparer(a, b, order, nullRank, undefinedRank);\n\nfunction extractSortObject(sortObject: ISortObject, defaultComparer : IComparer): IExtractSortObject {\n\tconst order         = sortObject.order === 'asc' ? 1 : sortObject.order === 'desc' ? -1 : 0;\n\tconst nullRank      = !!sortObject.nullRank ? 1 : -1;\n\tconst undefinedRank = !!sortObject.undefinedRank ? 1 : -1;\n\tconst sortBy        = sortObject.by ?? null;\n\n\tlet comparer: IComparer = defaultComparer;\n\tif (typeof sortObject.comparer === 'function') {\n\t\tcomparer = sortObject.comparer;\n\t}else if(typeof sortObject.comparer === 'string') {\n\t\tcomparer = SortRegistry.getComparator(sortObject.comparer) ?? defaultComparer;\n\t}\n\n\tcomparer = valueCasterComparator(comparer);\n\n\treturn {\n\t\torder,\n\t\tnullRank,\n\t\tundefinedRank,\n\t\tcomparer,\n\t\tsortBy,\n\t};\n}\n\n// >>>>>>> helpers ends <<<<<<<\n\n// >>>>>>> sort starts <<<<<<<\n\nfunction getSortComparator(sortObject: ISortObject[], comparer : IComparer) {\n\tconst extractSortArray: IExtractSortObject[] = [];\n\n\t(sortObject ?? []).forEach((sort) => {\n\t\textractSortArray.push(extractSortObject(sort, comparer));\n\t});\n\n\treturn (a: any, b: any) => sorter(extractSortArray[0], extractSortArray, 1, a, b);\n}\n\nfunction sorter( extractSort: IExtractSortObject, extractSortArray: IExtractSortObject[], depth: number, a: any, b: any, ): number {\n\tlet valA;\n\tlet valB;\n\n\tconst sortBy   = extractSort.sortBy;\n\tconst comparer = extractSort.comparer;\n\tconst order    = extractSort.order;\n\n\tif (typeof sortBy === 'string') {\n\t\t// valA = getObjectValue(a, sortBy);\n\t\t// valB = getObjectValue(b, sortBy);\n\t    valA = a[sortBy]\n\t\tvalB = b[sortBy];\n\n\t} else if (typeof sortBy === 'function') {\n\t\tvalA = sortBy(a);\n\t\tvalB = sortBy(b);\n\t}\n\n\tconst equality = comparer( valA, valB, order, extractSort.nullRank, extractSort.undefinedRank, );\n\n\tif ( (equality === 0 || (valA == null && valB == null)) && extractSortArray.length > depth ) {\n\t\treturn sorter( extractSortArray[depth], extractSortArray, depth + 1, a, b, );\n\t}\n\n\treturn equality;\n}\n\nexport const defaultComparer = ( a: any, b: any, order: IOrder, nullRank: IOrder = 1, undefinedRank: IOrder = 1, ): number => {\n\tlet result;\n\tif (isNull(a) && isUndefined(b)) {\n\t\tresult = order;\n\t} else if (isUndefined(a) && isNull(b)) {\n\t\tresult = -order;\n\t} else if (isNull(a) && isDefinedValue(b)) {\n\t\tresult = nullRank;\n\t} else if (isUndefined(a) && isDefinedValue(b)) {\n\t\tresult = undefinedRank;\n\t} else if (isNull(b) && isDefinedValue(a)) {\n\t\tresult = -nullRank;\n\t} else if (isUndefined(b) && isDefinedValue(a)) {\n\t\tresult = -undefinedRank;\n\t} else {\n\t\tresult = (a < b ? -1 : a > b ? 1 : 0) * order;\n\t}\n\n\treturn result;\n};\n\nexport function createSortInstance(options:ISortInstanceOptions): sortFunc {\n\treturn function (arrayToSort: any[], sortObject: ISortObject[]) {\n\t\tif (!Array.isArray(arrayToSort)) {\n\t\t\treturn arrayToSort;\n\t\t}\n\t\tconst comparer = valueCasterComparator(options.comparer as IComparer);\n\t\tconst context  = Array.isArray(arrayToSort) && !options.inPlaceSorting ? arrayToSort.slice() : arrayToSort;\n\t\treturn context.sort(getSortComparator(sortObject, comparer));\n\t}\n}\n\nexport const sort = createSortInstance({comparer : defaultComparer, inPlaceSorting : false});\nexport const inPlaceSorting = createSortInstance({comparer : defaultComparer, inPlaceSorting : true});\n\n\n\n//createdTime","\nimport { IOrder } from \"./Sort\";\nimport { isNull } from \"./utils\";\n\nfunction __register(name: string, comparator: any) {\n\tSortRegistry.globalComparator[name] = comparator;\n}\nexport interface IComparatorFunc {\n\t(a: any, b: any, order: IOrder, nullRank: IOrder, undefinedRank: IOrder): number;\n}\ninterface IFilterComparator {\n\tname: string;\n\tcomparator: IComparatorFunc;\n}\n\nexport class SortRegistry {\n\tstatic globalComparator: { [key: string]: IComparatorFunc } = {};\n\n\tstatic register(sortComparator: IFilterComparator[] | IFilterComparator) {\n\t\tif (isNull(sortComparator)) {\n\t\t\treturn;\n\t\t}\n\t\tif (Array.isArray(sortComparator)) {\n\t\t\tsortComparator.forEach((mod) =>\n\t\t\t\t__register(mod.name, mod.comparator),\n\t\t\t);\n\t\t} else {\n\t\t\t__register(sortComparator.name, sortComparator.comparator);\n\t\t}\n\t}\n\n\tstatic isComparatorRegistered(name: string) {\n\t\treturn !!SortRegistry.globalComparator[name];\n\t}\n\n\tstatic getRegisteredModules() {\n\t\treturn SortRegistry.globalComparator;\n\t}\n\n\tstatic removeRegisteredComparators(name: string): void {\n\t\tdelete SortRegistry.globalComparator[name];\n\t}\n\n\tstatic getComparator(name: string): any {\n\t\tif (SortRegistry.isComparatorRegistered(name)) {\n\t\t\treturn SortRegistry.globalComparator[name];\n\t\t}\n\t\treturn null;\n\t}\n}\n\nSortRegistry.register([\n\t{\n\tname : 'number',\n\tcomparator : (a:any, b:any, order:IOrder) => {\n\t\treturn a === b ? 0 : a > b ? order : -order;\n\t}\n\t},\n\t{\n\t\tname: 'date',\n\t\tcomparator: (a, b, order) => {\n\t\t\tconst dateA= new Date(a);\n\t\t\tconst dateB= new Date(b);\n\t\t\tif (dateA.getTime() === dateB.getTime()) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn dateA > dateB ? order : -order;\n\t\t}\n\t}\n])\n","var characterMap : {[key : string] : string} = {\n\t\"À\": \"A\",\n\t\"Á\": \"A\",\n\t\"Â\": \"A\",\n\t\"Ã\": \"A\",\n\t\"Ä\": \"A\",\n\t\"Å\": \"A\",\n\t\"Ấ\": \"A\",\n\t\"Ắ\": \"A\",\n\t\"Ẳ\": \"A\",\n\t\"Ẵ\": \"A\",\n\t\"Ặ\": \"A\",\n\t\"Æ\": \"AE\",\n\t\"Ầ\": \"A\",\n\t\"Ằ\": \"A\",\n\t\"Ȃ\": \"A\",\n\t\"Ả\": \"A\",\n\t\"Ạ\": \"A\",\n\t\"Ẩ\": \"A\",\n\t\"Ẫ\": \"A\",\n\t\"Ậ\": \"A\",\n\t\"Ç\": \"C\",\n\t\"Ḉ\": \"C\",\n\t\"È\": \"E\",\n\t\"É\": \"E\",\n\t\"Ê\": \"E\",\n\t\"Ë\": \"E\",\n\t\"Ế\": \"E\",\n\t\"Ḗ\": \"E\",\n\t\"Ề\": \"E\",\n\t\"Ḕ\": \"E\",\n\t\"Ḝ\": \"E\",\n\t\"Ȇ\": \"E\",\n\t\"Ẻ\": \"E\",\n\t\"Ẽ\": \"E\",\n\t\"Ẹ\": \"E\",\n\t\"Ể\": \"E\",\n\t\"Ễ\": \"E\",\n\t\"Ệ\": \"E\",\n\t\"Ì\": \"I\",\n\t\"Í\": \"I\",\n\t\"Î\": \"I\",\n\t\"Ï\": \"I\",\n\t\"Ḯ\": \"I\",\n\t\"Ȋ\": \"I\",\n\t\"Ỉ\": \"I\",\n\t\"Ị\": \"I\",\n\t\"Ð\": \"D\",\n\t\"Ñ\": \"N\",\n\t\"Ò\": \"O\",\n\t\"Ó\": \"O\",\n\t\"Ô\": \"O\",\n\t\"Õ\": \"O\",\n\t\"Ö\": \"O\",\n\t\"Ø\": \"O\",\n\t\"Ố\": \"O\",\n\t\"Ṍ\": \"O\",\n\t\"Ṓ\": \"O\",\n\t\"Ȏ\": \"O\",\n\t\"Ỏ\": \"O\",\n\t\"Ọ\": \"O\",\n\t\"Ổ\": \"O\",\n\t\"Ỗ\": \"O\",\n\t\"Ộ\": \"O\",\n\t\"Ờ\": \"O\",\n\t\"Ở\": \"O\",\n\t\"Ỡ\": \"O\",\n\t\"Ớ\": \"O\",\n\t\"Ợ\": \"O\",\n\t\"Ù\": \"U\",\n\t\"Ú\": \"U\",\n\t\"Û\": \"U\",\n\t\"Ü\": \"U\",\n\t\"Ủ\": \"U\",\n\t\"Ụ\": \"U\",\n\t\"Ử\": \"U\",\n\t\"Ữ\": \"U\",\n\t\"Ự\": \"U\",\n\t\"Ý\": \"Y\",\n\t\"à\": \"a\",\n\t\"á\": \"a\",\n\t\"â\": \"a\",\n\t\"ã\": \"a\",\n\t\"ä\": \"a\",\n\t\"å\": \"a\",\n\t\"ấ\": \"a\",\n\t\"ắ\": \"a\",\n\t\"ẳ\": \"a\",\n\t\"ẵ\": \"a\",\n\t\"ặ\": \"a\",\n\t\"æ\": \"ae\",\n\t\"ầ\": \"a\",\n\t\"ằ\": \"a\",\n\t\"ȃ\": \"a\",\n\t\"ả\": \"a\",\n\t\"ạ\": \"a\",\n\t\"ẩ\": \"a\",\n\t\"ẫ\": \"a\",\n\t\"ậ\": \"a\",\n\t\"ç\": \"c\",\n\t\"ḉ\": \"c\",\n\t\"è\": \"e\",\n\t\"é\": \"e\",\n\t\"ê\": \"e\",\n\t\"ë\": \"e\",\n\t\"ế\": \"e\",\n\t\"ḗ\": \"e\",\n\t\"ề\": \"e\",\n\t\"ḕ\": \"e\",\n\t\"ḝ\": \"e\",\n\t\"ȇ\": \"e\",\n\t\"ẻ\": \"e\",\n\t\"ẽ\": \"e\",\n\t\"ẹ\": \"e\",\n\t\"ể\": \"e\",\n\t\"ễ\": \"e\",\n\t\"ệ\": \"e\",\n\t\"ì\": \"i\",\n\t\"í\": \"i\",\n\t\"î\": \"i\",\n\t\"ï\": \"i\",\n\t\"ḯ\": \"i\",\n\t\"ȋ\": \"i\",\n\t\"ỉ\": \"i\",\n\t\"ị\": \"i\",\n\t\"ð\": \"d\",\n\t\"ñ\": \"n\",\n\t\"ò\": \"o\",\n\t\"ó\": \"o\",\n\t\"ô\": \"o\",\n\t\"õ\": \"o\",\n\t\"ö\": \"o\",\n\t\"ø\": \"o\",\n\t\"ố\": \"o\",\n\t\"ṍ\": \"o\",\n\t\"ṓ\": \"o\",\n\t\"ȏ\": \"o\",\n\t\"ỏ\": \"o\",\n\t\"ọ\": \"o\",\n\t\"ổ\": \"o\",\n\t\"ỗ\": \"o\",\n\t\"ộ\": \"o\",\n\t\"ờ\": \"o\",\n\t\"ở\": \"o\",\n\t\"ỡ\": \"o\",\n\t\"ớ\": \"o\",\n\t\"ợ\": \"o\",\n\t\"ù\": \"u\",\n\t\"ú\": \"u\",\n\t\"û\": \"u\",\n\t\"ü\": \"u\",\n\t\"ủ\": \"u\",\n\t\"ụ\": \"u\",\n\t\"ử\": \"u\",\n\t\"ữ\": \"u\",\n\t\"ự\": \"u\",\n\t\"ý\": \"y\",\n\t\"ÿ\": \"y\",\n\t\"Ā\": \"A\",\n\t\"ā\": \"a\",\n\t\"Ă\": \"A\",\n\t\"ă\": \"a\",\n\t\"Ą\": \"A\",\n\t\"ą\": \"a\",\n\t\"Ć\": \"C\",\n\t\"ć\": \"c\",\n\t\"Ĉ\": \"C\",\n\t\"ĉ\": \"c\",\n\t\"Ċ\": \"C\",\n\t\"ċ\": \"c\",\n\t\"Č\": \"C\",\n\t\"č\": \"c\",\n\t\"C̆\": \"C\",\n\t\"c̆\": \"c\",\n\t\"Ď\": \"D\",\n\t\"ď\": \"d\",\n\t\"Đ\": \"D\",\n\t\"đ\": \"d\",\n\t\"Ē\": \"E\",\n\t\"ē\": \"e\",\n\t\"Ĕ\": \"E\",\n\t\"ĕ\": \"e\",\n\t\"Ė\": \"E\",\n\t\"ė\": \"e\",\n\t\"Ę\": \"E\",\n\t\"ę\": \"e\",\n\t\"Ě\": \"E\",\n\t\"ě\": \"e\",\n\t\"Ĝ\": \"G\",\n\t\"Ǵ\": \"G\",\n\t\"ĝ\": \"g\",\n\t\"ǵ\": \"g\",\n\t\"Ğ\": \"G\",\n\t\"ğ\": \"g\",\n\t\"Ġ\": \"G\",\n\t\"ġ\": \"g\",\n\t\"Ģ\": \"G\",\n\t\"ģ\": \"g\",\n\t\"Ĥ\": \"H\",\n\t\"ĥ\": \"h\",\n\t\"Ħ\": \"H\",\n\t\"ħ\": \"h\",\n\t\"Ḫ\": \"H\",\n\t\"ḫ\": \"h\",\n\t\"Ĩ\": \"I\",\n\t\"ĩ\": \"i\",\n\t\"Ī\": \"I\",\n\t\"ī\": \"i\",\n\t\"Ĭ\": \"I\",\n\t\"ĭ\": \"i\",\n\t\"Į\": \"I\",\n\t\"į\": \"i\",\n\t\"İ\": \"I\",\n\t\"ı\": \"i\",\n\t\"Ĳ\": \"IJ\",\n\t\"ĳ\": \"ij\",\n\t\"Ĵ\": \"J\",\n\t\"ĵ\": \"j\",\n\t\"Ķ\": \"K\",\n\t\"ķ\": \"k\",\n\t\"Ḱ\": \"K\",\n\t\"ḱ\": \"k\",\n\t\"K̆\": \"K\",\n\t\"k̆\": \"k\",\n\t\"Ĺ\": \"L\",\n\t\"ĺ\": \"l\",\n\t\"Ļ\": \"L\",\n\t\"ļ\": \"l\",\n\t\"Ľ\": \"L\",\n\t\"ľ\": \"l\",\n\t\"Ŀ\": \"L\",\n\t\"ŀ\": \"l\",\n\t\"Ł\": \"l\",\n\t\"ł\": \"l\",\n\t\"Ḿ\": \"M\",\n\t\"ḿ\": \"m\",\n\t\"M̆\": \"M\",\n\t\"m̆\": \"m\",\n\t\"Ń\": \"N\",\n\t\"ń\": \"n\",\n\t\"Ņ\": \"N\",\n\t\"ņ\": \"n\",\n\t\"Ň\": \"N\",\n\t\"ň\": \"n\",\n\t\"ŉ\": \"n\",\n\t\"N̆\": \"N\",\n\t\"n̆\": \"n\",\n\t\"Ō\": \"O\",\n\t\"ō\": \"o\",\n\t\"Ŏ\": \"O\",\n\t\"ŏ\": \"o\",\n\t\"Ő\": \"O\",\n\t\"ő\": \"o\",\n\t\"Œ\": \"OE\",\n\t\"œ\": \"oe\",\n\t\"P̆\": \"P\",\n\t\"p̆\": \"p\",\n\t\"Ŕ\": \"R\",\n\t\"ŕ\": \"r\",\n\t\"Ŗ\": \"R\",\n\t\"ŗ\": \"r\",\n\t\"Ř\": \"R\",\n\t\"ř\": \"r\",\n\t\"R̆\": \"R\",\n\t\"r̆\": \"r\",\n\t\"Ȓ\": \"R\",\n\t\"ȓ\": \"r\",\n\t\"Ś\": \"S\",\n\t\"ś\": \"s\",\n\t\"Ŝ\": \"S\",\n\t\"ŝ\": \"s\",\n\t\"Ş\": \"S\",\n\t\"Ș\": \"S\",\n\t\"ș\": \"s\",\n\t\"ş\": \"s\",\n\t\"Š\": \"S\",\n\t\"š\": \"s\",\n\t\"Ţ\": \"T\",\n\t\"ţ\": \"t\",\n\t\"ț\": \"t\",\n\t\"Ț\": \"T\",\n\t\"Ť\": \"T\",\n\t\"ť\": \"t\",\n\t\"Ŧ\": \"T\",\n\t\"ŧ\": \"t\",\n\t\"T̆\": \"T\",\n\t\"t̆\": \"t\",\n\t\"Ũ\": \"U\",\n\t\"ũ\": \"u\",\n\t\"Ū\": \"U\",\n\t\"ū\": \"u\",\n\t\"Ŭ\": \"U\",\n\t\"ŭ\": \"u\",\n\t\"Ů\": \"U\",\n\t\"ů\": \"u\",\n\t\"Ű\": \"U\",\n\t\"ű\": \"u\",\n\t\"Ų\": \"U\",\n\t\"ų\": \"u\",\n\t\"Ȗ\": \"U\",\n\t\"ȗ\": \"u\",\n\t\"V̆\": \"V\",\n\t\"v̆\": \"v\",\n\t\"Ŵ\": \"W\",\n\t\"ŵ\": \"w\",\n\t\"Ẃ\": \"W\",\n\t\"ẃ\": \"w\",\n\t\"X̆\": \"X\",\n\t\"x̆\": \"x\",\n\t\"Ŷ\": \"Y\",\n\t\"ŷ\": \"y\",\n\t\"Ÿ\": \"Y\",\n\t\"Y̆\": \"Y\",\n\t\"y̆\": \"y\",\n\t\"Ź\": \"Z\",\n\t\"ź\": \"z\",\n\t\"Ż\": \"Z\",\n\t\"ż\": \"z\",\n\t\"Ž\": \"Z\",\n\t\"ž\": \"z\",\n\t\"ſ\": \"s\",\n\t\"ƒ\": \"f\",\n\t\"Ơ\": \"O\",\n\t\"ơ\": \"o\",\n\t\"Ư\": \"U\",\n\t\"ư\": \"u\",\n\t\"Ǎ\": \"A\",\n\t\"ǎ\": \"a\",\n\t\"Ǐ\": \"I\",\n\t\"ǐ\": \"i\",\n\t\"Ǒ\": \"O\",\n\t\"ǒ\": \"o\",\n\t\"Ǔ\": \"U\",\n\t\"ǔ\": \"u\",\n\t\"Ǖ\": \"U\",\n\t\"ǖ\": \"u\",\n\t\"Ǘ\": \"U\",\n\t\"ǘ\": \"u\",\n\t\"Ǚ\": \"U\",\n\t\"ǚ\": \"u\",\n\t\"Ǜ\": \"U\",\n\t\"ǜ\": \"u\",\n\t\"Ứ\": \"U\",\n\t\"ứ\": \"u\",\n\t\"Ṹ\": \"U\",\n\t\"ṹ\": \"u\",\n\t\"Ǻ\": \"A\",\n\t\"ǻ\": \"a\",\n\t\"Ǽ\": \"AE\",\n\t\"ǽ\": \"ae\",\n\t\"Ǿ\": \"O\",\n\t\"ǿ\": \"o\",\n\t\"Þ\": \"TH\",\n\t\"þ\": \"th\",\n\t\"Ṕ\": \"P\",\n\t\"ṕ\": \"p\",\n\t\"Ṥ\": \"S\",\n\t\"ṥ\": \"s\",\n\t\"X́\": \"X\",\n\t\"x́\": \"x\",\n\t\"Ѓ\": \"Г\",\n\t\"ѓ\": \"г\",\n\t\"Ќ\": \"К\",\n\t\"ќ\": \"к\",\n\t\"A̋\": \"A\",\n\t\"a̋\": \"a\",\n\t\"E̋\": \"E\",\n\t\"e̋\": \"e\",\n\t\"I̋\": \"I\",\n\t\"i̋\": \"i\",\n\t\"Ǹ\": \"N\",\n\t\"ǹ\": \"n\",\n\t\"Ồ\": \"O\",\n\t\"ồ\": \"o\",\n\t\"Ṑ\": \"O\",\n\t\"ṑ\": \"o\",\n\t\"Ừ\": \"U\",\n\t\"ừ\": \"u\",\n\t\"Ẁ\": \"W\",\n\t\"ẁ\": \"w\",\n\t\"Ỳ\": \"Y\",\n\t\"ỳ\": \"y\",\n\t\"Ȁ\": \"A\",\n\t\"ȁ\": \"a\",\n\t\"Ȅ\": \"E\",\n\t\"ȅ\": \"e\",\n\t\"Ȉ\": \"I\",\n\t\"ȉ\": \"i\",\n\t\"Ȍ\": \"O\",\n\t\"ȍ\": \"o\",\n\t\"Ȑ\": \"R\",\n\t\"ȑ\": \"r\",\n\t\"Ȕ\": \"U\",\n\t\"ȕ\": \"u\",\n\t\"B̌\": \"B\",\n\t\"b̌\": \"b\",\n\t\"Č̣\": \"C\",\n\t\"č̣\": \"c\",\n\t\"Ê̌\": \"E\",\n\t\"ê̌\": \"e\",\n\t\"F̌\": \"F\",\n\t\"f̌\": \"f\",\n\t\"Ǧ\": \"G\",\n\t\"ǧ\": \"g\",\n\t\"Ȟ\": \"H\",\n\t\"ȟ\": \"h\",\n\t\"J̌\": \"J\",\n\t\"ǰ\": \"j\",\n\t\"Ǩ\": \"K\",\n\t\"ǩ\": \"k\",\n\t\"M̌\": \"M\",\n\t\"m̌\": \"m\",\n\t\"P̌\": \"P\",\n\t\"p̌\": \"p\",\n\t\"Q̌\": \"Q\",\n\t\"q̌\": \"q\",\n\t\"Ř̩\": \"R\",\n\t\"ř̩\": \"r\",\n\t\"Ṧ\": \"S\",\n\t\"ṧ\": \"s\",\n\t\"V̌\": \"V\",\n\t\"v̌\": \"v\",\n\t\"W̌\": \"W\",\n\t\"w̌\": \"w\",\n\t\"X̌\": \"X\",\n\t\"x̌\": \"x\",\n\t\"Y̌\": \"Y\",\n\t\"y̌\": \"y\",\n\t\"A̧\": \"A\",\n\t\"a̧\": \"a\",\n\t\"B̧\": \"B\",\n\t\"b̧\": \"b\",\n\t\"Ḑ\": \"D\",\n\t\"ḑ\": \"d\",\n\t\"Ȩ\": \"E\",\n\t\"ȩ\": \"e\",\n\t\"Ɛ̧\": \"E\",\n\t\"ɛ̧\": \"e\",\n\t\"Ḩ\": \"H\",\n\t\"ḩ\": \"h\",\n\t\"I̧\": \"I\",\n\t\"i̧\": \"i\",\n\t\"Ɨ̧\": \"I\",\n\t\"ɨ̧\": \"i\",\n\t\"M̧\": \"M\",\n\t\"m̧\": \"m\",\n\t\"O̧\": \"O\",\n\t\"o̧\": \"o\",\n\t\"Q̧\": \"Q\",\n\t\"q̧\": \"q\",\n\t\"U̧\": \"U\",\n\t\"u̧\": \"u\",\n\t\"X̧\": \"X\",\n\t\"x̧\": \"x\",\n\t\"Z̧\": \"Z\",\n\t\"z̧\": \"z\",\n\t\"й\":\"и\",\n\t\"Й\":\"И\",\n\t\"ё\":\"е\",\n\t\"Ё\":\"Е\",\n};\n\nconst chars       = Object.keys(characterMap).join('|');\nconst allAccents  = new RegExp(chars, 'g');\nconst firstAccent = new RegExp(chars, '');\n\nfunction matcher(match : string) {\n\treturn characterMap[match];\n}\n\nexport function removeAccents(string : string) {\n\treturn string.replace(allAccents, matcher);\n};\n\nexport function hasAccents(string : string) {\n\treturn !!string.match(firstAccent);\n};\n","import { removeAccents } from \"./removeAccents\";\n\nexport function getObjectValue(data: Record<any, any>, key: string) {\n\tconst fieldNames = key.split('.');\n\tlet value = data;\n\n\tfor (const field of fieldNames) {\n\t\tif (value && value.hasOwnProperty(field)) {\n\t\t\tvalue = value[field];\n\t\t} else {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\treturn value;\n}\n\nexport function timeDifference(value : Date, targetValue : Date) {\n\treturn value.getTime() - new Date(targetValue.toString()).getTime();\n}\n\nexport function ignoreAccents(value : string) {\n    return removeAccents(value);\n}\n\nexport function isNull(input: any) {\n\treturn input === null;\n}\n\nexport function isUndefined(input: any) {\n\treturn !isDefined(input);\n}\n\nexport function isDefined(input: any) {\n\treturn typeof input !== 'undefined';\n}\n\nexport function convertToString(value : any) : string {\n    return value ? typeof value !== 'string' ? value.toString() : value : ((value as any) === 0 || (value as any) === false) ? value.toString() : ''\n}","export const KeyCodes = {\n    Any             : \"any\",\n    KeyA            : \"a\",\n    KeyS            : \"s\",\n    KeyD            : \"d\",\n    KeyF            : \"f\",\n    KeyH            : \"h\",\n    KeyG            : \"g\",\n    KeyZ            : \"z\",\n    KeyX            : \"x\",\n    KeyC            : \"c\",\n    KeyV            : \"v\",\n    IntlBackslash   : \"\\\\\",\n    KeyB            : \"b\",\n    KeyQ            : \"q\",\n    KeyW            : \"w\",\n    KeyE            : \"e\",\n    KeyR            : \"r\",\n    KeyY            : \"y\",\n    KeyT            : \"t\",\n    Digit1          : \"1\",\n    Digit2          : \"2\",\n    Digit3          : \"3\",\n    Digit4          : \"4\",\n    Digit6          : \"6\",\n    Digit5          : \"5\",\n    Equal           : \"=\",\n    Digit9          : \"9\",\n    Digit7          : \"7\",\n    Minus           : \"-\",\n    Digit8          : \"8\",\n    Digit0          : \"0\",\n    BracketRight    : \"]\",\n    KeyO            : \"o\",\n    KeyU            : \"u\",\n    BracketLeft     : \"[\",\n    KeyI            : \"i\",\n    KeyP            : \"p\",\n    Enter           : \"enter\",\n    KeyL            : \"l\",\n    KeyJ            : \"j\",\n    Quote           : \"'\",\n    KeyK            : \"k\",\n    Semicolon       : \";\",\n    Backslash       : \"\\\\\",\n    Comma           : \",\",\n    Slash           : \"/\",\n    KeyN            : \"n\",\n    KeyM            : \"m\",\n    Period          : \".\",\n\n    Tab             : \"tab\",\n    Space           : \"space\",\n    Backquote       : \"`\",\n    Backspace       : \"backspace\",\n    Escape          : \"escape\",\n    ShiftLeft       : \"shift\",\n    CapsLock        : \"capslock\",\n    AltLeft         : \"alt\",\n    ControlLeft     : \"ctrl\",\n    ShiftRight      : \"shift\",\n    AltRight        : \"alt\",\n    ControlRight    : \"ctrl\",\n    F17             : \"f17\",\n    NumpadDecimal   : \".\",\n    NumpadMultiply  : \"*\",\n    NumpadAdd       : \"+\",\n    NumLock         : \"numlock\",\n    NumpadDivide    : \"/\",\n    NumpadEnter     : \"enter\",\n    NumpadSubtract  : \"-\",\n    F18             : \"f18\",\n    F19             : \"f19\",\n    NumpadEqual     : \"=\",\n    Numpad0         : \"0\",\n    Numpad1         : \"1\",\n    Numpad2         : \"2\",\n    Numpad3         : \"3\",\n    Numpad4         : \"4\",\n    Numpad5         : \"5\",\n    Numpad6         : \"6\",\n    Numpad7         : \"7\",\n    F20             : \"f20\",\n    Numpad8         : \"8\",\n    Numpad9         : \"9\",\n    IntlYen         : \"¥\",\n    IntlRo          : \"ろ\",\n    NumpadComma     : \",\",\n    F5              : \"f5\",\n    F6              : \"f6\",\n    F7              : \"f7\",\n    F3              : \"f3\",\n    F8              : \"f8\",\n    F9              : \"f9\",\n    F11             : \"f11\",\n    F13             : \"f13\",\n    F16             : \"f16\",\n    F14             : \"f14\",\n    F10             : \"f10\",\n    ContextMenu     : \"contextmenu\",\n    F12             : \"f12\",\n    F15             : \"f15\",\n    Home            : \"home\",\n    PageUp          : \"pageup\",\n    Delete          : \"delete\",\n    F4              : \"f4\",\n    End             : \"end\",\n    F2              : \"f2\",\n    PageDown        : \"pagedown\",\n    F1              : \"f1\",\n    ArrowLeft       : \"arrowleft\",\n    ArrowRight      : \"arrowright\",\n    ArrowDown       : \"arrowdown\",\n    ArrowUp         : \"arrowup\",\n    MetaLeft        : \"ctrl\",\n    MetaRight       : \"ctrl\",\n}\n\nexport const eventKeys = {\n    ctrl     : 'ctrl',\n    any      : 'all',\n    hyper    : 'hyper',\n    super    : 'super',\n    meta     : 'meta',\n    control  : 'control',\n    shift    : 'shift',\n    alt      : 'alt',\n    altGraph : 'altgraph',\n    fn       : 'fn'\n}\nexport const isMacOS = navigator.platform === 'MacIntel';\n\nexport function isMetaKey(event : KeyboardEvent): boolean {\n    return isMacOS && event.key === 'Meta';\n}\n\nexport const ModifierKeys = [ eventKeys.hyper, eventKeys.super, eventKeys.ctrl, eventKeys.meta, eventKeys.control, eventKeys.shift, eventKeys.alt, eventKeys.altGraph, eventKeys.fn];","import { deBounce } from \"../Utilities/Utility\";\nimport { ModifierKeys, KeyCodes, isMacOS, isMetaKey } from \"./Constants/KeyEventConstants\";\nimport { IEventtype, IExecutionParam, IEventPhaseMapping, IKeyEventHandler, IKeyEventConfiguration, IDefaultKeyEventConfiguration, IKeyEventMeta, IInitialConfig } from \"./Interface/IKeyEventManager\";\n\n\nconst capturingPhase    = Event[\"CAPTURING_PHASE\"];\nconst bubblePhase       = Event[\"BUBBLING_PHASE\"];\n\nfunction sortKeyCombo(keyCombo : string[]) : string[] {\n    return keyCombo.sort((a : any, b : any) => {\n        return ModifierKeys.indexOf(a) - ModifierKeys.indexOf(b)\n    });\n}\n\nfunction getCaptureKey(isCapture : boolean) : 'capture' | 'bubble' {\n    return isCapture ? 'capture' : 'bubble';\n}\n\nfunction sanitizeKeyCombo(keyCombo : string) : string {\n    const keyComboArr = keyCombo.split('+');\n    keyComboArr.forEach((val, index) => {\n        keyComboArr[index] = val.trim();\n    });\n    keyCombo = keyComboArr.join('+');\n    return keyCombo.toLowerCase();\n}\n\nclass KeyEventHandler implements IKeyEventHandler {\n    static DefaultConfiguration : IDefaultKeyEventConfiguration = {\n        description   : '',\n        capture       : false,\n        isKonami      : false,\n        eventType     : 'keydown',\n        repeat        : true\n    }\n\n    static KeyComboStackSize = 1000;\n    static KonamiStackSize   = 1000;\n\n    static konamiDelay = 500;\n\n    private listenerMapping     !: Record<IEventtype, IEventPhaseMapping>;\n    private defaultConfig       : IDefaultKeyEventConfiguration;\n    public  destroy             : () => void;\n    private isPaused            : boolean;\n    private activeKeys          : string[];\n    private konamiSequence      : string[];\n    private clearKonamiSequence : () => void;\n    private container           : HTMLElement;\n    private keyComboStackSize   : number;\n    private konamiStackSize    : number;\n\n    constructor(initialConfig : IInitialConfig, defaultConfig : IDefaultKeyEventConfiguration = {}) {\n        this.container           = initialConfig.container ?? document.body;\n        this.keyComboStackSize   = initialConfig.keyComboStackSize ?? KeyEventHandler.KeyComboStackSize;\n        this.konamiStackSize     = initialConfig.konamiStackSize ?? KeyEventHandler.KonamiStackSize;\n        this.defaultConfig       = { ...{}, ...KeyEventHandler.DefaultConfiguration, ...defaultConfig };\n        this.activeKeys          = [];\n        this.konamiSequence      = [];\n        this.isPaused            = false;\n        this.destroy             = () => {};\n        this.clearKonamiSequence = () => {};\n        this.init();\n    }\n\n    resetListenerMapping() {\n        this.listenerMapping = { keydown: { capture: {}, bubble: {} }, keyup: { capture: {}, bubble: {} } };\n    }\n\n    private init() {\n        const triggerBubblingCallback  = (ev : KeyboardEvent)=>{\n            (ev.eventPhase != capturingPhase) && this.executeKeyCombo(ev, bubblePhase);\n        }\n        const triggerCapturingCallback = (ev : KeyboardEvent)=>{\n            (ev.eventPhase == capturingPhase) && this.executeKeyCombo(ev, capturingPhase)\n        };\n\n        //konami sequence\n        const addKonamiSequence = (ev : KeyboardEvent) => {\n            const keyCode = ev.code as (keyof typeof KeyCodes);\n            const key = KeyCodes[keyCode];\n            this.konamiSequence.push(key);\n            if(this.konamiSequence.length > this.konamiStackSize) {     //to maintain stack size\n                this.konamiSequence.shift();\n            }\n            this.clearKonamiSequence();\n        };\n\n        this.clearKonamiSequence   = deBounce(() => this.konamiSequence = [], KeyEventHandler.konamiDelay);\n\n        //activeKeys maintaining\n        const addActiveKeys = (ev  : KeyboardEvent) => {\n            const code = ev.code as (keyof typeof KeyCodes);\n            const key = KeyCodes[code];\n            const isMetaHeld = ev.metaKey;\n            if(isMetaHeld && isMacOS){\n                this.activeKeys = [];\n            }\n            const isModifierKey = ModifierKeys.includes(key.toLowerCase());\n            !isModifierKey && !this.activeKeys.includes(key) && this.activeKeys.push(key);\n            if(this.activeKeys.length > this.keyComboStackSize) {     //to maintain stack size\n                this.activeKeys.shift();\n            }\n        };\n\n        const clearActiveKeys   = (ev : KeyboardEvent) =>{\n            const code = ev.code as keyof typeof KeyCodes;\n            if(isMetaKey(ev)){\n                this.activeKeys = [];\n            }\n            else if(code){\n                const key = KeyCodes[code];\n                const index = this.activeKeys.indexOf(key);\n                index != -1 && this.activeKeys.splice(index, 1);\n            } \n            else{\n                this.activeKeys = []\n            }\n        }; \n\n        const keydown = { capture : {}, bubble  : {} };\n        const keyup   = { capture : {}, bubble  : {} };\n\n        this.listenerMapping = { keydown, keyup };\n\n        const handleFocusChange = (ev: FocusEvent) => {\n            if (!this.container.contains(ev.target as Node)) {\n                this.activeKeys     = [];\n                this.konamiSequence = [];\n            }\n        };\n\n\n        const keyDownCapturingCallback = (ev : KeyboardEvent) => {\n            addActiveKeys(ev);\n            addKonamiSequence(ev);\n            triggerCapturingCallback(ev);\n        }\n\n        // const keyDownBubblingCallback = (ev : KeyboardEvent) => {\n        //     triggerBubblingCallback(ev);\n        // }\n\n        // const keyUpCapturingCallback = (ev : KeyboardEvent) => {\n        //     triggerCapturingCallback(ev);\n        // }\n\n \n\n        \n        this.destroy = () => {\n            this.resetListenerMapping();\n            // this.container.removeEventListener('keydown', addActiveKeys, true);\n            // this.container.removeEventListener('keydown', triggerBubblingCallback);\n            // this.container.removeEventListener('keydown', triggerCapturingCallback, true);\n            // this.container.removeEventListener('keyup', triggerBubblingCallback);\n            // this.container.removeEventListener('keyup', triggerCapturingCallback, true);\n            // this.container.removeEventListener('keydown', addKonamiSequence, true);\n            // window.removeEventListener('keyup', clearActiveKeys);\n            this.container.removeEventListener('keydown', keyDownCapturingCallback, true);\n            this.container.removeEventListener('keydown', triggerBubblingCallback);\n            this.container.removeEventListener('keyup', triggerBubblingCallback);\n            this.container.removeEventListener('keyup', triggerCapturingCallback, true);\n            window.removeEventListener('keyup', clearActiveKeys);\n\n            window.removeEventListener('focusin', handleFocusChange);\n            window.removeEventListener('focusout', handleFocusChange);\n\n        }\n\n        // this.container.addEventListener('keydown', addActiveKeys, true);\n        // this.container.addEventListener('keydown', triggerBubblingCallback);\n        // this.container.addEventListener('keydown', triggerCapturingCallback, true);\n        // this.container.addEventListener('keyup', triggerBubblingCallback);\n        // this.container.addEventListener('keyup', triggerCapturingCallback, true);\n        // this.container.addEventListener('keydown', addKonamiSequence, true);\n        // window.addEventListener('keyup', clearActiveKeys);\n\n        this.container.addEventListener('keydown', keyDownCapturingCallback, true);\n        this.container.addEventListener('keydown', triggerBubblingCallback);\n        this.container.addEventListener('keyup', triggerBubblingCallback);\n        this.container.addEventListener('keyup', triggerCapturingCallback, true);\n        window.addEventListener('keyup', clearActiveKeys);\n        \n        this.container.addEventListener('focusin', handleFocusChange);\n        this.container.addEventListener('focusout', handleFocusChange);\n\n        this.resetListenerMapping();\n    }\n\n    private getListenerMeta(eventConfiguration : IKeyEventConfiguration) : IKeyEventMeta {\n        const { keyCombo, priority }  = eventConfiguration;\n        const listenerConfig          = {...{}, ...this.defaultConfig, ...eventConfiguration} as IKeyEventMeta;\n        const comboListenerArr        = this.getListeners(listenerConfig.eventType, listenerConfig.capture, keyCombo);\n\n        listenerConfig.priority       = priority ?? comboListenerArr.length;\n\n        return listenerConfig;\n    }\n\n    private parseActiveKeys(ev : KeyboardEvent) : string[] {\n        const controlKey  = ev.ctrlKey ?( isMacOS ? KeyCodes.ControlLeft : KeyCodes.ControlLeft) : '';\n        const metaKey     = ev.metaKey ? KeyCodes.MetaLeft : '';\n        const shiftKey    = ev.shiftKey ? KeyCodes.ShiftLeft : '';\n        const altKey      = ev.altKey ? KeyCodes.AltLeft : '';\n        const keyComboArr = [metaKey, controlKey, shiftKey, altKey].filter((val)=>(val!==''));\n        sortKeyCombo(keyComboArr);\n        keyComboArr.push(...this.activeKeys);\n        return keyComboArr;\n    }\n\n    //constructing keyCombo from keyBoardEvent\n    private extractExecutionMeta(ev : KeyboardEvent, eventPhase : KeyboardEvent['eventPhase']) : Required<IExecutionParam> {\n        const eventType   = ev.type as IEventtype;\n        const capture     = eventPhase === ev.CAPTURING_PHASE;\n        const keyComboArr = this.parseActiveKeys(ev);\n        return {\n            keyCombo  : keyComboArr.join('+'),\n            capture   : capture,\n            eventType : eventType\n        };\n    }\n\n    private executeListenerArr(listeners : IKeyEventMeta[], ev : KeyboardEvent | null = null, activeKeys : string[]) : void{\n        for(let index = 0; index < listeners.length; index++) {\n            const listenerMeta = {...listeners[index], event : ev, activeKeys};\n            let repeatingCheck = true;\n            if(ev) {\n                repeatingCheck = (listenerMeta.repeat == false) ? (ev.repeat == false) : true;\n            }\n            if(!listenerMeta.isKonami && repeatingCheck) {\n                const continueLoop = listenerMeta.callback(listenerMeta);\n                if(continueLoop === false) {\n                    break;\n                }\n            }\n        }\n    }\n\n    private executeKonamiSequence(listeners : IKeyEventMeta[], ev : KeyboardEvent | null = null) : void {\n        for(let index = 0; index < listeners.length; index++) {\n            const listenerMeta = {...listeners[index], event : ev, activeKeys : this.activeKeys}\n            let repeatingCheck = true;\n            if(ev) {\n                repeatingCheck = (listenerMeta.repeat == false) ? (ev.repeat == false) : true;\n            }\n            if(listenerMeta.isKonami && repeatingCheck) {\n                const continueLoop = listenerMeta.callback(ev, listenerMeta);\n                if(continueLoop === false) {\n                    break;\n                }\n            }\n        }\n    }\n\n    getListeners(eventType : IEventtype, isCapture : boolean, keyCombo : string ) : IKeyEventMeta[] {\n        const capture = getCaptureKey(isCapture);\n        return this.listenerMapping?.[eventType][capture]?.[keyCombo.toLowerCase()] || [];\n    }\n\n    addListener(eventConfiguration : IKeyEventConfiguration) : void {\n        const keyCombo                                   = sanitizeKeyCombo(eventConfiguration.keyCombo);\n        const listenerMeta                               = this.getListenerMeta(eventConfiguration);\n        const {eventType, capture : isCapture, priority} = listenerMeta;\n        const capture                                    = getCaptureKey(isCapture);\n\n        if(!this.listenerMapping[eventType][capture][keyCombo]) { \n            this.listenerMapping[eventType][capture][keyCombo] = [];\n        }\n        this.listenerMapping[eventType][capture][keyCombo].splice(priority, 0, listenerMeta);\n    }\n\n    executeKeyCombo(executionParam : KeyboardEvent | IExecutionParam, eventPhase ?:  KeyboardEvent['eventPhase']) {\n        if(!this.isPaused) {\n            let {keyCombo, capture, eventType} = (executionParam ?? {}) as IExecutionParam;\n            let event;\n            let activeKeys = this.activeKeys;\n            if(executionParam instanceof KeyboardEvent) {\n                event      = executionParam as KeyboardEvent;\n                eventPhase = event.eventPhase;\n                ({keyCombo, capture, eventType} = this.extractExecutionMeta(executionParam, eventPhase));\n                activeKeys = this.parseActiveKeys(event);\n            } \n            \n            const anyKeyCode     = KeyCodes.Any;\n            const konamiKeyCombo = this.konamiSequence.join('+');\n\n            const listeners       = this.getListeners(eventType, capture, keyCombo);\n            const keyDownListener = this.getListeners(eventType, capture, anyKeyCode);\n            const konamiListeners = this.getListeners(eventType, capture, konamiKeyCombo);\n\n            this.executeListenerArr(listeners, event, activeKeys);\n            this.executeListenerArr(keyDownListener, event, activeKeys);\n            this.executeKonamiSequence(konamiListeners, event);\n        }\n    }\n    \n    removeListener(executionParam : IExecutionParam, searchCallback : CallableFunction) {\n        const {keyCombo, capture, eventType} = executionParam;\n        const listeners = this.getListeners(eventType, capture, keyCombo);\n        let searchIndex = -1;\n        listeners.find(({callback}, index)=>{\n            if(callback === searchCallback){\n                searchIndex = index;\n                return;\n            }\n        });\n        (searchIndex !== -1) && listeners.splice(searchIndex, 1);\n    }\n\n    removeKeyCombo(executionParam : IExecutionParam) {\n        const {keyCombo, capture, eventType} = executionParam;\n        const captureKey                     = getCaptureKey(capture);\n\n        delete this.listenerMapping?.[eventType][captureKey][keyCombo];\n    }\n\n    importEvents(eventConfigs : IKeyEventConfiguration[]) {\n        eventConfigs.forEach((eventConfig) => {\n            this.addListener(eventConfig);\n        })\n    }\n\n    pauseExecution() {\n        this.isPaused = true;\n    }\n\n    unpauseExecution() {\n        this.isPaused = false;\n    }   \n}\n\nexport{\n    KeyEventHandler,\n    KeyCodes\n}","import { IEscapeHandler } from \"./EscapeHandler.types\";\nimport { StackDS } from \"./Stack/StackDS\";\n\nexport class EscapeHandler implements IEscapeHandler {\n    private callbackStack: StackDS<CallableFunction>;\n\n    constructor() {\n        this.callbackStack = new StackDS();\n    }\n\n    addAction(callback: CallableFunction, id ?: string ): string | null {\n        return this.callbackStack.push(callback, id);\n    }\n\n    executeAction() : void {\n        const callback = this.callbackStack.pop();\n        callback?.();\n    }\n\n    removeAction(id : string) :void {\n        this.callbackStack.removeById(id);\n    }\n}","import { v1 as uuid} from \"uuid\";\nimport { IStackDS } from \"./IStackDS.types\";\n\ninterface StackConfig {\n    maxSize?: number;\n    allowDuplicates?: boolean;\n}\n\ninterface StackItem<T> {\n    id: string;\n    value: T;\n}\n\nexport class StackDS<T> implements IStackDS<T> {\n    private items: StackItem<T>[];\n    private config: StackConfig;\n\n    constructor(config: StackConfig = {}) {\n        this.items = [];\n        this.config = config;\n    }\n\n    // Generate unique ID\n    private generateId(): string {\n        return uuid();\n    }\n\n    // Add item to stack\n    push(item: T, id?: string): string | null {\n        if (this.config.maxSize && this.items.length >= this.config.maxSize) {\n            return null; // Stack overflow\n        }\n        if (!this.config.allowDuplicates && this.items.some(stackItem => stackItem.value === item)) {\n            return null; // Duplicate item\n        }\n        const itemId = id || this.generateId();\n        this.items.push({ id: itemId, value: item });\n        return itemId;\n    }\n\n    // Remove item from stack by ID\n    removeById(id: string): boolean {\n        const index = this.items.findIndex(item => item.id === id);\n        if (index !== -1) {\n            this.items.splice(index, 1);\n            return true;\n        }\n        return false;\n    }\n\n    // Remove item from stack\n    pop(): T | undefined {\n        const item = this.items.pop();\n        return item ? item.value : undefined;\n    }\n\n    // Get top item without removing it\n    peek(): T | undefined {\n        return this.items.length ? this.items[this.items.length - 1].value : undefined;\n    }\n\n    // Check if stack is empty\n    isEmpty(): boolean {\n        return this.items.length === 0;\n    }\n\n    // Get stack size\n    size(): number {\n        return this.items.length;\n    }\n\n    // Clear stack\n    clear(): void {\n        this.items = [];\n    }\n\n    // Check if item exists\n    contains(id: string): boolean {\n        return this.items.some(stackItem => stackItem.id === id);\n    }\n\n    // Iterate over items\n    forEach(callback: (item: T, index: number) => void): void {\n        this.items.forEach((stackItem, index) => callback(stackItem.value, index));\n    }\n\n    // Convert to array\n    toArray(): T[] {\n        return this.items.map(stackItem => stackItem.value);\n    }\n\n    // Find item by predicate\n    find(predicate: (item: T, index: number) => boolean): T | undefined {\n        const foundItem = this.items.find((stackItem, index) => predicate(stackItem.value, index));\n        return foundItem ? foundItem.value : undefined;\n    }\n\n    // Get index of item\n    indexOf(id: T): number {\n        return this.items.findIndex(stackItem => stackItem.value === id);\n    }\n\n    // Reverse stack\n    reverse(): void {\n        this.items.reverse();\n    }\n\n    // Sort stack\n    sort(compareFn?: (a: T, b: T) => number): void {\n        this.items.sort((a, b) => compareFn ? compareFn(a.value, b.value) : 0);\n    }\n}\n","function deBounce<T extends (...args: any[]) => any>(fun: T, delay: number): (...args: Parameters<T>) => void {\n\tlet indeBounce: NodeJS.Timeout;\n\treturn function(this: any, ...args: Parameters<T>) {\n\t\tconst context = this;\n\t\tclearTimeout(indeBounce);\n\t\tindeBounce = setTimeout(() => {\n\t\t\tfun.apply(context, args);\n\t\t}, delay);\n\t};\n}\n\n\nfunction findInsertIndex(array: number[], key: number): number {\n\tlet left = 0;\n\tlet right = array.length - 1;\n\n\twhile (left <= right) {\n\t\tlet mid = Math.floor((left + right) / 2);\n\n\t\tif (array[mid] === key) {\n\t\t\treturn mid;\n\t\t} else if (array[mid] < key) {\n\t\t\tleft = mid + 1;\n\t\t} else {\n\t\t\tright = mid - 1;\n\t\t}\n\t}\n\n\treturn left;\n}\n\nexport{\n    deBounce,\n\tfindInsertIndex\n}","import { IAutoScrollHandler, IAutoScrollOptions } from \"./auto-scroll-handler.types\";\n\nexport class AutoScrollHandler implements IAutoScrollHandler {\n    private rafId: number | null = null;\n    private lastFrameTime: number = 0;\n\n    private scrollHorizontally: boolean;\n    private scrollVertically: boolean;\n\n    private tickLeft: boolean  = false;\n    private tickRight: boolean = false;\n    private tickUp: boolean    = false;\n    private tickDown: boolean  = false;\n\n    private scrollContainer: HTMLElement;\n    private horizontalScrollContainer: HTMLElement;\n\n    private scrollConfig: { percent: number; speed: number }[];\n\n    private getVerticalPosition: () => number;\n    private setVerticalPosition: (position: number) => void;\n    private getHorizontalPosition: () => number;\n    private setHorizontalPosition: (position: number) => void;\n    private shouldSkipVerticalScroll: () => boolean;\n    private shouldSkipHorizontalScroll: () => boolean;\n    private shouldPauseScrolling: () => boolean;\n\n    private onScrollCallback: (() => void) | null = null;\n\n    private isRTL: () => boolean = () => false;\n\n    private lastMouseEvent : MouseEvent | null = null;\n\n    private lastForceSkipVertical: boolean = false;\n    private lastForceSkipHorizontal: boolean = false;\n    private bodyScrollActive: boolean = false;\n\n\n    constructor(params: IAutoScrollOptions) {\n        this.scrollContainer           = params.scrollContainer;\n        this.horizontalScrollContainer = params.horizontalScrollContainer;\n        this.scrollHorizontally        = params.scrollAxis.includes('x');\n        this.scrollVertically          = params.scrollAxis.includes('y');\n\n        this.scrollConfig = params.scrollConfig ?? [\n            { percent: 5, speed: 40 },\n            { percent: 7, speed: 20 },\n            { percent: 10, speed: 10 },\n        ];\n\n        this.onScrollCallback = params.onScrollCallback ?? null;\n\n        this.getVerticalPosition = params.getVerticalPosition!;\n        this.setVerticalPosition = params.setVerticalPosition!;\n        this.getHorizontalPosition = params.getHorizontalPosition!;\n        this.setHorizontalPosition = params.setHorizontalPosition!;\n\n        this.shouldSkipVerticalScroll = params.shouldSkipVerticalScroll ?? (() => false);\n        this.shouldSkipHorizontalScroll = params.shouldSkipHorizontalScroll ?? (() => false);\n        this.shouldPauseScrolling = params.shouldPauseScrolling ?? (() => false);\n        this.isRTL = params.isRTL ?? (() => false);\n    }\n\n    public update(mouseEvent: MouseEvent, forceSkipVerticalScroll = false, forceSkipHorizontalScroll = false, body : boolean = false): void {\n        this.lastMouseEvent = mouseEvent;\n        this.lastForceSkipVertical = forceSkipVerticalScroll;\n        this.lastForceSkipHorizontal = forceSkipHorizontalScroll;\n        this.bodyScrollActive = body;\n\n        const skipVerticalScroll = forceSkipVerticalScroll || this.shouldSkipVerticalScroll();\n        const skipHorizontalScroll = forceSkipHorizontalScroll || this.shouldSkipHorizontalScroll();\n\n        if (skipVerticalScroll && skipHorizontalScroll) {\n            this.clear();\n            return;\n        }\n\n        this.calculateTicks(mouseEvent, skipVerticalScroll, skipHorizontalScroll);\n        this.manageScrolling(body);\n    }\n\n    private calculateTicks(mouseEvent: MouseEvent, skipVerticalScroll: boolean, skipHorizontalScroll: boolean): void {\n        const rect = this.scrollContainer.getBoundingClientRect();\n        const horizontalRect = this.horizontalScrollContainer.getBoundingClientRect();\n    \n        const verticalEdgeThreshold = this.getEdgeThreshold(rect.height);\n        const horizontalEdgeThreshold = this.getEdgeThreshold(horizontalRect.width);\n    \n        this.tickLeft  = mouseEvent.clientX < horizontalRect.left + horizontalEdgeThreshold && !skipHorizontalScroll;\n        this.tickRight = mouseEvent.clientX > horizontalRect.right - horizontalEdgeThreshold && !skipHorizontalScroll;\n        this.tickUp    = mouseEvent.clientY < rect.top + verticalEdgeThreshold && !skipVerticalScroll;\n        this.tickDown  = mouseEvent.clientY > rect.bottom - verticalEdgeThreshold && !skipVerticalScroll;\n    }\n    \n    private getEdgeThreshold(size: number): number {\n        const maxPercent = Math.max(...this.scrollConfig.map((config) => config.percent));\n        return (size * maxPercent) / 100;\n    }\n\n    private manageScrolling(body: boolean): void {\n        if (body || this.tickLeft || this.tickRight || this.tickUp || this.tickDown) {\n            this.ensureTickingStarted();\n        } else {\n            this.clear();\n        }\n    }\n\n    private ensureTickingStarted(): void {\n        if (this.rafId === null) {\n            this.lastFrameTime = performance.now();\n            this.rafId = requestAnimationFrame((time) => this.animationLoop(time));\n        }\n    }\n\n    private animationLoop(currentTime: number): void {\n        if (!this.lastMouseEvent) {\n            this.clear();\n            return;\n        }\n\n        const deltaMs = Math.min(currentTime - this.lastFrameTime, 200);\n        this.lastFrameTime = currentTime;\n\n        const skipVertical = this.lastForceSkipVertical || this.shouldSkipVerticalScroll();\n        const skipHorizontal = this.lastForceSkipHorizontal || this.shouldSkipHorizontalScroll();\n        this.calculateTicks(this.lastMouseEvent, skipVertical, skipHorizontal);\n\n        const hasTick = this.tickLeft || this.tickRight || this.tickUp || this.tickDown;\n        if (!this.bodyScrollActive && !hasTick) {\n            this.clear();\n            return;\n        }\n\n        this.doTick(deltaMs);\n\n        this.rafId = requestAnimationFrame((time) => this.animationLoop(time));\n    }\n\n    /**\n     * scrollConfig speeds are calibrated for 100 ms intervals.\n     * timeFactor normalises to the actual frame delta so the\n     * perceived scroll rate stays constant regardless of fps.\n     */\n    private doTick(deltaMs: number): void {\n        if (!this.lastMouseEvent) {\n            return;\n        }\n\n        if (this.shouldPauseScrolling()) {\n            return;\n        }\n\n        const timeFactor = deltaMs / 100;\n\n        if (this.scrollVertically) {\n            this.handleVerticalScroll(this.lastMouseEvent, timeFactor);\n        }\n\n        if (this.scrollHorizontally) {\n            this.handleHorizontalScroll(this.lastMouseEvent, timeFactor);\n        }\n\n        this.onScrollCallback?.();\n    }\n\n    private calculateTickAmount(mouseEvent : MouseEvent, rect : DOMRect, isVertical : boolean): number {\n        const distanceFromEdge = isVertical ? Math.min(mouseEvent.clientY - rect.top, rect.bottom - mouseEvent.clientY) : Math.min(mouseEvent.clientX - rect.left, rect.right - mouseEvent.clientX);\n\n        const elementSize = isVertical ? rect.height : rect.width;\n        const percentageFromEdge = (distanceFromEdge / elementSize) * 100;\n\n        for (const config of this.scrollConfig) {\n            if (percentageFromEdge <= config.percent) {\n                return config.speed;\n            }\n        }\n\n        return 0;\n    }\n\n    private handleVerticalScroll(mouseEvent: MouseEvent, timeFactor: number): void {\n        const rect            = this.scrollContainer.getBoundingClientRect();\n        const tickAmount      = this.calculateTickAmount(mouseEvent, rect, true) * timeFactor;\n        const vScrollPosition = this.getVerticalPosition();\n\n        if (this.tickUp) {\n            this.setVerticalPosition(vScrollPosition - tickAmount);\n        } else if (this.tickDown) {\n            this.setVerticalPosition(vScrollPosition + tickAmount);\n        }\n    }\n\n    private handleHorizontalScroll(mouseEvent: MouseEvent, timeFactor: number): void {\n        const rect            = this.horizontalScrollContainer.getBoundingClientRect();\n        const tickAmount      = this.calculateTickAmount(mouseEvent, rect, false) * timeFactor;\n        const hScrollPosition = this.getHorizontalPosition();\n        \n        if (this.isRTL()) {\n            if (this.tickLeft) {\n                this.setHorizontalPosition(hScrollPosition + tickAmount);\n            } else if (this.tickRight) {\n                this.setHorizontalPosition(hScrollPosition - tickAmount);\n            }\n        } else {\n            if (this.tickLeft) {\n                this.setHorizontalPosition(hScrollPosition - tickAmount);\n            } else if (this.tickRight) {\n                this.setHorizontalPosition(hScrollPosition + tickAmount);\n            }\n        }\n    }\n\n    public clear(): void {\n        if (this.rafId !== null) {\n            cancelAnimationFrame(this.rafId);\n            this.rafId = null;\n        }\n        this.tickLeft = false;\n        this.tickRight = false;\n        this.tickUp = false;\n        this.tickDown = false;\n        this.bodyScrollActive = false;\n    }\n}\n","import { RendererClassType } from \"./core/model/checkbox-options-handler\";\nimport { IClipboard } from \"../utility/clipboard\";\n\n\nexport interface IRenderer {\n\tgetElement()       : HTMLElement;\n\tinit(params:object): void;\n\tdestroy()          : void;\n}\ninterface ICustomRenderer{\n    checkedElement: HTMLElement;\n    uncheckedElement ?: HTMLElement;\n}\ntype CheckboxEventOrigin = 'api' | 'ui';\ntype CheckboxOnChangeHandler =\n    | ((params: { oldValue: boolean; newValue: boolean; eventOrigin?: CheckboxEventOrigin }) => void)\n    | ((oldValue: boolean, newValue: boolean, eventOrigin?: CheckboxEventOrigin) => void);\ninterface ICheckboxConfiguration {\n    appendTo ?                        : HTMLElement;\n    value ?                           : boolean;\n    label  ?                          : string;\n    readonly ?                        : boolean;\n    ariaLabel ?                       : string;\n    instanceID ?                      : string;\n    checkboxRenderer ?                : RendererClassType;\n    onclick ?                         : CallableFunction;\n    onblur ?                          : CallableFunction;\n    onfocus ?                         : CallableFunction;\n    onChange ?                        : CheckboxOnChangeHandler;\n    required ?                        : boolean;\n    ariaLabelledBy ?                  : string;\n    description ?                     : string;\n    descriptionRenderer ?             : {};\n    descriptionRendererParams       ? : object,\n    ariaDescribedby  ?                : string ,\n    customRenderer ?                  : ICustomRenderConstructor,\n    onKeydown ?                       : CallableFunction,\n    onMousedown ?                     : CallableFunction,\n    coreLabel ?                       : string,\n    ignoreEmptyDOM ?                : boolean,\n    disabled ?: boolean\n\n    showErrorState                 ?: boolean;\n    status                         ?: 'error' | \"none\";\n    validationMessage              ?: string;\n    validationMessageRenderer      ?: { new(): ICheckboxErrorRenderer };\n    validationMessageRendererParams?: object;\n    labelRenderer ?: { new(): IRenderer } | undefined;\n    labelRendererParams ?: object;\n    clipboard ?: IClipboard | boolean;\n}\n\nconst chekBoxConfigurationArray = [\n    'appendTo', \n    'value', \n    'label',  \n    'readonly', \n    'ariaLabel', \n    'instanceID', \n    'checkboxRenderer', \n    'onclick', \n    'onblur', \n    'onfocus', \n    'onChange', \n    'required', \n    'ariaLabelledBy', \n    'description', \n    'descriptionRenderer', \n    'descriptionRendererParams',       \n    'ariaDescribedby',  \n    'customRenderer',\n    'coreLabel',\n    'disabled',\n    'clipboard'\n]\n\ntype listenerCallback = (event : Event) => void;\n\ninterface ICustomRender{\n    init(state : boolean ) : void;\n    getGUI() : HTMLElement |  null;\n    destroy() : void;\n    onChange(state :  boolean) : void;\n}\ninterface ICustomRenderConstructor {\n    new (state: boolean, span: HTMLElement): ICustomRender;\n}\n\n\nexport interface ICheckboxErrorRenderer {\n\tgetElement()       : HTMLElement;\n\tinit(params:object): void;\n\tdestroy()          : void;\n}\n\nexport {\n    ICheckboxConfiguration,\n    listenerCallback,\n    ICustomRenderer,\n    ICustomRender,\n    ICustomRenderConstructor,\n    chekBoxConfigurationArray,\n    CheckboxEventOrigin,\n    CheckboxOnChangeHandler\n}","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { BEAN_NAME } from \"@dg/corecomponent\";\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport { CheckboxAPI } from \"./core/model/checkbox-api\";\nimport { CheckboxOptionHandler } from \"./core/model/checkbox-options-handler\";\nimport { IUserParams } from \"../utility/user-params.types\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { CheckboxControllerHandler } from \"./core/controller/checkbox-controller-handler\";\nimport { CheckboxUserComponentHandler } from \"./core/model/checkbox-user-component-handler\";\nimport { CheckBoxStateHandler } from \"./core/model/checkbox-state-handler\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { ICheckboxConfiguration } from \"./checkbox-configuration.types\";\nimport { DescriptionComponent } from \"../description/description-view\";\nimport { Label } from \"../label/label-view\";\nimport { CheckBoxStateManager } from \"./core/model/checkbox-state-manager\";\nimport { ErrorComponent } from \"../error/error-view\";\n\n\ninterface IUserConfigurationMergedParams {\n    configuration: any;\n    frameWorkOverrides: IFrameworkOverrides | null;\n    globalEventListener: Function | null;\n    frameworkComponentWrapper: any | null;\n    instanceID : string;\n}\ninterface IClickEventMeta {\n    state : boolean,\n    event : MouseEvent\n}\nlet nextInstanceId = 1;\n\nclass CheckboxCoreComponent {\n\n    initialize(configuration : ICheckboxConfiguration, params : IUserParams = {}, createUI : CallableFunction) {\n\n        const instanceID          = configuration.instanceID ?? String(nextInstanceId++);\n        const beanClasses         = this.createBeanClasses();\n        const context             = new Context();\n        const userConfiguration   = this.createuserConfiguration(configuration, params, instanceID);\n\n        context.registerBeanClasses(beanClasses, userConfiguration);\n        this.registerCoreComponent(context);\n        createUI(context);\n\n        (window as any).linkContext = context;\n\n    }\n\n    createBeanClasses() : Set<any> {\n        let beanClassList = [\n            CheckboxAPI,\n            CheckboxOptionHandler,\n            CheckboxControllerHandler,\n            CheckBoxStateHandler,\n            CheckboxUserComponentHandler,\n\n            ComponentsRegistry,\n            EventHandler,\n            ComponentMetadataProvider,\n            CheckBoxStateManager,\n            UserComponentRegistry\n        ];\n        const beanClassSet = new Set(beanClassList);\n        return beanClassSet;\n    }\n\n    private createuserConfiguration(configuration : any, params : IUserParams, instanceID : string) : IUserConfigurationMergedParams {\n        let frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n    }\n\n    private registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = this.createComponentList();\n        registry.setupComponents(components);\n    }\n\n    private createComponentList() : ComponentMeta[] {\n        let components: ComponentMeta[] = [\n            {\n                componentName: 'checkbox-label',\n\t\t\t    componentClass: Label\n            },\n            {\n                componentName: 'checkbox-helper',\n                componentClass : DescriptionComponent\n            },\n            {\n                componentName : 'checkbox-error',\n                componentClass: ErrorComponent\n            }\n\n        ]\n\n        return components\n    }\n}\n\n\n\nexport {\n    CheckboxCoreComponent,\n    IClickEventMeta\n}","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { CheckboxAPITypes } from \"./core/model/checkbox-api.types\"\nimport { IFrameworkOverrides } from \"@dg/corecomponent/FrameWork.js\";\nimport { IModule } from \"../core/modules.types\";\nimport { ICheckboxConfiguration } from \"./checkbox-configuration.types\";\nimport { CheckboxBeanConstants } from \"./constants/checkbox-constants\";\nimport { CheckboxRootView } from \"./core/view/checkbox-root-view\";\nimport { CheckboxCoreComponent } from \"./checkbox-core-component\";\n\ninterface IUserParams {\n\tglobalEventListener      ?: Function;\n\tframeworkOverrides       ?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n\tmodules                  ?: IModule[];\n}\n\nclass Checkbox {\n\n    public api !: CheckboxAPITypes;\n\n    constructor(configuration : ICheckboxConfiguration, params ?: IUserParams) {\n\n        const createUI = (context : Context) => {\n            this.api = context.getBean(CheckboxBeanConstants.CHECKBOX_API) as CheckboxAPITypes;\n            // configuration.appendTo && context.createBean(new CheckboxRootView(configuration.appendTo));\n            context.createBean(new CheckboxRootView(configuration?.appendTo));\n        }\n\n        const checkboxCoreComponent = new CheckboxCoreComponent();\n        checkboxCoreComponent.initialize(configuration, params, createUI);\n    }\n\n}\n\nexport {\n    Checkbox\n}","const CheckboxBeanConstants = {\n    CHECKBOX_CONFIGURATION : 'configuration',\n    CHECKBOX_API : 'checkboxApi',\n    CHECKBOX_STATE : 'checkboxState',\n    CHECKBOX_CONTROLLER_HANDLER : 'checkboxControllerHandler',\n    CHECKBOX_EVENT_HANDLER : 'checkboxEventHandler'\n}\n\nexport {\n    CheckboxBeanConstants\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./modules/CSSRegistry\";\n\nfunction getCheckboxUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n    const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n    return generateUtilityClass('checkbox', slots.slot, slots.modifiers,globalNameSpace as string[]);\n}\n\nexport {\n  getCheckboxUtilityClass\n}","import { Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { CheckboxBeanConstants } from \"../../constants/checkbox-constants\";\nimport { CheckboxControllerHandlerType } from \"./checkbox-controller-handler.types\";\nimport { CheckboxRootController } from \"./checkbox-root-controller\";\n\n@Bean(CheckboxBeanConstants.CHECKBOX_CONTROLLER_HANDLER)\nclass CheckboxControllerHandler extends EventEmitter implements CheckboxControllerHandlerType {\n    private checkboxControl !: CheckboxRootController;\n    registerCtrl(checkboxControl : CheckboxRootController) : void {\n        this.checkboxControl = checkboxControl;\n    }\n\n    getCheckboxCtrl() : CheckboxRootController {\n        return this.checkboxControl;\n    }\n}\n\nexport {\n    CheckboxControllerHandler\n}\n\n\n","import { AutoWired, BEAN_NAME, setAriaLabel, setAriaRole } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../utility/abstract-controller\";\nimport { CheckboxComponentType } from \"./checkbox-root-types\";\nimport { CheckboxOptionHandler } from \"../model/checkbox-options-handler\";\nimport { CheckboxBeanConstants } from \"../../constants/checkbox-constants\";\nimport { CheckboxControllerHandlerType } from \"./checkbox-controller-handler.types\";\nimport { CheckboxStateHandlerType } from \"../model/checkbox-state-handler.types\";\nimport { CheckboxEventOrigin, ICheckboxConfiguration } from \"../../checkbox-configuration.types\";\nimport type { CheckBoxStateManager } from \"../model/checkbox-state-manager\";\nimport { registerClipboardGuards } from \"../../../utility/clipboard\";\n\nfunction svgReturner(){\n    const svgNS = \"http://www.w3.org/2000/svg\";\n    const svg = document.createElementNS(svgNS, \"svg\");\n    svg.setAttribute(\"width\", \"16\");\n    svg.setAttribute(\"height\", \"16\");\n    svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n    svg.style.setProperty(\"--ratingChecked\", \"#9277e7\");\n\n    const g1 = document.createElementNS(svgNS, \"g\");\n    g1.setAttribute(\"data-name\", \"Layer 2\");\n\n    const g2 = document.createElementNS(svgNS, \"g\");\n    g2.setAttribute(\"data-name\", \"Fill Icon\");\n\n    const path = document.createElementNS(svgNS, \"path\");\n    path.setAttribute(\"class\", \"FieldCheckboxTickRemove\");\n    path.setAttribute(\"d\", \"M10.56 17.75a1.28 1.28 0 01-.87-.35l-4.17-4a1.25 1.25 0 011.74-1.8l3.17 3.06 6.19-7.91a1.26 1.26 0 011.76-.21 1.24 1.24 0 01.21 1.75l-7 9a1.26 1.26 0 01-.9.48z\");\n\n    g2.appendChild(path);\n    g1.appendChild(g2);\n    svg.appendChild(g1);\n\n    return svg;\n}\n\nclass CheckboxRootController extends AbstractController<CheckboxComponentType> {\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionsHandler !: CheckboxOptionHandler;\n    @AutoWired(CheckboxBeanConstants.CHECKBOX_CONTROLLER_HANDLER) private controllerHandler !: CheckboxControllerHandlerType;\n    @AutoWired(CheckboxBeanConstants.CHECKBOX_STATE) private stateHandler !: CheckboxStateHandlerType;\n    @AutoWired('stateManager') private stateManager !: CheckBoxStateManager;\n    \n    private userClass : any;\n\n    init() : void {\n        this.initState();\n        this.registerEvent();\n        this.refresh(true);\n        this.controllerHandler.registerCtrl(this);\n        this.customDomHandler();\n        this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.addErrorClassName.bind(this));\n        this.addErrorClassName();\n    }\n\n     private addErrorClassName() : void {\n\t\tconst isInValid = this.stateManager.isInValid();\n\t\tthis.component!.getElement().classList.toggle(\"dg-input__status--error\", isInValid)\n\t}\n\n    private customDomHandler(){\n        if (this.optionsHandler.isCustomRenderer()){\n            const newState = this.stateHandler.getSelection();\n            const span = this.component?.getContainer()?.querySelector('label .dg-checkbox__input--custom');\n            const container=  this.component?.getContainer();\n            if (!span || !container) return;\n            const userRenderClass = this.optionsHandler.getCustomRenderer();\n            if(userRenderClass){\n                this.userClass =  new userRenderClass(newState,span as HTMLElement);\n            }\n        }\n    }\n\n    private initState() : void {\n        const isSelected = this.optionsHandler.getDefaultValue() ?? false;\n        this.stateHandler.setSelection(isSelected);\n    }\n\n    registerEvent() : void {\n        \n        const container =this.component?.getContainer();\n        const state = this.stateHandler.getSelection();\n        const element=container?.querySelector('label');\n        this.addInputEventListener();\n        this.addClassList();\n        this.customRenderHandler(state);\n        element && this.addListener(element, 'change', this.onClick.bind(this));\n        element &&  this.addListener(element, 'focus', this.onfocus.bind(this));\n        element && this.addListener(element, 'blur', this.onblur.bind(this));\n        element && this.addListener(element, 'keydown', this.onKeydown.bind(this));\n        element && this.addListener(element,'mousedown', this.onMouseDown.bind(this));\n        registerClipboardGuards(\n            this.component?.getElement(),\n            () => this.optionsHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n    }\n    private addInputEventListener(): void {\n        const input = this.component?.getInputElement();\n        if (input) {\n            input.addEventListener('focus', this.inputFocus.bind(this));\n            input.addEventListener('blur', this.inputBlur.bind(this));\n        }\n    }\n    private inputFocus() : void {\n        const rootElement = this.component?.getElement();\n        if (rootElement) {\n            rootElement.classList.add('dg-checkbox__status--focus');\n        }\n    }\n    private inputBlur() : void {\n        const rootElement = this.component?.getElement();\n        if (rootElement) {\n            rootElement.classList.remove('dg-checkbox__status--focus');\n        }\n    }\n\n    private addClassList(){\n        const state =  this.optionsHandler.isCustomRenderer();\n        const element = this.component?.getContainer();\n        const wrapper =  this.component?.getElement();\n\n        if(!state && element && wrapper){\n           wrapper.classList.add('dg-checkbox-default-style');\n        }\n    }\n\n    onfocus(event : FocusEvent) : void {\n        this.optionsHandler.onFocus(event);\n    }\n\n    onblur(event : MouseEvent) : void {\n        this.optionsHandler.onBlur(event);\n    }\n\n    onClick(event: MouseEvent): void {\n        const isReadonly = this.optionsHandler.getReadOnly();\n        const isDisabled = this.optionsHandler.getDisabled();\n        \n        if(isReadonly || isDisabled) return;\n        \n        const newState = !this.stateHandler.getSelection();\n        this.applyStateChange(newState, 'ui');\n        this.optionsHandler.onClick({ state: newState, event });\n    }\n\n    onKeydown(event : KeyboardEvent) : void {\n        this.optionsHandler.onKeydown({event});\n    }\n\n    onMouseDown(event : MouseEvent) : void {\n        this.optionsHandler.onMousedown({event});\n    }\n\n    toggleValue(eventOrigin: 'api' | 'ui' = 'ui') {\n        const isReadonly = this.optionsHandler.getReadOnly();\n        const isDisabled = this.optionsHandler.getDisabled();\n        \n        if (isReadonly || isDisabled) return;\n        \n        const newState = !this.stateHandler.getSelection();\n        this.applyStateChange(newState, eventOrigin);\n    }\n    \n    \n    private customRenderHandler(state: boolean): void {\n        const container = this.component?.getContainer();\n        if (!container) return;\n    \n        const span = container.querySelector('label .dg-checkbox__input--custom') as HTMLElement;\n        const input = container.querySelector('.dg-checkbox__input') as HTMLElement;\n        if (!span) return;\n    \n        input?.setAttribute('aria-checked', String(state));\n    \n        if (this.optionsHandler.isCustomRenderer()) {\n            if (this.userClass) {\n                this.userClass.onChange(state);\n            }\n        } else {\n            // span.textContent = '';\n            // const parser = new DOMParser();\n            // const svgDoc = parser.parseFromString(svgString, 'image/svg+xml');\n            // const svgElement = svgDoc.documentElement;\n            // span.appendChild(svgElement);\n\n\n            span.textContent = '';\n            span.appendChild(svgReturner());\n\n            // span.textContent = '';\n            // span.innerHTML = svgString;\n        }\n    }\n    \n\n    updateProperty(options : ICheckboxConfiguration, force ?:  boolean){\n        const hasValueUpdate = Object.prototype.hasOwnProperty.call(options, 'value');\n        const isValidBooleanValue = !hasValueUpdate || typeof options.value === 'boolean';\n\n        if (hasValueUpdate && !isValidBooleanValue) {\n            console.warn(`Checkbox value must be a boolean. Received ${typeof options.value}. Ignoring value update.`);\n        }\n\n        this.optionsHandler.updateProperties(options);\n\n        if (hasValueUpdate && isValidBooleanValue) {\n            const newValue = this.optionsHandler.getDefaultValue();\n            this.applyStateChange(newValue, 'api', { triggerChange: true, forceUpdate: false });\n        }\n\n        this.refresh(false, force, hasValueUpdate);\n    }\n    \n    private refresh(init : boolean = false, force ?: boolean, suppressOnChange: boolean = false) : void { \n        this.applyClassNames();\n        this.setAccessibility();\n       \n        const isReadonly =this.optionsHandler.getReadOnly();\n        if(!isReadonly || force){\n            this.updateValue(force)\n            this.updateLabel();\n            this.updateDescription();\n            this.updateCoreLabel();\n            this.updateReadOnly();\n            this.updateDisabled();\n        }\n        this.updateRequired();\n\n        if (!suppressOnChange) {\n            this.setValue(this.stateHandler.getSelection(), init);\n        }\n\n    }\n\n    private updateRequired() : void {\n        const isRequired = this.optionsHandler.isRequired();\n        const element = this.component?.getRequiredElement();\n        element!.classList.toggle(\"dg-hide\", !isRequired)\n    }\n\n    private updateReadOnly(){\n\n    }\n\n    private updateDisabled(){\n        const isDisabled =  this.optionsHandler.getDisabled();\n        const element =  this.component?.getElement();\n        const readOnly =  this.optionsHandler.getReadOnly();\n        const input = this.component?.getContainer()?.querySelector('input');\n        if(element){\n            if(isDisabled || readOnly){\n                if(isDisabled){\n                    element.classList.add('dg-input__status--disabled');\n                    element.classList.add('dg-checkbox__container--disabled');\n                }\n                input && (input.disabled = true);\n\n            }else{\n                element.classList.remove('dg-input__status--disabled');\n                element.classList.remove('dg-checkbox__container--disabled');\n\n                input && (input.disabled = false);\n                // if(!readOnly && input){\n                //     input.disabled = false;\n                // }\n            }\n        }\n\n    }\n\n    private updateValue(force ?: boolean){\n        const state =  this.stateHandler.getSelection();\n        const newState =  this.optionsHandler.getDefaultValue()\n        if(state  !==  newState && force){\n            this.toggle(force);\n        }\n    }\n    getLabelValue(): string | HTMLElement | undefined{\n        const label = this.component?.getElement()?.querySelector('label');\n        const span = label?.querySelector('span');\n        const labelValue = this.optionsHandler.getCheckBoxLabel();\n        if(span && labelValue){\n            return labelValue;\n        }\n        return undefined\n    }\n\n    private updateCoreLabel(){\n        const label = this.component?.getContainer()?.querySelector('label');\n        const span = label?.querySelector('.dg-checkbox__input-label');\n        const coreLabel = this.optionsHandler.getCheckBoxLabel() ?? '';\n        if(span){\n            span.textContent = coreLabel;\n        }\n    }\n\n    private updateLabel() {\n        const label =  this.getElement()?.querySelector('.dg-field__label');\n        const spanElement =  label?.querySelector('.dg-field__label__title');\n        if(label && spanElement) {\n            const labelText =  this.optionsHandler.getLabel();\n            spanElement.textContent =  labelText\n        }\n    }\n    hide(): void {\n        const element =  this.component?.getElement();\n        element && (element.style.display = 'none');\n     }\n     show(): void {\n        const element =  this.component?.getElement();\n        element && (element.style.display = 'block');\n\n     }\n\n    private updateDescription(){\n        const description =  this.getElement()?.querySelector('.dg-field__description');\n        if(description) {\n            const descriptionText =  this.optionsHandler.getDescription();\n            description.textContent =  descriptionText\n        }\n    }\n\n    private applyClassNames(){\n\t\t// const ownerState = this.getOwnerState();\n\t\t// const classes = useUtilityClasses(ownerState);\n\t\t// this.component.addOrRemoveCssClass(classes.checkbox);\n\t}\n    \n    private setAccessibility() : void {\n        //states\n        const readOnly = this.optionsHandler.getReadOnly();\n        const defaultValue = this.optionsHandler.getDefaultValue();\n        const rootElement = this.component?.getElement()\n        if(!rootElement) return;\n        const inputElement = this.component?.getInputElement() as HTMLInputElement;\n        const ariaRole = 'checkbox';\n        setAriaRole(inputElement, ariaRole);\n        readOnly != undefined && (inputElement.setAttribute('aria-disabled', readOnly+\"\"))\n        defaultValue != undefined && (inputElement.setAttribute('aria-checked', defaultValue+\"\"))\n        const ariaLabel = this.optionsHandler.getAriaLabel();\n        ariaLabel && setAriaLabel(inputElement, ariaLabel);\n    }\n\n    getProperty() {\n        const checkboxProperties = {\n            label                 : this.optionsHandler.getLabel(),\n            defaultValue          : this.optionsHandler.getDefaultValue(),\n            readOnly              : this.optionsHandler.getReadOnly(),\n            helper                : this.optionsHandler.getDescription(),\n            checkboxLabel         : this.optionsHandler.getCheckBoxLabel(),\n            shouldGenerateEmptyDom: this.optionsHandler.shouldGenerateEmptyDom(),\n            disabled              : this.optionsHandler.getDisabled(),\n            error                 : this.optionsHandler.showErrorState()\n        }\n        return checkboxProperties;\n    }\n\n    focus(){\n        const inputElement = this.component?.getInputElement();\n        if (inputElement) {\n            inputElement.focus();\n        }\n        // this.component?.getElement().focus()\n    }\n    blur(){\n        const inputElement = this.component?.getInputElement();\n        if (inputElement) {\n            inputElement.blur();\n        }\n        // this.component?.getElement().blur()\n    }\n\n    toggle(force ?: boolean) {\n        const isReadonly = this.optionsHandler.getReadOnly();\n        const isDisabled = this.optionsHandler.getDisabled();\n        \n        if((!isReadonly && !isDisabled) || force){\n            if (this.optionsHandler.isCustomRenderer()) {\n                this.toggleValue('api');\n            } else {\n                this.inputToggle('api');\n            }\n        }\n    }\n    setValue(value: boolean, init : boolean = false): void {\n        const isReadonly = this.optionsHandler.getReadOnly();\n        const isDisabled = this.optionsHandler.getDisabled();\n        \n        if(!isReadonly && !isDisabled) {\n            this.applyStateChange(value, 'api', { triggerChange: !init, forceUpdate: true });\n        }\n    }\n    inputToggle(eventOrigin: 'api' | 'ui' = 'api') {\n        const newState = !this.stateHandler.getSelection();\n        this.applyStateChange(newState, eventOrigin);\n    }\n\n    getElement(){\n        return this.component?.getElement();\n    }\n\n    reset() :  void{\n        const defaultValue = this.optionsHandler.getDefaultValue();\n        const currentState = this.stateHandler.getSelection();\n        const readOnly = this.optionsHandler.getReadOnly();\n        const isDisabled = this.optionsHandler.getDisabled();\n        \n        if(defaultValue != currentState && !readOnly && !isDisabled) {\n            this.updateValue(true);\n        }\n    }\n\n    clear()  : void {\n        const currentState = this.stateHandler.getSelection();\n        const readOnly = this.optionsHandler.getReadOnly();\n        const isDisabled = this.optionsHandler.getDisabled();\n        \n        if(!readOnly && !isDisabled && currentState != false) {\n            this.setValue(false);\n        }\n    }\n\n    private applyStateChange(newState: boolean, eventOrigin: CheckboxEventOrigin, options: { triggerChange?: boolean; forceUpdate?: boolean } = {}) {\n        const { triggerChange = true, forceUpdate = false } = options;\n        const previousState = this.stateHandler.getSelection();\n        const hasChanged = previousState !== newState;\n\n        if (!hasChanged && !forceUpdate) return;\n\n        this.stateHandler.setSelection(newState);\n        this.customRenderHandler(newState);\n\n        const inputElement = this.component?.getInputElement();\n        if (inputElement) {\n            inputElement.checked = newState;\n        }\n\n        if (triggerChange) {\n            this.optionsHandler.onChange(previousState, newState, eventOrigin);\n        }\n    }\n\n     getParamsProperty() {\n        return {\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> {\n\t\t\t\t\treturn\"dg-checkbox__label\"\n\t\t\t\t},\n\t\t\t\tgetLabelTitleClasses :()=> {\n\t\t\t\t\treturn \"dg-checkbox__label-title\"\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses: ()=>  \"dg-checkbox__validation-message\",\n\t\t\t\tgetDescriptionClasses      : ()=> \"dg-checkbox__description\"\n\t\t\t}\n\t\t};\n    }\n}\n\n\nexport {\n    CheckboxRootController\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { CheckboxBeanConstants } from \"../../constants/checkbox-constants\";\nimport { CheckboxAPITypes } from \"./checkbox-api.types\";\nimport { CheckboxControllerHandlerType } from \"../controller/checkbox-controller-handler.types\";\nimport { CheckboxStateHandlerType } from \"./checkbox-state-handler.types\";\nimport { ICheckboxConfiguration } from \"../../checkbox-configuration.types\";\nimport { CheckboxOptionHandlerTypes } from \"./checkbox-option-handler.types\";\n\n\n\n@Bean(CheckboxBeanConstants.CHECKBOX_API)\nclass CheckboxAPI extends EventEmitter implements CheckboxAPITypes {\n    @AutoWired(CheckboxBeanConstants.CHECKBOX_CONTROLLER_HANDLER) private controllerHandler !: CheckboxControllerHandlerType;\n    @AutoWired(CheckboxBeanConstants.CHECKBOX_STATE) private stateHandler !:CheckboxStateHandlerType ;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler !: CheckboxOptionHandlerTypes;\n\n    getValue() : boolean { \n       return this.stateHandler.getSelection()\n\n    }\n\n    getElement():HTMLElement{\n        return this.controllerHandler.getCheckboxCtrl().getElement() as HTMLElement;\n    }\n\n    focus():void{\n        this.controllerHandler.getCheckboxCtrl().focus()\n\n    }\n\n    blur():void{\n        this.controllerHandler.getCheckboxCtrl().blur()\n\n    }\n\n    toggle(force ?: boolean) : void {\n        this.controllerHandler.getCheckboxCtrl().toggle(force);\n    }\n    updateProperties(options: ICheckboxConfiguration , force ?: boolean): void {\n        this.controllerHandler.getCheckboxCtrl().updateProperty(options, force);\n    }\n\n    hide(): void {\n        this.controllerHandler.getCheckboxCtrl().hide(); \n    }\n\n    show(): void {\n        this.controllerHandler.getCheckboxCtrl().show();\n    }\n\n    getFormattedValue(): string {\n        return this.stateHandler.getSelection().toString();\n    }\n\n    getLabelValue(): string | HTMLElement | undefined {\n        return this.controllerHandler.getCheckboxCtrl().getLabelValue();\n    }\n\n    reset(): void {\n        this.controllerHandler.getCheckboxCtrl().reset()\n    }\n\n    clear(): void {\n        this.controllerHandler.getCheckboxCtrl().clear();\n    }\n\n    showErrorMessage(message ?: string): void {\n        message && this.optionHandler.updateValidationMessage(message);\n        this.optionHandler.updateStatus('error');\n    }\n\n    hideErrorMessage(): void {\n        this.optionHandler.updateValidationMessage(\"\");\n        this.optionHandler.updateStatus(\"none\");\n    }\n}\n\nexport {\n    CheckboxAPI\n}","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { CheckboxBeanConstants } from \"../../constants/checkbox-constants\";\nimport { CheckboxEventOrigin, CheckboxOnChangeHandler, chekBoxConfigurationArray, ICheckboxConfiguration, ICheckboxErrorRenderer, ICustomRenderConstructor } from \"../../checkbox-configuration.types\";\nimport { CheckboxOptionHandlerTypes } from \"./checkbox-option-handler.types\";\nimport { IClickEventMeta } from \"../../checkbox-core-component\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ClipboardConfig } from \"../../../utility/clipboard\";\n@Bean(BEAN_NAME.OPTION_HANDLER)\nclass CheckboxOptionHandler extends EventEmitter implements CheckboxOptionHandlerTypes{\n\n    @AutoWired(CheckboxBeanConstants.CHECKBOX_CONFIGURATION) configuration !: ICheckboxConfiguration;\n\n    getAppendTo() : HTMLElement |null{\n        return this.configuration.appendTo ?? null;\n    }\n    isRequired(): boolean {\n        return this.configuration.required ?? false;\n    }\n\n    getLabel(): string {\n        return this.configuration.label ?? '';\n    }\n\n    getAriaLabel(): string {\n        return this.configuration.ariaLabel ?? '';\n    }\n    getAriaDescribedby(): string {\n        return this.configuration.ariaDescribedby ?? '';\n    }\n    getReadOnly(): boolean {\n        return this.configuration.readonly ?? false;\n    }\n\n    getDisabled(): boolean {\n        return this.configuration.disabled ?? false;\n    }\n    getAriaLabelledby(){\n        return this.configuration.ariaLabelledBy ?? \"\";\n    }\n\n    getDefaultValue() : boolean {\n        return this.configuration.value ?? false;\n    }\n\n    getCheckBoxLabel(): string | null {\n        return this.configuration?.coreLabel ||  null;\n    }\n\n    getCheckBoxRenderer() : RendererClassType | undefined {\n        return this.configuration?.checkboxRenderer;\n    }\n\n\n    getDescription() :string {\n        return this.configuration.description ?? \"\";\n    }\n    onClick(params:IClickEventMeta): void {\n        this.configuration?.onclick?.(params);\n    }\n\n    onKeydown(params: any): void {\n        this.configuration?.onKeydown?.(params);\n    }\n\n    onFocus(params: any): void {\n        this.configuration?.onfocus?.(params);\n    }\n\n    onBlur(params: any): void {\n        this.configuration?.onblur?.(params);\n    }\n\n    onChange(oldValue: boolean, newValue: boolean, eventOrigin?: CheckboxEventOrigin): void {\n        const onChangeHandler = this.configuration?.onChange as CheckboxOnChangeHandler | undefined;\n        if (!onChangeHandler) return;\n\n        // const params = { oldValue, newValue, eventOrigin };\n        if (onChangeHandler.length === 1) {\n            (onChangeHandler as (oldValue: boolean, newValue: boolean, eventOrigin?: CheckboxEventOrigin) => void)(oldValue, newValue, eventOrigin);\n  \n        } else {\n            (onChangeHandler as (oldValue: boolean, newValue: boolean, eventOrigin?: CheckboxEventOrigin) => void)(oldValue, newValue, eventOrigin);\n        }\n    }\n\n    onMousedown(params: any): void {\n        this.configuration?.onMousedown?.(params);\n    }\n\n    getDescriptionRenderer() {\n        return this.configuration.descriptionRenderer ?? '';\n    }\n    getDescriptionRendererParams() {\n        return this.configuration.descriptionRendererParams ?? '';\n    }\n\n    isCustomRenderer(): boolean {\n        return Boolean(this.configuration.customRenderer) ?? false;\n    }\n\n    getCustomRenderer(): ICustomRenderConstructor | null {\n        return this.configuration.customRenderer?? null;\n    }\n\n    getCheckedRenderer(): HTMLElement | null {\n        return null;\n        // return this.configuration.customRenderer?.checkedElement ?? null;\n    }\n\n    getUnCheckedRenderer(): HTMLElement | null {\n        return null;\n        // return this.configuration.customRenderer?.uncheckedElement ?? null;\n    }\n    updateProperties(options : ICheckboxConfiguration){\n        const userProperty = Object.keys(options);\n        for(let i = 0; i < userProperty.length; i++){\n            const userKey = userProperty[i];\n            const isValidProperty = chekBoxConfigurationArray.includes(userKey);\n            if(isValidProperty){\n                if (userKey === 'value' && typeof (options as any)[userKey] !== 'boolean') {\n                    console.warn(`Invalid value for checkbox: expected boolean, received ${typeof (options as any)[userKey]}. Ignoring.`);\n                    continue;\n                }\n                (this.configuration as any)[userKey] = (options as any)[userKey];\n            }  else {\n                console.warn(`Invalid property ${userKey} in options. Ignoring.`);\n            }\n        }\n    }\n\n    shouldGenerateEmptyDom(): boolean {\n        // return this.configuration?.ignoreEmptyDOM ?? false;\n        return this.configuration?.ignoreEmptyDOM !== undefined\n            ? !this.configuration.ignoreEmptyDOM\n            : false;\n    }\n\n    showErrorState(): boolean {\n        return this.configuration.showErrorState ?? false;\n    }\n\n    isValid(): boolean {\n        return this.configuration.status === 'error';\n    }\n\n    updateStatus(status : 'error' | \"none\") : void {\n        this.configuration.status = status;\n        this.dispatchEvent({\n            type: \"EVENT_VALUE_UPDATE\",\n            force : true\n        })\n    }\n\n    updateValidationMessage(message : string) : void {\n        this.configuration.validationMessage = message;\n    }\n\n    getValidationMessage(): string {\n        return this.configuration.validationMessage ?? '';\n    }\n\n    getValidationMessageRenderer(): { new(): ICheckboxErrorRenderer } | undefined {\n        return this.configuration.validationMessageRenderer;\n    }\n\n    getValidationMessageRendererParams(): object | undefined {\n        return this.configuration.validationMessageRendererParams;\n    }\n\n    getLabelRenderer() {\n        return this.configuration.labelRenderer;\n    }\n\n    getLabelRendererParams() {\n        return this.configuration.labelRendererParams ?? {};\n    }\n\n    getClipboard(): ClipboardConfig {\n        return this.configuration.clipboard;\n    }\n}\n\ninterface RendererClassType {\n    getElement() : HTMLElement\n}\n\nexport {\n    CheckboxOptionHandler,\n    RendererClassType\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { CheckboxStateHandlerType } from \"./checkbox-state-handler.types\";\nimport { CheckboxOptionHandlerTypes } from \"./checkbox-option-handler.types\";\nimport { CheckboxBeanConstants } from \"../../constants/checkbox-constants\";\n\n@Bean(CheckboxBeanConstants.CHECKBOX_STATE)\nclass CheckBoxStateHandler extends EventEmitter implements CheckboxStateHandlerType {\n    private selected : boolean  = false;\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) checkboxOptionHandler !: CheckboxOptionHandlerTypes;\n\n    setSelection(isSelected: boolean): void {\n        this.selected = isSelected;\n    }\n\n    getSelection(): boolean {\n        return this.selected;\n    }\n\n    toggleSelection(): void {\n        this.selected = !this.selected;\n    }\n\n}\n\nexport {\n    CheckBoxStateHandler\n}","\nimport {  Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { CheckboxOptionHandlerTypes } from \"./checkbox-option-handler.types\";\n\n@Bean('stateManager')\n class CheckBoxStateManager extends EventEmitter {\n\n    isInValid() : boolean {\n        return (this.optionsHandler as CheckboxOptionHandlerTypes).isValid();\n    }\n}\nexport {\n    CheckBoxStateManager\n}","import { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { AbstractUserComponentHandler } from \"../../../utility/abstract-user-component-handler\";\nimport { ComponentItemType, IComponentDetails } from \"../../../utility/component-detail.types\";\nimport { CheckboxUserComponentHandlerType } from \"./checkbox-user-component-handler.types\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport { ILabelUserComponentHandler } from \"../../../label/label.types\";\n\nconst PROPERTY_NAME = {\n    CHECKED_RENDERER : 'checkboxRenderer',\n}\nexport const enum PropertyName {\n\tDESCRIPTION_RENDERER = 'descriptionRenderer',\n\tERROR_RENDERER = 'errorRenderer',\n\tLABEL_RENDERER = 'labelRenderer'\n}\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nclass CheckboxUserComponentHandler extends AbstractUserComponentHandler implements CheckboxUserComponentHandlerType, ILabelUserComponentHandler {\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\tgetLabelRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails(item, PropertyName.LABEL_RENDERER, params, PropertyName.LABEL_RENDERER);\n\t}\n\n    getCheckboxRendererDetails<T, P>(rendererWrapper: ComponentItemType<T>, params: P): IComponentDetails | undefined{\n        return this.getComponentDetails(rendererWrapper, PROPERTY_NAME.CHECKED_RENDERER, params);\n    }\n\n    getDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.DESCRIPTION_RENDERER, params, PropertyName.DESCRIPTION_RENDERER);\n\t}\n\n\tgetErrorRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.ERROR_RENDERER, params, PropertyName.ERROR_RENDERER);\n\t}\n\n    protected getComponentDetail( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n    getComponent<T>(item: ComponentItemType<T>, propertyName: string): T {\n        switch(propertyName) {\n            case PROPERTY_NAME.CHECKED_RENDERER:\n                return item.getRenderer();\n\t\t\tcase PropertyName.ERROR_RENDERER:\n\t\t\tcase PropertyName.DESCRIPTION_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getRenderer();\n        }\n        return item.getRenderer();\n    }\n\n    getUserParams<T, P>(item: ComponentItemType<T>, propertyName: string, params: any) {\n        switch(propertyName) {\n            case PROPERTY_NAME.CHECKED_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n                return  this.getUserRendererParams<T, P>(item, params);\n        }\n    }\n}\n\nexport {\n    CheckboxUserComponentHandler\n}","class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}\n\nexport {\n    CSSRegistry\n}","import { PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\"\nimport { composeClasses } from \"@dg/utils\";\nimport { CheckboxRootController } from \"../controller/checkbox-root-controller\";\nimport { getCheckboxUtilityClass } from \"../checkbox-root-classes\";\nimport { CheckboxComponentType } from \"../controller/checkbox-root-types\";\n\n\nexport const useUtilityClasses = (ownerState : any = {}) => {\n    const readonly = ownerState?.readonly\n\tconst slots = {\n\t\tlabel    : {\n            slot     : 'label',\n            modifiers: []\n        },\n        root : {\n            slot : 'root',\n            modifiers : []\n        },\n        checkbox : {\n            slot : 'checkbox-input',\n            modifiers : [\n                readonly && 'readonly'\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots, getCheckboxUtilityClass);\n};\n\n\n\nconst rootTemplate = (props : any) => {\n\n    const rootDiv    = document.createElement('div');\n    const wrapperDiv = document.createElement('div');\n    const input      = document.createElement('input');\n    const span       = document.createElement('span');\n    const customSpan = document.createElement('span');\n    const label      = document.createElement('label');\n    const required   = document.createElement('span');\n    required.setAttribute('ref', 'required');\n    required.textContent = \"*\"\n    \n\n    input.type = 'checkbox';\n    if (props.defaultValue != undefined) input.checked = props.defaultValue;\n    if (props.readOnly != undefined) input.disabled = props.readOnly;\n\n    if (props.checkedBorderColor) span.style.setProperty('--checked-border-color', props.checkedBorderColor);\n    if (props.checkedFillColor) span.style.setProperty('--checked-fill-color', props.checkedFillColor);\n    if (props.uncheckedBorderColor) span.style.setProperty('--unchecked-border-color', props.uncheckedBorderColor);\n    if (props.uncheckedboxFillColor) span.style.setProperty('--unchecked-fill-color', props.uncheckedboxFillColor);\n\n    input.classList.add('dg-checkbox__input');\n\n    input.setAttribute('ref', 'checkbox');\n    customSpan.classList.add('dg-checkbox__input--custom');\n    span.classList.add('dg-checkbox__input-label');\n    required.classList.add('dg-field__label--required');\n    label.classList.add('dg-checkbox__input-wrapper', 'dg-field__input-wrapper');\n    wrapperDiv.classList.add('dg-checkbox__container');\n    props?.disabled ? rootDiv.classList.add('dg-checkbox__container--disabled'): null;\n    rootDiv.classList.add('dg-checkbox__root', 'dg-field__root');\n\n\n    label.append(input, customSpan, span, required);\n    wrapperDiv.appendChild(label);\n    if (props?.checkboxLabel) span.textContent = props.checkboxLabel;\n    if (props?.shouldGenerateEmptyDom || props.label.length > 0){\n        const textLabel = document.createElement(\"checkbox-label\");\n        textLabel.setAttribute(\"ref\", 'label');\n        rootDiv.appendChild(textLabel);\n    }\n    rootDiv.append(wrapperDiv);\n    if (props?.shouldGenerateEmptyDom || props.helper.length > 0){\n        const checkboxHelper = document.createElement(\"checkbox-helper\");\n        checkboxHelper.setAttribute(\"ref\", 'description');\n        rootDiv.appendChild(checkboxHelper);\n    }\n\n    if(props.shouldGenerateEmptyDom || props.error) {\n        const errorElement = document.createElement(\"checkbox-error\");\n        errorElement.setAttribute(\"ref\", 'error');\n        rootDiv.appendChild(errorElement);\n    }\n    return rootDiv;\n};\n\nclass CheckboxRootView extends Component{\n\n    @queryAssignedNodes('required') private requiredElement !: HTMLSpanElement;\n    @queryAssignedNodes('checkbox') private checkbox !: HTMLInputElement;\n    appendTo : HTMLElement |null;\n\n    constructor(appendTo ?: HTMLElement) {\n        super();\n        this.appendTo = appendTo ?? null;\n    }\n\n    @PostConstruct()\n    init() : void {\n\n        const component : CheckboxComponentType = {\n            addOrRemoveCssClass : (className : string) =>  this.addOrRemoveCssClassName(className),\n            getElement : () => this.getGui(),\n            getContainer : () => this.getGui().querySelector('.dg-checkbox__container'),\n            getRequiredElement : () => this.requiredElement,\n            getInputElement : () => this.checkbox\n            // getWrapperElement : () => this.getGui().querySelector('.dg-checkbox__container')?.querySelector('label')\n            // destroy : () => this.destroy()\n        }\n\n        const controller = this.createBean(new CheckboxRootController());\n        \n        \n        const props = controller.getProperty();\n        const properties = controller.getParamsProperty();\n\n\n        this.setTemplate(rootTemplate(props), {\n            label      : properties.label,\n            description: properties.description,\n            error      : properties.description\n        });\n\n        controller.setComponent(component);\n\n        this.appendElementIntoUserDom();\n    }\n\n    private addOrRemoveCssClassName(className : string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.appendTo && this.appendTo.removeChild(eGui);\n\t\t\tthis.appendTo = null;\n\t\t});\n\t}\n\n}\n\nexport {\n    CheckboxRootView\n}","import { OptionRendererType } from \"../../List-configuration\";\nimport { OptionRendererParams } from \"../Component/Body/List-Option/list-option.types\";\n\nexport class LoadingOptionRenderer implements OptionRendererType<OptionRendererParams>  {\n    constructor() {\n       \n    }\n\n    public init(_params: any): void {\n    }\n\n    public destroy(): void {\n\n    }\n\n    getElement() : HTMLElement {\n        return createDropdownLoader()\n    }\n}\n\nfunction createDropdownLoader() {\n    const panel = document.createElement(\"div\");\n    panel.className = \"dg-drop-option-loader-panel dg-delay-loader-dropdown\";\n\n    const list = document.createElement(\"ul\");\n    list.className = \"dg-delay-loader-dropdown-list\";\n\n    for (let i = 0; i < 1; i++) {\n        const listItem = document.createElement(\"li\");\n        listItem.className = \"dg-drop-option-loader\";\n\n        const circle = document.createElement(\"span\");\n        circle.className = \"dg-skeleton-loader dg-drop-option-loader-circle\";\n\n        const rectangle = document.createElement(\"span\");\n        rectangle.className = \"dg-skeleton-loader dg-drop-option-loader-rec\";\n\n        listItem.appendChild(circle);\n        listItem.appendChild(rectangle);\n        list.appendChild(listItem);\n    }\n\n    panel.appendChild(list);\n    return panel;\n}","const MULTI_TEXT_BEAN_NAME = {\n\tMULTI_LINE_API: 'MultilineAPI',\n\tMULTI_LINE_CONFIGURATION: 'configuration',\n\tCSSCLASSNAMEGENERATOR: 'CSSClassNameGenartor',\n\tMULTI_LINE_ADJUSTER_HANDLER: 'MultilineAdjusterHandler',\n\tFORMATTER: 'formatter',\n\tKEYBOARD_SHORTCUT_HANDLER: 'KeyBoardShortCutsHandler',\n\tMULTI_LINE_EVENT_HANDLER: 'MultilineEventHandler',\n\tMULTI_LINE_CONTROLLER_HANDLER: 'MultilineControllerHandler',\n}\nexport {\n    MULTI_TEXT_BEAN_NAME\n}","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport {EventEmitter}from '@dg/corecomponent/EventEmitter.js';\nimport { MULTI_TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { IMultilineAPI } from \"./multiline-api.types\";\nimport { IMultilineConfiguration } from \"../../multiline-configuration.types\";\nimport { MultilineOptionsHandlerTypes } from \"./multiline-options-handler.types\";\nimport { MultilineControllerHandler } from \"./multiline-controller\";\nimport { getFormattedText, selectAllText, setFocusAtFirst, setFocusAtLast } from \"../utility\";\n\n\n\n@Bean(MULTI_TEXT_BEAN_NAME.MULTI_LINE_API)\nexport class MultiLineAPI extends EventEmitter implements IMultilineAPI {\n   \n    @AutoWired('configuration') configuration !: IMultilineConfiguration;\n    @AutoWired(MULTI_TEXT_BEAN_NAME.MULTI_LINE_CONTROLLER_HANDLER) controllerHandler !: MultilineControllerHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: MultilineOptionsHandlerTypes;\n\n    getName() { return MULTI_TEXT_BEAN_NAME.MULTI_LINE_API};\n\n    updateProperties(options : IMultilineConfiguration ,  force ?: boolean) {\n        this.controllerHandler.getMultilineCtrl().updateProperties(options,force ?? true);\n        this.dispatchEvent({\n            type : \"PROPERTY_CHANGED\"\n        })\n    }\n\n    getElement() : HTMLElement | undefined {\n        return this.controllerHandler.getMultilineCtrl().getElement();\n    }\n\n    getValue(){\n        return this.controllerHandler.getMultilineCtrl().getValue();\n    }\n    \n    setFocusAtFirst(): void {\n        setFocusAtFirst(this.getRootElement());\n    }\n    setFocusAtLast(): void {\n        setFocusAtLast(this.getRootElement());\n    }\n    selectAllText(): void {\n        selectAllText(this.getRootElement());\n    }\n\n    getRootElement() {\n        return this.controllerHandler.getMultilineCtrl().getRootElement();\n    }\n\n    onFocus(): void {\n       this.getElement()?.focus();\n    }\n    onBlur(): void {\n        this.getElement()?.blur();\n    }\n\n    focus(preventScroll ?: boolean): void {\n        if(preventScroll){\n            this.optionHandler.setScrollPrevented(preventScroll);\n            this.getRootElement()?.focus({ preventScroll: true });  \n        }\n        else{\n            this.getRootElement()?.focus();\n        }\n    }\n    blur(): void {\n        this.getRootElement()?.blur();\n    }\n    // destroy(): void {\n    //     const rootElement = this.getRootElement();\n    //     if(rootElement){\n    //         const newElement = rootElement.cloneNode(true);\n    //         if(rootElement.parentNode){\n    //             rootElement.parentNode.replaceChild(newElement, rootElement);\n    //         }\n    //         // rootElement.parentNode?.replaceChild(newElement, rootElement);\n    //     }\n    //     this.getElement()?.remove();\n    // }\n\n    destroy(): void {\n        const rootElement = this.getRootElement();\n    \n        if (rootElement && rootElement.parentNode && rootElement.parentNode.contains(rootElement)) {\n            const newElement = rootElement.cloneNode(true);\n            rootElement.parentNode.replaceChild(newElement, rootElement);\n        }\n    \n        this.getElement()?.remove();\n    }\n    \n\n\n    getCharacterCount(): number {\n        return this.controllerHandler.getMultilineCtrl().getCharacterCount();\n    }\n    appendText(text: string |  number,force ?:  boolean): void {\n        const oldValue = this.getValue()?.toString() ?? '';\n        this.controllerHandler.getMultilineCtrl().appendText(text,force);\n        const newValue = this.getValue()?.toString() ?? '';\n        if(oldValue !== newValue) {\n            this.optionHandler.onChange(oldValue, newValue, 'api');\n        }\n    }\n    setValue(value: string | number,force ?:  boolean): void {\n        const oldValue = this.getValue()?.toString() ?? '';\n        const newValue = value.toString();\n        if(oldValue !== newValue) {\n            this.controllerHandler.getMultilineCtrl().setValue(value,force);\n            this.optionHandler.onChange(oldValue, newValue, 'api');\n        }\n    }\n    disable(value: boolean): void {\n        this.controllerHandler.getMultilineCtrl().disable(value ?? true);\n    }\n    resetValue(): void {\n        const oldValue = this.getValue()?.toString() ?? '';\n        this.controllerHandler.getMultilineCtrl().resetValue();\n        const newValue = this.getValue()?.toString() ?? '';\n        if(oldValue !== newValue) {\n            this.optionHandler.onChange(oldValue, newValue, 'api');\n        }\n    }\n    show(subElements ?: string[]): void {\n        this.controllerHandler.getMultilineCtrl().show(subElements);\n    }\n    hide(subElements ?: string[]): void {\n        this.controllerHandler.getMultilineCtrl().hide(subElements);\n    }\n    clear(): void {\n        const oldValue = this.getValue()?.toString() ?? '';\n        this.controllerHandler.getMultilineCtrl().clear();\n        const newValue = this.getValue()?.toString() ?? '';\n        if(oldValue !== newValue) {\n            this.optionHandler.onChange(oldValue, newValue, 'api');\n        }\n    }\n\n    getFormattedValue(): string | number {\n        return getFormattedText(this.controllerHandler.getMultilineCtrl().getValue() as string, this.optionHandler.getFormat());\n    }\n\n    showErrorMessage(message ?: string): void {\n        message && this.optionHandler.updateValidationMessage(message);\n        this.optionHandler.updateStatus('error');\n    }\n\n    hideErrorMessage(): void {\n        this.optionHandler.updateValidationMessage(\"\");\n        this.optionHandler.updateStatus(\"none\");\n    }\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Bean } from \"@dg/corecomponent\";\nimport { MULTI_TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { MultilineRootController } from \"../multiline-root/multiline-root-controller\";\nimport { RenderMultilineRootController } from \"../render-multiline-root/render-multiline-root-controller\";\n\n\n@Bean(MULTI_TEXT_BEAN_NAME.MULTI_LINE_CONTROLLER_HANDLER)\nclass MultilineControllerHandler extends EventEmitter {\n\tprivate textCtrl !: MultilineRootController | RenderMultilineRootController;\n\tregisterMultiline(textCtrl: MultilineRootController | RenderMultilineRootController): void {\n\t\tthis.textCtrl = textCtrl;\n\t}\n\n\tgetMultilineCtrl(): MultilineRootController | RenderMultilineRootController {\n\t\treturn this.textCtrl;\n\t}\n}\n\nexport {\n    MultilineControllerHandler\n}","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\n\nimport { MULTI_TEXT_BEAN_NAME} from \"../../constants/beanname-constants\";\nimport { IMultilineConfiguration, IMultilineErrorRenderer, multilinePropeties } from \"../../multiline-configuration.types\";\nimport { IErrorMeta, MultilineOptionsHandlerTypes } from \"./multiline-options-handler.types\";\nimport { IInputMeta } from \"./multiline-event-handler.types\";\nimport { IMultilineAPI } from \"./multiline-api.types\";\nimport { ClipboardConfig } from \"../../../../utility/clipboard\";\n\n\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nclass MultilineOptionHandler extends EventEmitter implements MultilineOptionsHandlerTypes{\n\n  \n    @AutoWired(MULTI_TEXT_BEAN_NAME.MULTI_LINE_CONFIGURATION) configuration !: IMultilineConfiguration;\n\t@AutoWired(MULTI_TEXT_BEAN_NAME.MULTI_LINE_API) api!: IMultilineAPI;\n    private scrollPrevented:boolean = false;\n\n    isDisabled(): boolean {\n        return this.configuration.disabled ?? false;\n    }\n    isSelected(): boolean {\n       return false\n    }\n    isReadOnly(): boolean {\n        return this.configuration.readonly ?? false;\n    }\n    getLabel(): string {\n        return this.configuration.label ?? \"\";\n    }\n\n    getAriaLabelledby(){\n        return this.configuration.ariaLabelledBy ?? \"\";\n    }\n\n    getAriaLabel(): string {\n        return this.configuration.ariaLabel ?? \"\";\n    }\n    onFocus(event: FocusEvent): void  {\n        this.configuration.onFocus?.(event);\n    }\n    onBlur(event: FocusEvent): void {\n        this.configuration.onBlur?.(event);\n    }\n\n    onError(errorMeta: IErrorMeta): void {\n        this.configuration.onError?.(errorMeta)\n    }\n    \n    getAppendTo(): HTMLElement | null{\n        return this.configuration.appendTo ?? null\n    }\n    getVariant() {\n       return this.configuration.bordered ?? 'none'\n    }\n\n    isRequired(): boolean {\n        return this.configuration.required ?? false;\n    }\n    getMinCount() :  number{\n        return  this.configuration.min ?? 0\n    }\n    getMaxCount() :  number  {\n        return this.configuration.max ??  0;\n    }\n\n    setScrollPrevented(value: boolean): void {\n        this.scrollPrevented = value;\n    }\n    isScrollPrevented(): boolean {\n        return this.scrollPrevented\n    }\n\n    getDefaultValue(): string {\n        return this.configuration.value ?? \"\"\n    }\n    getPlaceHolder(): string {\n        return this.configuration.placeholder ?? \"\";\n    }\n\n    onInput(event: IInputMeta): void {\n        this.configuration.onInput?.(event);\n    }\n    onKeydown(event: KeyboardEvent): void {\n        this.configuration.onKeydown?.(event)\n    }\n    onChange(oldValue: string, newValue: string, eventOrigin?: 'api' | 'ui'): void {\n        if (this.configuration.onChange) {\n            this.configuration.onChange(oldValue, newValue, eventOrigin);\n        }\n    }\n    getDescription() :string {\n        return this.configuration.description ?? \"\";\n    }\n    getDescriptionRenderer() {\n        return this.configuration.helperTextRenderer ?? '';\n    }\n    getDescriptionRendererParams() {\n        return this.configuration.helperTextRendererParams ?? '';\n    }\n    getInvalidHelperTextRenderer() {\n        return this.configuration.invalidHelperTextRenderer ?? '';\n    }\n    getInvalidHelperTextRendererParams() {\n        return this.configuration.invalidHelperTextRendererParams ?? '';\n    }\n    getValidationMessage(): string {\n        return this.configuration.validationMessage ?? '';\n    }\n    getAriaDescribedby(): string {\n        return this.configuration.ariaDescribedby ?? '';\n    }\n    showTotal(): boolean {\n        return this.configuration.showTotal ?? false;\n    }\n    getRole(): string {\n        return this.configuration.ariaRole ?? 'text-box';\n    }\n    getFormat(): string {\n        return this.configuration.format ?? '';\n    }\n\n    isRTL(): boolean {\n        return this.configuration.rtl ?? false;\n    }\n\n    setDisabled(value: boolean): void {\n        this.configuration.disabled = value;\n    }\n    setConfiguration(configuration: IMultilineConfiguration): void {\n        this.configuration  = configuration;\n    }\n    getConfiguration(): IMultilineConfiguration {\n        return this.configuration;\n    }\n\n    updateProperties(options: IMultilineConfiguration): void {\n        const userProperty = Object.keys(options);\n        for(let i = 0; i < userProperty.length; i++){\n            const userKey = userProperty[i]\n            const isValidProperty = multilinePropeties.includes(userKey);\n            if(isValidProperty){\n                (this.configuration as any)[userKey] = (options as any)[userKey];\n            }  else {\n                console.warn(`Invalid property ${userKey} in options. Ignoring.`);\n            }\n        }\n    }\n\n    shouldGenerateEmptyDom(): boolean {\n        return this.configuration?.ignoreEmptyDOM !== undefined\n            ? !this.configuration.ignoreEmptyDOM\n            : false;\n    }\n\n    getAutoSize(): boolean {\n        return this.configuration?.autosize ?? false;\n    }\n\n    hasDynamicHeight(): boolean {\n        return this.configuration?.hasDynamicHeight ?? false;\n    }\n\n\n    getKeepWithInRange(): boolean {\n        return this.configuration?.keepWithInRange ??  true;\n    }\n\n    getClampValueOnBlur(): boolean {\n        return this.configuration?.clampValueOnBlur ?? false;\n    }\n\n    setValue(value: string): void {\n        this.configuration.value = value;\n    }\n\n    showErrorState(): boolean {\n        return this.configuration.showErrorState ?? false;\n    }\n\n    isValid(): boolean {\n        return this.configuration.status === 'error';\n    }\n\n    updateStatus(status : 'error' | \"none\") : void {\n        this.configuration.status = status;\n        this.dispatchEvent({\n            type: \"EVENT_VALUE_UPDATE\",\n            force : true\n        })\n    }\n\n    updateValidationMessage(message : string) : void {\n        this.configuration.validationMessage = message;\n    }\n\n    getValidationMessageRenderer(): { new(): IMultilineErrorRenderer } | undefined {\n        return this.configuration.validationMessageRenderer;\n    }\n\n    getValidationMessageRendererParams(): object | undefined {\n        return this.configuration.validationMessageRendererParams;\n    }\n\n    getLabelRenderer() {\n        return this.configuration.labelRenderer;\n    }\n\n    getLabelRendererParams() {\n        return this.configuration.labelRendererParams ?? {};\n    }\n\n    getClipboard(): ClipboardConfig {\n        return this.configuration.clipboard;\n    }\n}\n\nexport {\n    MultilineOptionHandler\n}\n\n","\nimport {  Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { MultilineOptionsHandlerTypes } from \"./multiline-options-handler.types\";\n\n@Bean('stateManager')\n class MultilineStateManager extends EventEmitter {\n    isInValid() : boolean {\n        return (this.optionsHandler as MultilineOptionsHandlerTypes).isValid();\n    }\n}\nexport {\n    MultilineStateManager\n}","import { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IMultilineUserComponentHandlerTypes } from \"./multiline-user-component-handler.types\";\nimport { ComponentMetadata } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport {  IComponentDetails, UserComponentHandler } from \"@dg/corecomponent/UserComponentHandler.js\";\nimport { ILabelUserComponentHandler } from \"../../../../label/label.types\";\n\n\nconst enum PropertyName {\n\tHELPER_TEXT_RENDERER = 'helpTextRenderer',\n\tLABEL_RENDERER       = 'labelRenderer',\n\tERROR_RENDERER = 'errorRenderer',\n}\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nclass MultiLineUserComponentHandler extends UserComponentHandler implements IMultilineUserComponentHandlerTypes, ILabelUserComponentHandler{\n\t\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\n\tgetLabelRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails(item, PropertyName.LABEL_RENDERER, params, PropertyName.LABEL_RENDERER);\n\t}\n\t\n\n\tgetDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.HELPER_TEXT_RENDERER, params, PropertyName.HELPER_TEXT_RENDERER);\n\t}\n\n\tgetErrorRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.ERROR_RENDERER, params, PropertyName.ERROR_RENDERER);\n\t}\n\n\n\t\n\tprotected getComponentDetail(item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta{\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.HELPER_TEXT_RENDERER:\n\t\t\tcase PropertyName.ERROR_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(item : any, propertyName : PropertyName, _params : any) : any {\n        switch(propertyName) {\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getUserRendererParams();\n            default:\n                return {};\n        }\n\n    }\n\n\n}\nexport{\n\tMultiLineUserComponentHandler,\n\tPropertyName\n}","import { composeClasses, generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../modules/CSSRegistry\";\n\ninterface OwnerStateType {\n    disabled : boolean;\n}\n\nfunction getTextUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n    const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n    return generateUtilityClass('text', slots.slot, slots.modifiers,globalNameSpace as string[]);\n  }\n\nconst useUtilityClasses = (ownerState : OwnerStateType) => {\n\tconst slots = {\n\t\troot : {\n            slot     : 'root',\n            modifiers: [\n                ownerState.disabled && 'disabled',\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots,getTextUtilityClass );\n};\n\nexport {\n    useUtilityClasses,\n    OwnerStateType,\n    getTextUtilityClass\n}","\nimport { AutoWired, BEAN_NAME, setAriaDisabled, setAriaLabel } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { TextComponentType } from \"./multiline-root-types\";\nimport { MultilineOptionsHandlerTypes } from \"../model/multiline-options-handler.types\";\nimport { onElementAppended, OwnerStateType } from \"../utility\";\nimport { useUtilityClasses } from \"./multiline-root-classes\";\nimport { MultilineControllerHandler } from \"../model/multiline-controller\";\nimport { MULTI_TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { IMultilineConfiguration } from \"../../multiline-configuration.types\";\nimport type { MultilineStateManager } from \"../model/multiline-state-manager\";\n\nclass MultilineRootController extends AbstractController<TextComponentType> {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionsHandler !: MultilineOptionsHandlerTypes;\n    @AutoWired(MULTI_TEXT_BEAN_NAME.MULTI_LINE_CONTROLLER_HANDLER) controllerHandler !: MultilineControllerHandler;\n    @AutoWired('stateManager') private stateManager !: MultilineStateManager;\n\n\n\n    init(): void {\n        this.registerEvent();\n        this.refresh();\n        this.controllerHandler.registerMultiline(this);\n\n        const isAutosize = this.optionsHandler.getAutoSize();\n\n        isAutosize && onElementAppended(this.component?.getElement()!, () => {\n            this.dispatchEvent({\n                type : \"DOM_APPENDED\"\n            })\n        })\n        this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.addErrorClassName.bind(this));\n        this.addErrorClassName();\n    }\n\n     private addErrorClassName() : void {\n\t\tconst isInValid = this.stateManager.isInValid();\n\t\tthis.component!.getElement().classList.toggle(\"dg-input__status--error\", isInValid)\n\t}\n    registerEvent(){\n    }\n    \n    private applyClasses() {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.component?.addOrRemoveCssClassName(classes.root);\n        this.component?.getElement().classList.add('dg-textarea__root');\n        this.component?.getElement().classList.add('dg-field__root');\n    }\n\n    private setAccessibility() : void { \n        const inputElement         = this.component?.getElement()\n        const ariaLabel       = this.optionsHandler.getAriaLabel();\n        inputElement && setAriaLabel(inputElement, ariaLabel);\n    }\n\n    setAutosize(){\n        const inputElement = this.component?.getRootElement();\n        if(inputElement){\n            inputElement.style.height = 'auto';\n            const elementViewportHeight       = Math.ceil(parseFloat(getComputedStyle(inputElement).height));\n            const absoluteScrollDifference    = Math.ceil(parseFloat(getComputedStyle(inputElement).height)) - Math.floor(parseFloat(getComputedStyle(inputElement).height));\n            const scrollHeight                = inputElement.scrollHeight +  absoluteScrollDifference;\n            inputElement.style.height = Math.max(elementViewportHeight,scrollHeight)+\"px\";\n        }\n    }\n    getElement() : HTMLElement| undefined{\n        return this.component?.getElement() ;\n    }\n    getRootElement() {\n        return this.component?.getRootElement();\n    }\n    getValue() : string | number {\n        return this.getRootElement()?.value ?? '';\n    }\n    private getOwnerState() : OwnerStateType {\n        const selected = this.optionsHandler.isSelected();\n        const disabled = this.optionsHandler.isDisabled();\n        const readonly = this.optionsHandler.isReadOnly();\n        return {\n            selected,\n            disabled,\n            readonly\n        }\n    }\n    updateProperties(options : IMultilineConfiguration ,  force ?: boolean){\n        this.applyClasses();\n        this.optionsHandler.updateProperties(options);\n        const isDisabled    = this.optionsHandler.isDisabled();\n        const isReadOnly    = this.optionsHandler.isReadOnly();\n        if( (!isDisabled && !isReadOnly ) || force){\n            this.refresh(force);\n        }\n    }\n    getParamsProperty() {\n        return {\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> {\n\t\t\t\t\treturn\"dg-text__label\"\n\t\t\t\t},\n\t\t\t\tgetLabelTitleClasses :()=> {\n\t\t\t\t\treturn \"dg-text__label-title\"\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-text__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-text__description\"\n\t\t\t}\n\t\t};\n    }\n    getCharacterCount(): number {\n        return  this.getRootElement()?.textContent?.length || 0;\n    }\n    appendText(text: string |  number, force ?: boolean): void {\n        const rootElement   = this.getRootElement() as HTMLTextAreaElement | null;\n        const readOnly      = this.optionsHandler.isReadOnly();\n        if(rootElement && (!readOnly || force)){\n            this.setValue(rootElement.value + text.toString(),force);\n        }\n    }\n    setValue(value :  string |  number , force ?: boolean) {\n        const isDisabled    = this.optionsHandler.isDisabled();\n        const isReadOnly    = this.optionsHandler.isReadOnly();\n        if( (!isDisabled && !isReadOnly) || force ){\n            const rootElement = this.getRootElement();\n            rootElement && (rootElement.value =value.toString()); \n        }\n    }\n    updateMinValue() {\n        const rootElement = this.getRootElement();\n        if(rootElement){\n            rootElement.setAttribute('aria-min',`${this.optionsHandler.getMinCount()}`)\n        }\n    }\n    updateMaxValue() {\n        const rootElement   = this.getRootElement();\n        const maxCount      = this.optionsHandler.getMaxCount();\n        if (maxCount && rootElement) {\n            rootElement.setAttribute('aria-max',`${maxCount}`)\n        }\n    }\n\n    updatePlaceholder() {\n        const rootElement = this.getRootElement();\n        (rootElement) && (rootElement.placeholder = this.optionsHandler.getPlaceHolder());\n    }\n    updateRequired() {\n        const rootElement       = this.getRootElement();\n        const isRequired        = this.optionsHandler.isRequired();\n        if (rootElement) {\n            rootElement.setAttribute('aria-required', `${isRequired}`)\n            this.dispatchEvent({ type: 'PROPERTY_CHANGED' });\n           \n        }\n    }\n    updateAriaLabel() {\n        const ariaLabel       = this.optionsHandler.getAriaLabel();\n        const inputElement    = this.getRootElement();\n        inputElement && setAriaLabel(inputElement, ariaLabel);\n    }\n    updateDisabled() {\n        const isDisabled =  this.optionsHandler.isDisabled();\n       this.disable(isDisabled)\n    }\n\n    updateReadOnly() {\n        const isReadOnly    = this.optionsHandler.isReadOnly();\n        const element       = this.getRootElement();\n        if (element) {\n            element.readOnly = isReadOnly;\n        }\n    }\n    updateValue(force ?: boolean) {\n        const defaultValue    = this.optionsHandler.getDefaultValue();\n        const element         = this.getRootElement();\n        if(element) {\n            this.setValue(defaultValue,force);\n        };\n    }\n    updateLabel() {\n        const label =  this.getElement()?.querySelector('label');\n        const spanElement =  label?.querySelector('span');\n        if(label && spanElement) {\n            const labelText =  this.optionsHandler.getLabel();\n            spanElement.textContent =  labelText;\n        }\n    }\n\n    updateDescription(){\n        const description =  this.getElement()?.querySelector('.dg-field__description');\n        if(description) {\n            const descriptionText =  this.optionsHandler.getDescription();\n            description.textContent =  descriptionText;\n        }\n    }\n    \n    private refresh(force ?: boolean) : void { \n        this.applyClasses();\n        this.setAccessibility();\n\n        this.updateMinValue();\n        this.updateMaxValue();\n        this.updatePlaceholder();\n        this.updateRequired();\n        this.updateDisabled();\n        this.updateAriaLabel();\n        this.updateValue(force);\n        this.updateLabel();\n        this.updateDescription();\n\n    }\n    disable(value: boolean): void {\n        const element = this.getRootElement();\n        const rootElement = this.component?.getElement();\n        if(!element) return ;\n        rootElement!.classList.toggle('dg-input__status--disabled', value);\n        element.classList.toggle('dg-text__user-text--disabled', value === true);\n        element.disabled = value;\n        this.optionsHandler.setDisabled(value);\n        setAriaDisabled(element,value);\n    }\n    resetValue()   : void {\n        const initialValue =  this.optionsHandler.getDefaultValue();\n        (initialValue.length>1) && this.setValue(initialValue);\n    }\n    hide(subElements?: string[]): void {\n        const element = this.getElement();\n        if (!element) return;\n    \n        if (!subElements || subElements.length === 0) {\n            element.style.display = 'none';\n            return;\n        }\n    \n        subElements.forEach(sub => {\n            if (sub === 'label') {\n                this.hideLabel();\n            } else if (sub === 'description') {\n                this.hideDescription();\n            }\n        });\n    }\n    \n    show(subElements?: string[]): void {\n        const element = this.getElement();\n        if (!element) return;\n    \n        if (!subElements || subElements.length === 0) {\n            element.style.display = 'block';\n            return;\n        }\n    \n        subElements.forEach(sub => {\n            if (sub === 'label') {\n                this.showLabel();\n            } else if (sub === 'description') {\n                this.showDescription();\n            }\n        });\n    }\n    \n    hideLabel(){\n        const label = this.getElement()?.querySelector('.dg-field__label') as HTMLElement;\n        label && (label.style.display='none')\n    }\n    hideDescription(){\n        const description = this.getElement()?.querySelector('.dg-field__description') as HTMLElement;\n        description && (description.style.display = 'none');\n    }\n    showLabel(){\n        const label = this.getElement()?.querySelector('.dg-field__label') as HTMLElement;\n        label && (label.style.display='block')\n    }\n    showDescription(){\n        const description = this.getElement()?.querySelector('.dg-field__description') as HTMLElement;\n        description && (description.style.display = 'block')\n    }\n\n\n    clear() :  void {\n        this.setValue('')\n    }\n}\n\nexport {\n    MultilineRootController\n}","\nimport { AutoWired, BEAN_NAME, PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { TextComponentType } from \"./multiline-root-types\";\nimport { MultilineRootController } from \"./multiline-root-controller\";\nimport { MultilineOptionsHandlerTypes } from \"../model/multiline-options-handler.types\";\n\nconst multiTag ='multiTag'\nconst rootTemplate = ( props :  any,emptyDom :  boolean) => {\n    const div = document.createElement(\"div\");\n    if (emptyDom || props.label) {\n        const textLabel = document.createElement(\"text-label\");\n        textLabel.setAttribute(\"ref\", 'label');\n        div.appendChild(textLabel);\n    }\n    const divWrapper = document.createElement(\"div\");\n    divWrapper.classList.add('dg-text__container');\n    divWrapper.classList.add('dg-field__container');\n    const textInput = document.createElement(\"text-area-element\");\n    textInput.setAttribute('ref',multiTag);\n    (props?.rtl) && (div.setAttribute('dir','rtl'));\n    divWrapper.appendChild(textInput);\n    div.append(divWrapper);\n    if (emptyDom || props.helper) {\n        const textHelper = document.createElement(\"text-helper\");\n        textHelper.setAttribute(\"ref\", 'description');\n        div.appendChild(textHelper);\n    }\n\n    if(emptyDom || props.error) {\n        const errorElement = document.createElement(\"multiline-error\");\n        errorElement.setAttribute(\"ref\", 'error');\n        div.appendChild(errorElement);\n    }\n    return div;\n}\n\nclass MutliLineRootComponent  extends Component{\n    private componentHolder : HTMLElement |  null;\n    @queryAssignedNodes(multiTag) private multiTags : any ;\n    constructor(appendTo ?: HTMLElement) {\n        super();\n        this.componentHolder =  appendTo ?? null;\n\n        if (appendTo) {\n            appendTo.style.width = '100%';\n            appendTo.style.minHeight = '0';\n        }\n        \n\n    }\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: MultilineOptionsHandlerTypes;\n    @PostConstruct()\n    init() : void {\n\n        const component : TextComponentType = {\n            addOrRemoveCssClassName : (className : string) =>  this.addOrRemoveCssClassName(className),\n            getElement : () => this.getGui(),\n            getRootElement :()=>{return this.multiTags.textAreaElement} \n        }\n\n        const controller = this.createBean(new MultilineRootController());\n\n        const props = {\n             label : this.optionHandler.getLabel().length > 0,\n             helper: this.optionHandler.getDescription().length > 0,\n             rtl   : this.optionHandler.isRTL(),\n             error : this.optionHandler.showErrorState()\n        }\n\n\t\tconst properties = controller.getParamsProperty();\n        const emptyDom = this.shouldGenerateEmptyDom()\n        const template=  rootTemplate(props,emptyDom);\n        this.setTemplate(template,{\n            label      : properties.label,\n            description: properties.description,\n            error      : properties.description\n        });\n\n        controller.setComponent(component);\n        this.appendElementIntoUserDom();\n    }\n\n    shouldGenerateEmptyDom(){\n        const generateEmptyDom = this.optionHandler.shouldGenerateEmptyDom();\n\t\treturn generateEmptyDom\n\t}\n\n    private addOrRemoveCssClassName(className : string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui() as HTMLElement;\n\n\t\tthis.componentHolder && this.componentHolder.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.componentHolder && this.componentHolder.removeChild(eGui);\n\t\t\tthis.componentHolder = null;\n\t\t});\n\t}\n\n}\n\nexport {\n    MutliLineRootComponent\n}","import { EventEmitter, IEventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME, setAriaDescribedBy, setAriaDisabled, setAriaInvalid, setAriaLabel, setAriaLabelledBy, setAriaReadOnly, setAriaRequired } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { OwnerStateType } from \"../multiline-root/multiline-root-classes\";\nimport { getFormattedText, getMutliLineUtilityClass } from \"../utility\";\nimport { MultilineCompType } from \"./multiline-textArea.types\";\nimport { MultilineOptionsHandlerTypes } from \"../model/multiline-options-handler.types\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\nconst useUtilityClasses = (ownerState : OwnerStateType) => {\n\tconst slots = {\n\t\troot : {\n            slot     : 'input-wrapper',\n            modifiers: [\n                ownerState.disabled && 'disabled',\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots,getMutliLineUtilityClass);\n};\nclass MultiLineController extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: MultilineOptionsHandlerTypes;\n    private component !: MultilineCompType;\n    private oldValue : string | null = null;\n\n    private addInputDestroyFunc : CallableFunction[]         = [];\n    private addAutosiseInputDestroyFunc : CallableFunction[] = [];\n\n\n    private addInputEventListener(object: Window | HTMLElement | IEventEmitter, event: string, listener: (event?: any) => void): (() => null) | any {\n        object.addEventListener(event, listener);\n        this.addInputDestroyFunc.push(() => {\n            object.removeEventListener(event, listener);\n        })\n    }\n\n    private addAutoSizeInputEventListener(object: Window | HTMLElement | IEventEmitter, event: string, listener: (event?: any) => void): (() => null) | any {\n        object.addEventListener(event, listener);\n        this.addAutosiseInputDestroyFunc.push(() => {\n            object.removeEventListener(event, listener);\n        })\n    }\n\n    private destroyInputEvent(eventHandler : CallableFunction[]) : void {\n        eventHandler.forEach((destroyFunc) => {\n            destroyFunc();\n        })\n    }\n\n    setComp(comp : MultilineCompType ) {\n        this.component    = comp;\n        this.applyClasses();\n        this.setValue();\n        this.setAriaAttributes();\n        this.addListener(this.eventHandler, 'PROPERTY_CHANGED', () => {\n            this.setRequired();\n            this.setValue();\n            this.setAriaAttributes();\n            this.registerEventHandler();\n        });\n\n        this.addListener(this.eventHandler, \"DOM_APPENDED\", this.setAutosize.bind(this));\n   \n        this.registerEventHandler();\n        // this.setAutosize();\n    }\n\n    private applyClasses() : void {\n        const ownerState    = this.getOwnerState();\n        const classes       = useUtilityClasses(ownerState);\n        this.component.addOrRemoveCSSClass(classes.root);\n        this.component.getElement().classList.add('dg-field__input-wrapper');\n\n    }\n\n    private getOwnerState() {\n\t\treturn {\n\t\t\tdisabled : this.optionHandler.isDisabled(),\n\t\t\treadonly : this.optionHandler.isReadOnly()\n\t\t}\n\t}\n\n    private registerEventHandler() {\n        const ownerState = this.getOwnerState();\n        const inputElement = this.component.getRootElement();\n        const autosize =  this.optionHandler.getAutoSize();\n        this.destroyInputEvent(this.addAutosiseInputDestroyFunc);\n        this.destroyInputEvent(this.addInputDestroyFunc);\n        registerClipboardGuards(\n            inputElement,\n            () => this.optionHandler.getClipboard(),\n            (target, event, listener) => this.addInputEventListener(target, event, listener)\n        );\n        if(!(ownerState.readonly || ownerState.disabled) || autosize) {\n            this.addAutoSizeInputEventListener(inputElement, 'focus', this.onFocus.bind(this));\n            this.addAutoSizeInputEventListener(inputElement, 'keydown', this.onKeydown.bind(this))\n        }\n\n        if(!(ownerState.readonly || ownerState.disabled)) {\n            this.addInputEventListener(inputElement, 'blur', this.onBlur.bind(this));\n            this.addInputEventListener(inputElement, \"input\", this.onInput.bind(this));\n        }\n    }\n\n    private setAccessibility() : void {\n        this.setAriaAttributes();\n        this.assignValueBoundaries();\n    }\n\n    private assignValueBoundaries() :  void {\n        const inputElement   = this.component.getRootElement();\n        const minCount       = this.optionsHandler.getMinCount();\n        const maxCount       = this.optionsHandler.getMaxCount();\n        const defaultValue   = this.optionsHandler.getDefaultValue();\n        const isReadOnly     = this.optionsHandler.isReadOnly();\n        const isDisabled     = this.optionsHandler.isDisabled();\n        const wrapperElement = this.component.getRootElement();\n        const isRequired     = this.optionsHandler.isRequired();\n        const format         = this.optionHandler.getFormat();\n        const formattedText  = getFormattedText(defaultValue, format);\n\n        inputElement.value        = formattedText;\n        inputElement.disabled     = isDisabled;\n        inputElement.readOnly     = isReadOnly;\n        setAriaRequired(inputElement,isRequired);\n        if(minCount){\n            inputElement.setAttribute('aria-min',`${minCount}`)\n        }\n        if(maxCount > minCount) {\n            inputElement.setAttribute('aria-max',`${maxCount}`);\n        };\n        if (maxCount > minCount && maxCount > 0) {\n            inputElement.setAttribute('aria-max',`${maxCount}`)\n        }\n        wrapperElement.classList.toggle('dg-input__status--disabled', isDisabled);\n        wrapperElement.classList.toggle('dg-text__status--disabled', isDisabled);\n        wrapperElement.classList.toggle('dg-text__status--read-only', isReadOnly);\n    }\n\n\n    private setAriaAttributes() : void {\n        const element   = this.component.getRootElement();\n        setAriaDisabled(element, this.optionHandler.isDisabled());\n        setAriaReadOnly(element, this.optionHandler.isReadOnly());\n        setAriaRequired(element, this.optionHandler.isRequired());\n        setAriaLabel(element, this.optionHandler.getAriaLabel());\n        setAriaLabelledBy(element, this.optionHandler.getAriaLabelledby());\n        setAriaDescribedBy(element, this.optionHandler.getAriaDescribedby());\n    }\n\n    private setValue() : void {\n        this.setAccessibility();\n    }\n\n    private setRequired(){\n        const element   = this.component.getRootElement();\n        setAriaRequired(element, this.optionHandler.isRequired());\n    }\n\n\n\n    private setAutosize(){\n        const inputElement          = this.component.getRootElement();\n        inputElement.style.height   = 'auto';\n        inputElement.style.height   = 1+'px';\n        const scrollHeight          = inputElement.scrollHeight;\n        inputElement.style.height   = scrollHeight+\"px\"\n    }\n\n    private onBlur(event: FocusEvent): void { \n    const inputElement    = this.component.getRootElement();\n    const minCount        = this.optionsHandler.getMinCount();\n    const maxCount        = this.optionsHandler.getMaxCount();\n    const inputLength     = inputElement.value.length;\n    const rootElement     = this.optionsHandler.api.getElement();\n    const isRequired      = this.optionsHandler.isRequired();\n    const clampValue      = this.optionsHandler.getClampValueOnBlur();\n\n    if (clampValue && inputLength > maxCount) {\n        inputElement.value = inputElement.value.slice(0, maxCount);\n    }\n\n    const finalLength = inputElement.value.length;\n\n    setAriaInvalid(inputElement, finalLength < minCount ? 'true' : 'false');\n\n    if (!inputElement.value && isRequired) {\n        inputElement.reportValidity();\n    }\n\n    rootElement.classList.remove('dg-input__status--focus');\n    this.optionsHandler.onBlur(event);\n    \n    // Trigger onChange if value has changed\n    if (this.oldValue !== null && this.oldValue !== inputElement.value) {\n        this.optionsHandler.onChange(this.oldValue, inputElement.value, 'ui');\n    }\n    this.oldValue = null;\n}\n\n    private onInput(event: InputEvent): void {\n        const wrapperElement  = this.component.getElement();\n        const inputElement    = this.component.getRootElement();\n        const format          = this.optionHandler.getFormat();\n        const maxCount        = this.optionsHandler.getMaxCount();\n        const minCount        = this.optionsHandler.getMinCount();\n        \n        const formattedText   = getFormattedText(inputElement.value, format);\n        inputElement.value = formattedText;\n\n        const currentLength = formattedText.length;\n        this.setAutosize();\n\n        const eventMeta = {\n            event: event,\n            value: formattedText\n        };\n\n        const isOutOfRange   = currentLength > maxCount || currentLength < minCount;\n        if(isOutOfRange){\n            setAriaInvalid(inputElement, 'true');\n            if(currentLength > maxCount){\n                this.optionHandler.onError({type    : 'max' ,event :event })\n            }\n            else if(currentLength < minCount){\n                this.optionHandler.onError({type    : 'min',event : event})\n            }\n        }\n        else{\n             setAriaInvalid(inputElement, 'false');\n        }\n\n        wrapperElement.classList.toggle('dg-text__status--error', isOutOfRange);\n\n        this.optionsHandler.onInput(eventMeta);\n\n        this.optionHandler.setValue(formattedText);\n    }\n\n    private onFocus(event: FocusEvent): void {\n        const rootElement   = this.optionsHandler.api.getElement();\n        const inputElement  = this.component.getRootElement();\n        const isAutosize    = this.optionHandler.getAutoSize();\n\n        this.oldValue = inputElement.value;\n\n        if (!isAutosize) {\n            rootElement.classList.add('dg-input__status--focus');\n            this.optionsHandler.onFocus(event);\n        }\n\n        if (!this.optionsHandler.hasDynamicHeight()) {\n            this.setAutosize();\n        }\n\n        // setTimeout(() => {\n        //     setFocusAtLast(inputElement);\n        // }, 1);\n    }\n\n    private onKeydown(event: KeyboardEvent): void {\n        const inputElement = this.component.getRootElement();\n        const maxCount     = this.optionsHandler.getMaxCount();\n        const inputLength  = inputElement.value.length;\n        const keepWithinRange = this.optionsHandler.getKeepWithInRange();\n\n        const allowedKeys = [\n            'Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown',\n            'Tab', 'Enter', 'Escape', 'Home', 'End'\n        ];\n\n        if (keepWithinRange && maxCount && inputLength >= maxCount && !allowedKeys.includes(event.key)) {\n            event.preventDefault();\n            setAriaInvalid(inputElement, 'true');\n        } else {\n            this.optionsHandler.onKeydown(event);\n            setAriaInvalid(inputElement, 'false');\n        }\n    }\n\n    destroy(): void {\n        super.destroy();\n    }\n}\nexport {\n    MultiLineController\n}","import { PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { MultilineCompType } from \"./multiline-textArea.types\";\nimport { MultiLineController } from \"./multiline-textArea-controller\";\n\nconst textAreaTag = 'textAreaTag';\n\nconst TextAreaTemplate = () => {\n    const div = document.createElement(\"div\");\n    let textarea = document.createElement('textarea');\n    textarea.setAttribute('ref',textAreaTag);\n    textarea.classList.add(\"dg-text__input\");\n    textarea.classList.add(\"dg-field__input\");\n    textarea.setAttribute('aria-label', \"Input description\");\n    textarea.setAttribute('aria-required', \"true\");\n    textarea.setAttribute('aria-invalid', \"false\");\n    div.appendChild(textarea);\n    return  div\n}\n\n\nclass MultilineViewComponent extends Component {\n    constructor() {\n        super();\n        this.setTemplate(TextAreaTemplate())\n    }\n    @queryAssignedNodes(textAreaTag) private textAreaElement !: HTMLTextAreaElement;\n\n    @PostConstruct()\n    init() {\n        const comp : MultilineCompType = {\n            getElement            : () => this.getGui(),\n            addOrRemoveCSSClass   : (className: string) => this.addOrRemoveCSSClass(className),\n            getRootElement        : () =>{ return this.textAreaElement }\n        }\n        const controller = this.createBean(new MultiLineController());\n        controller.setComp(comp);\n    }\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n}\n\nexport {\n    MultilineViewComponent\n}","\nimport { AutoWired, BEAN_NAME, setAriaDisabled, setAriaLabel } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { MultilineOptionsHandlerTypes } from \"../model/multiline-options-handler.types\";\nimport { getFormattedText, OwnerStateType } from \"../utility\";\nimport { MultilineControllerHandler } from \"../model/multiline-controller\";\nimport { MULTI_TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { IMultilineConfiguration } from \"../../multiline-configuration.types\";\nimport { RenderTextComponentType } from \"./render-multiline-root-types\";\nimport { useUtilityClasses } from \"../multiline-root/multiline-root-classes\";\n\nclass RenderMultilineRootController extends AbstractController<RenderTextComponentType> {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionsHandler !: MultilineOptionsHandlerTypes;\n    @AutoWired(MULTI_TEXT_BEAN_NAME.MULTI_LINE_CONTROLLER_HANDLER) controllerHandler !: MultilineControllerHandler;\n\n\n    init(): void {\n        this.registerEvent();\n        this.refresh();\n        this.controllerHandler.registerMultiline(this)\n\n    }\n    registerEvent(){\n    }\n    \n    private applyClasses() {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.component?.addOrRemoveCssClassName(classes.root);\n        this.component?.getElement().classList.add('dg-textarea__root');\n        this.component?.getElement().classList.add('dg-field__root');\n        this.component?.getElement().classList.add('dg-field--render-state');\n    }\n\n    private setAccessibility() : void { \n        const inputElement         = this.component?.getElement()\n        const ariaLabel       = this.optionsHandler.getAriaLabel();\n        inputElement && setAriaLabel(inputElement, ariaLabel);\n    }\n    getElement() : HTMLElement| undefined{\n        return this.component?.getElement() ;\n    }\n    getRootElement() {\n        return this.component?.getRootElement();\n    }\n    getValue() : string | number {\n        return this.getRootElement()?.value ?? '';\n    }\n    private getOwnerState() : OwnerStateType {\n        const selected = this.optionsHandler.isSelected();\n        const disabled = this.optionsHandler.isDisabled();\n        const readonly = this.optionsHandler.isReadOnly();\n        return {\n            selected,\n            disabled,\n            readonly\n        }\n    }\n    updateProperties(options : IMultilineConfiguration){\n        this.applyClasses();\n        this.optionsHandler.updateProperties(options);\n        this.refresh();\n    }\n    getParamsProperty() {\n        return {\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> {\n\t\t\t\t\treturn\"dg-text__label\"\n\t\t\t\t},\n\t\t\t\tgetLabelTitleClasses :()=> {\n\t\t\t\t\treturn \"dg-text__label-title\"\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-text__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-text__description\"\n\t\t\t}\n\t\t};\n    }\n    getCharacterCount(): number {\n        return  this.getRootElement()?.textContent?.length || 0;\n    }\n    appendText(text: string |  number): void {\n        const rootElement = this.getRootElement() as HTMLTextAreaElement | null;\n        (rootElement) && (this.setValue(rootElement.value + text.toString()));\n    }\n    setValue(value :  string |  number){\n        value = getFormattedText(value as string, this.optionsHandler.getFormat());\n        const isDisabled    = this.optionsHandler.isDisabled();\n        const isReadOnly    = this.optionsHandler.isReadOnly();\n        if( !isDisabled && !isReadOnly){\n            const rootElement = this.getRootElement();\n            rootElement && (rootElement.textContent =value.toString()); \n            rootElement && (rootElement.value =value.toString()); \n\n        }\n    }\n    updateMinValue() {\n        const rootElement = this.getRootElement();\n        (rootElement) && (rootElement.minLength = this.optionsHandler.getMinCount());\n    }\n    updateMaxValue() {\n        const rootElement   = this.getRootElement();\n        const maxCount      = this.optionsHandler.getMaxCount();\n        if (maxCount && rootElement) {\n            rootElement.maxLength = maxCount;\n        }\n    }\n\n    updatePlaceholder() {\n        const rootElement = this.getRootElement();\n        (rootElement) && (rootElement.placeholder = this.optionsHandler.getPlaceHolder());\n    }\n    updateRequired() {\n        const rootElement = this.getRootElement();\n        (rootElement) && (rootElement.required = this.optionsHandler.isRequired());\n    }\n    updateAriaLabel() {\n        const ariaLabel       = this.optionsHandler.getAriaLabel();\n        const inputElement    = this.getRootElement();\n        inputElement && setAriaLabel(inputElement, ariaLabel);\n    }\n    updateDisabled() {\n        const isDisabled =  this.optionsHandler.isDisabled();\n       this.disable(isDisabled)\n    }\n\n    updateReadOnly() {\n        const isReadOnly    = this.optionsHandler.isReadOnly();\n        const element       = this.getRootElement();\n        if (element) {\n            element.readOnly = isReadOnly;\n        }\n    }\n    updateValue() {\n        const defaultValue    = this.optionsHandler.getDefaultValue();\n        const element         = this.getRootElement();\n        if(element) {\n            this.setValue(defaultValue);\n        };\n    }\n    updateLabel() {\n        const label =  this.getElement()?.querySelector('label');\n        const spanElement =  label?.querySelector('span');\n        if(label && spanElement) {\n            const labelText =  this.optionsHandler.getLabel();\n            spanElement.textContent =  labelText;\n        }\n    }\n\n    updateDescription(){\n        const description =  this.getElement()?.querySelector('.dg-field__description');\n        if(description) {\n            const descriptionText =  this.optionsHandler.getDescription();\n            description.textContent =  descriptionText;\n        }\n    }\n    \n    private refresh() : void { \n        this.applyClasses();\n        this.setAccessibility();\n\n        this.updateMinValue();\n        this.updateMaxValue();\n        this.updatePlaceholder();\n        this.updateRequired();\n        this.updateAriaLabel();\n        this.updateDisabled();\n        this.updateAriaLabel();\n        this.updateValue();\n        this.updateLabel();\n        this.updateDescription();\n\n    }\n    disable(value: boolean): void {\n        const isComponentDisabled =  this.optionsHandler.isDisabled();\n        if(isComponentDisabled == value){return}\n        const element = this.getRootElement();\n        if(!element) return ;\n        element.classList.toggle('dg-text__user-text--disabled', value === true);\n        element.disabled = value;\n        this.optionsHandler.setDisabled(value);\n        setAriaDisabled(element,value);\n    }\n    resetValue()   : void {\n        const initialValue =  this.optionsHandler.getDefaultValue();\n        (initialValue.length>1) && this.setValue(initialValue);\n    }\n    hide(): void {\n        const element =  this.getElement()\n       element && (element.style.display = 'none');\n    }\n    show(): void {\n        const element =  this.getElement()\n        element && (element.style.display = 'block');\n    }\n    clear() :  void {\n        this.setValue('')\n    }\n}\n\nexport {\n    RenderMultilineRootController\n}","\nimport { AutoWired, BEAN_NAME, PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\n\nimport { MultilineOptionsHandlerTypes } from \"../model/multiline-options-handler.types\";\nimport { RenderTextComponentType } from \"./render-multiline-root-types\";\nimport { RenderMultilineRootController } from \"./render-multiline-root-controller\";\n\nconst multiTag ='multiTag'\nconst rootTemplate = ( props :  any,emptyDom :  boolean) => {\n    const div = document.createElement(\"div\");\n    if (emptyDom || props.label) {\n        const textLabel = document.createElement(\"text-label\");\n        textLabel.setAttribute(\"ref\", 'label');\n        div.appendChild(textLabel);\n    }\n    const divWrapper = document.createElement(\"div\");\n    divWrapper.classList.add('dg-text__container');\n    divWrapper.classList.add('dg-field__container');\n\n    const textInput = document.createElement(\"render-text-area-element\");\n    textInput.setAttribute('ref',multiTag);\n    (props?.rtl) && (div.setAttribute('dir','rtl'));\n    divWrapper.appendChild(textInput);\n    div.append(divWrapper);\n    if (emptyDom || props.helper) {\n        const textHelper = document.createElement(\"text-helper\");\n        textHelper.setAttribute(\"ref\", 'description');\n        div.appendChild(textHelper);\n    }\n    return div;\n}\n\nclass RenderMutliLineRootComponent  extends Component{\n    private componentHolder : HTMLElement |  null;\n    @queryAssignedNodes(multiTag) private multiTags : any ;\n    constructor(appendTo ?: HTMLElement) {\n        super();\n        this.componentHolder =  appendTo ?? null;\n        if (appendTo) {\n            appendTo.style.width = '100%';\n            appendTo.style.height = '100%';\n            appendTo.style.minHeight = '0';\n        }\n    }\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: MultilineOptionsHandlerTypes;\n    @PostConstruct()\n    init() : void {\n\n        const component : RenderTextComponentType = {\n            addOrRemoveCssClassName : (className : string) =>  this.addOrRemoveCssClassName(className),\n            getElement : () => this.getGui(),\n            getRootElement :()=>{return this.multiTags.textAreaElement} \n        }\n\n        const controller = this.createBean(new RenderMultilineRootController());\n\n        const props = {\n             label :  this.optionHandler.getLabel().length > 0,\n             helper :  this.optionHandler.getDescription().length > 0,\n             rtl :  this.optionHandler.isRTL(),\n        }\n\n\t\tconst properties = controller.getParamsProperty();\n        const emptyDom = this.shouldGenerateEmptyDom()\n\n        const template=  rootTemplate(props,emptyDom);\n        this.setTemplate(template,{\n            label : properties.label,\n\t\t\tdescription : properties.description\n        });\n\n        controller.setComponent(component);\n        this.appendElementIntoUserDom();\n    }\n    shouldGenerateEmptyDom(){\n\t\tconst generateEmptyDom = this.optionHandler.shouldGenerateEmptyDom();\n        return generateEmptyDom\n\t}\n\n    private addOrRemoveCssClassName(className : string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.componentHolder && this.componentHolder.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.componentHolder && this.componentHolder.removeChild(eGui);\n\t\t\tthis.componentHolder = null;\n\t\t});\n\t}\n\n}\n\nexport {\n    RenderMutliLineRootComponent\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME, setAriaDescribedBy, setAriaDisabled, setAriaLabel, setAriaLabelledBy, setAriaReadOnly, setAriaRequired } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { OwnerStateType } from \"../multiline-root/multiline-root-classes\";\nimport { getMutliLineUtilityClass } from \"../utility\";\n\nimport { MultilineOptionsHandlerTypes } from \"../model/multiline-options-handler.types\";\nimport { RenderMultilineCompType } from \"./render-multiline-textArea.types\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\nconst useUtilityClasses = (ownerState : OwnerStateType) => {\n\tconst slots = {\n\t\troot : {\n            slot     : 'input-wrapper',\n            modifiers: [\n                ownerState.disabled && 'disabled',\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots,getMutliLineUtilityClass);\n};\nclass RenderMultiLineController extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: MultilineOptionsHandlerTypes;\n    private component !: RenderMultilineCompType;\n    setComp(comp : RenderMultilineCompType ) {\n        this.component    = comp;\n        this.applyClasses();\n        this.setValue();\n        this.setAriaAttributes();\n        this.registerEventHandler();\n    }\n\n    private applyClasses() : void {\n        const ownerState    = this.getOwnerState();\n        const classes       = useUtilityClasses(ownerState);\n        this.component.addOrRemoveCSSClass(classes.root);\n        this.component.getElement().classList.add('dg-field__input-wrapper');\n\n    }\n\n    private getOwnerState() {\n\t\treturn {\n\t\t\tdisabled : this.optionHandler.isDisabled(),\n\t\t\treadonly : this.optionHandler.isReadOnly()\n\t\t}\n\t}\n\n    private registerEventHandler() {\n        const inputElement = this.component.getRootElement();\n        registerClipboardGuards(\n            inputElement,\n            () => this.optionHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n\n        const ownerState = this.getOwnerState();\n        if(ownerState.readonly || ownerState.disabled) {\n            return \n        }\n        \n        this.addListener(inputElement, 'blur', this.onBlur.bind(this));\n        this.addListener(inputElement, 'focus', this.onFocus.bind(this));\n    }\n\n    private setAccessibility() : void {\n        this.setAriaAttributes();\n        this.assignValueBoundaries();\n    }\n\n    private assignValueBoundaries() : void {\n        const spanELement     = this.component.getRootElement();\n        const minCount        = this.optionsHandler.getMinCount();\n        const maxCount        = this.optionsHandler.getMaxCount();\n        const defaultValue    = this.optionsHandler.getDefaultValue();\n        const isReadOnly      = this.optionsHandler.isReadOnly();\n        const isDisabled      = this.optionsHandler.isDisabled();\n        const wrapperElement  = this.component.getRootElement();\n    \n        spanELement.textContent = defaultValue;\n        minCount && (spanELement.dataset.minLength = minCount.toString());\n        (maxCount > minCount) && (spanELement.dataset.maxLength = maxCount.toString());\n    \n        if (maxCount > minCount && maxCount > 0) {\n            spanELement.dataset.maxLength = maxCount.toString();\n        }\n        \n        wrapperElement.classList.toggle('dg-input__status--disabled', isDisabled);\n        wrapperElement.classList.toggle('dg-text__status--disabled', isDisabled);\n        wrapperElement.classList.toggle('dg-text__status--read-only', isReadOnly);\n    }\n    \n\n\n    private setAriaAttributes() : void {\n        const element   = this.component.getRootElement();\n        setAriaDisabled(element, this.optionHandler.isDisabled());\n        setAriaReadOnly(element, this.optionHandler.isReadOnly());\n        setAriaRequired(element, this.optionHandler.isRequired());\n        setAriaLabel(element, this.optionHandler.getAriaLabel());\n        setAriaLabelledBy(element, this.optionHandler.getAriaLabelledby());\n        setAriaDescribedBy(element, this.optionHandler.getAriaDescribedby());\n\n       \n    }\n\n    private setValue() : void {\n        this.setAccessibility();\n    }\n\n    private onBlur(event: FocusEvent): void { \n        const rootElement = this.optionsHandler.api.getElement();\n        rootElement.classList.remove('dg-input__status--focus');\n        this.optionsHandler.onBlur(event);\n    }\n\n    private onFocus(event: FocusEvent): void {\n        const rootElement = this.optionsHandler.api.getElement();\n        rootElement.classList.add('dg-input__status--focus');\n        this.optionsHandler.onFocus(event);\n    }\n    \n    destroy(): void {\n        super.destroy();\n    }\n}\nexport {\n    RenderMultiLineController\n}","import { PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { RenderMultilineCompType } from \"./render-multiline-textArea.types\";\nimport { RenderMultiLineController } from \"./render-multiline-textArea-controller\";\n\nconst RenderTextAreaTag = 'renderTextAreaTag';\n\nconst TextAreaTemplate = () => {\n    const div = document.createElement(\"div\");\n    let textarea = document.createElement('span');\n    textarea.setAttribute('ref',RenderTextAreaTag);\n    textarea.classList.add(\"dg-text__input\");\n    textarea.classList.add(\"dg-field__input\");\n    div.appendChild(textarea);\n    return  div\n}\n\n\nclass RenderMultilineViewComponent extends Component {\n    constructor() {\n        super();\n        this.setTemplate(TextAreaTemplate())\n    }\n    @queryAssignedNodes(RenderTextAreaTag) private textAreaElement !: HTMLTextAreaElement;\n\n    @PostConstruct()\n    init() {\n        const comp : RenderMultilineCompType = {\n            getElement            : () => this.getGui(),\n            addOrRemoveCSSClass   : (className: string) => this.addOrRemoveCSSClass(className),\n            getRootElement        : () =>{ return this.textAreaElement }\n        }\n        const controller = this.createBean(new RenderMultiLineController());\n        controller.setComp(comp);\n    }\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n}\n\nexport {\n    RenderMultilineViewComponent\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../modules/CSSRegistry\";\n\nfunction getMutliLineUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n    const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n    return generateUtilityClass('text', slots.slot, slots.modifiers,globalNameSpace as string[]);\n  }\ninterface OwnerStateType {\n    selected: boolean;\n    disabled : boolean;\n    readonly : boolean;\n}\nfunction setFocusAtFirst(textareaElement : HTMLTextAreaElement | undefined) {\n    if (textareaElement) {\n        textareaElement.focus({ preventScroll: true });\n        textareaElement.setSelectionRange(0, 0);\n    }\n}\n\nfunction setFocusAtLast(textareaElement : HTMLTextAreaElement | undefined , scrollPrevented ?: boolean) {\n    if (textareaElement && textareaElement.value.length > 0) {\n        if(scrollPrevented){\n        textareaElement.focus({ preventScroll: true });\n        }\n        else{\n            textareaElement.focus();\n        }\n        textareaElement.setSelectionRange(textareaElement.value.length, textareaElement.value.length);\n    }\n}\nfunction selectAllText(textareaElement : HTMLTextAreaElement |  undefined) {\n    if (textareaElement && textareaElement.tagName === 'TEXTAREA') {\n        textareaElement.focus();\n        textareaElement.focus({ preventScroll: true });\n        textareaElement.select();\n    }\n}\n\nfunction getCapitalizedString(text :  string) : string {\n    return  text.split('\\n').map(line => line.split(' ').map(word => word ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : '' ).join(' ')).join('\\n');\n}\nfunction getFormattedText(value :  string,format ?: string) : string{\n    let text = value;\n    switch (format) {\n        case 'capitalize':\n            text = getCapitalizedString(text);\n            break;\n        case 'lower':\n            text = text.toLowerCase();\n            break;\n        case 'upper':\n            text = text.toUpperCase();\n            break;\n        case 'sentence':\n            text = text .split('\\n') .map(line => line ? line.charAt(0).toUpperCase() + line.slice(1).toLowerCase() : '' ) .join('\\n');\n            break;\n        case 'none':\n        default:\n            break;\n    }\n    return text;\n}\n\nfunction applyLineClamp(element : HTMLElement, lineClampValue :  number) {\n    const supportsLineClamp = 'webkitLineClamp' in document.documentElement.style;\n  \n    if (supportsLineClamp) {\n\n      element.style.display = '-webkit-box';\n      element.style.webkitBoxOrient = 'vertical';\n      element.style.webkitLineClamp = `${lineClampValue}`;\n      element.style.overflow = 'hidden';\n    } else {\n      const lineHeight = parseInt(window.getComputedStyle(element).lineHeight);\n      const maxHeight = lineHeight * lineClampValue;\n  \n      element.style.maxHeight = `${maxHeight}px`;\n      element.style.overflow = 'hidden';\n      element.style.display = 'block';\n  \n      const ellipsis = document.createElement('span');\n      ellipsis.textContent = '...';\n      element.appendChild(ellipsis);\n  \n      while (element.scrollHeight > element.offsetHeight) {\n        const text = element.innerText;\n        element.innerText = text.replace(/\\W*\\s(\\S)*$/, '...');\n      }\n    }\n  }\n\n\nfunction calculateMaxLines(spanElement :  HTMLElement) {\n    const computedStyles = window.getComputedStyle(spanElement);\n    const fontSize = parseFloat(computedStyles.fontSize);\n    const lineHeight = parseFloat(computedStyles.lineHeight) || fontSize * 1.2;\n    const containerHeight = spanElement.clientHeight;\n    const maxLines = Math.floor(containerHeight / lineHeight);\n    return maxLines;\n}\n\nfunction onElementAppended(targetElement : HTMLElement, callback : CallableFunction) : void {\n  const observer = new MutationObserver((mutations, observerInstance) => {\n\n    for (const mutation of mutations) {\n      for (const node of mutation.addedNodes) {\n        // Check if the node is the target or contains it\n        if (node === targetElement || node.contains(targetElement)) {\n          callback(targetElement);\n          observerInstance.disconnect(); // Stop observing after first match\n          return;\n        }\n      }\n    }\n  });\n\n  observer.observe(document.body, {\n    childList: true,\n    subtree: true\n  });\n}\n\nexport function onElementNodeAppended( element: HTMLElement, callback: (el: HTMLElement) => void ): void {\n  // Save original methods\n  const originalAppendChild = Node.prototype.appendChild;\n  const originalInsertBefore = Node.prototype.insertBefore;\n\n  // Called on each append/insert\n  function handleInsert(_parent: Node, child: Node) {\n    // Check if the appended node is the target or contains it\n    if (child === element || child.contains(element)) {\n      restore();        // Restore original methods (stop monkey patching)\n      callback(child as HTMLElement);  // Call the callback with the appended element\n    }\n  }\n\n  // Restore the original DOM insertion methods\n  function restore() {\n    Node.prototype.appendChild = originalAppendChild;\n    Node.prototype.insertBefore = originalInsertBefore;\n  }\n\n  // Monkey-patch appendChild\n  (Node as any).prototype.appendChild = function(this: Node, child: Node): Node {\n    const result = originalAppendChild.call(this, child);  // Append first\n    handleInsert(this, child);                            // Then call callback\n    return result;\n  };\n\n  (Node as any).prototype.insertBefore = function(this: Node, newNode: Node, referenceNode: Node | null): Node {\n    const result = originalInsertBefore.call(this, newNode, referenceNode);  // Insert first\n    handleInsert(this, newNode);                                             // Then callback\n    return result;\n  };\n}\n\n\n\nexport { \n    getMutliLineUtilityClass,\n    OwnerStateType,\n    setFocusAtFirst,\n    setFocusAtLast,\n    selectAllText,\n    getFormattedText,\n    calculateMaxLines,\n    applyLineClamp,\n    onElementAppended\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { BEAN_NAME } from \"@dg/corecomponent\";\nimport { Context } from \"@dg/corecomponent/Context.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { UserComponentRegistry } from '@dg/corecomponent/UserComponentRegistry.js';\nimport { IModule } from '../../core/modules.types';\nimport { MultilineOptionHandler } from \"./core/model/multiline-option-handler\";\nimport { Label } from \"../../label/label-view\";\nimport { DescriptionComponent } from \"../../description/description-view\";\nimport { MultilineStateManager } from \"./core/model/multiline-state-manager\";\nimport { MultilineViewComponent } from \"./core/multiline-textArea/multiline-textArea-view\";\nimport { IMultilineConfiguration } from \"./multiline-configuration.types\";\nimport { MultiLineUserComponentHandler } from \"./core/model/multiline-user-component-handler\";\nimport { MultiLineAPI } from \"./core/model/multiline-api\";\nimport { MultilineControllerHandler } from \"./core/model/multiline-controller\";\nimport { RenderMultilineViewComponent } from \"./core/render-multiline-textArea/render-multiline-textArea-view\";\nimport { ErrorComponent } from \"../../error/error-view\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\n\n\n\ninterface IUserParams {\n\tglobalEventListener      ?: Function;\n\tframeworkOverrides       ?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n\tmodules                  ?: IModule[];\n}\n\nexport const enum PropertyName {\n\tText_RENDERER = 'textRenderer',\n}\nlet nextInstanceId = 1;\n\nclass  MultilineCoreComponent {\n    constructor(){\n\n    }\n    initializeText( configuration: IMultilineConfiguration, params: IUserParams = {}, createUI: CallableFunction, ): void {\n\t\tconst instanceID = configuration?.instanceID ?? String(nextInstanceId++);\n\n\t\tconst beanClasses = this.CreateBeanClasses();\n\n\t\tconst context = new Context();\n\n\t\tconst userConfigurations = this.createuserConfiguration(\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t\tinstanceID\n\t\t);\n\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n\n\t\t\n\t\tthis.registerCoreComponent(context);\n\t\tcreateUI(context);\n\n\t\t(window as any).context = context;\n\n    }\n\tprivate CreateBeanClasses(): Set<any> {\n\t\tconst beanList= [\n\t\t\tComponentsRegistry,\n\t\t\tUserComponentRegistry,\n\t\t\tEventHandler,\n\t\t\tMultilineOptionHandler,\n\t\t\tMultilineStateManager,\n\t\t\tMultiLineUserComponentHandler,\n\t\t\tMultiLineAPI,\n\t\t\tMultilineControllerHandler,\n\t\t\tComponentMetadataProvider\n\t\t]\n\t\treturn new Set(beanList);\n\t}\n\tprivate createuserConfiguration( configuration: any, params: IUserParams, instanceID : string): { configuration: any; frameWorkOverrides: IFrameworkOverrides | null; globalEventListener: Function | null; frameworkComponentWrapper: any | null; instanceID : string; } {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n\n\tprivate registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nfunction createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n        {\n\t\t\tcomponentName: 'text-label',\n\t\t\tcomponentClass: Label\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'text-helper',\n            componentClass : DescriptionComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName :'text-area-element',\n\t\t\tcomponentClass : MultilineViewComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName :'render-text-area-element',\n\t\t\tcomponentClass : RenderMultilineViewComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName : 'multiline-error',\n\t\t\tcomponentClass : ErrorComponent\n\t\t}\n    ];\n\n\treturn components;\n}\n\nexport { \n    MultilineCoreComponent,\n    IUserParams,\n    createComponentList\n\n}","\nimport { IClipboard } from \"../../utility/clipboard\";\n\nconst multiLineFormatter ={\n    none   : \"none\" ,\n    capitalize : \"capitalize\" ,\n    lower : \"lower\" ,\n    upper : \"upper\" ,\n    sentence : \"sentence\"\n}\n\n\ninterface IResizable {\n    resizable?: 'horizontal' | 'vertical' | 'both' | 'none';\n}\n\ninterface ISize {\n    size ?: 'xs' | 'sm' | 'md' | 'lg'\n}\n\nexport interface IRenderer {\n\tgetElement()       : HTMLElement;\n\tinit(params:object): void;\n\tdestroy()          : void;\n}\n\n\ninterface IMultilineConfiguration {\n    appendTo      ?: HTMLElement,\n    instanceID ?  : string,\n    min ?    : number,\n    max ?    : number,\n\n    clampValueOnBlur  ? : boolean,\n    keepWithInRange ?   : boolean,\n    showTotal ?         : boolean,\n    // lineClampValue ?    : number\n\n    onChange ?            : CallableFunction,\n    onInput ?             : CallableFunction,\n    onFocus ?             : CallableFunction,\n    onBlur ?              : CallableFunction,\n    onKeydown           ? : CallableFunction,\n    onError             ?:  CallableFunction,\n\n    description ?    : string,\n    addonBefore  ?  : string |  number,\n    addonAfter  ?   : string |  number,\n    clearButton ?   : boolean |  string | HTMLElement,\n    bordered ?        : 'none' | 'outline' | 'standard' | 'filled',\n    pattern  ?        : RegExp | 'url' |  'email',\n\n    characterCase ?   : string,\n    format ?          : string,\n    label ?           : string,\n    ariaLabelledBy ?  : string,\n    ariaRole ?        : string,\n\n    invalidHelperTextRendererParams ?   : any,\n    invalidHelperTextRenderer ?         : any;\n    helperTextRendererParams ?          : any;\n    helperTextRenderer ?                : any;\n    ariaDescribedby  ?                  : string\n    // className ?: , // need to discuss\n   \n\n     // commmon API's \n     value             ?: string , // need to discuss\n    //  defaultValue      ?: string,\n     readonly          ?: boolean,\n     disabled          ?: boolean,\n     size              ?: ISize,\n     validator         ?: CallableFunction,\n     validationMessage ?: string,\n     required          ?: boolean,\n     name              ?: string,\n     allowNull         ?: boolean, // need to discuss\n     placeholder       ?: string,\n     title             ?: string,\n \n     ariaLabel            ?: string,\n     prefix               ?: boolean |  string | HTMLElement,\n     prefixRenderer       ?: CallableFunction,\n     prefixRendererParams ?: object,\n     suffix               ?: boolean |  string | HTMLElement,\n     suffixRenderer       ?: CallableFunction,\n     suffixRendererParams ?: object,\n \n     // descriptionRenderer ?: { new(): IRenderer }; // need to discuss\n     descriptionRendererParams       ?: object,\n     validationMessageRenderer    ?: { new(): IMultilineErrorRenderer }; // need to discuss\n     validationMessageRendererParams ?: object,\n     className                       ?: string[] | CallableFunction,   // need to discuss\n\n\n     rtl ?: boolean,\n\n    // Multi Line Component Based API //\n    maxlength ?: number,\n    rows ? :number,\n    columns ?:  number,\n    resizable ?: IResizable,\n\n     // Events API's\n    onResizeStart ?: CallableFunction,\n    onResize ? : CallableFunction,\n    onResizeEnd ?: CallableFunction,\n\n    ignoreEmptyDOM ?: boolean,\n    autosize ?: boolean,\n\n    hasDynamicHeight ?: boolean,\n\n    showErrorState?: boolean;\n    status        ?: 'error' | \"none\" | 'warning';\n\n    labelRenderer ?: { new(): IRenderer } | undefined;\n    labelRendererParams ?: object;\n\n    clipboard ?: IClipboard | boolean;\n    \n\n}\nconst multilinePropeties = [\n    'appendTo',\n    'instanceID',\n    'min',\n    'max',\n    'clampValueOnBlur',\n    'keepWithInRange',\n    'showTotal',\n    'onChange',\n    'onInput',\n    'onFocus',\n    'onBlur',\n    'onKeydown',\n    'description',\n    'addonBefore',\n    'addonAfter',\n    'clearButton',\n    'bordered',\n    'pattern',\n    'status',\n    'characterCase',\n    'format',\n    'label',\n    'ariaLabelledBy',\n    'ariaRole',\n    'invalidHelperTextRendererParams',\n    'invalidHelperTextRenderer',\n    'helperTextRendererParams',\n    'helperTextRenderer',\n    'ariaDescribedby',\n    'value',\n    'readonly',\n    'disabled',\n    'size',\n    'validator',\n    'validationMessage',\n    'required',\n    'name',\n    'allowNull',\n    'placeholder',\n    'title',\n    'ariaLabel',\n    'prefix',\n    'prefixRenderer',\n    'prefixRendererParams',\n    'suffix',\n    'suffixRenderer',\n    'suffixRendererParams',\n    'descriptionRendererParams',\n    'validationMessageRendererParams',\n    'className',\n    'rtl',\n    'maxlength',\n    'rows',\n    'columns',\n    'resizable',\n    'onResizeStart',\n    'onResize',\n    'onResizeEnd',\n    'autosize',\n    'labelRenderer',\n    'labelRendererParams',\n    'clipboard'\n]\n\nexport interface IMultilineErrorRenderer {\n\tgetElement()       : HTMLElement;\n\tinit(params:object): void;\n\tdestroy()          : void;\n}\nexport {\n    IMultilineConfiguration,\n    multiLineFormatter,\n    multilinePropeties\n}","import { Context } from \"@dg/corecomponent/Context.js\";\n\nimport  {IMultilineAPI} from \"./core/model/multiline-api.types\"\nimport { MutliLineRootComponent } from \"./core/multiline-root/multiline-root-view\";\nimport { IMultilineConfiguration } from \"./multiline-configuration.types\";\nimport { IUserParams, MultilineCoreComponent } from \"./multi-core-component\";\nimport { MULTI_TEXT_BEAN_NAME } from \"./constants/beanname-constants\";\nimport { RenderMutliLineRootComponent } from \"./core/render-multiline-root/render-multiline-root-view\";\n\nclass MultilineComponent {\n\tpublic api: IMultilineAPI | undefined;\n    constructor(configuration: IMultilineConfiguration, params?: IUserParams){\n        if(configuration == undefined){return};\n        const createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(MULTI_TEXT_BEAN_NAME.MULTI_LINE_API) as IMultilineAPI;\n            context.createBean(new MutliLineRootComponent(configuration?.appendTo));\n\t\t};\n\t\tnew MultilineCoreComponent().initializeText(configuration, params, createUI);\n    }\n}\n\nclass RenderMultilineComponent {\n\tpublic api: IMultilineAPI | undefined;\n    constructor(configuration: IMultilineConfiguration, params?: IUserParams){\n        if(configuration == undefined){return};\n        const createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(MULTI_TEXT_BEAN_NAME.MULTI_LINE_API) as IMultilineAPI;\n            context.createBean(new RenderMutliLineRootComponent(configuration?.appendTo));\n\t\t};\n\t\tnew MultilineCoreComponent().initializeText(configuration, params, createUI);\n    }\n}\n\nexport { \n    MultilineComponent,\n    RenderMultilineComponent\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./modules/CSSRegistry\";\n\nfunction getPrefixUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('field__prefix-element', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\n\nexport {\n  getPrefixUtilityClass\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME,  } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { IPrefixComponent, IPrefixUserComponentHandler } from \"./prefix-view.types\";\nimport { getPrefixUtilityClass } from \"./prefix-classes\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: '',\n\t\t\tmodifiers: [\n                // inValid && 'error'\n            ],\n\t\t},\n\t};\n    return composeClasses(slots, getPrefixUtilityClass);\n};\nclass PrefixController extends EventEmitter {\n    private component!: IPrefixComponent;\n\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: IPrefixUserComponentHandler;\n\n    setComp(component : IPrefixComponent) {\n        this.component = component;\n\n        this.setRendererDetails();\n        this.applyClasses();\n\n        // this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", this.refresh.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_FOCUS_OUT\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_VALUE_UPDATE\", this.setRendererDetails.bind(this));\n        \n\n    }\n\n\n    private applyClasses(){\n        const classes = useUtilityClasses();\n        const params = this.component.getParams();\n        const prefix = this.optionsHandler.getPrefixValue() || this.optionsHandler.getPrefixRenderer();\n\n        if(params){\n            const userClasses = typeof params.getUserClasses === \"function\" ? params.getUserClasses() : \"\";\n            userClasses ? classes.root = classes.root + \" \" + userClasses : \"\";\n        }\n        this.component.addClassName(classes.root);\n        !prefix ? this.component.getElement().style.display = \"none\" : this.component.getElement().style.display = \"flex\" ;\n\n    }\n\n    setRendererDetails() : void {\n        const rendererWrapper = this.createPrefixRendererWrapper();\n        const params : any    = this.createPrefixRendererParams();\n        const userDetails     = this.userComponentHandler.getPrefixRendererDetails(rendererWrapper, params) as IComponentDetails;\n        if(userDetails) {\n            this.component.setRendererDetails(userDetails, params.value);\n        }\n        this.setAccessibility();\n\n    }\n\n    private setAccessibility() : void {\n        const element = this.component.getElement();\n        const prefixValue = this.optionsHandler.getPrefixValue();\n        // element.textContent = prefixValue;\n        const isElement =  prefixValue instanceof HTMLElement;\n        isElement ? element.appendChild(prefixValue)  : element.textContent = prefixValue;\n    }\n\n     private createPrefixRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionsHandler.getPrefixRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionsHandler.getPrefixRendererParams(),\n\t\t};\n    }\n\n     private createPrefixRendererParams() {\n        return {\n\t\t\tvalue: this.optionsHandler.getPrefixValue(),\n\t\t};\n    }\n\n\n    refresh() {\n        this.setRendererDetails();\n        this.applyClasses();\n    }\n}\n\nexport {\n    PrefixController\n}","import {  clearElement, PostConstruct, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\nimport { IPrefixComponent } from \"./prefix-view.types\";\nimport { PrefixController } from \"./prefix-controller\";\n\n\n\n\nconst prefixTemplate = () => {\n\t// const div = document.createElement(\"div\");\n\t// div.innerHTML = `<div></div>`;\n\t// return div.firstChild as HTMLElement;\n\treturn document.createElement(\"div\");\n}\n\nexport function escapeString(toEscape?: string | null, skipHtmlChars?: boolean): string | null {\n\n\t const escapeMap: { [key: string]: string } = {\n\t\t\t'&': '&amp;',\n\t\t\t'<': '&lt;',\n\t\t\t'>': '&gt;',\n\t\t\t'\"': '&quot;',\n\t\t\t\"'\": '&#39;', \n\t\t};\n\n    if (toEscape == null) {\n        return null;\n    }\n\n    const stringResult = toEscape.toString().toString();\n\n    if (skipHtmlChars) {\n\t\treturn stringResult;\n\t}\n\n    return stringResult.replace(/[&<>\"']/g, (chr) => escapeMap[chr]);\n}\nclass PrefixComponent extends Component {\n\n\tprivate renderer       : any;\n\tprivate rendererElement: any;\n\tprivate params :any\n\n\tconstructor(params:any){\n\t\tsuper()\n\t\tthis.params = params;\n\n\t}\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst template = prefixTemplate();\n\t\tthis.setTemplate(template);\n\n\t\tconst comp: IPrefixComponent = {\n\t\t\tsetRendererDetails: (rendererDetails: IComponentDetails, value : string) => this.setRendererDetails(rendererDetails , value),\n\t\t\taddOrRemoveCSSClass : (className : string, addOrRemove : boolean) => this.addOrRemoveCssClass(className, addOrRemove),\n            addClassName        : (className : string) => this.addOrRemoveCssClass(className, true),\n\n\t\t\tgetElement : () => this.getGui(),\n\t\t\tgetParams :()=> this.params,\n\n\t\t};\n\n\t\tconst controller = this.createBean(new PrefixController());\n\t\tcontroller.setComp(comp);\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className\n\t}\n    private  setRendererDetails(rendererDetails : IComponentDetails, value : string){\n\t\tif(rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.insertValueWithoutCellRenderer(value)\n\t\t}\n        \n    }\n\n\tprivate insertValueWithoutCellRenderer(value : string) {\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\n\t\tconst escapedValue = value != null ? escapeString(value) : null;\n\t\tif (escapedValue != null) {\n\t\t\tparentElement.innerHTML = escapedValue;\n\t\t}\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\tprivate destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n}\n\n\nexport { \n    PrefixComponent\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./modules/CSSRegistry\";\n\nfunction getSuffixUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('field__suffix-element', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\n\nexport {\n  getSuffixUtilityClass\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME,  } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { ISuffixComponent, ISuffixUserComponentHandler } from \"./suffix-view.types\";\nimport { getSuffixUtilityClass } from \"./suffix-classes\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\n\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: '',\n\t\t\tmodifiers: [\n                // inValid && 'error'\n            ],\n\t\t},\n\t};\n    return composeClasses(slots, getSuffixUtilityClass);\n};\nclass SuffixController extends EventEmitter {\n    private component!: ISuffixComponent;\n\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: ISuffixUserComponentHandler;\n\n    setComp(component : ISuffixComponent) {\n        this.component = component;\n\n        this.setRendererDetails();\n        this.applyClasses();\n\n        this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", this.refresh.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_FOCUS_OUT\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_VALUE_UPDATE\", this.setRendererDetails.bind(this));\n        \n\n    }\n\n\n    private applyClasses(){\n        const classes = useUtilityClasses();\n        const params = this.component.getParams();\n        const suffixValue = this.optionsHandler.getSuffixValue() || this.optionsHandler.getSuffixRenderer();\n\n        if(params){\n            const userClasses = typeof params.getUserClasses === \"function\" ? params.getUserClasses() : \"\";\n            userClasses ? classes.root = classes.root + \" \" + userClasses : \"\";\n        }\n        this.component.addClassName(classes.root);\n        !suffixValue ? this.component.getElement().style.display = \"none\" : this.component.getElement().style.display = \"flex\" ;\n\n\n    }\n\n    setRendererDetails() : void {\n           const rendererWrapper = this.createSuffixRendererWrapper();\n           const params : any    = this.createSuffixRendererParams();\n           const userDetails     = this.userComponentHandler.getSuffixRendererDetails(rendererWrapper, params) as IComponentDetails;\n           if(userDetails) {\n               this.component.setRendererDetails(userDetails, params.value);\n           }\n           this.setAccessibility();\n   \n       }\n\n    private createSuffixRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionsHandler.getSuffixRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionsHandler.getSuffixRendererParams(),\n\t\t};\n    }\n\n     private createSuffixRendererParams() {\n        return {\n\t\t\tvalue: this.optionsHandler.getSuffixValue(),\n\t\t};\n    }\n    private setAccessibility() : void {\n        const element = this.component.getElement();\n        const suffixValue = this.optionsHandler.getSuffixValue();\n        const isElement =  suffixValue instanceof HTMLElement;\n        isElement ? element.appendChild(suffixValue)  : element.textContent = suffixValue;\n        // element.textContent = suffixValue;\n    }\n\n    createHelperTextRendererParams() {\n        return {\n            value : this.optionsHandler.getDescription()\n        }\n    }\n\n    refresh() {\n        this.setRendererDetails();\n        this.applyClasses();\n    }\n}\n\nexport {\n    SuffixController\n}","import {  clearElement, PostConstruct, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\nimport { ISuffixComponent } from \"./suffix-view.types\";\nimport { SuffixController } from \"./suffix-controller\";\n\n\n\n\nconst suffixTemplate = () => {\n\t// const div = document.createElement(\"div\");\n\t// div.innerHTML = `<div></div>`;\n\t// return div.firstChild as HTMLElement;\n\n\treturn document.createElement(\"div\");\n}\nexport function escapeString(toEscape?: string | null, skipHtmlChars?: boolean): string | null {\n\n\t const escapeMap: { [key: string]: string } = {\n\t\t\t'&': '&amp;',\n\t\t\t'<': '&lt;',\n\t\t\t'>': '&gt;',\n\t\t\t'\"': '&quot;',\n\t\t\t\"'\": '&#39;', \n\t\t};\n\n    if (toEscape == null) {\n        return null;\n    }\n\n    const stringResult = toEscape.toString().toString();\n\n    if (skipHtmlChars) {\n\t\treturn stringResult;\n\t}\n\n    return stringResult.replace(/[&<>\"']/g, (chr) => escapeMap[chr]);\n}\nclass SuffixComponent extends Component {\n\n\tprivate renderer       : any;\n\tprivate rendererElement: any;\n\tprivate params :any\n\n\tconstructor(params:any){\n\t\tsuper()\n\t\tthis.params = params;\n\n\t}\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst template = suffixTemplate();\n\t\tthis.setTemplate(template);\n\n\t\t\n\t\tconst comp: ISuffixComponent = {\n\t\t\tsetRendererDetails: (rendererDetails: IComponentDetails, value : string) => this.setRendererDetails(rendererDetails , value),\n\t\t\taddOrRemoveCSSClass : (className : string, addOrRemove : boolean) => this.addOrRemoveCssClass(className, addOrRemove),\n            addClassName        : (className : string) => this.addOrRemoveCssClass(className, true),\n\n\t\t\tgetElement : () => this.getGui(),\n\t\t\tgetParams :()=> this.params,\n\n\t\t};\n\n\n\t\tconst controller = this.createBean(new SuffixController);\n\t\tcontroller.setComp(comp);\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className\n\t}\n     private  setRendererDetails(rendererDetails : IComponentDetails, value : string){\n\t\tif(rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.insertValueWithoutCellRenderer(value)\n\t\t}\n        \n    }\n\n\tprivate insertValueWithoutCellRenderer(value : string) {\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\n\t\tconst escapedValue = value != null ? escapeString(value) : null;\n\t\tif (escapedValue != null) {\n\t\t\tparentElement.innerHTML = escapedValue;\n\t\t}\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\tprivate destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n}\n\n\nexport { \n    SuffixComponent\n}","const TEXT_BEAN_NAME = {\n\tTEXT_API: 'TextAPI',\n\tTEXT_CONFIGURATION: 'configuration',\n\tCSSCLASSNAMEGENERATOR: 'CSSClassNameGenartor',\n\tTEXT_ADJUSTER_HANDLER: 'TextAdjusterHandler',\n\tFORMATTER: 'formatter',\n\tKEYBOARD_SHORTCUT_HANDLER: 'KeyBoardShortCutsHandler',\n\tTEXT_EVENT_HANDLER: 'TextEventHandler',\n\tTEXT_CONTROLLER_HANDLER: 'TextControllerHandler',\n}\nexport {\n    TEXT_BEAN_NAME\n}","const PHONE_NUMBER_FORMATS = {\n    1: '+xx xxxxx xxxxx',\n    2: '+xx-xxxxx-xxxxx',\n    3: '+xx xxx xxx xxxx',\n    4: '+xx-xxx-xxx-xxxx',\n    5: 'xxxxx xxxxx',\n    6: 'xxxxx-xxxxx',\n    7: 'xxx xxx xxxx',\n    8: 'xxx-xxx-xxxx',\n    9: 'xxx xxx-xxxx',\n    10: '(xxx) xxx-xxxx',\n    11: 'xxxxxxxxxx'\n};\n\nconst DELIMITERS = {\n    PLUS: '+',\n    SPACE: ' ',\n    HYPHEN: '-',\n    OPEN_BRACKET: '(',\n    CLOSE_BRACKET: ')',\n    EMPTY: ''\n};\n\n\nfunction validateAndFormatPhoneNumber(value : string, formatKey : any) {\n    value = value.toString().trim();\n    let format = formatKey;\n    if (typeof formatKey === 'number') {\n        format = (PHONE_NUMBER_FORMATS as any)[formatKey];\n    }\n\n    if (!format) {\n        throw new Error(`Invalid format key: ${formatKey}`);\n    }\n\n    const digits = value.replace(/\\D/g, '');\n\n    const formatDigits = format.replace(/[^x]/g, '');\n\n    if (digits.length > formatDigits.length) {\n        return null;\n    }\n\n    let formattedValue = '';\n    let digitIndex = 0;\n\n    if(formatDigits.length != digits.length) {\n        return value;\n    }\n\n    for (const char of format) {\n        if (char === 'x' && digitIndex < digits.length) {\n            formattedValue += digits[digitIndex++];\n        } else if (char !== 'x') {\n            formattedValue += char;\n        }\n    }\n\n    return formattedValue;\n}\nfunction reverseFormat(formattedValue: string, format: string): string {\n    const actualValue: string[] = [];\n    let formatIndex = 0;\n\n    for (const char of formattedValue) {\n        while (format[formatIndex] && format[formatIndex] !== 'x') {\n            formatIndex++;\n        }\n        if (format[formatIndex] === 'x') {\n            actualValue.push(char); \n            formatIndex++;\n        }\n    }\n\n    return actualValue.join('');\n}\n\nfunction removeSpecialCharsFromNumber(input : any) {\n    const inputString = String(input);\n    return inputString.replace(/[^\\d]/g, \"\");\n  }\n\n\nexport {\n    PHONE_NUMBER_FORMATS,\n    DELIMITERS,\n    validateAndFormatPhoneNumber,\n    reverseFormat,\n    removeSpecialCharsFromNumber\n}\n\n\n","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport {EventEmitter}from '@dg/corecomponent/EventEmitter.js';\nimport { TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { ITextConfiguration } from \"../../text-configuration.types\";\nimport { TextControllerHandler } from \"./text-controller\";\nimport { ITextAPI } from \"./text-api.types\";\nimport { TextOptionsHandlerTypes } from \"./text-options-handler.types\";\nimport { selectAllText, setFocusAtFirst, setFocusAtLast } from \"../utility\";\nimport type { TextStateManager } from \"./text-state-manager\";\n\n\n\n@Bean(TEXT_BEAN_NAME.TEXT_API)\nexport class TextAPI extends EventEmitter implements ITextAPI{\n   \n    @AutoWired('configuration') configuration !: ITextConfiguration;\n    @AutoWired(TEXT_BEAN_NAME.TEXT_CONTROLLER_HANDLER) controllerHandler !: TextControllerHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: TextOptionsHandlerTypes;\n    @AutoWired('stateManager') private stateManager !: TextStateManager;\n\n\n    getName() { return TEXT_BEAN_NAME.TEXT_API};\n\n    updateProperties(options : ITextConfiguration) {\n        this.controllerHandler.getTextCtrl().updateProperty(options);\n    }\n\n    getElement() : HTMLElement | undefined{\n        return this.controllerHandler.getTextCtrl().getElement();\n    }\n\n    getValue(){\n        return this.controllerHandler.getTextCtrl().getValue();\n\n    }\n    getMaxCount(): number | null {\n        return this.optionHandler.getMaxCount();\n    }\n    getMinCount(): number {\n        return this.optionHandler.getMinCount();\n    }\n    getRootElement(){\n        return  this.controllerHandler.getTextCtrl().getRootElement();\n    }\n    setFocusAtFirst(): void {\n        setFocusAtFirst(this.getRootElement());\n    }\n    setFocusAtLast(): void {\n        setFocusAtLast(this.getRootElement());\n    }\n    selectAllText(): void {\n        selectAllText(this.getRootElement());\n    }\n\n    onFocus(): void {\n       this.getElement()?.focus();\n    }\n    onBlur(): void {\n        this.getElement()?.blur();\n    }\n\n    focus(): void {\n        this.getRootElement()?.focus();\n    }\n    blur(): void {\n        this.getRootElement()?.blur();\n    }\n\n    destroy(): void {\n        const rootElement = this.getRootElement();\n        if(rootElement){\n            const newElement = rootElement.cloneNode(true);\n            rootElement.parentNode?.replaceChild(newElement, rootElement);\n        }\n        this.getElement()?.remove();\n    }\n    setValue(value: string | number): void {\n        const oldValue = this.optionHandler.getValue();\n        if(oldValue !== value) {\n            this.controllerHandler.getTextCtrl().setValue(value);\n            this.optionHandler.onChange(oldValue , value as string, 'api');\n        }\n    }\n    disable(value: boolean): void {\n        this.controllerHandler.getTextCtrl().disable(value ?? true);\n    }\n    resetValue(): void {\n        this.controllerHandler.getTextCtrl().resetValue()\n    }\n    hide(subElements ?: string[]): void {\n        this.controllerHandler.getTextCtrl().hide(subElements);\n    }\n    show(subElements ?: string[]): void {\n        this.controllerHandler.getTextCtrl().show(subElements);\n    }\n    clear(): void {\n        this.controllerHandler.getTextCtrl().clear();\n    }\n\n\n    isValid(): boolean {\n       return !this.stateManager.isInValid();\n    }\n    getFormattedValue() : string {\n        return this.controllerHandler.getTextCtrl().getFormattedValue();\n    }\n\n    showErrorMessage(message ?: string): void {\n        message && this.optionHandler.updateValidationMessage(message);\n        this.optionHandler.updateStatus('error');\n    }\n\n    hideErrorMessage(): void {\n        this.optionHandler.updateValidationMessage(\"\");\n        this.optionHandler.updateStatus(\"none\");\n    }\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Bean } from \"@dg/corecomponent\";\n\nimport { TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { TextRootController } from \"../text-root/text-root-controller\";\nimport { RenderingTextRootController } from \"../rendering-text-root/rendering-text-root-controller\";\n\n\n@Bean(TEXT_BEAN_NAME.TEXT_CONTROLLER_HANDLER)\nclass TextControllerHandler extends EventEmitter {\n\tprivate textCtrl!: TextRootController  | RenderingTextRootController;\n\tregisterTextCtrl(textCtrl: TextRootController | RenderingTextRootController): void {\n\t\tthis.textCtrl = textCtrl;\n\t}\n\n\tgetTextCtrl(): TextRootController | RenderingTextRootController {\n\t\treturn this.textCtrl;\n\t}\n}\n\nexport {\n    TextControllerHandler\n}","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ICustomReggexType, IErrorMeta, IInputMeta, TextOptionsHandlerTypes } from \"./text-options-handler.types\";\nimport { configArray, IRenderer, ITextConfiguration, IOnChangeEventParams } from \"../../text-configuration.types\";\nimport { TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { ITextAPI } from \"./text-api.types\";\nimport { getFormattedValue } from \"../utility\";\nimport { ClipboardConfig } from \"../../../../utility/clipboard\";\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nclass TextOptionHandler extends EventEmitter implements TextOptionsHandlerTypes{\n \n  \n    @AutoWired(TEXT_BEAN_NAME.TEXT_CONFIGURATION) configuration !: ITextConfiguration;\n\t@AutoWired(TEXT_BEAN_NAME.TEXT_API) api!: ITextAPI;\n\n    isDisabled(): boolean {\n        return this.configuration.disabled ?? false;\n    }\n    isSelected(): boolean {\n       return false\n    }\n    isReadOnly(): boolean {\n        return this.configuration.readonly ?? false;\n    }\n    getLabel(): string {\n        return this.configuration.label ?? \"\";\n    }\n\n    getAriaLabelledby(){\n        return this.configuration.ariaLabelledBy ?? \"\";\n    }\n\n    getAriaLabel(): string {\n        return this.configuration.ariaLabel ?? \"\";\n    }\n    onFocus(event: FocusEvent): void  {\n        this.configuration.onFocus?.(event);\n    }\n    onBlur(event: FocusEvent): void {\n        this.configuration.onBlur?.(event);\n    }\n    \n    getAppendTo(): HTMLElement  | null{\n        return this.configuration.appendTo ?? null\n    }\n    getVariant() {\n       return this.configuration.bordered ?? 'none'\n    }\n\n    isRequired(): boolean {\n        return this.configuration.required ?? false;\n    }\n    getMinCount() :  number{\n        return  this.configuration.min?? 0\n    }\n    getMaxCount() :  number | null {\n        return this.configuration.max ??  null;\n    }\n\n    getDefaultValue(): string {\n        return this.configuration.value ?? \"\"\n    }\n    getPlaceHolder(): string {\n        return this.configuration.placeholder ?? \"\";\n    }\n\n    onInput(eventMeta : IInputMeta): void {\n        this.configuration.onInput?.(eventMeta);\n    }\n\n    onError(errorMeta: IErrorMeta): void {\n        this.configuration.onError?.(errorMeta)\n    }\n\n    onKeydown(event: KeyboardEvent): void {\n        this.configuration.onKeyDown?.(event)\n    }\n\n\n    onChange(oldValue :  string , newValue :  string, eventOrigin ?: 'api' | 'ui') {\n        if (this.configuration.onChange) {\n            const params: IOnChangeEventParams = {\n                oldValue,\n                newValue,\n                eventOrigin\n            };\n            if (this.configuration.onChange.length === 1) {\n                (this.configuration.onChange as (params: IOnChangeEventParams) => void)(params);\n            } else {\n                (this.configuration.onChange as (oldValue: string, newValue: string, eventOrigin?: 'api' | 'ui') => void)(params.oldValue, params.newValue, params.eventOrigin);\n            }\n        }\n    }\n    \n    getDescription() :string {\n        return this.configuration.description ?? \"\";\n    }\n    getDescriptionRenderer() {\n        return this.configuration.descriptionRenderer ?? '';\n    }\n    getDescriptionRendererParams() {\n        return this.configuration.descriptionRendererParams ?? '';\n    }\n    getValidationMessage(): string {\n        return this.configuration.validationMessage ?? '';\n    }\n    getAriaDescribedby(): string {\n        return this.configuration.ariaDescribedby ?? '';\n    }\n    showTotal(): boolean {\n        return this.configuration.showCount ?? false;\n    }\n    getFormat(): string {\n        return this.configuration.format ?? 'none';\n    }\n\n    setMaxCount(maxCount: number): void {\n        this.configuration.max= maxCount;\n    }\n   \n    isRTL(): boolean {\n        return this.configuration.rtl ?? false;\n    }\n\n    updateTextValue(value: string | number): void {\n        if(this.configuration?.format !== 'none' && (this.configuration.defaultValue?.length != value.toString().length)){\n            this.configuration.defaultValue = value.toString();\n        }\n        this.configuration.value = this.configuration?.format ? getFormattedValue(value.toString(), this.configuration.format): value.toString();\n        this.dispatchEvent({\n            type : 'EVENT_VALUE_UPDATE'\n        })\n    }\n\n    getValue(): string {\n        return this.configuration.value ?? \"\";\n    }\n    setDisabled(value: boolean): void {\n        this.configuration.disabled = value;\n    }\n    getPrefixValue(): string | number | HTMLElement | null {\n        const prefix = this.configuration.prefix;\n    \n        switch (typeof prefix) {\n            case 'boolean':\n                return prefix ? 'PR' : '';\n            case 'string':\n                return prefix;\n            default:\n                if (prefix instanceof HTMLElement) {\n                    return prefix;\n                } else {\n                    return '';\n                }\n        }\n    }\n    getSuffixValue(): string | number | HTMLElement | null{\n        const suffix = this.configuration.suffix;\n    \n        switch (typeof suffix) {\n            case 'boolean':\n                return suffix ? 'SR' : '';\n    \n            case 'string':\n                return suffix;\n    \n            default:\n                if (suffix instanceof HTMLElement) {\n                    return suffix;\n                } else {\n                    return '';\n                }\n        }\n    }\n\n     getPrefixRenderer(): { new(): IRenderer } | undefined {\n            return this.configuration.prefixRenderer;\n    }\n\n    getPrefixRendererParams(): object | undefined {\n        return this.configuration.prefixRendererParams;\n    }\n\n    getSuffixRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.suffixRenderer;\n    }\n\n    getSuffixRendererParams(): object | undefined {\n        return this.configuration.suffixRendererParams;\n    }\n    \n    isPrefixRenderer(): boolean {\n        return Boolean(this.configuration.prefix)\n    }\n    isSuffixRenderer(): boolean {\n        return Boolean(this.configuration.suffix)\n    }\n    updateProperty(options: ITextConfiguration) {\n        const userProperty = Object.keys(options);\n        for(let i = 0; i < userProperty.length; i++){\n            const userKey = userProperty[i]\n            const isValidProperty = configArray.includes(userKey);\n            if(isValidProperty ||  userKey == 'format'){\n                if(userKey === 'value' && (this.configuration as any)[userKey] !== (options as any)[userKey]) {\n                    this.onChange(this.getValue(), (options as any)[userKey] as string, 'api');\n                }\n                (this.configuration as any)[userKey] = userKey === 'value' ? (options as any)[userKey] : (options as any)[userKey];\n            }  else {\n                console.warn(`Invalid property ${userKey} in options. Ignoring.`);\n            }\n        }\n    }\n\n    getPattern(): RegExp | ICustomReggexType | null {\n        return this.configuration.pattern ?? null;\n    }\n\n    getCustomPattern(): string | null {\n        return this.configuration?.customPattern ?? null;\n    }\n\n    getClassName(): string | string[] | null {\n        return this.configuration?.className ?? null;\n    }\n\n    shouldGenerateEmptyDom(): boolean {\n        return this.configuration?.ignoreEmptyDOM !== undefined\n            ? !this.configuration.ignoreEmptyDOM\n            : false;\n    }\n\n    getKeepWithInRange(): boolean {\n        return this.configuration?.keepWithInRange ??  true;\n    }\n\n    getClampValueOnBlur(): boolean {\n        return this.configuration?.clampValueOnBlur ?? false;\n    }\n\n    showErrorState() : string {\n        return 'Error Message';\n    }\n\n    getValidationMessageRenderer(){\n        return this.configuration.validationMessageRenderer;\n    }\n\tgetUserRendererParams (){\n        return 'Memo Express'\n    }\n\n    isInValid(){\n        const value = this.getValue();\n        const minCount =  this.getMinCount();\n        const maxCount =  this.getMaxCount();\n        const length = value.toString().length;\n        return maxCount ? length < minCount || length > maxCount :  false;\n\n    }\n\n    isShowErrorState(): boolean {\n        return this.configuration.showErrorState ?? false;\n    }\n\n    isValid(): boolean {\n        return this.configuration.status === 'error';\n    }\n\n    updateStatus(status : 'error' | \"none\") : void {\n        this.configuration.status = status;\n        this.dispatchEvent({\n            type: \"EVENT_VALUE_UPDATE\",\n            force : true\n        })\n    }\n\n    updateValidationMessage(message : string) : void {\n        this.configuration.validationMessage = message;\n    }\n\n    getLabelRenderer() {\n        return this.configuration.labelRenderer;\n    }\n\n    getLabelRendererParams() {\n        return this.configuration.labelRendererParams ?? {};\n    }\n\n    getClipboard(): ClipboardConfig {\n        return this.configuration.clipboard;\n    }\n\n}\n\nexport {\n    TextOptionHandler\n}\n\n\n\n\n","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { TextOptionsHandlerTypes } from \"./text-options-handler.types\";\nimport { getReggexPattern } from \"../utility\";\n\n@Bean('stateManager')\n class TextStateManager extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler !: TextOptionsHandlerTypes;\n\n    isInValid() : boolean {\n        const isValid  = this.optionHandler.isValid();\n        const value    = this.optionHandler.getValue() ?? this.optionHandler.getDefaultValue();\n        const minCount = this.optionHandler.getMinCount();\n        const maxCount = this.optionHandler.getMaxCount();\n        const length   = value.length;\n        const regex = this.optionHandler.getPattern();\n\n        // const required = this.optionHandler.isRequired();\n        // if (required && !this.isValuePresent(value)) {\n        //     return true;\n        // }\n        const pattern = getReggexPattern(regex as RegExp);\n\n        if (pattern && !pattern.test(value)) {\n            return false;\n        }\n        return isValid || (maxCount ? length < minCount || length > maxCount :  false);\n    }\n\n    isValuePresent(value : string) {\n        return value !== null && value !== undefined && value !== '';\n    }\n}\nexport {\n    TextStateManager\n}","import { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { TextUserComponentHandlerTypes } from \"./text-user-component-handler.types\";\nimport { ComponentMetadata } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport {  IComponentDetails, UserComponentHandler } from \"@dg/corecomponent/UserComponentHandler.js\";\nimport { ILabelUserComponentHandler } from \"../../../../label/label.types\";\n\n\nexport const enum PropertyName {\n\tHELPER_TEXT_RENDERER = 'helpTextRenderer',\n\tERROR_RENDERER       = \"errorRenderer\",\n\tPREFIX_RENDERER      = \"prefixRenderer\",\n\tSUFFIX_RENDERER      = 'suffixRenderer',\n\tLABEL_RENDERER       = 'labelRenderer'\n\n}\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class TextUserComponentHandler extends UserComponentHandler implements TextUserComponentHandlerTypes, ILabelUserComponentHandler{\n\t\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\tgetLabelRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails(item, PropertyName.LABEL_RENDERER, params, PropertyName.LABEL_RENDERER);\n\t}\n\n\n\tgetPrefixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.PREFIX_RENDERER, params, PropertyName.PREFIX_RENDERER);\n\t}\n\n\tgetSuffixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.SUFFIX_RENDERER, params, PropertyName.SUFFIX_RENDERER);\n\t}\n\n\tgetDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.HELPER_TEXT_RENDERER, params, PropertyName.HELPER_TEXT_RENDERER);\n\t}\n\n\tgetErrorRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.ERROR_RENDERER, params, PropertyName.ERROR_RENDERER);\n\t}\n\n\t\n\tprotected getComponentDetail( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta{\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.ERROR_RENDERER:\n\t\t\tcase PropertyName.HELPER_TEXT_RENDERER:\n\t\t\tcase PropertyName.PREFIX_RENDERER:\n\t\t\tcase PropertyName.SUFFIX_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(item : any, propertyName : PropertyName, _params : any) : any {\n        switch(propertyName) {\n\t\t\tcase PropertyName.PREFIX_RENDERER:\n\t\t\tcase PropertyName.SUFFIX_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getUserRendererParams();\n            default:\n                return {};\n        }\n\n    }\n\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { TextOptionsHandlerTypes } from \"../model/text-options-handler.types\";\n\nimport { OwnerStateType,  } from \"../text-root/text-root-classes\";\nimport { getFormattedValue, getTextUtilityClass } from \"../utility\";\nimport { RenderingTextInputCompType } from \"./rendering-text-input.types\";\nimport { validateAndFormatPhoneNumber } from \"../customformatter\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\nconst useUtilityClasses = (ownerState : OwnerStateType) => {\n\tconst slots = {\n\t\troot : {\n            slot     : 'input-wrapper',\n            modifiers: [\n                ownerState.disabled && 'disabled',\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots,getTextUtilityClass );\n};\n\nclass RenderingTextInputController extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: TextOptionsHandlerTypes;\n    private component !: RenderingTextInputCompType;\n    setComp(comp : RenderingTextInputCompType ) {\n        this.component    = comp;\n        this.applyClasses();\n        this.setValue();\n        this.registerEventHandler();\n        this.registerAdjusterEventHandler();\n    }\n\n    private applyClasses() : void {\n        const ownerState    = this.getOwnerState();\n        const classes       = useUtilityClasses(ownerState);\n        this.component.addOrRemoveCSSClass(classes.root);\n        this.component.getElement().classList.add('dg-field__input-wrapper');\n    }\n\n    private getOwnerState() {\n\t\treturn {\n\t\t\tdisabled : this.optionHandler.isDisabled(),\n\t\t\treadonly : this.optionHandler.isReadOnly()\n\t\t}\n\t}\n\n    private registerEventHandler() {\n        const inputElement = this.component.getInputElement();\n        registerClipboardGuards(\n            inputElement,\n            () => this.optionHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n        const ownerState = this.getOwnerState();\n        if(ownerState.readonly || ownerState.disabled) {\n            return \n        }\n    }\n\n    private setAccessibility() : void {\n        this.assignValueBoundaries();\n    }\n\n    private assignValueBoundaries(): void {\n        const spanElement   = this.component.getInputElement();\n        const maxCount      = this.optionsHandler.getMaxCount();\n        const placeHolder   = this.optionsHandler.getPlaceHolder();\n        const value         = this.optionsHandler.getDefaultValue();\n        const customFormat  = this.optionHandler.getCustomPattern();\n        const regex         = this.optionHandler.getPattern();\n        const format        = this.optionHandler.getFormat();\n        const formattedText = getFormattedValue(value, format);\n        let initialValue;\n        if(((typeof regex == 'string') && (regex == 'number'))&& customFormat) {\n            const formattedValue =  validateAndFormatPhoneNumber(value,customFormat);\n            if(formattedValue) { \n                spanElement.textContent = formattedValue ;\n                initialValue  =  formattedValue;\n            }\n        }else{\n            spanElement.textContent = formattedText; \n            initialValue = formattedText;\n        }\n\n        if (placeHolder && initialValue =='undefined') {\n            spanElement.setAttribute('data-placeholder', placeHolder);\n        } else {\n            spanElement.removeAttribute('data-placeholder');\n        }\n\n        if (maxCount && formattedText.length > maxCount && !customFormat) {\n            spanElement.textContent = formattedText.slice(0, maxCount);\n        }\n    }\n    \n\n    private setValue() : void {\n        this.setAccessibility();\n    }\n\n    private registerAdjusterEventHandler() {\n    }\n\n    updateProperty(){\n        const ownerState = this.getOwnerState();\n        this.applyClasses();\n        this.setAccessibility();\n        this.optionsHandler.updateProperty(ownerState);\n    }\n    \n    destroy(): void {\n        super.destroy();\n    }\n}\nexport {\n    RenderingTextInputController\n}","import { PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { RenderingTextInputCompType } from \"./rendering-text-input.types\";\nimport { RenderingTextInputController } from \"./rendering-text-input-controller\";\n\n\nconst TextInputTemplate = () => {\n    let div   = document.createElement(\"div\");\n    let span = document.createElement('span');\n    span.setAttribute('ref',spanElement);\n\n    span.classList.add(\"dg-text__input\");\n    span.classList.add(\"dg-field__input\");\n    div.appendChild(span);\n    return  div as HTMLElement;\n}\n\nconst spanElement = 'spanElement';\n\nclass RenderingTextInputComponent extends Component {\n    @queryAssignedNodes(spanElement) private spanElement !: HTMLInputElement;\n\n    constructor() {\n        super();\n        }\n\n    @PostConstruct()\n    init() {\n        const comp : RenderingTextInputCompType = {\n            getElement            : () => this.getGui() as HTMLElement,\n            addOrRemoveCSSClass   : (className: string) => this.addOrRemoveCSSClass(className),\n            getInputElement       : () => this.spanElement,\n\n        }\n        const controller = this.createManagedBean(new RenderingTextInputController);\n        this.renderTemplate(controller);\n        controller.setComp(comp);\n    }\n    private getComponent(): RenderingTextInputCompType | any {\n        return {\n            getElement            : () => this.getGui() as HTMLInputElement,\n            addOrRemoveCSSClass   : (className: string) => this.addOrRemoveCSSClass(className),\n            getInputElement       : () => this.spanElement,\n        };\n\t}\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private renderTemplate(_controller: RenderingTextInputController) {\n\t\tconst template = TextInputTemplate();\n        this.setTemplate(template);\n    }\n    rerender(controller: RenderingTextInputController,comp:any) {\n\t\tthis.destroy();\n        const component = this.getComponent()\n        this.renderTemplate(controller);\n\t\tcontroller.setComp(component);\n        comp.appendChild(this.getGui());\n    }\n\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\n\t}\n\n}\n\nexport {\n    RenderingTextInputComponent\n}","import { AutoWired, BEAN_NAME,  setAriaDisabled,  setAriaLabel } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { TextOptionsHandlerTypes } from \"../model/text-options-handler.types\";\nimport { getFormattedValue, getReggexPattern, OwnerStateType } from \"../utility\";\nimport { TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { TextControllerHandler } from \"../model/text-controller\";\nimport { ITextConfiguration } from \"../../text-configuration.types\";\nimport { useUtilityClasses } from \"../text-root/text-root-classes\";\nimport { RenderingTextComponentType } from \"./rendering-text-root-types\";\nimport { removeSpecialCharsFromNumber, validateAndFormatPhoneNumber } from \"../customformatter\";\n\n\nclass RenderingTextRootController extends AbstractController<RenderingTextComponentType> {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionHandler !: TextOptionsHandlerTypes;\n\t@AutoWired(TEXT_BEAN_NAME.TEXT_CONTROLLER_HANDLER) controllerHandler !: TextControllerHandler;\n\n\n    init(): void {\n        this.registerEvent();\n        this.controllerHandler.registerTextCtrl(this);\n        this.applyClasses();\n        this.setAccessibility();\n    }\n    registerEvent(){\n    }\n\n    private valueUpdater() : void { \n        const rootElement = this.getRootElement(); \n        rootElement && (rootElement.textContent = '');\n        const newValue =  this.optionHandler.getValue();\n        const regex =  this.optionHandler.getPattern();\n        const customFormat =  this.optionHandler.getCustomPattern();\n        if(((typeof regex == 'string') && (regex == 'number'))&& customFormat) {\n             const formattedValue = validateAndFormatPhoneNumber(newValue,customFormat);\n            if(rootElement &&formattedValue ){\n                 rootElement.textContent = formattedValue;\n            }\n        }\n        else{\n          rootElement && (rootElement.textContent = newValue);\n        }\n     }\n    getElement() : HTMLElement  | undefined{\n        return this.component?.getElement();\n    }\n\n    getRootElement() {\n        return this.component?.getInputElement();\n    }\n\n    getValue() : string | number {\n        const regex =  this.optionHandler.getPattern();\n        const customFormat =  this.optionHandler.getCustomPattern();\n        if(((typeof regex == 'string') && (regex == 'number'))&& customFormat) {\n            const value  = this.getFormattedValue() ?? '';\n            return removeSpecialCharsFromNumber(value);\n        }\n        else{\n            return this.getFormattedValue() ?? '';\n        }\n    }\n    \n    private applyClasses() {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.component?.addOrRemoveCssClassName(classes.root);\n        this.component?.getElement().classList.add('dg-field__root');\n        this.component?.getElement().classList.add('dg-field--render-state');\n        this.addUserClass();\n\n    }\n\n    private addUserClass(){\n        const className = this.optionHandler?.getClassName();\n        if(className){\n            if(Array.isArray(className)){\n                className.forEach(c => this.component?.getElement()?.classList.add(c));\n            }else{\n                this.component?.getElement()?.classList.add(className);\n            }\n        }\n    }\n\n    private setAccessibility() : void { \n        const inputElement         = this.component?.getInputElement()\n        const ariaLabel       = this.optionHandler.getAriaLabel();\n        inputElement && setAriaLabel(inputElement, ariaLabel);\n    }\n\n    private getOwnerState() : OwnerStateType {\n        const selected = this.optionHandler.isSelected();\n        const disabled = this.optionHandler.isDisabled();\n        const readonly = this.optionHandler.isReadOnly();\n        return {\n            selected,\n            disabled,\n            readonly\n        }\n    }\n\n    setValue(value :  string |  number) : void{\n        this.optionHandler.updateTextValue(value);\n        this.valueUpdater()\n    }\n    updateMinValue() {\n        const rootElement = this.getRootElement();\n        (rootElement) && (rootElement.minLength = this.optionHandler.getMinCount());\n    }\n    updateMaxValue() {\n        const rootElement = this.getRootElement();\n        const maxCount     = this.optionHandler.getMaxCount();\n        if (maxCount && rootElement) {\n            rootElement.maxLength = maxCount;\n        }\n    }\n\n    updatePlaceholder() {\n        const rootElement = this.getRootElement();\n        (rootElement) && (rootElement.placeholder = this.optionHandler.getPlaceHolder());\n    }\n    updateRequired() {\n        const rootElement = this.getRootElement();\n        (rootElement) && (rootElement.required = this.optionHandler.isRequired());\n    }\n    updateAriaLabel() {\n        const ariaLabel       = this.optionHandler.getAriaLabel();\n        const inputElement         = this.getRootElement();\n        inputElement && setAriaLabel(inputElement, ariaLabel);\n    }\n    updateDisabled() {\n        const isDisabled =  this.optionHandler.isDisabled();\n       this.disable(isDisabled)\n    }\n    updateReadOnly() {\n        const isReadOnly =  this.optionHandler.isReadOnly();\n        const element = this.getRootElement();\n        if (element) {\n            element.readOnly = isReadOnly;\n        }\n    }\n    updateValue() {\n        const value =  this.optionHandler.getDefaultValue();\n        const element = this.getRootElement();\n        if(element) {\n            const format =  this.optionHandler.getFormat();\n            const formattedText =  getFormattedValue(value,format);\n            element.value = formattedText;\n            if(format === 'none'){\n                element.value = this.optionHandler.getDefaultValue();\n            }\n        };\n        this.optionHandler.updateTextValue(value);\n        this.valueUpdater()\n    }\n    refresh() {\n        this.updateMinValue();\n        this.updateMaxValue();\n        this.updatePlaceholder();\n        this.updateRequired();\n        this.updateAriaLabel();\n        this.updateDisabled();\n        this.updateRequired();\n        this.updateAriaLabel();\n        this.updateValue();\n        this.updateLabel();\n        this.updateDescription();\n    }\n    updateLabel() {\n        const label =  this.getElement()?.querySelector('label');\n        const spanElement =  label?.querySelector('span');\n        if(label && spanElement) {\n            const labelText =  this.optionHandler.getLabel();\n            spanElement.textContent =  labelText\n        }\n    }\n\n    updateDescription(){\n        const description =  this.getElement()?.querySelector('.dg-field__description');\n        if(description) {\n            const descriptionText =  this.optionHandler.getDescription();\n            description.textContent =  descriptionText\n        }\n    }\n    updateProperty(options : ITextConfiguration){\n        this.optionHandler.updateProperty(options);\n        this.applyClasses();\n        this.refresh();\n    }\n    disable(value: boolean): void {\n        const element = this.component?.getInputElement();\n        const inputWrapper = element?.parentElement;\n        if (!element || !inputWrapper) return;\n    \n        element.classList.toggle('dg-text__input--disabled', value);\n        inputWrapper.classList.toggle('dg-text__input-wrapper--disabled', value);\n        element.disabled = value;\n    \n        this.optionHandler.setDisabled(value);\n        setAriaDisabled(element, value);\n    }\n    \n    getParamsProperty() {\n        return {\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> {\n\t\t\t\t\treturn\"dg-text__label\"\n\t\t\t\t},\n\t\t\t\tgetLabelTitleClasses :()=> {\n\t\t\t\t\treturn \"dg-text__label-title\"\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-text__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-text__description\"\n\t\t\t}\n\t\t};\n    }\n    resetValue(){\n        const initialValue = this.optionHandler.getDefaultValue();\n        const element = this.getRootElement();\n        if (element) element.textContent = '';\n        this.setValue(initialValue.length > 1 ? initialValue : '');\n    }\n    hide(): void {\n        const element = this.getElement();\n        element && (element.style.display = 'none');\n    }\n    show(): void {\n        const element = this.getElement();\n        element && (element.style.display = 'block');\n    }\n    clear() :  void {\n        this.setValue('')\n    }\n    isValid() :  boolean{\n        const regex = this.optionHandler.getPattern();\n        const inputElement = this.getRootElement();\n        let validState = true;\n        if (inputElement) {\n            const { value = '' } = inputElement;\n            const inputLength = value.length;\n            const minCount = this.optionHandler.getMinCount();\n            const maxCount = this.optionHandler.getMaxCount();\n            const pattern = getReggexPattern(regex as RegExp);\n\n            if (pattern && !pattern.test(value)) {\n                validState = false;\n            }\n            if (inputLength < minCount || (maxCount && inputLength > maxCount)) {\n                validState = false;\n            }\n        }\n        return validState;\n\n    }\n\n    getFormattedValue() : string {\n        return this.getRootElement()?.textContent ?? '';\n    }\n}\n\nexport {\n    RenderingTextRootController\n}","\nimport { AutoWired, BEAN_NAME, PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\n\nimport { RenderInputWrapper, RenderRootTemplate } from \"../utility\";\nimport { TextOptionsHandlerTypes } from \"../model/text-options-handler.types\";\nimport { RenderingTextComponentType } from \"./rendering-text-root-types\";\nimport { RenderingTextRootController } from \"./rendering-text-root-controller\";\n\n\nclass RenderingTextRootComponent  extends Component{\n    private componentHolder : HTMLElement |  null;\n    @queryAssignedNodes(RenderInputWrapper) private renderTags :any;\n  \n\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: TextOptionsHandlerTypes;\n    constructor(appendTo ?: HTMLElement) {\n\n        super();\n       this.componentHolder = appendTo ?? null;\n    }\n\n    @PostConstruct()\n    init() : void {\n\n        const component : RenderingTextComponentType = {\n            addOrRemoveCssClassName : (className : string) =>  this.addOrRemoveCssClassName(className),\n            getElement : () => this.getGui(),\n            getInputElement :() => {  return  this.renderTags.spanElement}\n\n        }\n        const controller = this.createManagedBean(new RenderingTextRootController());\n\n        const props ={\n            label :  this.optionHandler?.getLabel().length > 0,\n            helper :this.optionHandler?.getDescription().length > 0,\n            rtl :  this.optionHandler.isRTL(),\n            prefix : this.optionHandler.isPrefixRenderer(),\n            suffix : this.optionHandler.isSuffixRenderer(),\n        }\n\t\tconst properties = controller.getParamsProperty();\n        const emptyDom =  this.shouldGenerateEmptyDom();\n        const template = RenderRootTemplate(props,emptyDom);\n        this.setTemplate(template, {\n\t\t\tlabel : properties.label,\n\t\t\tdescription : properties.description\n\t\t});\n        controller.setComponent(component);\n\n        this.appendElementIntoUserDom();\n    }\n\n    private addOrRemoveCssClassName(className : string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n    private shouldGenerateEmptyDom(){\n\t\tconst generateEmptyDom = this.optionHandler.shouldGenerateEmptyDom();\n\t\tconst label = this.optionHandler.getLabel();\n\t\tconst description = this.optionHandler.getDescription();\n        const isLabel =  label.length > 0;\n        const isDescription = description.length > 0;\n\t\tif( isLabel || isDescription){\n\t\t\treturn true\n\t\t}else if(generateEmptyDom){\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n    private appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.componentHolder && this.componentHolder.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.componentHolder && this.componentHolder.removeChild(eGui);\n\t\t\tthis.componentHolder = null;\n\t\t});\n\t}\n\n}\n\nexport {\n    RenderingTextRootComponent\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME, setAriaDescribedBy, setAriaDisabled, setAriaInvalid, setAriaLabel, setAriaLabelledBy, setAriaReadOnly, setAriaRequired } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { TextOptionsHandlerTypes } from \"../model/text-options-handler.types\";\nimport { TextInputCompType } from \"./text-input.types\";\nimport { OwnerStateType,  } from \"../text-root/text-root-classes\";\nimport { getFormattedValue, getReggexPattern, getTextUtilityClass } from \"../utility\";\nimport { validateAndFormatPhoneNumber } from \"../customformatter\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\nconst useUtilityClasses = (ownerState : OwnerStateType) => {\n\tconst slots = {\n\t\troot : {\n            slot     : 'input-wrapper',\n            modifiers: [\n                ownerState.disabled && 'disabled',\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots,getTextUtilityClass );\n};\n\nclass TextInputController extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: TextOptionsHandlerTypes;\n    private component !: TextInputCompType;\n    private oldValue : string | null = null;\n    setComp(comp : TextInputCompType ) {\n        this.component    = comp;\n        this.applyClasses();\n        this.setValue();\n        this.setAriaAttributes();\n        this.registerEventHandler();\n        this.registerAdjusterEventHandler();\n    }\n\n    private applyClasses() : void {\n        const ownerState    = this.getOwnerState();\n        const classes       = useUtilityClasses(ownerState);\n        this.component.addOrRemoveCSSClass(classes.root);\n        this.component.getElement().classList.add('dg-field__input-wrapper');\n    }\n\n    private getOwnerState() {\n\t\treturn {\n\t\t\tdisabled : this.optionHandler.isDisabled(),\n\t\t\treadonly : this.optionHandler.isReadOnly()\n\t\t}\n\t}\n\n    private registerEventHandler() {\n        const inputElement = this.component.getInputElement();\n        this.addListener(inputElement, 'blur', this.onBlur.bind(this));\n        this.addListener(inputElement, 'focus', this.onFocus.bind(this));\n        this.addListener(inputElement, 'keydown', this.onKeydown.bind(this))\n        this.addListener(inputElement, \"input\", this.onInput.bind(this));\n        registerClipboardGuards(\n            inputElement,\n            () => this.optionHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n        this.addListener(this.eventHandler, 'PROPERTY_CHANGED', this.setRequired.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_TEXT_PROPERTIES_UPDATED', this.setAccessibility.bind(this));\n    }\n\n    private setAccessibility() : void {\n        this.setAriaAttributes();\n        this.assignValueBoundaries();\n    }\n\n    private assignValueBoundaries() :  void {\n        const wrapperElement    = this.component.getElement();\n        const inputElement      = this.component.getInputElement();\n        const minCount          = this.optionsHandler.getMinCount();\n        const maxCount          = this.optionsHandler.getMaxCount();\n        const placeHolder       = this.optionsHandler.getPlaceHolder();\n        const value             = this.optionHandler.getValue() ?? this.optionsHandler.getDefaultValue();\n        const isDisabled        = this.optionsHandler.isDisabled();\n        const isReadOnly        = this.optionsHandler.isReadOnly();\n        inputElement.setAttribute('aria-min',`${minCount}`);\n        const format            = this.optionHandler.getFormat();\n        const customFormat      = this.optionHandler.getCustomPattern();\n        const regex             = this.optionHandler.getPattern();\n\n        if(((typeof regex == 'string') && (regex == 'number'))&& customFormat) {\n            const formattedValue =  validateAndFormatPhoneNumber(value,customFormat);\n            formattedValue ? inputElement.value = formattedValue :  null;\n        }\n        else{\n            const formattedText =  getFormattedValue(value,format);\n            inputElement.value =  formattedText;\n        }\n\n        inputElement.disabled     = isDisabled;\n        inputElement.readOnly     = isReadOnly;\n        this.setRequired();\n\n        placeHolder && (inputElement.placeholder  = placeHolder);\n        this.optionHandler.setMaxCount(maxCount ?? 999);\n        inputElement.setAttribute('aria-max',`${maxCount}`);\n        wrapperElement.classList.toggle('dg-input__status--disabled', isDisabled);\n        wrapperElement.classList.toggle('dg-input__status--read-only', isReadOnly);\n    }\n\n\n\n    private setAriaAttributes() : void {\n        const element   = this.component.getInputElement();\n        const inputLength = element.value.length;\n        const minCount = this.optionHandler.getMinCount();\n        this.setRequired();\n\n        setAriaDisabled(element, this.optionHandler.isDisabled());\n        setAriaReadOnly(element, this.optionHandler.isReadOnly());\n        setAriaLabel(element, this.optionHandler.getAriaLabel());\n        setAriaLabelledBy(element, this.optionHandler.getAriaLabelledby());\n        setAriaDescribedBy(element, this.optionHandler.getAriaDescribedby());\n        setAriaInvalid(element, inputLength < minCount ? 'true' : 'false');\n    }\n    private setRequired(){\n        const element   = this.component.getInputElement();\n        setAriaRequired(element, this.optionHandler.isRequired());\n    }\n\n    private setValue() : void {\n        this.setAccessibility();\n    }\n\n    private registerAdjusterEventHandler() {\n    }\n\n    updateProperty(){\n        const ownerState = this.getOwnerState();\n        this.applyClasses();\n        this.setAccessibility();\n        this.optionsHandler.updateProperty(ownerState);\n    }\n\n   private onInput(event: InputEvent): void {\n        const inputElement    = this.component.getInputElement();\n        const isRequired      = this.optionsHandler.isRequired();\n        const currentLength   = inputElement.value.length;\n        const maxCount        = this.optionsHandler.getMaxCount();\n        const minCount        = this.optionsHandler.getMinCount();\n        const keepWithinRange = this.optionsHandler.getKeepWithInRange();\n        const regex           = this.optionHandler.getPattern();\n        const value           = inputElement.value;\n        const pattern         = getReggexPattern(regex as RegExp);\n        const ownerState      = this.getOwnerState();\n        const customFormat    = this.optionHandler.getCustomPattern();\n       \n        \n        if (ownerState.readonly || ownerState.disabled) return;\n        \n        if (value.length > 0 && pattern && !pattern.test(value)) {\n            this.optionHandler.onError({type :  'validation',event : event})\n            event.preventDefault();\n            inputElement.value = value.slice(0, -1);\n        }\n        \n        if (keepWithinRange && currentLength > maxCount) {\n            this.optionHandler.onError({type :  'max',event : event})\n            inputElement.value = value.slice(0, maxCount);\n        }\n        \n        if (inputElement.value.length && isRequired) {\n            inputElement.setCustomValidity('');\n            inputElement.reportValidity();\n        }\n        \n        if (typeof regex === 'string' && regex === 'number' && customFormat) {\n            const formattedValue = validateAndFormatPhoneNumber(value, customFormat);\n            if (formattedValue){ \n                inputElement.value = formattedValue\n            }\n        }\n         else {\n            const format = this.optionHandler.getFormat();\n            const formattedText = getFormattedValue(inputElement.value, format);\n            inputElement.value = formattedText;\n        }\n        \n        const wrapperElement = this.component.getElement();\n        wrapperElement.classList.toggle(\n        'dg-input__status--error',\n        inputElement.value.length > maxCount || inputElement.value.length < minCount\n        );\n        \n        this.optionsHandler.onInput({ event, value: inputElement.value });\n\n        this.optionHandler.updateTextValue(inputElement.value)\n    }\n\n    private onBlur(event: FocusEvent): void {\n        const inputElement     = this.component.getInputElement();\n        const minCount         = this.optionsHandler.getMinCount();\n        const maxCount         = this.optionsHandler.getMaxCount();\n        const clampValueOnBlur = this.optionsHandler.getClampValueOnBlur();\n        const inputLength      = inputElement.value.length;\n        const isRequired       = this.optionsHandler.isRequired();\n        const ownerState       = this.getOwnerState();\n        \n        if (ownerState.readonly || ownerState.disabled) {\n            return;\n        }\n        \n        if (!inputElement.value && isRequired) {\n            inputElement.reportValidity();\n        }\n        \n        if (inputLength < minCount) {\n            this.optionHandler.onError({type :  'min',event : event})\n            setAriaInvalid(inputElement, 'true');\n        } else {\n            setAriaInvalid(inputElement, 'false');\n        }\n        \n        if (clampValueOnBlur && inputLength > maxCount) {\n            const value = inputElement.value.slice(0, maxCount)\n            inputElement.value = value;\n            this.optionHandler.updateTextValue(value);\n            this.optionHandler.onError({type :  'max',event : event})\n        }\n\n\n        this.optionsHandler.onBlur(event);\n        (this.oldValue !== inputElement.value) &&  this.optionHandler.onChange(this.oldValue as string, inputElement.value, 'ui');\n        this.oldValue = null;\n        const rootElement = this.optionsHandler.api.getElement();\n        rootElement.classList.remove('dg-input__status--focus');\n    }\n\n\n    private onFocus(event: FocusEvent): void {\n        const ownerState = this.getOwnerState();\n        if(ownerState.readonly || ownerState.disabled) {\n            return \n        }\n        this.oldValue = this.optionHandler.getValue();\n        this.optionsHandler.onFocus(event);\n        const rootElement = this.optionsHandler.api.getElement();\n        rootElement.classList.add('dg-input__status--focus');\n    }\n\n    private onKeydown(event: KeyboardEvent): void {\n        const inputElement    = this.component.getInputElement();\n        const maxCount        = this.optionsHandler.getMaxCount();\n        const keepWithinRange = this.optionsHandler.getKeepWithInRange();\n        const inputLength     = inputElement.value.length;\n        const allowedKeys     = ['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight'];\n        const ownerState      = this.getOwnerState();\n        \n        if (ownerState.readonly || ownerState.disabled) return;\n\t\t\n\t\t// Allow browser/system shortcuts (e.g., Cmd/Ctrl + A/C/V/X/Z/Y)\n\t\t// but stop propagation so outer containers (e.g., grid) don't also act on them.\n\t\tif (event.metaKey || event.ctrlKey) {\n\t\t\tevent.stopPropagation();\n\t\t}\n        \n        if (keepWithinRange && inputLength >= maxCount && !allowedKeys.includes(event.key)) {\n            event.preventDefault();\n\n            if (inputLength >= maxCount && !allowedKeys.includes(event.key)) {\n                if(keepWithinRange){\n                    this.optionHandler.onError({type :  'max',event : event})\n                    event.preventDefault();\n                }\n                setAriaInvalid(inputElement, 'true');\n            } else {\n                setAriaInvalid(inputElement, 'false');\n            }\n        }\n\n         if(event.key === 'Enter') {\n                inputElement && inputElement.blur();\n            }\n\n        this.optionHandler.onKeydown(event);\n    }\n    destroy(): void {\n        super.destroy();\n    }\n}\nexport {\n    TextInputController\n}","import { PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { TextInputController } from \"./text-input-controller\";\nimport { TextInputCompType } from \"./text-input.types\";\n\nconst TextInputTemplate = () => {\n    let div   = document.createElement(\"div\");\n    let input = document.createElement('input');\n    input.setAttribute('ref',inputElement);\n    input.classList.add(\"dg-text__input\");\n    input.classList.add(\"dg-field__input\");\n    div.appendChild(input);\n    return  div as HTMLElement;\n}\n\nconst inputElement = 'inputElement';\n\nclass TextInputComponent extends Component {\n    @queryAssignedNodes(inputElement) private inputElement !: HTMLInputElement;\n\n    constructor() {\n        super();\n        }\n\n    @PostConstruct()\n    init() {\n        const comp : TextInputCompType = {\n            getElement            : () => this.getGui() as HTMLElement,\n            addOrRemoveCSSClass   : (className: string) => this.addOrRemoveCSSClass(className),\n            getInputElement       : () => this.inputElement,\n\n        }\n        const controller = this.createManagedBean(new TextInputController);\n        this.renderTemplate(controller);\n        controller.setComp(comp);\n    }\n    private getComponent(): TextInputCompType | any {\n        return {\n            getElement            : () => this.getGui() as HTMLInputElement,\n            addOrRemoveCSSClass   : (className: string) => this.addOrRemoveCSSClass(className),\n            getInputElement       : () => this.inputElement,\n        };\n\t}\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private renderTemplate(_controller: TextInputController) {\n\t\tconst template = TextInputTemplate();\n        this.setTemplate(template);\n    }\n    rerender(controller:TextInputController,comp:any) {\n\t\tthis.destroy();\n        const component = this.getComponent()\n        this.renderTemplate(controller);\n\t\tcontroller.setComp(component);\n        comp.appendChild(this.getGui());\n    }\n\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\n\t}\n\n}\n\nexport {\n    TextInputComponent\n}","import { composeClasses, generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../modules/CSSRegistry\";\n\ninterface OwnerStateType {\n    disabled : boolean;\n}\n\nfunction getTextUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n    const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n    return generateUtilityClass('text', slots.slot, slots.modifiers,globalNameSpace as string[]);\n}\n\nconst useUtilityClasses = (ownerState : OwnerStateType) => {\n\tconst slots = {\n\t\troot : {\n            slot     : 'root',\n            modifiers: [\n                ownerState.disabled && 'disabled',\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots,getTextUtilityClass );\n};\n\nexport {\n    useUtilityClasses,\n    OwnerStateType,\n    getTextUtilityClass\n}","import { AutoWired, BEAN_NAME,  setAriaDisabled,  setAriaLabel } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { TextComponentType } from \"./text-root-types\";\nimport { TextOptionsHandlerTypes } from \"../model/text-options-handler.types\";\nimport { useUtilityClasses } from \"./text-root-classes\";\nimport { getFormattedValue, getReggexPattern, OwnerStateType } from \"../utility\";\nimport { TEXT_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { TextControllerHandler } from \"../model/text-controller\";\nimport { ITextConfiguration } from \"../../text-configuration.types\";\nimport { removeSpecialCharsFromNumber, validateAndFormatPhoneNumber } from \"../customformatter\";\nimport type { TextStateManager } from \"../model/text-state-manager\";\n\nclass TextRootController extends AbstractController<TextComponentType> {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionHandler !: TextOptionsHandlerTypes;\n\t@AutoWired(TEXT_BEAN_NAME.TEXT_CONTROLLER_HANDLER) controllerHandler !: TextControllerHandler;\n    @AutoWired('stateManager') private stateManager !: TextStateManager;\n\n\n    init(): void {\n        this.registerEvent();\n        this.controllerHandler.registerTextCtrl(this);\n        this.applyClasses();\n        this.setAccessibility();\n        this.addErrorClassName();\n        this.updateRTL();\n\n    }\n\n    private updateRTL() : void {\n        const element = this.component?.getElement();\n\n        if(element) {\n            element.setAttribute('dir', this.optionHandler.isRTL() ? 'rtl' : 'ltr');\n        }\n    }\n    registerEvent(){\n        this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.addErrorClassName.bind(this));\n    }\n\n    private addErrorClassName() : void {\n\t\tconst isInValid = this.stateManager.isInValid();\n\t\tthis.component!.getElement().classList.toggle(\"dg-input__status--error\", isInValid)\n\t}\n\n    private valueUpdater() : void { \n       const rootElement = this.getRootElement(); \n       rootElement && (rootElement.value = '');\n       const newValue =  this.optionHandler.getValue();\n       const regex =  this.optionHandler.getPattern();\n       const format =  this.optionHandler.getFormat();\n       const customFormat =  this.optionHandler.getCustomPattern();\n       if(((typeof regex == 'string') && (regex == 'number'))&& customFormat) {\n            const formattedValue = validateAndFormatPhoneNumber(newValue,customFormat)\n           if(rootElement &&formattedValue ){\n                this.setRootValue(rootElement, formattedValue);\n           }\n       }\n       else{\n        rootElement && this.setRootValue(rootElement, newValue);\n       }\n       if(format === 'none'){\n        rootElement && this.setRootValue(rootElement, this.optionHandler.getDefaultValue());\n    }\n    }\n\n    setRootValue(element : HTMLInputElement, value : string | number) : void {\n      if(element){\n        element.value = value.toString()\n      }\n    }\n    getElement() : HTMLElement  | undefined{\n        return this.component?.getElement();\n    }\n\n    getRootElement() {\n        return this.component?.getInputElement();\n    }\n\n    getValue() : string | number {\n        const regex =  this.optionHandler.getPattern();\n        const customFormat =  this.optionHandler.getCustomPattern();\n        if(((typeof regex == 'string') && (regex == 'number'))&& customFormat) {\n            const value  = this.getFormattedValue() ?? '';\n            return removeSpecialCharsFromNumber(value);\n        }\n        else{\n            return this.getFormattedValue() ?? '';\n        }\n    }\n    \n    private applyClasses() {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.component?.addOrRemoveCssClassName(classes.root);\n        this.component?.getElement().classList.add('dg-field__root');\n        this.addUserClass();\n    }\n\n    private addUserClass(){\n        const className = this.optionHandler?.getClassName();\n        if(className){\n            if(Array.isArray(className)){\n                className.forEach(c => this.component?.getElement()?.classList.add(c));\n            }else{\n                this.component?.getElement()?.classList.add(className);\n            }\n        }\n    }\n\n    private setAccessibility() : void { \n        const inputElement         = this.component?.getInputElement()\n        const ariaLabel       = this.optionHandler.getAriaLabel();\n        inputElement && setAriaLabel(inputElement, ariaLabel);\n    }\n\n    private getOwnerState() : OwnerStateType {\n        const selected = this.optionHandler.isSelected();\n        const disabled = this.optionHandler.isDisabled();\n        const readonly = this.optionHandler.isReadOnly();\n        return {\n            selected,\n            disabled,\n            readonly\n        }\n    }\n\n    setValue(value :  string |  number) : void{\n        this.optionHandler.updateTextValue(value);\n        this.valueUpdater()\n    }\n    updateMinValue() {\n        const rootElement = this.getRootElement();\n        if(rootElement){\n            rootElement.setAttribute('aria-min',`${this.optionHandler.getMinCount()}`);\n        }\n    }\n    updateMaxValue() {\n        const rootElement = this.getRootElement();\n        const maxCount     = this.optionHandler.getMaxCount();\n        if (maxCount && rootElement) {\n            rootElement.setAttribute('aria-max',`${maxCount}`);\n        }\n    }\n\n    updatePlaceholder(options ?: any) {\n        const rootElement = this.getRootElement();\n        if(rootElement){\n             if(options?.placeholder === null){\n                rootElement.placeholder = ''\n            }\n            else{\n                rootElement.placeholder = this.optionHandler.getPlaceHolder();\n            }\n        }\n        // (rootElement) && (rootElement.placeholder = this.optionHandler.getPlaceHolder());\n    }\n    updateAriaLabel() {\n        const ariaLabel       = this.optionHandler.getAriaLabel();\n        const inputElement         = this.getRootElement();\n        inputElement && setAriaLabel(inputElement, ariaLabel);\n    }\n    updateDisabled() {\n        const isDisabled =  this.optionHandler.isDisabled();\n       this.disable(isDisabled)\n    }\n    updateReadOnly() {\n        const isReadOnly =  this.optionHandler.isReadOnly();\n        const element = this.getRootElement();\n        if (element) {\n            element.readOnly = isReadOnly;\n        }\n    }\n    updateValue() {\n        const value =  this.optionHandler.getValue() ?? this.optionHandler.getDefaultValue();\n        const element = this.getRootElement();\n        if(element) {\n            const format =  this.optionHandler.getFormat();\n            const formattedText =  getFormattedValue(value,format);\n            element.value = formattedText;\n            if(format === 'none'){\n                element.value = this.optionHandler.getDefaultValue();\n            }\n        };\n        this.optionHandler.updateTextValue(value);\n        this.valueUpdater()\n    }\n\n    updateRequired(){\n        const isRequired        = this.optionHandler.isRequired();\n        const rootElement       = this.getRootElement() as HTMLInputElement;\n        if (rootElement) {\n            rootElement.setAttribute('aria-required', `${isRequired}`)\n            this.dispatchEvent({ type: 'PROPERTY_CHANGED' , force : true});\n        }\n    }\n    refresh(options ?: object) {\n        this.updateMinValue();\n        this.updateMaxValue();\n        this.updatePlaceholder(options);\n        this.updateAriaLabel();\n        this.updateDisabled();\n        this.updateRequired();\n        this.updateAriaLabel();\n        this.updateValue();\n        this.updateLabel();\n        this.updateDescription(options);\n        this.updatePrefix();\n        this.updateSuffix();\n        this.updateRTL();\n        this.addPrefixAndSuffixClassNames();\n    }\n\n    updatePrefix(){\n        const textContainer =  this.getElement()?.querySelector('.dg-text__container')\n        const prefixElement = textContainer?.querySelector('.dg-prefix-elem');\n        const prefixValue =  this.optionHandler.getPrefixValue();\n        if (prefixElement &&(typeof prefixValue === 'string')) {\n            prefixElement.textContent = prefixValue;\n          } \n    }\n\n    updateSuffix() {\n\n        const textContainer =  this.getElement()?.querySelector('.dg-text__container')\n        const suffixElement = textContainer?.querySelector('.dg-suffix-elem');\n        const suffixValue =  this.optionHandler.getSuffixValue();\n        if (suffixElement &&(typeof suffixValue === 'string')) {\n            suffixElement.textContent = suffixValue;\n          } \n\n    }\n    updateLabel() {\n        const label =  this.getElement()?.querySelector('label');\n        const spanElement =  label?.querySelector('span');\n        if(label && spanElement) {\n            const labelText =  this.optionHandler.getLabel();\n            spanElement.textContent =  labelText\n        }\n    }\n\n    updateDescription(options ?: any){\n        const description =  this.getElement()?.querySelector('.dg-field__description');\n        if(description) {\n            const descriptionText =  this.optionHandler.getDescription();\n            // description.textContent =  descriptionText\n            if(options?.description === null){\n                description.textContent = ''\n            }\n            else{\n                description.textContent =  descriptionText\n            }\n        }\n    }\n    updateProperty(options : ITextConfiguration, _force ?: boolean){\n        this.optionHandler.updateProperty(options);\n        this.dispatchEvent({\n            type : 'EVENT_TEXT_PROPERTIES_UPDATED'\n        })\n        this.applyClasses();\n        this.refresh(options);\n    }\n    disable(value: boolean): void {\n        const element = this.component?.getInputElement();\n        const inputWrapper = element?.parentElement;\n        const rootElement = this.component?.getElement();\n        if (!element || !inputWrapper) return;\n    \n        rootElement!.classList.toggle('dg-input__status--disabled', value);\n        element.classList.toggle('dg-text__input--disabled', value);\n        inputWrapper.classList.toggle('dg-text__input-wrapper--disabled', value);\n        element.disabled = value;\n    \n        this.optionHandler.setDisabled(value);\n        setAriaDisabled(element, value);\n    }\n    \n    getParamsProperty() {\n        return {\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> {\n\t\t\t\t\treturn\"dg-text__label\"\n\t\t\t\t},\n\t\t\t\tgetLabelTitleClasses :()=> {\n\t\t\t\t\treturn \"dg-text__label-title\"\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-text__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-text__description\"\n\t\t\t}\n\t\t};\n    }\n    resetValue(){\n        const initialValue = this.optionHandler.getDefaultValue();\n        const element = this.getRootElement();\n        if (element) element.value = initialValue.length > 1 ? initialValue : '';\n        this.setValue(initialValue.length > 1 ? initialValue : '');\n    }\n\n\n   \n\n    hide(subElements?: string[]): void {\n        const element = this.getElement();\n        if (!element) return;\n    \n        if (!subElements?.length) {\n            element.style.display = 'none';\n            return;\n        }\n    \n        const actions: Record<string, () => void> = {\n            label: this.hideLabel.bind(this),\n            description: this.hideDescription.bind(this),\n            prefix: this.hidePrefix.bind(this),\n            suffix: this.hideSuffix.bind(this),\n        };\n    \n        subElements.forEach(sub => actions[sub]?.());\n    }\n    \n    show(subElements?: string[]): void {\n        const element = this.getElement();\n        if (!element) return;\n    \n        if (!subElements?.length) {\n            element.style.display = 'block';\n            return;\n        }\n    \n        const actions: Record<string, () => void> = {\n            label: this.showLabel.bind(this),\n            description: this.showDescription.bind(this),\n            prefix: this.showPrefix.bind(this),\n            suffix: this.showSuffix.bind(this),\n        };\n    \n        subElements.forEach(sub => actions[sub]?.());\n    }\n    \n    hideLabel(){\n        const label = this.getElement()?.querySelector('.dg-field__label') as HTMLElement;\n        label && (label.style.display='none')\n    }\n    hideDescription(){\n        const description = this.getElement()?.querySelector('.dg-field__description') as HTMLElement;\n        description && (description.style.display = 'none');\n    }\n    hideSuffix(){\n        const suffixElement = this.getElement()?.querySelector('.dg-suffix-elem') as HTMLElement;\n        suffixElement && (suffixElement.style.display ='none')\n    }\n    hidePrefix(){\n        const prefixElement = this.getElement()?.querySelector('.dg-prefix-elem')  as HTMLElement;\n        prefixElement && (prefixElement.style.display = 'none');\n    }\n    showLabel(){\n        const label = this.getElement()?.querySelector('.dg-field__label') as HTMLElement;\n        label && (label.style.display='block')\n    }\n    showDescription(){\n        const description = this.getElement()?.querySelector('.dg-field__description') as HTMLElement;\n        description && (description.style.display = 'block')\n    }\n    showSuffix(){\n        const suffixElement = this.getElement()?.querySelector('.dg-suffix-elem') as HTMLElement;\n        suffixElement && (suffixElement.style.display ='block')\n    }\n    showPrefix(){\n        const prefixElement = this.getElement()?.querySelector('.dg-prefix-elem')  as HTMLElement;\n        prefixElement && (prefixElement.style.display = 'block');\n    }\n\n    clear() :  void {\n        this.setValue('')\n    }\n    isValid() :  boolean{\n        const regex = this.optionHandler.getPattern();\n        const inputElement = this.getRootElement();\n        let validState = true;\n        if (inputElement) {\n            const { value = '' } = inputElement;\n            const inputLength = value.length;\n            const minCount = this.optionHandler.getMinCount();\n            const maxCount = this.optionHandler.getMaxCount();\n            const pattern = getReggexPattern(regex as RegExp);\n\n            if (pattern && !pattern.test(value)) {\n                validState = false;\n            }\n            if (inputLength < minCount || (maxCount && inputLength > maxCount)) {\n                validState = false;\n            }\n        }\n        return validState;\n\n    }\n\n    getFormattedValue() : string {\n        return this.getRootElement()?.value ?? '';\n    }\n\n    private addPrefixAndSuffixClassNames(){\n\t\tconst prefix = this.optionHandler.getPrefixValue() || this.optionHandler.getPrefixRenderer();\n\t\tconst suffix = this.optionHandler.getSuffixValue() || this.optionHandler.getSuffixRenderer();\n\n\t\tif(prefix){\n\t\t\tthis.component?.getElement().classList.add(\"dg-field__prefix--active\");\n\t\t}\n\t\tif(suffix){\n\t\t\tthis.component?.getElement().classList.add(\"dg-field__suffix--active\");\n\t\t}\n\t}\n}\n\nexport {\n    TextRootController\n}","\nimport { AutoWired, BEAN_NAME, PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { TextComponentType } from \"./text-root-types\";\nimport { inputWrapper, rootTemplate } from \"../utility\";\nimport { TextRootController } from \"./text-root-controller\";\nimport { TextOptionsHandlerTypes } from \"../model/text-options-handler.types\";\n\n\nclass TextRootComponent  extends Component{\n    private componentHolder : HTMLElement |  null;\n    @queryAssignedNodes(inputWrapper) private inputTags :any;\n  \n\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: TextOptionsHandlerTypes;\n    constructor(appendTo ?: HTMLElement) {\n\n        super();\n       this.componentHolder = appendTo ?? null;\n    }\n\n    @PostConstruct()\n    init() : void {\n\n        const component : TextComponentType = {\n            addOrRemoveCssClassName : (className : string) =>  this.addOrRemoveCssClassName(className),\n            getElement : () => this.getGui(),\n            getInputElement :() => {  return  this.inputTags.inputElement}\n\n        }\n        const controller = this.createManagedBean(new TextRootController());\n\n        const props ={\n            label : this.optionHandler?.getLabel().length  >0,\n            helper: this.optionHandler?.getDescription().length > 0,\n            rtl   : this.optionHandler.isRTL(),\n            prefix: this.optionHandler.isPrefixRenderer(),\n            suffix: this.optionHandler.isSuffixRenderer(),\n            error : this.optionHandler.isShowErrorState()\n        }\n\t\tconst properties = controller.getParamsProperty();\n        const emptyDom =  this.shouldGenerateEmptyDom();\n        const template = rootTemplate(props,emptyDom)\n        this.setTemplate(template, {\n\t\t\tlabel : properties.label,\n\t\t\tdescription : properties.description,\n            error : properties.description\n\t\t});\n        controller.setComponent(component);\n\n        this.appendElementIntoUserDom();\n    }\n\n    private addOrRemoveCssClassName(className : string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n    private shouldGenerateEmptyDom(){\n\t\tconst generateEmptyDom = this.optionHandler.shouldGenerateEmptyDom();\n\t\treturn generateEmptyDom\n\t}\n\n    private appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.componentHolder && this.componentHolder.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.componentHolder && this.componentHolder.removeChild(eGui);\n\t\t\tthis.componentHolder = null;\n\t\t});\n\t}\n\n}\n\nexport {\n    TextRootComponent\n}","\nimport { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../modules/CSSRegistry\";\nimport { ICustomReggexType } from \"./model/text-options-handler.types\";\n\n\nconst inputWrapper ='inputWrapper'\n\nfunction getTextUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n    const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n    return generateUtilityClass('text', slots.slot, slots.modifiers,globalNameSpace as string[]);\n  }\n\n\nconst rootTemplate = (props: any , emptyDom :  boolean) => {\n    const rootDiv = document.createElement(\"div\");\n    const div = document.createElement(\"div\");\n\n    div.classList.add('dg-text__container');\n    div.classList.add('dg-field__container');\n    if (emptyDom || props.label) {\n        const textLabel = document.createElement(\"text-label\");\n        textLabel.setAttribute(\"ref\", 'label');\n        rootDiv.appendChild(textLabel);\n\n    }\n    if(emptyDom || props.prefix){\n        const pR =  document.createElement('prefix');\n        div.appendChild(pR);\n        if(!props.prefix){\n\t\t\tdiv.classList.add('dg-field__prefix--hidden');\n\t\t}\n    }\n    const textInput = document.createElement(\"text-input\");\n    textInput.setAttribute('ref',inputWrapper);\n    div.appendChild(textInput);\n    if(emptyDom || props.suffix){\n        const sR =  document.createElement('suffix');\n        div.appendChild(sR);\n        if(!props.suffix){\n\t\t\tdiv.classList.add('dg-field__suffix--hidden');\n\t\t}\n    }\n    rootDiv.appendChild(div);\n    if (emptyDom || props.helper) {\n        const textHelper = document.createElement(\"text-helper\");\n        textHelper.setAttribute(\"ref\", 'description');\n        rootDiv.appendChild(textHelper);\n    }\n\n    if(emptyDom || props.error) {\n        const errorElement = document.createElement(\"error\");\n        errorElement.setAttribute(\"ref\", 'error');\n        rootDiv.appendChild(errorElement);\n    }\n    return rootDiv;\n}\n\ninterface OwnerStateType {\n    selected: boolean;\n    disabled : boolean;\n    readonly : boolean;\n}\n\nfunction setFocusAtFirst(inputElement: HTMLInputElement | undefined) {\n    if (inputElement) {\n        inputElement.focus();\n        inputElement.setSelectionRange(0, 0); \n    }\n}\n\nfunction setFocusAtLast(inputElement: HTMLInputElement | undefined) {\n    if (inputElement && inputElement.value.length > 0) {\n        const length = inputElement.value.length;\n        inputElement.focus();\n        inputElement.setSelectionRange(length, length); \n    }\n}\n\nfunction selectAllText(inputElement: HTMLInputElement | undefined) {\n    if (inputElement && inputElement.tagName === 'INPUT') {\n        inputElement.focus();\n        inputElement.select();\n    }\n}\nfunction getReggexPattern(pattern: RegExp | keyof ICustomReggexType | null): RegExp | undefined {\n    let patterns: RegExp | undefined;\n\n    if (pattern instanceof RegExp) {\n        try {\n            new RegExp(pattern);\n            patterns = pattern;\n        } catch (e) {\n            patterns = undefined;\n        }\n    } else if (typeof pattern === 'string') {\n        switch (pattern) {\n            case 'letter':\n                patterns = /^[a-zA-Z]+$/;\n                break;\n            case 'number':\n                patterns = /^\\d+$/;\n                break;\n            case 'alphanumeric':\n                patterns = /^[a-zA-Z0-9]+$/;\n                break;\n            case 'alphawithspace':\n                patterns = /^[a-zA-Z\\s]+$/;\n                break;\n            case 'alphanumericwithspace':\n                patterns = /^[a-zA-Z0-9\\s]+$/;\n                break;\n        }\n    }\n\n    return patterns;\n}\nfunction getFormattedText(element :  HTMLInputElement , format ?:  string)  :  string{\n    let text = element.value;\n    switch (format) {\n        case 'capitalize':\n            text = text.replace(/\\b\\w/g, char => char.toUpperCase());\n            break;\n        case 'lower':\n            text = text.toLowerCase();\n            break;\n        case 'upper':\n            text = text.toUpperCase();\n            break;\n        case 'sentence':\n            text = text.split(/([.!?]\\s)/) \n                  .map(sentence => sentence.charAt(0).toUpperCase() + sentence.slice(1).toLowerCase())\n                  .join('');;\n            break;\n        case 'none':\n        default:\n            break;\n    }\n   return text;\n}\nfunction getFormattedValue(value :  string , format ?:  string)  :  string{\n    let text = value;\n    if(format !='none'){\n        text =  text.toLowerCase();\n    }\n    switch (format) {\n        case 'capitalize':\n            text = text.replace(/\\b\\w/g, char => char.toUpperCase());\n            break;\n        case 'lower':\n            text = text.toLowerCase();\n            break;\n        case 'upper':\n            text = text.toUpperCase();\n            break;\n        case 'sentence':\n            text = text.split(/([.!?]\\s)/) \n                  .map(sentence => sentence.charAt(0).toUpperCase() + sentence.slice(1).toLowerCase())\n                  .join('');;\n            break;\n        case 'none':\n            text = text\n        default:\n            break;\n    }\n   return text;\n}\nfunction callHook(onbefore : CallableFunction ,api :CallableFunction,onAfter :  CallableFunction,args : number[] | string[]){ \n    const canExecute = onbefore(...args);\n    if(canExecute !== false){\n        api();\n        onAfter(...args);\n    }        \n}\nconst RenderInputWrapper ='renderInputWrapper'\nconst RenderRootTemplate = (props: any, emptyDom :  boolean) => {\n    const rootDiv = document.createElement(\"div\");\n    const div = document.createElement(\"div\");\n\n    div.classList.add('dg-text__container');\n    div.classList.add('dg-field__container');\n    if (emptyDom || props.label) {\n        const textLabel = document.createElement(\"text-label\");\n        textLabel.setAttribute(\"ref\", 'label');\n        rootDiv.appendChild(textLabel);\n    }\n    (props?.rtl) && (div.setAttribute('dir','rtl'));\n    if(emptyDom || props.prefix){\n        const pR =  document.createElement('prefix');\n        div.appendChild(pR);\n        if(!props.prefix){\n\t\t\tdiv.classList.add('dg-field__prefix--hidden');\n\t\t}\n    }\n    const textInput = document.createElement(\"render-text-input\");\n    textInput.setAttribute('ref',RenderInputWrapper);\n    div.appendChild(textInput);\n    if(emptyDom || props.suffix){\n        const sR =  document.createElement('suffix');\n        div.appendChild(sR);\n        if(!props.suffix){\n\t\t\tdiv.classList.add('dg-field__suffix--hidden');\n\t\t}\n    }\n    rootDiv.appendChild(div);\n    if (emptyDom || props.helper) {\n        const textHelper = document.createElement(\"text-helper\");\n        textHelper.setAttribute(\"ref\", 'description');\n        rootDiv.appendChild(textHelper);\n    }\n    return rootDiv;\n}\n\n\nexport { \n    rootTemplate,\n    getTextUtilityClass,\n    OwnerStateType,\n    setFocusAtFirst,\n    setFocusAtLast,\n    selectAllText,\n    callHook,\n    getFormattedText,\n    inputWrapper,\n    getReggexPattern,\n    getFormattedValue,\n    RenderRootTemplate,\n    RenderInputWrapper\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { ICustomReggexType } from \"./core/model/text-options-handler.types\";\nimport { IClipboard } from \"../../utility/clipboard\";\n\n\ninterface ISize {\n    size ?: 'xs' | 'sm' | 'md' | 'lg'\n}\n\nconst textLineFormatter ={\n    none   : \"none\" ,\n    capitalize : \"capitalize\" ,\n    lower : \"lower\" ,\n    upper : \"upper\" ,\n    sentence : \"sentence\"\n}\nexport interface IRenderer {\n\tgetElement()       : HTMLElement;\n\tinit(params:object): void;\n\tdestroy()          : void;\n}\n\nexport interface IOnChangeEventParams {\n    oldValue: string;\n    newValue: string;\n    eventOrigin ?: 'api' | 'ui';\n}\n\ninterface ITextConfiguration {\n\n    appendTo ?:  HTMLElement,\n    instanceID ?: string,    \n    clearButton ?   : boolean |  string | HTMLElement,\n    bordered ?        : 'none' | 'outline' | 'standard' | 'filled',\n    format ?: string,\n    label ?: string,\n    ariaDescribedby  ?: string;\n    ariaLabelledBy ?: string, \n\n    // className ?: , // need to discuss\n\n\n\n    \n    // commmon API's \n    value             ?: string , // need to discuss\n    defaultValue      ?: string,\n    readonly          ?: boolean,\n    disabled          ?: boolean,\n    size              ?: ISize,\n    validator         ?: CallableFunction,\n    validationMessage ?: string,\n    required          ?: boolean,\n    name              ?: string,  // need to discuss\n    allowNull         ?: boolean, // need to discuss\n    placeholder       ?: string,\n    title             ?: string,\n\n    ariaLabel            ?: string,\n    description          ?: string,\n    prefix               ?: boolean |  string | HTMLElement,\n    prefixRenderer       ?: { new(): IRenderer } | undefined ,\n    prefixRendererParams ?: object,\n    suffix               ?: boolean |  string | HTMLElement,\n    suffixRenderer       ?: { new(): IRenderer } | undefined ,\n    suffixRendererParams ?: object,\n\n    // descriptionRenderer ?: { new(): IRenderer }; // need to discuss\n    descriptionRenderer ?: {}; // need to discuss\n    descriptionRendererParams       ?: object,\n    validationMessageRenderer    ?: { new(): IRenderer }; // need to discuss\n    validationMessageRendererParams ?: object,\n    className                       ?: string[] | string,   // need to discuss\n\n\n    rtl ?:  boolean,\n\n    \n    // Text Component Based API //\n    showCount         ?: boolean,\n    min               ?: number,\n    max               ?: number,\n    pattern           ?: RegExp | ICustomReggexType | null ,\n    clampValueOnBlur  ?: boolean,\n    keepWithInRange   ?: boolean,\n    characterCase     ?:  string,\n    addonBefore       ?: string |  number,\n    addonAfter        ?: string |  number,\n\n    //Events API\n    onChange            ?: ((oldValue: string, newValue: string, eventOrigin?: 'api' | 'ui') => void) | ((params: IOnChangeEventParams) => void),\n    onInput             ?: CallableFunction,\n    onFocus             ?: CallableFunction,\n    onBlur              ?: CallableFunction,\n    onBeforeValidation  ?: CallableFunction,\n    onAfterValidation   ?: CallableFunction,\n    onError             ?: CallableFunction, \n    \n    onKeyDown     ?: CallableFunction,\n    ignoreEmptyDOM ?: boolean,\n\n    customPattern ?: string\n    \n    showErrorState ?: boolean;\n    status ?: 'error' | \"none\";\n\n    labelRenderer ?: { new(): IRenderer } | undefined;\n    labelRendererParams ?: object;\n\n\n    clipboard ?: IClipboard | boolean;\n\n\n}\n\ntype ITextConfigurationKeys = keyof ITextConfiguration;\nfunction pickKeysFromInterface(keys: ITextConfigurationKeys[]): ITextConfigurationKeys[] {\n    return keys;\n}\n\nconst configArray = [\n    'appendTo',\n    'instanceID',\n    'clearButton',\n    'bordered',\n    'format',\n    'label',\n    'invalidHelperTextRendererParams',\n    'invalidHelperTextRenderer',\n    'ariaDescribedby',\n    'ariaLabelledBy',\n    'value',\n    'readonly',\n    'disabled',\n    'size',\n    'validator',\n    'validationMessage',\n    'required',\n    'name',\n    'allowNull',\n    'placeholder',\n    'title',\n    'ariaLabel',\n    'description',\n    'prefix',\n    'prefixRenderer',\n    'prefixRendererParams',\n    'suffix',\n    'suffixRenderer',\n    'suffixRendererParams',\n    'descriptionRenderer',\n    'descriptionRendererParams',\n    'validationMessageRenderer',\n    'validationMessageRendererParams',\n    'className',\n    'rtl',\n    'showCount',\n    'min',\n    'max',\n    'pattern',\n    'clampValueOnBlur',\n    'keepWithInRange',\n    'characterCase',\n    'addonBefore',\n    'addonAfter',\n    'onChange',\n    'onInput',\n    'onFocus',\n    'onBlur',\n    'onBeforeValidation',\n    'onAfterValidation',\n    'onError',\n    'onKeyDown',\n    'customPattern',\n    'defaultValue',\n    'labelRenderer',\n    'labelRendererParams',\n    'clipboard'\n];\n\n\n\nexport {\n    ITextConfiguration,\n    textLineFormatter,\n    pickKeysFromInterface,\n    configArray\n}\nexport type { IClipboard };","import { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { BEAN_NAME } from \"@dg/corecomponent\";\nimport { Context } from \"@dg/corecomponent/Context.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { UserComponentRegistry } from '@dg/corecomponent/UserComponentRegistry.js';\nimport { IModule } from '../../core/modules.types';\nimport { ITextConfiguration } from \"./text-configuration.types\";\n\nimport { TextOptionHandler } from \"./core/model/text-option-handler\";\nimport { Label } from \"../../label/label-view\";\nimport { DescriptionComponent } from \"../../description/description-view\";\nimport { TextStateManager } from \"./core/model/text-state-manager\";\nimport { TextUserComponentHandler } from \"./core/model/text-user-component-handler\";\nimport { TextInputComponent } from \"./core/text-input/text-input-view\";\nimport { TextAPI } from \"./core/model/text-api\";\nimport { TextControllerHandler } from \"./core/model/text-controller\";\nimport { SuffixComponent } from \"../../Suffix/suffix-view\";\nimport { PrefixComponent } from \"../../Prefix/prefix-view\";\nimport { RenderingTextInputComponent } from \"./core/rendering-text-input/rendering-text-input-view\";\nimport { ErrorComponent } from \"../../error/error-view\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\n\ninterface IUserParams {\n\tglobalEventListener      ?: Function;\n\tframeworkOverrides       ?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n\tmodules                  ?: IModule[];\n}\n\nexport const enum PropertyName {\n\tText_RENDERER = 'textRenderer',\n}\nlet nextInstanceId = 1;\n\nclass  TextCoreComponent {\n    constructor(){\n\n    }\n    initializeText( configuration: ITextConfiguration, params: IUserParams = {}, createUI: CallableFunction, ): void {\n\t\tconst instanceID = configuration?.instanceID ?? String(nextInstanceId++);\n\n\t\tconst beanClasses = this.CreateBeanClasses();\n\n\t\tconst context = new Context();\n\n\t\tconst userConfigurations = this.createuserConfiguration(\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t\tinstanceID\n\t\t);\n\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n\t\tthis.registerCoreComponent(context);\n\t\tcreateUI(context);\n\n\t\t(window as any).context = context;\n\n    }\n\tprivate CreateBeanClasses(): Set<any> {\n\t\tconst beanList= [\n\t\t\tComponentsRegistry,\n\t\t\tUserComponentRegistry,\n\t\t\tEventHandler,\n\t\t\tComponentMetadataProvider,\n\t\t\tTextOptionHandler,\n\t\t\tTextStateManager,\n\t\t\tTextUserComponentHandler,\n\t\t\tTextAPI,\n\t\t\tTextControllerHandler\n\t\t]\n\t\treturn new Set(beanList);\n\t}\n\tprivate createuserConfiguration( configuration: any, params: IUserParams, instanceID : string): { configuration: any; frameWorkOverrides: IFrameworkOverrides | null; globalEventListener: Function | null; frameworkComponentWrapper: any | null; instanceID : string; } {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n\n\tprivate registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nfunction createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n        {\n\t\t\tcomponentName: 'text-label',\n\t\t\tcomponentClass: Label\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'text-helper',\n            componentClass : DescriptionComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName :'text-input',\n\t\t\tcomponentClass : TextInputComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName : \"prefix\",\n\t\t\tcomponentClass : PrefixComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName : \"suffix\",\n            componentClass : SuffixComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName : \"render-text-input\",\n            componentClass : RenderingTextInputComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName : \"error\",\n\t\t\tcomponentClass : ErrorComponent\n\t\t}\n    ];\n\n\treturn components;\n}\n\nexport { \n    TextCoreComponent,\n    IUserParams,\n    createComponentList\n\n}","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { TextRootComponent } from \"./core/text-root/text-root-view\";\nimport { ITextConfiguration } from \"./text-configuration.types\";\nimport { TEXT_BEAN_NAME } from \"./constants/beanname-constants\";\nimport { ITextAPI } from \"./core/model/text-api.types\";\nimport { IUserParams, TextCoreComponent } from \"./text-core-component\";\nimport { RenderingTextRootComponent } from \"./core/rendering-text-root/rendering-text-root-view\";\n\nclass TextComponent {\n\tpublic api: ITextAPI | undefined;\n    constructor(configuration: ITextConfiguration, params?: IUserParams){\n        const createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(TEXT_BEAN_NAME.TEXT_API) as ITextAPI;\n            context.createBean(new TextRootComponent(configuration?.appendTo));\n\t\t};\n\t\tnew TextCoreComponent().initializeText(configuration, params, createUI);\n    }\n}\n\nclass RenderingTextComponent {\n\tpublic api: ITextAPI | undefined;\n    constructor(configuration: ITextConfiguration, params?: IUserParams){\n        const createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(TEXT_BEAN_NAME.TEXT_API) as ITextAPI;\n            context.createBean(new RenderingTextRootComponent(configuration?.appendTo));\n\t\t};\n\t\tnew TextCoreComponent().initializeText(configuration, params, createUI);\n    }\n}\n\nexport { \n    TextComponent,\n    RenderingTextComponent\n}\n","import {Component} from '@dg/corecomponent/Component.js'\n\nfunction getTemplate() {\n    // Create the tooltip element directly\n    const tooltipDiv = document.createElement('div');\n    tooltipDiv.className = 'ZCC-tooltip';\n    \n    return tooltipDiv;\n}\nexport class TooltipRenderer extends Component {\n    \n\tinit(params : any ) : void {\n        this.setTemplate(getTemplate())\n        this.setTooltip(params.value);\n    }\n\n    getElement() : HTMLElement {\n        return this.getGui();\n    }\n\n    private setTooltip(value : string) : void {\n        const element = this.getGui();\n\n        if(element) {\n            element.textContent = value\n        }\n    }\n}\n","import { AutoWired, BEAN_NAME, Bean,  getBeanInstanceByBeanName, } from '@dg/corecomponent';\nimport {   UserComponentHandler, } from '@dg/corecomponent/UserComponentHandler.js';\nimport {   UserComponentRegistry, } from '@dg/corecomponent/UserComponentRegistry.js';\nimport {   ComponentMetadata } from '@dg/corecomponent/ComponentMetadataProvider.js';\n\nexport const enum PropertyName {\n\tTOOL_TIP_RENDERER = 'tooltipRenderer',\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class TooltipUserComponentHandler extends UserComponentHandler {\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\n\n\tgetTooltipRendererDetails(item: any, params?: any) {\n\t\treturn this.getComponentDetail( item, PropertyName.TOOL_TIP_RENDERER, params, PropertyName.TOOL_TIP_RENDERER);\n\t}\n\n\n\tprotected getComponentDetail( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif (\n\t\t\tjsComponent == null &&\n\t\t\tframeworkComponent == null &&\n\t\t\tdefautName != null\n\t\t) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent =\n\t\t\t\t\tthis.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass(\n\t\t\tthis.getComponent(item, propertyName),\n\t\t);\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.TOOL_TIP_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap( component, componentMeta.mandatoryMethodList, componentMeta.optionalMethodList, );\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    getUserParams(item : any, propertyName : PropertyName, params : any) : any {\n        switch(propertyName) {\n            case PropertyName.TOOL_TIP_RENDERER:\n                return this.getUserRendererParams(item, params);\n            default:\n                return {};\n        }\n\n    }\n\n    private getUserRendererParams(item : any, params : any) : any {\n        const rendererParams = item.getUserRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n}\n","export const DEFAULT_TOOLTIP_VALUES = {\n\tDEFAULT_SHOW_DELAY_ON_HOVER     : 2000,\n\tDEFAULT_HIDE_DELAY_AFTER_SHOW   : 1000,\n\tQUICK_SHOW_DELAY_ADJUSTMENT     : 1000,\n\tFADE_OUT_DELAY_AFTER_INTERACTION: 1000,\n\tINTERACTIVE_HIDE_DELAY          : 100,\n};\n\nexport enum TooltipStates {\n\tIDLE,\n\tWAITING,\n\tDISPLAYING,\n}\n\nexport enum TooltipTriggerStates {\n\tHOVER = 'hover',\n\tFOCUS = 'focus',\n}\n","export const TooltipBeanName = {\n    TOOL_TIP_OPTIONS    : 'tooltipOptions',\n    TOOL_TIP_API        : 'tooltipAPI',\n    TOOL_TIP_ELEMENT    : 'tooltipElement',\n    TOOL_TIP_POP_HANDLER: 'tooltipPopHandler',\n    TOOL_TIP_CONTROLLER_HANDLER: 'tooltipControllerHandler'\n}","export const TooltipEvents = {\n    TOOLTIP_SHOW : 'tooltipShow',\n    TOOLTIP_HIDE : 'tooltipHide',\n    TOOLTIP_REFRESH : 'tooltipRefresh',\n    TOOLTIP_OPEN : 'tooltipOpen',\n    TOOLTIP_CLOSE : 'tooltipClose',\n    TOOLTIP_OPEN_BY_MOUSE : 'tooltipOpenByMouse',\n    TOOLTIP_CLOSE_BY_MOUSE : 'tooltipOpenByClose'\n\n}","import {  Bean } from \"@dg/corecomponent\";\nimport {   EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { TooltipBeanName } from \"./Constants/TooltipBeanName\";\nimport { ToolTipHandler } from \"./TooltipHandler\";\n\n@Bean(TooltipBeanName.TOOL_TIP_CONTROLLER_HANDLER)\nexport class TooltipControllerHandler extends EventEmitter {\n\n    private tooltipHandler!: ToolTipHandler;\n\n    registerTooltipHandler(handler : ToolTipHandler) : void {\n        this.tooltipHandler = handler;\n    }\n\n    getTooltipHandler() : ToolTipHandler {\n        return this.tooltipHandler;\n    }\n}","import { AutoWired, BEAN_NAME, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DEFAULT_TOOLTIP_VALUES, TooltipStates, TooltipTriggerStates } from \"./Constants/DefaultTooltipValues\";\nimport { ITooltipOptionsHandler } from \"./Interface/ITooltipOptionsHandler\";\nimport { TooltipBeanName } from \"./Constants/TooltipBeanName\";\nimport { TooltipUserComponentHandler } from \"./Components/TooltipUserComponentHandler\";\nimport { TooltipPopupHandler } from \"./TooltipPopHandler\";\nimport { TooltipEvents } from \"./Constants/TooltipEvents\";\nimport { Position } from \"./PopupHandler/CorePopupHandler\";\n\n\nexport class CustomTooltipHandler extends EventEmitter {\n\tprivate lastHiddenTimestamp!: number;\n\n\tprivate delayForTooltipToShow!: number;\n\tprivate delayForTooltipToHide!: number;\n\n\tprivate interactionModeEnabled = false;\n\tprivate isInteractingWithTooltip = false;\n\tprivate isTooltipLocked = false;\n\n\tprivate tooltipShowTimeoutId: number | undefined;\n\tprivate tooltipHideTimeoutId: number | undefined;\n\tprivate interactiveTooltipTimeoutId: number | undefined;\n\n\tprivate tooltipMouseEnterHandler!: (() => null) | null;\n\tprivate tooltipMouseLeaveHandler!: (() => null) | null;\n\tprivate tooltipFocusInHandler!: (() => null) | null;\n\tprivate tooltipFocusOutHandler!: (() => null) | null;\n\n\tprivate tooltipComponent: any;\n\n\tprivate tooltipComponentElement !: HTMLElement | null;\n\n\tprivate state = TooltipStates.IDLE;\n\n\tprivate lastMouseEvent!: MouseEvent | null;\n\n\tprivate tooltipPopupDestroyFunction: (() => void) | undefined;\n\n\tprivate tooltipInstanceCount = 0;\n\n\tprivate tooltipMouseTrack: boolean = false;\n\n\tprivate tooltipTrigger!: TooltipTriggerStates;\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\n\tprivate tooltipDestroy : boolean = false;\n\n\tprivate tooltipHideOnEscapeKey: boolean = false;\n\tprivate tooltipHideOnMouseDown: boolean = false;\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tif ( (this.optionsHandler as ITooltipOptionsHandler ).isTooltipInteraction() ) {\n\t\t\tthis.interactionModeEnabled = true;\n\t\t}\n\n\t\tthis.tooltipTrigger        = ( this.optionsHandler as ITooltipOptionsHandler ).getTriggerState();\n\t\tthis.delayForTooltipToShow = this.getTooltipDelay('show');\n\t\tthis.delayForTooltipToHide = this.getTooltipDelay('hide');\n\t\tthis.tooltipMouseTrack     = ( this.optionsHandler as ITooltipOptionsHandler ).isTooltipMouseTrack();\n\n\t\tconst shouldAttachEvents = (this.optionsHandler as ITooltipOptionsHandler).shouldAttachEvents();\n\n\n\t\tif(shouldAttachEvents) {\n\t\t\tthis.addEventListner();\n\t\t}\n\n\t\tthis.addListener(this.eventHandler, TooltipEvents.TOOLTIP_OPEN_BY_MOUSE, (params : any) => {\n\t\t\tthis.onMouseEnter(params.event)\n\t\t});\n\t\tthis.addListener(this.eventHandler, TooltipEvents.TOOLTIP_CLOSE_BY_MOUSE, this.onMouseLeave.bind(this));\n\t\t\n\t\tthis.addListener(this.eventHandler, TooltipEvents.TOOLTIP_OPEN, this.showTooltip.bind(this));\n\n\t\tthis.addListener(this.eventHandler, TooltipEvents.TOOLTIP_CLOSE,this.hideTooltip.bind(this));\n\t}\n\n\tprivate addEventListner() {\n\t\tconst element = this.getBeanInstanceByBeanName( TooltipBeanName.TOOL_TIP_ELEMENT) as HTMLElement;\n\n\t\tif (this.tooltipTrigger === TooltipTriggerStates.HOVER) {\n\t\t\tthis.addListener( element, 'mouseenter', this.onMouseEnter.bind(this));\n\n\t\t\tthis.addListener( element, 'mouseleave', this.onMouseLeave.bind(this));\n\n\t\t}\n\n\t\tif (this.tooltipTrigger === TooltipTriggerStates.FOCUS) {\n\t\t\tthis.addListener(element, 'focusin', this.onFocusIn.bind(this));\n\n\t\t\tthis.addListener(element, 'focusout', this.onFocusOut.bind(this));\n\t\t}\n\n\t\tthis.addListener(document.body, 'mousemove', this.onMouseMove.bind(this));\n\n\t\tif (!this.interactionModeEnabled) {\n\t\t\tthis.addListener(element, 'mousedown', this.onMouseDown.bind(this));\n\n\t\t\tthis.addListener(element, 'keydown', this.onKeyDown.bind(this));\n\t\t}\n\n\t\tthis.addListener(document.body, 'keydown', this.onKeyDown.bind(this));\n\t}\n\n\tpublic onMouseEnter(event: MouseEvent): void {\n\t\tthis.handleTooltipInteraction(event);\n\t\t\n\t}\n\n\tprivate handleTooltipInteraction(event: any): void {\n\t\tif (this.interactionModeEnabled && this.interactiveTooltipTimeoutId) {\n\t\t\tthis.unlockTooltip();\n\t\t\tthis.startHideTimeout();\n\t\t}\n\t\tconst tooltipHoverPosition = this.optionsHandler.getTooltipHoverPosition();\n\n\t\tif (this.isTooltipLocked) {\n\t\t\tthis.tooltipShowTimeoutId = window.setTimeout(() => {\n\t\t\t\t\n\t\t\t\tthis.prepareToShowTooltip(tooltipHoverPosition ? undefined: event);\n\t\t\t}, DEFAULT_TOOLTIP_VALUES.INTERACTIVE_HIDE_DELAY);\n\t\t} else {\n\t\t\tthis.prepareToShowTooltip(tooltipHoverPosition ? event : undefined);\n\t\t}\n\t}\n\n\tprivate onMouseMove(event: MouseEvent): void {\n\n\t\tif(this.tooltipHideOnEscapeKey ) {\n\t\t\tthis.handleTooltipInteraction(event);\n\t\t\tthis.tooltipHideOnEscapeKey = false;\n\n\t\t\treturn;\n\t\t}\n\t\tif(this.tooltipHideOnMouseDown) {\n\t\t\tthis.handleTooltipInteraction(event);\n\t\t\tthis.tooltipHideOnMouseDown = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.lastMouseEvent) {\n\t\t\tthis.lastMouseEvent = event;\n\t\t}\n\n\t\tif ( this.tooltipMouseTrack && this.state === TooltipStates.DISPLAYING && this.tooltipComponent ) {\n\t\t\tthis.positionTooltip();\n\t\t}\n\t}\n\n\tprivate onMouseDown(): void {\n\t\tconst shouldCancelOnMouseDown = (this.optionsHandler as ITooltipOptionsHandler).shouldCancelOnMouseDown();\n\t\tif(shouldCancelOnMouseDown) {\n\t\t\tthis.setIdleState();\n\t\t\tthis.tooltipHideOnMouseDown = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.tooltipHideOnMouseDown = false;\n\t}\n\n\tprivate onMouseLeave(): void {\n\t\tif (this.interactionModeEnabled) {\n\t\t\tthis.lockTooltip();\n\t\t} else {\n\t\t\tthis.setIdleState();\n\t\t}\n\t}\n\n\tprivate onFocusIn(): void {\n\t\tthis.prepareToShowTooltip();\n\t}\n\n\tprivate onFocusOut(event: FocusEvent): void {\n\t\tconst relatedTarget = event.relatedTarget as Element;\n\t\tconst parentCompGui = this.getBeanInstanceByBeanName( TooltipBeanName.TOOL_TIP_ELEMENT, ) as HTMLElement;\n\t\tconst tooltipGui = this.tooltipComponentElement;\n\n\t\tif (\n\t\t\tthis.isInteractingWithTooltip ||\n\t\t\tparentCompGui.contains(relatedTarget) ||\n\t\t\t(this.interactionModeEnabled && tooltipGui?.contains(relatedTarget))\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setIdleState();\n\t}\n\n\tprivate onKeyDown(_event: KeyboardEvent): void {\n\t\tconst shouldCancelOnEscape = (this.optionsHandler as ITooltipOptionsHandler).shouldCancelOnEscape();\n\t\tif(!shouldCancelOnEscape) {\n\t\t\tthis.hideTooltip(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif(shouldCancelOnEscape) {\n\t\t\tconst state = this.state;\n\t\t\tthis.setIdleState();\n\t\t\tstate === TooltipStates.DISPLAYING && (this.tooltipHideOnEscapeKey = true);\n\t\t\treturn\n\t\t}\n\n\t}\n\n\tprivate prepareToShowTooltip(mouseEvent?: MouseEvent): boolean {\n        if (this.state != TooltipStates.IDLE || this.isTooltipLocked) { return false; }\n\n        let delay = 0;\n\n        if (mouseEvent) {\n            delay = this.isLastTooltipHiddenRecently() ? 200 : this.delayForTooltipToShow;\n        }\n\n        this.lastMouseEvent = mouseEvent || null;\n\n        this.tooltipShowTimeoutId = window.setTimeout(this.showTooltip.bind(this), delay);\n\t\t\n        this.state = TooltipStates.WAITING;\n\n        return true;\n    }\n\n\tprivate isLastTooltipHiddenRecently(): boolean {\n\t\tconst now = new Date().getTime();\n\t\tconst then = this.lastHiddenTimestamp;\n\t\treturn now - then < DEFAULT_TOOLTIP_VALUES.QUICK_SHOW_DELAY_ADJUSTMENT;\n\t}\n\n\tprivate showTooltip(): void {\n\t\tconst params            = this.getTooltipParams();\n\t\tconst shouldShowTooltip = (this.optionsHandler as ITooltipOptionsHandler).shouldShowTooltip();\n        if (!params.value || (shouldShowTooltip && !shouldShowTooltip())) {\n            this.setIdleState();\n            return;\n        }\n\n        this.state = TooltipStates.DISPLAYING;\n\n        this.tooltipInstanceCount++;\n\n        const callback = this.afterTooltipRendererCallback.bind(this, this.tooltipInstanceCount);\n\n\t\tconst userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as TooltipUserComponentHandler;\n\n\t\tconst itemDetails = {\n\t\t\tgetRenderer : () => (this.optionsHandler as ITooltipOptionsHandler).getTooltipRenderer(),\n\t\t\tgetUserRendererParams : () => (this.optionsHandler as ITooltipOptionsHandler).getTooltipRendererParams()\n\t\t}\n        const userDetails = userComponentHandler && userComponentHandler.getTooltipRendererDetails(itemDetails, params);\n        \n\t\tif(userDetails) {\n\t\t\tconst instance = userDetails.newInstance();\n\t\t\tif(instance) {\n\t\t\t\tinstance!.then(callback);\n\t\t\t}\n\t\t}\n    }\n\n\t private afterTooltipRendererCallback(tooltipInstanceCopy: number, tooltipComponent: any): void {\n        const isDestroy = this.state !== TooltipStates.DISPLAYING || this.tooltipInstanceCount !== tooltipInstanceCopy;\n\n        if (isDestroy) {\n\t\t\tthis.destroyBean(tooltipComponent);\n\t\t\treturn;\n\t\t}\n\n        const eGui = tooltipComponent.getElement();\n\t\t// this.addClassNameForPopover(eGui);\n\n\t\tthis.tooltipComponentElement = eGui;\n\n        this.tooltipComponent = tooltipComponent;\n\n        if (!eGui.classList.contains('ZG-tooltip')) {\n            eGui.classList.add('ZG-tooltipCustom');\n        }\n\n        if (this.tooltipTrigger === TooltipTriggerStates.HOVER) {\n            eGui.classList.add('ZG-tooltipAnimate');\n        }\n\n        if (this.interactionModeEnabled) {\n            eGui.classList.add('ZG-tooltip-interactive');\n        }\n\n\t\tconst popupParentElement = (this.optionsHandler as ITooltipOptionsHandler).getPopupParent();\n\t\tconst documentElement    = (this.optionsHandler as ITooltipOptionsHandler).getDocumentElement();\n\t\tconst isRTL              = (this.optionsHandler as ITooltipOptionsHandler).isRTL();\n\t\tconst popupClassName     = (this.optionsHandler as ITooltipOptionsHandler).getPopupClassName();\n\n\n\n\t\tconst tooltipPopupHandler = this.getBeanInstanceByBeanName(TooltipBeanName.TOOL_TIP_POP_HANDLER) as TooltipPopupHandler;\n\n        const addPopupRes = tooltipPopupHandler.addPopup({\n\t\t\tchildElement: eGui,\n\t\t\tariaLabel   : 'tooltip',\n\t\t\trtl         : isRTL,\n\t\t\tpopupParentElement,\n\t\t\tdocumentElement,\n\t\t\tpopupClassName,\n\t\t});\n\n        if (addPopupRes) {\n            this.tooltipPopupDestroyFunction = addPopupRes.hideFunction;\n        }\n\n        this.positionTooltip();\n\n\n        if (this.interactionModeEnabled) {\n            if (this.tooltipTrigger === TooltipTriggerStates.HOVER) {\n                this.tooltipMouseEnterHandler = this.addListener(eGui, 'mouseenter', this.onTooltipMouseEnter.bind(this)) || null;\n                this.tooltipMouseLeaveHandler = this.addListener(eGui, 'mouseleave', this.onTooltipMouseLeave.bind(this)) || null;\n            } else {\n                this.tooltipFocusInHandler = this.addListener(eGui, 'focusin', this.onTooltipFocusIn.bind(this)) || null;\n                this.tooltipFocusOutHandler = this.addListener(eGui, 'focusout', this.onTooltipFocusOut.bind(this)) || null;\n            }\n        }\n\n\t\tthis.dispatchShowEvent();\n\n        this.startHideTimeout();\n    }\n\n\taddClassNameForPopover(eGui:HTMLElement){\n\t\tconst classNames = this.generateClassName();\n\t\tclassNames && classNames.forEach((className) => eGui.classList.add(className));\n\t}\n\n\tprivate generateClassName(): string[] | null {\n\t\tconst position: Position = this.optionsHandler.getPosition();\n\t\tconst tooltipHoverPosition = this.optionsHandler.getTooltipHoverPosition();\n\n\t\tif(!tooltipHoverPosition) {\n\t\t\treturn null;\n\t\t}\t\n\t\n\t\tconst classMap: { [key in Position]: string[] } = {\n\t\t\t[Position.under]      : ['dg-popover__pointer', 'dg-popover__pointer--under'],\n\t\t\t[Position.above]      : ['dg-popover__pointer', 'dg-popover__pointer--above'],\n\t\t\t[Position.over]       : ['dg-popover__pointer', 'dg-popover__pointer--over'],\n\t\t\t[Position.left]       : ['dg-popover__pointer', 'dg-popover__pointer--right'],\n\t\t\t[Position.right]      : ['dg-popover__pointer', 'dg-popover__pointer--left'],\n\t\t\t[Position.top]        : ['dg-popover__pointer', 'dg-popover__pointer--bottom'],\n\t\t\t[Position.topLeft]    : ['dg-popover__pointer', 'dg-popover__pointer--bottom-left'],\n\t\t\t[Position.topRight]   : ['dg-popover__pointer', 'dg-popover__pointer--bottom-right'],\n\t\t\t[Position.bottom]     : ['dg-popover__pointer', 'dg-popover__pointer--top'],\n\t\t\t[Position.bottomLeft] : ['dg-popover__pointer', 'dg-popover__pointer--top-left'],\n\t\t\t[Position.bottomRight]: ['dg-popover__pointer', 'dg-popover__pointer--top-right'],\n\t\t\t[Position.leftTop]    : ['dg-popover__pointer', 'dg-popover__pointer--right-top'],\n\t\t\t[Position.leftBottom] : ['dg-popover__pointer', 'dg-popover__pointer--right-bottom'],\n\t\t\t[Position.rightTop]   : ['dg-popover__pointer', 'dg-popover__pointer--left-top'],\n\t\t\t[Position.rightBottom]: ['dg-popover__pointer', 'dg-popover__pointer--left-bottom'],\n\t\t\t[Position.auto]       : ['dg-popover__pointer', 'dg-popover__pointer--auto'],\n\t\t\t[Position.center]     : ['dg-popover__pointer', 'dg-popover__pointer--center'],\n\t\t};\n\t\t\n\t\n\t\n\t\treturn classMap[position];\n\t}\n\t\n\n\tprivate positionTooltip(): void {\n\t\tconst tooltipPopupHandler = this.getBeanInstanceByBeanName(TooltipBeanName.TOOL_TIP_POP_HANDLER) as TooltipPopupHandler;\n\n\t\tconst popupParentElement = (this.optionsHandler as ITooltipOptionsHandler).getPopupParent();\n\t\tconst documentElement = (this.optionsHandler as ITooltipOptionsHandler).getDocumentElement();\n\n\t\tconst gapX = this.optionsHandler.getGapX();\n\t\tconst gapY = this.optionsHandler.getGapY();\n        if (this.lastMouseEvent) {\n            tooltipPopupHandler.positionPopupUnderMouseEvent({\n\t\t\t\tpopUpElement: this.tooltipComponentElement!,\n\t\t\t\tgapY,\n\t\t\t\tgapX,\n\t\t\t\tmouseEvent: this.lastMouseEvent,\n\t\t\t}, popupParentElement, documentElement);\n        } else {\n\t\t\tconst position         = this.optionsHandler.getPosition();\n\t\t\tconst keepWithinBounds = this.optionsHandler.isKeepWithinBounds();\n\t\t\tconst isRtl            = this.optionsHandler.isRTL();\n            tooltipPopupHandler.positionPopupByComponent({\n\t\t\t\tpopUpElement : this.tooltipComponentElement!,\n\t\t\t\tsourceElement: this.getBeanInstanceByBeanName( TooltipBeanName.TOOL_TIP_ELEMENT ) as HTMLElement,\n\t\t\t\tposition,\n\t\t\t\tkeepWithinBounds,\n\t\t\t\tgapY,\n\t\t\t\tgapX,\n\t\t\t\talignSide : isRtl ? 'right' : 'left',\n\t\t\t}, popupParentElement, documentElement, null, this.optionsHandler.getArrow());\n        }\n    }\n\n\t private onTooltipMouseEnter(): void {\n        this.isInteractingWithTooltip = true;\n        this.unlockTooltip();\n    }\n\n    private onTooltipMouseLeave(): void {\n        this.isInteractingWithTooltip = false;\n        this.lockTooltip();\n    }\n\n    private onTooltipFocusIn(): void {\n        this.isInteractingWithTooltip = true;\n    }\n\n    private onTooltipFocusOut(event: FocusEvent): void {\n        const parentGui     = this.getBeanInstanceByBeanName( TooltipBeanName.TOOL_TIP_ELEMENT ) as HTMLElement;\n        const tooltipGui    = this.tooltipComponentElement;\n        const relatedTarget = event.relatedTarget as Element;\n\n        if (tooltipGui?.contains(relatedTarget)) { return; }\n\n        this.isInteractingWithTooltip = false;\n\n        if (parentGui.contains(relatedTarget)) {\n            this.startHideTimeout();\n        }else {\n            this.hideTooltip();\n        }\n    }\n\n\tpublic hideTooltip(forceHide?: boolean): void {\n\t\tif (!forceHide && this.isInteractingWithTooltip) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.tooltipComponent) {\n\t\t\tthis.destroyTooltipComponent();\n\t\t\tthis.lastHiddenTimestamp = new Date().getTime();\n\t\t}\n\n\t\tthis.state = TooltipStates.IDLE;\n\t}\n\n\tprivate destroyTooltipComponent(): void {\n\t\tthis.tooltipComponentElement && this.tooltipComponentElement!.classList.add(\n\t\t\t'ZG-tooltipHiding',\n\t\t);\n\n\t\tconst tooltipPopupDestroyFunction = this.tooltipPopupDestroyFunction;\n\t\tconst tooltipComponent = this.tooltipComponent;\n\t\tconst shouldAttachEvents = (this.optionsHandler as ITooltipOptionsHandler).shouldAttachEvents()\n\t\tconst delay = this.tooltipTrigger === TooltipTriggerStates.HOVER ? (this.optionsHandler as ITooltipOptionsHandler).getFadeOutDelayAfterInteraction() : 0;\n\n\t\tif (!shouldAttachEvents) {\n\t\t\ttooltipPopupDestroyFunction && tooltipPopupDestroyFunction!();\n\t\t\tthis.destroyBean(tooltipComponent);\n\t\t}else {\n\t\t\twindow.setTimeout(() => {\n\t\t\t\ttooltipPopupDestroyFunction && tooltipPopupDestroyFunction!();\n\t\t\t\tthis.destroyBean(tooltipComponent);\n\t\t\t}, delay);\n\t\t}\n\t\t\t\n\t\t\n\t\tthis.clearTooltipListeners();\n\t\tthis.tooltipPopupDestroyFunction = undefined;\n\t\tthis.tooltipComponent = undefined;\n\t\tthis.tooltipComponentElement = null\n\n\t\t!this.tooltipDestroy && this.dispatchHideEvent();\n\t}\n\n\tprivate dispatchHideEvent() {\n\t\tthis.dispatchEvent({\n\t\t\ttype         : TooltipEvents.TOOLTIP_HIDE,\n\t\t\tparentElement: this.getBeanInstanceByBeanName( TooltipBeanName.TOOL_TIP_ELEMENT ) as HTMLElement\n\t\t})\n\t}\n\n\tprivate dispatchShowEvent() {\n\t\tthis.dispatchEvent({\n\t\t\ttype          : TooltipEvents.TOOLTIP_SHOW,\n\t\t\tparentElement : this.getBeanInstanceByBeanName( TooltipBeanName.TOOL_TIP_ELEMENT ) as HTMLElement,\n\t\t\ttooltipElement: this.tooltipComponentElement\n\t\t})\n\t}\n\n\tprivate clearTooltipListeners(): void {\n\t\tconst listenrs = [\n\t\t\tthis.tooltipMouseEnterHandler,\n\t\t\tthis.tooltipMouseLeaveHandler,\n\t\t\tthis.tooltipFocusInHandler,\n\t\t\tthis.tooltipFocusOutHandler,\n\t\t];\n\t\tlistenrs.forEach((listener) => listener && listener());\n\t\tthis.tooltipMouseEnterHandler = this.tooltipMouseLeaveHandler = this.tooltipFocusInHandler = this.tooltipFocusOutHandler = null;\n\t}\n\n\tprivate setIdleState(): void {\n\t\tif (this.state === TooltipStates.DISPLAYING) {\n\t\t\tthis.hideTooltip();\n\t\t}\n\n\t\tthis.clearTimeouts();\n\n\t\tthis.state = TooltipStates.IDLE;\n\n\t\tthis.lastMouseEvent = null;\n\t}\n\n\tprivate lockTooltip(): void {\n\t\tconst interactionHideDelay = this.optionsHandler.getInteractionHideDelay();\n\t\tthis.isTooltipLocked = true;\n\t\tthis.interactiveTooltipTimeoutId = window.setTimeout(() => { this.unlockTooltip(); this.setIdleState(); }, interactionHideDelay);\n\t}\n\n\tprivate unlockTooltip(): void {\n\t\tthis.isTooltipLocked = false;\n\t\tthis.clearInteractiveTimeout();\n\t}\n\n\tprivate startHideTimeout(): void {\n\t\tthis.clearHideTimeout();\n\t\tconst hideTooltip = this.optionsHandler.getHideTooltip();\n\t\tif(!hideTooltip){\n\t\t\treturn\n\t\t}\n\t\tthis.tooltipHideTimeoutId = window.setTimeout( this.hideTooltip.bind(this), this.delayForTooltipToHide );\n\t}\n\n\tprivate clearShowTimeout(): void {\n\t\tif (!this.tooltipShowTimeoutId) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.clearTimeout(this.tooltipShowTimeoutId);\n\t\tthis.tooltipShowTimeoutId = undefined;\n\t}\n\n\tprivate clearHideTimeout(): void {\n\t\tif (!this.tooltipHideTimeoutId) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.clearTimeout(this.tooltipHideTimeoutId);\n\t\tthis.tooltipHideTimeoutId = undefined;\n\t}\n\n\tprivate clearInteractiveTimeout(): void {\n\t\tif (!this.interactiveTooltipTimeoutId) {\n\t\t\treturn;\n\t\t}\n\n\t\twindow.clearTimeout(this.interactiveTooltipTimeoutId);\n\t\tthis.interactiveTooltipTimeoutId = undefined;\n\t}\n\n\tprivate clearTimeouts(): void {\n\t\tthis.clearShowTimeout();\n\t\tthis.clearHideTimeout();\n\t\tthis.clearInteractiveTimeout();\n\t}\n\n\tprivate getTooltipShowDelay(): number | undefined {\n\t\tconst delay = ( this.optionsHandler as ITooltipOptionsHandler ).getTooltipShowDelay();\n\t\tif (delay != null) {\n\t\t\treturn Math.max(0, delay);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate getTooltipHideDelay(): number | undefined {\n\t\tconst delay = (\n\t\t\tthis.optionsHandler as ITooltipOptionsHandler\n\t\t).getTooltipHideDelay();\n\t\tif (delay != null) {\n\t\t\treturn Math.max(0, delay);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate getTooltipDelay(type: 'show' | 'hide'): number {\n\t\tif (type === 'show') {\n\t\t\treturn (\n\t\t\t\tthis.getTooltipShowDelay() ??\n\t\t\t\tDEFAULT_TOOLTIP_VALUES.DEFAULT_SHOW_DELAY_ON_HOVER\n\t\t\t);\n\t\t} else {\n\t\t\treturn (\n\t\t\t\tthis.getTooltipHideDelay() ??\n\t\t\t\tDEFAULT_TOOLTIP_VALUES.DEFAULT_HIDE_DELAY_AFTER_SHOW\n\t\t\t);\n\t\t}\n\t}\n\n\tpublic getTooltipParams() {\n        return {                                     \n            value              : (this.optionsHandler as ITooltipOptionsHandler).getTooltipValue(),\n            hideTooltipCallback: () => this.hideTooltip(true)\n        };\n    }\n\n\tpublic destroy(): void {\n\t\tif(this.tooltipDestroy) {return;}\n\n\t\tthis.tooltipDestroy = true;\n\n\t\tthis.destroyTooltipComponent();\n\n\t\tsuper.destroy();\n\t}\n}\n","import { getAbsoluteHeight, getAbsoluteWidth, getElementRectWithOffset, setAriaLabel, setAriaRole, IRect } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\nexport interface IPosition {\n\tx: number;\n\ty: number;\n\tposition : Position | null;\n\tsourceRect : any;\n\tparentRect : any;\n}\n\nexport enum DIRECTION {\n\tvertical,\n\thorizontal,\n}\n\ninterface CalculatedPosition {\n    top: number;\n    left: number;\n}\n\nexport interface PopupPositionParams {\n\tpopUpElement     : HTMLElement;\n\tgapX            ?: number;\n\tgapY            ?: number;\n\tposition        ?: Position;\n\talignSide       ?: 'left' | 'right';\n\tkeepWithinBounds?: boolean;\n\tupdatePosition  ?: () => IPosition;\n\trelativePosition ?:boolean;\n}\n\nexport const enum Position {\n\tunder       = 'under',\n\tabove       = 'above',\n\tover        = 'over',\n\tleft        = 'left',\n\tright       = 'right',\n\ttop         = 'top',\n\ttopLeft     = 'topLeft',\n\ttopRight    = 'topRight',\n\tbottom      = 'bottom',\n\tbottomLeft  = 'bottomLeft',\n\tbottomRight = 'bottomRight',\n\tleftTop     = 'leftTop',\n\tleftBottom  = 'leftBottom',\n\trightTop    = 'rightTop',\n\trightBottom = 'rightBottom',\n\tauto        = 'auto',\n\tcenter      = 'center',\n}\n\nexport interface AfterGuiAttachedParams {\n\thidePopup?: () => void;\n\tsuppressFocus?: boolean;\n}\n\nexport interface PopupComponentPositionParams extends PopupPositionParams {\n\tsourceElement: HTMLElement;\n}\n\nexport interface Popup {\n\telement: HTMLElement;\n\twrapper: HTMLElement;\n\thideFunction: () => void;\n\tinstanceId: number;\n\talignedToElement: HTMLElement | undefined;\n\trelativeObserver : ResizeObserver | null;\n}\n\nexport interface AddPopupParams {\n    childElement       : HTMLElement;\n\t\n    closedCallback    ?: (e?: MouseEvent | TouchEvent | KeyboardEvent) => void;\n    afterGuiAttached  ?: (params: AfterGuiAttachedParams) => void;\n    positionCallback  ?: () => void;\n    ariaLabel          : string;\n    anchorToElement   ?: HTMLElement;\n    popupParentElement?: HTMLElement;\n    documentElement   ?: Document;\n    rtl               ?: boolean;\n    popupClassName    ?: string;\n}\n\nexport interface AddPopupOutput {\n\thideFunction: () => void;\n}\n\nexport class CorePopupHandler extends EventEmitter {\n\tprotected popupList: Popup[] = [];\n\n\tprotected instanceId = 0;\n\n\tpositionPopupByComponent( params: PopupComponentPositionParams, popupParentElement: HTMLElement = document.body, documentElement: Document = document, fallBackPositions : Position[] | null = null,arrow : boolean = false): void {\n\t\tlet { popUpElement, gapX = 0, gapY = 0, keepWithinBounds, sourceElement, alignSide = 'left', position = 'over', relativePosition} = params;\n\n\t\t\n\n\t\tconst popupIndex = this.getPopupIndex(popUpElement);\n\t\t\n\t\t\n\n\t\tconst updatePosition = () => {\n\n\t\t\tconst sourceRect = sourceElement.getBoundingClientRect();\n\t\t\tconst parentRect = this.getParentRect( popupParentElement, documentElement, ) as DOMRect;\n\n\t\t\tposition = this.flipPositionForAlign(position as Position, alignSide);\n\n\t\t\tposition = this.calculateAllPopupPosition(popUpElement, sourceRect, parentRect, position as Position, gapX, gapY, fallBackPositions)\n\n\t\t\tconst calculatedPosition = (this.calculatePositionByPosition(position as Position, alignSide, gapX as number, gapY as number, sourceRect, parentRect, popUpElement, arrow ));\n\n\t\t\treturn { x : calculatedPosition.left, y : calculatedPosition.top , position : position as any, sourceRect, parentRect};\n\t\t};\n\n\t\t\n\t\tif (popupIndex !== -1) {\n\t\t\tconst popup = this.popupList[popupIndex];\n\t\t\tpopup.alignedToElement = sourceElement;\n\t\t\tif(relativePosition) {\n\t\t\t\tlet observer = new ResizeObserver(() => {\n\t\t\t\t\tthis.positionPopup( { popUpElement, gapX, gapY, keepWithinBounds, updatePosition, }, popupParentElement, documentElement, );\n\t\t\t\t})\n\t\t\t\tpopup.relativeObserver = observer;\n\t\n\t\t\t\tobserver.observe(sourceElement);\n\t\t\t\tobserver.observe(popUpElement);\n\n\t\t\t}\n\t\t}\n\n\t\tthis.positionPopup( { popUpElement, gapX, gapY, keepWithinBounds, updatePosition, }, popupParentElement, documentElement,arrow );\n\t}\n\n\tgetWrapperElement(element: HTMLElement): HTMLElement {\n\t\tconst popupIndex = this.getPopupIndex(element);\n\t\treturn this.popupList[popupIndex].wrapper;\n\t}\n\n\tprivate flipPositionForAlign( position: Position, alignSide: string ): Position {\n\t\tif (alignSide === 'right') {\n\t\t\tswitch (position) {\n\t\t\t\tcase Position.left:\n\t\t\t\t\treturn Position.right;\n\t\t\t\tcase Position.right:\n\t\t\t\t\treturn Position.left;\n\t\t\t\tcase Position.leftTop:\n\t\t\t\t\treturn Position.rightTop;\n\t\t\t\tcase Position.leftBottom:\n\t\t\t\t\treturn Position.rightBottom;\n\t\t\t\tcase Position.rightTop:\n\t\t\t\t\treturn Position.leftTop;\n\t\t\t\tcase Position.rightBottom:\n\t\t\t\t\treturn Position.leftBottom;\n\t\t\t\tdefault:\n\t\t\t\t\treturn position;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn position; \n\t}\n\n\tprivate updateArrow( tooltip: HTMLElement, position: Position, sourceRect: DOMRect, parentRect: DOMRect, finalLeft: number, finalTop: number ) {\n\t\ttooltip.style.setProperty(\"--popover-pointer-left\", \"unset\");\n\t\ttooltip.style.setProperty(\"--popover-pointer-right\", \"unset\");\n\t\ttooltip.style.setProperty(\"--popover-pointer-top\", \"unset\");\n\t\ttooltip.style.setProperty(\"--popover-pointer-bottom\", \"unset\");\n\n\t\tthis.setArrowStyles(tooltip, position);\n\n\t\tconst srcLeft = sourceRect.left - parentRect.left;\n\t\tconst srcTop  = sourceRect.top  - parentRect.top;\n\n\t\tconst srcRight  = srcLeft + sourceRect.width;\n\t\tconst srcBottom = srcTop  + sourceRect.height;\n\n\t\tconst padding = 10;\n\n\t\tlet arrowLeft: number = 0;\n\t\tlet arrowTop: number = 0;\n\n\t\tswitch (position) {\n\t\t\tcase Position.leftTop:\n\t\t\t\tarrowTop = srcTop - finalTop + padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-right\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.leftBottom:\n\t\t\t\tarrowTop = srcBottom - finalTop - 2 * padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-right\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.left:\n\t\t\t\tarrowTop = srcTop + sourceRect.height / 2 - finalTop;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-right\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.rightTop:\n\t\t\t\tarrowTop = srcTop - finalTop + padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.rightBottom:\n\t\t\t\tarrowTop = srcBottom - finalTop - 2 * padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.right:\n\t\t\t\tarrowTop = srcTop + sourceRect.height / 2 - finalTop;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.topLeft:\n\t\t\t\tarrowLeft = srcLeft - finalLeft + padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-bottom\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.topRight:\n\t\t\t\tarrowLeft = srcRight - finalLeft - 2 * padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-bottom\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.top:\n\t\t\t\tarrowLeft = srcLeft + sourceRect.width / 2 - finalLeft;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-bottom\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.bottomLeft:\n\t\t\t\tarrowLeft = srcLeft - finalLeft + padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.bottomRight:\n\t\t\t\tarrowLeft = srcRight - finalLeft - 2 * padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.bottom:\n\t\t\tcase Position.under:\n\t\t\t\tarrowLeft = srcLeft + sourceRect.width / 2 - finalLeft;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\n\n\n\n\tpublic calculatePositionByPosition(position : Position, alignSide : 'right' | 'left', gapX : number, gapY : number, sourceRect : DOMRect, parentRect : DOMRect, toolTipElement : HTMLElement, arrow : boolean = false) : CalculatedPosition {\n\t\tlet top = 0;\n\t\tlet left = 0;\n\n\t\tswitch(position) {\n\t\t\tcase Position.left: \n\t\t\t\tleft = (sourceRect.left - parentRect.left) - toolTipElement.offsetWidth - gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top - (toolTipElement.offsetHeight / 2 )) + (sourceRect.height / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.leftTop: \n\t\t\t\tleft = (sourceRect.left - parentRect.left) - toolTipElement.offsetWidth - gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top);\n\t\t\t\tbreak;\n\t\t\tcase Position.leftBottom: \n\t\t\t\tleft = (sourceRect.left - parentRect.left) - toolTipElement.offsetWidth - gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top) - (toolTipElement.offsetHeight ) + (sourceRect.height);\n\t\t\t\tbreak;\n\t\t\tcase Position.right:\n\t\t\t\tleft = (sourceRect.left - parentRect.left) + sourceRect.width + gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top - (toolTipElement.offsetHeight / 2 )) + (sourceRect.height / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.rightTop:\n\t\t\t\tleft = (sourceRect.left - parentRect.left) + sourceRect.width + gapX;\n\t\t\t\ttop = sourceRect.top - parentRect.top;\n\t\t\t\tbreak;\n\t\t\tcase Position.rightBottom:\n\t\t\t\tleft = (sourceRect.left - parentRect.left) + sourceRect.width + gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top) - (toolTipElement.offsetHeight ) + (sourceRect.height);\n\t\t\t\tbreak;\n\t\t\tcase Position.top:\n\t\t\t\ttop = (sourceRect.top - parentRect.top) - toolTipElement.offsetHeight - gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) - (toolTipElement.offsetWidth / 2)) + (sourceRect.width / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.topLeft:\n\t\t\tcase Position.above:\n\t\t\t\ttop = (sourceRect.top - parentRect.top) - toolTipElement.offsetHeight - gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left));\n\t\t\t\tbreak;\n\t\t\tcase Position.topRight:\n\t\t\t\ttop = sourceRect.top - parentRect.top - toolTipElement.offsetHeight - gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) + (sourceRect.width - toolTipElement.offsetWidth));\n\t\t\t\tbreak;\n\t\t\tcase Position.bottom:\n\t\t\t\ttop = (sourceRect.top - parentRect.top) + sourceRect.height + gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) - (toolTipElement.offsetWidth / 2)) + (sourceRect.width / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.bottomLeft:\n\t\t\tcase Position.under:\n\t\t\t\ttop = sourceRect.top - parentRect.top + sourceRect.height + gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left));\n\t\t\t\tbreak;\n\t\t\tcase Position.bottomRight:\n\t\t\t\ttop = sourceRect.top - parentRect.top + sourceRect.height + gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) + (sourceRect.width - toolTipElement.offsetWidth));\n\t\t\t\tbreak;\n\t\t\tcase Position.over:\n\t\t\t\ttop  = sourceRect.top - parentRect.top;\n\t\t\t\tleft = sourceRect.left - parentRect.left;\n\t\t\t\tif (alignSide === 'right') {\n\t\t\t\t\tleft -= toolTipElement.offsetWidth - sourceRect.width;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase Position.center:\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) - (toolTipElement.offsetWidth / 2)) + (sourceRect.width / 2);\n\t\t\t\ttop = (sourceRect.top - parentRect.top - (toolTipElement.offsetHeight / 2 )) + (sourceRect.height / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.auto: {\n\t\t\t\tconst calculatedPosition = this.findAutoPosition(alignSide, gapX, gapY, sourceRect, parentRect, toolTipElement);\n\t\t\t\ttop = calculatedPosition.top;\n\t\t\t\tleft = calculatedPosition.left;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.setAlignedStyles(toolTipElement, position);\n\n\t\tconst ARROW_OFFSET = arrow ? 6 : 0;\n\n\t\tswitch (position) {\n\t\t\tcase Position.left:\n\t\t\tcase Position.leftTop:\n\t\t\tcase Position.leftBottom:\n\t\t\t\tleft -= ARROW_OFFSET;\n\t\t\t\tbreak;\n\n\t\t\tcase Position.right:\n\t\t\tcase Position.rightTop:\n\t\t\tcase Position.rightBottom:\n\t\t\t\tleft += ARROW_OFFSET;\n\t\t\t\tbreak;\n\n\t\t\tcase Position.top:\n\t\t\tcase Position.topLeft:\n\t\t\tcase Position.topRight:\n\t\t\t\ttop -= ARROW_OFFSET;\n\t\t\t\tbreak;\n\n\t\t\tcase Position.bottom:\n\t\t\tcase Position.bottomLeft:\n\t\t\tcase Position.bottomRight:\n\t\t\t\ttop += ARROW_OFFSET;\n\t\t\t\tbreak;\n\n\t\t\tcase Position.over:\n\t\t\t\tbreak;\n\n\t\t\tcase Position.center:\n\t\t\tcase Position.auto:\n\t\t\t\tbreak;\n\t\t}\n\n\n\t\treturn {\n\t\t\ttop,\n\t\t\tleft\n\t\t}\n\t}\n\n\tprivate findAutoPosition( alignSide : 'right' | 'left', gapX : number, gapY : number,  sourceRect: DOMRect, parentRect: DOMRect, toolTipElement: HTMLElement ): CalculatedPosition {\n\t\tconst positionsToTry: Position[] = [\n\t\t\t// Position.bottomLeft,\n\t\t\tPosition.bottom,\n\t\t\t// Position.bottomRight,\n\t\t\t// Position.topLeft,\n\t\t\tPosition.top,\n\t\t\t// Position.topRight,\n\t\t\t// Position.leftTop,\n\t\t\tPosition.left,\n\t\t\t// Position.leftBottom,\n\t\t\t// Position.rightTop,\n\t\t\tPosition.right,\n\t\t\t// Position.rightBottom\n\t\t];\n\n\t\tlet bestPosition: CalculatedPosition = { top: 0, left: 0, };\n\n\t\tfor (let i = 0 ;i< positionsToTry.length ;i++) {\n\t\t\tconst position = positionsToTry[i];\n\n\t\t\tconst calculatedPosition = this.calculatePositionByPosition( position, alignSide, gapX, gapY, sourceRect, parentRect, toolTipElement );\n\n\t\t\tconst fitsInParent = calculatedPosition.left >= 0 && calculatedPosition.left + toolTipElement.offsetWidth <= parentRect.width && calculatedPosition.top >= 0 && calculatedPosition.top + toolTipElement.offsetHeight <= parentRect.height;\n\n\t\t\tif (fitsInParent) {\n\t\t\t\tbestPosition = calculatedPosition;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn bestPosition;\n\t}\n\n\tpublic positionPopupUnderMouseEvent( params: PopupPositionParams & { mouseEvent: MouseEvent | Touch; }, popupParentElement: HTMLElement = document.body, documentElement: Document = document , arrow : boolean = false): void {\n\t\tconst { popUpElement, gapX, gapY } = params;\n\n\n\t\tthis.positionPopup({ popUpElement, gapX, gapY, keepWithinBounds: true, updatePosition: () => this.calculatePointerAlign( params.mouseEvent, popupParentElement, documentElement)}, popupParentElement, documentElement, arrow);\n\t}\n\n\tprivate calculatePointerAlign( e: MouseEvent | Touch, popupParentElement: HTMLElement = document.body, documentElement: Document = document, ): { x: number; y: number;  position : any, sourceRect : any, parentRect : any} {\n\t\tconst parentRect = this.getParentRect( popupParentElement, documentElement, );\n\t\treturn {\n\t\t\tx: e.clientX - parentRect.left,\n\t\t\ty: e.clientY - parentRect.top,\n\t\t\tposition : null,\n\t\t\tsourceRect : null,\n\t\t\tparentRect : null\n\t\t};\n\t}\n\n\tpositionPopup( params: PopupPositionParams, popupParentElement: HTMLElement = document.body, documentElement: Document = document,arrow : boolean = false ): void {\n\t\tconst { popUpElement, keepWithinBounds,gapX = 0, gapY = 0, updatePosition } = params;\n\t\tconst lastSize = { width: 0, height: 0 };\n\n\t\tconst updatePopupPosition = () => {\n\t\t\tlet { x, y , position, sourceRect, parentRect} = updatePosition!();\n\n\t\t\tif ( popUpElement.clientWidth === lastSize.width && popUpElement.clientHeight === lastSize.height ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlastSize.width = popUpElement.clientWidth;\n\t\t\tlastSize.height = popUpElement.clientHeight;\n\n\t\t\tx += gapX;\n\n\t\t\ty += gapY\n\n\t\t\tif (keepWithinBounds) {\n\t\t\t\tx = this.ensureXYBoundaries( popUpElement, x, DIRECTION.horizontal, popupParentElement, documentElement, );\n\t\t\t\ty = this.ensureXYBoundaries( popUpElement, y, DIRECTION.vertical, popupParentElement, documentElement, );\n\t\t\t}\n\n\t\t\tarrow && position && this.updateArrow(popUpElement, position, sourceRect, parentRect, x, y);\n\t\t\tpopUpElement.style.left = `${x}px`;\n\t\t\tpopUpElement.style.top = `${y}px`;\n\t\t};\n\n\t\tupdatePopupPosition();\n\t}\n\n\taddPopup(params: AddPopupParams): AddPopupOutput {\n\t\tlet { childElement, ariaLabel, positionCallback, anchorToElement, afterGuiAttached, popupParentElement = document.body, documentElement = document, rtl, popupClassName } = params;\n\n\t\tif (!documentElement) {\n\t\t\treturn { hideFunction: () => {} };\n\t\t}\n\n\t\tconst popupIndex = this.getPopupIndex(childElement);\n\n\t\tif (popupIndex !== -1) {\n\t\t\tconst popup = this.popupList[popupIndex];\n\t\t\treturn { hideFunction: popup.hideFunction };\n\t\t}\n\n\t\t// this.initialisePopupPosition(childElement, popupParentElement);\n\n\t\tconst wrapperElement = this.createPopupWrapper(childElement, ariaLabel, popupClassName, rtl, popupParentElement);\n\t\tconst removePopup = () => {\n\t\t\tif (popupParentElement) {\n\t\t\t\tif (popupParentElement.contains(wrapperElement)) {\n\t\t\t\t\tpopupParentElement.removeChild(wrapperElement);\n\t\t\t\t}\n\t\t\t\tthis.removePopupFromPopupList(childElement);\n\t\t\t}\n\t\t};\n\n\t\tif (afterGuiAttached) {\n\t\t\tafterGuiAttached({\n\t\t\t\thidePopup: removePopup,\n\t\t\t});\n\t\t}\n\n\t\tthis.popupList.push({ element: childElement, wrapper: wrapperElement, hideFunction: removePopup, instanceId: this.instanceId++, alignedToElement: anchorToElement, relativeObserver : null });\n\n\t\tif (positionCallback) {\n\t\t\tpositionCallback();\n\t\t}\n\n\t\treturn {\n\t\t\thideFunction: removePopup,\n\t\t};\n\t}\n\n\tprotected setArrowStyles(popupElement: HTMLElement, positioned: Position | null) {\n\t\t// remove all pointer classes\n\t\tconst classes = [\n\t\t\t\"dg-popover__pointer--right-top\",\n\t\t\t\"dg-popover__pointer--right-middle\",\n\t\t\t\"dg-popover__pointer--right-bottom\",\n\t\t\t\"dg-popover__pointer--left-top\",\n\t\t\t\"dg-popover__pointer--left-middle\",\n\t\t\t\"dg-popover__pointer--left-bottom\",\n\t\t\t\"dg-popover__pointer--top-left\",\n\t\t\t\"dg-popover__pointer--top-center\",\n\t\t\t\"dg-popover__pointer--top-right\",\n\t\t\t\"dg-popover__pointer--bottom-left\",\n\t\t\t\"dg-popover__pointer--bottom-center\",\n\t\t\t\"dg-popover__pointer--bottom-right\",\n\t\t];\n\n\t\tclasses.forEach(cls => popupElement.classList.remove(cls));\n\n\t\tif (!positioned) return;\n\n\t\tswitch (positioned) {\n\n\t\t\t// RIGHT SIDE POINTERS\n\t\t\tcase Position.right:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--left-middle\");\n\t\t\t\tbreak;\n\t\t\tcase Position.rightTop:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--left-top\");\n\t\t\t\tbreak;\n\t\t\tcase Position.rightBottom:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--left-bottom\");\n\t\t\t\tbreak;\n\n\t\t\t// LEFT SIDE POINTERS\n\t\t\tcase Position.left:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--right-middle\");\n\t\t\t\tbreak;\n\t\t\tcase Position.leftTop:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--right-top\");\n\t\t\t\tbreak;\n\t\t\tcase Position.leftBottom:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--right-bottom\");\n\t\t\t\tbreak;\n\n\t\t\t// TOP SIDE POINTERS\n\t\t\tcase Position.top:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--bottom-center\");\n\t\t\t\tbreak;\n\t\t\tcase Position.topLeft:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--bottom-left\");\n\t\t\t\tbreak;\n\t\t\tcase Position.topRight:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--bottom-right\");\n\t\t\t\tbreak;\n\n\t\t\t// BOTTOM SIDE POINTERS\n\t\t\tcase Position.bottom:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--top-center\");\n\t\t\t\tbreak;\n\t\t\tcase Position.bottomLeft:\n\t\t\tcase Position.under:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--top-left\");\n\t\t\t\tbreak;\n\t\t\tcase Position.bottomRight:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--top-right\");\n\t\t\t\tbreak;\n\n\t\t\t// No arrow\n\t\t\tcase Position.over:\n\t\t\tcase Position.above:\n\t\t\tcase Position.center:\n\t\t\tcase Position.auto:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\n\tprotected setAlignedStyles( popupElement: HTMLElement, positioned: Position | null, ) {\n\t\tconst popupIndex = this.getPopupIndex(popupElement);\n\n\t\tif (popupIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst popup = this.popupList[popupIndex];\n\n\t\tconst { alignedToElement } = popup;\n\n\t\tif (!alignedToElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst positions = [ Position.left, Position.leftTop, Position.leftBottom, Position.right, Position.rightTop, Position.rightBottom, Position.top, Position.topLeft, Position.topRight, Position.bottom, Position.bottomLeft, Position.bottomRight, Position.over, Position.above, Position.under];\n\n\t\tpositions.forEach((position) => {\n\t\t\talignedToElement.classList.remove('ZG-has-popup');\n\t\t\talignedToElement.classList.remove(\n\t\t\t\t`ZG-has-popup-positioned-${position}`,\n\t\t\t);\n\t\t\tpopupElement.classList.remove(`ZG-popup-positioned-${position}`);\n\t\t});\n\n\t\tif (!positioned) {\n\t\t\treturn;\n\t\t}\n\n\t\talignedToElement.classList.add('ZG-has-popup');\n\t\talignedToElement.classList.add(`ZG-has-popup-positioned-${positioned}`);\n\t\tpopupElement.classList.add(`ZG-popup-positioned-${positioned}`);\n\t}\n\n\tprotected getPopupIndex(element: HTMLElement): number {\n\t\treturn this.popupList.findIndex((popup) => popup.element === element);\n\t}\n\n\tprotected initialisePopupPosition(\n\t\telement: HTMLElement,\n\t\tpopupParentElement: HTMLElement = document.body,\n\t): void {\n\t\tconst popupParentElementRect =\n\t\t\tpopupParentElement.getBoundingClientRect();\n\n\t\tif (element) {\n\t\t\telement.style.top = `${popupParentElementRect.top * -1}px`;\n\t\t\telement.style.left = `${popupParentElementRect.left * -1}px`;\n\t\t}\n\t}\n\n\tprotected calculateAllPopupPosition( popupElement: HTMLElement, targetRect: DOMRect, parentRect: DOMRect, position: Position, gapX: number, gapY: number, userFallbacks : Position[] | null ): Position {\n\t\tconst spaceRightTarget = parentRect.right - targetRect.right;\n\t\tconst spaceLeftTarget  = targetRect.left - parentRect.left;\n\t\tconst spaceAboveTarget = targetRect.top - parentRect.top;\n\t\tconst spaceBelowTarget = parentRect.bottom - targetRect.bottom;\n\t\n\t\tconst spaceNeededHorizontal = popupElement.offsetWidth + gapX;\n\t\tconst spaceNeededVertical = popupElement.offsetHeight + gapY;\n\t\n\t\tconst isSpaceAvailableRight = spaceRightTarget > spaceNeededHorizontal;\n\t\tconst isSpaceAvailableLeft = spaceLeftTarget > spaceNeededHorizontal;\n\t\tconst isSpaceAvailableAbove = spaceAboveTarget > spaceNeededVertical;\n\t\tconst isSpaceAvailableBelow = spaceBelowTarget > spaceNeededVertical;\n\t\n\t\tconst fallbackMap: Record<Position, Position[]> = {\n\t\t\t[Position.bottomLeft] : [Position.topLeft, Position.right, Position.left],\n\t\t\t[Position.bottomRight]: [Position.topRight, Position.right, Position.left],\n\t\t\t[Position.topLeft]    : [Position.bottomLeft, Position.right, Position.left],\n\t\t\t[Position.topRight]   : [Position.bottomRight, Position.right, Position.left],\n\t\t\t[Position.leftTop]    : [Position.top, Position.right, Position.left],\n\t\t\t[Position.leftBottom] : [Position.leftTop, Position.rightBottom, Position.rightTop],\n\t\t\t[Position.rightTop]   : [Position.rightBottom, Position.leftTop, Position.leftBottom],\n\t\t\t[Position.rightBottom]: [Position.rightTop, Position.leftBottom, Position.leftTop],\n\t\t\t[Position.bottom]     : [Position.top, Position.left, Position.right],\n\t\t\t[Position.top]        : [Position.bottom, Position.right, Position.left],\n\t\t\t[Position.left]       : [Position.right, Position.top, Position.bottom],\n\t\t\t[Position.right]      : [Position.left, Position.top, Position.bottom],\n\t\t\t[Position.auto]       : [Position.bottom, Position.right, Position.left, Position.top],\n\t\t\t[Position.center]     : [Position.center],\n\t\t\t[Position.under]      : [],\n\t\t\t[Position.above]      : [],\n\t\t\t[Position.over]       : []\n\t\t};\n\t\n\t\tconst isPositionAvailable = (pos: Position): boolean => {\n\t\t\tswitch (pos) {\n\t\t\t\tcase Position.left:\n\t\t\t\t\treturn isSpaceAvailableLeft;\n\t\t\t\tcase Position.right:\n\t\t\t\t\treturn isSpaceAvailableRight;\n\t\t\t\tcase Position.top:\n\t\t\t\t\treturn isSpaceAvailableAbove;\n\t\t\t\tcase Position.bottom:\n\t\t\t\t\treturn isSpaceAvailableBelow;\n\t\t\t\tcase Position.topLeft:\n\t\t\t\t\treturn isSpaceAvailableAbove;\n\t\t\t\tcase Position.topRight:\n\t\t\t\t\treturn isSpaceAvailableAbove;\n\t\t\t\tcase Position.bottomLeft:\n\t\t\t\t\treturn isSpaceAvailableBelow;\n\t\t\t\tcase Position.bottomRight:\n\t\t\t\t\treturn isSpaceAvailableBelow;\n\t\t\t\tcase Position.leftTop:\n\t\t\t\t\treturn isSpaceAvailableLeft && isSpaceAvailableBelow;\n\t\t\t\tcase Position.leftBottom:\n\t\t\t\t\treturn isSpaceAvailableLeft && isSpaceAvailableAbove;\n\t\t\t\tcase Position.rightTop:\n\t\t\t\t\treturn isSpaceAvailableRight && isSpaceAvailableBelow;\n\t\t\t\tcase Position.rightBottom:\n\t\t\t\t\treturn isSpaceAvailableRight && isSpaceAvailableAbove;\n\t\t\t\tcase Position.center:\n\t\t\t\t\treturn true; // Center doesn't depend on space availability\n\t\t\t\tcase Position.auto:\n\t\t\t\t\treturn isSpaceAvailableRight || isSpaceAvailableLeft || isSpaceAvailableAbove || isSpaceAvailableBelow;\n\t\t\t\tdefault:\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\t\n\t\tif (isPositionAvailable(position)) {\n\t\t\treturn position;\n\t\t}\n\t\n\t\tconst fallbacks = userFallbacks ? userFallbacks :fallbackMap[position] || [];\n\t\tfor (const fallback of fallbacks) {\n\t\t\tif (isPositionAvailable(fallback)) {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t}\n\t\n\t\t// Default fallback to the best available position\n\t\tif (isSpaceAvailableRight) return Position.right;\n\t\tif (isSpaceAvailableLeft) return Position.left;\n\t\tif (isSpaceAvailableBelow) return Position.bottom;\n\t\tif (isSpaceAvailableAbove) return Position.top;\n\t\n\t\tconst spaces = {\n\t\t\t[Position.right]: spaceRightTarget,\n\t\t\t[Position.left]: spaceLeftTarget,\n\t\t\t[Position.top]: spaceAboveTarget,\n\t\t\t[Position.bottom]: spaceBelowTarget\n\t\t};\n\n\t\tconst directionWithMostSpace = Object.entries(spaces)\n\t\t\t.sort((a, b) => b[1] - a[1])[0][0]; \n\n\t\treturn directionWithMostSpace as Position;\n\t}\n\t\n\tprotected calculatePopupPosition( popupElement: HTMLElement, targetRect: DOMRect, parentRect: DOMRect, position: Position, gapY: number, ): Position {\n\t\tconst spaceBelowTarget = parentRect.bottom - targetRect.bottom;\n\t\tconst spaceAboveTarget = targetRect.top - parentRect.top;\n\t\tconst spaceNeeded = popupElement.offsetHeight + gapY;\n\t\tconst isSpaceAvailibleUnder = spaceBelowTarget > spaceNeeded;\n\t\tconst isSpaceAvailibleAbove =\n\t\t\tspaceAboveTarget > spaceNeeded ||\n\t\t\tspaceAboveTarget > spaceBelowTarget;\n\n\t\tif ( position === Position.top || position === Position.topLeft || position === Position.topRight ) {\n\t\t\tif (isSpaceAvailibleAbove) {\n\t\t\t\treturn Position.above;\n\t\t\t}\n\t\t}\n\t\tif (isSpaceAvailibleUnder) {\n\t\t\treturn Position.bottom;\n\t\t}\n\n\t\tif (isSpaceAvailibleAbove) {\n\t\t\treturn Position.top;\n\t\t}\n\n\t\treturn Position.bottom;\n\t}\n\n\tprotected calculateLeftOrRightPopupPosition( popupElement: HTMLElement, targetRect: DOMRect, parentRect: DOMRect, position: Position, gapX: number, ): Position {\n\t\tconst spaceRightTarget = parentRect.right - targetRect.right;\n\t\tconst spaceLeftTarget = targetRect.left - parentRect.left;\n\t\tconst spaceNeeded = popupElement.offsetWidth + gapX;\n\t\tconst isSpaceAvailibleRight = spaceRightTarget > spaceNeeded;\n\t\tconst isSpaceAvailibleLeft =\n\t\t\tspaceLeftTarget > spaceNeeded || spaceLeftTarget > spaceRightTarget;\n\n\t\tif (position === Position.left) {\n\t\t\tif (isSpaceAvailibleLeft) {\n\t\t\t\treturn Position.left;\n\t\t\t}\n\t\t}\n\n\t\tif (isSpaceAvailibleRight) {\n\t\t\treturn Position.right;\n\t\t}\n\n\t\tif (isSpaceAvailibleLeft) {\n\t\t\treturn Position.left;\n\t\t}\n\n\t\treturn Position.right;\n\t}\n\tprivate ensureXYBoundaries(\n\t\tpopUpElement: HTMLElement,\n\t\tposition: number,\n\t\tdirection: DIRECTION,\n\t\tpopupParentElement: HTMLElement = document.body,\n\t\tdocumentElement: Document = document,\n\t): number {\n\t\tconst isVertical = direction === DIRECTION.vertical;\n\t\tconst sizeProperty = isVertical ? 'clientHeight' : 'clientWidth';\n\t\tconst anchorProperty = isVertical ? 'top' : 'left';\n\t\tconst offsetProperty = isVertical ? 'offsetHeight' : 'offsetWidth';\n\t\tconst scrollPositionProperty = isVertical ? 'scrollTop' : 'scrollLeft';\n\n\t\tconst docElement = documentElement.documentElement;\n\t\tlet popupParent = popupParentElement;\n\t\tif(this.isPopUpElementIsStatic(popupParent)) {\n\t\t\tpopupParent.offsetParent && (popupParent = popupParent.offsetParent as HTMLElement);\n\t\t}\n\t\tconst parentRect = this.getParentRect(popupParentElement, documentElement);\n\t\tconst documentRect =\n\t\t\tdocumentElement.documentElement.getBoundingClientRect();\n\n\t\tconst isBody = popupParent === documentElement.body;\n\n\t\tconst offsetSize = popUpElement[offsetProperty];\n\t\tconst getSize = isVertical ? getAbsoluteHeight : getAbsoluteWidth;\n\n\t\tlet sizeOfParent = isBody\n\t\t\t? getSize(docElement) + docElement[scrollPositionProperty]\n\t\t\t: popupParent[sizeProperty];\n\n\t\tif (isBody) {\n\t\t\tsizeOfParent -= Math.abs(\n\t\t\t\tdocumentRect[anchorProperty] - parentRect[anchorProperty],\n\t\t\t);\n\t\t}\n\n\t\tconst max = sizeOfParent - offsetSize;\n\n\t\treturn Math.min(Math.max(position, 0), Math.abs(max));\n\t}\n\n\tprotected getParentRect(\n\t\tpopupParentElement: HTMLElement = document.body,\n\t\tdocumentElement: Document = document,\n\t): IRect {\n\t\tlet popupParent = popupParentElement;\n\n\t\tif (popupParent === documentElement.body) {\n\t\t\tpopupParent = documentElement.documentElement;\n\t\t} else if (this.isPopUpElementIsStatic(popupParent)) {\n\t\t\tpopupParent = popupParent.offsetParent as HTMLElement;\n\t\t}\n\n\t\treturn getElementRectWithOffset(popupParent);\n\t}\n\n\tprivate isPopUpElementIsStatic(element: HTMLElement): boolean {\n\t\treturn getComputedStyle(element).position === 'static';\n\t}\n\n\tprotected createPopupWrapper( element: HTMLElement, ariaLabel: string, popupClassName : string = '', rtl : boolean = false, popupParentElement: HTMLElement = document.body, ): HTMLElement {\n\t\tconst wrapperElement = document.createElement('div');\n        (popupClassName && popupClassName != '') && wrapperElement.classList.add(popupClassName);\n\t\twrapperElement.classList.add('ZG-popup');\n\t\telement.classList.add( rtl ? 'ZG-rtl' : 'ZG-ltr', 'ZG-popup-child', );\n\n\t\tif (!element.hasAttribute('role')) {\n\t\t\tsetAriaRole(element, 'dialog');\n\t\t}\n\n\t\tsetAriaLabel(element, ariaLabel);\n\n\t\twrapperElement.appendChild(element);\n\t\tpopupParentElement.appendChild(wrapperElement);\n\n\t\treturn wrapperElement;\n\t}\n\n\tprotected removePopupFromPopupList(element: HTMLElement): void {\n\t\tconst popupEntry = this.popupList.find((popup) => popup.element === element);\n\t\tif (popupEntry?.relativeObserver) {\n\t\t\tpopupEntry.relativeObserver.disconnect();\n\t\t}\n\t\tthis.setAlignedStyles(element, null);\n\t\tthis.popupList = this.popupList.filter(\n\t\t\t(popup) => popup.element !== element,\n\t\t);\n\t}\n}\n","import { BEAN_NAME,traverseObject } from \"@dg/corecomponent\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport {EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport {ComponentsRegistry} from \"@dg/corecomponent/ComponentRegistry.js\";\nimport {Context,} from \"@dg/corecomponent/Context.js\";\nimport { ITooltipAPI } from \"./Interface/ITolltipAPI\";\nimport { ITooltipConfiguration } from \"./Interface/ITooltipConfiguration\";\nimport { ToolTipHandler } from \"./TooltipHandler\";\nimport { TooltipBeanName } from \"./Constants/TooltipBeanName\";\nimport { TooltipOptionsHandler } from \"./TooltipOptionsHandler\";\nimport { TooltipUserComponentHandler } from \"./Components/TooltipUserComponentHandler\";\nimport { TooltipAPI } from \"./TooltipAPI\";\nimport { TooltipPopupHandler } from \"./TooltipPopHandler\";\nimport { TooltipRenderer } from \"./Components/TooltipRenderer\";\nimport { TooltipControllerHandler } from './ControllerHandler';\n\nexport interface IUserParams {\n\tglobalEventListener?: Function;\n\tframeworkOverrides?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n}\n\nexport class Tooltip {\n    public api !: ITooltipAPI;\n\tconstructor(element : HTMLElement,configuration: ITooltipConfiguration, params?: IUserParams) {\n        const setContextApi = (api : ITooltipAPI) => {\n            this.api = api;\n        }\n\t\tnew TooltipCoreComponent().initializeTooltip(\n\t\t\telement,\n\t\t\tconfiguration,\n\t\t\tsetContextApi,\n\t\t\tparams,\n\t\t);\n\t}\n}\nclass TooltipCoreComponent {\n\tinitializeTooltip(element : HTMLElement, configuration: ITooltipConfiguration,  callBack : CallableFunction, params: IUserParams = {}): void {\n\t\tconst userConfigurations = this.createuserConfiguration(\n            element,\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t);\n\t\tconst beanClasses = this.CreateBeanClasses();\n\n\t\tconst context = new Context();\n\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n\t\t\n\t\tthis.registryDefaultComponent(context);\n\n        const tooltip = context.createBean(new ToolTipHandler(element));\n\n        this.registerHandler(context, tooltip);\n        \n        this.setApi(context, callBack);\n\n        (window as any).context = context;\n\t}\n\n    private setApi(context : Context, callBack : CallableFunction) : void {\n        const api = context.getBean(TooltipBeanName.TOOL_TIP_API) as ITooltipAPI;\n        callBack && callBack(api);\n    }\n\n    private registerHandler(context : Context, handler : ToolTipHandler) : void {\n        const controller = context.getBean(TooltipBeanName.TOOL_TIP_CONTROLLER_HANDLER) as TooltipControllerHandler | null;\n        if (!controller?.registerTooltipHandler) {\n            console.warn('Tooltip: TOOL_TIP_CONTROLLER_HANDLER bean missing; tooltip handler not registered');\n            return;\n        }\n        controller.registerTooltipHandler(handler);\n    } \n\n\tprivate CreateBeanClasses(): Set<any> {\n\t\treturn new Set([\n\t\t\tTooltipOptionsHandler,\n\t\t\tComponentsRegistry,\n\t\t\tUserComponentRegistry,\n\t\t\tTooltipUserComponentHandler,\n\t\t\tTooltipAPI,\n\t\t\tEventHandler,\n\t\t\tTooltipPopupHandler,\n\t\t\tComponentMetadataProvider,\n\t\t\tTooltipControllerHandler,\n\t\t]);\n\t}\n\n\tprivate registryDefaultComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean( BEAN_NAME.USER_COMPONENT_REGISTRY ) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n\t\t\ttooltipRenderer : TooltipRenderer\n\t\t};\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n\n\tprivate createuserConfiguration( element : HTMLElement, configuration: any, params: IUserParams, ): {\n\t\ttooltipElement           : HTMLElement,\n\t\ttooltipOptions            : any;\n\t\tframeWorkOverrides       : IFrameworkOverrides | null;\n\t\tglobalEventListener      : Function | null;\n\t\tframeworkComponentWrapper: any | null;\n\t} {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\ttooltipElement: element,\n\t\t\ttooltipOptions : configuration,\n\t\t\tframeWorkOverrides,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n}\n","import { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\nimport { TooltipBeanName } from \"./Constants/TooltipBeanName\";\nimport { ITooltipConfiguration } from \"./Interface/ITooltipConfiguration\";\nimport { TooltipTriggerStates } from \"./Constants/DefaultTooltipValues\";\nimport { TooltipEvents } from \"./Constants/TooltipEvents\";\nimport { TooltipControllerHandler } from \"./ControllerHandler\";\n\n@Bean(TooltipBeanName.TOOL_TIP_API)\nexport class TooltipAPI extends EventEmitter  {\n\n    // private options !: ITooltipConfiguration\n\n    \n    private destroyCalled = false;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !:  getBeanInstanceByBeanName;\n    @AutoWired(TooltipBeanName.TOOL_TIP_OPTIONS) private options !:  ITooltipConfiguration;\n\n\n\n    setTooltipValue(value : string) : void {\n        if(value) {\n            this.options.tooltipValue = value;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setBrowserTooltipEnabled(enabled : boolean) : void {\n        if(enabled != null) {\n            this.options.browserTooltip = enabled;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setTooltipInteraction(tooltipInteraction : boolean) : void {\n        if(tooltipInteraction != null) {\n            this.options.tooltipInteraction = tooltipInteraction;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setTooltipMouseTrack(tooltipMouseTrack : boolean) : void {\n        if(tooltipMouseTrack != null) {\n            this.options.tooltipMouseTrack = tooltipMouseTrack;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setTriggerState(triggerState : TooltipTriggerStates) : void {\n        if(triggerState != null) {\n            this.options.tooltipTrigger = triggerState;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setTooltipShowDelay(tooltipDelay : number) : void {\n        if(tooltipDelay != null) {\n            this.options.tooltipShowDelay = tooltipDelay;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setTooltipHideDelay(tooltipDelay : number) : void {\n        if(tooltipDelay != null) {\n            this.options.tooltipHideDelay = tooltipDelay;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setTooltipRenderer(renderer : any)  : void {\n        if(renderer) {\n            this.options.renderer = renderer;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setTooltipRendererParams(rendererParams : any) : void {\n        if(rendererParams != null) {\n            this.options.userRendererParams = rendererParams;\n            this.dispatchRefreshEvent();\n        }   \n    }\n\n    setPopupParent(popupParent : HTMLElement) : void {\n        if(popupParent) {\n            this.options.popupParent = popupParent;\n            this.dispatchRefreshEvent();\n        }\n    }\n\n    setDocumentElement(document : Document) : void {\n        if(document) {\n            this.options.documentElement = document;\n            this.dispatchRefreshEvent();\n        }\n    }\n    \n      openByMouse(event : MouseEvent) : void  {\n        this.dispatchEvent({\n            type : TooltipEvents.TOOLTIP_OPEN_BY_MOUSE,\n            event\n        })\n    }\n\n    closeByMouse(event : MouseEvent) : void {\n        this.dispatchEvent({\n            type : TooltipEvents.TOOLTIP_CLOSE_BY_MOUSE,\n            event\n        })\n    }\n\n    open(){\n        this.dispatchEvent({\n            type : TooltipEvents.TOOLTIP_OPEN\n        })\n       \n\n\n    }\n\n    close(){\n        this.dispatchEvent({\n            type : TooltipEvents.TOOLTIP_CLOSE\n        })\n\n    }\n\n    destroy(): void {\n        if(this.destroyCalled) {return};\n\n        this.close();\n\n        this.destroyCalled = true;\n        \n        const controller = this.getBeanInstanceByBeanName(TooltipBeanName.TOOL_TIP_CONTROLLER_HANDLER) as TooltipControllerHandler;\n        const tootipHandler = controller.getTooltipHandler();\n\n        if(tootipHandler) {\n            tootipHandler.destroy();\n        }\n\n        this.context.destroy();  \n\n    }\n\n    private dispatchRefreshEvent() : void {\n        this.dispatchEvent({\n            type : TooltipEvents.TOOLTIP_REFRESH\n        })\n    }\n}","import {  PostConstruct, toggleAttribute } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IToolTipHandler } from \"./Interface/IToolTipHandler\";\nimport { ITooltipOptionsHandler } from \"./Interface/ITooltipOptionsHandler\";\nimport { CustomTooltipHandler } from \"./CustomTooltip\";\nimport { TooltipEvents } from \"./Constants/TooltipEvents\";\n\nexport class ToolTipHandler extends EventEmitter implements IToolTipHandler {\n\n\tprivate element: HTMLElement;\n\n\tprivate tooltip: any;\n\n\tprivate browserTooltips!: boolean;\n\n\tprivate tooltipComponent: CustomTooltipHandler | null = null;\n\n\n\tconstructor(element: HTMLElement) {\n\t\tsuper();\n\t\tthis.element = element;\n\t}\n\n\tpublic setComponent(): void {\n\t\tthis.setupTooltip();\n\t}\n\n\t@PostConstruct()\n\tinit() : void {\n\t\tthis.setComponent();\n\t\tthis.addListener(this.eventHandler, TooltipEvents.TOOLTIP_REFRESH, this.setupTooltip.bind(this));\n\t}\n\n\tprivate setupTooltip(): void {\n\t\tconst options = this.optionsHandler as ITooltipOptionsHandler | undefined;\n\t\tif (!options?.isBrowserTooltipEnabled) {\n\t\t\tconsole.warn('Tooltip: optionHandler bean missing; skipping tooltip setup');\n\t\t\treturn;\n\t\t}\n\t\tthis.browserTooltips = options.isBrowserTooltipEnabled();\n\t\tthis.updateTooltipText();\n\n\t\tthis.destroyTooltipComponent();\n\n\t\tif (this.browserTooltips) {\n\t\t\tthis.setBrowserTooltip(this.tooltip);\n\t\t} else {\n\t\t\tthis.createTooltip();\n\t\t}\n\t}\n\n\tprivate updateTooltipText(): void {\n\t\tconst options = this.optionsHandler as ITooltipOptionsHandler | undefined;\n\t\tthis.tooltip = options?.getTooltipValue?.() ?? '';\n\t}\n\n\tprivate setBrowserTooltip(tooltip: string | null) {\n\t\tconst name = 'title';\n\t\tif (tooltip != null && tooltip != '') {\n\t\t\ttoggleAttribute(this.element, name, tooltip);\n\t\t} else {\n\t\t\ttoggleAttribute(this.element, name, null);\n\t\t}\n\t}\n\n\tprivate createTooltip(): void {\n\t\tif (this.tooltipComponent != null) { return; }\n\n        this.tooltipComponent = this.createManagedBean( new CustomTooltipHandler() );\n\t}\n\n\tpublic refreshToolTip() {\n        this.updateTooltipText();\n\n        if (this.browserTooltips) {\n            this.setBrowserTooltip(this.tooltip);\n        }\n    }\n\n\tpublic destroyTooltipComponent() : void {\n\t\tif(this.tooltipComponent) {\n\t\t\tthis.tooltipComponent.destroy();\n\t\t}\n\n\t\ttoggleAttribute(this.element,'title',null);\n\n\t\tthis.tooltipComponent = null;\n\t}\n\n\tpublic destroy(): void {\n\t\tthis.destroyTooltipComponent();\n\t\tsuper.destroy();\n\t}\n}\n","import { TooltipBeanName } from \"./Constants/TooltipBeanName\";\nimport { ITooltipConfiguration } from \"./Interface/ITooltipConfiguration\";\nimport { ITooltipOptionsHandler } from \"./Interface/ITooltipOptionsHandler\";\nimport { DEFAULT_TOOLTIP_VALUES, TooltipTriggerStates } from \"./Constants/DefaultTooltipValues\";\nimport { AutoWired, BEAN_NAME, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\nimport { Position } from \"./PopupHandler/CorePopupHandler\";\n\nfunction getCallbackForEvent(eventName: string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class TooltipOptionsHandler extends EventEmitter implements ITooltipOptionsHandler {\n\t@AutoWired(TooltipBeanName.TOOL_TIP_OPTIONS) private options!: ITooltipConfiguration;\n\n\t@AutoWired(TooltipBeanName.TOOL_TIP_ELEMENT) private forElement!: HTMLElement;\n\n\tprivate globalEventHandler(eventName: string, event?: any) {\n\t\tconst callbackMethodName = getCallbackForEvent(eventName);\n\t\tif (typeof (this.options as any)[callbackMethodName] === 'function') {\n\t\t\t(this.options as any)[callbackMethodName](event);\n\t\t}\n\t}\n\n\t@PostConstruct()\n\tinit() {\n\t\tthis.eventHandler.addGlobalListener(\n\t\t\tthis.globalEventHandler.bind(this),\n\t\t\tfalse,\n\t\t);\n\t}\n\n\tisBrowserTooltipEnabled(): boolean {\n\t\treturn this.options?.browserTooltip ?? false;\n\t}\n\n\tgetTooltipValue(): string {\n\t\treturn this.options?.tooltipValue ?? '';\n\t}\n\n\tisTooltipInteraction(): boolean {\n\t\treturn this.options?.tooltipInteraction ?? false;\n\t}\n\n\tisTooltipMouseTrack(): boolean {\n\t\treturn this.options?.tooltipMouseTrack ?? false;\n\t}\n\n\tgetTriggerState(): TooltipTriggerStates {\n\t\treturn this.options?.tooltipTrigger ?? TooltipTriggerStates.HOVER;\n\t}\n\n\tgetTooltipShowDelay(): number | null {\n\t\treturn this.options?.tooltipShowDelay ?? null;\n\t}\n\n\tgetTooltipHideDelay(): number | null {\n\t\treturn this.options?.tooltipHideDelay ?? null;\n\t}\n\n\tgetTooltipRenderer(): any {\n\t\treturn this.options?.renderer;\n\t}\n\n\tgetTooltipRendererParams(): any {\n\t\treturn this.options?.userRendererParams;\n\t}\n\n\tgetPopupParent(): HTMLElement {\n\t\tif (this.options?.popupParent) {\n\t\t\treturn this.options.popupParent;\n\t\t}\n\n\t\treturn document.body;\n\t}\n\n\tgetDocumentElement(): Document {\n\t\tif (this.forElement) {\n\t\t\treturn this.forElement.ownerDocument ?? document;\n\t\t}\n\n\t\treturn document;\n\t}\n\n\tisRTL() : boolean {\n\t\treturn this.options?.rtl ?? false\n\t}\n\n\tgetPopupClassName(): string {\n\t\treturn this.options?.popupClassName ?? '';\n\t}\n\n\tgetPosition(): Position {\n\t\treturn this.options?.position ?? Position.bottom;\n\t}\n\n\tisKeepWithinBounds() : boolean {\n\t\treturn this.options?.keepWithinBounds ?? true;\n\t}\n\n\tgetGapX() : number {\n\t\treturn this.options?.gapX ?? 5;\n\t}\n\n\tgetGapY() : number {\n\t\treturn this.options?.gapY ?? 10;\n\t}\n\n\tgetInteractionHideDelay() : number {\n\t\treturn this.options?.tooltipInteractionHideDelay ?? DEFAULT_TOOLTIP_VALUES.INTERACTIVE_HIDE_DELAY;\n\t}\n\n\tgetFadeOutDelayAfterInteraction() : number {\n\t\treturn this.options?.fadeOutDelayAfterInteraction ?? DEFAULT_TOOLTIP_VALUES.FADE_OUT_DELAY_AFTER_INTERACTION;\n\t}\n\n\tshouldShowTooltip(): () => boolean {\n\t\treturn this.options?.shouldShowTooltip ?? (() => false);\n\t}\n\n\tgetHideTooltip(){\n\t\treturn this.options?.hideTooltip ?? true;\n\t}\n\t\n\tshouldAttachEvents(): boolean {\n\t\treturn this.options?.shouldAttachEvents ?? true;\n\t}\n\n\tgetTooltipHoverPosition(): boolean {\n\t\treturn this.options.tooltipHoverPosition ?? true;\n\t}\n\n\tgetArrow(): boolean {\n\t\treturn this.options?.arrow ?? false;\n\t}\n\n\tshouldCancelOnEscape() : boolean{\n\t\treturn this.options?.cancelOnEscape ?? true;\n\t}\n\n\tshouldCancelOnMouseDown() : boolean{\n\t\treturn this.options?.cancelOnMouseDown ?? true;\n\t}\n\n\n}","import { Bean } from \"@dg/corecomponent\";\nimport { TooltipBeanName } from \"./Constants/TooltipBeanName\";\nimport { CorePopupHandler } from \"./PopupHandler/CorePopupHandler\";\n\n@Bean(TooltipBeanName.TOOL_TIP_POP_HANDLER)\nexport class TooltipPopupHandler extends CorePopupHandler {\n   \n}","import { ContainerHeightService } from \"./ContainerHeightHandler\";\nimport { IContainerHeightService } from \"./Interface/IContainerHeightHandler\";\nimport { IVirtualList } from \"./Interface/IVirtualList\";\nimport { IController, IControllerMap, INode, IRefreshParams, IViewPort, IVirtualListModel } from \"./Interface/IVirtualListModel\";\nimport { createArrayOfNumbers, traverseObject } from \"./utils/object\";\n\n\nexport interface IAbstractVirtualListModel {\n\t//CRUD methods\n\tremoveRows(rowsToRemove: number[]): void;\n\taddRows(rowsToAdd: number[]): void;\n\n\t//check methods\n    getIndexesToDraw(indexToDraw: number[])                         : number[];\n    keepRowVirtualized(index: number)                               : boolean;\n    isRowToDraw(index: number)                                      : boolean;\n    getBufferSize()                                                 : number;\n    getDefaultHeight()                                              : number;\n    scrollToTop()                                                   : void;\n    getHeight()                                                     : number;\n    isHeightAsNull()                                                : boolean;\n    isSuppressScrollOnNewData()                                     : boolean;\n    isSuppressVirtualisation()                                      : boolean;\n    getFirstRow()                                                   : number;\n    getLastRow()                                                    : number;\n    getIndexByPosition(pixel : number, position ?: 'first' | 'last'): number;\n    isLoading(index : number)                                       : boolean;\n    getContainer()                                                  : HTMLElement;\n\n\t//events\n\tonViewPortChange(viewPort: IViewPort): void;\n\tonDisplayChanged()                   : void;\n\tonHeightChanged?(height: number)     : void;\n\tonHeightScaleChanged?()              : void;\n}\n\nexport interface IAbstractVirtualList {\n setModel(model: IAbstractVirtualListModel)     : void;\n refresh()                                      : void;\n refreshAfterModelUpdate(params: IRefreshParams): void;\n getLastScrollPixel()                           : number;\n getFirstScrollPixel()                          : number;\n getIndecies()                                  : number[];\n getPixelPosition(pixel  : number)              : number;\n}\nexport class AbstractVirtualList implements IAbstractVirtualList {\n\tprivate model!: IAbstractVirtualListModel;\n\tprivate containerHeightService!: IContainerHeightService;\n\n\tprivate firstRenderIndex!: number;\n\tprivate lastRenderIndex!: number;\n\n\tprivate refreshInProgress!: boolean;\n\n\tprivate firstPixel!: number;\n\tprivate lastPixel!: number;\n\n\tprivate rowIndecies: number[] = [];\n\n\tpublic setModel(model: IAbstractVirtualListModel): void {\n\t\tthis.model = model;\n\t\tthis.containerHeightService = new ContainerHeightService();\n\n\t\tthis.containerHeightService.setModel({\n\t\t\tgetContainer: () => this.model.getContainer(),\n\t\t\tonHeightChanged: (height: number) =>\n\t\t\t\tthis.model.onHeightChanged?.(height),\n\t\t\tonHeightScaleChanged: () => this.model.onHeightScaleChanged?.(),\n\t\t});\n\t}\n\n\tpublic refresh(): void {\n\t\tconst previousFirstRenderIndex = this.firstRenderIndex;\n\t\tconst previousLastRenderIndex = this.lastRenderIndex;\n\n\t\tthis.findFirstAndLastRowsToRender();\n\n\t\tconst viewPortchange =\n\t\t\tthis.firstRenderIndex !== previousFirstRenderIndex ||\n\t\t\tthis.lastRenderIndex !== previousLastRenderIndex;\n\n\t\tif (!viewPortchange) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.recycleRows(null);\n\n\t\tthis.model.onDisplayChanged();\n\t}\n\n\tpublic refreshAfterModelUpdate(params: IRefreshParams): void {\n\t\tthis.getRefresh();\n\n\t\tthis.updateContainerHeights();\n\n\t\tthis.scrollToTop(params);\n\n\t\tconst recycleRows: boolean =\n\t\t\t!params.domLayoutChanged && !!params.recycleRows;\n\n\t\tconst rowsToRecycle = recycleRows ? this.getRowsToRecycle() : null;\n\n\t\tif (!recycleRows) {\n\t\t\tthis.removeRows(this.rowIndecies);\n\t\t}\n\n\t\tthis.findFirstAndLastRowsToRender();\n\n\t\tthis.recycleRows(rowsToRecycle);\n\n\t\tthis.model.onDisplayChanged();\n\t}\n\n\tpublic getLastScrollPixel(): number {\n\t\treturn this.lastPixel;\n\t}\n\n\tpublic getFirstScrollPixel(): number {\n\t\treturn this.firstPixel;\n\t}\n\n\tpublic getIndecies(): number[] {\n\t\treturn this.rowIndecies;\n\t}\n\n\tpublic getPixelPosition(pixel: number): number {\n\t\treturn this.containerHeightService.getPixelPosition(pixel);\n\t}\n\n\tprivate recycleRows(rowsToRecycle?: number[] | null): void {\n\t\tconst indexesToDraw = this.findIndexesToDraw(rowsToRecycle);\n\t\tthis.removeRowComponents(indexesToDraw);\n\n\t\tthis.addRows(indexesToDraw);\n\n\t\tif (rowsToRecycle) {\n\t\t\tthis.removeRows(rowsToRecycle);\n\t\t}\n\n\t\tthis.rowIndecies.sort((a, b) => a - b);\n\t}\n\n\tprivate addRows(rowsToAdd?: number[] | null): void {\n\t\tif (!rowsToAdd) return;\n\n\t\tconst existingRowsSet = new Set(this.rowIndecies);\n\t\tconst newRows = rowsToAdd.filter((row) => !existingRowsSet.has(row));\n\n\t\tthis.rowIndecies = [...this.rowIndecies, ...newRows].sort(\n\t\t\t(a, b) => a - b,\n\t\t);\n\t\tthis.model.addRows(newRows);\n\t}\n\n\tprivate removeRowComponents(indexesToDraw: number[]): void {\n\t\tconst indexesToDrawSet = new Set(indexesToDraw);\n\n\t\tconst indexesNotToDraw = this.rowIndecies.filter(\n\t\t\t(index) => !indexesToDrawSet.has(index),\n\t\t);\n\n\t\tthis.removeRows(indexesNotToDraw);\n\t}\n\n\tprivate removeRows(rowsToRemove: number[]): void {\n\t\tconst rowIndeciesSet = new Set(this.rowIndecies);\n\t\trowsToRemove.forEach((row) => rowIndeciesSet.delete(row));\n\n\t\tthis.rowIndecies = Array.from(rowIndeciesSet).sort((a, b) => a - b);\n\t\tthis.model.removeRows(rowsToRemove);\n\t}\n\n\tprivate findIndexesToDraw(rowsToRecycle?: number[] | null) {\n\t\tconst indexesViewportToDraw = createArrayOfNumbers(\n\t\t\tthis.firstRenderIndex,\n\t\t\tthis.lastRenderIndex,\n\t\t);\n\n\t\tconst indexesToDraw = this.model.getIndexesToDraw(\n\t\t\tindexesViewportToDraw,\n\t\t);\n\t\tconst checkRowsToDraw = (_indexStr: string, index: number) => {\n\t\t\tif (index == null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (index < this.firstRenderIndex || index > this.lastRenderIndex) {\n\t\t\t\tif (this.model.keepRowVirtualized(index)) {\n\t\t\t\t\tindexesToDraw.push(index);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttraverseObject(this.rowIndecies, checkRowsToDraw);\n\n\t\ttraverseObject(rowsToRecycle, checkRowsToDraw);\n\n\t\tindexesToDraw.sort((a: number, b: number) => a - b);\n\n\t\tconst rowIndex: number[] = [];\n\n\t\tfor (let i = 0; i < indexesToDraw.length; i++) {\n\t\t\tconst currentRow = indexesToDraw[i];\n\t\t\tconst isRowToDraw = this.model.isRowToDraw(currentRow);\n\t\t\tif (isRowToDraw) {\n\t\t\t\trowIndex.push(currentRow);\n\t\t\t}\n\t\t}\n\n\t\treturn rowIndex;\n\t}\n\n\tprivate findFirstAndLastRowsToRender(): void {\n\t\tthis.containerHeightService.updateOffset();\n\n\t\tconst bufferPixels = this.getRowBufferInPixels();\n\n\t\tconst scrollPosition =\n\t\t\tthis.containerHeightService.getContainerPosition();\n\n\t\tconst totalHeight = this.model.getHeight();\n\n\t\tconst suppressRowVirtualisation = this.model.isSuppressVirtualisation();\n\n\t\tconst divStretchOffset =\n\t\t\tthis.containerHeightService.getDivStretchOffset();\n\n\t\tlet firstPixel: number = 0;\n\t\tlet lastPixel: number = 0;\n\t\tif (suppressRowVirtualisation) {\n\t\t\tfirstPixel = 0 + divStretchOffset;\n\t\t\tlastPixel = totalHeight + divStretchOffset;\n\t\t} else {\n\t\t\tfirstPixel =\n\t\t\t\tMath.max(scrollPosition.top - bufferPixels, 0) +\n\t\t\t\tdivStretchOffset;\n\t\t\tlastPixel =\n\t\t\t\tMath.min(scrollPosition.bottom + bufferPixels, totalHeight) +\n\t\t\t\tdivStretchOffset;\n\t\t}\n\n\t\tconst pageFirstRow = this.model.getFirstRow();\n\t\tconst pageLastRow = this.model.getLastRow();\n\n\t\tlet firstRowIndex = this.model.getIndexByPosition(firstPixel, 'first');\n\t\tlet lastRowIndex = this.model.getIndexByPosition(lastPixel, 'last');\n\n\t\tif (firstRowIndex < pageFirstRow) {\n\t\t\tfirstRowIndex = pageFirstRow;\n\t\t}\n\n\t\tif (lastRowIndex > pageLastRow) {\n\t\t\tlastRowIndex = pageLastRow;\n\t\t}\n\n\t\tconst firstDiffers = firstRowIndex !== this.firstRenderIndex;\n\t\tconst lastDiffers = lastRowIndex !== this.lastRenderIndex;\n\n\t\tif (firstDiffers || lastDiffers) {\n\t\t\tthis.firstRenderIndex = firstRowIndex;\n\t\t\tthis.lastRenderIndex = lastRowIndex;\n\n\t\t\tthis.dispatchViewPortChangeEvent();\n\t\t}\n\n\t\tthis.firstPixel = firstPixel;\n\t\tthis.lastPixel = lastPixel;\n\t}\n\n\tprivate dispatchViewPortChangeEvent(): void {\n\t\tconst viewPort: IViewPort = {\n\t\t\tfromIndex: this.firstRenderIndex,\n\t\t\ttoIndex: this.lastRenderIndex,\n\t\t};\n\n\t\tthis.model.onViewPortChange(viewPort);\n\t}\n\n\tprivate getRowBufferInPixels() {\n\t\tconst rowsToBuffer = this.model.getBufferSize();\n\t\treturn rowsToBuffer * this.model.getDefaultHeight();\n\t}\n\n\tprivate getRefresh(): void {\n\t\tif (this.refreshInProgress) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.refreshInProgress = true;\n\t}\n\n\tprivate updateContainerHeights(): void {\n        //print case dont need model height\n\t\tif (this.model.isHeightAsNull()) {\n\t\t\tthis.containerHeightService.setModelHeight(null);\n\t\t\treturn;\n\t\t}\n\n\t\tlet containerHeight = this.model.getHeight();\n\t\tif (containerHeight === 0) {\n\t\t\tcontainerHeight = 1;\n\t\t}\n\n\t\tthis.containerHeightService.setModelHeight(containerHeight);\n\t}\n\n\tprivate scrollToTop(params: IRefreshParams): void {\n\t\tconst scrollToTop = params.newData || params.newPage;\n\t\tconst suppressScrollToTop = this.model.isSuppressScrollOnNewData();\n\n\t\tif (scrollToTop && !suppressScrollToTop) {\n\t\t\tthis.model.scrollToTop();\n\t\t}\n\t}\n\n\tprivate getRowsToRecycle(): number[] {\n\t\tconst stubNodeIndexes: number[] = [];\n\t\tconst checkLoadingIndex = (_indexString: string, index: number) => {\n\t\t\tconst studIndex = this.model.isLoading(index);\n\t\t\tif (!studIndex) {\n\t\t\t\tstubNodeIndexes.push(index);\n\t\t\t}\n\t\t};\n\n\t\ttraverseObject(this.rowIndecies, checkLoadingIndex);\n\n\t\tthis.removeRows(stubNodeIndexes);\n\n\t\tconst rowIndecies: number[] = [];\n\n\t\ttraverseObject(\n\t\t\tthis.rowIndecies,\n\t\t\t(_indexString: string, index: number) => {\n\t\t\t\trowIndecies.push(index);\n\t\t\t},\n\t\t);\n\n\t\tthis.rowIndecies = [];\n\n\t\treturn rowIndecies;\n\t}\n}\n\nexport class MainVirtualList<N extends INode, T extends IController<N>>\n\timplements IVirtualList<N, T>\n{\n\tprivate controllerByIndex: IControllerMap<T> = {};\n\tprivate model!: IVirtualListModel<N, T>;\n\n\tprivate abstractVirtualList!: IAbstractVirtualList;\n\n\tsetModel(model: IVirtualListModel<N, T>): void {\n\t\tthis.model = model;\n\n\t\tthis.abstractVirtualList = new AbstractVirtualList();\n\n\t\tthis.abstractVirtualList.setModel({\n\t\t\tgetBufferSize: () => this.model.getBufferSize?.(),\n\t\t\tgetContainer: () => this.model.getContainer?.(),\n\t\t\tgetFirstRow: () => this.model.getFirstRow?.(),\n\t\t\tgetLastRow: () => this.model.getLastRow?.(),\n\t\t\tgetDefaultHeight: () => this.model.getDefaultHeight?.(),\n\t\t\tgetHeight: () => this.model.getHeight?.(),\n\t\t\tgetIndexByPosition: (pixel: number, position: 'first' | 'last') =>\n\t\t\t\tthis.model.getIndexByPosition(pixel, position),\n\t\t\tgetIndexesToDraw: (indexToDraw: number[]) =>\n\t\t\t\tthis.model.getIndexesToDraw(indexToDraw),\n\t\t\taddRows: (rowIndexes: number[]) => this.addRows(rowIndexes),\n\t\t\tremoveRows: (rowIndexes: number[]) => this.removeRows(rowIndexes),\n\t\t\tisHeightAsNull: () => this.model.isHeightAsNull(),\n\t\t\tisLoading: (index: number) => this.isLoading(index),\n\t\t\tisRowToDraw: (index: number) => this.model.isRowToDraw?.(index),\n\t\t\tisSuppressScrollOnNewData: () =>\n\t\t\t\tthis.model.isSuppressScrollOnNewData(),\n\t\t\tisSuppressVirtualisation: () =>\n\t\t\t\tthis.model.isSuppressVirtualisation(),\n\t\t\tkeepRowVirtualized: (index: number) =>\n\t\t\t\tthis.keepRowVirtualized(index),\n\t\t\tonDisplayChanged: () => this.model.onDisplayChanged(),\n\t\t\tonViewPortChange: (viewPort: IViewPort) =>\n\t\t\t\tthis.model.onViewPortChange(viewPort),\n\t\t\tscrollToTop: () => this.model.scrollToTop(),\n\t\t\tonHeightChanged: (height: number) =>\n\t\t\t\tthis.model.onHeightChanged && this.model.onHeightChanged(height),\n\t\t\tonHeightScaleChanged: () => this.model.onHeightScaleChanged && this.model.onHeightScaleChanged(),\n\t\t});\n\t}\n\n\tprivate addRows(rowIndexes: number[]): void {\n\t\trowIndexes.forEach((rowIndex) => {\n\t\t\tthis.createOrUpdateRowController(rowIndex);\n\t\t});\n\t}\n\n\tprivate removeRows(rowIndexes: number[]): void {\n\t\trowIndexes.forEach((indexToRemove) => {\n\t\t\tconst controller = this.controllerByIndex[indexToRemove];\n\t\t\tif (controller) {\n\t\t\t\tcontroller.destroy();\n\t\t\t}\n\t\t\tdelete this.controllerByIndex[indexToRemove];\n\t\t});\n\t}\n\n\tprivate isLoading(_index: number): boolean {\n\t\treturn false;\n\t}\n\n\tprivate keepRowVirtualized(index: number): boolean {\n\t\tconst controller = this.controllerByIndex[index];\n\t\treturn this.model.keepRowVirtualized(index, controller);\n\t}\n\n\tprivate createOrUpdateRowController(\n\t\trowIndex: number,\n\t): T | null | undefined {\n\t\tlet node: N | undefined;\n\t\tlet controller: T | null = this.controllerByIndex[rowIndex];\n\n\t\tif (!controller) {\n\t\t\tif (!node) {\n\t\t\t\tnode = this.model.getRow(rowIndex);\n\t\t\t}\n\n\t\t\tif (node) {\n\t\t\t\tcontroller = this.model.createController(node);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif (node) {\n\t\t\tnode.updateRendered(true);\n\t\t}\n\n\t\tthis.controllerByIndex[rowIndex] = controller as T;\n\n\t\treturn controller;\n\t}\n\n\trefresh(): void {\n\t\tif (!this.abstractVirtualList) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.abstractVirtualList.refresh();\n\t}\n\n\trefreshAfterModelUpdate(params: IRefreshParams): void {\n\t\tif (!this.abstractVirtualList) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.abstractVirtualList.refreshAfterModelUpdate(params);\n\t}\n\n\tgetController(): IControllerMap<T> {\n\t\treturn this.controllerByIndex;\n\t}\n\n\tgetFirstScrollPixel(): number|void {\n\t\tif (!this.abstractVirtualList) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn this.abstractVirtualList.getFirstScrollPixel();\n\t}\n\n\tgetLastScrollPixel(): number|void {\n\t\tif (!this.abstractVirtualList) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn this.abstractVirtualList.getFirstScrollPixel();\n\t}\n\n\tpublic getPixelPosition(pixel: number): number {\n\t\treturn this.abstractVirtualList.getPixelPosition(pixel);\n\t}\n}\n","import { IContainerHeightModel, IContainerHeightService, IContainerPosition } from \"./Interface/IContainerHeightHandler\";\nimport { getMaxDivHeight } from \"./utils/browser\";\n\nexport class ContainerHeightService implements IContainerHeightService {\n\tprivate maxDivHeight!: number;\n\tprivate stretching  !: boolean;\n\n\tprivate modelHeight      !: number | null;\n\tprivate uiContainerHeight!: number | null;\n\tprivate pixelsToShave    !: number;\n\tprivate divStretchOffset !: number;\n\tprivate maxScrollY       !: number;\n\n\tprivate scrollY      = 0;\n\tprivate uiBodyHeight = 0;\n\n    private model !: IContainerHeightModel;\n\n    setModel(model : IContainerHeightModel) {\n        this.model = model;\n        this.maxDivHeight = getMaxDivHeight();\n    }\n\n\tpublic setModelHeight(modelHeight: number | null): void {\n\t\tthis.modelHeight = modelHeight;\n\t\tthis.stretching = modelHeight != null && this.maxDivHeight > 0 && modelHeight! > this.maxDivHeight;\n\t\tif (this.stretching) {\n\t\t\tthis.calculateOffset();\n\t\t} else {\n\t\t\tthis.clearOffset();\n\t\t}\n\t}\n\n    public isStretching(): boolean {\n        return this.stretching;\n    }\n\n    public getDivStretchOffset(): number {\n        return this.divStretchOffset;\n    }\n\n    public updateOffset(): void {\n        if (!this.stretching) { return; }\n\n        const position = this.getContainerPosition();\n        const newScrollY = position.top;\n        const newBodyHeight = this.getUiBodyHeight();\n\n        const atLeastOneChanged = newScrollY !== this.scrollY || newBodyHeight !== this.uiBodyHeight;\n        if (atLeastOneChanged) {\n            this.scrollY = newScrollY;\n            this.uiBodyHeight = newBodyHeight;\n            this.calculateOffset();\n        }\n    }\n\n    public getContainerPosition() : IContainerPosition {\n        const container = this.model.getContainer();\n\t\tconst position = {\n\t\t\ttop: container.scrollTop,\n\t\t\tbottom: container.scrollTop + container.offsetHeight,\n\t\t};\n\n        return position;\n    }\n\n    public getScrollPositionForPixel(rowTop: number): number {\n        if (this.pixelsToShave <= 0) { return rowTop; }\n\n        const modelMaxScroll = this.modelHeight! - this.getUiBodyHeight();\n        const scrollPercent = rowTop / modelMaxScroll;\n        const scrollPixel = this.maxScrollY * scrollPercent;\n        return scrollPixel;\n    }\n\n    public getPixelPosition(modelPixel: number): number {\n        return modelPixel - this.divStretchOffset;\n    }\n\n    public getUiContainerHeight(): number | null {\n        return this.uiContainerHeight;\n    }\n\n    private getUiBodyHeight(): number {\n        const position = this.getContainerPosition();\n        return position.bottom - position.top;\n    }\n\n    private calculateOffset(): void {\n        this.setUiContainerHeight(this.maxDivHeight);\n        this.pixelsToShave = this.modelHeight! - this.uiContainerHeight!;\n\n        this.maxScrollY = this.uiContainerHeight! - this.uiBodyHeight;\n        const scrollPercent = this.scrollY / this.maxScrollY;\n\n        const divStretchOffset = scrollPercent * this.pixelsToShave;\n\n        this.setDivStretchOffset(divStretchOffset);\n    }\n\n    private setUiContainerHeight(height: number | null): void {\n        if (height !== this.uiContainerHeight) {\n            this.uiContainerHeight = height;\n            this.model.onHeightChanged?.(this.uiContainerHeight as number);\n        }\n    }\n\n    private setDivStretchOffset(newOffset: number): void {\n        const newOffsetFloor = typeof newOffset === 'number' ? Math.floor(newOffset) : null;\n        if (this.divStretchOffset === newOffsetFloor) { return; }\n        this.divStretchOffset = newOffsetFloor!;\n        this.model.onHeightScaleChanged?.();\n    }\n\n    private clearOffset(): void {\n        this.setUiContainerHeight(this.modelHeight);\n        this.pixelsToShave = 0;\n        this.setDivStretchOffset(0);\n    }\n}","import { AbstractVirtualList, IAbstractVirtualList } from \"./AbstractVirtualList\";\nimport { IElementVirtualList, IRowComponent } from \"./Interface/IElementVirtualList\";\nimport { IElementVirtualListModel } from \"./Interface/IElementVirtualListModel\";\nimport { IRefreshParams, IViewPort } from \"./Interface/IVirtualListModel\";\n\nexport class ElementVirtualList implements IElementVirtualList {\n\tprivate controllerByIndex: IRowComponent = {};\n\tprivate model!: IElementVirtualListModel;\n\n\tprivate abstractVirtualList!: IAbstractVirtualList;\n\n\tsetModel(model: IElementVirtualListModel): void {\n\t\tthis.model = model;\n\n\t\tthis.abstractVirtualList = new AbstractVirtualList();\n\n\t\tthis.abstractVirtualList.setModel({\n\t\t\tgetBufferSize: () => this.model.getBufferSize?.(),\n\t\t\tgetContainer: () => this.model.getContainer?.(),\n\t\t\tgetFirstRow: () => this.model.getFirstRow?.(),\n\t\t\tgetLastRow: () => this.model.getLastRow?.(),\n\t\t\tgetDefaultHeight: () => this.model.getDefaultHeight?.(),\n\t\t\tgetHeight: () => this.model.getHeight?.(),\n\t\t\tgetIndexByPosition: (pixel: number, position: 'first' | 'last') =>\n\t\t\t\tthis.model.getIndexByPosition(pixel, position),\n\t\t\tgetIndexesToDraw: (indexToDraw: number[]) =>\n\t\t\t\tthis.model.getIndexesToDraw(indexToDraw),\n\t\t\taddRows: (rowIndexes: number[]) => this.addRows(rowIndexes),\n\t\t\tremoveRows: (rowIndexes: number[]) => this.removeRows(rowIndexes),\n\t\t\tisHeightAsNull: () => this.model.isHeightAsNull(),\n\t\t\tisLoading: (index: number) => this.isLoading(index),\n\t\t\tisRowToDraw: (index: number) => this.model.isRowToDraw?.(index),\n\t\t\tisSuppressScrollOnNewData: () =>\n\t\t\t\tthis.model.isSuppressScrollOnNewData(),\n\t\t\tisSuppressVirtualisation: () =>\n\t\t\t\tthis.model.isSuppressVirtualisation(),\n\t\t\tkeepRowVirtualized: (index: number) =>\n\t\t\t\tthis.keepRowVirtualized(index),\n\t\t\tonDisplayChanged: () => this.model.onDisplayChanged(),\n\t\t\tonViewPortChange: (viewPort: IViewPort) =>\n\t\t\t\tthis.model.onViewPortChange(viewPort),\n\t\t\tscrollToTop: () => this.model.scrollToTop(),\n\n\t\t});\n\t}\n\n\tprivate addRows(rowIndexes: number[]): void {\n\t\trowIndexes.forEach((rowIndex) => {\n\t\t\tconst element = this.model.getElement(rowIndex);\n\t\t\tthis.insertAtIndex(rowIndex, element);\n\t\t});\n\t}\n\n\tprivate appendElement(element: HTMLElement): void {\n\t\tconst container = this.model.appendTo();\n\t\tcontainer && container.appendChild(element);\n\t}\n\n\tprivate removeElement(element: HTMLElement): void {\n\t\tconst container = this.model.appendTo();\n\t\tcontainer && container.removeChild(element);\n\t}\n\n\tprivate insertAtIndex(index: number, element: HTMLElement): void {\n\t\tthis.controllerByIndex[index] = {\n\t\t\tcontainer: element,\n\t\t\tindex,\n\t\t};\n\n\t\tthis.appendElement(element);\n\t}\n\n\tprivate removeIndex(index: number): void {\n\t\tconst component = this.controllerByIndex[index];\n\n\t\tdelete this.controllerByIndex[index];\n\n\t\tthis.removeElement(component.container);\n\t}\n\n\tprivate removeRows(rowIndexes: number[]): void {\n\t\trowIndexes.forEach((indexToRemove) => {\n\t\t\tthis.removeIndex(indexToRemove);\n\t\t});\n\t}\n\n\tprivate isLoading(_index: number): boolean {\n\t\treturn false;\n\t}\n\n\tprivate keepRowVirtualized(index: number): boolean {\n\t\treturn this.model.keepRowVirtualized(index);\n\t}\n\n\trefresh(): void {\n\t\tif (!this.abstractVirtualList) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.abstractVirtualList.refresh();\n\t}\n\n\trefreshAfterModelUpdate(params: IRefreshParams): void {\n\t\tif (!this.abstractVirtualList) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.abstractVirtualList.refreshAfterModelUpdate(params);\n\t}\n\n\tgetComponent(): IRowComponent {\n\t\treturn this.controllerByIndex;\n\t}\n\n\tgetFirstScrollPixel(): number {\n\t\tif (!this.abstractVirtualList) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn this.abstractVirtualList.getFirstScrollPixel();\n\t}\n\n\tgetLastScrollPixel(): number {\n\t\tif (!this.abstractVirtualList) {\n\n\t\t}\n\n\t\treturn this.abstractVirtualList.getFirstScrollPixel();\n\t}\n\n\tpublic getPixelPosition(pixel: number): number {\n\t\treturn this.abstractVirtualList.getPixelPosition(pixel);\n\t}\n}\n","export function getMaxDivHeight(): number {\n    if (!document.body) { return -1; }\n\n    let res = 1000000;\n\n    const testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;\n    const div = document.createElement('div');\n    document.body.appendChild(div);\n\n    while (true) {\n        const test = res * 2;\n        div.style.height = test + 'px';\n\n        if (test > testUpTo || div.clientHeight !== test) {\n            break;\n        } else {\n            res = test;\n        }\n    }\n\n    document.body.removeChild(div);\n\n    return res;\n}","\nfunction createArrayOfNumbers(first: number, last: number): number[] {\n\tconst result: number[] = [];\n\n\tfor (let i = first; i <= last; i++) {\n\t\tresult.push(i);\n\t}\n\n\treturn result;\n}\n\nfunction traverseObject<T>(object: { [p: string]: T; } | T[] | null | undefined, callback: (key: string, value: T) => void) {\n    if (object == null) { return; }\n\n    if (Array.isArray(object)) {\n        for (let i = 0; i < object.length; i++) {\n            callback(i.toString(), object[i]);\n        }\n        return;\n    }\n\n    for (const [key, value ] of Object.entries(object)) {\n        callback(key, value);\n    }\n}\n\n\nexport {\n    createArrayOfNumbers,\n    traverseObject\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./modules/CSSRegistry\";\n\nfunction getEndAdornmentUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('field', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\n\nexport {\n  getEndAdornmentUtilityClass\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME,  } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { IEndAdonrmentComponent, IEndAdonrmentUserComponentHandler } from \"./end-adornment-view.types\";\nimport { getEndAdornmentUtilityClass } from \"./end-adornment-classes\";\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'input-suffix',\n\t\t\tmodifiers: [\n                // inValid && 'error'\n            ],\n\t\t},\n\t};\n    return composeClasses(slots, getEndAdornmentUtilityClass);\n};\nclass EndAdornmentController extends EventEmitter {\n    private component!: IEndAdonrmentComponent;\n\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: IEndAdonrmentUserComponentHandler;\n\n    setComp(component : IEndAdonrmentComponent) {\n        this.component = component;\n\n        this.setRendererDetails();\n        this.applyClasses();\n\n        this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_FOCUS_OUT\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_VALUE_UPDATE\", this.setRendererDetails.bind(this));\n        \n\n    }\n\n\n    private applyClasses(){\n        const classes = useUtilityClasses();\n        const params = this.component.getParams();\n        if(params){\n            const userClasses = typeof params.getUserClasses === \"function\" ? params.getUserClasses() : \"\";\n            userClasses ? classes.root = classes.root + \" \" + userClasses : \"\";\n        }\n        this.component.addClassName(classes.root);\n\n    }\n\n    setRendererDetails() : void {\n        let userDetails;\n        let params : any = {};\n        if(userDetails) {\n            this.component.setRendererDetails(userDetails, params.value);\n        }\n        this.setAccessibility();\n    }\n\n    private setAccessibility() : void {\n        const element = this.component.getElement();\n        const EndAdornmentValue = this.optionsHandler.getEndAdornmentValue();\n        const isElement =  EndAdornmentValue instanceof HTMLElement;\n        isElement ? element.appendChild(EndAdornmentValue)  : element.textContent = EndAdornmentValue;\n    }\n\n    refresh() {\n        this.setRendererDetails();\n    }\n}\n\nexport {\n    EndAdornmentController\n}","import {  PostConstruct, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\nimport { IEndAdonrmentComponent } from \"./end-adornment-view.types\";\nimport { EndAdornmentController } from \"./end-adornment-controller\";\n\n\n\n\nconst prefixTemplate = () => {\n\tconst div = document.createElement(\"div\");\n\treturn div as HTMLElement;\n}\nclass EndAdonrmentComponent extends Component {\n\n\tprivate renderer       : any;\n\tprivate rendererElement: any;\n\tprivate params :any\n\n\tconstructor(params:any){\n\t\tsuper()\n\t\tthis.params = params;\n\n\t}\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst template = prefixTemplate();\n\t\tthis.setTemplate(template);\n\n\t\tconst comp: IEndAdonrmentComponent = {\n\t\t\tsetRendererDetails: (rendererDetails: IComponentDetails, value ?: string) => this.setRendererDetails(rendererDetails , value),\n\t\t\taddOrRemoveCSSClass : (className : string, addOrRemove : boolean) => this.addOrRemoveCssClass(className, addOrRemove),\n            addClassName        : (className : string) => this.addOrRemoveCssClass(className, true),\n\n\t\t\tgetElement : () => this.getGui(),\n\t\t\tgetParams :()=> this.params,\n\n\t\t};\n\n\t\tconst controller = this.createBean(new EndAdornmentController);\n\t\tcontroller.setComp(comp);\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className\n\t}\n    private  setRendererDetails(_rendererDetails : IComponentDetails, _value ?: string){\n        this.destroyRenderer();\n    }\n\tprivate destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n}\n\n\nexport { \n    EndAdonrmentComponent\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./modules/CSSRegistry\";\n\nfunction getStartAdornmentUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('field', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\n\nexport {\n  getStartAdornmentUtilityClass\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME,  } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { IStartAdonrmentComponent, IStartAdonrmentUserComponentHandler } from \"./start-adornment-view.types\";\nimport { getStartAdornmentUtilityClass } from \"./start-adornment-classes\";\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'input-prefix',\n\t\t\tmodifiers: [\n                // inValid && 'error'\n            ],\n\t\t},\n\t};\n    return composeClasses(slots, getStartAdornmentUtilityClass);\n};\nclass StartAdornmentController extends EventEmitter {\n    private component!: IStartAdonrmentComponent;\n\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: IStartAdonrmentUserComponentHandler;\n\n    setComp(component : IStartAdonrmentComponent) {\n        this.component = component;\n\n        this.setRendererDetails();\n        this.applyClasses();\n\n        this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_FOCUS_OUT\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_VALUE_UPDATE\", this.setRendererDetails.bind(this));\n        \n\n    }\n\n\n    private applyClasses(){\n        const classes = useUtilityClasses();\n        const params = this.component.getParams();\n        if(params){\n            const userClasses = typeof params.getUserClasses === \"function\" ? params.getUserClasses() : \"\";\n            userClasses ? classes.root = classes.root + \" \" + userClasses : \"\";\n        }\n        this.component.addClassName(classes.root);\n\n    }\n\n    setRendererDetails() : void {\n        let userDetails;\n        let params : any = {};\n        if(userDetails) {\n            this.component.setRendererDetails(userDetails, params.value);\n        }\n        this.setAccessibility();\n    }\n\n    private setAccessibility() : void {\n        const element = this.component.getElement();\n        const startAdornmentValue = this.optionsHandler.getStartAdornmentValue();\n        const isElement =  startAdornmentValue instanceof HTMLElement;\n        isElement ? element.appendChild(startAdornmentValue)  : element.textContent = startAdornmentValue;\n    }\n\n    refresh() {\n        this.setRendererDetails();\n    }\n}\n\nexport {\n    StartAdornmentController\n}","import {  PostConstruct, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\nimport { IStartAdonrmentComponent } from \"./start-adornment-view.types\";\nimport { StartAdornmentController } from \"./start-adornment-controller\";\n\n\n\n\nconst prefixTemplate = () => {\n\tconst div = document.createElement(\"div\");\n\treturn div as HTMLElement;\n}\nclass StartAdonrmentComponent extends Component {\n\n\tprivate renderer       : any;\n\tprivate rendererElement: any;\n\tprivate params :any\n\n\tconstructor(params:any){\n\t\tsuper()\n\t\tthis.params = params;\n\n\t}\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst template = prefixTemplate();\n\t\tthis.setTemplate(template);\n\n\t\tconst comp: IStartAdonrmentComponent = {\n\t\t\tsetRendererDetails: (rendererDetails: IComponentDetails, value ?: string) => this.setRendererDetails(rendererDetails , value),\n\t\t\taddOrRemoveCSSClass : (className : string, addOrRemove : boolean) => this.addOrRemoveCssClass(className, addOrRemove),\n            addClassName        : (className : string) => this.addOrRemoveCssClass(className, true),\n\n\t\t\tgetElement : () => this.getGui(),\n\t\t\tgetParams :()=> this.params,\n\n\t\t};\n\n\t\tconst controller = this.createBean(new StartAdornmentController);\n\t\tcontroller.setComp(comp);\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className\n\t}\n    private  setRendererDetails(_rendererDetails : IComponentDetails, _value ?: string){\n        this.destroyRenderer();\n    }\n\tprivate destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n}\n\n\nexport { \n    StartAdonrmentComponent\n}","\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { ComponentMetadataProvider } from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport { UserComponentRegistry } from '@dg/corecomponent/UserComponentRegistry.js';\nimport { Context } from \"@dg/corecomponent/Context.js\";\nimport { IUserParams } from \"./button-core-component.types\";\nimport { ButtonOptionHandler } from \"./model/button-option-handler\";\nimport { ButtonUserComponentHandler } from \"./model/button-user-component-handler\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { ButtonAPI } from \"./model/button-api\";\nimport { ButtonControllerHandler } from \"./model/button-handler\";\n\nlet nextInstanceId = 1;\n\n\nclass CoreComponent {\n    createuserConfiguration( configuration: any, params: IUserParams, instanceID : string): { configuration: any; frameWorkOverrides: IFrameworkOverrides | null; globalEventListener: Function | null; frameworkComponentWrapper: any | null; instanceID : string; } {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n}\n\n\nexport class ButtonCoreComponent extends CoreComponent {\n\tinitializeButton(configuration: any, params: IUserParams = {}, createUI: CallableFunction): void {\n\t\t\n        const instanceID = configuration.instanceID ?? String(nextInstanceId++);\n\t\tconst beanClasses = this.CreateBeanClasses();\n\t\tconst context = new Context();\n\n\t\tconst userConfigurations = this.createuserConfiguration(\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t\tinstanceID\n\t\t);\n\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n\n\t\tcreateUI(context);\n\t}\n\n\tprivate CreateBeanClasses(): Set<any> {\n\t\tlet beanList = [\n\t\t\tComponentsRegistry,\n\t\t\tUserComponentRegistry,\n\t\t\tButtonOptionHandler,\n\t\t\tButtonUserComponentHandler,\n\t\t\tComponentMetadataProvider,\n            EventHandler,\n\t\t\tButtonAPI,\n\t\t\tButtonControllerHandler\n\t\t];\n\n\t\treturn new Set(beanList);\n\t}\n}\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IButtonConfiguration } from \"./button-configuration.types\";\nimport { IUserParams } from \"./button-core-component.types\";\nimport { IButtonAPI } from \"./model/button-api.types\";\nimport { BUTTON_BEAN_NAME } from \"./constants/bean-name-constants\";\nimport { ButtonComponent } from \"./core/button-view\";\nimport { ButtonCoreComponent } from \"./ButtonCoreComponent\";\n\nexport class Button {\n\tpublic api: IButtonAPI | undefined;\n\tconstructor(configuration: IButtonConfiguration, params?: IUserParams) {\n\t\tconst createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(BUTTON_BEAN_NAME.BUTTON_API) as IButtonAPI;\n\t\t\tcontext.createBean(new ButtonComponent(configuration.appendTo));\n\t\t};\n\t\tnew ButtonCoreComponent().initializeButton(configuration, params, createUI);\n\t}\n}","export const BUTTON_BEAN_NAME = {\n\tBUTTON_CONFIGURATION: 'configuration',\n\tBUTTON_API : 'buttonapi',\n\tBUTTON_CONTROLLER_HANDLER: 'buttonControllerHandler',\n};","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../modules/CSSRegistry\";\n\nexport function getButtonUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('button', slots.slot, slots.modifiers,globalNameSpace as string[]);\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ButtonCompType, ButtonPropertyType, ButtonRendererParamsType } from \"./button.types\";\nimport { AutoWired, BEAN_NAME, setAriaLabel } from \"@dg/corecomponent\";\nimport { IButtonUserComponentHandler } from \"../model/button-user-component-handler.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { BUTTON_BEAN_NAME } from \"../constants/bean-name-constants\";\nimport { ButtonControllerHandler } from \"../model/button-handler\";\nimport { ICustomRenderer } from \"../../../utility/custom-render.types\";\nimport { ComponentItemType, IComponentDetails } from \"../../../utility/component-detail.types\";\nimport { getButtonUtilityClass } from \"./button-classes\";\n\nconst useUtilityClasses = (ownerState : any) => {\n    const {disabled} = ownerState;\n\tconst slots = {\n\t\troot    : {\n            slot     : 'root',\n            modifiers: [\n                disabled && 'disabled'\n            ]\n        },\n\t};\n\n\treturn composeClasses(slots, getButtonUtilityClass);\n};\n\nexport class ButtonController extends EventEmitter {\n\tprivate comp!: ButtonCompType|null;\n\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: IButtonUserComponentHandler;\n    @AutoWired(BUTTON_BEAN_NAME.BUTTON_CONTROLLER_HANDLER) controllerHandler !: ButtonControllerHandler;\n\tsetComp(comp: ButtonCompType) {\n        this.comp = comp;\n        this.init();\n        this.attachListener();\n        this.controllerHandler.registerButton(this);\n        this.addDestroyFunc(() => {\n            this.comp?.destroy();\n        })\n    }\n\n    refresh() : void {\n        this.applyClasses();\n        this.setRendererDetails();\n        this.setTabIndex();\n        this.setRole();\n        this.setDisabled();\n        this.setAccessibility();\n    }\n\n    private init() {\n        this.applyClasses();\n        this.setRendererDetails();\n        this.setTabIndex();\n        this.setRole();\n        this.setDisabled();\n        this.setAccessibility();\n        this.addListener(this.eventHandler, 'PROPERTY_CHANGED',this.refresh.bind(this));\n    }\n\n    private setAccessibility() : void {\n        const element = this.comp?.getElement();\n        element && setAriaLabel(element, this.optionsHandler.getAriaLabel());\n    }\n\n    private setDisabled() {\n        const element = this.comp?.getElement();\n        const disabled = this.optionsHandler.isDisabled();\n        element && element.setAttribute('aria-disabled', disabled);\n    }\n\n    private attachListener() {\n        const element = this.comp?.getElement();\n        if(!element) return;\n        this.addListener(element, 'keydown', (event) => {\n            const disabled = this.optionsHandler.isDisabled();\n\t\t\tconst callback = this.optionsHandler.getEvent();\n\t\t\tif (disabled) return;\n            switch (event.key) {\n                case 'Enter': \n                case ' '    : \n                    event.preventDefault();\n                    callback && callback(event);\n                    break;\n            }\n        });\n\n        this.addListener(element, 'click', (event) => {\n            const disabled = this.optionsHandler.isDisabled();\n            const readonly = this.optionsHandler.isReadonly();\n\t\t\tconst callback = this.optionsHandler.getEvent();\n\t\t\tif (disabled || readonly) return;\n            callback && callback(event);\n        });\n    }\n\n    private setRole() {\n        const element = this.comp?.getElement();\n        if(!element) return;\n\n        if(!element.hasAttribute('role')) {\n            element.setAttribute('role',\"button\");\n        }\n    }\n\n    private applyClasses() {\n        const ownerState = this.getOwnerState();\n        const userclasses = this.optionsHandler.getClasses();\n        const classes = useUtilityClasses(ownerState);\n        this.comp?.getElement().classList.remove('dg-button__root--disabled');\n\n        this.comp?.addOrRemoveClassName(classes.root, true);\n\n\n        if(userclasses && typeof userclasses === \"string\") {\n            userclasses && this.comp?.getElement().classList.add(userclasses);\n        }else if(userclasses) {\n            for(let i = 0; i < userclasses.length; i++){\n                const className = userclasses[i]\n            this.comp?.getElement().classList.add(className);\n\n            }\n        }\n        \n    }\n\n    private setTabIndex() {\n        const element = this.comp?.getElement();\n        const tabindex = this.optionsHandler.getTabindex();\n\n        if(!element) return;\n\n        if(!element.hasAttribute('tabindex')) {\n            element.setAttribute('tabindex',tabindex);\n        }\n    }   \n\n    private getOwnerState() {\n        return {\n            disabled : this.optionsHandler.isDisabled()\n        }\n    }\n\n    private setRendererDetails() : void {\n        const rendererWrapper = this.createButtonRendererWrapper<ICustomRenderer>();\n        const params          = this.createButtonRendererParams();\n        const props           = this.getProperty();\n        const userDetails     = this.userComponentHandler.getButtonRendererDetails<ICustomRenderer, ButtonRendererParamsType>(rendererWrapper, params) as IComponentDetails;\n        this.comp?.setRendererDetails(userDetails, props);\n    }\n\n    private createButtonRendererWrapper<T>() : ComponentItemType<T> {\n        const renderer = this.optionsHandler.getRenderer();\n        const rendererParams = this.optionsHandler.getRendererParams();\n        return {\n\t\t\tgetRenderer      : () => renderer,\n\t\t\tgetRendererParams: () => rendererParams\n\t\t}\n    }\n\n    private createButtonRendererParams() : ButtonRendererParamsType {\n        return {\n            parentElement : this.comp?.getElement() ?? null,\n            value : this.optionsHandler.getText()\n        }\n    }\n\n    getElement(){\n        return this.comp?.getElement();\n    }\n\n    destroy(): void {\n        super.destroy();\n        this.comp = null\n    }\n\n    getProperty() : ButtonPropertyType {\n        return {\n            showIcon: this.optionsHandler.needToShowIcon(),\n            showText: this.optionsHandler.needToShowText(),\n            icon    : this.optionsHandler.getIcon(),\n            text    : this.optionsHandler.getText(),\n            getSvgClasses : this.optionsHandler.getSvgClasses()\n        }\n    }\n\n    applyClassNameForSVG():void{\n        const showIcon = this.optionsHandler.needToShowIcon();\n\n        if(showIcon){\n            const getSvgClasses = this.optionsHandler.getSvgClasses();\n            getSvgClasses && this.comp?.getSvgElement().classList.add(getSvgClasses);\n        }\n\n    }\n}","import { composeClasses } from \"@dg/utils\";\n\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { ButtonCompType, ButtonPropertyType } from \"./button.types\";\nimport { PostConstruct, clearElement, queryAssignedNodes, removeFromParent } from \"@dg/corecomponent\";\nimport { ButtonController } from \"./button-controller\";\nimport { getSvgIcon } from \"../../../utility/create-svg-template\";\nimport { IComponentDetails } from \"../../../utility/component-detail.types\";\nimport { ICustomRenderer } from \"../../../utility/custom-render.types\";\nimport { getButtonUtilityClass } from \"./button-classes\";\n\nexport function loadTemplate(template: string): HTMLElement {\n    const parser = new DOMParser();\n    const doc = parser.parseFromString((template || '').trim(), 'text/html');\n    return doc.body.firstElementChild as HTMLElement;\n}\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\ticon    : {\n            slot     : 'icon',\n            modifiers: []\n        },\n\t\tsvg : {\n\t\t\tslot : 'svg',\n\t\t\tmodifiers : []\n\t\t},\n\t\ttext : {\n\t\t\tslot : 'text',\n\t\t\tmodifiers : []\n\t\t}\n\t};\n\n\treturn composeClasses(slots, getButtonUtilityClass);\n};\n\nexport function escapeString(toEscape?: string | null, skipHtmlChars?: boolean): string | null {\n\n\t const escapeMap: { [key: string]: string } = {\n\t\t\t'&': '&amp;',\n\t\t\t'<': '&lt;',\n\t\t\t'>': '&gt;',\n\t\t\t'\"': '&quot;',\n\t\t\t\"'\": '&#39;', \n\t\t};\n\n    if (toEscape == null) {\n        return null;\n    }\n\n    const stringResult = toEscape.toString().toString();\n\n    if (skipHtmlChars) {\n\t\treturn stringResult;\n\t}\n\n    return stringResult.replace(/[&<>\"']/g, (chr) => escapeMap[chr]);\n}\n\nconst buttonTemplate = () => {\n    return document.createElement('button');\n};\n\nexport class ButtonComponent extends Component {\n\tprivate renderer!: ICustomRenderer;\n\t\n\t@queryAssignedNodes('svg-element') svgElement !      : any;\n\n\n\tprivate rendererElement!: HTMLElement | null;\n\n\tprivate appendTo: HTMLElement | null | undefined;\n\n\tconstructor(appendTo: HTMLElement | null | undefined) {\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit() {\n\t\tthis.setTemplate(buttonTemplate());\n\t\tconst comp: ButtonCompType = {\n\t\t\tsetRendererDetails: ( rendererDetails: IComponentDetails, value?: ButtonPropertyType, ) => this.setRendererDetails(rendererDetails, value),\n\t\t\tgetElement: () => this.getGui(),\n\t\t\taddOrRemoveClassName: (name: string, force: boolean) => this.addOrRemoveCssClass(name, force),\n\t\t\tdestroy: () => this.destroy(),\n\t\t\tgetSvgElement : () => this.getSvgElement()\n\t\t};\n\n\t\tconst controller = this.createBean(new ButtonController());\n\t\tcontroller.setComp(comp);\n\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n\tprivate setRendererDetails( rendererDetails: IComponentDetails, value?: ButtonPropertyType ): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutRenderer(value);\n\t\t}\n\t}\n\n\tprivate getSvgElement(){\n\t\treturn this.svgElement.eGui;\n\t}\n\n\tprivate insertValueWithoutRenderer(props?: ButtonPropertyType): void {\n\t\tif(!props) return ;\n\n\t\tconst { showIcon, icon, showText, text } = props;\n\n\t\tconst classes = useUtilityClasses();\n\t\tconst userClasses = typeof props.getSvgClasses === \"function\" ? props.getSvgClasses() : \"\";\n\t\tuserClasses ? classes.svg = userClasses : \"\";\n\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\n\t\tif (showIcon && icon) {\n\t\t\tlet iconElement = loadTemplate(getSvgIcon(icon,classes));\n\t\t\tthis.appendChild(iconElement);\n\t\t}\n\n\t\tif (showText && text) {\n\t\t\tconst textElement = document.createElement('span');\n\t\t\ttextElement.className = classes.text;\n\t\t\ttextElement.textContent = text?.toString() ?? '';\n\t\t\tthis.appendChild(textElement);\n\t\t}\n\t}\n\n\tprivate destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate afterRenderer(renderer: ICustomRenderer) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n\tprivate appendElementIntoUserDom(): void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.appendTo && this.appendTo.removeChild(eGui);\n\t\t\tthis.appendTo = null;\n\t\t});\n\t}\n}\n","import { AutoWired, Bean } from \"@dg/corecomponent\";\nimport { BUTTON_BEAN_NAME } from \"../constants/bean-name-constants\";\nimport { IButtonAPI } from \"./button-api.types\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ButtonControllerHandler } from \"./button-handler\";\nimport { IButtonConfiguration } from \"../button-configuration.types\";\n\n@Bean(BUTTON_BEAN_NAME.BUTTON_API)\nexport class ButtonAPI extends EventEmitter implements IButtonAPI {\n    @AutoWired(BUTTON_BEAN_NAME.BUTTON_CONTROLLER_HANDLER) controller !: ButtonControllerHandler;\n    @AutoWired(BUTTON_BEAN_NAME.BUTTON_CONFIGURATION) configuration !: IButtonConfiguration;\n\n    getElement(): HTMLElement | undefined{\n        return this.controller.getButtonCtrl().getElement();\n    }\n    destroy(): void {\n        const buttonctrl = this.controller.getButtonCtrl();\n        if(buttonctrl) {\n            buttonctrl.destroy();\n        }\n        this.context.destroy();\n    }\n\n    updateProperties(properties: any): void {\n        Object.entries(properties).forEach(([key, value]) => {\n            if (value !== undefined) {\n                // Cast key as keyof INumberConfiguration to maintain type safety\n                (this.configuration as any)[key] = value; \n            }\n        });\n\n        this.dispatchEvent({\n            type: \"PROPERTY_CHANGED\",\n            options: properties,\n        });\n\n    }\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ButtonController } from \"../core/button-controller\";\nimport { Bean } from \"@dg/corecomponent\";\nimport { BUTTON_BEAN_NAME } from \"../constants/bean-name-constants\";\n\n@Bean(BUTTON_BEAN_NAME.BUTTON_CONTROLLER_HANDLER)\nexport class ButtonControllerHandler extends EventEmitter {\n    private buttonCtrl !: ButtonController;\n    registerButton(buttonCtrl : ButtonController) : void {\n        this.buttonCtrl = buttonCtrl;\n    }\n\n    getButtonCtrl() : ButtonController {\n        return this.buttonCtrl;\n    }\n}\n\n\n","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { BUTTON_BEAN_NAME } from \"../constants/bean-name-constants\";\nimport { IButtonConfiguration } from \"../button-configuration.types\";\nimport { IButtonOptionHandler } from \"./button-option-handler.types\";\n\n// function getCallbackForEvent(eventName: string): string {\n// \tif (eventName && eventName.length == 2) {\n// \t\treturn eventName;\n// \t}\n// \treturn `on${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n// }\n\nfunction getHookCallbackForEvent(eventName: string, Hookname: string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${Hookname}${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class ButtonOptionHandler extends EventEmitter implements IButtonOptionHandler {\n\n    @AutoWired(BUTTON_BEAN_NAME.BUTTON_CONFIGURATION) configuration !: IButtonConfiguration;\n\n    onBefore(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'Before') as keyof IButtonConfiguration;;\n\n\t\tif(typeof this.configuration?.[callbackMethodName] === 'function') {\n\t\t\treturn this.configuration[callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tonAfter(eventName : string, event?: any) : void {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'After') as keyof IButtonConfiguration;;\n\n\t\tif(typeof this.configuration[callbackMethodName] === 'function') {\n\t\t\tthis.configuration[callbackMethodName](event);\n\t\t}\n\t}\n\n    getTabindex():string{\n        return  this.configuration.tabindex ??  \"0\"\n    }\n\n   \n    isDisabled(): boolean {\n        return this.configuration.disabled ?? false;\n    }\n    isReadonly(): boolean {\n        return this.configuration.readonly ?? false;\n    }\n\n\tgetClasses(): string[] |string{\n        return this.configuration.classes ?? '';\n    }\n\n    getColor(): 'inherit' | 'primary' | 'secondary' | 'success' | 'error' | 'info' | 'warning'  {\n        return this.configuration.color ?? 'primary' ;\n    }\n\n    getSize(): 'small' | 'medium' | 'large'  {\n        return this.configuration.size ?? 'small';\n    }\n\n    getVariant(): 'contained' | 'outlined' | 'text'   {\n        return this.configuration.variant ?? 'text' ;\n    }\n\n    getText(): string {\n        return this.configuration.text ?? '';\n    }\n\n\tgetAppendto() : HTMLElement{\n\t\treturn this.configuration.appendto ? this.configuration.appendto : document.body ;\n\t}\n\n\tgetEvent():CallableFunction{\n\t\treturn this.configuration.callback ?? (()=>{});\n\t}\n\n    getAriaLabel(): string{\n        return this.configuration.ariaLabel ?? \"\";\n    }\n\n    getRenderer() : any {\n        return this.configuration.renderer;\n    }\n\n    getRendererParams() : any {\n        return this.configuration.rendererParams;\n    }\n\n    needToShowIcon() : boolean {\n        return this.configuration.showIcon ?? false;\n    }\n\n    needToShowText() : boolean {\n        return this.configuration.showText ?? true;\n    }\n\n    getIcon() : string | undefined{\n        return this.configuration.icon ;\n    }\n    getSvgClasses() :CallableFunction | null {\n        return this.configuration.getSvgClasses?? null;\n    }\n\n}\n","import { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName, } from '@dg/corecomponent';\nimport {ComponentMetadata} from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport {UserComponentHandler} from '@dg/corecomponent/UserComponentHandler.js';\nimport {UserComponentRegistry} from '@dg/corecomponent/UserComponentRegistry.js';\nimport { IButtonUserComponentHandler } from './button-user-component-handler.types';\nimport { ComponentItemType, IComponentDetails } from '../../../utility/component-detail.types';\nexport const enum PropertyName {\n\tBUTTON_RENDERER = 'buttonRenderer',\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class ButtonUserComponentHandler extends UserComponentHandler implements IButtonUserComponentHandler {\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\tgetButtonRendererDetails<T, P>(item: ComponentItemType<T>, params?: P) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails<T, P>(item, PropertyName.BUTTON_RENDERER, params, PropertyName.BUTTON_RENDERER);\n\t}\n\n\tprotected getComponentDetails<T, P>( item: ComponentItemType<T>, propertyName: PropertyName, params?: P, defautName?: string, ): IComponentDetails |undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta<T,P>(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif (\n\t\t\tjsComponent == null &&\n\t\t\tframeworkComponent == null &&\n\t\t\tdefautName != null\n\t\t) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams<T, P>(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance<T,P>(componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta<T, P>( item: ComponentItemType<T>, propertyName: PropertyName, _params?: P, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: T | null= null;\n\t\tlet frameworkComponent: T | null = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: T) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent =\n\t\t\t\t\tthis.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass(\n\t\t\tthis.getComponent<T>(item, propertyName),\n\t\t);\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent<T>(item: ComponentItemType<T>, propertyName: PropertyName): T {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.BUTTON_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t}\n\t}\n    protected newInstance<T, P>( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: P, ) {\n\t\tlet instance: T;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams<T, P>(item : ComponentItemType<T>, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams<T, P>(item, propertyName, params)};\n    }\n\n    private getUserParams<T, P>(item : ComponentItemType<T>, propertyName : PropertyName, params : any) : any {\n        switch(propertyName) {\n            case PropertyName.BUTTON_RENDERER:\n                return this.getUserRendererParams<T, P>(item, params);\n            default:\n                return {};\n        }\n\n    }\n\n    private getUserRendererParams<T, P>(item : ComponentItemType<T>, params : P) : any {\n        const rendererParams = item.getRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n}\n","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IUserParams } from \"../../utility/user-params.types\";\nimport { ComponentsRegistry, ComponentMeta } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { BEAN_NAME, traverseObject } from \"@dg/corecomponent\";\nimport { ICalendarConfiguration } from \"./calendar-configuration.types\";\nimport { CalendarOptionHandler } from \"./core/model/calendar-options-handler\";\nimport { ButtonRenderer } from \"./core/user-component/buttonRenderer\";\nimport { CalendarButtonComponent } from \"./core/calendar-button/calendar-button-view\";\nimport { CalendarComponentHandler } from \"./core/model/calendar-user-component-handler\";\nimport { CalendarWeekDayView } from \"./core/calendar-weeday/calendar-weekday-view\";\nimport { CalendarCalendarView } from \"./core/calendar-container/calendar-container-view\";\nimport {  CalendarDayContainerView } from \"./core/calendar-day-container/calendar-day-container-view\";\nimport { CalendarCellView } from \"./core/calendar-cell/calendar-cell-view\";\nimport { CalendarDataManager } from \"./core/model/calendar-data-manager\";\nimport { CalendarViewManager } from \"./core/model/calendar-view-manager\";\nimport { CalendarApi } from \"./core/model/calendar-api\";\nimport { CalendarControllerHandler } from \"./core/model/calendar-controller\";\nimport { CalendarNavBarView } from \"./core/calendar-nav-bar/calendar-nav-bar-view\";\nimport { TimeNavBarView } from \"./core/time-nav-bar/time-nav-bar-view\";\nimport { TimePickerDropdown } from \"./core/time-dropdown-hanlder/time-dropdown-handler\";\nimport { PopupHandler } from \"./core/model/popup-handler\";\n\nexport const enum PropertyName {\n\tBUTTON_RENDERER = 'buttonRenderer',\n}\n\nlet nextInstanceId = 1;\n\n\nexport class CalendarCoreComponent {\n\tinitialize( configuration: ICalendarConfiguration, params: IUserParams = {}, createUI: CallableFunction): void {\n\t\t\n\t\tconst instanceID = configuration.instanceID ?? String(nextInstanceId++);\n\n\t\tconst beanClasses = this.CreateBeanClasses();\n\n\t\tconst context = new Context();\n\n\t\tconst userConfigurations = this.createuserConfiguration(\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t\tinstanceID\n\t\t);\n\n        // Model classes\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n        // Default component registry\n\t\tthis.registerCoreComponent(context);\n        // Default user compoent registry\n\t\tthis.registerDefaultUserComponent(context);\n\t\tcreateUI(context);\n\n\t\t(window as any).context = context;\n\t}\n\n\tprivate CreateBeanClasses(): Set<any> {\n\t\tlet beanList = [\n            ComponentsRegistry,\n\t\t\tUserComponentRegistry,\n\t\t\tComponentMetadataProvider,\n\t\t\tEventHandler,\n\n            CalendarOptionHandler,\n\t\t\tCalendarComponentHandler,\n\t\t\tCalendarDataManager,\n\t\t\tCalendarViewManager,\n\t\t\tCalendarApi,\n\t\t\tCalendarControllerHandler,\n\t\t\tPopupHandler,\n\t\t\tTimePickerDropdown\n            \n\n\n            \n\t\t];\n\t\treturn new Set(beanList);\n\t}\n\n\tprivate createuserConfiguration( configuration: any, params: IUserParams, instanceID : string): {\n\t\tconfiguration: any;\n\t\tframeWorkOverrides: IFrameworkOverrides | null;\n\t\tglobalEventListener: Function | null;\n\t\tframeworkComponentWrapper: any | null;\n\t\tinstanceID : string;\n\t} {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n\n\tprivate registerDefaultUserComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n\t\t\t[PropertyName.BUTTON_RENDERER] : ButtonRenderer\n\t\t};\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n\n\n\tprivate registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nexport function createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n\t\t{\n\t\t\tcomponentName: 'calendar-nav',\n\t\t\tcomponentClass: CalendarNavBarView,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'calendar-previous-button',\n\t\t\tcomponentClass: CalendarButtonComponent,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'calendar-next-button',\n\t\t\tcomponentClass: CalendarButtonComponent,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'calendar-previous-year-button',\n\t\t\tcomponentClass: CalendarButtonComponent,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'calendar-next-year-button',\n\t\t\tcomponentClass: CalendarButtonComponent,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'calendar-weekday',\n\t\t\tcomponentClass: CalendarWeekDayView,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'calendar-body',\n\t\t\tcomponentClass: CalendarCalendarView,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'calendar-cells',\n\t\t\tcomponentClass: CalendarDayContainerView,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'calendar-cell',\n\t\t\tcomponentClass: CalendarCellView,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'time-picker',\n\t\t\tcomponentClass: TimeNavBarView,\n\t\t\t\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t\n        \n        \n    ];\n\n\treturn components;\n}\n\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IUserParams } from \"../../utility/user-params.types\";\nimport { ICalendarConfiguration } from \"./calendar-configuration.types\";\nimport { CalendarCoreComponent } from \"./calendar-core-components\";\nimport { CALENDAR_BEAN_NAME } from \"./constant/bean-name-constant\";\nimport { CalendarRootView } from \"./core/root/calendar-root-view\";\nimport { CalendarAPITypes } from \"./core/model/calendar-api.types\";\n\n\nexport class Calendar {\n\tpublic api: CalendarAPITypes | undefined;\n\tconstructor(configuration: ICalendarConfiguration, params?: IUserParams) {\n\t\tconst createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(CALENDAR_BEAN_NAME.CALENDAR_API) as CalendarAPITypes;\n\t\t\tcontext.createBean(new CalendarRootView({appendTo : configuration.appendTo,showTimePicker: configuration.showTimePicker , type : configuration.type}));\n\t\t};\n\t\tnew CalendarCoreComponent().initialize(configuration, params, createUI);\n\t}\n}","export const CALENDAR_BEAN_NAME = {\n\tCALENDAR_API               : 'calendarApi',\n\tCALENDAR_CONFIGURATION     : 'configuration',\n\tCSSCLASSNAMEGENERATOR      : 'CSSClassNameGenartor',\n\tKEYBOARD_SHORTCUT_HANDLER  : 'KeyBoardShortCutsHandler',\n\tCALENDAR_EVENT_HANDLER     : 'calendarEventHandler',\n\tCALENDAR_CONTROLLER_HANDLER: 'calendarControllerHandler',\n\tCALENDAR_MODEL             : 'calendarModel',\n\tCALENDAR_INPUT_HANDLER     : 'calendarInputHandler',\n\tCALENDAR_VIEW_MANAGER      : 'calendarViewManager',\n\tCALENDAR_TIME_DROPDOWN_MANAGER : 'calendarTimeDropDownManager',\n};","export const EVENT_NAME = {\n    KEYDOWN  : 'keydown',\n    FOCUS    : 'focus',\n    BLUR     : 'blur',\n    MOUSEDOWN: 'mousedown',\n    CLICK    : 'click'\n}\n\nexport const CALENDAR_CUSTOM_EVENTS ={\n\n    DAYS_UPATED                   : 'days_upated',\n    MONTH_UPDATED                 : 'month_updated',\n    YEAR_UPDATED                  : 'year_updated',\n    NAVBAR_RERENDER               : 'navbar_rerender',\n    CONTAINER_RERENDER            : 'container_render',\n    RERENDER                      : 'rerender',\n    SHOWYEARBTN                   : 'showYearBTN',\n    HIDEYEARBTN                   : 'hideYearBTN',\n    HIDEWEEKDAY                   : 'hideWeekday',\n    SHOWWEEKDAY                   : 'showWeekday',\n    UPDATE_TIME                   : \"update_time\",\n    SET_FOCUS_TO_THE_TITLE_ELEMENT: 'setFocusedToTitleElement',\n    PROPERTY_UPDATE               : 'PROPERTY_UPDATE',\n    VALUE_UPDATE                  : 'VALUE_UPDATE'\n\n}","\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { CalendarButtonType } from \"./calendar-button.types\";\n\n\n\n\n\n\nexport class CalendarButtonController extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: any;\n    \n    private comp !: CalendarButtonType;\n\n    // private ownerState : {disabled : boolean|null} = {disabled : null,};\n    setComp(comp : CalendarButtonType) : void {\n        this.comp = comp;\n        this.applyState();\n        this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.applyState.bind(this));\n    }\n\n    private applyState() : void {\n\n        // const ownerState = this.getOwnerState();\n\n        // if(this.ownerState.disabled === ownerState.disabled ) {\n        //     return;\n        // }\n\n\n        // this.ownerState = ownerState;\n        // const classes = useUtilityClasses(ownerState);\n        // this.comp.addOrRemoveCssClass(classes.root, true);\n\n        this.setRendererDetails();\n    }\n\n    private setRendererDetails() : void {\n        \n        const params          = this.createRendererParams();\n        const rendererWrapper = this.createRendererWrapper();\n        const compDetails     = this.userComponentHandler.getButtonRendererDetails(rendererWrapper, params);\n\n        this.comp.setRendererDetails(compDetails);\n    }\n\n    private createRendererParams() {\n        const params = this.comp.getParams() ?? {};\n        return {\n            parentElement: this.comp.getElement(),\n            callback     : (event :any) => {\n                event.stopImmediatePropagation();\n                params.callback && params.callback(event)\n            },\n            showIcon     : true,\n            showText     : false,\n            ariaLabel    : params.getRole(),\n            label        : params.label,\n            icon         : params.icon,\n            classes      : params.classes,  \n            disabled : params.disabled,\n\t\t};\n    }\n\n    private createRendererWrapper() {\n        const {getRenderer, getRendererParams} = this.comp.getParams() ?? {};\n        return {\n\t\t\tgetRenderer          : () => getRenderer ? getRenderer() : undefined,\n\t\t\tgetUserRendererParams: () => getRendererParams ? getRendererParams() : undefined\n\t\t}\n    } \n\n    // private getOwnerState() {\n    //     const {  getRole, icon } = this.comp.getParams() ?? {};\n    //     return {\n    //         role : getRole(),\n    //         icon : icon\n    //     }\n    // }\n\n\n    protected destroy(): void {\n        super.destroy();\n    }\n\n\n  \n\n\n}","import { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { CalendarButtonController } from \"./calendar-button-controller\";\nimport { CalendarButtonType } from \"./calendar-button.types\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\n\nconst DatePickerButtonTemplate = () => {\n    // const div = document.createElement(\"div\");\n    // div.innerHTML = '<div></div>';\n    // return div.firstChild as HTMLElement;\n\n\treturn document.createElement(\"div\");\n};\nexport class CalendarButtonComponent extends Component {\n\tprivate renderer: any;\n\tprivate rendererElement: any;\n    private params : any;\n\n    constructor(params : any) {\n        super();\n        this.params = params;\n    }\n\n\t@PostConstruct()\n\tinit() {\n\t\tthis.setTemplate(DatePickerButtonTemplate());\n\t\tconst comp : CalendarButtonType = {\n            addOrRemoveCssClass: (className: string, force: boolean) => this.addOrRemoveCssClass(className, force),\n            setRendererDetails : (rendererDetails: IComponentDetails) => this.setRendererDetails(rendererDetails),\n            getElement         : () => this.getGui(),\n            getParams          : () => this.params,\n\t\t\t\n\t\t};\n\n\t\tconst controller = this.createBean(new CalendarButtonController());\n\t\tcontroller.setComp(comp);\n\t}\n\n\tprivate setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate destroyRenderer(): void {\n\t\tthis.renderer = this.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n    private afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className;\n\t}\n\tprotected destroy(): void {\n\t\t// super.destroy();\n\t\tthis.getGui().remove()\n\n}\n\n\t\n}","import { composeClasses } from \"@dg/utils\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { CalendarCellViewType } from \"./calendar-cell-view.types\";\nimport { getCalendarRootUtilityClass } from \"../root/calendar-root-classes\";\nimport { DayDetails, ICalendarDataManager } from \"../model/calendar-data-manager.types\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { AutoWired, BEAN_NAME, setAriaLabel, setAriaRole } from \"@dg/corecomponent\";\nimport { CalendarViewManagerTypes } from \"../model/calendar-view-manager.types\";\nimport { CALENDAR_VIEW_TYPE } from \"../model/calendar-view-manager\";\nimport { CALENDAR_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { TimePickerDropdownType } from \"../time-dropdown-hanlder/time-dropdown-handler.types\";\nimport { CalendarOptionHandlerType } from \"../model/calendar-options-handler.types\";\nimport { isSameDate } from \"../model/calendar-data-manager\";\n\nconst useUtilityClasses = (ownerState: any) => {\n    const { currentMonth, isToday, isSelected, isWeekEnd, isMonthView, isYearView, showAdjacentDates,isDisabled } = ownerState;\n    const slots = {\n        container: {\n            slot: 'cell',\n            modifiers: [\n                // (isMonthView || isYearView) && currentMonth && \"current\",\n                (!currentMonth && !isMonthView && !isYearView) && \"adjacentdate\",\n               (isToday && currentMonth) && \"today\",\n               (isToday && !currentMonth && showAdjacentDates) && 'today',\n                (isSelected && currentMonth) && \"selected\",\n                (isWeekEnd && currentMonth) && 'weekend',\n                isMonthView && 'month',\n                isYearView && 'year',\n                (!isMonthView && !isYearView) && 'day',\n                isDisabled && 'disabled'\n            ]\n        }\n    };\n\n    return composeClasses(slots, getCalendarRootUtilityClass);\n}\n\nexport class CalendarCellViewController extends AbstractController<CalendarCellViewType> {\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_MODEL) protected model!: ICalendarDataManager;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER) protected viewManager!: CalendarViewManagerTypes;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_TIME_DROPDOWN_MANAGER) dropdownHanlder !: TimePickerDropdownType;\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: CalendarOptionHandlerType;\n\n\n\n    private dateDetails!: DayDetails;\n\n    init() {\n        this.applyClassNames();\n        this.registerEventListener();\n        this.setRole();\n        // this.setTabindex()\n        this.setAriaAttributes();\n        this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE, this.refreshConstraintState.bind(this));\n    }\n\n    private applyClassNames() {\n        const ownerState = this.ownerState();\n        const classes    = useUtilityClasses(ownerState);\n        this.component?.addOrRemoveCssClass(classes.container);\n    }\n\n    // private setTabindex() {\n    //     const element = this.component?.getElement() as HTMLElement;\n    //     element.tabIndex = 0;\n    // }\n    private ownerState() {\n        return {\n            currentMonth: this.dateDetails.isCurrentMonth,\n            isToday     : this.dateDetails.isToday,\n            isSelected: this.dateDetails.isSelected,\n            isWeekEnd   : this.dateDetails.isWeekEnd,\n            isMonthView : this.viewManager.isMonthView(),\n            isYearView  : this.viewManager.isYearView(),\n            showAdjacentDates : this.optionsHandler.getShowAdjacentDates(),\n            isDisabled : this.dateDetails.isDisabled\n        };\n    }\n\n    setRole() {\n        const element = this.component?.getElement() as HTMLElement;\n        setAriaRole(element, \"gridcell\");\n    }\n\n    setAriaAttributes() {\n        const element = this.component?.getElement() as HTMLElement;\n        setAriaLabel(element, this.dateDetails.ariaLabel);\n    }\n\n    getProperty() {\n        this.dateDetails = this.viewManager.getRenderingDetails();\n        this.viewManager.updateCounter();\n        return { date: this.dateDetails.date };\n    }\n\n    private registerEventListener(): void {\n        const element = this.component?.getElement() as HTMLElement;\n        const type =  this.optionsHandler.getType()\n\n        this.addListener(element, 'click', (event : PointerEvent) => {\n            event.stopImmediatePropagation();\n\n            // minDate/maxDate updates refresh cell state in place without re-registering\n            // listeners, so disabled has to be checked at click time, not at registration.\n            if(this.dateDetails.isDisabled){\n                return\n            }\n\n            const viewType = this.viewManager.getViewType();\n            // element.focus()\n            this.dropdownHanlder.destroyDropdown();\n\n\n            if (viewType === CALENDAR_VIEW_TYPE.DAY) {\n                if (!this.dateDetails.isCurrentMonth) {\n                    return;\n                }\n\n                if(this.optionHandler.shouldDeselect()){\n                    const currentDate = this.model.getDateObject()\n                    if(isSameDate(this.dateDetails.dateObject as Date,currentDate) && this.dateDetails.isSelected ){\n                        this.model.setDateSelected(false);\n                        this.dateDetails.isSelected = false;\n                        this.applyClassNames()\n                        this.optionHandler.onDeselect(this.dateDetails.dateObject as Date)\n\n                        return\n                    }\n                }\n\n                this.optionsHandler.onClick(event);\n                this.updateModelDate(this.dateDetails.value);\n\n                this.optionsHandler.onChange(this.model.getDateObject());\n\n\n                if(type === 'datepicker' && this.optionHandler.shouldCloseOnSelect()){\n                    this.dispatchEvent({type:'DESTROY_CALENDAR'})\n                }\n\n                this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.RERENDER });\n                // this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.SET_FOCUS_TO_THE_TITLE_ELEMENT });\n                this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'});\n\n\n\n\n            } else if (viewType === CALENDAR_VIEW_TYPE.MONTH) {\n                this.updateModelMonth(this.dateDetails.value);\n                let pickerType = \"month\";\n                if(pickerType === this.optionsHandler.getPickerType()){\n                    // this.updateModelDate(this.dateDetails.value);\n                    this.optionsHandler.onChange(this.model.getDateObject());\n\n                    return\n                }\n\n                this.viewManager.setViewType(CALENDAR_VIEW_TYPE.DAY)\n                this.updateViewManager();\n\n                this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.SHOWYEARBTN });\n                this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED });\n                this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.SHOWWEEKDAY});\n                // this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.SET_FOCUS_TO_THE_TITLE_ELEMENT });\n                this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'});\n\n\n\n\n            } else if (viewType === CALENDAR_VIEW_TYPE.YEAR) {\n                this.updateModelYear(this.dateDetails.value);\n                let pickerType = \"year\";\n                if(pickerType === this.optionsHandler.getPickerType()){\n                    // this.updateModelDate(this.dateDetails.value);\n                    this.optionsHandler.onChange(this.model.getDateObject());\n\n                    return\n                }\n                this.viewManager.setViewType(CALENDAR_VIEW_TYPE.MONTH);\n                this.updateViewManager();\n                this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED });\n                // this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.SET_FOCUS_TO_THE_TITLE_ELEMENT });\n            this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'});\n\n\n            }\n        });\n    }\n\n    private updateModelDate(value: number) {\n       \n        this.model.setDay(value);\n\n        const month = this.model.getSelectedMonthIndex();\n        const year = this.model.getSelectedYearIndex();\n        \n        this.model.setMonth(month);\n        this.model.setYear(year);\n\n        this.model.setSelectedDay(value);\n\n\n    }\n\n    private updateModelMonth(value: number) {\n        // this.model.setMonth(value);\n        // const year = this.model.getSelectedYearIndex();\n        // this.model.setYear(year);\n        this.model.setSelectedMonth(value);\n    }\n\n    private updateModelYear(value: number) {\n        // this.model.setYear(value);\n        this.model.setSelectedYear(value);\n    }\n\n    private updateViewManager() {\n        this.viewManager.resetCounter();\n        this.viewManager.updateRenderingDetails();\n        this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.RERENDER });\n    }\n\n    private refreshConstraintState(): void {\n        const viewType = this.viewManager.getViewType();\n        let updatedDetails: DayDetails[];\n\n        if (viewType === CALENDAR_VIEW_TYPE.DAY) {\n            updatedDetails = this.model.getRenderDetailsforDay();\n        } else if (viewType === CALENDAR_VIEW_TYPE.MONTH) {\n            updatedDetails = this.model.getMonthNames();\n        } else {\n            updatedDetails = this.model.getRenderDetailsforYear();\n        }\n\n        const match = updatedDetails.find((details) =>\n            viewType === CALENDAR_VIEW_TYPE.DAY\n                ? isSameDate(details.dateObject as Date, this.dateDetails.dateObject as Date, 'day')\n                : details.value === this.dateDetails.value\n        );\n\n        if (!match) {\n            return;\n        }\n\n        this.dateDetails = match;\n        this.applyClassNames();\n    }\n\n    protected destroy(): void {\n        super.destroy();\n    }\n}\n","\nimport { PostConstruct } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { CalendarCellViewType } from './calendar-cell-view.types';\nimport { CalendarCellViewController } from './calendar-cell-controller';\n\n\nfunction CalendarWeekDayTemplate(props:any): HTMLElement {\n\n\tconst div = document.createElement('div');\n\tconst cell = document.createElement('div');\n\tcell.innerText = props.date;\n\tdiv.appendChild(cell);\n\treturn div.firstChild as HTMLElement;\n}\n\nexport class CalendarCellView extends Component {\n    \n\t@PostConstruct()\n\tinit(): void {\n\n\t\tconst component:CalendarCellViewType  = {\n\t\t\tgetElement             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n\t\t};\n\n\t\tconst controller = this.createManagedBean(new CalendarCellViewController());\n\n        const props = controller.getProperty()\n        const template = CalendarWeekDayTemplate(props)\n        this.setTemplate(template);\n\t\tcontroller.setComponent(component);\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprotected destroy(): void {\n\t\t\t// super.destroy();\n\t\t\tthis.getGui().remove()\n\n\t}\n\n}","import { composeClasses } from \"@dg/utils\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport {  CalendarCalendarViewType } from \"./calendar-container-view.types\";\nimport { getCalendarRootUtilityClass } from \"../root/calendar-root-classes\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { CalendarViewManagerTypes } from \"../model/calendar-view-manager.types\";\nimport { AutoWired } from \"@dg/corecomponent\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'calendar',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getCalendarRootUtilityClass)\n}\n\n\n\n\nexport class CalendarCalendarController extends AbstractController<CalendarCalendarViewType>{\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER) protected viewManager !:CalendarViewManagerTypes;\n\n    private parentComponent : Component | undefined\n   init(){\n    this.applyClassNames();\n    this.parentComponent = this.component?.getParentComponent();\n    this.setTabindex();\n    \n\n    }\n    private setTabindex(){\n\t\tconst element = this.component?.getElement() as HTMLElement;\n        element.setAttribute(\"tabindex\", \"0\");\n\t}\n    private applyClassNames(){\n        const classes = useUtilityClasses();\n        this.component?.addOrRemoveCssClass(classes.container);\n    }\n\n    getProperty(){\n        return {\n            dayView: !this.viewManager.isMonthView() && !this.viewManager.isYearView(),\n\n        }\n    }\n\n\n    rerender():void{\n        this.component?.rerender(this,this.parentComponent);\n        this.applyClassNames();\n\n    }\n    protected destroy(): void {\n        super.destroy();\n        \n    }\n\n}","\nimport { PostConstruct } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { CalendarCalendarViewType } from './calendar-container-view.types';\nimport { CalendarCalendarController } from './calendar-container-controller';\n\n\nfunction CalendarWithWeekDay(): HTMLElement {\n    const container = document.createElement('div');\n    const weekday = document.createElement('calendar-weekday');\n    const cells = document.createElement('calendar-cells');\n    container.appendChild(weekday);\n    container.appendChild(cells);\n    return container;\n}\n\nfunction CalendarWithoutWeekDayCalendarTemplate(): HTMLElement {\n    const container = document.createElement('div');\n    const cells = document.createElement('calendar-cells');\n    container.appendChild(cells);\n    return container;\n}\n\nexport class CalendarCalendarView extends Component {\n    \n\t@PostConstruct()\n\tinit(): void {\n\n\t\tconst component:CalendarCalendarViewType  = this.getComponent();\n\n\t\tconst controller = this.createManagedBean(new CalendarCalendarController());\n\n        this.renderTemplate(controller,component);\n      \n\t\tcontroller.setComponent(component);\n\t}\n\n\tprivate getComponent(): CalendarCalendarViewType{\n\t\treturn {\n\t\t\tgetElement             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n\t\t\tdestroy : ()=>this.destroy(),\n\t\t\trerender: (controller,comp) => this.rerender(controller,comp),\n\t\t\tgetParentComponent: () => this.getParentComponent(),\n\t\t}\n\n\n\t}\n\n\tprivate renderTemplate(controller: CalendarCalendarController, _component: CalendarCalendarViewType) {\n\t\tconst props = controller.getProperty()\n        const template = props.dayView ? CalendarWithWeekDay() :CalendarWithoutWeekDayCalendarTemplate()\n        this.setTemplate(template);\n    }\n\n    rerender(controller:CalendarCalendarController,comp:any) {\n\t\tthis.destroy();\n        const component = this.getComponent()\n        this.renderTemplate(controller,component);\n        comp.appendChild(this.getGui())\n\t\tcontroller.setComponent(component);\n    }\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\n\t}\n\n}","import { composeClasses } from \"@dg/utils\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport {  CalendarContainerViewType } from \"./calendar-day-container-view.types\";\nimport { getCalendarRootUtilityClass } from \"../root/calendar-root-classes\";\nimport { AutoWired, setAriaRole } from \"@dg/corecomponent\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { CALENDAR_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { CalendarViewManagerTypes } from \"../model/calendar-view-manager.types\";\n\n\n\nconst useUtilityClasses = (ownerState: any) => {\n    const { isMonthView, isYearView } = ownerState;\n    const slot = (isMonthView || isYearView) ? (isMonthView ? 'monthcontainer':'yearcontainer') : 'daycontainer'\n\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot,\n\t\t\tmodifiers : [\n                \n            ]\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getCalendarRootUtilityClass)\n}\n\n\n\n\nexport class CalendarDayContainerontroller extends AbstractController<CalendarContainerViewType>{\n\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER) protected viewManager !:CalendarViewManagerTypes;\n    private parentComponent !: any;\n    \n   init(){\n    this.applyClassNames();\n    this.setRole();\n    this.parentComponent = this.component?.getParentComponent();\n    this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.RERENDER, this.rerender.bind(this));\n    }\n    \n    private applyClassNames(){\n        const ownerState = this.ownerState();\n        const classes = useUtilityClasses(ownerState);\n        this.component?.addOrRemoveCssClass(classes.container);\n        // if(!ownerState.isMonthView && !ownerState.isYearView){\n        //          this.component?.getElement().classList.add('zeffects--zoomin');\n\n        // }\n    }\n\n    private ownerState(){\n        return {\n            isMonthView : this.viewManager.isMonthView(),\n            isYearView : this.viewManager.isYearView(),\n        }\n    }\n\n\n     getProperty(){\n        return{\n         weekCount : this.viewManager.getRowCount(),\n         dayCount :  this.viewManager.getColumnCount(),\n \n        }\n     }\n\n     private setRole(){\n        const element = this.component?.getElement() as HTMLElement;\n        setAriaRole(element,\"grid\")\n     }\n\n    private rerender():void{\n        this.viewManager.resetCounter();\n        this.viewManager.updateRenderingDetails();\n        this.component?.rerender(this,this.parentComponent);\n        this.applyClassNames();\n\n    }\n\n    protected destroy(): void {\n        super.destroy();\n        \n    }\n\n}","\nimport { PostConstruct } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { CalendarContainerViewType } from './calendar-day-container-view.types';\nimport { CalendarDayContainerontroller } from './calendar-day-container-controller';\nimport { composeClasses } from '@dg/utils';\nimport { getCalendarRootUtilityClass } from '../root/calendar-root-classes';\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'row',\n\t\t\tmodifiers : [\n            ]\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getCalendarRootUtilityClass)\n}\n\n\nfunction CalendarDayContainerTemplate(props:any,className:string): HTMLElement {\n\n\tconst div = document.createElement('div');\n\tconst cells = document.createElement('div');\n\n    for (let i = 0; i < props.weekCount; i++) {\n        const row = document.createElement('div');\n        row.className = className\n        row.setAttribute('role','row');\n\n        for (let j = 0; j < props.dayCount ; j++) {\n            const cell = document.createElement('calendar-cell');\n            row.appendChild(cell);    \n        }\n        cells.appendChild(row);\n    }\n\t\n\tdiv.appendChild(cells);\n\treturn div.firstChild as HTMLElement;\n}\n\n\n\nexport class CalendarDayContainerView extends Component {\n\n    \n    @PostConstruct()\n    init(): void {\n        const component: CalendarContainerViewType = this.getComponent();\n\n        const controller = this.createManagedBean(new CalendarDayContainerontroller());\n        this.renderTemplate(controller,component);\n        controller.setComponent(component);\n\n        \n    }\n\n    getComponent(): CalendarContainerViewType {\n        return {\n                getElement: () => this.getGui(),\n                addOrRemoveCssClass: (className: string) => this.addOrRemoveCSSClass(className),\n                rerender: (controller,comp) => this.rerender(controller,comp),\n                getParentComponent: () => this.getParentComponent(),\n                destroy : () => this.destroy()\n            }\n         \n    }\n\n    private addOrRemoveCSSClass(className: string): void {\n        const element = this.getGui()\n        element && (element.className = className);\n    }\n\n    private renderTemplate(controller: CalendarDayContainerontroller, _component: CalendarContainerViewType) {\n        const classes = useUtilityClasses();\n        const targetClass = classes.container.split(' ').find(cls => cls.includes('row')) as string;\n        const props = controller.getProperty();\n\n        const template = CalendarDayContainerTemplate(props, targetClass);\n\n        this.setTemplate(template);\n       \n\n    }\n\n    rerender(controller:CalendarDayContainerontroller,comp:any) {\n\t\tthis.destroy();\n        const component = this.getComponent()\n        this.renderTemplate(controller,component);\n        comp.appendChild(this.getGui())\n    }\n\n\tprotected destroy(): void {\n\t\t// super.destroy();\n        // this.parentComponent?.getFocusableElement().focus();\n\t\tthis.getGui().remove();\n\n\t}\n}\n","import { composeClasses } from \"@dg/utils\";\nimport { AutoWired } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { CalendarNavBarViewType } from \"./calendar-nav-bar-view.types\";\nimport { ICalendarDataManager } from \"../model/calendar-data-manager.types\";\nimport { CALENDAR_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { CALENDAR_VIEW_TYPE } from \"../model/calendar-view-manager\";\nimport { getCalendarRootUtilityClass } from \"../root/calendar-root-classes\";\nimport { CalendarViewManagerTypes } from \"../model/calendar-view-manager.types\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\n\nexport const Custom_Min_Year = 1;\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'navigation',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getCalendarRootUtilityClass)\n}\n\n\n\n// const useUtilityClassesForButton = () => {\n// \tconst slots = {\n// \t\tcontainer : {\n// \t\t\tslot : 'button',\n// \t\t\tmodifiers : [\n                \n//             ]\n// \t\t}\n// \t}\n\n// \treturn composeClasses(slots, getCalendarRootUtilityClass)\n// }\n\n\n\nexport class CalendarNavBarController extends AbstractController<CalendarNavBarViewType>{\n\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_MODEL) protected model !:ICalendarDataManager;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER) protected viewManager !:CalendarViewManagerTypes;\n\n    private parentComponent!: any;\n    \n   init(){\n        this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED, this.setMonth.bind(this));\n        this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.YEAR_UPDATED, this.setYear.bind(this));\n        this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE, this.checkToDisableNavIfLimitExceedsMax.bind(this));\n        this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.NAVBAR_RERENDER, this.rerender.bind(this));\n        this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.HIDEYEARBTN, this.hideYearBtns.bind(this));\n        this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.SHOWYEARBTN, this.showYearBtns.bind(this));\n        this.parentComponent = this.component?.getParentComponent();\n        this.setAriaAttributes()\n         this.applyClassNames();\n         this.registerEventListener();\n         this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.SET_FOCUS_TO_THE_TITLE_ELEMENT, this.setFocusToTheTitleElement.bind(this));\n        //  this.disableNavIfYearExceedsMax()\n         \n    }\n\n    private setFocusToTheTitleElement() {\n        this.component?.getTitleElement().focus();\n    }\n    \n    private applyClassNames(){\n        const classes = useUtilityClasses();\n        this.component?.addOrRemoveCssClass(classes.container);\n    }\n\n    getProperty(){\n       return{\n            month: this.model.getSelectedMonth(),\n            year : this.viewManager.getSelectedYearTitle(),\n            viewType : this.viewManager.getViewType(),\n       }\n    }\n\n    setAriaAttributes():void{\n        const monthElement = this.component?.getMonthElement();\n        const yearElement = this.component?.getYearElement();\n        if(monthElement){\n            monthElement && monthElement.setAttribute('aria-label',this.model.getSelectedMonth());\n            monthElement && monthElement.setAttribute('aria-live','polite');\n            monthElement && monthElement.setAttribute('aria-atomic','true');\n        }\n\n        if(yearElement){\n            yearElement && yearElement.setAttribute('aria-label',this.viewManager.getSelectedYearTitle());\n            yearElement && yearElement.setAttribute('aria-live','polite');\n            yearElement && yearElement.setAttribute('aria-atomic','true');\n    \n\n        } \n\n    }\n\n    getParamsProperty() {\n        return {\n\t\t\tpreviousMonthButton: {\n                getRole       : () => 'previousMonth',\n                callback         : () => this.goToPreviousMonth(),\n                icon : \"dg__svg--backward\",\n                disabled : this.model.isMonthInDangerZoneForPast()\n\n\t\t\t},\n\n\t\t\tnextMonthButton: {\n                getRole       : () => 'nextMonth',\n                callback         : () => this.goToNextMonth(),\n                icon : \"dg__svg--forward\",\n                disabled : this.model.isMonthInDangerZoneForFuture()\n\n\n\t\t\t},\n            previousYearButton: {\n                getRole       : () => 'previousYear',\n                callback         : () => this.goToPreviousYear(),\n                icon : \"dg__svg--fastbackward\",\n                disabled : this.model.isYearInDangerZoneForPast()\n\n\t\t\t},\n\n\t\t\tnextYearButton: {\n                getRole       : () => 'nextYear',\n                callback         : () => this.goToNextYear(),\n                icon : \"dg__svg--fastforward\",\n                disabled : this.model.isYearInDangerZoneForFuture()\n\n\n\t\t\t},\n\t\t};\n    }\n\n    goToPreviousMonth():void{\n        // Month/year views navigate by year or by year page, so they must be routed before\n        // the month guard — that guard reads viewDate, which page navigation never moves.\n        const viewType = this.viewManager.getViewType();\n        if(viewType === CALENDAR_VIEW_TYPE.MONTH){\n            return this.goToPreviousYear();\n        }else if(viewType === CALENDAR_VIEW_TYPE.YEAR){\n            return this.goToBackForwardYear();\n        }\n\n        const isBefore = this.model.isBeforeMonth();\n        if(isBefore){\n            return\n        }\n\n\n        this.model.goToPreviousMonth();\n        this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.RERENDER});\n\n        this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED});\n        this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'})\n        this.checkToDisableNavIfLimitExceedsMax()\n\n    }\n    goToNextMonth():void{\n        // Month/year views navigate by year or by year page, so they must be routed before\n        // the month guard — that guard reads viewDate, which page navigation never moves.\n        const viewType = this.viewManager.getViewType();\n        if(viewType === CALENDAR_VIEW_TYPE.MONTH){\n            return this.goToNextYear();\n        }else if(viewType === CALENDAR_VIEW_TYPE.YEAR){\n            return this.goToFastForwardYear();\n        }\n\n        const isAfter = this.model.isAfterMonth();\n        if(isAfter){\n            return\n        }\n\n       \n\n        this.model.goToNextMonth();\n        this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.RERENDER});\n        this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED});\n        // this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'});\n        this.checkToDisableNavIfLimitExceedsMax();\n\n\n    }\n\n    goToPreviousYear():void{\n        if(this.model.isYearInDangerZoneForPast()){\n            return\n        }\n        const viewType = this.viewManager.getViewType();\n\n        if(viewType === CALENDAR_VIEW_TYPE.YEAR){\n            return this.goToBackForwardYear();\n        }\n\n        this.model.goToPreviousYear();\n        this.refreshGridAfterYearChange(viewType);\n        this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED});\n       \n        this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'});\n        this.checkToDisableNavIfLimitExceedsMax()\n\n    }\n\n    goToNextYear():void{\n        if(this.model.isYearInDangerZoneForFuture()){\n            return\n        }\n        const viewType = this.viewManager.getViewType();\n\n        if(viewType === CALENDAR_VIEW_TYPE.YEAR){\n            return this.goToFastForwardYear();\n        }\n\n        this.model.goToNextYear();\n        this.refreshGridAfterYearChange(viewType);\n        this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED});\n        this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'});\n        this.checkToDisableNavIfLimitExceedsMax()\n\n\n    }\n\n    // Month cell labels are the same in every year, so the month grid only needs its cell\n    // state refreshed. Rebuilding it would replay the container's zoom-in CSS animation.\n    private refreshGridAfterYearChange(viewType : string):void{\n        if(viewType !== CALENDAR_VIEW_TYPE.MONTH){\n            this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.RERENDER});\n            return\n        }\n\n        this.viewManager.updateRenderingDetails();\n        this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE});\n    }\n\n    goToFastForwardYear():void{\n        if(this.model.isYearPageInDangerZoneForFuture()){\n            return\n        }\n        const renderingData = this.viewManager.getRendereringData();\n\t\tconst year = renderingData[renderingData.length - 1].value;\n\t\t// Moves the viewed year page only — setYear would overwrite the user's selected date.\n\t\tthis.model.setSelectedYear(year);\n\t\tthis.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED });\n\t\tthis.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.RERENDER });\n        this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'})\n\n    }\n\n    goToBackForwardYear(): void {\n        if(this.model.isYearPageInDangerZoneForPast()){\n            return\n        }\n        let year = this.viewManager.getRendereringData()[0].value;\n        if (year < Custom_Min_Year) {\n            year = Custom_Min_Year;\n        }\n        // Moves the viewed year page only — setYear would overwrite the user's selected date.\n        this.model.setSelectedYear(year);\n        this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED });\n        this.dispatchEvent({ type: CALENDAR_CUSTOM_EVENTS.RERENDER });\n        this.dispatchEvent({ type: 'FOCUS_INPUT_ELEMENT' });\n    }\n    \n\n\n\n    setMonth(){\n        if(this.optionsHandler.getPickerType() === \"month\" || this.optionsHandler.getPickerType() === \"year\"){\n            (this.component?.getYearElement() as HTMLElement).textContent = this.viewManager.getSelectedYearTitle();\n            this.setAriaAttributes();\n            this.checkToDisableNavIfLimitExceedsMax();\n            return\n        }\n        (this.component?.getMonthElement()as HTMLElement).textContent = this.model.getSelectedMonth();\n\t\t(this.component?.getYearElement()as HTMLElement).textContent = this.viewManager.getSelectedYearTitle();\n\t\tthis.setAriaAttributes();\n        this.checkToDisableNavIfLimitExceedsMax();\n    }\n\n    setYear() {\n\t\t(this.component?.getYearElement()as HTMLElement).textContent = this.viewManager.getSelectedYearTitle();\n        this.setAriaAttributes();\n        this.checkToDisableNavIfLimitExceedsMax();\n    }\n\n\n    registerEventListener(): void {\n        const element = this.component?.getTitleElement() as HTMLElement;\n\n        this.addListener(element, 'click',(event : PointerEvent)=>{\n            event.stopImmediatePropagation();\n\n            const viewType = this.viewManager.getViewType();\n             if(viewType === CALENDAR_VIEW_TYPE.DAY){\n                this.viewManager.setViewType(CALENDAR_VIEW_TYPE.MONTH);\n                this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.HIDEWEEKDAY});\n                this.component?.getTitleElement().focus()\n\n\n             }else if(viewType === CALENDAR_VIEW_TYPE.MONTH){\n                this.viewManager.setViewType(CALENDAR_VIEW_TYPE.YEAR);\n                this.component?.getTitleElement().focus()\n\n                // this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.HIDEWEEKDAY});\n\n             }\n             else if(viewType === CALENDAR_VIEW_TYPE.YEAR){\n                this.component?.getTitleElement().focus()\n\n                return\n             }\n\n            \n            this.viewManager.resetCounter();\n            this.viewManager.updateRenderingDetails();\n            // The new view navigates by a different step size, so re-evaluate the buttons.\n            this.checkToDisableNavIfLimitExceedsMax();\n            this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.HIDEYEARBTN});\n            this.dispatchEvent({type: CALENDAR_CUSTOM_EVENTS.RERENDER});\n            this.component?.getTitleElement().focus();\n            this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'});\n\n\n        })\n        \n    }\n\n    rerender():void{\n\n        this.component?.rerender(this,this.parentComponent);\n        this.applyClassNames();\n\n    }\n\n    hideYearBtns():void{\n        const { previousYearButton, nextYearButton } = this.component?.getMonthYearButtons() as { previousYearButton :any, nextYearButton: any};\n        const monthElement = this.component?.getMonthElement() as HTMLElement;\n\n        previousYearButton.eGui.style.display = 'none'\n        nextYearButton.eGui.style.display     = 'none';\n\n        monthElement.style.display       = 'none';\n    }\n\n    showYearBtns():void{\n        const { previousYearButton, nextYearButton } = this.component?.getMonthYearButtons() as { previousYearButton :any, nextYearButton: any};;\n        const monthElement = this.component?.getMonthElement() as HTMLElement;\n\n        previousYearButton.eGui.style.display = 'block';\n        nextYearButton.eGui.style.display     = 'block';\n        monthElement.style.display       = 'block';\n\n    }\n\n    protected destroy(): void {\n        super.destroy();\n    }\n\n    checkToDisableNavIfLimitExceedsMax(){\n        const isYearInDangerZoneForFuture = this.model.isYearInDangerZoneForFuture();\n        const isYearInDangerZoneForPast = this.model.isYearInDangerZoneForPast();\n\n        // In year view the month buttons page the whole year grid by a decade window,\n        // so they need the page-level bounds check instead of the single-month one.\n        const isInYearGridView = this.viewManager.getViewType() === CALENDAR_VIEW_TYPE.YEAR;\n        const shouldDisableNextMonthButton = isInYearGridView\n            ? this.model.isYearPageInDangerZoneForFuture()\n            : this.model.isMonthInDangerZoneForFuture();\n        const shouldDisablePreviousMonthButton = isInYearGridView\n            ? this.model.isYearPageInDangerZoneForPast()\n            : this.model.isMonthInDangerZoneForPast();\n\n        const { previousYearButton, nextYearButton, previousMonthButton, nextMonthButton  } = this.component?.getMonthYearButtons() as {previousYearButton:any,nextYearButton    : any, previousMonthButton : any, nextMonthButton:any};\n\n        // PROPERTY_UPDATE can fire during calendar init (e.g. syncMaxDateConstraint in\n        // createDatePicker) before button renderers are attached — skip until ready.\n        if (!nextYearButton?.renderer?.button?.api) {\n            return;\n        }\n\n        if(isYearInDangerZoneForFuture){\n            nextYearButton.renderer.button.api.updateProperties({disabled : true});\n        }else{\n            nextYearButton.renderer.button.api.updateProperties({disabled : false});\n        }\n\n        if(isYearInDangerZoneForPast){\n            previousYearButton.renderer.button.api.updateProperties({disabled : true});\n        }else{\n            previousYearButton.renderer.button.api.updateProperties({disabled : false});\n        }\n\n\n        if(shouldDisableNextMonthButton){\n            nextMonthButton.renderer.button.api.updateProperties({disabled : true});\n        }else{\n            nextMonthButton.renderer.button.api.updateProperties({disabled : false});\n        }\n\n\n\n        if(shouldDisablePreviousMonthButton){\n            previousMonthButton.renderer.button.api.updateProperties({disabled : true});\n        }else{\n            previousMonthButton.renderer.button.api.updateProperties({disabled : false});\n        }\n\n\n    \n\n    }\n\n\n\n\n\n\n}","\nimport { PostConstruct, queryAssignedNodes } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { CalendarNavBarViewType } from './calendar-nav-bar-view.types';\nimport { CalendarNavBarController } from './calendar-nav-bar-controller';\n\n\nfunction CalendarNavBarFullTemplate(props: any): HTMLElement {\n    const container = document.createElement(\"div\");\n\n    // Left section\n    const leftDiv = document.createElement(\"div\");\n    leftDiv.classList.add(\"dg-date-picker__navigation--left\");\n    const previousYearButton = document.createElement(\"calendar-previous-button\");\n    previousYearButton.setAttribute(\"ref\", \"previousYearButton\");\n    const previousMonthButton = document.createElement(\"calendar-previous-button\");\n    previousMonthButton.setAttribute(\"ref\", \"previousMonthButton\");\n    leftDiv.appendChild(previousYearButton);\n    leftDiv.appendChild(previousMonthButton);\n\n    // Title section\n    const titleDiv = document.createElement(\"div\");\n    titleDiv.classList.add(\"dg-date-picker__navigation--title\");\n    titleDiv.setAttribute(\"ref\", \"titleElement\");\n    titleDiv.setAttribute(\"tabindex\", \"0\");\n    const monthSpan = document.createElement(\"span\");\n    monthSpan.classList.add(\"dg-date-picker__navigation--monthnav\");\n    monthSpan.setAttribute(\"ref\", \"monthElement\");\n    monthSpan.textContent = props.month;\n    const yearSpan = document.createElement(\"span\");\n    yearSpan.classList.add(\"dg-date-picker__navigation--yearnav\");\n    yearSpan.setAttribute(\"ref\", \"yearElement\");\n    yearSpan.textContent = props.year;\n    titleDiv.appendChild(monthSpan);\n    titleDiv.appendChild(yearSpan);\n\n    // Right section\n    const rightDiv = document.createElement(\"div\");\n    rightDiv.classList.add(\"dg-date-picker__navigation--right\");\n    const nextMonthButton = document.createElement(\"calendar-previous-button\");\n    nextMonthButton.setAttribute(\"ref\", \"nextMonthButton\");\n    const nextYearButton = document.createElement(\"calendar-previous-button\");\n    nextYearButton.setAttribute(\"ref\", \"nextYearButton\");\n    rightDiv.appendChild(nextMonthButton);\n    rightDiv.appendChild(nextYearButton);\n\n    container.appendChild(leftDiv);\n    container.appendChild(titleDiv);\n    container.appendChild(rightDiv);\n\n    return container;\n}\n\nfunction CalendarNavBarYearTemplate(props: any): HTMLElement {\n    const container = document.createElement(\"div\");\n\n    // Left section\n    const leftDiv = document.createElement(\"div\");\n    leftDiv.classList.add(\"dg-calendar__navigation--left\");\n    const previousYearButton = document.createElement(\"calendar-previous-button\");\n    previousYearButton.setAttribute(\"ref\", \"previousYearButton\");\n    leftDiv.appendChild(previousYearButton);\n\n    // Title section\n    const titleDiv = document.createElement(\"div\");\n    titleDiv.classList.add(\"dg-calendar__navigation--title\");\n    titleDiv.setAttribute(\"ref\", \"titleElement\");\n    const yearSpan = document.createElement(\"span\");\n    yearSpan.classList.add(\"dg-calendar__navigation--yearnav\");\n    yearSpan.setAttribute(\"ref\", \"yearElement\");\n    yearSpan.textContent = props.year;\n    titleDiv.appendChild(yearSpan);\n\n    // Right section\n    const rightDiv = document.createElement(\"div\");\n    rightDiv.classList.add(\"dg-calendar__navigation--right\");\n    const nextYearButton = document.createElement(\"calendar-previous-button\");\n    nextYearButton.setAttribute(\"ref\", \"nextYearButton\");\n    rightDiv.appendChild(nextYearButton);\n\n    container.appendChild(leftDiv);\n    container.appendChild(titleDiv);\n    container.appendChild(rightDiv);\n\n    return container;\n}\n\n\nfunction CalendarNavBarRootTemplate(props:any){\n\tconst {viewType} = props;\n\tconst template = viewType === 'day' ? CalendarNavBarFullTemplate(props) :CalendarNavBarYearTemplate(props);\n\treturn template\n\n}\n\n// function dummTemplate(_props:any){\n// \tconst div = document.createElement('div');\n// \treturn div;\n\t\n// }\n\n\n\nexport class CalendarNavBarView extends Component {\n\t@queryAssignedNodes('monthElement') monthElement !: any;\n\t@queryAssignedNodes('yearElement') yearElement !  : any;\n\t@queryAssignedNodes('titleElement') titleElement !: any;\n\n\t@queryAssignedNodes('previousMonthButton') previousMonthButton!: any;\n\t@queryAssignedNodes('nextMonthButton') nextMonthButton!        : any;\n\t@queryAssignedNodes('previousYearButton') previousYearButton!  : any;\n\t@queryAssignedNodes('nextYearButton') nextYearButton!          : any;\n\n    private controller !:CalendarNavBarController\n\n    \n\t@PostConstruct()\n\tinit(): void {\n\n\t\tconst component:CalendarNavBarViewType  = this.getComponent()\n\n\t\t this.controller = this.createManagedBean(new CalendarNavBarController());\n        this.renderTemplate(this.controller,component);\n\t\tthis.controller.setComponent(component);\n\t}\n\n\tprivate getComponent(): CalendarNavBarViewType {\n\t\treturn {\n\t\t\tgetElement         : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n\t\t\tgetYearElement     : () => this.getYearElement(),\n\t\t\tgetMonthElement    : () => this.getMonthElement(),\n\t\t\trerender           : (controller,comp) => this.rerender(controller,comp),\n\t\t\tgetTitleElement    : ()=>this.getTitleElement(),\n\t\t\tgetParentComponent : () => this.getParentComponent(),\n\t\t\tgetMonthYearButtons: () => this.getMonthYearButtons(),\n\n\t\t}\n\n\t}\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprivate getMonthElement(){\n\t\treturn this.monthElement\n\t}\n\n\tprivate getYearElement(){\n\t\treturn this.yearElement\n\t}\n\n\tprivate getTitleElement(){\n\t\treturn this.titleElement;\n\n\t}\n\n\tprivate getMonthYearButtons():{previousYearButton:any,nextYearButton    : any, previousMonthButton : HTMLElement, nextMonthButton:HTMLElement} {\n\t\treturn{\n\t\t\tpreviousYearButton: this.previousYearButton,\n\t\t\tnextYearButton    : this.nextYearButton,\n            previousMonthButton: this.previousMonthButton,\n            nextMonthButton    : this.nextMonthButton,\n\t\t}\n\t}\n\n\n\tprivate renderTemplate(controller: CalendarNavBarController, _component: CalendarNavBarViewType) {\n        this.controller = controller;\n\t\tconst props =   this.controller.getProperty()\n        const paramsProperty =   this.controller.getParamsProperty()\n        const template = CalendarNavBarRootTemplate(props)\n      \n        this.setTemplate(template, {\n\t\t\tpreviousMonthButton: paramsProperty.previousMonthButton,\n\t\t\tnextMonthButton    : paramsProperty.nextMonthButton,\n\t\t\tpreviousYearButton : paramsProperty.previousYearButton,\n\t\t\tnextYearButton     : paramsProperty.nextYearButton,\n\t\t});\n    }\n\n\trerender(controller:CalendarNavBarController,comp:any) {\n        this.controller = controller;\n\t\tthis.destroy();\n        const component = this.getComponent()\n        this.renderTemplate(this.controller,component);\n\t\tthis.controller.setComponent(component);\n        comp.appendChild(this.getGui());\n    }\n\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\n\t}\n\n    // afterGuiAttached(_params: any): void {\n    //     this.controller.checkToDisableNavIfLimitExceedsMax();\n       \n    // }\n\n\t\n\n}","import { composeClasses } from \"@dg/utils\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport {  CalendarWeekDayViewType } from \"./calendar-weekday-view.types\";\nimport { getCalendarRootUtilityClass } from \"../root/calendar-root-classes\";\nimport { AutoWired, setAriaRole } from \"@dg/corecomponent\";\nimport { CALENDAR_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { CalendarViewManagerTypes } from \"../model/calendar-view-manager.types\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'weekdaycontainer',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getCalendarRootUtilityClass)\n}\n\n\n\n\nexport class CalendarWeekDayController extends AbstractController<CalendarWeekDayViewType>{\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER) protected viewManager !:CalendarViewManagerTypes;\n\n\n\n    \n   init(){\n    this.applyClassNames();\n    this.setRole();\n    this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.HIDEWEEKDAY, this.hideWeekDay.bind(this));\n    this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.SHOWWEEKDAY, this.showWeekDay.bind(this));\n\n\n\n    }\n    \n    private applyClassNames(){\n        const classes = useUtilityClasses();\n        this.component?.addOrRemoveCssClass(classes.container);\n    }\n\n    setRole(){\n        const element = this.component?.getElement() as HTMLElement;\n        setAriaRole(element,\"grid\")\n    }\n\n    getProperty(){\n       return{\n           weekday : this.viewManager.getWeekdayRendereringData()\n       }\n    }\n\n    hideWeekDay(){\n        (this.component?.getElement() as HTMLElement).style.display = \"none\";\n    }\n    showWeekDay(){\n        (this.component?.getElement()as HTMLElement).style.display = \"block\";\n    }\n\n    protected destroy(): void {\n        super.destroy();\n    }\n\n}","\nimport { PostConstruct } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { CalendarWeekDayViewType } from './calendar-weekday-view.types';\nimport { CalendarWeekDayController } from './calendar-weekday-controller';\nimport { composeClasses } from '@dg/utils';\nimport { getCalendarRootUtilityClass } from '../root/calendar-root-classes';\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'weekday--names',\n\t\t\tmodifiers : [\n                \n            ]\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getCalendarRootUtilityClass)\n}\n\n\nfunction CalendarWeekDayTemplate(props:any,className:string): HTMLElement {\n\n\tconst div = document.createElement('div');\n\tconst dummy = document.createElement('div');\n\n\tconst weekdays = document.createElement('div');\n\tweekdays.setAttribute('role', 'row');\n\tweekdays.className = 'dg-date-picker__weekday';\n\n\tfor (let i = 0; i < props.weekday.length; i++){\n\t\tconst weekday = document.createElement('div');\n\t\tweekday.setAttribute('role','columnheader')\n        weekday.innerText = props.weekday[i];\n\t\tweekday.className = className;\n        weekdays.appendChild(weekday);\n\n\t}\n\n\tdummy.appendChild(weekdays);\n\tdiv.appendChild(dummy);\n\treturn div.firstChild as HTMLElement;\n}\n\nexport class CalendarWeekDayView extends Component {\n    \n\t@PostConstruct()\n\tinit(): void {\n\n\t\tconst component:CalendarWeekDayViewType  = {\n\t\t\tgetElement             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n\t\t};\n\n\t\tconst controller = this.createManagedBean(new CalendarWeekDayController());\n\n        const classes = useUtilityClasses()\n        const props = controller.getProperty()\n\n        const template = CalendarWeekDayTemplate(props,classes.container)\n        this.setTemplate(template);\n\t\tcontroller.setComponent(component);\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprotected destroy(): void {\n        super.destroy();\n\t\tthis.getGui().remove();\n    }\n\n}","\n\nimport { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { CalendarAPITypes } from \"./calendar-api.types\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { CalendarControllerHandlerType } from \"./calendar-controller.types\";\nimport { ICalendarDataManager } from \"./calendar-data-manager.types\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport { CalendarViewManagerTypes } from \"./calendar-view-manager.types\";\nimport { CalendarOptionHandlerType } from \"./calendar-options-handler.types\";\nimport { ICalendarConfiguration } from \"../../calendar-configuration.types\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { CALENDAR_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { isSameDate } from \"./calendar-data-manager\";\n\n\n@Bean(CALENDAR_BEAN_NAME.CALENDAR_API)\nexport class CalendarApi extends EventEmitter implements CalendarAPITypes {\n\t@AutoWired(CALENDAR_BEAN_NAME.CALENDAR_CONTROLLER_HANDLER) controllerHandler !: CalendarControllerHandlerType;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_MODEL) protected model !: ICalendarDataManager;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER) protected viewManager !:CalendarViewManagerTypes;\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: CalendarOptionHandlerType;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_CONFIGURATION) configuration!: ICalendarConfiguration;\n\n\n\n\n\n    \n\n    getElement() : HTMLElement {\n        return this.controllerHandler.getCalendarCtrl().getElement() as HTMLElement;\n    }\n\n    getValue(){\n        return this.model.getDateObject();\n\n    }\n\n    focus(){\n        this.controllerHandler.getCalendarCtrl().focus();\n\n    }\n\n    destroy(){\n        this.controllerHandler.getCalendarCtrl().destroy();\n    }\n\n    blur(){\n        this.controllerHandler.getCalendarCtrl().blur();\n    }\n\n    setDate(date: Date | Dayjs |string): void {\n        this.viewManager.setDate(date);\n    }\n\n    setDay(day: number):void{\n        this.viewManager.setDay(day);\n    }\n\n    setMonth(month: number):void{\n        this.viewManager.setMonth(month); \n    }\n\n    setYear(year : number):void{\n        this.viewManager.setYear(year);\n    }\n\n    getId(): string {\n        return this.optionHandler.getId()!;\n    }\n\n    updateProperties(properties : ICalendarConfiguration){\n        if(!properties){\n            return\n        }\n\n        Object.entries(properties).forEach(([key, value]) => {\n                (this.configuration as any)[key] = value; \n        });\n\n        if(properties.value !== undefined){\n            const currentSelectedDate = this.model.getSelectedDate();\n            let shouldUpdateDate = false;\n            \n            if(properties.value === null){\n                if(currentSelectedDate){\n                    shouldUpdateDate = true;\n                    this.model.setDate(null);\n                    this.viewManager.updateRenderingDetails();\n                }\n            } else {\n\n                let newDate: Dayjs;\n                if(typeof properties.value === 'number'){\n                    newDate = dayjs(new Date(properties.value));\n                } else {\n                    newDate = dayjs(properties.value);\n                }\n                \n                if(!currentSelectedDate || !isSameDate(currentSelectedDate, newDate, 'day')){\n                    shouldUpdateDate = true;\n                    if(typeof properties.value === 'number'){\n                        this.viewManager.setDate(new Date(properties.value));\n                    } else {\n                        this.viewManager.setDate(properties.value);\n                    }\n                }\n            }\n            \n            if(shouldUpdateDate){\n                this.dispatchEvent({\n                    type : CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE \n                })\n\n                this.dispatchEvent({\n                    type : CALENDAR_CUSTOM_EVENTS.RERENDER\n                })\n            } else {\n                this.dispatchEvent({\n                    type : CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE \n                })\n            }\n        } else {\n            this.dispatchEvent({\n                type : CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE \n            })\n\n            if(!this.isConstraintOnlyUpdate(properties)){\n                this.dispatchEvent({\n                    type : CALENDAR_CUSTOM_EVENTS.RERENDER\n                })\n            }\n        }\n\n    }\n\n    private isConstraintOnlyUpdate(properties: ICalendarConfiguration): boolean {\n        const keys = Object.keys(properties);\n        if(keys.length === 0){\n            return false;\n        }\n        const constraintKeys: (keyof ICalendarConfiguration)[] = ['minDate', 'maxDate'];\n        return keys.every(key => constraintKeys.includes(key as keyof ICalendarConfiguration));\n    }\n\n}","import { Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { CalendarRootController } from \"../root/calendar-root-contoller\";\nimport { CalendarControllerHandlerType } from \"./calendar-controller.types\";\n\n\n@Bean(CALENDAR_BEAN_NAME.CALENDAR_CONTROLLER_HANDLER)\nexport class CalendarControllerHandler extends EventEmitter implements CalendarControllerHandlerType{\n\tprivate calendarCtrl!: CalendarRootController;\n\tregisterCalendarCtrl(calendarCtrl: CalendarRootController): void {\n\t\tthis.calendarCtrl = calendarCtrl;\n\t}\n\n\tgetCalendarCtrl(): CalendarRootController {\n\t\treturn this.calendarCtrl;\n\t}\n}","import dayjs, { Dayjs, UnitType } from \"dayjs\";\nimport { DayDetails, ICalendarDataManager } from \"./calendar-data-manager.types\";\n// import { ICalendarConfiguration } from \"../../calendar-configuration.types\";\nimport { Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { CALENDAR_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { Custom_Min_Year } from \"../calendar-nav-bar/calendar-nav-bar-controller\";\n\n\n\nconst YEARS_PER_PAGE = 12;\n\nconst DEFUALT_FORMAT_MAP = {\n    MMMM_D_YYYY_hh_mm_ss_A: 'MMMM D, YYYY hh:mm:ss A',\n    MMMM_D_YYYY           : 'MMMM D, YYYY'\n  }\n  export interface FormatType{\n             year       ?: string,\n             month      ?: string,\n             day        ?: string,\n             date       ?: string,\n             hour       ?: string,\n             minute     ?: string,\n             millisecond?: string,\n             second     ?: string,\n             \"/\"        ?: string,\n             \"-\"        ?: string,\n             \".\"        ?: string,\n             \",\"        ?: string,\n    meridian ?           : string\n}\nexport const formatMap = {\n    y  : 'year',\n    Y  : 'year',\n    D  : 'date',\n    M  : 'month',\n    d  : 'day',\n    H  : 'hour',\n    h  : 'hour',\n    m  : 'minute',\n    s  : 'second',\n    S  : 'millisecond',\n    A  : 'meridian',\n    \"/\": \"separator\",\n    \"-\": \"separator\",\n    \".\": \"separator\",\n    \",\": \"separator\",\n    \":\": \"separator\",\n    \" \": \"separator\",\n};\n@Bean(CALENDAR_BEAN_NAME.CALENDAR_MODEL)\nexport class CalendarDataManager extends EventEmitter implements ICalendarDataManager {\n    \n    private currentDate! : dayjs.Dayjs;\n    // private config!      : ICalendarConfiguration;\n    private monthFormat !: string;\n    private yearFormat !: string;\n    private weekDayFormat !: string;\n    private formatMap       : FormatType = {};\n    private minDate! : Dayjs | null;\n    private maxDate! : Dayjs | null;\n\n    private locale !: string;\n    private viewDate! : Dayjs;\n    private format !: string;\n    \n\n    private counter: number = 0;\n    private CurrentMonthDays !: DayDetails[];\n    private dateSelected : boolean = false\n    // private renderDetails\n\n    @PostConstruct()\n    init(): void {\n        // this.config = this.optionsHandler.getConfiguration();\n        // const format = this.config.format;\n        // const date = this.optionsHandler.getInitialDate();\n        // this.currentDate = this.viewDate = dayjs(date,format);\n        this.initDate();\n        this.viewDate = this.currentDate;\n        this.setMaxDate();\n        this.setMinDate()\n\n        this.monthFormat = this.optionsHandler.getMonthFormat();\n        this.yearFormat = this.optionsHandler.getYearFormat();\n        this.weekDayFormat = this.optionsHandler.getWeekDayFormat();\n        this.locale = this.optionsHandler.getLocale();\n        this.generateCurrentMonthDays(this.viewDate,this.currentDate);\n        this.initializeFormatArrays();\n\n        this.addListener(this.eventHandler,CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE,this.setMaxDate.bind(this));\n        this.addListener(this.eventHandler,CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE,this.setMinDate.bind(this));\n        this.addListener(this.eventHandler,CALENDAR_CUSTOM_EVENTS.VALUE_UPDATE,this.setDate.bind(this));\n        this.addListener(this.eventHandler,CALENDAR_CUSTOM_EVENTS.PROPERTY_UPDATE,this.updateCurrentMonthDays.bind(this));\n    }\n    initDate(){\n         this.format = this.optionsHandler.getFormat();\n\n        let date = this.optionsHandler.getInitialDate();\n        if(date){\n            this.dateSelected = true\n        }\n        // date ? date = date : date = dayjs().set('month',0).set('date',1);\n        if(date) {\n            date = date;\n        }else {\n            date = dayjs().startOf(\"day\");\n        }\n        if(date){\n           if(this.format){\n                if(typeof date === 'string'){\n                    this.currentDate  = dayjs(date,this.format);\n                }else{\n                    const timeStampDate = dayjs(date).format(this.format);\n                    this.currentDate= dayjs(timeStampDate,this.format);\n                }\n                // this.format = format;\n           }else{\n            const type = this.optionsHandler.getType();\n\n            if(type === 'datefield' || type === \"datepicker\"){\n                this.currentDate = dayjs(date,DEFUALT_FORMAT_MAP.MMMM_D_YYYY);\n                // this.format = DEFUALT_FORMAT_MAP.MMMM_D_YYYY;\n            }else{\n                this.currentDate = dayjs(date,DEFUALT_FORMAT_MAP.MMMM_D_YYYY_hh_mm_ss_A);\n                // this.format = DEFUALT_FORMAT_MAP.MMMM_D_YYYY_hh_mm_ss_A;\n            }\n           }\n        }\n\n       \n\n    }\n\n    private initializeFormatArrays(): void {\n        const formatArray = this.format\n          ? this.format.match(new RegExp('([y|d|M|H|h|m|s|S|a|])+|[/]+|[-]+|[.]+|[,]+|[:]+|[ ]', 'ig')) || []\n          : [];\n\n    \n        formatArray.forEach((pattern: string) => {\n          if (pattern === \"/\" || pattern === \"-\" || pattern === \".\" || pattern === \",\" || pattern === \":\" || pattern === \" \") {\n            return;\n          }\n    \n          const fieldNameKey = pattern[0] as keyof typeof formatMap; // Explicitly define the key type\n          const formatKey = formatMap[fieldNameKey]; // Retrieve key from formatMap\n          if (formatKey) {  // Ensure formatKey exists before pushing it to arrays\n            // this.formatArray.push(formatKey);\n            this.formatMap[formatKey as keyof FormatType] = pattern; // Correct type safety\n          }\n        });\n      }\n\n      setMinDate():void{\n        this.minDate = this.optionsHandler.getMinDate() ? dayjs(dayjs(this.optionsHandler.getMinDate()),this.format) : null;\n      }\n  \n      setMaxDate():void{\n        this.maxDate = this.optionsHandler.getMaxDate() ? dayjs(dayjs(this.optionsHandler.getMaxDate()),this.format) : null;\n      }\n\n      updateCurrentMonthDays():void{\n        this.generateCurrentMonthDays(this.viewDate,this.currentDate)\n      }\n\n    goToPreviousMonth(): void {\n        this.viewDate  = this.viewDate.subtract(1, 'month');\n        // this.currentDate  = this.currentDate.subtract(1, 'month');\n\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n    }\n\n    goToNextMonth(): void {\n        this.viewDate  = this.viewDate.add(1, 'month');\n        // this.currentDate  = this.currentDate.add(1, 'month');\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n\n    }\n\n    goToPreviousYear(): void {\n        this.viewDate = this.viewDate.subtract(1, 'year');\n        // this.currentDate = this.currentDate.subtract(1, 'year');\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n\n    }\n\n    goToNextYear(): void {\n        this.viewDate = this.viewDate.add(1, 'year');\n        // this.currentDate = this.currentDate.add(1, 'year');\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n\n    }\n\n    goToCurrent(): void {\n        this.currentDate = dayjs();\n        this.viewDate = dayjs();\n        this.generateCurrentMonthDays(this.viewDate,this.currentDate);\n\n    }\n\n    updateCurrentDate(date: Date): void {\n        this.currentDate = dayjs(date);\n        this.generateCurrentMonthDays(this.viewDate,this.currentDate);\n\n    }\n\n    getCurrentDate() {\n        return this.currentDate.toDate();\n    }\n\n    getNextDay(): Date {\n        const nextDay = this.currentDate.add(1, 'day');\n        return nextDay.toDate();\n    }\n\n    getCurrentDay() {\n        return this.currentDate.day();\n    }\n\n    getPreviousDay(): Date {\n        const previousDay = this.currentDate.subtract(1, 'day');\n        return previousDay.toDate();\n    }\n\n    getNextMonth(): Date {\n        const nextMonth = this.currentDate.add(1, 'month');\n        return nextMonth.toDate();\n    }\n\n    getCurrentMonth() {\n        return this.currentDate.month();\n    }\n\n    getNextYear(): Date {\n        const nextYear = this.currentDate.add(1, 'year');\n        return nextYear.toDate();\n    }\n\n    getPreviousYear(): Date {\n        const previousYear = this.currentDate.subtract(1, 'year');\n        return previousYear.toDate();\n    }\n\n    getCurrentYear() {\n        return this.currentDate.year();\n    }\n\n    getPreviousMonth(): Date {\n        const previousMonth = this.currentDate.subtract(1, 'month');\n        return previousMonth.toDate();\n    }\n\n    getTotalDays() {\n        return this.currentDate.daysInMonth();\n    }\n\n    getNextWeek(): { start: Date, end: Date } {\n        const nextWeekStart = this.currentDate.add(1, 'week').startOf('week');\n        const nextWeekEnd = this.currentDate.add(1, 'week').endOf('week');\n        return {\n            start: nextWeekStart.toDate(),\n            end: nextWeekEnd.toDate()\n        };\n    }\n\n    getPreviousWeek(): { start: Date, end: Date } {\n        const previousWeekStart = this.currentDate.subtract(1, 'week').startOf('week');\n        const previousWeekEnd = this.currentDate.subtract(1, 'week').endOf('week');\n        return {\n            start: previousWeekStart.toDate(),\n            end: previousWeekEnd.toDate()\n        };\n    }\n\n    getCurrentWeek(): { start: Date, end: Date } {\n        const currentWeekStart = this.currentDate.startOf('week');\n        const currentWeekEnd = this.currentDate.endOf('week');\n        return {\n            start: currentWeekStart.toDate(),\n            end: currentWeekEnd.toDate()\n        };\n    }\n\n    getDaysInMonth(): number {\n        return this.currentDate.daysInMonth();\n    }\n\n    setSelectedDay(day : number):void{\n        this.viewDate = this.viewDate.date(day);\n        this.currentDate = this.currentDate.date(day);\n        this.dateSelected = true\n\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n    }\n\n    setSelectedMonth(month : number):void{\n        this.viewDate = this.viewDate.month(month);\n\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n\n\n    }\n\n    setSelectedYear(year : number):void{\n        this.viewDate = this.viewDate.year(year);\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n\n    }\n    \n    isDateSelected():boolean{\n        return this.dateSelected\n    }\n\n    setDateSelected(force:boolean):void{\n        this.dateSelected = force;\n    }\n\n\n    getDate(): number {\n        this.counter = this.counter + 1;\n        return this.counter;\n    }\n\n    getMinDate():Dayjs{\n        return this.minDate!;\n    }\n\n    \n\n    // generateCurrentMonthDays(): void {\n    //     const startOfMonth = this.currentDate.startOf('month');\n    //     const endOfMonth = this.currentDate.endOf('month');\n\n    //     const days: DayDetails[] = [];\n\n    //     // Add days from the previous month to fill the first week\n    //     const startOfCalendar = startOfMonth.startOf('week');\n    //     let date = startOfCalendar;\n    //     while (date.isBefore(startOfMonth)) {\n    //         const showAdjacentDates = this.optionsHandler.getShowAdjacentDates();\n    //         const adjacentDate = showAdjacentDates ? date.date() : \"\"\n    //         days.push({ \n    //             date          : adjacentDate,\n    //             isCurrentMonth: false,\n    //             dateObject    : date.toDate(),\n    //             isToday       : isToday(date),\n    //             isSelected  : iSameDay(date,this.viewDate),\n    //             isWeekEnd     : isWeekend(date),                   value: date.date(),\n    //             ariaLabel     : date.format(\"MMMM DD, YYYY\")\n    //             });\n    //         date = date.add(1, 'day');\n    //     }\n\n    //     // Add all days of the current month\n    //     date = startOfMonth;\n    //     while (date.isBefore(endOfMonth) || date.isSame(endOfMonth, 'day')) {\n    //         days.push({ \n    //             date          : date.date(),\n    //             isCurrentMonth: true,\n    //             dateObject    : date.toDate(),\n    //             isToday       : isToday(date),\n    //             isSelected  : iSameDay(date,this.viewDate),\n    //             isWeekEnd     : isWeekend(date),\n    //             value         : date.date(),\n    //             ariaLabel     : date.format(\"MMMM DD, YYYY\")\n    //         });\n    //         date = date.add(1, 'day');\n    //     }\n\n    //     // Add days from the next month to fill the last week\n    //     while (date.isBefore(endOfMonth.endOf('week')) || date.isSame(endOfMonth.endOf('week'), 'day')) {\n    //         const showAdjacentDates = this.optionsHandler.getShowAdjacentDates();\n    //         const adjacentDate = showAdjacentDates ? date.date() : \"\"\n    //         days.push({ \n    //             date          : adjacentDate,\n    //             isCurrentMonth: false,\n    //             dateObject    : date.toDate(),\n    //             isToday       : isToday(date),\n    //             isSelected  : iSameDay(date,this.viewDate),\n    //             isWeekEnd     : isWeekend(date),                   value: date.date(),\n    //             ariaLabel     : date.format(\"MMMM DD, YYYY\")\n    //         });\n    //         date = date.add(1, 'day');\n    //     }\n\n\n    //     this.CurrentMonthDays = days;\n\n    //     this.counter = 0; // Reset counter\n    // }\n\n    generateCurrentMonthDays(dateObject : any,compareDateObject : any): void {\n        \n        const startOfMonth    = dateObject.startOf('month');\n        const endOfMonth      = dateObject.endOf('month');\n        const startOfCalendar = startOfMonth.startOf('week');\n        const endOfCalendar   = endOfMonth.endOf('week');\n    \n        const getAdjacentDate = (date: Dayjs): string | number => \n            this.optionsHandler.getShowAdjacentDates() ? date.date() : \"\";\n    \n        const days: DayDetails[] = [];\n        let date = startOfCalendar;\n    \n        while (date.isBefore(endOfCalendar) || date.isSame(endOfCalendar, 'day')) {\n            const isCurrentMonth = date.isSame(startOfMonth, 'month');\n            // Preserve the current time of viewDate in each date instance\n            const dateWithTime = date.hour(dateObject.hour()).minute(dateObject.minute()).second(dateObject.second());\n\n            const isSelected = this.dateSelected && iSameDay(date, compareDateObject);\n            const isBefore = this.minDate && date.isBefore(this.minDate,'date');\n            const isAfter = this.maxDate && date.isAfter(this.maxDate)\n            const isDisabled = isBefore|| isAfter;\n\n            days.push({\n                date          : isCurrentMonth ? date.date() : getAdjacentDate(date),\n                isCurrentMonth: isCurrentMonth,\n                dateObject    : dateWithTime.toDate(),\n                isToday       : isToday(date),\n                isSelected   ,\n                isWeekEnd     : isWeekend(date),\n                value         : date.date(),\n                ariaLabel     : date.format(\"MMMM DD, YYYY\"),\n                isDisabled\n            });\n            date = date.add(1, 'day');\n        }\n    \n        this.CurrentMonthDays = days;\n        this.counter = 0; // Reset counter\n    }\n\n    getTimeBarRenderingDetails(): any {\n        return {\n            hour     : this.getCurrentHour(),\n            minute   : this.getCurrentMinute(),\n            second   : this.getCurrentSecond(),\n            meridian : this.getCurrentMeridian(),       // 'A' returns 'AM' or 'PM'\n            hourCycle: this.optionsHandler.getHourCycle()\n        };\n    }\n    \n    \n\n\n    getRenderingDetails(): DayDetails {\n        if(this.counter > this.CurrentMonthDays.length){\n            this.counter = 0; \n        }\n        return this.CurrentMonthDays[this.counter];\n    }\n\n    getMaxRenderingDaysCount():number{\n        return this.CurrentMonthDays.length;\n    }\n\n    updateCounter(): void {\n        this.counter = this.counter + 1;\n\n    }\n\n    // New methods\n    setDay(day: number): void {\n        this.currentDate = this.currentDate.date(day);\n        this.viewDate = this.viewDate.date(day);\n        this.dateSelected = true\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n    }\n\n    setMonth(month: number): void {\n        this.currentDate = this.currentDate.month(month);\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n\n    }\n\n    setYear(year: number): void {\n        this.currentDate = this.currentDate.year(year);\n        this.generateCurrentMonthDays(this.viewDate ,this.currentDate);\n\n    }\n\n    setDate(date : string | Date | Dayjs | null):void{\n        \n        if(date === null){\n            this.dateSelected = false;\n            date = this.viewDate;\n        }\n        this.currentDate = dayjs(date);\n    }\n\n    setHours(hour: number): void {\n        const meridian = this.currentDate.format('A');\n\n        this.currentDate = this.currentDate.set('h', hour);\n\n        const convertedMeridian = this.currentDate.format('A');\n\n        if(convertedMeridian != meridian){\n            this.setMeridian(meridian);\n        }\n\n    }\n\n    setMinutes(minute: number): void {\n        this.currentDate = this.currentDate.minute(minute);\n    }\n\n\n    setMeridian(meridian: string): void {\n        const currentMeridian = this.getCurrentMeridian();\n       if(currentMeridian === meridian){ return; }\n\n        if(meridian === 'AM' || meridian === 'PM'){\n            let date             = this.currentDate.format(this.format);\n                date             = toggleMeridian(date);\n                this.currentDate = dayjs(date,this.format);\n        }\n        // if(meridian){\n        //     let date             = this.currentDate.format(this.format)\n\n        //         // date             = toggleMeridian(date);\n        //         this.currentDate = dayjs(date,this.format);\n\n        // }\n\n        // this.currentDate = this.currentDate.hour(meridian === 'AM' || meridian === 'PM'? this.currentDate.add(12, \"hour\") : (this.currentDate.hour() % 12) + 12);\n        \n    }\n\n    setCounterValue(_value:number):void{\n\n    }\n\n    getHours(): number {\n        return this.currentDate.hour();\n    }\n    getMinutes(): number {\n\n        return this.currentDate.minute();\n\n    }\n    getMeridian(): string {\n        return this.currentDate.format('A');\n    }\n    getSeconds(): number {\n        return this.currentDate.second();\n    }\n\n\n\n    getMonth():string{\n        return this.currentDate.format(this.monthFormat)\n    }\n\n\n    getMonthIndex():number{\n        return this.currentDate.month();\n    }\n    getYear():string{\n        return this.currentDate.format(this.yearFormat)\n    }\n    getYearOnly():string{\n        return this.currentDate.format(\"YYYY\");\n    }\n\n    getYearIndex():number{\n        return this.currentDate.year();\n    }\n\n    getDateObject():Date{\n        // return this.currentDate.format(this.format);\n        return this.currentDate.toDate();\n    }\n\n    getDateInDayjs():Dayjs{\n        return this.currentDate;\n    }\n\n    getMonthNames(): DayDetails[]{\n        const monthNames: DayDetails[]  = [];\n\n        for (let i = 0; i < 12; i++) {\n            \n          const monthName       = dayjs().month(i).format(this.monthFormat);  // Format month name;\n\n          const viewedYear = this.getSelectedYearIndex();\n          const monthdateObject = this.viewDate.set(\"year\", viewedYear).set(\"month\",i);\n          // Compare at month granularity so the boundary month stays selectable — it still contains valid days.\n          const isBefore = this.minDate && monthdateObject.isBefore(this.minDate,'month');\n          const isAfter = this.maxDate && monthdateObject.isAfter(this.maxDate,'month')\n          const isDisabled = isBefore|| isAfter as boolean;\n\n          // The selected month belongs to the selected year, so it only highlights while\n          // that year is the one being viewed.\n          const isSelected = this.dateSelected\n              && this.currentDate.year() === viewedYear\n              && i === this.currentDate.month();\n\n          const isToday = dayjs().year() === this.viewDate.year() ? dayjs().month() === i ? true : false : false;\n\n          \n         \n\n          monthNames.push({\n              date: monthName,\n              isSelected,\n              isToday,\n              value:i,\n              isCurrentMonth: true,\n              ariaLabel : monthName,\n              dateObject :monthdateObject.toDate(),\n              isDisabled\n          });\n        }\n        return monthNames;\n        \n    }\n\n    getNumberOfWeeksInMonth(): number {\n        const startOfMonth = this.viewDate.startOf('month');\n        const endOfMonth = this.viewDate.endOf('month');\n    \n        const startOfCalendar = startOfMonth.startOf('week');\n        const endOfCalendar = endOfMonth.endOf('week');\n    \n        const totalDays = endOfCalendar.diff(startOfCalendar, 'day') + 1;\n        const weeks = Math.ceil(totalDays / 7);\n    \n        return weeks;\n    }\n\n    getNumberOfDaysInWeek():number{\n        return 7; // need to be changed dynamically for working days and particular dated generation;\n    }\n\n    getRenderDetailsforDay(): DayDetails[]{\n        return this.CurrentMonthDays;\n    }\n\n    getRenderDetailsforYear(): DayDetails[] {\n        // The page follows viewDate so paging never touches currentDate, which holds the selection.\n        const startYear     = this.getYearPageStart(this.viewDate.year());\n        const years: DayDetails[] = [];\n      \n        for (let i = 0; i < YEARS_PER_PAGE; i++) {\n            const year = startYear + i;\n            const isCurrentMonth = true;\n            const isSelected = this.dateSelected && this.currentDate.year() === year;\n            const isToday = dayjs().year() === year ? true : false;\n\n            const monthdateObject = this.viewDate.set(\"year\",year);\n\n            // Compare at year granularity so the boundary year stays selectable — it still contains valid months.\n            const isBefore = this.minDate && monthdateObject.isBefore(this.minDate,'year');\n            const isAfter = this.maxDate && monthdateObject.isAfter(this.maxDate,'year')\n            const isDisabled = isBefore|| isAfter as boolean;\n\n            years.push({\n                date: year.toString(),\n                isSelected,\n                isCurrentMonth,\n                isToday,\n                value: year,\n                ariaLabel : year.toString(),\n                dateObject : dayjs().set(\"year\",year).toDate(),\n                isDisabled\n\n            });\n        }\n\n        return years;\n    }\n\n    \n\n    setSelectedDate(date:Date | Dayjs |string)  : void{\n        this.dateSelected = true;\n        this.currentDate = dayjs(date);\n        this.viewDate = dayjs(date);\n        this.generateCurrentMonthDays(this.viewDate,this.currentDate);\n\n    }\n\n    getWeekNames(): string[] {\n        const weekNames: string[] = [];\n        const startOfWeek = dayjs().startOf('week');\n    \n        for (let i = 0; i < 7; i++) {\n            weekNames.push(startOfWeek.add(i, 'day').locale(this.locale).format(this.weekDayFormat));\n        }\n    \n        return weekNames;\n    };\n\n    getSelectedDay()  : number{\n        return this.currentDate.date();\n\n    }\n    getSelectedMonth(): string{\n        return this.viewDate.format(this.monthFormat);\n    }\n    getSelectedYear() : string{\n        return this.viewDate.format(this.yearFormat)\n    }\n    getSelectedDate() : Dayjs | null{\n        return this.dateSelected ? this.currentDate : null;\n\n    }\n\n    getSelectedMonthIndex()                           : number{\n        return this.viewDate.month();\n    }\n    getSelectedYearIndex()                           : number{\n        return this.viewDate.year();\n    }\n\n    getCurrentHour(): string {\n        if (this.formatMap[\"meridian\"]) {\n            return this.currentDate.format('h');\n        }\n        return this.currentDate.format(this.formatMap[\"hour\"]);\n    }\n    getCurrentMinute(): string {\n        return this.currentDate.format(this.formatMap[\"minute\"]);\n    }\n    getCurrentMeridian():string{\n        return  this.formatMap[\"meridian\"] ? this.currentDate.format(this.formatMap[\"meridian\"]) : '';\n    }\n\n    getCurrentSecond(): string {\n        return this.currentDate.format(this.formatMap[\"second\"]);\n    }\n    \n    isAfterMonth(): boolean{\n        if(this.maxDate && isSameMonthInSameYear(this.maxDate,this.viewDate)){\n            return true\n        }\n        return this.maxDate ? this.viewDate.isAfter(this.maxDate) : false;\n    }\n\n    isBeforeMonth(): boolean{\n        if(this.minDate && isSameMonthInSameYear(this.minDate,this.viewDate)){\n            return true\n        }\n        return this.minDate ? this.viewDate.isBefore(this.minDate) : false;\n\n    }\n\n    isBeforeYear(): boolean{\n        if(this.minDate && this.minDate.isSame(this.viewDate,'year')){\n            return true\n        }\n        return this.minDate ? this.viewDate.isBefore(this.minDate) : false;\n\n    }\n    isAfterYear(): boolean{\n        if(this.maxDate && this.maxDate.isSame(this.viewDate,'year')){\n            return true\n        }\n        return this.maxDate ? this.viewDate.isAfter(this.maxDate) : false;\n\n    }\n\n    isYearInDangerZoneForFuture():boolean{\n        // Year arrows keep the current month; disable when that month in the next year\n        // is entirely after maxDate (no selectable day in the destination month).\n        const destinationMonth = this.viewDate.set(\"year\", this.viewDate.year() + 1);\n        const maxDate = this.getEffectiveMaxDate();\n        if(maxDate && destinationMonth.isAfter(maxDate, 'month')){\n            return true\n        }\n        return false\n        \n    }\n\n    isYearInDangerZoneForPast():boolean{\n        // Year arrows keep the current month; disable when that month in the previous year\n        // is entirely before minDate (e.g. July 2025 with minDate 8 Aug 2025).\n        const destinationMonth = this.viewDate.set(\"year\", this.viewDate.year() - 1);\n        const minDate = this.getEffectiveMinDate();\n        if(minDate && destinationMonth.isBefore(minDate, 'month')){\n            return true\n        }\n\n        return false\n\n    }\n\n    // The year grid page is anchored to the decade containing the given year, so paging\n    // does not move by a fixed number of years. Nav checks must re-derive the page the\n    // same way the grid does.\n    private getYearPageStart(year: number): number {\n        const startOfDecade = Math.floor(year / 10) * 10 - Custom_Min_Year; // Start the decade from the previous year\n        // The page stays anchored to the decade so out-of-range years render disabled\n        // instead of disappearing, matching how day and month cells behave.\n        return Math.max(startOfDecade, Custom_Min_Year); // Avoid negative years\n    }\n\n    isYearPageInDangerZoneForFuture(): boolean {\n        if (!this.maxDate) {\n            return false;\n        }\n        // Paging forward lands on the last year of the current page, which then re-anchors\n        // to that year's decade. Disable when no year on the resulting page is selectable.\n        const lastYearOfCurrentPage = this.getYearPageStart(this.viewDate.year()) + YEARS_PER_PAGE - 1;\n        return this.getYearPageStart(lastYearOfCurrentPage) > this.maxDate.year();\n    }\n\n    isYearPageInDangerZoneForPast(): boolean {\n        if (!this.minDate) {\n            return false;\n        }\n        // Paging back lands on the first year of the current page, which then re-anchors\n        // to that year's decade. Disable when no year on the resulting page is selectable.\n        const firstYearOfCurrentPage = this.getYearPageStart(this.viewDate.year());\n        const lastYearOfPreviousPage = this.getYearPageStart(firstYearOfCurrentPage) + YEARS_PER_PAGE - 1;\n        return lastYearOfPreviousPage < this.minDate.year();\n    }\n\n    private getEffectiveMinDate(): Dayjs | null {\n        return this.optionsHandler.getMinDate()\n            ? dayjs(dayjs(this.optionsHandler.getMinDate()), this.format)\n            : null;\n    }\n\n    private getEffectiveMaxDate(): Dayjs | null {\n        return this.optionsHandler.getMaxDate()\n            ? dayjs(dayjs(this.optionsHandler.getMaxDate()), this.format)\n            : null;\n    }\n\n    isMonthInDangerZoneForFuture():boolean{\n        const precausionMonthForFuture = this.viewDate.set(\"month\",this.viewDate.month() +1);\n        if(this.maxDate){\n            if(this.maxDate.isSame(precausionMonthForFuture,'month')){\n                return false\n            }else if(precausionMonthForFuture.isAfter(this.maxDate)){\n                return true\n            }\n        }\n        return false\n    }\n\n    isMonthInDangerZoneForPast():boolean{\n        const precausionMonthForPast = this.viewDate.set(\"month\",this.viewDate.month() -1);\n        if(this.minDate){\n            if(this.minDate.isSame(precausionMonthForPast,'month')){\n                return false\n            }if(precausionMonthForPast.isBefore(this.minDate)){\n                return true\n            }\n        }\n        return false\n    }\n\n    isBeforeTIme(hour:number,type:string):boolean{\n        const tempDate = this.currentDate.set(type as UnitType,hour);\n        if(this.minDate){\n            if(tempDate.isBefore(this.minDate)){\n                return true\n            }\n        }\n        return false\n\n    }\n}\n\n\n\n// Function to check if a given date is today\nfunction isToday(date:Dayjs) :boolean{\n    return dayjs(date).isSame(dayjs(), 'day');\n}\n\nexport function isSameMonthInSameYear(date1:Dayjs,date2:Dayjs):boolean{\n\n    const month1 = date1.month();\n    const month2= date2.month();\n\n    const year1 =  date1.year();\n    const year2 = date2.year();\n\n    if( (month1 === month2) && (year1 === year2)){\n        return true;\n    }\n    return false;\n\n}\n\nexport function isSameDate(date1: Dayjs | Date | string, date2: Dayjs | Date | string, unit: UnitType = 'day'): boolean {\n    return dayjs(date1).isSame(dayjs(date2), unit);\n}\n\nfunction iSameDay(date1:Dayjs,date2:Dayjs){\n    return dayjs(date1).isSame(date2, 'day');\n}\n\nfunction isWeekend(date: Dayjs): boolean {\n    const day = date.day();\n    return day === 0 || day === 6; // 0 for Sunday, 6 for Saturday\n}\n\n// function isSameMonth(date1: Dayjs, date2: Dayjs): boolean {\n//     return date1.isSame(date2, 'month') && date1.isSame(date2, 'year');\n// }\n\nfunction toggleMeridian(dateStr : string) {\n    return dateStr.replace(/\\bAM\\b/, \"XX\").replace(/\\bPM\\b/, \"AM\").replace(/\\bXX\\b/, \"PM\");\n}\n","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\n\nimport { CalendarOptionHandlerType } from \"./calendar-options-handler.types\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateType, ICalendarConfiguration } from \"../../calendar-configuration.types\";\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class CalendarOptionHandler extends EventEmitter implements CalendarOptionHandlerType{\n\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_CONFIGURATION) configuration!: ICalendarConfiguration;\n\n    getInstanceID(): string | undefined {\n        return this.configuration.instanceID;\n    }\n\n    getInitialDate(): DateType{\n        return this.configuration.value;\n\n    }\n\n    getFormat():string{\n        return this.configuration.format as string;\n    }\n\n    isDisabled()   : boolean{\n        return this.configuration.disabled?? false;\n    }\n    isReadOnly()   : boolean{\n        return this.configuration.readOnly?? false;\n    }\n\n    getConfiguration() :ICalendarConfiguration{\n        return this.configuration;\n    }\n\n    getMonthFormat():string{\n        return this.configuration.monthFormat?? \"MMMM\";\n    }\n\n    getYearFormat():string{\n        return this.configuration.yearFomat ?? \"YYYY\";\n    }\n\n    getViewType():string{\n        return this.configuration.viewType?? \"day\";\n    }\n\n    onClick(event : MouseEvent):void{\n        if(typeof this.configuration.onClick == \"function\"){\n                this.configuration.onClick(event);\n        }\n    }\n    onChange(date:Date):void{\n        if(typeof this.configuration.onChange == \"function\"){\n                this.configuration.onChange(date);\n        }\n    }\n\n    getAppendTo():HTMLElement {\n        return this.configuration.appendTo?? document.body;\n    }\n\n    getShowAdjacentDates():boolean {\n        return this.configuration.showAdjacentDates?? true;\n    }\n\n    getWeekDayFormat():string {\n        return this.configuration.weekDayFormat?? \"ddd\";\n    }\n\n    getLocale(): string {\n        return this.configuration.locale?? \"en\";\n    }\n\n    getAriaLabelledBy():string {\n        return this.configuration.ariaLabelledby?? \"\";\n\n    }\n    getClassName():string {\n        return this.configuration.className?? \"\";\n    }\n    \n    getPickerType():string {\n        return this.configuration.pickerType?? \"date\";\n    }\n\n    getType():string{\n        return this.configuration.type?? \"datepicker\";\n    }\n\n    shouldShowTimePicker():boolean {\n        return this.configuration.showTimePicker ?? false;\n    }\n\n    getHourCycle():12 | 24 {\n        return this.configuration.hourCycle ?? 12;\n    }\n\n    getMinuteInterval(): number {\n        return this.configuration.minuteInterval ?? 1;\n    }\n\n    getInputElement():HTMLElement | undefined{\n        return this.configuration.inputElement;\n    }\n\n    getMinDate(): DateType {\n        return this.configuration.minDate;\n    }\n\n    getMaxDate(): DateType {\n        return this.configuration.maxDate;\n    }\n\n     onDestroy():void{\n        if(typeof this.configuration.onDestroy === \"function\"){\n            this.configuration.onDestroy();\n        }\n     }\n\n     getId():string | undefined{\n        return this.configuration.id ;\n     }\n\n     shouldCloseOnSelect():boolean{\n        return this.configuration.closeOnSelect ?? true;\n     }\n\n     shouldDeselect():boolean{\n        return this.configuration.shouldDeselect ??  false;\n     }\n\n     onDeselect(value:Date):void{\n         if(this.configuration.onDeselect){\n            this.configuration.onDeselect(value)\n         }\n     }\n}\n\n\n","\nimport { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName, } from '@dg/corecomponent';\nimport {ComponentMetadata} from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport {UserComponentHandler} from '@dg/corecomponent/UserComponentHandler.js';\nimport {UserComponentRegistry} from '@dg/corecomponent/UserComponentRegistry.js';\nimport { IComponentDetails } from '../../../../utility/component-detail.types';\nimport { CalendarComponentHandlerTypes } from './calendar-user-component-handler.types';\n\nexport const enum PropertyName {\n\tBUTTON_RENDERER      = 'buttonRenderer'\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class CalendarComponentHandler extends UserComponentHandler implements CalendarComponentHandlerTypes {\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\n\tgetButtonRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.BUTTON_RENDERER, params, PropertyName.BUTTON_RENDERER);\n\t}\n\t\n\tprotected getComponentDetails( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const lookUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlookUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlookUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.BUTTON_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(_item : any, propertyName : PropertyName, _params : any) : any {\n        switch(propertyName) {\n            default:\n                return {};\n        }\n\n    }\n\n    // private getUserRendererParams(item : any, params : any) : any {\n    //     const rendererParams = item.getUserRendererParams();\n\n    //     let rendererParamsResult : any = {};\n\n    //     if (typeof rendererParams == 'function') {\n\t// \t\trendererParamsResult = rendererParams(params);\n\t// \t} else if (typeof rendererParams == 'object') {\n\t// \t\trendererParamsResult = rendererParams;\n\t// \t}\n\n    //     return rendererParamsResult;\n    // }\n}\n","import { AutoWired, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DayDetails, ICalendarDataManager } from \"./calendar-data-manager.types\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { CalendarViewManagerTypes } from \"./calendar-view-manager.types\";\nimport { CALENDAR_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { Dayjs } from \"dayjs\";\n\n\n\n\nexport const CALENDAR_VIEW_TYPE = {\n    MONTH: 'month',\n    YEAR : 'year',\n    DAY  : 'day',\n   \n}\n\n\n@Bean(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER)\nexport class CalendarViewManager extends EventEmitter implements CalendarViewManagerTypes {\n\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_MODEL) protected model !:ICalendarDataManager;\n\n\n    private viewType !     : string;\n    private renderingData !: DayDetails[];\n    private counter        : number = 0;\n    private pickerType !: string;\n\n    private rowCount : number    = 0;\n    private columnCount : number = 0;\n\n    private yearTitle : string = \"\";\n\n\n    @PostConstruct()\n    init(){\n        this.viewType = this.optionsHandler.getViewType();\n        this.pickerType = this.optionsHandler.getPickerType();\n\n        if(this.pickerType === CALENDAR_VIEW_TYPE.MONTH){\n           this.viewType = CALENDAR_VIEW_TYPE.MONTH\n        }else if(this.pickerType === CALENDAR_VIEW_TYPE.YEAR){\n            this.viewType = CALENDAR_VIEW_TYPE.YEAR\n        }\n        this.updateRenderingDetails();\n\n\n\n\n   }\n\n   getViewType(): string{\n    return this.viewType;\n   }\n\n   setViewType(viewType : string):void{\n            this.viewType = viewType;\n   }\n\n   updateRenderingDetails():void{\n    if(CALENDAR_VIEW_TYPE.DAY === this.viewType){\n        this.renderingData = this.model.getRenderDetailsforDay();\n        this.rowCount      = this.model.getNumberOfWeeksInMonth();\n        this.columnCount   = this.model.getNumberOfDaysInWeek();\n        this.yearTitle     = `${this.model.getSelectedYear()}`\n    }else if(CALENDAR_VIEW_TYPE.MONTH === this.viewType){\n        this.renderingData = this.model.getMonthNames();\n        this.rowCount      = 3;\n        this.columnCount   = 4;\n        this.yearTitle     = `${this.model.getSelectedYear()}`\n\n\n    }else if(CALENDAR_VIEW_TYPE.YEAR === this.viewType){\n        this.rowCount      = 3;\n        this.columnCount   = 4;\n        this.renderingData = this.model.getRenderDetailsforYear();\n        this.yearTitle     = `${this.renderingData[0].value} - ${this.renderingData[this.renderingData.length - 1].value}`\n        this.dispatchEvent({\n            type : CALENDAR_CUSTOM_EVENTS.YEAR_UPDATED\n        })\n    }\n\n   }\n\n   getSelectedYearTitle() : string {\n        return this.yearTitle;\n   }\n\n   getRenderingDetails(): DayDetails {\n        if(this.counter >= this.renderingData.length){\n            this.counter = 0; \n        }\n        return this.renderingData[this.counter];\n    }\n\n    updateCounter(): void {\n        this.counter = this.counter + 1;\n\n\n    }\n\n    getRowCount(): number {\n        return this.rowCount;\n    }\n\n    getColumnCount(): number {\n        return this.columnCount;\n    }\n\n    resetCounter(): void {\n        this.counter = 0;\n    }\n\n    isMonthView(): boolean{\n        return this.viewType === CALENDAR_VIEW_TYPE.MONTH\n    }\n\n    isYearView(): boolean{\n        return this.viewType === CALENDAR_VIEW_TYPE.YEAR\n    }\n\n    getRendereringData():DayDetails[]{\n        return this.renderingData;\n    }\n\n    getWeekdayRendereringData():string[]{\n        return this.model.getWeekNames();\n    }\n    \n\n    setMonth(month: number): void {\n        this.model.setMonth(month);\n        this.model.setSelectedMonth(month)\n        this.updateRenderingDetails();\n        this.dispatchEvent({type : CALENDAR_CUSTOM_EVENTS.RERENDER});\n        this.dispatchEvent({type : CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED});\n    }\n    \n\n    setDay(day:number):void { \n        this.model.setDay(day);\n        this.model.setSelectedDay(day);\n        this.updateRenderingDetails();\n        this.dispatchEvent({type : CALENDAR_CUSTOM_EVENTS.RERENDER});\n    }\n\n    setYear(year : number): void{\n        this.model.setYear(year);\n        this.model.setSelectedYear(year);\n        this.updateRenderingDetails();\n        this.dispatchEvent({type : CALENDAR_CUSTOM_EVENTS.RERENDER});\n        this.dispatchEvent({type : CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED});\n    }\n\n    setDate(date : string | Date | Dayjs):void{\n        this.model.setDate(date);\n        this.model.setSelectedDate(date);\n        this.updateRenderingDetails();\n        this.dispatchEvent({type : CALENDAR_CUSTOM_EVENTS.RERENDER});\n        this.dispatchEvent({type : CALENDAR_CUSTOM_EVENTS.MONTH_UPDATED});\n        this.dispatchEvent({type : CALENDAR_CUSTOM_EVENTS.UPDATE_TIME});\n    }\n\n\n\n\n   \n\n\n\n\n\n}","import { BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { CorePopupHandler } from \"../../../../utility/PopupHandler/CorePopupHandler\";\n\n@Bean(BEAN_NAME.POPUP_HANDLER)\nexport class PopupHandler extends CorePopupHandler {\n   \n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../modules/CSSRegistry\";\n\nexport function getCalendarRootUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('date-picker', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n","import { composeClasses } from \"@dg/utils\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { CalendarRootViewType } from \"./calendar-root-view.types\";\nimport { getCalendarRootUtilityClass } from \"./calendar-root-classes\";\nimport { AutoWired, BEAN_NAME} from \"@dg/corecomponent\";\nimport { CalendarOptionHandlerType } from \"../model/calendar-options-handler.types\";\nimport { CalendarControllerHandlerType } from \"../model/calendar-controller.types\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { TimePickerDropdownType } from \"../time-dropdown-hanlder/time-dropdown-handler.types\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer: {\n\t\t\tslot: '',\n\t\t\tmodifiers: []\n\t\t}\n\t};\n\n\treturn composeClasses(slots, getCalendarRootUtilityClass);\n};\n\nexport class CalendarRootController extends AbstractController<CalendarRootViewType> {\n\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: CalendarOptionHandlerType;\n\t@AutoWired(CALENDAR_BEAN_NAME.CALENDAR_CONTROLLER_HANDLER) controllerHandler !: CalendarControllerHandlerType;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_TIME_DROPDOWN_MANAGER) timeDropdownHanlder !: TimePickerDropdownType;\n\n\n\n\tinit() {\n\t\tthis.applyClassNames();\n\t\tthis.controllerHandler.registerCalendarCtrl(this);\n\t\tthis.addListener(this.eventHandler,'DESTROY_CALENDAR',this.destroy.bind(this));\n\t\tthis.addListener(this.eventHandler,'FOCUS_INPUT_ELEMENT',this.focusInputElement.bind(this));\n\t\tthis.addListener(this.eventHandler,'BLUR_INPUT_ELEMENT',this.blurInputElement.bind(this));\n\t\t\n\t\t// this.setRole();\n\t\tthis.setTabindex();\n\t\tthis.registerEvents()\n\t\t// this.setAriaAttributes()\n\t\tthis.setId()\n\n\t}\n\tprivate setId():void{\n\t\tconst element = this.component?.getElement() as HTMLElement;\n\t\tconst id = this.optionHandler.getId();\n\t\tid  && element.setAttribute(\"id\",id);\n\t}\n\tprivate applyClassNames() {\n\t\tconst classes = useUtilityClasses();\n\t\tthis.component?.addOrRemoveCssClass(classes.container);\n\t\tconst userClassName = this.optionHandler.getClassName()\n\t\tuserClassName && this.component?.getElement().classList.add(userClassName);\n\t}\n\n\tgetProperty(){\n\t\treturn{\n\t\t\tshowTimePicker : this.optionHandler.shouldShowTimePicker(),\n\t\t\ttype : this.optionHandler.getType()\n\t\t}\n\t}\n\n\t// private getOwnerState() {\n\t// \treturn {\n\t// \t\tdisabled: this.optionHandler.isDisabled(),\n\t// \t\treadonly: this.optionHandler.isReadOnly()\n\t// \t};\n\t// }\n\n\t// private setRole(){\n\t// \tconst element = this.component.getElement();\n\t// \tsetAriaRole(element,\"dialog\")\n\t// }\n\n\t// private setAriaAttributes(){\n\t// \tconst element = this.component.getElement();\n    //     setAriaLabelledBy(element,this.optionHandler.getAriaLabelledBy())\n\t// }\n\n\tprivate registerEvents() {\n\t\tconst element = this.component?.getElement() as HTMLElement;\n\n\t\telement.addEventListener('focusin',(_event: FocusEvent) => {\n\t\t\tthis.focusInputElement()\n\t\t})\n\t}\n\tprivate setTabindex(){\n\t\tconst element = this.component?.getElement() as HTMLElement;\n        element.setAttribute(\"tabindex\", \"0\");\n\t}\n\n    rerender():void{\n\t\tthis.component?.destroy();\n        this.component?.rerender();\n\n\t\tthis.init()\n\t\t// super.destroy();\n\n    }\n\n\tfocus():void{\n\t\tthis.component?.getElement().focus();\n\t}\n\n\n\tblur():void{\n\t\tthis.component?.getElement().blur();\n\t}\n\n\tgetElement() {\n\t\treturn this.component?.getElement();\n\t}\n\n\tdestroy(): void {\n\t\tthis.optionHandler.onDestroy();\n\t\tthis.timeDropdownHanlder.destroyDropdown();\n\t\tthis.component?.destroy();\n\t\tsuper.destroy();\n\t\t\n\t}\n\n\tfocusInputElement():void{\n\t\tconst inputElement = this.optionHandler.getInputElement();\n\t\tinputElement && inputElement.focus();\n\t}\n\n\tblurInputElement():void{\n\t\tconst inputElement = this.optionHandler.getInputElement();\n\t\tinputElement && inputElement.blur();\n\t}\n\n\t\n\n}\n","\n\n\n\n\nimport { PostConstruct } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { CalendarRootController } from './calendar-root-contoller';\nimport { CalendarRootViewType } from './calendar-root-view.types';\n\n\nfunction RootTemplate(props?: any): HTMLElement {\n    const { showTimePicker, type } = props || {};\n    \n    if (type === 'timepicker') {\n        const wrapper = document.createElement('div');\n        const timePicker = document.createElement('time-picker');\n        wrapper.appendChild(timePicker);\n        return wrapper;\n    }\n    \n    const wrapper = document.createElement('div');\n    const calendarNav = document.createElement('calendar-nav');\n    const calendarBody = document.createElement('calendar-body');\n    wrapper.appendChild(calendarNav);\n    wrapper.appendChild(calendarBody);\n    \n    if (showTimePicker) {\n        const timePicker = document.createElement('time-picker');\n        wrapper.appendChild(timePicker);\n    }\n    \n    return wrapper;\n}\n\n\n\nexport class CalendarRootView extends Component {\n\tprivate appendTo: HTMLElement|null | undefined;\n\tprivate showTimePicker: boolean | undefined;\n\tprivate type: string | undefined;\n    \n\tconstructor(props:any) {\n\t\tsuper();\n\t\tthis.appendTo = props.appendTo;\n\t\tthis.showTimePicker = props.showTimePicker;\n\t\tthis.type = props.type\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tthis.renderTemplate();\n\n\t\t// const component:CalendarRootViewType  = this.getComponent();\n\n\t\t// const controller = this.createManagedBean(new CalendarRootController());\n\t\t// controller.setComponent(component);\n\n\n\n\t\t// this.appendElementIntoUserDom();\n\t}\n\n\tprivate getComponent(): CalendarRootViewType {\n\t\treturn {\n\t\t\tgetElement             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n            rerender: () => this.rerender(),\n\t\t\tdestroy: () => this.destroy()\n\n\t\t}\n\t\t\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprivate appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\t// this.appendTo?.remove();\n\t\t\tthis.appendTo = null;\n\t\t});\n\t}\n\n\n\tprivate renderTemplate() {\n        this.setTemplate(RootTemplate({showTimePicker : this.showTimePicker,type : this.type}));\n\n\t\tconst component:CalendarRootViewType  = this.getComponent();\n\t\tconst controller = this.createManagedBean(new CalendarRootController());\n\t\tcontroller.setComponent(component);\n\n\t\tthis.appendTo = this.optionsHandler.getAppendTo();\n        this.appendElementIntoUserDom();\n\n\n    }\n\n    rerender() {\n        this.renderTemplate();\n    }\n\n\tprotected destroy(): void {\n\t\tthis.getGui()?.remove();\n\t\t// super.destroy();\n\t}\n\n}","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { SelectDropdown } from \"../../../../dropdown/dropdown\";\nimport { CorePopupHandler, PopupComponentPositionParams, Position } from \"../../../../utility/PopupHandler/CorePopupHandler\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { CalendarControllerHandlerType } from \"../model/calendar-controller.types\";\nimport {  TimeDropdownType, TimePickerDropdownType } from \"./time-dropdown-handler.types\";\nimport { IDropdownConfiguration, DropdownOptionElementModel } from \"../../../../dropdown/dropdown_configuration\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ICalendarDataManager } from \"../model/calendar-data-manager.types\";\n\n\n@Bean(CALENDAR_BEAN_NAME.CALENDAR_TIME_DROPDOWN_MANAGER)\nexport class TimePickerDropdown extends EventEmitter implements TimePickerDropdownType {\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_CONTROLLER_HANDLER) controllerHandler !: CalendarControllerHandlerType;\n    @AutoWired(BEAN_NAME.POPUP_HANDLER) protected popupHandler !: CorePopupHandler;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_MODEL) protected model!: ICalendarDataManager;\n\n\n    private dropdown: any;\n    private popupDestroy: any;\n    private dropdownElement !: HTMLElement \n    private type !: TimeDropdownType\n\n    createDropdown(element :  HTMLElement,type: TimeDropdownType, callback: CallableFunction, selectedValue : any,hourCycle?:12|24): void {\n        if(this.dropdown){\n            this.destroyDropdown()\n            if(this.type === type){\n                return\n            }\n        }\n        this.type = type\n        const configuration = this.createDropdownConfig(element,type, callback, selectedValue,hourCycle);\n        this.dropdown = new SelectDropdown(configuration);\n        this.dropdownElement = this.dropdown.api.getElement();\n        // const sourceElement = this.controllerHandler.getCalendarCtrl().getElement() as HTMLElement;\n        // const sourceElement = this.optionsHandler.getAppendTo();\n        const popupParent = this.optionsHandler.getAppendTo()\n\n        const positionParams: PopupComponentPositionParams = {\n            popUpElement    :  this.dropdownElement,\n            sourceElement   : element,\n            position        : Position.bottomLeft,\n            keepWithinBounds: true,\n            gapX            : 0,\n            gapY            : 0,\n            relativePosition : true\n        };\n\n        const positionCallback = this.popupHandler.positionPopupByComponent.bind(this.popupHandler, positionParams, popupParent);\n\n        const addPopup = this.popupHandler.addPopup({\n            childElement       :  this.dropdownElement,\n            anchorToElement    : element,\n            popupParentElement : popupParent,\n            positionCallback,\n            ariaLabel          : ''\n        });\n        this.popupDestroy = addPopup.hideFunction;\n\n\n        // const observer = new MutationObserver(() => {\n        //     if (document.body.contains(this.dropdownElement)) {\n        //         if(this.dropdown){\n        //             this.dropdown.api.focus()\n        //             this.dropdown.api.autoFocusSelectedOption();\n        //             observer.disconnect(); // Stop observing once focused\n        //         }\n               \n        //     }\n        // });\n    \n        // observer.observe(this.dropdownElement, { childList: true, subtree: true });\n\n\n        // dropdownElement.focus();\n\n        this.dropdown.api.focus();\n\n\n        this.registerEvent(this.dropdownElement)\n\n    }\n\n     createDropdownConfig(_element: HTMLElement,type: TimeDropdownType, callback: CallableFunction, selectedValue: any, hourCycle?:12|24) : IDropdownConfiguration{\n        const timeItems = this.getTimeItemsByType(type,hourCycle);\n        const value = `${selectedValue}`;\n\n        return {\n            options: this.createTimeOptions(timeItems,type),\n            selectedData: () => [value], // need to change\n            closeOnSelect: false,\n            onFocus : () => {\n                    // this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'})\n                    return {};\n            },\n            onBlur:()=>{\n                console.log('onBlur')\n                return {};\n            },\n            onAfterSelect: (param) => {\n                // element.focus();\n                callback(param.value.value);\n                this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'})\n                this.destroyDropdown();\n            },\n            autoFocusSelectedOption : true,\n            classname: \"dg-date-picker__time-picker-dropdown\",\n            onKeydown: (event: KeyboardEvent) => {\n                if (event.key === 'Escape' || event.key === 'Esc') {\n                  this.destroyDropdown();\n                }\n              }\n        };\n    }\n\n    createTimeOptions(timeItems:string[],type: string){\n        let option:DropdownOptionElementModel[];\n        option = []\n        for (let index = 0; index < timeItems.length; index++) {\n            const item = timeItems[index];\n            const isBefore = this.model.isBeforeTIme(Number(item),type);\n\n            const object ={\n                value : item,\n                id : type === 'meridian' ? `${item}` :`${Number(item)}`,\n                disabled : isBefore\n\n            }\n\n            option.push(object)\n\n         \n         \n            \n        }\n        return option\n\n    }\n\n\n\n     getTimeItemsByType(type: TimeDropdownType,hourCycle?:12|24): string[] {\n        let minuteInterval = this.optionsHandler.getMinuteInterval();\n        minuteInterval === 0 ? minuteInterval = 1 : minuteInterval;\n        switch (type) {\n            case 'hour':\n                if(hourCycle === 24){\n                    return Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, '0')); // 00\n                }\n                return Array.from({ length: 12 }, (_, i) => (i+1).toString()); // 1-12\n            case 'minute':\n                return Array.from({ length: Math.ceil(60 / minuteInterval) }, (_, i) => \n                    (i * minuteInterval).toString().padStart(2, '0')\n                );\n            case 'meridian':\n                return ['AM', 'PM'];\n            default:\n                return [];\n        }\n    }\n\n    getSelectedIndex(selectedValue:number){\n        const minuteInterval = this.optionsHandler.getMinuteInterval();\n\n        if (minuteInterval) {\n            const roundedValue = Math.round(selectedValue / minuteInterval) * minuteInterval;\n            return roundedValue / minuteInterval;\n        }\n\n    return -1; \n\n    }\n\n    openDropdown(): void {\n        // Implementation for opening dropdown\n    }\n\n\n    registerEvent(dropdownElement : HTMLElement){\n        dropdownElement.addEventListener(\"focusout\",(event)=>{\n            if(this.dropdown){ \n\t\t\tconst relatedTarget     = event.relatedTarget as HTMLElement;\n            const datePickerElement = this.controllerHandler.getCalendarCtrl().getElement() as HTMLElement;\n\n                if(datePickerElement.contains(relatedTarget) ){\n                    this.destroyDropdown();\n                    return\n                }\n\n                if(!this.isElementWithinTimeDropDown(relatedTarget) && relatedTarget != this.optionsHandler.getInputElement()){\n                    this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'})\n                    this.dispatchEvent({type : 'BLUR_INPUT_ELEMENT'})\n\n                    this.dispatchEvent({type:'DESTROY_CALENDAR'})\n\n\n                }\n                \n               \n            }\n\n        })\n    }\n    private isElementWithinTimeDropDown(element: HTMLElement): boolean {\n        let pointer: HTMLElement | null = element;\n        \n        while (pointer) {\n            if (pointer === this.dropdownElement) {\n                return true;\n            }\n            pointer = pointer.parentElement;\n        }\n\n        return false;\n    }\n\n\n\n    getDropdown():any{\n        return this.dropdown\n    }\n\n\n\n    destroyDropdown(): void {\n        if(document.activeElement == this.dropdownElement ){\n            return\n        }\n\n        if (this.popupDestroy) {\n            this.popupDestroy();\n            this.popupDestroy = null;\n            this.dropdownElement == null\n            this.dropdown.api.destroy();\n            this.dropdown = null;\n\n        }\n    }\n}\n","\nimport { AutoWired } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { TimeNavBarViewType } from \"./time-nav-bar-view.types\";\nimport { ICalendarDataManager } from \"../model/calendar-data-manager.types\";\nimport { CALENDAR_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { CalendarViewManagerTypes } from \"../model/calendar-view-manager.types\";\nimport { CALENDAR_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { TimePickerDropdownType } from \"../time-dropdown-hanlder/time-dropdown-handler.types\";\n\n\n// const useUtilityClasses = () => {\n// \tconst slots = {\n// \t\tcontainer : {\n// \t\t\tslot : 'timebar',\n// \t\t\tmodifiers : []\n// \t\t}\n// \t}\n\n// \treturn composeClasses(slots, getCalendarRootUtilityClass)\n// }\n\n\n\n// const useUtilityClassesForButton = () => {\n// \tconst slots = {\n// \t\tcontainer : {\n// \t\t\tslot : 'button',\n// \t\t\tmodifiers : [\n                \n//             ]\n// \t\t}\n// \t}\n\n// \treturn composeClasses(slots, getCalendarRootUtilityClass)\n// }\n\n\n\nexport class TimeNavBarController extends AbstractController<TimeNavBarViewType>{\n\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_MODEL) protected model !:ICalendarDataManager;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER) protected viewManager !:CalendarViewManagerTypes;\n    @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_TIME_DROPDOWN_MANAGER) dropdownHanlder !: TimePickerDropdownType;\n\n    private parentComponent!: any;\n    \n   init(){\n        this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.UPDATE_TIME, this.refresh.bind(this));\n        this.parentComponent = this.component?.getParentComponent();\n        this.setAriaAttributes()\n         this.applyClassNames();\n         this.registerEventListener();\n    }\n    \n    private applyClassNames(){\n        this.component?.addOrRemoveCssClass(\"dg-date-picker__timebar\");\n    }\n\n    getProperty(){\n             return this.model.getTimeBarRenderingDetails()\n    }\n\n    setAriaAttributes():void{\n        \n    }\n\n\n    registerEventListener(): void {\n        const hourElement = this.component?.getHourElement() as HTMLElement;\n        const minuteElement = this.component?.getMinuteElement() as HTMLElement;\n        const meridianelement = this.component?.getMeridianElement() as HTMLElement;\n\n\n            if(hourElement){\n                hourElement.addEventListener('click',()=>{\n                    const hour = Number(this.model.getCurrentHour());\n\n                    let  selectedValueindex = hour;\n                    selectedValueindex === -1 ? selectedValueindex = 0 :'';\n\n                    const hourCycle = this.optionsHandler.getHourCycle();\n\n                    this.dropdownHanlder.createDropdown(hourElement, 'hour',this.setHour.bind(this), selectedValueindex,hourCycle);\n                    // hourElement.focus();\n        \n                })\n            }\n        \n\n            if(minuteElement){\n                minuteElement.addEventListener('click',()=>{\n                    const minute = this.model.getMinutes()\n                    const selectedValueindex = minute\n\n\n\n                    this.dropdownHanlder.createDropdown(minuteElement,'minute',this.setMinute.bind(this), selectedValueindex);\n\n                    // minuteElement.focus();\n\n                })\n            }\n\n            if(meridianelement){\n                meridianelement.addEventListener('click',()=>{\n                const merdian = this.model.getMeridian();\n\n\n                this.dropdownHanlder.createDropdown(meridianelement,'meridian',this.setMeridian.bind(this),merdian);\n\n                // meridianelement.focus();\n\n                })\n\n            }\n\n        \n    }\n\n    private setHour(value: string,event?:string){\n        const valueInMNumeric = Number(value);\n        if(isNaN(valueInMNumeric)){\n            return\n        }\n        this.model.setHours(valueInMNumeric);\n        const hourElement = this.component?.getHourElement() as HTMLElement;\n        const spanElement = hourElement.querySelector('span');\n        if (spanElement) {\n            spanElement.textContent = value; \n        }\n\n        \n        if(event!='api'){\n            const date = this.model.getDateObject()\n            this.optionsHandler.onChange(date)\n        }\n\n    }\n\n    private setMinute(value: string,event?:string){\n        const valueInMNumeric = Number(value);\n        if(isNaN(valueInMNumeric)){\n            return\n        }\n        this.model.setMinutes(Number(valueInMNumeric));\n        const hourElement = this.component?.getMinuteElement() as HTMLElement;\n        const spanElement = hourElement.querySelector('span');\n        if (spanElement) {\n            spanElement.textContent = value; \n        }\n        if(event!='api'){\n            const date = this.model.getDateObject()\n            this.optionsHandler.onChange(date)\n        }\n    }\n\n    private setMeridian(value: string,event?:string){\n        this.model.setMeridian(value);\n\n        if(value === '') {\n            return;\n        }\n        \n        const hourElement = this.component?.getMeridianElement() as HTMLElement;\n        const spanElement = hourElement.querySelector('span');\n        if (spanElement) {\n            spanElement.textContent = value; \n        }\n        if(event!='api'){\n            const date = this.model.getDateObject()\n            this.optionsHandler.onChange(date)\n        }\n    }\n\n    private refresh() {\n        const props = this.model.getTimeBarRenderingDetails();\n        this.setHour(props.hour,'api');\n        this.setMinute(props.minute,'api');\n        props.hourCycle === 12 &&  this.setMeridian(props.meridian,'api');\n       \n    }\n\n    rerender():void{\n\n        this.component?.rerender(this,this.parentComponent);\n        this.applyClassNames();\n\n    }\n\n    hideYearBtns():void{\n        // const { previousYearButton, nextYearButton } = this.component?.getMonthYearButtons() as { previousYearButton :HTMLElement, nextYearButton: HTMLElement};\n        // const monthElement = this.component?.getMonthElement() as HTMLElement;\n\n        // previousYearButton.style.display = 'none'\n        // nextYearButton.style.display     = 'none';\n        // monthElement.style.display       = 'none';\n    }\n\n    showYearBtns():void{\n        // const { previousYearButton, nextYearButton } = this.component?.getMonthYearButtons() as { previousYearButton :HTMLElement, nextYearButton: HTMLElement};;\n        // const monthElement = this.component?.getMonthElement() as HTMLElement;\n\n        // previousYearButton.style.display = 'block';\n        // nextYearButton.style.display     = 'block';\n        // monthElement.style.display       = 'block';\n\n    }\n\n    protected destroy(): void {\n        super.destroy();\n    }\n\n\n\n\n\n}","\nimport { PostConstruct, queryAssignedNodes } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { TimeNavBarViewType } from './time-nav-bar-view.types';\nimport { TimeNavBarController } from './time-nav-bar-controller';\nimport { getSvgIcon } from '../../../../utility/create-svg-template';\n\n\n\n\n\nfunction TimeNavBarTemplate(props : any) : HTMLElement{\n    const wrapper = document.createElement('div');\n\n    // Time Icon\n    const timeIcon = getSvgIcon('dg__svg--time-picker', {svg : 'dg-date-picker__time-icon', icon : 'dg-date-picker__time-icon'});\n    const tempDOM = document.createElement('div');\n    tempDOM.innerHTML = timeIcon;\n\n    wrapper.appendChild(tempDOM.firstChild as HTMLElement);\n    // const timeIcon = document.createElement('i');\n    // timeIcon.classList.add('dg-date-picker__time-icon');\n    // const timeSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    // timeSvg.classList.add('dg-date-picker__time');\n    // timeSvg.setAttribute('width', '17');\n    // timeSvg.setAttribute('height', '17');\n    // timeSvg.setAttribute('viewBox', '0 0 24 24');\n    // const path1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    // path1.setAttribute('d', \"M14.56,13.7l-2.23-1.42v-2.94c0-.34-.28-.62-.62-.62s-.62.28-.62.62v3.28c0,.21.11.41.29.53l2.52,1.61c.1.07.22.1.33.1.21,0,.41-.1.53-.29.19-.29.1-.68-.19-.86Z\");\n    // const path2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    // path2.setAttribute('d', \"M12,3.37C7.24,3.37,3.38,7.24,3.38,12s3.87,8.62,8.62,8.62,8.62-3.87,8.62-8.62S16.76,3.37,12,3.37ZM12,19.37c-4.07,0-7.38-3.31-7.38-7.38s3.31-7.38,7.38-7.38,7.38,3.31,7.38,7.38-3.31,7.38-7.38,7.38Z\");\n    // timeSvg.appendChild(path1);\n    // timeSvg.appendChild(path2);\n    // timeIcon.appendChild(timeSvg);\n    // wrapper.appendChild(timeIcon);\n\n    // Time Picker Container\n    const timePickerDiv = document.createElement('div');\n    timePickerDiv.classList.add('dg-date-picker__time-picker', 'dg-date-picker__multiple-select-box');\n    wrapper.appendChild(timePickerDiv);\n\n    // Helper to create a time button\n    function createTimeButton(buttonClasses: string, refName: string, textContent: string | null) {\n        const button = document.createElement('button');\n        button.className = buttonClasses;\n        button.setAttribute('ref', refName);\n\n        const span = document.createElement('span');\n        span.classList.add('dg-time-picker__text');\n        span.textContent = textContent;\n        button.appendChild(span);\n\n        const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n        svg.setAttribute('width', '24');\n        svg.setAttribute('height', '24');\n        svg.setAttribute('viewBox', '0 0 24 24');\n        svg.classList.add('dg-date-picker__icon--dropdown');\n        svg.setAttribute('fill', 'none');\n        svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n\n        const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        path.setAttribute('d', \"M15 11.9909C15.0004 11.8999 14.9827 11.8098 14.9478 11.7258C14.9129 11.6417 14.8616 11.5655 14.7969 11.5016L10.1811 6.88583C10.0499 6.76353 9.87625 6.69696 9.69688 6.70012C9.51751 6.70328 9.34637 6.77594 9.21952 6.90279C9.09267 7.02965 9.01996 7.20078 9.01679 7.38015C9.01363 7.55952 9.0802 7.73313 9.2025 7.86438L13.329 11.9909L9.2025 16.1174C9.07285 16.2472 9 16.4232 9 16.6067C9 16.7901 9.07285 16.9661 9.2025 17.096C9.26615 17.1613 9.34228 17.2132 9.42631 17.2487C9.51034 17.2841 9.6006 17.3024 9.69181 17.3024C9.78301 17.3024 9.87327 17.2841 9.9573 17.2487C10.0413 17.2132 10.1175 17.1613 10.1811 17.096L14.7969 12.4802C14.862 12.4166 14.9136 12.3404 14.9485 12.2563C14.9834 12.1722 15.0009 12.0819 15 11.9909Z\");\n        svg.appendChild(path);\n        button.appendChild(svg);\n\n        return button;\n    }\n\n    const hourButton = createTimeButton(\n        \"dg-button__root dg-date-picker__time-model dg-date-picker__hour-input\",\n        \"HourElement\",\n        props.hour\n    );\n    timePickerDiv.appendChild(hourButton);\n\n    const minuteButton = createTimeButton(\n        \"dg-button__root dg-date-picker__time-model dg-date-picker__minute-input\",\n        \"MinuteElement\",\n        props.minute\n    );\n    timePickerDiv.appendChild(minuteButton);\n\n    if (props.hourCycle === 12 && props.meridian) {\n        const periodButton = document.createElement('button');\n        periodButton.className = \"dg-button__root dg-date-picker__time-model dg-date-picker__period-input\";\n        periodButton.setAttribute(\"ref\", \"MeridianElement\");\n\n        const periodSpan = document.createElement('span');\n        periodSpan.classList.add('dg-date-picker__time-holder');\n        periodSpan.textContent = props.meridian;\n        periodButton.appendChild(periodSpan);\n\n        const periodSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n        periodSvg.setAttribute('width', '24');\n        periodSvg.setAttribute('height', '24');\n        periodSvg.setAttribute('viewBox', '0 0 24 24');\n        periodSvg.classList.add('dg-date-picker__icon--dropdown');\n        periodSvg.setAttribute('fill', 'none');\n        periodSvg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n\n        const periodPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        periodPath.setAttribute('d', \"M15 11.9909C15.0004 11.8999 14.9827 11.8098 14.9478 11.7258C14.9129 11.6417 14.8616 11.5655 14.7969 11.5016L10.1811 6.88583C10.0499 6.76353 9.87625 6.69696 9.69688 6.70012C9.51751 6.70328 9.34637 6.77594 9.21952 6.90279C9.09267 7.02965 9.01996 7.20078 9.01679 7.38015C9.01363 7.55952 9.0802 7.73313 9.2025 7.86438L13.329 11.9909L9.2025 16.1174C9.07285 16.2472 9 16.4232 9 16.6067C9 16.7901 9.07285 16.9661 9.2025 17.096C9.26615 17.1613 9.34228 17.2132 9.42631 17.2487C9.51034 17.2841 9.6006 17.3024 9.69181 17.3024C9.78301 17.3024 9.87327 17.2841 9.9573 17.2487C10.0413 17.2132 10.1175 17.1613 10.1811 17.096L14.7969 12.4802C14.862 12.4166 14.9136 12.3404 14.9485 12.2563C14.9834 12.1722 15.0009 12.0819 15 11.9909Z\");\n        periodSvg.appendChild(periodPath);\n        periodButton.appendChild(periodSvg);\n        timePickerDiv.appendChild(periodButton);\n    }\n\n    return wrapper;\n}\n\n\n\n\n// function dummTemplate(_props:any){\n// \tconst div = document.createElement('div');\n// \treturn div;\n\t\n// }\n\n\n\nexport class TimeNavBarView extends Component {\n\t@queryAssignedNodes('HourElement') hourElement !: any;\n\t@queryAssignedNodes('MinuteElement') minuteElement !: any;\n\t@queryAssignedNodes('MeridianElement') meridianElement !: any;\n\n\n\t// @queryAssignedNodes('previousMonthButton') previousMonthButton!: any;\n\t// @queryAssignedNodes('nextMonthButton') nextMonthButton!        : any;\n\t// @queryAssignedNodes('previousYearButton') previousYearButton!  : any;\n\t// @queryAssignedNodes('nextYearButton') nextYearButton!          : any;\n\n    \n\t@PostConstruct()\n\tinit(): void {\n\n\t\tconst component:TimeNavBarViewType  = this.getComponent()\n\n\t\tconst controller = this.createManagedBean(new TimeNavBarController());\n        this.renderTemplate(controller,component);\n\t\tcontroller.setComponent(component);\n\t}\n\n\tprivate getComponent(): TimeNavBarViewType {\n\t\treturn {\n\t\t\tgetElement         : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n\t\t\trerender           : (controller,comp) => this.rerender(controller,comp),\n\t\t\tgetParentComponent : () => this.getParentComponent(),\n\t\t\tgetHourElement: () => this.getHourElement(),\n\t\t\tgetMeridianElement: () => this.getMeridianElement(),\n\t\t\tgetMinuteElement: () => this.getMinuteElement(),\n\n\t\t}\n\n\t}\n\n\tprivate getHourElement(): HTMLElement {\n\t\treturn this.hourElement;\n\t}\n\n\tprivate getMeridianElement(): HTMLElement {\n\t\treturn this.meridianElement;\n\t}\n\t\n\tprivate getMinuteElement(): HTMLElement {\n\t\treturn this.minuteElement;\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\n\t// private getMonthYearButtons():{previousYearButton:HTMLElement,nextYearButton    : HTMLElement}{\n\t// \treturn{\n\t// \t\tpreviousYearButton: this.previousYearButton.eGui,\n\t// \t\tnextYearButton    : this.nextYearButton.eGui\n\t// \t}\n\t// }\n\n\n\tprivate renderTemplate(controller: TimeNavBarController, _component: TimeNavBarViewType) {\n\t\tconst props = controller.getProperty()\n        // const paramsProperty = controller.getParamsProperty()\n        const template = TimeNavBarTemplate(props)\n        this.setTemplate(template);\n    }\n\n\trerender(controller:TimeNavBarController,comp:any) {\n\t\tthis.destroy();\n        const component = this.getComponent()\n        this.renderTemplate(controller,component);\n\t\tcontroller.setComponent(component);\n        comp.appendChild(this.getGui());\n    }\n\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\n\t}\n\n\t\n\n}","import { Button } from \"../../../../button/src/button\";\nimport { IButtonConfiguration } from \"../../../../button/src/button-configuration.types\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\n\nexport class ButtonRenderer implements ICustomRenderer{\n    private params : any;\n    private button !:any;\n    \n    init(params : any) {\n        this.params = params;\n        const configuration = this.createConfiguration();\n        this.button = new Button(configuration);\n    }\n\n    getElement(): HTMLElement {\n        return this.button.api.getElement();\n    }\n\n    private createConfiguration() : IButtonConfiguration {\n        return {\n            text    : this.params.label,\n            callback: this.params.callback,\n            icon    : this.params.icon,\n            showIcon: this.params.showIcon,\n            showText: this.params.showText,\n            disabled: this.params.disabled,\n            ariaLabel : this.params.ariaLabel,\n            classes : this.params.classes\n        }\n    }\n\n    destroy() : void {\n        this.button.api.destroy();\n        this.button = null;\n        this.params = null;\n    }\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IUserParams } from \"../utility/user-params.types\";\nimport { IChipConfiguration } from \"./chip-configuration.types\";\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport { ChipUserComponentHandler, PropertyName } from \"./src/core/model/chip-user-component-handler\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { ChipAPI } from \"./src/core/model/chip-api\";\nimport { ChipOptionHandler } from \"./src/core/model/chip-options-handler\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { BEAN_NAME, traverseObject } from \"@dg/corecomponent\";\nimport { ChipThumbNailView } from \"./src/core/chip-thumbnail/chip-thumbnail-view\";\nimport { ChipRemoveView } from \"./src/core/chip-remove/chip-remove-view\";\nimport { ChipStateHandler } from \"./src/core/model/chip-state-handler\";\nimport { ChipIconRenderer } from \"./src/core/user-component/chip-icon-renderer\";\nimport { ChipControllerHandler } from \"./src/core/model/chip-controller-handler\";\nimport { ChipTooltipHandler } from \"./src/core/model/chip-tooltip-handler\";\n\nlet nextInstanceId = 1;\n\n\nexport class ChipCoreComponent {\n\tinitialize( configuration: IChipConfiguration, params: IUserParams = {}, createUI: CallableFunction): void {\n\t\t\n\t\tconst instanceID = configuration.instanceID ?? String(nextInstanceId++);\n\n\t\tconst beanClasses = this.CreateBeanClasses();\n\n\t\tconst context = new Context();\n\n\t\tconst userConfigurations = this.createuserConfiguration(\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t\tinstanceID\n\t\t);\n\n        // Model classes\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n        // Default component registry\n\t\tthis.registerCoreComponent(context);\n        // Default user compoent registry\n\t\tthis.registerDefaultUserComponent(context);\n\t\tcreateUI(context);\n\n\t\t(window as any).context = context;\n\t}\n\n\tprivate CreateBeanClasses(): Set<any> {\n\t\tlet beanList = [\n            ChipAPI,\n            ChipOptionHandler,\n            ChipUserComponentHandler,\n            ChipStateHandler,\n            ChipControllerHandler,\n\n\t\t\tComponentsRegistry,\n\n\t\t\tUserComponentRegistry,\n\t\t\tComponentMetadataProvider,\n\t\t\tEventHandler,\n\t\t\tChipTooltipHandler,\n            \n\t\t];\n\t\treturn new Set(beanList);\n\t}\n\n\tprivate createuserConfiguration( configuration: any, params: IUserParams, instanceID : string): {\n\t\tconfiguration: any;\n\t\tframeWorkOverrides: IFrameworkOverrides | null;\n\t\tglobalEventListener: Function | null;\n\t\tframeworkComponentWrapper: any | null;\n\t\tinstanceID : string;\n\t} {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n\n\tprivate registerDefaultUserComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n            [PropertyName.REMOVE_CHIP_RENDERER] : ChipIconRenderer,\n            [PropertyName.THUMBNAIL_CHIP_RENDERER] : ChipIconRenderer\n        };\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n\n\n\tprivate registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nexport function createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n        {\n\t\t\tcomponentName: 'chip-thumbnail',\n\t\t\tcomponentClass: ChipThumbNailView,\n\t\t},\n        {\n            componentName: 'chip-remove',\n            componentClass : ChipRemoveView\n        }\n    ];\n\n\treturn components;\n}\n\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IUserParams } from \"../utility/user-params.types\";\nimport { IChipConfiguration } from \"./chip-configuration.types\";\nimport { ChipAPITypes } from \"./src/core/model/chip-api.types\";\nimport { ChipBeanConstants } from \"./src/constants/chip-constants\";\nimport { ChipRootView } from \"./src/core/chip-root/chip-root-view\";\nimport { ChipCoreComponent } from \"./chip-core-component\";\n\n\nexport class Chip {\n\tpublic api: ChipAPITypes | undefined;\n\tconstructor(configuration: IChipConfiguration, params?: IUserParams) {\n\t\tconst createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(ChipBeanConstants.CHIP_API) as ChipAPITypes;\n            context.createBean(new ChipRootView(configuration.appendTo));\n\t\t};\n\t\tnew ChipCoreComponent().initialize(configuration, params, createUI);\n\t}\n}","export const ChipBeanConstants = {\n    CHIP_CONFIGURATION: 'configuration',\n\tCHIP_API : 'chipApi',\n    CHIP_STATE : 'chipState',\n    CHIP_CONTROLLER_HANDLER : 'chipControllerHandler',\n    CHIP_TOOLTIP_HANDLER : \"CHIP_TOOLTIP_HANDLER\",\n}","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { ChipRemoveType } from \"./chip-remove.types\";\nimport { ChipOptionsHandlerTypes } from \"../model/chip-options-handler.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getChipUtilityClass } from \"../chip-root/chip-root-classes\";\nimport { ChipRenderedTypes } from \"../user-component/chip-renderer-types\";\nimport { OwnerStateType } from \"../chip-ownerstate.types\";\nimport { ChipStateHandlerType } from \"../model/chip-state-handler.types\";\nimport { ChipBeanConstants } from \"../../constants/chip-constants\";\nimport { ChipAPITypes } from \"../model/chip-api.types\";\nimport { ComponentItemType } from \"../../../../utility/component-detail.types\";\nimport { ChipUserComponentHandlerType } from \"../model/chip-user-component-handler.types\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\nimport { ChipControllerHandlerType } from \"../model/chip-controller-handler.types\";\n\nconst useUtilityClasses = () => {\n    const slots = {\n        root : {\n            slot : 'remove-icon',\n            modifiers : []\n        }\n    }    \n    return composeClasses(slots, getChipUtilityClass);\n}\n\nexport class ChipRemoveController extends AbstractController<ChipRemoveType>{\n    \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionsHandler !: ChipOptionsHandlerTypes;\n    @AutoWired(ChipBeanConstants.CHIP_STATE) private chipStateHandler !: ChipStateHandlerType;\n    @AutoWired(ChipBeanConstants.CHIP_API) private chipAPI !: ChipAPITypes;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) private userComponentHandler !: ChipUserComponentHandlerType;\n    @AutoWired(ChipBeanConstants.CHIP_CONTROLLER_HANDLER) controllerHandler!: ChipControllerHandlerType;\n\n    init(): void {\n        this.registerEvents();\n        this.applyClasses();\n        this.setRendererDetails();\n    }\n\n    registerEvents(){\n        const element = this.component?.getElement();\n        element && this.addListener(element, \"click\", (event : PointerEvent) => this.onClick(event));\n    }\n\n    private applyClasses(){\n        const clases = useUtilityClasses();\n        this.component?.addOrRemoveCssClass(clases.root)\n    }\n\n    onClick(event : PointerEvent){\n        event.stopPropagation();\n        \n        const ownerState = this.getOwnerState();\n        this.optionsHandler.onRemove({\n            label : this.optionsHandler.getLabel(),\n            key : this.optionsHandler.getLabel(),\n            event,\n            selected : ownerState.selected,\n            api : this.chipAPI\n        });\n\n        this.controllerHandler.getChipCtrl()?.disableTooltip();\n        \n    }\n\n    private getOwnerState() : OwnerStateType {\n        const selected = this.chipStateHandler.isSelected();\n        const disabled = this.optionsHandler.isDisabled();\n        const readOnly = this.optionsHandler.isReadOnly();\n        return {\n            selected,\n            disabled,\n            readOnly\n        }\n    }\n\n    private setRendererDetails() : void {\n        const wrapper = this.createWrapper<ICustomRenderer>();\n        const params = this.createRendererParams();\n\n        const renderDetails = this.userComponentHandler.getRemoveChipRendererDetails(wrapper, params);\n        renderDetails && this.component?.setRendererDetails(renderDetails);\n    }\n\n    private createWrapper<T>() : ComponentItemType<T> {\n        return {\n            getRenderer : () => this.optionsHandler.getRemoveIconRenderer() as T,\n            getRendererParams : () => this.optionsHandler.getUserRemoveIconRendererParams()\n        }\n    }\n\n    private createRendererParams() : ChipRenderedTypes {\n        const ownerState = this.getOwnerState();\n        return {\n            selected : ownerState.selected,\n            readonly : ownerState.readOnly,\n            disabled : ownerState.disabled,\n            api : this.chipAPI,\n            iconID : this.optionsHandler.getRemoveIconId() ?? \"\",\n            parentElement : this.component?.getElement() ?? null,\n        }\n    } \n}","import { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { ChipRemoveController } from \"./chip-remove-controller\";\nimport { ChipRemoveType } from \"./chip-remove.types\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\n\nfunction chipRemoveTemplate(){\n    // const div = document.createElement(\"span\");\n    // div.innerHTML = `<span></span>`\n    // return div.firstChild as HTMLElement;\n    return document.createElement(\"span\");\n}\n\nexport class ChipRemoveView extends Component {\n    private renderer !: ICustomRenderer;\n    private rendererElement !: HTMLElement | null;\n\n    @PostConstruct()\n    init() {\n       \n        const component : ChipRemoveType = {\n            setRendererDetails: (rendererDetails: IComponentDetails) => this.setRendererDetails(rendererDetails),\n            getElement : () => this.getGui(),\n            addOrRemoveCssClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n        const controller = this.createManagedBean(new ChipRemoveController());\n        this.setTemplate(chipRemoveTemplate());\n        controller.setComponent(component);\n    }\n\n    private setRendererDetails(renderDetails : IComponentDetails){\n        if(renderDetails){\n            this.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = renderDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcallback(componentInstance)\n\t\t\t}\n        }\n    }\n\n    private afterRenderer(renderer: ICustomRenderer) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n    private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n    private addOrRemoveCSSClass(className : string){\n        const element = this.getGui();\n        element.className = className;\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../modules/CSSRegistry\";\nexport function getChipUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('chip', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n","import { AutoWired, BEAN_NAME, setAriaDisabled, setAriaLabel, setAriaReadOnly, setAriaRole, toggleAttribute } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { ChipComponentType } from \"./chip-root.types\";\nimport { ChipEventParams, ChipOptionsHandlerTypes } from \"../model/chip-options-handler.types\";\nimport { ChipBeanConstants } from \"../../constants/chip-constants\";\nimport { ChipStateHandlerType } from \"../model/chip-state-handler.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getChipUtilityClass } from \"./chip-root-classes\";\nimport { OwnerStateType } from \"../chip-ownerstate.types\";\nimport { ChipControllerHandlerType } from \"../model/chip-controller-handler.types\";\nimport { ChipAPITypes } from \"../model/chip-api.types\";\nimport { ChipTooltipHandlerType } from \"../model/chip-tooltip-handler.types\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\nconst useUtilityClasses = (ownerState : OwnerStateType, _optionHandler : ChipOptionsHandlerTypes) => {\n\tconst slots = {\n\t\troot : {\n            slot     : 'root',\n            modifiers: [\n                ownerState.readOnly && 'readonly',\n                ownerState.disabled && 'disabled',\n                ownerState.selected && 'selected',\n                // optionHandler.getRadius() && `${optionHandler.getRadius()}`,\n                // optionHandler.getVariant() && `${optionHandler.getVariant()}`,\n                // optionHandler.getColor() && `${optionHandler.getColor()}`,\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots, getChipUtilityClass);\n};\nexport class ChipRootController extends AbstractController<ChipComponentType> {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionsHandler !: ChipOptionsHandlerTypes;\n    @AutoWired(ChipBeanConstants.CHIP_STATE) private chipStateHandler !: ChipStateHandlerType;\n    @AutoWired(ChipBeanConstants.CHIP_CONTROLLER_HANDLER) private controllerHandler !: ChipControllerHandlerType;\n    @AutoWired(ChipBeanConstants.CHIP_API) private api !: ChipAPITypes\n    @AutoWired(ChipBeanConstants.CHIP_TOOLTIP_HANDLER) chipTooltipHandler !: ChipTooltipHandlerType;\n\n    init(): void {\n        this.registerEvent();\n        this.refresh();\n        this.controllerHandler.registerCtrl(this);\n    }\n    registerEvent(){\n\n        \n        this.addListener(this.eventHandler,\"Label_Property_Changed\", this.updateLabel.bind(this));\n        this.addListener(this.eventHandler,\"ChipColor_Property_Changed\", this.updateColor.bind(this));\n        this.addListener(this.eventHandler,\"Tooltip_Property_Changed\",this.registerToolTipListener.bind(this));\n\n       if(this.optionsHandler.shouldShowTooltip()){\n            this.registerToolTipListener();\n        }\n\n        const element = this.component?.getElement();\n        registerClipboardGuards(\n            element,\n            () => this.optionsHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n\n        if(this.optionsHandler.isReadOnly()){\n            return;\n        }\n        element && this.addListener(element, \"click\", (event : PointerEvent) => this.onClick(event));\n        this.addListener(this.eventHandler, 'EVENT_STATE_UPDATED', this.refresh.bind(this));\n        element && this.addListener(element, 'keydown', (event : KeyboardEvent) => this.handleKeyEvent(event))\n    }\n\n    registerToolTipListener(){\n        // if(this.optionsHandler.shouldShowTooltip()){\n        //     this.component?.getElement().addEventListener(\"mouseover\",this.enableTooltip.bind(this));\n        //     this.component?.getElement().addEventListener(\"mouseout\",this.disableTooltip.bind(this));\n        // }\n        // else{\n        //     this.component?.getElement().removeEventListener(\"mouseover\",this.enableTooltip.bind(this));\n        //     this.component?.getElement().removeEventListener(\"mouseout\",this.disableTooltip.bind(this));\n        // }\n        this.disableTooltip();\n        this.enableTooltip();\n\n    }\n\n    \n\n    private handleKeyEvent(event : KeyboardEvent): void {\n        const disabled = this.optionsHandler.isDisabled();\n        if (disabled) return;\n        switch (event.key) {\n            case 'Enter': \n            case ' '    : \n                this.onClick(event);\n                break;\n            case 'Backspace':\n                this.onRemove(event);\n                \n        }\n    }\n\n    private refresh() : void { \n        this.applyClasses();\n        this.setAccessibility();\n        this.setHrefAttributes();\n    }\n\n\n    private setHrefAttributes() : void {\n        const {href, hrefTarget} = this.getProperty();\n        const element = this.component?.getElement();\n        element && href && toggleAttribute(element, 'href', href);\n        element && href && toggleAttribute(element, 'target', hrefTarget);\n    }\n\n\n    private setAccessibility() : void { \n        const element    = this.component?.getElement();\n        const ownerState = this.getOwnerState();\n\n        const ariaLabel = this.optionsHandler.getAriaLabel();\n        const tabindex  = this.optionsHandler.getTabIndex();\n        const role      = this.optionsHandler.getRole();\n\n        if(element){\n            toggleAttribute(element, \"tabindex\", ownerState.readOnly ? '-1' : `${tabindex}`)\n            setAriaRole(element, 'option');\n            if(ownerState.readOnly){\n                setAriaRole(element, \"status\");\n            }\n            else{\n                setAriaRole(element, role);\n            }\n            setAriaDisabled(element, ownerState.disabled);\n            setAriaReadOnly(element, ownerState.readOnly);\n            ariaLabel && setAriaLabel(element, ariaLabel);\n        }\n\n    }\n\n    private applyClasses() {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState, this.optionsHandler);\n        this.component?.addOrRemoveCssClassName(classes.root);\n        this.optionsHandler.getWrapperClassname() && this.component?.getElement().classList.add(this.optionsHandler.getWrapperClassname());\n        this.optionsHandler.getVariant()  && this.component?.getElement().classList.add(\"dg-chip--\" + this.optionsHandler.getVariant())\n        this.optionsHandler.getChipStatus()  && this.component?.getElement().classList.add(\"dg-chip--\" + this.optionsHandler.getChipStatus())\n        \n        if(this.optionsHandler.getVariant() === \"filled\"){\n            const element = this.component?.getElement();\n            element && ( element.style.backgroundColor = this.optionsHandler.getChipColor()!);\n        }\n    }\n\n    private getOwnerState() : OwnerStateType {\n        const selected = this.chipStateHandler.isSelected();\n        const disabled = this.optionsHandler.isDisabled();\n        const readOnly = this.optionsHandler.isReadOnly();\n        return {\n            selected,\n            disabled,\n            readOnly\n        }\n    }\n    onClick(event : PointerEvent | KeyboardEvent): void {\n        this.chipStateHandler.toggleSelection();\n        const params = this.createClickEventParams(event);\n        this.optionsHandler.onClick?.(params);\n    }\n\n\n    onRemove(event :KeyboardEvent): void {\n        event.stopPropagation();\n        const params = this.createClickEventParams(event);\n        this.optionsHandler.onRemove(params);\n    }\n\n\n    destroy(): void {\n        this.disableTooltip();\n        this.component?.destroy();\n        super.destroy();\n        // this.component = null;    \n    }\n\n    private createClickEventParams(event : PointerEvent | KeyboardEvent) : ChipEventParams {\n        const ownerState = this.getOwnerState();\n        return {\n            event,\n            selected : ownerState.selected,\n            key : this.optionsHandler.getLabel(),\n            label : this.optionsHandler.getLabel(),\n            api : this.api,\n        }\n    }\n\n    getProperty() {\n        return {\n            href : this.optionsHandler.getHref(),\n            hrefTarget : this.optionsHandler.getHrefTarget(),\n            label : this.optionsHandler.getLabel(),\n            wrapperClassname : this.optionsHandler.getWrapperClassname(),\n            getThumbnailRenderer:()=>this.optionsHandler.getThumbnailRenderer(),\n            getThumbnailIconId:()=>this.optionsHandler.getThumbnailIconId(),\n            getUserThumbnailRendererParams:()=>this.optionsHandler.getUserThumbnailRendererParams(),\n            getRemoveIconId:()=>this.optionsHandler.getRemoveIconId(),\n            getRemoveIconRenderer:()=>this.optionsHandler.getRemoveIconRenderer(),\n            getUserRemoveIconRendererParams:()=>this.optionsHandler.getUserRemoveIconRendererParams(),\n            isLabelasDOM : this.optionsHandler.isLabelasDOM(),\n            \n        }\n    }\n\n    getElement():HTMLElement | undefined{\n        return this.component?.getElement();\n    }\n\n    updateBgColor(color:string){\n        if(this.optionsHandler.getVariant() === \"filled\"){\n            const element = this.component?.getElement();\n            element && ( element.style.backgroundColor = color);\n        }\n    }\n\n    enableTooltip(): void {\n\t\tconst shouldShowTooltip =  this.optionsHandler.shouldShowTooltip()\n\t\tif(!shouldShowTooltip){\n\t\t\treturn;\n\t\t}\n\t\tthis.chipTooltipHandler.createToolTip(this.component?.getChipLabel() as HTMLElement);\n\t\t// this.chipTooltipHandler.openToolTip();\n\t}\n    disableTooltip(): void {\n        this.chipTooltipHandler.destroyTooltip();\n    }\n\n\n    updateColor():void{\n        const element =  this.component?.getElement();\n        const color = this.optionsHandler.getChipColor();\n        if(element && color ){\n            element.style.backgroundColor =  color;\n        }\n        // element && this.optionsHandler.getChipColor() && ( element.style.backgroundColor = this.optionsHandler.getChipColor());\n    }\n\n    updateLabel():void{\n        const element =  this.component?.getChipLabel();\n        element && ( element.textContent = this.optionsHandler.getLabel());\n    }\n     \n\n\n}","import { PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { ChipRootController } from \"./chip-root-controller\";\nimport { ChipComponentType } from \"./chip-root.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getChipUtilityClass } from \"./chip-root-classes\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tlabelWrapper    : {\n            slot     : 'label-wrapper',\n            modifiers: []\n        },\n\t};\n\n\treturn composeClasses(slots, getChipUtilityClass);\n};\n\n\nconst rootTemplate = (props: any): HTMLElement => {\n    const { href, label } = props;\n    const labelValue = label;\n    const classes = useUtilityClasses();\n  \n    const wrapper = document.createElement(href ? 'a' : 'div');\n    // Optionally, if you want to apply the wrapper classname:\n    // wrapper.className = props.wrapperClassname;\n  \n    // Prefix: chip-thumbnail\n    if (\n      props.getThumbnailRenderer() ||\n      props.getThumbnailIconId() ||\n      props.getUserThumbnailRendererParams()\n    ) {\n      const prefixElem = document.createElement('div');\n      prefixElem.className = \"dg-chip__prefix-elem\";\n      const chipThumbnail = document.createElement('chip-thumbnail');\n      prefixElem.appendChild(chipThumbnail);\n      wrapper.appendChild(prefixElem);\n    }\n  \n    // Label wrapper with chip label\n    const labelWrapper = document.createElement('div');\n    labelWrapper.className = classes.labelWrapper;\n    labelWrapper.setAttribute('ref', 'chip-label');\n  \n    const labelSpan = document.createElement('span');\n    labelSpan.className = \"dg-chip__label\";\n    if (props.isLabelasDOM) {\n      // Insert HTML safely without using innerHTML\n      const fragment = document.createRange().createContextualFragment(labelValue);\n      labelSpan.appendChild(fragment);\n    } else {\n      labelSpan.textContent = labelValue;\n    }\n    labelWrapper.appendChild(labelSpan);\n    wrapper.appendChild(labelWrapper);\n  \n    // Suffix: chip-remove\n    if (\n      props.getRemoveIconId() ||\n      props.getRemoveIconRenderer() ||\n      props.getUserRemoveIconRendererParams()\n    ) {\n      const suffixElem = document.createElement('div');\n      suffixElem.className = \"dg-chip__suffix-elem\";\n      const chipRemove = document.createElement('chip-remove');\n      suffixElem.appendChild(chipRemove);\n      wrapper.appendChild(suffixElem);\n    }\n  \n    return wrapper;\n  };\n  \n\n\nexport class ChipRootView extends Component {\n\n    private appendTo : HTMLElement | null | undefined;\n    @queryAssignedNodes('chip-label') chipLabel !: HTMLElement;\n\n    constructor(appendTo : HTMLElement | null | undefined) {\n        super();\n        this.appendTo = appendTo;\n    } \n\n    @PostConstruct()\n    init() : void {\n\n        const component : ChipComponentType = {\n            addOrRemoveCssClassName : (className : string) =>  this.addOrRemoveCssClassName(className),\n            getElement : () => this.getGui(),\n            destroy : () => this.destroy(),\n            getChipLabel:()=>this.getChipLabel(),\n        }\n\n        const controller = this.createBean(new ChipRootController());\n        \n        const props = controller.getProperty();\n\n        this.setTemplate(rootTemplate(props));\n\n        controller.setComponent(component);\n\n        this.appendTo && this.appendElementIntoUserDom();\n    }\n\n    private addOrRemoveCssClassName(className : string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n            if (this.appendTo && eGui.parentNode === this.appendTo) {\n                this.appendTo.removeChild(eGui);\n            }\n\t\t\tthis.appendTo = null;\n\t\t});\n\t}\n\n    destroy(): void {\n        super.destroy();\n        this.getGui().remove();  \n    }\n\n    getChipLabel():HTMLElement{\n        return this.chipLabel;\n    }\n}","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { ChipOptionsHandlerTypes } from \"../model/chip-options-handler.types\";\nimport { ChipThumbnailComponentType } from \"./chip-thumbnail.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getChipUtilityClass } from \"../chip-root/chip-root-classes\";\nimport { ChipBeanConstants } from \"../../constants/chip-constants\";\nimport { ChipStateHandlerType } from \"../model/chip-state-handler.types\";\nimport { ChipRenderedTypes } from \"../user-component/chip-renderer-types\";\nimport { ComponentItemType } from \"../../../../utility/component-detail.types\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\nimport { ChipAPITypes } from \"../model/chip-api.types\";\nimport { ChipUserComponentHandlerType } from \"../model/chip-user-component-handler.types\";\nimport { OwnerStateType } from \"../chip-ownerstate.types\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot : {\n            slot     : 'thumbnail',\n            modifiers: []\n        }\n\t};\n\n\treturn composeClasses(slots, getChipUtilityClass);\n};\n\nexport class ChipThumbnailController extends AbstractController<ChipThumbnailComponentType> {\n    \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionsHandler !: ChipOptionsHandlerTypes;\n    @AutoWired(ChipBeanConstants.CHIP_STATE) private chipStateHandler !: ChipStateHandlerType;\n    @AutoWired(ChipBeanConstants.CHIP_API) private chipAPI !: ChipAPITypes;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) private userComponentHandler !: ChipUserComponentHandlerType;\n\n    init(): void {\n        this.applyClasses();\n        this.registerEvents();\n        this.setRendererDetails();\n    }   \n\n    private registerEvents() : void {\n        this.addListener(this.eventHandler, \"EVENT_STATE_UPDATED\", this.refresh.bind(this))\n    }\n\n    private refresh() : void { \n        // console.log(\"updateUi\");\n    }\n\n    private applyClasses() : void { \n        const classes = useUtilityClasses();\n        this.component?.addOrRemoveCSSClass(classes.root);\n    }\n\n    private getOwnerState() : OwnerStateType {\n        const selected = this.chipStateHandler.isSelected();\n        const disabled = this.optionsHandler.isDisabled();\n        const readOnly = this.optionsHandler.isReadOnly();\n        return {\n            selected,\n            disabled,\n            readOnly\n        }\n    }\n\n    private setRendererDetails() : void {\n        const wrapper = this.createWrapper<ICustomRenderer>();\n        const params = this.createRendererParams();\n\n        const renderDetails = this.userComponentHandler.getThumbnailChipRendererDetails(wrapper, params);\n        renderDetails &&  this.component?.setRendererDetails(renderDetails);\n    }\n\n    private createWrapper<T>() : ComponentItemType<T> {\n        return {\n            getRenderer : () => this.optionsHandler.getThumbnailRenderer() as T,\n            getRendererParams : () => this.optionsHandler.getUserThumbnailRendererParams()\n        }\n    }\n\n    private createRendererParams() : ChipRenderedTypes {\n        const ownerState = this.getOwnerState();\n        return {\n            selected : ownerState.selected,\n            readonly : ownerState.readOnly,\n            disabled : ownerState.disabled,\n            api : this.chipAPI,\n            iconID : this.optionsHandler.getThumbnailIconId() ?? '',\n            parentElement : this.component?.getElement() ?? null,\n        }\n    }\n}","import { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { ChipThumbnailController } from \"./chip-thumbnail-controller\";\nimport { ChipThumbnailComponentType } from \"./chip-thumbnail.types\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\n\nconst thumbnailTemplate = () => {\n    const thumbnailWrapper = document.createElement(\"div\");\n    thumbnailWrapper.className = \"chip-thumbnail-wrapper\";\n    return thumbnailWrapper;\n}\nexport class ChipThumbNailView extends Component {\n    \n    private renderer !: ICustomRenderer;\n    private rendererElement !: HTMLElement | null;\n\n    @PostConstruct()\n    init() : void { \n        const component : ChipThumbnailComponentType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails: (rendererDetails: IComponentDetails) => this.setRendererDetails(rendererDetails),\n        }\n        this.setTemplate(thumbnailTemplate());\n        const controller = this.createManagedBean(new ChipThumbnailController());\n        controller.setComponent(component);\n    }\n\n    private setRendererDetails(renderDetails : IComponentDetails){\n        if(renderDetails){\n            this.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = renderDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcallback(componentInstance);\n\t\t\t}\n        }\n    }\n\n    private afterRenderer(renderer: ICustomRenderer) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n    private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n    private addOrRemoveCSSClass(className : string){\n        const element = this.getGui();\n        element.className = className;\n    }    \n}","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { IChipConfiguration } from \"../../../chip-configuration.types\";\nimport { ChipAPITypes } from \"./chip-api.types\";\nimport { ChipBeanConstants } from \"../../constants/chip-constants\";\nimport { ChipOptionsHandlerTypes } from \"./chip-options-handler.types\";\nimport { ChipControllerHandlerType } from \"./chip-controller-handler.types\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\n@Bean(ChipBeanConstants.CHIP_API)\nexport class ChipAPI extends EventEmitter implements ChipAPITypes {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionHandler !: ChipOptionsHandlerTypes\n    @AutoWired(ChipBeanConstants.CHIP_CONTROLLER_HANDLER) controllerHandler!: ChipControllerHandlerType;\n    @AutoWired('configuration') configuration!: IChipConfiguration;\n\n    updateConfiguration(configuration: IChipConfiguration): void {\n        this.optionHandler.updateConfiguration(configuration);\n    }\n\n    destroyComponent() : void {\n        const controller = this.controllerHandler.getChipCtrl();\n        if(controller) {\n            controller.destroy();\n        }\n        this.context.destroy();\n    }\n\n    getElement(): HTMLElement | undefined {\n        return this.controllerHandler.getChipCtrl().getElement();\n    }\n    \n    updateBgColor(color : string) :void{\n        this.controllerHandler.getChipCtrl().updateBgColor(color);\n    }\n\n    updateProperties(properties : IChipConfiguration) : void {\n\n        Object.entries(properties).forEach(([key, value]) => {\n            if (value !== undefined) {\n                // Update the configuration\n                (this.configuration as Record<string, unknown>)[key] = value;\n    \n                // Dispatch different events based on the property being updated\n                switch (key) {\n                    \n                    case \"tooltip\":\n                        this.dispatchEvent({\n                            type: \"Tooltip_Property_Changed\",\n                            options: { [key]: value },\n                        });\n                        break;\n                    \n                    case \"label\" : \n                        this.dispatchEvent({\n                            type: \"Label_Property_Changed\",\n                            options: { [key]: value },\n                        });\n                        break;\n\n                    case \"chipColor\" : \n                        this.dispatchEvent({\n                            type: \"ChipColor_Property_Changed\",\n                            options: { [key]: value },\n                        });\n                        break;\n\n                    // Add additional cases for other properties as needed\n                    // default:\n                    //     this.dispatchEvent({\n                    //         type: \"PROPERTY_CHANGED\",\n                    //         options: { [key]: value },\n                    //     });\n                    //     break;\n            }\n            }\n        });\n    }\n\n    getFormattedValue() : any {\n        return this.optionHandler.getLabel() ?? '';\n    }\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Bean } from \"@dg/corecomponent\";\nimport { ChipBeanConstants } from \"../../constants/chip-constants\";\nimport { ChipRootController } from \"../chip-root/chip-root-controller\";\nimport { ChipControllerHandlerType } from \"./chip-controller-handler.types\";\n\n@Bean(ChipBeanConstants.CHIP_CONTROLLER_HANDLER)\nexport class ChipControllerHandler extends EventEmitter implements ChipControllerHandlerType {\n    private chipCtrl !: ChipRootController;\n    registerCtrl(chipCtrl : ChipRootController) : void {\n        this.chipCtrl = chipCtrl;\n    }\n\n    getChipCtrl() : ChipRootController {\n        return this.chipCtrl;\n    }\n}\n\n\n","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { rendererTypes } from \"../../renderer.types\";\nimport { ChipEventParams, ChipOptionsHandlerTypes } from \"./chip-options-handler.types\";\nimport { ChipBeanConstants } from \"../../constants/chip-constants\";\nimport { ChipBorderStyle, ChipStatusType, ChipTargetType, IChipConfiguration, chipRadiustype, chipVariantType } from \"../../../chip-configuration.types\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Position } from \"../../../../utility/PopupHandler/CorePopupHandler\";\nimport { ClipboardConfig } from \"../../../../utility/clipboard\";\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class ChipOptionHandler extends EventEmitter implements ChipOptionsHandlerTypes{\n\n    @AutoWired(ChipBeanConstants.CHIP_CONFIGURATION) configuration !: IChipConfiguration;\n\n    isDisabled(): boolean {\n        return this.configuration.disabled ?? false;\n    }\n    isReadOnly(): boolean {\n        return this.configuration.readOnly ?? false;\n    }\n    getLabel(): string {\n        return this.configuration.label ?? \"\";\n    }\n    getAriaLabel(): string {\n        return this.configuration.ariaLabel ?? '';\n    }\n    getThumbnailRenderer(): rendererTypes {\n        return this.configuration.thumbnailRenderer\n    }\n    getUserThumbnailRendererParams() {\n        return this.configuration.userThumbnailRendererParams;\n    }\n    getThumbnailIconId(): string |null {\n        return this.configuration.thumbnailIconId ?? null;\n    }\n    getRemoveIconRenderer(): rendererTypes {\n        return this.configuration.removeIconRenderer;\n    }\n    getUserRemoveIconRendererParams():any {\n        return this.configuration.userRemoveIconRendererParams;\n    }\n    getRemoveIconId(): string |null {\n        return this.configuration.removeIconId ?? null;\n    }\n    onFocus(event: FocusEvent): void  {\n        this.configuration.onFocus?.(event);\n    }\n    onBlur(event: FocusEvent): void {\n        this.configuration.onBlur?.(event);\n    }\n    onClick(event: ChipEventParams): void  {\n         this.configuration.onClick?.(event);\n    }\n    onRemove(params: ChipEventParams): void {\n         this.configuration.onRemove?.(params);\n    }\n    getTemplate(): CallableFunction | null{\n        return this.configuration.template ?? null;\n    }\n    getAppendTo(): HTMLElement | null {\n        return this.configuration.appendTo ?? null;\n    }\n    getAriaLabelledby(): string {\n        return this.configuration.ariaLabelledby ?? '';\n    }\n    isSkipFocusWhenDisabled(): boolean {\n        return this.configuration.skipFocusWhenDisabled ?? false;\n    }\n    getRadius(): chipRadiustype {\n        return this.configuration.radius ?? 'large'\n    }\n    getVariant(): chipVariantType {\n       return this.configuration.variant ?? \"filled\"; \n    }\n    getBorderStyle(): ChipBorderStyle {\n        return this.configuration.borderStyle ?? 'solid'\n    }\n    isRequired(): boolean {\n        return false;\n    }\n\n    updateConfiguration(config: IChipConfiguration): void {\n        this.configuration = config;\n\n        this.dispatchEvent({ type : 'PROPERTY_CHANGED'})\n    }\n\n    getSelection() : boolean { \n        return this.configuration.selected ?? false;\n    }\n\n    getTabIndex(): number {\n        return this.configuration.tabindex ?? 0;\n    }\n\n    getRole(): string {\n        return this.configuration.role ?? 'button';\n    }\n\n    getHref(): string {\n        return this.configuration.href ?? '';\n    }\n\n    getHrefTarget(): ChipTargetType {\n        return this.configuration.hrefTarget ?? \"_blank\";\n    }\n\n    getChipStatus() : ChipStatusType {\n        return this.configuration.chipStatus ?? 'default';\n    }\n\n    getChipColor(): string | null {\n        return this.configuration.chipColor ?? null;\n    }\n\n    getWrapperClassname(): string {\n        return this.configuration.wrapperClassname ?? \"\";\n    }\n\n    shouldShowTooltip(): boolean {\n        return this.configuration.tooltip?? false;\n    }\n\n    getTooltipMessage(): string  {\n        return this.configuration.tooltipMessage && this.configuration.tooltipMessage.trim() !== \"\" \n        ? this.configuration.tooltipMessage \n        : this.configuration.label ?? \"\";\n    }\n\n    getTooltipRegex(): RegExp | undefined {\n        return this.configuration.tooltipRegex;\n    }\n\n    getTooltipPosition(): string  {\n        return this.configuration.tooltipPosition ?? Position.bottomRight;\n    }\n\n    getTooltipAppendto(): HTMLElement | undefined {\n        return this.configuration.tooltipAppendto ?? document.body;\n    }\n\n    getTooltipHideDelay(): number  {\n        return this.configuration.tooltipHideDelay ?? 10000;\n    }\n\n    isLabelasDOM():boolean{\n        return this.configuration.labelasDom ?? false;\n    }\n\n    getClipboard(): ClipboardConfig {\n        return this.configuration.clipboard;\n    }\n\n}","import { AutoWired, BEAN_NAME, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ChipBeanConstants } from \"../../constants/chip-constants\";\nimport { ChipOptionsHandlerTypes } from \"./chip-options-handler.types\";\nimport { ChipStateHandlerType } from \"./chip-state-handler.types\";\n\n@Bean(ChipBeanConstants.CHIP_STATE)\nexport class ChipStateHandler extends EventEmitter implements ChipStateHandlerType { \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) chipOptionHandler !: ChipOptionsHandlerTypes\n    private selected : boolean = false;\n\n    @PostConstruct()\n    init() {\n        this.selected = this.chipOptionHandler.getSelection();\n    }\n\n    setSelection(selected: boolean) : void {\n        this.selected = selected;\n        this.dispatchEvent({ type : \"EVENT_STATE_UPDATED\"})\n    }\n\n    isSelected() : boolean {\n        return this.selected;\n    }\n\n    toggleSelection() : void { \n        this.setSelection(!this.selected);\n    }\n}","import {  Bean } from \"@dg/corecomponent\";\nimport { ChipTooltipHandlerType } from \"./chip-tooltip-handler.types\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Tooltip } from \"../../../../Tooltip/src/Tooltip\";\nimport { ChipBeanConstants } from \"../../constants/chip-constants\";\nimport { TooltipTriggerStates } from \"../../../../Tooltip/src/Constants/DefaultTooltipValues\";\nimport { ITooltipConfiguration } from \"../../../../Tooltip/src/Interface/ITooltipConfiguration\";\n\n\n\n@Bean(ChipBeanConstants.CHIP_TOOLTIP_HANDLER)\nexport class ChipTooltipHandler extends EventEmitter implements ChipTooltipHandlerType {\n    private tooltipComponent: any | null = null;\n    // private tooltipTimeoutId: number | null = null;\n    // private openState: boolean = false;\n\n\n    createToolTip(Component: HTMLElement): void {\n        if (this.tooltipComponent) {\n            this.destroyTooltip();\n\n        }\n        const tooolTipConfiguration  : ITooltipConfiguration = {\n            popupParent: this.optionsHandler.getTooltipAppendto(),\n            tooltipValue: this.optionsHandler.getTooltipMessage(),\n            shouldShowTooltip: () => true,\n            shouldAttachEvents: true,\n            position: this.optionsHandler.getTooltipPosition(),\n            gapX: 9,\n            gapY: 7,\n            tooltipHoverPosition: false,\n            hideTooltip : false,\n            tooltipTrigger      : TooltipTriggerStates.HOVER,\n            tooltipShowDelay : 0\n        }\n\n        this.tooltipComponent = new Tooltip(Component, tooolTipConfiguration);\n    }\n\n    openToolTip(): void {\n        // if (this.openState) {\n        //     this.destroyTooltip();\n        //     this.openState = false;\n        // }\n\n        // if (!this.tooltipComponent) {\n        //     return;\n        // }\n\n        // this.tooltipComponent.api.open();\n        // this.openState = true;\n        // // const tooltipDelay = this.optionsHandler.getTooltipHideDelay();\n\n        // if (this.tooltipTimeoutId) {\n        //     clearTimeout(this.tooltipTimeoutId);\n        //     this.tooltipTimeoutId = null;\n        // }\n\n        // this.tooltipTimeoutId = window.setTimeout(() => {\n        //     this.destroyTooltip();\n        //     this.tooltipTimeoutId = null;\n        // }, tooltipDelay);\n    }\n\n    destroyTooltip(): void {\n        if (!this.tooltipComponent) {\n            return;\n        }\n\n        this.tooltipComponent.api.destroy();\n        // this.openState = false;\n        // this.tooltipComponent = null;\n        // if (this.tooltipTimeoutId) {\n        //     clearTimeout(this.tooltipTimeoutId);\n        //     this.tooltipTimeoutId = null;\n        // }\n    }\n}","import { BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { ChipUserComponentHandlerType } from \"./chip-user-component-handler.types\";\nimport { ComponentItemType, IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { AbstractUserComponentHandler } from \"../../../../utility/abstract-user-component-handler\";\nimport { ComponentMetadata } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\n\nexport const enum PropertyName {\n\tTHUMBNAIL_CHIP_RENDERER = 'thumbnailChipRenderer',\n    REMOVE_CHIP_RENDERER = 'removeChipRenderer'\n}\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class ChipUserComponentHandler extends AbstractUserComponentHandler implements ChipUserComponentHandlerType {\n    getThumbnailChipRendererDetails<T, P>(rendererWrapper: ComponentItemType<T>, params: P): IComponentDetails | undefined {\n       return this.getComponentDetails(rendererWrapper, PropertyName.THUMBNAIL_CHIP_RENDERER, params, PropertyName.THUMBNAIL_CHIP_RENDERER);\n    }\n    getRemoveChipRendererDetails<T, P>(rendererWrapper: ComponentItemType<T>, params: P): IComponentDetails | undefined{\n        return this.getComponentDetails(rendererWrapper, PropertyName.REMOVE_CHIP_RENDERER, params, PropertyName.REMOVE_CHIP_RENDERER);\n    }\n\n    protected newInstance<T, P>( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: string, params?: P, ) {\n        let instance: T;\n        const frameworkComponentWrapper = this.getBeanInstance( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n        const componentMetaDataProvider = this.getBeanInstance( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n        if (!componentFrameWork) {\n            instance = new component();\n        } else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n            instance = frameworkComponentWrapper.wrap(\n                component,\n                componentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n                componentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n            );\n        }\n\n        const initialise = this.initComponent(instance, params);\n        if (initialise === undefined) {\n            return instance;\n        }\n        \n        return instance;\n    }\n\n    getComponent<T>(item: ComponentItemType<T>, propertyName: string): T {\n        switch(propertyName) {\n            case PropertyName.REMOVE_CHIP_RENDERER:\n                return item.getRenderer();\n            case PropertyName.THUMBNAIL_CHIP_RENDERER:\n                return item.getRenderer();\n            default :  throw new Error(`Unknown propertyName: ${propertyName}`); \n        }\n    }\n\n    getUserParams<T, P>(item: ComponentItemType<T>, propertyName: string, params: any) {\n        switch(propertyName) {\n            case PropertyName.THUMBNAIL_CHIP_RENDERER:\n                return  this.getUserRendererParams<T, P>(item, params);\n            case PropertyName.REMOVE_CHIP_RENDERER:\n                return this.getUserRendererParams<T,P>(item, params);\n        }\n    }\n    \n}","import { composeClasses } from \"@dg/utils\";\n// import { createSVGTemplate, CreateSVGClassType } from \"../../../../utility/create-svg-template\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\nimport { ChipRenderedTypes } from \"./chip-renderer-types\";\nimport { getChipUtilityClass } from \"../chip-root/chip-root-classes\";\nimport { getSvgIcon } from \"../../../../utility/create-svg-template\";\n\nconst useUtilityClasses = () => {\n    const slots = {\n        icon : {\n            slot : 'remove-icon',\n            modifiers : []\n        },\n        svg : {\n            slot : 'remove-svg',\n            modifiers : []\n        }\n    }\n\n    return composeClasses(slots, getChipUtilityClass);\n}\n\n interface CreateSVGClassType{\n    icon : string,\n    svg : string\n}\n\nconst ChipIconTemplate = (params : ChipRenderedTypes |null , classes : CreateSVGClassType) => {\n    const div = document.createElement(\"span\");\n    params && ( div.innerHTML = getSvgIcon(\"remove-icon\" , classes));\n    return div.firstChild as HTMLElement;\n}\n\nexport class ChipIconRenderer implements ICustomRenderer {\n    private params !: ChipRenderedTypes | null ;\n    init(params: ChipRenderedTypes): void {\n        this.params = params;\n    }\n    getElement(): HTMLElement {\n        const classes = useUtilityClasses();\n        return ChipIconTemplate(this.params, classes);\n    }\n    destroy(): void {\n       this.params = null;\n    }\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","export const DATETIME_BEAN_NAME = {\n\tDATETIME_API               : 'dateTimeApi',\n\tDATETIME_CONFIGURATION     : 'configuration',\n\tCSSCLASSNAMEGENERATOR      : 'CSSClassNameGenartor',\n\tKEYBOARD_SHORTCUT_HANDLER  : 'KeyBoardShortCutsHandler',\n\tDATETIME_EVENT_HANDLER     : 'dateTimeEventHandler',\n\tDATETIME_CONTROLLER_HANDLER: 'dateTimeControllerHandler',\n\tDATETIME_MODEL             : 'dateTimeModel',\n\tDATETIME_INPUT_HANDLER     : 'dateTimeInputHandler',\n\tDATE_PICKER_INTERACTOR : 'dateTimePickerInteractor',\n};\n\n\nexport const DATE_TIME__BEAN_NAME ={\n\tDATE_TIME_PICKER_STATE_MANAGER: 'dateTimePickerStateManager',\n\tDATE_TIME_MODEL               : 'dateTimeModel',\n\tDATE_TIME_PLACEHOLDER_MANAGER :'dateTimePlaceholderManager',\n\tDATE_TIME_SELECTION_SERVICE   : 'dateTimeSelectionService'\n\n}","export const EVENT_NAME = {\n    KEYDOWN  : 'keydown',\n    FOCUS    : 'focus',\n    BLUR     : 'blur',\n    MOUSEDOWN: 'mousedown',\n    CLICK    : 'click'\n}\n\n\nexport const DATE_TIME_CUSTOM_EVENTS = {\n    UPDATE_CALENDAR      : 'UPDATE_CALENDAR',\n    DESTROY_CALENDAR     : 'DESTROY_CALENDAR',\n    CREATE_CALENDAR      : 'CREATE_CALENDAR',\n    PROPERTY_CHANGED     : 'PROPERTY_CHANGED',\n    VALUE_CHANGED        : 'VALUE_CHANGED',\n    UPDATE_FORMAT        : 'UPDATE_FORMAT',\n    FORMAT_UPDATED       : 'FORMAT_UPDATED',\n    CLEAR_VALUE_IN_PICKER: 'CLEAR_VALUE_IN_PICKER',\n    SYNC_PLACEHOLDER     : 'SYNC_PLACEHOLDER',\n\n}\n\n// Type-safe event constants for internal use\nexport const INTERNAL_EVENTS = {\n    VALUE_UPDATE: 'EVENT_VALUE_UPDATE',\n    MAKE_SELECTION: 'EVENT_MAKE_SELCTION',\n    MAKE_SELECTION_ONCLICK: 'EVENT_MAKE_SELCTION_ONCLICK',\n    VALUE_UPDATE_BY_DATEPICKER: 'EVENT_VALUE_UPDATE_BY_DATEPICKER',\n    INCREMENT_UPDATED: 'EVENT_INCREMENT_UPDATED',\n    DECREMENT_UPDATED: 'EVENT_DECREMENT_UPDATED',\n    FOCUS_CONTAINER: 'FOCUS_CONTAINER',\n    FOCUS_IN: 'EVENT_FOCUS_IN',\n    FOCUS_OUT: 'EVENT_FOCUS_OUT'\n} as const;\n\nexport type InternalEventType = typeof INTERNAL_EVENTS[keyof typeof INTERNAL_EVENTS];","\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport {  CalendarIconReadOnlyViewType } from \"./datefield-icon-view.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { PopupHandler } from \"../model/popup-handler\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimePickerStateManagerType } from \"../model/date-picker-state-manager.types\";\nimport { DateTimeModelType } from \"../model/date-time-model.types\";\nimport { DateTimeControllerHandlerType } from \"../model/date-time-controller.type\";\n\nexport class CalendarIconReadonlyController extends AbstractController<CalendarIconReadOnlyViewType>{\n\n    @AutoWired(BEAN_NAME.POPUP_HANDLER) protected popupHandler !: PopupHandler;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_MODEL) protected model !: DateTimeModelType;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_PICKER_STATE_MANAGER) protected stateManager !: DateTimePickerStateManagerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_CONTROLLER_HANDLER) controllerHandler !: DateTimeControllerHandlerType;\n\n    \n   init(){\n    this.registerListeners();\n    this.applyClassNames();\n    this.setTabindex();\n    // this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.UPDATE_CALENDAR, this.setDate.bind(this));\n    // this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.DESTROY_CALENDAR, (params : any) => this.destroyCalendar(params.event));\n    // this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.CREATE_CALENDAR, this.createCalendar.bind(this));\n    }\n\n    private setTabindex(){\n        const element = this.component?.getElement() as HTMLElement;\n        element.setAttribute('tabindex','0');\n    }\n\n    private applyClassNames(){\n        this.component?.addOrRemoveCssClass(\"dg-datepicker__icon\");\n    }\n\n\n    private registerListeners(){\n        const element = this.component?.getElement() as HTMLElement;\n\n            this.addListener(element, \"click\",()=>{\n\n\n                this.optionsHandler.onPickerOpen();\n                // if(this.stateManager.getState()){\n                //     this.destroyCalendar()\n                //     return\n                    \n                // }else{\n                //     this.createCalendar();\n                // }\n               \n            })\n\n    }\n\n    // private  createCalendar():void{\n    //     if (this.calendar) {\n    //         // this.destroyCalendar();\n    //         return\n    //     } \n    //     else {\n    //         const calendarParams :ICalendarConfiguration = { \n    //             appendTo      : this.optionsHandler.getDatePickerAppendTo(),\n    //             initialDate   : this.model.getValue(),\n    //             monthFormat   : 'MMM',\n    //             format        : this.optionsHandler.getFormat(),\n    //             ariaLabelledby: this.optionsHandler.getAriaLabelledby(),\n    //               // className     : this.optionsHandler.getClassName(),\n    //               // pickerType :  this.optionsHandler.getPickerType(),\n    //             hourCycle        : this.optionsHandler.getHourCycle(),\n    //             showAdjacentDates: false,\n    //             showTimePicker   : this.optionsHandler.getShowTimePicker(),\n    //             onChange         : (value:any)=>{\n    //                                 this.model.setValue(value);\n    //                                 this.dispatchEvent({type: 'EVENT_VALUE_UPDATE_BY_DATEPICKER'});\n    //                                 const inputElement =  this.controllerHandler.getDateTimeFieldController().getInputElement();\n    //                                 inputElement.focus();\n    //                                 this.dispatchEvent({\n    //                                     type : 'EVENT_MAKE_SELCTION'\n    //                                 })\n\n\n\n    //                             },\n    //             onClick : (_event :MouseEvent)=>{\n    //                                 const type = this.optionsHandler.getType();\n    //                                 if(type !== 'datetimepicker'){\n    //                                     this.destroyCalendar();\n    //                                 }\n\n    //                         }         \n    //         }\n\n\n    //         this.calendar = new Calendar(calendarParams);\n    \n    //         const calendarElement = this.calendar.api.getElement();\n    //         const sourceElement = this.controllerHandler.getDateTimeFieldController().getElement() as HTMLElement;\n            \n    //         const positionParams: PopupComponentPositionParams = {\n    //             popUpElement    : calendarElement,\n    //             // sourceElement : this.optionsHandler.getAppendTo(),\n    //             sourceElement,\n    //             position        : Position.bottomLeft,\n    //             keepWithinBounds : true,\n    //             gapX : this.optionsHandler.getHorizontalSpacing(),\n    //             gapY : this.optionsHandler.getVerticalSpacing(),\n    //         };\n    \n    //         const positionCallback = this.popupHandler.positionPopupByComponent.bind(this.popupHandler, positionParams,this.optionsHandler.getDatePickerAppendTo());\n    \n    //         const addPopup = this.popupHandler.addPopup({\n    //                             childElement   : calendarElement,\n    //                             anchorToElement:sourceElement,\n    //                             // anchorToElement: this.component?.getElement() as HTMLElement,\n    //                             popupParentElement: this.optionsHandler.getDatePickerAppendTo(),\n    //                             positionCallback,\n    //                             ariaLabel : ''\n    //                         });\n    //         this.popupDestroy = addPopup.hideFunction;\n\n    //     }\n    //     this.stateManager.setState(true);\n\n\n    // };\n\n    // setDate(){\n    //     const date = this.model.getDateAsDayjs();\n    //     this.calendar && this.calendar.api.setDate(date)\n    // }\n\n    // destroyCalendar(event ?: Event){\n    //     if(this.calendar){\n    //         this.calendar.api.destroy();\n    //         this.popupDestroy();\n    //         this.calendar = null;\n    //         this.stateManager.setState(false);\n    //         if(event) { // need to check with implementation\n    //             // event.preventDefault();\n    //             // event.stopPropagation();\n    //         }\n\n    //     }\n      \n\n    // }\n    \n\n\n}","\nimport { PostConstruct } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { CalendarIconReadOnlyViewType } from './datefield-icon-view.types';\nimport { CalendarIconReadonlyController } from './calendar-icon-controller';\n\n\n\nfunction CalendarIconViewTemplate(): HTMLElement {\n    const div = document.createElement('div');\n\n    const svgNS = \"http://www.w3.org/2000/svg\";\n    const svg = document.createElementNS(svgNS, \"svg\");\n    svg.setAttribute(\"viewBox\", \"0 0 20 20\");\n    svg.classList.add(\"dg-datepicker__icon-svg\");\n\n    const gLayer = document.createElementNS(svgNS, \"g\");\n    gLayer.setAttribute(\"data-name\", \"Layer 2\");\n\n    const gFill = document.createElementNS(svgNS, \"g\");\n    gFill.setAttribute(\"data-name\", \"Fill Icon\");\n\n    const path1 = document.createElementNS(svgNS, \"path\");\n    path1.setAttribute(\"d\", \"M14.38 2.25H5.62a3.37 3.37 0 0 0-3.37 3.37v8.76a3.37 3.37 0 0 0 3.37 3.37h8.76a3.37 3.37 0 0 0 3.37-3.37V5.62a3.37 3.37 0 0 0-3.37-3.37Zm0 14H5.62a1.87 1.87 0 0 1-1.87-1.87V5.62a1.87 1.87 0 0 1 1.87-1.87h8.76a1.88 1.88 0 0 1 1.84 1.54.78.78 0 0 0-.22 0H6a.75.75 0 0 0 0 1.5h10a.7.7 0 0 0 .25 0v7.68a1.87 1.87 0 0 1-1.87 1.78Z\");\n\n    const rect1 = document.createElementNS(svgNS, \"rect\");\n    rect1.setAttribute(\"x\", \"10.55\");\n    rect1.setAttribute(\"y\", \"12.56\");\n    rect1.setAttribute(\"width\", \"2\");\n    rect1.setAttribute(\"height\", \"2\");\n    rect1.setAttribute(\"rx\", \".38\");\n\n    const rect2 = rect1.cloneNode() as SVGRectElement;\n    rect2.setAttribute(\"x\", \"7.55\");\n\n    const rect3 = rect1.cloneNode() as SVGRectElement;\n    rect3.setAttribute(\"y\", \"9.56\");\n\n    const rect4 = rect3.cloneNode() as SVGRectElement;\n    rect4.setAttribute(\"x\", \"7.55\");\n\n    const path2 = document.createElementNS(svgNS, \"path\");\n    path2.setAttribute(\"fill\", \"none\");\n    path2.setAttribute(\"d\", \"M0 0h20v20H0z\");\n\n    gFill.append(path1, rect1, rect2, rect3, rect4, path2);\n    gLayer.appendChild(gFill);\n    svg.appendChild(gLayer);\n    div.appendChild(svg);\n\n    return div;\n}\n\n\nexport class CalendarIconReadOnlyView extends Component {\n    \n\t@PostConstruct()\n\tinit(): void {\n\n\t\tconst component:CalendarIconReadOnlyViewType  = {\n\t\t\tgetElement             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n\t\t};\n\n\t\tconst controller = this.createManagedBean(new CalendarIconReadonlyController());\n\n        const template = CalendarIconViewTemplate()\n        this.setTemplate(template);\n\t\tcontroller.setComponent(component);\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprotected destroy(): void {\n        super.destroy();\n\t\tthis.getGui().remove();\n    }\n\n}","\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport {  CalendarIconViewType } from \"./datefield-icon-view.types\";\n\n// import { Calendar } from \"../../../../calendar/src/calendar\";\n// import { PopupComponentPositionParams, Position } from \"../../../../utility/PopupHandler/CorePopupHandler\";\nimport { AutoWired, BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { PopupHandler } from \"../model/popup-handler\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimePickerStateManagerType } from \"../model/date-picker-state-manager.types\";\n// import { DATE_TIME_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { DateTimeModelType } from \"../model/date-time-model.types\";\nimport { DateTimeControllerHandlerType } from \"../model/date-time-controller.type\";\n// import { ICalendarConfiguration } from \"../../../../calendar/src/calendar-configuration.types\";\nimport { DatePickerInteractor } from \"../model/date-picker-interacter\";\nimport { DATE_TIME_CUSTOM_EVENTS } from \"../../constant/event-name\";\n\nexport class CalendarIconController extends AbstractController<CalendarIconViewType>{\n\n    static CALENDAR_ICON_INSTANCE = 'calendarIconInstance'\n    @AutoWired(BEAN_NAME.POPUP_HANDLER) protected popupHandler !: PopupHandler;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_MODEL) protected model !: DateTimeModelType;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_PICKER_STATE_MANAGER) protected stateManager !: DateTimePickerStateManagerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_CONTROLLER_HANDLER) controllerHandler !: DateTimeControllerHandlerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATE_PICKER_INTERACTOR) protected datePickerInteractor !: DatePickerInteractor;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\n\n\n\n    // private calendar: any;\n    // private popupDestroy :any;\n    // private listener !: boolean;\n    \n   init(){\n    this.registerListeners();\n    this.applyClassNames();\n    // this.setTabindex();\n    this.setDisabled();\n    this.optionsHandler.setDomData(this.component?.getElement() as HTMLElement , CalendarIconController.CALENDAR_ICON_INSTANCE, this.getBeanInstanceByBeanName('instanceID'))\n    // this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.UPDATE_CALENDAR, this.setDate.bind(this));\n    // this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.DESTROY_CALENDAR, (params : any) => this.destroyCalendar(params.event));\n    // this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.CREATE_CALENDAR, this.createCalendar.bind(this));\n    this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, this.setDisabled.bind(this));\n\n    }\n\n    // private setTabindex(){\n    //     const element = this.component?.getElement() as HTMLElement;\n    //     element.setAttribute('tabindex','0');\n    // }\n\n    private applyClassNames(){\n        this.component?.addOrRemoveCssClass(\"dg-datepicker__icon\");\n    }\n\n    private setDisabled(){\n        const disabled = this.optionsHandler.isDisabled();\n        if(disabled){\n            const element = this.component?.getElement();\n            element?.setAttribute('disabled','')\n        }else{\n            const element = this.component?.getElement();\n            element?.removeAttribute('disabled')\n        }\n    }\n\n\n    private registerListeners(){\n        const element = this.component?.getElement() as HTMLElement;\n        element.addEventListener( \"click\",this.onClick.bind(this));\n\n        element.addEventListener(\"keydown\",(event)=>{\n            if(event.key === 'Enter'){\n                this.createOrDestroyCalendar();\n            }\n        })\n    }\n\n    private onClick(event : MouseEvent){\n        event.preventDefault();\n        this.createOrDestroyCalendar()\n       \n\n    }\n\n    private createOrDestroyCalendar(){\n        const isReadonly =  this.optionsHandler.isReadonly();\n        const isDisabled =  this.optionsHandler.isDisabled();\n        if(isReadonly || isDisabled) {return}\n\n        if(this.stateManager.getState()){\n            this.datePickerInteractor.destroyCalendar()\n\n            return\n                    \n        }else{\n            // this.createCalendar();\n            this.dispatchEvent({type:'FOCUS_INPUT_ELEMENT'})\n            this.datePickerInteractor.createCalendar()\n        }\n\n    }\n\n    getProperties(){\n        return {\n            type : this.optionsHandler.getType()\n        }\n    }\n\n\n    \n\n\n}","\nimport { PostConstruct } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { CalendarIconViewType } from './datefield-icon-view.types';\nimport { CalendarIconController } from './calendar-icon-controller';\nimport { getSvgIcon } from '../../../../utility/create-svg-template';\n\n\n\nfunction CalendarIconViewTemplate(props: any): HTMLElement {\n    const {type} = props;\n    \n    // Create container\n    const container = document.createElement('button');\n    \n    if (type === 'timepicker') {\n        // Create time picker icon structure\n        const timeIcon = getSvgIcon('dg__svg--time-picker', {svg : 'dg-date-picker__time-icon', icon : 'dg-date-picker__time-icon'});\n        const tempDOM = document.createElement('div');\n        tempDOM.innerHTML = timeIcon;\n        container.appendChild(tempDOM.firstChild as HTMLElement);\n        \n    } else {\n        // Create date picker icon structure\n        const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n        svg.setAttribute(\"viewBox\", \"0 0 20 20\");\n        svg.setAttribute(\"class\", \"dg-datepicker__icon-svg\");\n        \n        // Create group elements\n        const g1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n        g1.setAttribute(\"data-name\", \"Layer 2\");\n        \n        const g2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n        g2.setAttribute(\"data-name\", \"Fill Icon\");\n        \n        // Create path and rect elements\n        const path1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        path1.setAttribute(\"d\", \"M14.38 2.25H5.62a3.37 3.37 0 0 0-3.37 3.37v8.76a3.37 3.37 0 0 0 3.37 3.37h8.76a3.37 3.37 0 0 0 3.37-3.37V5.62a3.37 3.37 0 0 0-3.37-3.37Zm0 14H5.62a1.87 1.87 0 0 1-1.87-1.87V5.62a1.87 1.87 0 0 1 1.87-1.87h8.76a1.88 1.88 0 0 1 1.84 1.54.78.78 0 0 0-.22 0H6a.75.75 0 0 0 0 1.5h10a.7.7 0 0 0 .25 0v7.68a1.87 1.87 0 0 1-1.87 1.78Z\");\n        \n        const rect1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n        rect1.setAttribute(\"x\", \"10.55\");\n        rect1.setAttribute(\"y\", \"12.56\");\n        rect1.setAttribute(\"width\", \"2\");\n        rect1.setAttribute(\"height\", \"2\");\n        rect1.setAttribute(\"rx\", \".38\");\n        \n        const rect2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n        rect2.setAttribute(\"x\", \"7.55\");\n        rect2.setAttribute(\"y\", \"12.56\");\n        rect2.setAttribute(\"width\", \"2\");\n        rect2.setAttribute(\"height\", \"2\");\n        rect2.setAttribute(\"rx\", \".38\");\n        \n        const rect3 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n        rect3.setAttribute(\"x\", \"10.55\");\n        rect3.setAttribute(\"y\", \"9.56\");\n        rect3.setAttribute(\"width\", \"2\");\n        rect3.setAttribute(\"height\", \"2\");\n        rect3.setAttribute(\"rx\", \".38\");\n        \n        const rect4 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n        rect4.setAttribute(\"x\", \"7.55\");\n        rect4.setAttribute(\"y\", \"9.56\");\n        rect4.setAttribute(\"width\", \"2\");\n        rect4.setAttribute(\"height\", \"2\");\n        rect4.setAttribute(\"rx\", \".38\");\n        \n        const path2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        path2.setAttribute(\"fill\", \"none\");\n        path2.setAttribute(\"d\", \"M0 0h20v20H0z\");\n        \n        // Assemble elements\n        g2.appendChild(path1);\n        g2.appendChild(rect1);\n        g2.appendChild(rect2);\n        g2.appendChild(rect3);\n        g2.appendChild(rect4);\n        g2.appendChild(path2);\n        \n        g1.appendChild(g2);\n        svg.appendChild(g1);\n        container.appendChild(svg);\n    }\n    \n    return container;\n}\n\nexport class CalendarIconView extends Component {\n    \n\t@PostConstruct()\n\tinit(): void {\n\n\t\tconst component:CalendarIconViewType  = {\n\t\t\tgetElement             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n\t\t};\n\n\t\tconst controller = this.createManagedBean(new CalendarIconController());\n\t\tconst props = controller.getProperties()\n        const template = CalendarIconViewTemplate(props)\n        this.setTemplate(template);\n\t\tcontroller.setComponent(component);\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprotected destroy(): void {\n        super.destroy();\n\t\tthis.getGui().remove();\n    }\n\n}","import { composeClasses } from \"@dg/utils\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { DateTimeButtonComponentType } from \"./date-time-button.type\";\nimport { getDateTimeRootUtilityClass } from \"../date-time-root/date-time-root-classes\";\n\nconst useUtilityClasses = (ownerState : any) => {\n    const {disabled, role} = ownerState;\n\tconst slots = {\n\t\troot    : {\n            slot     : role,\n            modifiers: [\n                disabled && 'disabled'\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots, getDateTimeRootUtilityClass);\n};\n\nexport class DateTimeButtonController extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: any;\n    \n    private comp !: DateTimeButtonComponentType;\n\n    private ownerState : any = {disabled : null,enableStepperButtons:false};\n    setComp(comp : DateTimeButtonComponentType) : void {\n        this.comp = comp;\n        this.applyState();\n        \n\n        this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.applyState.bind(this));\n    }\n\n    private applyState() : void {\n\n        const ownerState = this.getOwnerState();\n\n        if(this.ownerState.disabled === ownerState.disabled) {\n            return;\n        }\n\n        // if(this.ownerState.enableStepperButtons === ownerState.enableStepperButtons) {\n        //     return\n\n        // }\n\n        this.ownerState = ownerState;\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCssClass(classes.root, true);\n        this.setRendererDetails();\n    }\n\n    private setRendererDetails() : void {\n        \n        const params          = this.createRendererParams();\n        const rendererWrapper = this.createRendererWrapper();\n        const compDetails     = this.userComponentHandler.getButtonRendererDetails(rendererWrapper, params);\n\n        this.comp.setRendererDetails(compDetails);\n    }\n\n    private createRendererWrapper() {\n        const {getRenderer, getRendererParams} = this.comp.getParams() ?? {};\n        return {\n\t\t\tgetRenderer          : () => getRenderer ? getRenderer() : undefined,\n\t\t\tgetUserRendererParams: () => getRendererParams ? getRendererParams() : undefined\n\t\t}\n    } \n\n    private getOwnerState() {\n        const { isDisabled, getRole , getSpinButton} = this.comp.getParams() ?? {};\n        return {\n            disabled : isDisabled(),\n            role : getRole(),\n            spinButton : getSpinButton()\n        }\n    }\n\n    private createRendererParams() {\n        const params = this.comp.getParams() ?? {};\n        return {\n            parentElement: this.comp.getElement(),\n            callback     : (event:any) => params.callback && params.callback(event),\n            icon         : params.getIcon(),\n            showIcon     : true,\n            showText     : false,\n            disabled     : params.isDisabled(),\n            readonly     : params.isReadonly(),\n            ariaLabel    : params.getRole(),\n            classes      : params.getClasses(),\n            getSvgClasses: params.getSvgClasses,\n\n\t\t};\n    }\n}","import { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { DateTimeButtonController } from \"./date-time-button-controller\";\nimport { DateTimeButtonComponentType } from \"./date-time-button.type\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\n\nconst  DateTimeButtonTemplate = (_params : any) => {\n\t// const div = document.createElement(\"div\");\n    // div.innerHTML = '<div></div>';\n    // return div.firstChild as HTMLElement;\n\treturn document.createElement(\"div\");\n}\n\n\nexport class DateTimeButtonComponent extends Component {\n\tprivate renderer: any;\n\tprivate rendererElement: any;\n    private params : any;\n\n    constructor(params : any) {\n        super();\n        this.params = params;\n    }\n\n\t@PostConstruct()\n\tinit() {\n\t\tthis.setTemplate(DateTimeButtonTemplate(this.params));\n\t\tconst comp : DateTimeButtonComponentType = {\n            addOrRemoveCssClass: (className: string, force: boolean) => this.addOrRemoveCssClass(className, force),\n            setRendererDetails : (rendererDetails: IComponentDetails) => this.setRendererDetails(rendererDetails),\n            getElement         : () => this.getGui(),\n            getParams          : () => this.params\n\t\t};\n\n\t\tconst controller = this.createBean(new DateTimeButtonController());\n\t\tcontroller.setComp(comp);\n\t}\n\n\tprivate setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate destroyRenderer(): void {\n\t\tthis.renderer = this.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n    private afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tthis.setTemplate(this.rendererElement);\n\t\t\tparentElement.replaceWith(this.rendererElement);\n\t\t}\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className;\n\t}\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DateTimeInputCompType } from \"./date-time-input.type\";\nimport { AutoWired, BEAN_NAME, getBeanInstanceByBeanName, setAriaLabel, setAriaRequired } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getDateTimeRootUtilityClass } from \"../date-time-root/date-time-root-classes\";\nimport { DateTimeOptionHandlerType } from \"../model/date-time-options-handler.types\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeModel } from \"../model/date-time-model\";\nimport { DateTimeEventHandlerType } from \"../model/date-time-event-handler.types\";\nimport { DateTimeKeyBoardShortCuts } from \"../model/date-time-keyboard-shorcuts\";\nimport { DateTimeInputHandler } from \"../model/date-time-input-handler\";\nimport { DATE_TIME_CUSTOM_EVENTS, INTERNAL_EVENTS } from \"../../constant/event-name\";\nimport { IDestroyAdjuster } from \"../model/date-time-keyboard-shortcut.types\";\nimport { DateTimePickerStateManagerType } from \"../model/date-picker-state-manager.types\";\nimport { DateTimePlaceholderManagerIntegration } from \"../model/placeholder-engine-integration\";\nimport { DatePickerInteractor } from \"../model/date-picker-interacter\";\nimport { HooksParams } from \"../../date-time-configuration.types\";\nimport { CalendarIconController } from \"../calendar-icon/calendar-icon-controller\";\nimport { DateTimeSelectionService } from \"../model/date-time-selection-service\";\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'input',\n\t\t\tmodifiers: [],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getDateTimeRootUtilityClass);\n};\nexport class DateTimeInputController extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !                               : DateTimeOptionHandlerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_MODEL) protected model !                              : DateTimeModel;\n    @AutoWired(DATETIME_BEAN_NAME.KEYBOARD_SHORTCUT_HANDLER) adjusterEventHandler !              : DateTimeKeyBoardShortCuts;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_EVENT_HANDLER) dateTimeEventHandler !                 : DateTimeEventHandlerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_INPUT_HANDLER) inputHandler !                         : DateTimeInputHandler;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_PICKER_STATE_MANAGER) protected stateManager !     : DateTimePickerStateManagerType;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_PLACEHOLDER_MANAGER) protected placeholderManager !: DateTimePlaceholderManagerIntegration;\n    @AutoWired(DATETIME_BEAN_NAME.DATE_PICKER_INTERACTOR) protected datePickerInteractor !       : DatePickerInteractor;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_SELECTION_SERVICE) protected selectionService !    : DateTimeSelectionService;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !                              : getBeanInstanceByBeanName;\n    \n\n\n\n    private comp !: DateTimeInputCompType;\n\n    private dateAdjusterRef : IDestroyAdjuster | null = null;\n    private focus !:boolean;\n    private adaptiveFormatActive = false;\n    \n    // Re-entrancy protection flags\n    private isSettingValue = false;\n    private isSettingPlaceholder = false;\n    private isProcessingEvent = false;\n    \n    // Value diffing cache\n    private lastRenderedValue: string | null = null;\n    \n    setComp(comp : DateTimeInputCompType ) {\n        this.comp = comp;\n\n        this.setPlaceholder();\n        this.applyClasses();\n        this.setValue();\n        this.setID();\n        this.setAriaAttributes();\n        this.registerEventHandler();\n        this.registerAdjusterEventHandler();\n        this.placeholderManager.setInputElement(this.comp.getElement() as HTMLInputElement);\n        // Prevent event loop by checking isProcessingEvent flag\n        const safeSetValue = () => {\n            if (!this.isProcessingEvent) {\n                this.setValue();\n            }\n        };\n        \n        const safeSetPlaceholder = () => {\n            if (!this.isProcessingEvent) {\n                this.setPlaceholder();\n            }\n        };\n        \n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, safeSetPlaceholder);\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, this.registerEventHandler.bind(this));\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, this.setAriaAttributes.bind(this));\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, this.applyClasses.bind(this));\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, safeSetValue);\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED, safeSetValue);\n\n\n\n    }\n    \n    private setID(){\n        const element = this.comp.getElement();\n        if (!element) return;\n        try {\n            element.setAttribute('id', this.model.getCompID());\n        } catch (error) {\n            console.error('Error setting ID:', error);\n        }\n    }\n\n\n\n    private applyClasses() : void {\n        const element = this.comp.getElement();\n        if (!element) return;\n        \n        try {\n            const classes = useUtilityClasses();\n            this.comp.addOrRemoveCSSClass(classes.root);\n            element.classList.add(\"dg-field__input\");\n        } catch (error) {\n            console.error('Error applying classes:', error);\n        }\n    }\n\n    private refresh() : void {\n        this.applyClasses();\n\n    }\n\n    private getOwnerState() {\n\t\treturn {\n\t\t\tdisabled : this.optionHandler.isDisabled(),\n\t\t\treadonly : this.optionHandler.isReadonly(),\n            focus : this.focus\n\t\t}\n\t}\n\n\n\n\n    private registerEventHandler() {\n        const ownerState = this.getOwnerState();\n        const element = this.comp.getElement();\n\n\n        if(ownerState.readonly || ownerState.disabled) {\n            if(ownerState.readonly){\n                this.addListener(element, 'focusin', () => {\n                    this.focus = true\n                    this.refresh()\n    \n                })\n                this.addListener(element, 'focusout', () => {\n                    this.focus = false\n                    this.refresh()\n    \n                })\n            }\n\n            return \n        }\n\n        // Register element with InputHandler (which handles keydown)\n        // DO NOT register keydown here to avoid double registration\n        this.inputHandler.registerElement(this.comp.getElement() as HTMLInputElement);\n        \n        // Register other events that InputHandler doesn't handle\n        element.addEventListener('input', this.onInput.bind(this));\n        element.addEventListener(\"click\", this.onClick.bind(this));\n        element.addEventListener('focusin', this.onFocusIn.bind(this));\n        element.addEventListener('focusout', this.onFocusOut.bind(this));\n\n\n        \n        this.addListener(this.eventHandler, INTERNAL_EVENTS.VALUE_UPDATE, this.setValue.bind(this));\n        this.addListener(this.eventHandler, INTERNAL_EVENTS.INCREMENT_UPDATED, this.refresh.bind(this));\n\t\tthis.addListener(this.eventHandler, INTERNAL_EVENTS.DECREMENT_UPDATED, this.refresh.bind(this));\n        this.addListener(this.eventHandler, INTERNAL_EVENTS.MAKE_SELECTION_ONCLICK, this.makeOnClickSelection.bind(this));\n        this.addListener(this.eventHandler, INTERNAL_EVENTS.MAKE_SELECTION, this.makeSelection.bind(this));\n        this.addListener(this.eventHandler, INTERNAL_EVENTS.VALUE_UPDATE_BY_DATEPICKER, this.setValueOnDatePicker.bind(this));\n\n       \n\n        const type = this.optionHandler.getType();\n        const spinButton = this.optionHandler.getSpinButton();\n        if(type === 'datetimepicker' || type === 'datepicker' || type === 'timepicker'){\n\n            if(spinButton === 'together' || this.optionHandler.shouldOpenPickerOnFocus()){\n                \n                    element.addEventListener( 'focus', (event) => {\n                        const relatedTarget = event.relatedTarget as HTMLElement;\n                        this.dispatchEvent({type:'FOCUS_CONTAINER'})\n\n\n                        if(!this.isElementWithinDatePickerIcon(relatedTarget)) {\n                            if(!this.stateManager.getState()){\n                                this.datePickerInteractor.createCalendar()\n                            }\n                        }\n                    })\n\n                \n\n                    element.addEventListener( 'focusout', (event) => {\n                        const relatedTarget = event.relatedTarget as HTMLElement;\n                        const datePickerId = this.datePickerInteractor.getId();\n                        const datePickerElement = document.getElementById(datePickerId);\n                        // const timeDropDownOption = document.querySelector('dg-date-picker__time-picker-dropdown');\n\n\n                        if (!datePickerElement || !relatedTarget) {\n                            this.datePickerInteractor.destroyCalendar();\n                            return;\n                        }\n\n                        // console.log('timeDropDownOption : ',timeDropDownOption)\n                        // console.log('relatedTarget: ',relatedTarget)\n\n\n                        const isTimeDropDown = this.isElementWithinTimePicker(relatedTarget);\n\n\n                        const isWithinDatePicker = datePickerElement === relatedTarget || \n                                                 datePickerElement.contains(relatedTarget) || isTimeDropDown || this.isElementWithinDatePickerIcon(relatedTarget);\n                        \n                        if (!isWithinDatePicker) {\n                            this.datePickerInteractor.destroyCalendar();\n                        }\n                    })\n               \n            }\n            element.addEventListener(\"keydown\",(event)=>{\n                if(event.key === 'Escape'){\n                    this.datePickerInteractor.destroyCalendar();\n    \n                }\n            })\n\n        }\n       \n        \n\n    }\n\n    private isElementWithinTimePicker(element : HTMLElement) : boolean {\n        let pointer: HTMLElement | null = element;\n        \n        while (pointer) {\n            if (pointer.classList.contains('dg-date-picker__time-picker-dropdown')) {\n                return true;\n            }\n            pointer = pointer.parentElement;\n        }\n\n        return false;\n    }\n\n    private isElementWithinDatePickerIcon(element: HTMLElement): boolean {\n        let pointer: HTMLElement | null = element;\n        \n        while (pointer) {\n            // getDomData exists in implementation but not in interface, cast to access it\n            const instanceId = (this.optionHandler as any).getDomData?.(pointer, CalendarIconController.CALENDAR_ICON_INSTANCE);\n            if (!!instanceId) {\n                const eventFromThisComponent = instanceId === this.getBeanInstanceByBeanName('instanceID');\n                return eventFromThisComponent;\n            }\n            pointer = pointer.parentElement;\n        }\n\n        return false;\n    }\n\n\n    private onFocusIn(event:FocusEvent):void{\n        this.dispatchEvent({type: INTERNAL_EVENTS.FOCUS_CONTAINER});\n        const readonly = this.optionHandler.isReadonly();\n        if(readonly){\n            return\n        }\n        \n        // Use document.activeElement instead of maintaining separate flag\n        const element = this.comp.getElement();\n        this.focus = document.activeElement === element;\n        this.refresh();\n        \n        const inputElement = element as HTMLInputElement;\n        if (inputElement) {\n            this.selectionService.selectCurrentField(inputElement, false);\n        }\n        \n        this.dateTimeEventHandler.onFocus(event);\n    }\n\n    private onFocusOut(event:FocusEvent):void{\n        const readonly = this.optionHandler.isReadonly();\n        if(readonly){\n            return\n        }\n\n        const allowManualInput = this.optionHandler.isAllowManualInput();\n        if (allowManualInput) {\n            const element = event.target as HTMLInputElement;\n            const value = element.value;\n            \n            if (value) {\n                const success = this.model.parseAndSetDateFromString(value);\n                if (success) {\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.optionHandler.onChange({ \n                        event: {}, \n                        source: \"ui\", \n                        type: \"onChange\", \n                        value: this.model.getDateObject() \n                    });\n                } else {\n                    this.setValue();\n                }\n            }\n        }\n\n        // Use document.activeElement instead of maintaining separate flag\n        const element = this.comp.getElement();\n        this.focus = document.activeElement === element;\n        this.refresh();\n        this.dateTimeEventHandler.onFocusOut(event);\n\n        // Derive adaptiveFormatActive from Model state\n        if (this.shouldUseAdaptiveFormat() && !this.model.getSelectedDateTime()) {\n            this.adaptiveFormatActive = false;\n            this.setValue();\n        }\n\n    }\n\n    private onInput(event:any):void{\n        const readonly = this.optionHandler.isReadonly();\n        if(readonly){\n            return\n        }\n\n        const allowManualInput = this.optionHandler.isAllowManualInput();\n        const inputElement = event.target as HTMLInputElement;\n        const value = inputElement.value;\n        const selectedDateTime = this.model.getSelectedDateTime();\n\n        if (allowManualInput) {\n            const format = this.optionHandler.getFormat();\n            if (format && value) {\n                return;\n            }\n            return;\n        }\n        event.preventDefault();\n\n        if(!selectedDateTime && value === ''){\n            this.setValue();\n            this.selectionService.selectCurrentField(inputElement);\n            return;\n        }\n\n        if (!/^[a-zA-Z0-9]*$/.test(value.normalize('NFD').replace(/\\p{M}/gu, ''))) {\n            this.setValue();\n            this.selectionService.selectCurrentField(inputElement);\n            return;\n        }\n\n        this.dateTimeEventHandler.onInput(value);\n\n    }\n\n    private onClick():void {\n        const readonly = this.optionHandler.isReadonly();\n        if(readonly){\n            return\n        }\n        this.dispatchEvent({ type: INTERNAL_EVENTS.MAKE_SELECTION_ONCLICK });\n\n        if(!this.stateManager.getState()){\n            this.dispatchEvent({\n                type: DATE_TIME_CUSTOM_EVENTS.CREATE_CALENDAR\n            })\n        };\n    }\n\n    private makeOnClickSelection(): void {\n        const element = this.comp.getElement() as HTMLInputElement;\n        if (!element) return;\n        \n        const cursorPosition = element.selectionStart;\n        this.selectionService.selectFieldAtCursorPosition(element, cursorPosition);\n    }\n\n    private makeSelection(): void {\n        const element = this.comp.getElement() as HTMLInputElement;\n        if (!element) return;\n        \n        // Use waitForDOMUpdate=true to ensure DOM is updated before selection\n        this.selectionService.selectCurrentField(element, true);\n    }\n    \n\n    private setAriaAttributes() : void {\n        const element = this.comp.getElement();\n        if (!element) return;\n        \n        try {\n            setAriaRequired(element, this.optionHandler.isRequired());\n            setAriaLabel(element, this.optionHandler.getAriaLabel());\n            this.optionHandler.isDisabled() ? element.setAttribute(\"disabled\",\"\") : element.removeAttribute(\"disabled\");\n            this.optionHandler.isReadonly() ? element.setAttribute(\"readonly\",\"\") : element.removeAttribute(\"readonly\");\n            const value = this.model.getValue();\n            if(!this.model.isActivatePlaceholder()){\n                value && element.setAttribute('value', value);\n                return;\n            }\n        } catch (error) {\n            console.error('Error setting ARIA attributes:', error);\n        }\n    }\n\n    private setPlaceholder():void{\n        if (this.isSettingPlaceholder) return; // Re-entrancy protection\n        \n        const element = this.comp.getElement() as HTMLInputElement;\n        if (!element) return;\n        \n        try {\n            this.isSettingPlaceholder = true;\n            const placeHolder = this.optionHandler.getPlaceholder();\n            if(!placeHolder){\n                element.removeAttribute('placeholder');\n            } else {\n                element.setAttribute('placeholder', placeHolder);\n            }\n        } catch (error) {\n            console.error('Error setting placeholder:', error);\n        } finally {\n            this.isSettingPlaceholder = false;\n        }\n    }\n\n    private setValue(): void {\n        // Re-entrancy protection\n\n        if (this.isSettingValue || this.isProcessingEvent) {\n            return;\n        }\n        \n        const element = this.comp.getElement() as HTMLInputElement;\n        if (!element) return;\n        \n        try {\n            this.isSettingValue = true;\n            this.isProcessingEvent = true;\n            \n            // Derive adaptiveFormatActive from Model state instead of maintaining separate flag\n            const adaptiveModeEnabled = this.shouldUseAdaptiveFormat();\n            const hasSelectedDateTime = !!this.model.getSelectedDateTime();\n            \n            // Get current DOM value for diffing\n            const currentDomValue = element.value || '';\n            \n            // Determine what value should be displayed\n            let newValue: string = '';\n            let shouldUpdatePlaceholder = false;\n            let placeholderValue: string | null = null;\n            \n            if (\n                adaptiveModeEnabled &&\n                !hasSelectedDateTime &&\n                this.model.isActivatePlaceholder() &&\n                !this.adaptiveFormatActive\n            ) {\n                this.adaptiveFormatActive = false;\n            }\n\n            if (adaptiveModeEnabled && !hasSelectedDateTime && !this.adaptiveFormatActive) {\n                const configuredPlaceholder = this.optionHandler.getPlaceholder();\n                this.adaptiveFormatActive = false;\n                newValue = '';\n                placeholderValue = configuredPlaceholder ?? null;\n                shouldUpdatePlaceholder = true;\n            } else if(!this.model.getSelectedDateTime() && this.optionHandler.shouldShowFormatAsPlaceholder()){\n                const format = this.placeholderManager.getFormattedValue();\n                newValue = format;\n                placeholderValue = format;\n                shouldUpdatePlaceholder = true;\n            } else if(!this.model.getSelectedDateTime() && !this.optionHandler.shouldShowFormatAsPlaceholder()){\n                newValue = '';\n            } else if(this.model.isActivatePlaceholder()){\n                if(this.optionHandler.shouldShowFormatAsPlaceholder()){\n                    const format = this.placeholderManager.getPlaceholder();\n                    newValue = format;\n                    placeholderValue = format ?? null;\n                    shouldUpdatePlaceholder = true;\n                } else {\n                    placeholderValue = this.optionHandler.getPlaceholder() ?? null;\n                    shouldUpdatePlaceholder = true;\n                    // Don't set value, just placeholder\n                    if (placeholderValue === null) {\n                        element.removeAttribute('placeholder');\n                    } else if (placeholderValue) {\n                        element.setAttribute('placeholder', placeholderValue);\n                    }\n                    this.datePickerInteractor.setDate();\n                    return;\n                }\n            } else {\n                // Model has a value - get it from Model (single source of truth)\n                const modelValue = this.model.getValue();\n                if(modelValue === 'Invalid Date'){\n                    newValue = '';\n                } else {\n                    newValue = String(modelValue);\n                }\n            }\n            \n            // Value diffing - only update DOM if value changed\n            if (newValue !== currentDomValue || newValue !== this.lastRenderedValue) {\n                element.value = newValue;\n                this.lastRenderedValue = newValue;\n            }\n            \n            // Update placeholder if needed\n            if (shouldUpdatePlaceholder) {\n                if (placeholderValue === null || placeholderValue === undefined || placeholderValue === '') {\n                    element.removeAttribute('placeholder');\n                } else {\n                    element.setAttribute('placeholder', placeholderValue);\n                }\n            }\n            \n            this.datePickerInteractor.setDate();\n            \n            // Validate state synchronization\n            this.validateStateSync();\n        } catch (error) {\n            console.error('Error in setValue:', error);\n            // Fallback: try to reset to safe state\n            try {\n                const element = this.comp.getElement() as HTMLInputElement;\n                if (element) {\n                    const modelValue = this.model.getValue();\n                    if (modelValue && modelValue !== 'Invalid Date') {\n                        element.value = String(modelValue);\n                    }\n                }\n            } catch (fallbackError) {\n                console.error('Error in setValue fallback:', fallbackError);\n            }\n        } finally {\n            this.isSettingValue = false;\n            this.isProcessingEvent = false;\n        }\n    }\n    \n    /**\n     * Validates that DOM value matches Model value\n     */\n    private validateStateSync(): void {\n        const element = this.comp.getElement() as HTMLInputElement;\n        if (!element) return;\n        \n        try {\n            const domValue = element.value || '';\n            const modelValue = this.model.getValue();\n            const modelValueStr = modelValue && modelValue !== 'Invalid Date' ? String(modelValue) : '';\n            \n            // If Model has a value, DOM should match (unless placeholder is active)\n            if (this.model.getSelectedDateTime() && !this.model.isActivatePlaceholder()) {\n                if (domValue !== modelValueStr && modelValueStr !== '') {\n                    console.warn('State desync detected: DOM value does not match Model value', {\n                        domValue,\n                        modelValue: modelValueStr\n                    });\n                }\n            }\n        } catch (error) {\n            console.error('Error validating state sync:', error);\n        }\n    }\n\n    private shouldUseAdaptiveFormat(): boolean {\n        const placeholder = this.optionHandler.getPlaceholder();\n        const hasPlaceholder = placeholder !== null && placeholder !== undefined && placeholder !== '';\n        const allowManualInput = this.optionHandler.isAllowManualInput();\n        // return this.optionHandler.shouldAutoFillFormatOnFirstInput() \n        //     && this.optionHandler.shouldShowFormatAsPlaceholder()\n        //     && hasPlaceholder;\n        return this.optionHandler.shouldAutoFillFormatOnFirstInput() \n            && this.optionHandler.shouldShowFormatAsPlaceholder()\n            && hasPlaceholder\n            && !allowManualInput;\n    }\n    private setValueOnDatePicker() : void {\n        const element = this.comp.getElement() as HTMLInputElement;\n        const value = this.model.getValue();\n        if(String(value) ===element.value ){\n            return\n        }\n        \n        const params : HooksParams = {\n            type: 'onChange',\n            event : {},\n            value : this.model.getDateObject(),\n            source : 'ui'\n        }\n\n        this.optionHandler.onChange(params);\n        element.value = String(value);\n      \n    }\n\n\n    private registerAdjusterEventHandler() {\n        const element = this.comp.getElement();\n\n        this.dateAdjusterRef = this.adjusterEventHandler.registerElement(element);\n\n        this.addDestroyFunc(() => {\n            this.dateAdjusterRef && this.dateAdjusterRef.destroyFunc()\n            this.dateAdjusterRef = null;\n        })\n    }\n\n    destroy(): void {\n        super.destroy();\n    }\n}","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { DateTimeInputController } from \"./date-time-input-controller\";\nimport { DateTimeInputCompType } from \"./date-time-input.type\";\n\nconst daetTimeInputTemplate = () => {\n    const input = document.createElement(\"input\");\n    input.type = \"text\";\n    return input;\n}\n\nexport class DateTimeInputComponent extends Component {\n\n    constructor() {\n        super();\n        this.setTemplate(daetTimeInputTemplate())\n    }\n\n    @PostConstruct()\n    init() {\n        const comp : DateTimeInputCompType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        const controller = this.createBean(new DateTimeInputController());\n        controller.setComp(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        if (!element) return;\n        \n        // Split by spaces to handle multiple classes\n        const classesToAdd = className.trim().split(/\\s+/).filter(cls => cls.length > 0);\n        \n        // Remove all existing classes first\n        element.className = '';\n        \n        // Add new classes\n        classesToAdd.forEach(cls => {\n            if (cls) {\n                element.classList.add(cls);\n            }\n        });\n    }\n\n}","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { DateTimeReadonlyInputController } from \"./date-time-readony-input-controller\";\nimport { DateTimeReadonlyInputCompType } from \"./date-time-readonly-input.type\";\n\nconst daetTimeInputTemplate = () => {\n    // const div = document.createElement(\"div\");\n    // div.innerHTML = `<span></span>`;\n    // return div.firstChild as HTMLElement;\n    return document.createElement(\"span\");\n}\n\nexport class DateTimeReadonlyInputComponent extends Component {\n\n    constructor() {\n        super();\n        this.setTemplate(daetTimeInputTemplate())\n    }\n\n    @PostConstruct()\n    init() {\n        const comp : DateTimeReadonlyInputCompType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        const controller = this.createBean(new DateTimeReadonlyInputController());\n        controller.setComp(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DateTimeReadonlyInputCompType } from \"./date-time-readonly-input.type\";\nimport { AutoWired, BEAN_NAME, setAriaLabel, setAriaRequired } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getDateTimeRootUtilityClass } from \"../date-time-root/date-time-root-classes\";\nimport { DateTimeOptionHandlerType } from \"../model/date-time-options-handler.types\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeModel } from \"../model/date-time-model\";\nimport { DateTimeEventHandlerType } from \"../model/date-time-event-handler.types\";\nimport { DateTimeKeyBoardShortCuts } from \"../model/date-time-keyboard-shorcuts\";\nimport { DateTimeInputHandler } from \"../model/date-time-input-handler\";\nimport { DATE_TIME_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { DateTimePlaceholderManagerIntegration } from \"../model/placeholder-engine-integration\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\n\nconst useUtilityClasses = (ownerState : any) => {\n\tconst { invalid, disabled, readonly,focus } = ownerState;\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'input',\n\t\t\tmodifiers: [\n\t\t\t\tinvalid && 'error',\n\t\t\t\tdisabled && 'disabled',\n\t\t\t\treadonly && 'readonly',\n                focus && 'focus'\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getDateTimeRootUtilityClass);\n};\nexport class DateTimeReadonlyInputController extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: DateTimeOptionHandlerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_MODEL) protected model !: DateTimeModel;\n    @AutoWired(DATETIME_BEAN_NAME.KEYBOARD_SHORTCUT_HANDLER) adjusterEventHandler !: DateTimeKeyBoardShortCuts;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_EVENT_HANDLER) dateTimeEventHandler !: DateTimeEventHandlerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_INPUT_HANDLER) inputHandler !: DateTimeInputHandler;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_PLACEHOLDER_MANAGER) protected placeholderManager !: DateTimePlaceholderManagerIntegration;\n\n\n    private comp !: DateTimeReadonlyInputCompType;\n\n    // private dateAdjusterRef : IDestroyAdjuster | null = null;\n    private focus !:boolean;\n    \n    setComp(comp : DateTimeReadonlyInputCompType ) {\n        this.comp = comp;\n\n        this.applyClasses();\n        this.setValue();\n        this.setAriaAttributes();\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED, this.setValue.bind(this));\n        this.registerClipboardHandlers();\n\n        // this.registerEventHandler();\n        // this.registerAdjusterEventHandler();\n    }\n\n    private registerClipboardHandlers() : void {\n        registerClipboardGuards(\n            this.comp.getElement(),\n            () => this.optionHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n    }\n\n    private applyClasses() : void {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n        this.comp.getElement().classList.add(\"dg-field__input\")\n    }\n\n    // private refresh() : void {\n    //     this.applyClasses();\n\n    // }\n\n    private getOwnerState() {\n\t\treturn {\n\t\t\tdisabled : this.optionHandler.isDisabled(),\n\t\t\treadonly : this.optionHandler.isReadonly(),\n            focus : this.focus\n\t\t}\n\t}\n\n    // private registerEventHandler() {\n    //     const ownerState = this.getOwnerState();\n    //     const element = this.comp.getElement();\n\n    //     const type = this.optionHandler.getType();\n    //     if(type === 'datetimepicker'){\n    //         this.addListener(element, 'click', (_event) => {\n    //             this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.CREATE_CALENDAR})\n    //         })\n    //         this.addListener(element, 'keydown', (event) => {\n    //             if(event.key === 'Enter'){\n    //             this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.CREATE_CALENDAR})\n\n    //             }\n    //         })\n\n    //     }\n        \n\n\n    //     if(ownerState.readonly || ownerState.disabled) {\n    //         if(ownerState.readonly){\n    //             this.addListener(element, 'focusin', (_event) => {\n    //                 this.focus = true\n    //                 this.refresh()\n    \n    //             })\n    //             this.addListener(element, 'focusout', (_event) => {\n\n    //                 this.focus = false\n    //                 this.refresh()\n    \n    //             })\n    //         }\n    //         return \n    //     }\n\n    //     this.inputHandler.registerElement(this.comp.getElement() as HTMLInputElement)\n        \n        \n    //     this.addListener(element, 'focusin', (event) => {\n    //         this.focus = true\n    //         this.refresh()\n    //         this.makeSelection()\n\n    //         this.dateTimeEventHandler.onFocus(event);\n    //     });\n    \n    //     this.addListener(element, 'focusout', (event) => {\n    //         this.focus = false\n    //         this.refresh()\n    //         this.dateTimeEventHandler.onFocusOut(event);\n    //     });\n\n    //     this.addListener(element, 'keydown', (event) => {\n    //         this.dateTimeEventHandler.onKeyDown(event);\n    //     });\n\n    //     this.addListener(element, 'input', (event : InputEvent) => {\n    //         event.preventDefault()\n\n    //         const value = (event.target as HTMLInputElement).value;\n    //         this.dateTimeEventHandler.onInput(value);\n    //     });\n\n    //     // this.addListener(this.eventHandler, 'EVENT_FOCUS_OUT', this.setValue.bind(this));\n    //     // this.addListener(this.eventHandler, 'EVENT_FOCUS_IN', this.setValue.bind(this));\n        \n    //     this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.setValue.bind(this));\n    //     this.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.refresh.bind(this));\n\t// \tthis.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.refresh.bind(this));\n    //     this.addListener(this.eventHandler, 'EVENT_MAKE_SELCTION_ONCLICK', this.makeOnClickSelection.bind(this));\n    //     this.addListener(this.eventHandler, 'EVENT_MAKE_SELCTION', this.makeSelection.bind(this));\n    //     this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE_BY_DATEPICKER', this.setValueOnDatePicker.bind(this));\n\n        \n\n    //     element.addEventListener(\"click\", (_event)=>{\n    //         this.dispatchEvent({ type: \"EVENT_MAKE_SELCTION_ONCLICK\" });\n    //     })\n\n    // }\n\n    // private makeOnClickSelection(): void {\n    //     const element = this.comp.getElement() as HTMLInputElement;\n    //     const cursorPosition = element.selectionStart as number;\n    //             const dateTimeParts = this.model.getSelectionPattern();\n    //             let selectedField = '';\n    //             let start = 0;\n    //             let end = 1;\n    //             for (const part of dateTimeParts) {\n    //                 if (cursorPosition >= part.start && cursorPosition <= part.end) {\n    //                     start = part.start\n    //                     end = part.end\n    //                     selectedField = part.type;\n    //                     break;\n    //                 }\n    //             }\n    //             this.model.setSelectedField(selectedField);\n    //             element.setSelectionRange(start,end);\n    // }\n\n    // private makeSelection():void{\n    //     const element        = this.comp.getElement() as HTMLInputElement;\n    //     const selectionField = this.model.getSelectedField();\n    //     const dateTimeParts  = this.model.getSelectionPattern();\n    //       // element.focus();  \n    //     let start = 0;\n    //     let end   = 1;\n    //     for (const part of dateTimeParts){\n    //         if(selectionField === part.type){\n    //             start = part.start\n    //             end   = part.end\n    //             break;\n    //         }\n    //     }\n    //     element.setSelectionRange(start,end);\n    // }\n    \n\n    private setAriaAttributes() : void {\n        const element = this.comp.getElement();\n        element.setAttribute('value',this.model.getValue())\n        setAriaRequired(element, this.optionHandler.isRequired());\n        setAriaLabel(element, this.optionHandler.getAriaLabel());\n        this.optionHandler.isDisabled() ? element.setAttribute(\"disabled\",\"\") : element.removeAttribute(\"disabled\");\n        this.optionHandler.isReadonly() ? element.setAttribute(\"readonly\",\"\") : element.removeAttribute(\"readonly\");\n    }\n\n    private setValue() : void {\n        const element = this.comp.getElement() as HTMLInputElement;\n        if(!this.model.getSelectedDateTime() && this.optionHandler.shouldShowFormatAsPlaceholder()){\n            const format = this.placeholderManager.getPlaceholder();\n            element.value = format;\n            element.innerText = String(format);\n            return\n        }\n        \n\n\n        if(this.model.isActivatePlaceholder()){\n            const placeHolder = this.optionHandler.getPlaceholder();\n            if(placeHolder === null){\n                element.removeAttribute('placeholder');\n            }\n            placeHolder  && element.setAttribute('placeholder',placeHolder) \n            element.innerText = '';\n            return\n        }\n        \n\n        const value = this.model.getValue();\n        const params = {\n            type: 'onChange',\n            event : {},\n            value : this.model.getDateObject()\n        }\n        this.optionHandler.onChange(params);\n        element.value = String(value);\n        element.innerText = String(value);\n        this.dispatchEvent({\n            type : DATE_TIME_CUSTOM_EVENTS.UPDATE_CALENDAR\n        })\n    }\n    // private setValueOnDatePicker() : void {\n    //     const value = this.model.getValue();\n    //     this.optionHandler.onChange(value);\n    //     const element = this.comp.getElement() as HTMLInputElement;\n    //     element.value = String(value);\n      \n    // }\n\n\n    // private registerAdjusterEventHandler() {\n    //     const element = this.comp.getElement();\n\n    //     this.dateAdjusterRef = this.adjusterEventHandler.registerElement(element);\n\n    //     this.addDestroyFunc(() => {\n    //         this.dateAdjusterRef && this.dateAdjusterRef.destroyFunc()\n    //         this.dateAdjusterRef = null;\n    //     })\n    // }\n\n    destroy(): void {\n        super.destroy();\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../modules/CSSRegistry\";\n\nexport function getDateTimeRootUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('date-time', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getDateTimeRootUtilityClass } from \"./date-time-readonly-root-classes\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { DateTimeComponentType } from \"./date-time-readonly-root.types\";\nimport { DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeOptionHandlerType } from \"../model/date-time-options-handler.types\";\nimport { DateTimeControllerHandler } from \"../model/date-time-controller\";\nimport { DateTimeEventHandlerType } from \"../model/date-time-event-handler.types\";\nimport { DateTimeReadonlyRootControllerType } from \"./date-time-readonly-root-controller.type\";\nimport { DATE_TIME_CUSTOM_EVENTS } from \"../../constant/event-name\";\n\nconst useUtilityClasses = (ownerState : any) => {\n\tconst { invalid, disabled, readonly } = ownerState;\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'root',\n\t\t\tmodifiers: [\n\t\t\t\tinvalid && 'error',\n\t\t\t\tdisabled && 'disabled',\n\t\t\t\treadonly && 'readonly',\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getDateTimeRootUtilityClass);\n};\n\n\n\n// const useUtilityClassesForComponent = (ownerState : any) => {\n// \tconst { invalid, disabled, readonly } = ownerState;\n// \tconst slots = {\n// \t\troot: {\n// \t\t\tslot: 'spinbutton-panel',\n// \t\t\tmodifiers: [\n// \t\t\t\tinvalid && 'error',\n// \t\t\t\tdisabled && 'disabled',\n// \t\t\t\treadonly && 'readonly',\n// \t\t\t],\n// \t\t},\n// \t};\n\n// \treturn composeClasses(slots, getDateTimeRootUtilityClass);\n// };\n\n\n\nexport class DateTimeReadonlyRootController extends AbstractController<DateTimeComponentType> implements DateTimeReadonlyRootControllerType {\n\tgetInputElement(): HTMLElement {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n    \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: DateTimeOptionHandlerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_EVENT_HANDLER) dateTimeEventHandler !: DateTimeEventHandlerType;\n\t@AutoWired(DATETIME_BEAN_NAME.DATETIME_CONTROLLER_HANDLER) controllerHandler !: DateTimeControllerHandler;\n\n    init(){\n        // this.registerEvents();\n\t\tthis.applyClassNames();\n\t\tthis.controllerHandler.registerDateTimeFieldController(this);\n    }\n\n\n    // private registerEvents() {\n    //     this.addListener(this.eventHandler, 'EVENT_FOCUS_OUT', this.applyClassNames.bind(this));\n\t// \tthis.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.applyClassNames.bind(this));\n\t// \tthis.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.applyClassNames.bind(this));\n    // }\n\n\tprivate applyClassNames(){\n\t\tconst ownerState = this.getOwnerState();\n\t\tconst classes = useUtilityClasses(ownerState);\n\t\tthis.component?.addOrRemoveCssClass(classes.root, true);\n\t\tthis.component?.getElement().classList.add(\"dg-field__root\");\n\t\tconst type = this.optionHandler.getType();\n\t\tif(type === 'datetimepicker'){\n\t\t\tthis.component?.getElement().classList.add(\"dg-date-picker__root\");\n\t\t}\n\n\t}\n\n\tprivate getOwnerState() {\n\t\treturn {\n\t\t\t// invalid : !this.numberModel.isValid(),\n\t\t\tdisabled : this.optionHandler.isDisabled(),\n\t\t\treadonly : this.optionHandler.isReadonly()\n\t\t}\n\t}\n\n    getProperty() : any {\n        return {\n\t\t\t// onInput          : this.onInput.bind(this),\n\t\t\t// onKeyDown        : this.onKeyDown.bind(this),\n\t\t\t// onFocusIn        : this.onFocusIn.bind(this),\n\t\t\t// onFocusOut       : this.onFocusOut.bind(this),\n\t\t\t// isvalid          : this.numberModel.isValid(),\n\t\t\t// focused          : this.numberModel.isFocused(),\n\t\t\tlabel            : this.optionHandler.getLabel(),\n\t\t\tdescription : this.optionHandler.getDescription(),\n\t\t\ttype :  this.optionHandler.getType(),\n\t\t\thtmlFor          : 'number',\n\t\t\tid               : 'number',\n\t\t\trequired         : this.optionHandler.isRequired(),\n\t\t\treadOnly         : this.optionHandler.isReadonly(),\n\t\t\tdisabled         : this.optionHandler.isDisabled(),\n\t\t\t// onIncrement      : () => this.numberEventHandler.onIncrement(),\n\t\t\t// onDecrement      : () => this.numberEventHandler.onDecrement(),\n\t\t\t// incrementDisabled: this.numberModel.isIncrementDisabled(),\n\t\t\t// decrementDisabled: this.numberModel.isDecrementDisabled(),\n\t\t\tspinButton       : this.optionHandler.getSpinButton(),\n\t\t\tgetTemplate            : (props: any) => this.optionHandler.getTemplate(props),\n\t\t\tcalendarIcon      : this.optionHandler.getCalendarIcon()\n\n\t\t\t// registerAdjusterElement : (element : HTMLElement) => this.adjusterEventHandler.registerElement(element)\n\t\t};\n    }\n\n\tgetParamsProperty() {\n\n\t\treturn {\n\t\t\tincrementButton: {\n                getIcon          : () =>  this.optionsHandler.getIncrementButtonSVGIconId(),\n                getRenderer      : () => this.optionsHandler. getIncrementButtonRenderer(),\n                getRendererParams: () => this.optionsHandler. getIncrementButtonRendererParams(),\n                callback         : (event: any) => this.dateTimeEventHandler.onIncrement(event),\n                isDisabled    : () => false,\n\n\t\t\t\tisReadonly : () => this.optionHandler.isReadonly(),\n                getRole          : () => 'increment',\n\t\t\t\tgetSpinButton : () =>(this.optionsHandler.getSpinButton() === 'split' ? true : false),\n\t\t\t\tgetClasses : ()=> [\"dg-date-time__spinbutton\", \"dg-date-time__spin-downbtn\"],\n\t\t\t\tgetSvgClasses : ()=>\"dg-date-time__increment-svg\"\n\n\t\t\t},\n\t\t\tdecrementButton: {\n                getIcon       : () =>  this.optionsHandler.getDecrementButtonSVGIconId(),\n                renderer      : () => this.optionsHandler.getDecrementButtonRenderer(),\n                rendererParams: () => this.optionsHandler.getDecrementButtonRendererParams(),\n                callback      : (event : any) => this.dateTimeEventHandler.onDecrement(event),\n                isDisabled    : () => false,\n\t\t\t\tisReadonly : () => this.optionHandler.isReadonly(),\n                getRole       : () => 'decrement',\n\t\t\t\tgetSpinButton : () =>(this.optionsHandler.getSpinButton() === 'split' ? true : false),\n\t\t\t\tgetClasses    : ()=> [ \"dg-date-time__spinbutton\", \"dg-date-time__spin-downbtn\"],\n\t\t\t\tgetSvgClasses : ()=>\"dg-date-time__decrement-svg\"\n\n\t\t\t},\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> \"dg-date-time__label\",\n\t\t\t\tgetLabelTitleClasses :()=> \"dg-date-time__label-title\"\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-date-time__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-date-time__description\"\n\t\t\t}\n\t\t};\n    }\n\n\tgetElement() : HTMLElement {\n\t\treturn this.component?.getElement() as HTMLElement;\n\t}\n\n\tfocus():void {\n\t\tconst elem = this.component?.getInputElement() as HTMLElement;\n\t\telem.focus();\n\t}\n\n\thide():void {\n\t\t// const elem = this.component?.getInputElement() as HTMLElement;\n\t\t// elem.focus();\n\t}\n\n\tshow():void {\n\t\t//const elem = this.component?.getInputElement() as HTMLElement;\n\t\t//elem.focus();\n\t}\n\n\tdestroy():void {\n\t\tsuper.destroy();\n\t\t// this.component?.destroy();\n\t\tthis.dispatchEvent({\n\t\t\ttype: DATE_TIME_CUSTOM_EVENTS.DESTROY_CALENDAR\n\t\t})\n\t}\n\n}","import { PostConstruct, queryAssignedNodes } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { composeClasses } from '@dg/utils';\nimport { getDateTimeRootUtilityClass } from './date-time-readonly-root-classes';\nimport { DateTimeReadonlyRootController } from './date-time-readonly-root-controller';\nimport { DateTimeComponentType } from './date-time-readonly-root.types';\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'container',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getDateTimeRootUtilityClass)\n}\n\n// const splitButtonTemplate = (description:any, label:any ) => {\n// \treturn `<div>\n// \t\t${ label ? `<date-time-label ref=\"label\"></date-time-label>`:\"\"}\n// \t\t<div class=\"dg-date-time__container dg-field__container\">\n// \t\t\t<div class=\"dg-date-time__input-wrapper dg-field__input-wrapper\">\n// \t\t\t\t<date-time-increment ref=\"incrementButton\"></date-time-increment>\n// \t\t\t\t<date-time-readonly-input ref=\"dateInput\"></date-time-readonly-input>\n// \t\t\t\t<date-time-decrement ref=\"decrementButton\"></date-time-decrement>\n// \t\t\t</div>\n// \t\t</div>\n// \t\t${ description ? `<date-time-helper-text ref = \"description\"></date-time-helper-text>`:\"\"}\n// \t</div>`\n// }\n\n// const spinButtonTogetherTemplate = (description: any, label:any ) => {\n// \treturn `<div>\n// \t${ label ? `<date-time-label ref=\"label\"></date-time-label>`:\"\"}\n// \t\t<div class=\"dg-date-time__container dg-field__container\">\n// \t\t\t<div class=\"dg-date-time__input-wrapper dg-field__input-wrapper\">\n// \t\t\t\t<date-time-readonly-input ref=\"dateInput\"></date-time-readonly-input>\n// \t\t\t\t<date-time-spin-button ref=\"spinButton\"></date-time-spin-button>\n// \t\t\t</div>\n// \t\t</div>\n// \t\t${ description ? `<date-time-helper-text ref = \"description\"></date-time-helper-text>`:\"\"}\n// \t</div>`\n// }\n\n\n// const BasicTemplateWithoutButtons = ( description: any, label:any )=>{\n// \treturn `<div>\n// \t${ label ? `<date-time-label ref=\"label\"></date-time-label>`:\"\"}\n// \t\t<div class=\"dg-date-time__container dg-field__container\">\n// \t\t\t<div class=\"dg-date-time__input-wrapper dg-field__input-wrapper\">\n// \t\t\t\t<date-time-readonly-input ref=\"dateInput\"></date-time-readonly-input>\n// \t\t\t</div>\n// \t\t</div>\t\n// \t\t${ description ? `<date-time-helper-text ref = \"description\"></date-time-helper-text>`:\"\"}\n// \t</div>`\n\n// }\n\n\n// const DatePickerTemplate = (description: any, label: any, calendarIcon: boolean) => {\n// \treturn `<div>\n// \t\t${label ? `<date-time-label ref=\"label\"></date-time-label>` : \"\"}\n// \t\t<div class=\"dg-date-time__container dg-field__container\">\n// \t\t\t<div class=\"dg-date-time__input-wrapper dg-field__input-wrapper\">\n// \t\t\t\t<date-time-readonly-input ref=\"dateInput\"></date-time-readonly-input>\n// \t\t\t\t${calendarIcon ? `<date-picker-icon-readonly ref=\"pickericon\"></date-picker-icon-readonly>` : \"\"}\n// \t\t\t</div>\n// \t\t</div>\t\n// \t\t${description ? `<date-time-helper-text ref=\"description\"></date-time-helper-text>` : \"\"}\n// \t</div>`;\n// };\n\n\nconst splitButtonTemplate = (description: any, label: any): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (label) {\n        const labelElement = document.createElement(\"date-time-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Main container\n    const dateContainer = document.createElement(\"div\");\n    dateContainer.classList.add(\"dg-date-time__container\", \"dg-field__container\");\n\n    // Input wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.classList.add(\"dg-date-time__input-wrapper\", \"dg-field__input-wrapper\");\n\n    // Increment button\n    const incrementButton = document.createElement(\"date-time-increment\");\n    incrementButton.setAttribute(\"ref\", \"incrementButton\");\n    inputWrapper.appendChild(incrementButton);\n\n    // Readonly input\n    const dateInput = document.createElement(\"date-time-readonly-input\");\n    dateInput.setAttribute(\"ref\", \"dateInput\");\n    inputWrapper.appendChild(dateInput);\n\n    // Decrement button\n    const decrementButton = document.createElement(\"date-time-decrement\");\n    decrementButton.setAttribute(\"ref\", \"decrementButton\");\n    inputWrapper.appendChild(decrementButton);\n\n    // Append input wrapper to main container\n    dateContainer.appendChild(inputWrapper);\n    container.appendChild(dateContainer);\n\n    // Helper text\n    if (description) {\n        const helperText = document.createElement(\"date-time-helper-text\");\n        helperText.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperText);\n    }\n\n    return container;\n};\n\nconst spinButtonTogetherTemplate = (description: any, label: any): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (label) {\n        const labelElement = document.createElement(\"date-time-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Main container\n    const dateContainer = document.createElement(\"div\");\n    dateContainer.classList.add(\"dg-date-time__container\", \"dg-field__container\");\n\n    // Input wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.classList.add(\"dg-date-time__input-wrapper\", \"dg-field__input-wrapper\");\n\n    // Readonly input\n    const dateInput = document.createElement(\"date-time-readonly-input\");\n    dateInput.setAttribute(\"ref\", \"dateInput\");\n    inputWrapper.appendChild(dateInput);\n\n    // Spin button\n    const spinButton = document.createElement(\"date-time-spin-button\");\n    spinButton.setAttribute(\"ref\", \"spinButton\");\n    inputWrapper.appendChild(spinButton);\n\n    // Append input wrapper to main container\n    dateContainer.appendChild(inputWrapper);\n    container.appendChild(dateContainer);\n\n    // Helper text\n    if (description) {\n        const helperText = document.createElement(\"date-time-helper-text\");\n        helperText.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperText);\n    }\n\n    return container;\n};\n\nconst BasicTemplateWithoutButtons = (description: any, label: any): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (label) {\n        const labelElement = document.createElement(\"date-time-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Main container\n    const dateContainer = document.createElement(\"div\");\n    dateContainer.classList.add(\"dg-date-time__container\", \"dg-field__container\");\n\n    // Input wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.classList.add(\"dg-date-time__input-wrapper\", \"dg-field__input-wrapper\");\n\n    // Readonly input\n    const dateInput = document.createElement(\"date-time-readonly-input\");\n    dateInput.setAttribute(\"ref\", \"dateInput\");\n    inputWrapper.appendChild(dateInput);\n\n    // Append input wrapper to main container\n    dateContainer.appendChild(inputWrapper);\n    container.appendChild(dateContainer);\n\n    // Helper text\n    if (description) {\n        const helperText = document.createElement(\"date-time-helper-text\");\n        helperText.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperText);\n    }\n\n    return container;\n};\n\nconst DatePickerTemplate = (description: any, label: any, calendarIcon: boolean): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (label) {\n        const labelElement = document.createElement(\"date-time-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Main container\n    const dateContainer = document.createElement(\"div\");\n    dateContainer.classList.add(\"dg-date-time__container\", \"dg-field__container\");\n\n    // Input wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.classList.add(\"dg-date-time__input-wrapper\", \"dg-field__input-wrapper\");\n\n    // Readonly input\n    const dateInput = document.createElement(\"date-time-readonly-input\");\n    dateInput.setAttribute(\"ref\", \"dateInput\");\n    inputWrapper.appendChild(dateInput);\n\n    // Calendar icon\n    if (calendarIcon) {\n        const icon = document.createElement(\"date-picker-icon-readonly\");\n        icon.setAttribute(\"ref\", \"pickericon\");\n        inputWrapper.appendChild(icon);\n    }\n\n    // Append input wrapper to main container\n    dateContainer.appendChild(inputWrapper);\n    container.appendChild(dateContainer);\n\n    // Helper text\n    if (description) {\n        const helperText = document.createElement(\"date-time-helper-text\");\n        helperText.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperText);\n    }\n\n    return container;\n};\n\n\nfunction RootTemplate(props: any): HTMLElement {\n    const { spinButton, getTemplate, label, description, type, calendarIcon } = props;\n    const classes = useUtilityClasses();\n    const div = document.createElement('div');\n    const customTemplate = getTemplate(classes);\n\n    let templateElement;\n\n    if (type === 'datetimepicker' || type === 'datepicker') {\n        templateElement = DatePickerTemplate(label, description, calendarIcon);\n    } else if (customTemplate) {\n        templateElement = customTemplate;\n    } else {\n        switch (spinButton) {\n            case \"together\":\n                templateElement = spinButtonTogetherTemplate(label, description);\n                break;\n            case \"split\":\n                templateElement = splitButtonTemplate(label, description);\n                break;\n            default:\n                templateElement = BasicTemplateWithoutButtons(label, description);\n        }\n    }\n\n    div.appendChild(templateElement);\n    return div.firstChild as HTMLElement;\n}\n\n\nexport class DateTimeReadonlyRootView extends Component {\n\t@queryAssignedNodes('dateInput') dateInputElement !      : any;\n\tprivate appendTo: HTMLElement | undefined;\n\tconstructor(appendTo: HTMLElement | undefined) {\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\t// change for framework view\n\t\tconst component: DateTimeComponentType = {\n\t\t\tgetElement             : () => this.getElement(),\n\t\t\taddOrRemoveCssClass: (className : string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className),\n\t\t\tgetInputElement  :  ()=>this.getInputElement(),\n\t\t\tdestroy: () => this.destroy(),\n\t\t};\n\n        // change createMangedBean to createWire\n\t\tconst controller = this.createManagedBean(new DateTimeReadonlyRootController());\n\n\t\tconst props = controller.getProperty();\n\t\tconst template = RootTemplate(props);\n\n\t\tconst properties = controller.getParamsProperty();\n\t\t\n\t\tthis.setTemplate(template, {\n\t\t\tincrementButton: properties.incrementButton,\n\t\t\tdecrementButton: properties.decrementButton,\n\t\t\tspinButton     : properties,\n\t\t\tlabel : properties.label,\n\t\t\tdescription : properties.description\n\t\t});\n\n\t\tcontroller.setComponent(component);\n\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n\tgetElement(){\n\t\treturn this.getGui();\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprivate appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.appendTo?.remove();\n\t\t\tthis.appendTo = undefined;\n\t\t});\n\t}\n\n\tprivate getInputElement(): HTMLInputElement{\n\t\treturn this.dateInputElement.eGui;\n\t}\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../modules/CSSRegistry\";\n\nexport function getDateTimeRootUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('date-time', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getDateTimeRootUtilityClass } from \"./date-time-root-classes\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { DateTimeComponentType } from \"./date-time-root.types\";\nimport { DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeOptionHandlerType, HookInitiator } from \"../model/date-time-options-handler.types\";\nimport { DateTimeControllerHandler } from \"../model/date-time-controller\";\nimport { DateTimeEventHandlerType } from \"../model/date-time-event-handler.types\";\nimport { DateTimeRootControllerType } from \"./date-time-root-controller.type\";\nimport { DATE_TIME_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { DatePickerInteractor } from \"../model/date-picker-interacter\";\nimport { DateTimeModel } from \"../model/date-time-model\";\nimport { subElement } from \"../model/date-time-api.type\";\n\nconst useUtilityClasses = (ownerState : any) => {\n\tconst { invalid, disabled, readonly } = ownerState;\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'root',\n\t\t\tmodifiers: [\n\t\t\t\tinvalid && 'error',\n\t\t\t\tdisabled && 'disabled',\n\t\t\t\treadonly && 'readonly',\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getDateTimeRootUtilityClass);\n};\n\n\n\n// const useUtilityClassesForComponent = (ownerState : any) => {\n// \tconst { invalid, disabled, readonly } = ownerState;\n// \tconst slots = {\n// \t\troot: {\n// \t\t\tslot: 'spinbutton-panel',\n// \t\t\tmodifiers: [\n// \t\t\t\tinvalid && 'error',\n// \t\t\t\tdisabled && 'disabled',\n// \t\t\t\treadonly && 'readonly',\n// \t\t\t],\n// \t\t},\n// \t};\n\n// \treturn composeClasses(slots, getDateTimeRootUtilityClass);\n// };\n\n\n\nexport class DateTimeRootController extends AbstractController<DateTimeComponentType> implements DateTimeRootControllerType {\n    \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: DateTimeOptionHandlerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_EVENT_HANDLER) dateTimeEventHandler !: DateTimeEventHandlerType;\n\t@AutoWired(DATETIME_BEAN_NAME.DATETIME_CONTROLLER_HANDLER) controllerHandler !: DateTimeControllerHandler;\n    @AutoWired(DATETIME_BEAN_NAME.DATE_PICKER_INTERACTOR) protected datePickerInteractor !: DatePickerInteractor;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_MODEL) protected model !: DateTimeModel;\n\n\n\tprivate isElementIsFocused: boolean = false;\n\n\n    init(){\n        this.registerEvents();\n\t\tthis.applyClassNames();\n\t\tthis.controllerHandler.registerDateTimeFieldController(this);\n\t\t// this.setTabindex();\n\n    }\n\n    private registerEvents() {\n\t\tconst element = this.component?.getGui() as HTMLElement\n        this.addListener(this.eventHandler, 'EVENT_FOCUS_OUT', this.applyClassNames.bind(this));\n        this.addListener(this.eventHandler, 'SET_FOCUS_OUT', this.setFocusOut.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.DESTROY_CALENDAR, this.focus.bind(this));\n\t\tthis.addListener(this.eventHandler,'FOCUS_INPUT_ELEMENT',this.focusInputElement.bind(this));\n\t\tthis.addListener(this.eventHandler,'FOCUS_CONTAINER',this.focus.bind(this));\n\t\tthis.addListener(this.eventHandler,'PROPERTY_CHANGED',this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler,'EVENT_VALUE_UPDATE',this.applyClassNames.bind(this));\n\n\n\n\t\t// this.addListener(this.eventHandler,, this.focus.bind(this));\n\t\telement.addEventListener('focusin', (_event)=>{\n\n\t\t\t// const ownerState = this.getOwnerState();\n\t\t\t\n\n\t\t\t// if( ownerState.readonly || ownerState.disabled) {\n\t\t\t// \treturn\n\t\t\t// }\n\t\t\t// const relatedTarget     = event.relatedTarget as HTMLElement;\n\t\t\t// const datePickerId      = this.datePickerInteractor.getId();\n\t\t\t// const datePickerElement = document.getElementById(datePickerId);\n\t\t\t// const timeDropDown      = document.getElementById('dg-dropdown__body-container');\n\t\t\t\n\t\t\t// if (!datePickerElement || !this.isElementWithinDateField(relatedTarget)) {\n\t\t\t// \tthis.isElementIsFocused = true;\n\t\t\t// \tthis.applyClassNames();\n\t\t\t// \tthis.focus('ui', event)\n\t\t\t// \treturn\n\t\t\t// }\n\t\t\t// const isTimeDropDown     = timeDropDown ? timeDropDown.contains(relatedTarget):false;\n\t\t\t// const isWithinDatePicker = datePickerElement === relatedTarget || datePickerElement.contains(relatedTarget) || isTimeDropDown;\n\t\t\t\n\t\t\t// if (!isWithinDatePicker) {\n\t\t\t// \tthis.isElementIsFocused = true;\n\t\t\t// \tthis.applyClassNames();\n\t\t\t// \tthis.focus('ui', event)\n\t\t\t// }\n\t\t});\n\n\t\telement.addEventListener('focusout', (event)=>{\n\t\t\tconst ownerState = this.getOwnerState();\n\t\t\t\n\t\t\tif( ownerState.readonly || ownerState.disabled) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t\t\t\tconst relatedTarget = event.relatedTarget as HTMLElement;\n\n\t\t\t\t\t\tif (element.contains(relatedTarget)) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n                        const datePickerId = this.datePickerInteractor.getId();\n                        const datePickerElement = document.getElementById(datePickerId);\n                        const timeDropDown = document.querySelector('.dg-dropdown__container');\n\n\n\t\t\t\t\t\tif(!datePickerElement || !relatedTarget){\n\t\t\t\t\t\t\t// const params = {\n\t\t\t\t\t\t\t// \ttype: 'On_Blur',\n\t\t\t\t\t\t\t// \tevent,\n\t\t\t\t\t\t\t// \tvalue : this.model.getDateObject(),\n\t\t\t\t\t\t\t// \tsource :'ui' as HookInitiator\n\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\t// this.optionHandler.onBlur(params)\n\t\t\t\t\t\t\tif(document.hasFocus()) {\n\t\t\t\t\t\t\t\tthis.isElementIsFocused = false;\n\t\t\t\t\t\t\t\tthis.applyClassNames();\n\t\t\t\t\t\t\t\tthis.blur('ui', event)\n\t\t\t\t\t\t\t\tthis.datePickerInteractor.destroyCalendar();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\n\t\t\t\t\t\t\treturn\n\n\t\t\t\t\t\t}\n                        // Close if either element is not in document\n                        const isTimeDropDown = timeDropDown ? timeDropDown.contains(relatedTarget):false;\n                        // Check if the related target is within either element\n                        const isWithinDatePicker = datePickerElement === relatedTarget || \n                                                 datePickerElement.contains(relatedTarget) || isTimeDropDown;\n                        \n                        if (!isWithinDatePicker  ) {\n\t\t\t\t\t\t\t// const params = {\n\t\t\t\t\t\t\t// \ttype: 'On_Blur',\n\t\t\t\t\t\t\t// \tevent,\n\t\t\t\t\t\t\t// \tvalue : this.model.getDateObject(),\n\t\t\t\t\t\t\t// \tsource :'ui' as HookInitiator\n\n\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\t// this.optionHandler.onBlur(params)\n\t\t\t\t\t\t\tif(document.hasFocus()) {\n\t\t\t\t\t\t\t\tthis.isElementIsFocused = false;\n\t\t\t\t\t\t\t\tthis.applyClassNames();\n\t\t\t\t\t\t\t\tthis.blur('ui', event)\n\t\t\t\t\t\t\t\tthis.datePickerInteractor.destroyCalendar();\n\t\t\t\t\t\t\t}\n\n                        }\n\t\t\t\n\t\t\t\n\n\t\t});\n    }\n\n\t// private isElementWithinDateField(element: HTMLElement): boolean {\n    //     let pointer: HTMLElement | null = element;\n        \n    //     while (pointer) {\n    //         if (pointer === this.component?.getGui()) {\n    //             return true;\n    //         }\n    //         pointer = pointer.parentElement;\n    //     }\n\n    //     return false;\n    // }\n\t\n\n\t// private setTabindex(){\n\t// \tconst element = this.component?.getGui() as HTMLElement;\n\t// \telement.setAttribute('tabindex','0');\n\t// }\n\n\tprivate addErrorState() : void {\n        const isValid = this.optionHandler.isValid();\n\n        this.component!.getGui().classList.toggle('dg-input__status--error', isValid);\n    }\n\n\tprivate setFocusOut():void{\n\t\tthis.isElementIsFocused = !this.isElementIsFocused\n\t}\n\n\n\tprivate applyClassNames(){\n\t\tconst ownerState = this.getOwnerState();\n\t\tconst classes = useUtilityClasses(ownerState);\n\t\tthis.component?.addOrRemoveCssClass(classes.root, true);\n\t\tthis.component?.getGui().classList.add(\"dg-field__root\");\n\t\tconst type = this.optionHandler.getType();\n\t\tif(type === 'datetimepicker' || type === 'datepicker'){\n\t\t\tthis.component?.getGui().classList.add(\"dg-date-picker__root\");\n\t\t}\n\n\t\townerState.disabled &&  this.component?.getGui().classList.add(\"dg-input__status--disabled\")\n\t\townerState.readonly &&  this.component?.getGui().classList.add(\"dg-input__status--readonly\")\n\t\townerState.focus &&  this.component?.getGui().classList.add(\"dg-input__status--focus\")\n\t\tthis.addErrorState();\n\t}\n\n\tprivate getOwnerState() {\n\t\treturn {\n\t\t\t// invalid : !this.numberModel.isValid(),\n\t\t\tdisabled: this.optionHandler.isDisabled(),\n\t\t\treadonly: this.optionHandler.isReadonly(),\n\t\t\tfocus   : this.isElementIsFocused,\n\t\t\t\n\t\t}\n\t}\n\n    getProperty() : any {\n        return {\n\t\t\t// onInput          : this.onInput.bind(this),\n\t\t\t// onKeyDown        : this.onKeyDown.bind(this),\n\t\t\t// onFocusIn        : this.onFocusIn.bind(this),\n\t\t\t// onFocusOut       : this.onFocusOut.bind(this),\n\t\t\t// isvalid          : this.numberModel.isValid(),\n\t\t\t// focused          : this.numberModel.isFocused(),\n\t\t\tlabel      : this.optionHandler.getLabel(),\n\t\t\tdescription: this.optionHandler.getDescription(),\n\t\t\tgenerateEmptyDom : this.optionHandler.shouldIgnoreEmptyDOM(),\n\t\t\ttype       : this.optionHandler.getType(),\n\t\t\thtmlFor    : 'number',\n\t\t\tid         : 'number',\n\t\t\trequired   : this.optionHandler.isRequired(),\n\t\t\treadOnly   : this.optionHandler.isReadonly(),\n\t\t\tdisabled   : this.optionHandler.isDisabled(),\n\t\t\t// onIncrement      : () => this.numberEventHandler.onIncrement(),\n\t\t\t// onDecrement      : () => this.numberEventHandler.onDecrement(),\n\t\t\t// incrementDisabled: this.numberModel.isIncrementDisabled(),\n\t\t\t// decrementDisabled: this.numberModel.isDecrementDisabled(),\n\t\t\tspinButton  : this.optionHandler.getSpinButton(),\n\t\t\tgetTemplate : (props: any) => this.optionHandler.getTemplate(props),\n\t\t\tcalendarIcon: this.optionHandler.getCalendarIcon(),\n\t\t\terror       : this.optionHandler.showErrorState()\n\t\t\t// registerAdjusterElement : (element : HTMLElement) => this.adjusterEventHandler.registerElement(element)\n\t\t};\n    }\n\n\tgetParamsProperty() {\n\n\t\treturn {\n\t\t\tincrementButton: {\n                getIcon          : () =>  this.optionsHandler.getIncrementButtonSVGIconId(),\n                getRenderer      : () => this.optionsHandler. getIncrementButtonRenderer(),\n                getRendererParams: () => this.optionsHandler. getIncrementButtonRendererParams(),\n                callback         : (event: any) => this.dateTimeEventHandler.onIncrement(event),\n                isDisabled    : () => false,\n\n\t\t\t\tisReadonly : () => this.optionHandler.isReadonly(),\n                getRole          : () => 'increment',\n\t\t\t\tgetSpinButton : () =>(this.optionsHandler.getSpinButton() === 'split' ? true : false),\n\t\t\t\tgetClasses : ()=> [\"dg-date-time__spinbutton\", \"dg-date-time__spin-downbtn\"],\n\t\t\t\tgetSvgClasses : ()=>\"dg-date-time__increment-svg\"\n\n\t\t\t},\n\t\t\tdecrementButton: {\n                getIcon       : () =>  this.optionsHandler.getDecrementButtonSVGIconId(),\n                renderer      : () => this.optionsHandler.getDecrementButtonRenderer(),\n                rendererParams: () => this.optionsHandler.getDecrementButtonRendererParams(),\n                callback      : (event : any) => this.dateTimeEventHandler.onDecrement(event),\n                isDisabled    : () => false,\n\t\t\t\tisReadonly : () => this.optionHandler.isReadonly(),\n                getRole       : () => 'decrement',\n\t\t\t\tgetSpinButton : () =>(this.optionsHandler.getSpinButton() === 'split' ? true : false),\n\t\t\t\tgetClasses    : ()=> [ \"dg-date-time__spinbutton\", \"dg-date-time__spin-downbtn\"],\n\t\t\t\tgetSvgClasses : ()=>\"dg-date-time__decrement-svg\"\n\n\t\t\t},\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> \"dg-date-time__label\",\n\t\t\t\tgetLabelTitleClasses :()=> \"dg-date-time__label-title\"\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-date-time__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-date-time__description\"\n\t\t\t}\n\t\t};\n    }\n\n\tgetElement() : HTMLElement {\n\t\treturn this.component?.getGui() as HTMLElement;\n\t}\n\n\tfocusInputElement(source:HookInitiator, event?:FocusEvent):void {\n\t\t\t\n\t\tconst elem = this.component?.getInputElement() as HTMLElement;\n\t\telem.focus();\n\t\tthis.focus(source, event)\n\t}\n\n\tfocus(source:HookInitiator, event?:FocusEvent):void {\n\t\t// this.component?.getGui().focus();\n\t\t\n\t\tconst inputElement = this.component?.getInputElement() as HTMLElement;\n\t\tinputElement.focus();\n\n\t\tthis.isElementIsFocused = true;\n\t\tthis.applyClassNames();\n\n\n\t\tconst params = {\n\t\t\ttype: 'On_Focus',\n\t\t\tevent,\n\t\t\tvalue : this.model.getDateObject(),\n\t\t\tsource \n\t\t}\n\t\tthis.optionHandler.onFocus(params);\n\n\t}\n\n\tblur(source:HookInitiator, event?:FocusEvent):void {\n\t\t// this.component?.getGui().blur();\n\n\t\n\t\tconst elem = this.component?.getInputElement() as HTMLElement;\n\t\telem.blur();\n\t\tconst params = {\n\t\t\ttype: 'On_Blur',\n\t\t\tevent,\n\t\t\tvalue : this.model.getDateObject(),\n\t\t\tsource\n\t\t}\n\t\tthis.optionHandler.onBlur(params);\n\n\t}\n\n\thide(subElement: subElement[]): void {\n\t\tif (!this.component?.getGui()) {\n\t\t\tconsole.warn('Component GUI not available');\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subElement || subElement.length === 0) {\n\t\t\t// Hide the entire component\n\t\t\tconst elem = this.component.getGui();\n\t\t\telem.style.display = \"none\";\n\t\t\treturn;\n\t\t}\n\n\t\t// Hide specific elements\n\t\tsubElement.forEach(element => {\n\t\t\tlet elem: HTMLElement | null | undefined = null;\n\n\t\t\tswitch (element) {\n\t\t\t\tcase 'suffix':\n\t\t\t\t\telem = this.component?.getSuffixElement() ;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'prefix':\n\t\t\t\t\telem = this.component?.getPrefixElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'label':\n\t\t\t\t\telem = this.component?.getLabelElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'description':\n\t\t\t\t\telem = this.component?.getDescriptionElement();\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn(`Unknown element type to hide: ${element}`);\n\t\t\t}\n\n\t\t\tif (elem) {\n\t\t\t\telem.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t}\n\n\tshow(subElement: subElement[]): void {\n\t\tif (!this.component?.getGui()) {\n\t\t\tconsole.warn('Component GUI not available');\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subElement || subElement.length === 0) {\n\t\t\t// Hide the entire component\n\t\t\tconst elem = this.component.getGui();\n\t\t\telem.style.display = \"block\";\n\t\t\treturn;\n\t\t}\n\n\t\t// Hide specific elements\n\t\tsubElement.forEach(element => {\n\t\t\tlet elem: HTMLElement | null | undefined = null;\n\n\t\t\tswitch (element) {\n\t\t\t\tcase 'suffix':\n\t\t\t\t\telem = this.component?.getSuffixElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'prefix':\n\t\t\t\t\telem = this.component?.getPrefixElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'label':\n\t\t\t\t\telem = this.component?.getLabelElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'description':\n\t\t\t\t\telem = this.component?.getDescriptionElement();\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn(`Unknown element type to hide: ${element}`);\n\t\t\t}\n\n\t\t\tif (elem) {\n\t\t\t\telem.style.display = \"flex\";\n\t\t\t}\n\t\t});\n\t}\n\n\n\tdestroy():void {\n\t\tsuper.destroy();\n\t\tthis.component?.getGui().remove();\n\n\t\t// this.component?.destroy();\n\t\t// this.dispatchEvent({\n\t\t// \ttype: DATE_TIME_CUSTOM_EVENTS.DESTROY_CALENDAR\n\t\t// })\n\t}\n\n\topenPicker():void {\n\t\tthis.datePickerInteractor.createCalendar()\n\t}\n\n\tclosePicker():void{\n\t\tthis.datePickerInteractor.destroyCalendar()\n\t\t\n\n\t}\n\tgetInputElement():HTMLElement{\n\t\treturn this.component?.getInputElement() as HTMLElement;\n\t}\n\n\tgetDateInputWrapper(): HTMLElement {\n\t\treturn this.component?.getDateInputWrapper() as HTMLElement;\n\t}\n}","import { PostConstruct, queryAssignedNodes } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { composeClasses } from '@dg/utils';\nimport { getDateTimeRootUtilityClass } from './date-time-root-classes';\nimport { DateTimeRootController } from './date-time-root-controller';\nimport { DateTimeComponentType } from './date-time-root.types';\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'container',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getDateTimeRootUtilityClass)\n}\n\n// const splitButtonTemplate = (description:any, label:any ) => {\n// \treturn `<div>\n// \t\t${ label ? `<date-time-label ref=\"label\"></date-time-label>`:\"\"}\n// \t\t<div class=\"dg-date-time__container dg-field__container\">\n// \t\t\t<div class=\"dg-date-time__input-wrapper dg-field__input-wrapper\">\n// \t\t\t\t<date-time-increment ref=\"incrementButton\"></date-time-increment>\n// \t\t\t\t<date-time-input ref=\"dateInput\"></date-time-input>\n// \t\t\t\t<date-time-decrement ref=\"decrementButton\"></date-time-decrement>\n// \t\t\t</div>\n// \t\t</div>\n// \t\t${ description ? `<date-time-helper-text ref = \"description\"></date-time-helper-text>`:\"\"}\n// \t</div>`\n// }\n\n// const spinButtonTogetherTemplate = (description: any, label:any ) => {\n// \treturn `<div>\n// \t${ label ? `<date-time-label ref=\"label\"></date-time-label>`:\"\"}\n// \t\t<div class=\"dg-date-time__container dg-field__container\">\n// \t\t\t<div class=\"dg-date-time__input-wrapper dg-field__input-wrapper\">\n// \t\t\t\t<date-time-input ref=\"dateInput\"></date-time-input>\n// \t\t\t\t<date-time-spin-button ref=\"spinButton\"></date-time-spin-button>\n// \t\t\t</div>\n// \t\t</div>\n// \t\t${ description ? `<date-time-helper-text ref = \"description\"></date-time-helper-text>`:\"\"}\n// \t</div>`\n// }\n\n// const BasicTemplateWithoutButtons = ( description: any, label:any )=>{\n// \treturn `<div>\n// \t${ label ? `<date-time-label ref=\"label\"></date-time-label>`:\"\"}\n// \t\t<div class=\"dg-date-time__container dg-field__container\">\n// \t\t\t<div class=\"dg-date-time__input-wrapper dg-field__input-wrapper\">\n// \t\t\t\t<date-time-input ref=\"dateInput\"></date-time-input>\n// \t\t\t</div>\n// \t\t</div>\t\n// \t\t${ description ? `<date-time-helper-text ref = \"description\"></date-time-helper-text>`:\"\"}\n// \t</div>`\n\n// }\n\n\n\n// const DatePickerTemplate = (label: any, description: any, calendarIcon: boolean,spinButton:string) => {\n// \treturn `<div>\n// \t\t${label ? `<date-time-label ref=\"label\"></date-time-label>` : \"\"}\n// \t\t<div class=\"dg-date-time__container dg-field__container\">\n// \t\t\t<div class=\"dg-date-time__input-wrapper dg-field__input-wrapper\">\n// \t\t\t\t<date-time-input ref=\"dateInput\"></date-time-input>\n// \t\t\t\t${spinButton === 'together' ? `<date-time-spin-button ref=\"spinButton\"></date-time-spin-button>`:``}\n// \t\t\t\t${ spinButton ==='none' && calendarIcon ? `<date-picker-icon></date-picker-icon>` : \"\"}\n// \t\t\t</div>\n// \t\t</div>\t\n// \t\t${description ? `<date-time-helper-text ref=\"description\"></date-time-helper-text>` : \"\"}\n// \t</div>`;\n// };\n\nconst splitButtonTemplate = (description: boolean, label: boolean,generateEmptyDom: boolean, error : boolean): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (generateEmptyDom || label) {\n        const labelElement = document.createElement(\"date-time-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Main Container\n    const dateTimeContainer = document.createElement(\"div\");\n    dateTimeContainer.classList.add(\"dg-date-time__container\", \"dg-field__container\");\n\n    // Input Wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.classList.add(\"dg-date-time__input-wrapper\", \"dg-field__input-wrapper\");\n\n    // Increment Button\n    const incrementButton = document.createElement(\"date-time-increment\");\n    incrementButton.setAttribute(\"ref\", \"incrementButton\");\n    inputWrapper.appendChild(incrementButton);\n\n    // Date Input\n    const dateInput = document.createElement(\"date-time-input\");\n    dateInput.setAttribute(\"ref\", \"dateInput\");\n    inputWrapper.appendChild(dateInput);\n\n    // Decrement Button\n    const decrementButton = document.createElement(\"date-time-decrement\");\n    decrementButton.setAttribute(\"ref\", \"decrementButton\");\n    inputWrapper.appendChild(decrementButton);\n\n    // Append input wrapper to container\n    dateTimeContainer.appendChild(inputWrapper);\n    container.appendChild(dateTimeContainer);\n\n    // Description\n    if (generateEmptyDom || description) {\n        const helperText = document.createElement(\"date-time-helper-text\");\n        helperText.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperText);\n    }\n\n    if (generateEmptyDom || error) {\n        const errorElement = document.createElement(\"date-error\");\n        errorElement.setAttribute(\"ref\", \"error\");\n        container.appendChild(errorElement);\n    }\n\n    return container;\n};\n\nconst spinButtonTogetherTemplate = (description: boolean, label: boolean,generateEmptyDom: boolean, error : boolean): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (generateEmptyDom || label) {\n        const labelElement = document.createElement(\"date-time-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Main Container\n    const dateTimeContainer = document.createElement(\"div\");\n    dateTimeContainer.classList.add(\"dg-date-time__container\", \"dg-field__container\");\n\n    // Input Wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.setAttribute('ref', 'date-inpu-wrapper');\n    inputWrapper.classList.add(\"dg-date-time__input-wrapper\", \"dg-field__input-wrapper\");\n\n    // Date Input\n    const dateInput = document.createElement(\"date-time-input\");\n    dateInput.setAttribute(\"ref\", \"dateInput\");\n    inputWrapper.appendChild(dateInput);\n\n    // Spin Button\n    const spinButton = document.createElement(\"date-time-spin-button\");\n    spinButton.setAttribute(\"ref\", \"spinButton\");\n    inputWrapper.appendChild(spinButton);\n\n    // Append input wrapper to container\n    dateTimeContainer.appendChild(inputWrapper);\n    container.appendChild(dateTimeContainer);\n\n    // Description\n    if (generateEmptyDom || description) {\n        const helperText = document.createElement(\"date-time-helper-text\");\n        helperText.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperText);\n    }\n\n    if (generateEmptyDom || error) {\n        const errorElement = document.createElement(\"date-error\");\n        errorElement.setAttribute(\"ref\", \"error\");\n        container.appendChild(errorElement);\n    }\n\n    return container;\n};\nconst BasicTemplateWithoutButtons = ( label: string ,description: string, generateEmptyDom: boolean, error : boolean): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (generateEmptyDom || label) {\n        const labelElement = document.createElement(\"date-time-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Main Container\n    const dateTimeContainer = document.createElement(\"div\");\n    dateTimeContainer.classList.add(\"dg-date-time__container\", \"dg-field__container\");\n\n    // Input Wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.setAttribute('ref', 'date-inpu-wrapper');\n    inputWrapper.classList.add(\"dg-date-time__input-wrapper\", \"dg-field__input-wrapper\");\n\n    // Date Input\n    const dateInput = document.createElement(\"date-time-input\");\n    dateInput.setAttribute(\"ref\", \"dateInput\");\n    inputWrapper.appendChild(dateInput);\n\n    // Append input wrapper to container\n    dateTimeContainer.appendChild(inputWrapper);\n    container.appendChild(dateTimeContainer);\n\n    // Description\n    if (generateEmptyDom || description) {\n        const helperText = document.createElement(\"date-time-helper-text\");\n        helperText.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperText);\n    }\n\n    if (generateEmptyDom || error) {\n        const errorElement = document.createElement(\"date-error\");\n        errorElement.setAttribute(\"ref\", \"error\");\n        container.appendChild(errorElement);\n    }\n\n    return container;\n};\n\n\nconst DatePickerTemplate = (\n    label: boolean,\n    description: boolean,\n    calendarIcon: boolean,\n    spinButton: string,\n    generateEmptyDom: boolean,\n    error : boolean\n): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (generateEmptyDom || label) {\n        const labelElement = document.createElement(\"date-time-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Main Container\n    const dateTimeContainer = document.createElement(\"div\");\n    dateTimeContainer.classList.add(\"dg-date-time__container\", \"dg-field__container\");\n\n    // Input Wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.setAttribute('ref', 'date-inpu-wrapper');\n    inputWrapper.classList.add(\"dg-date-time__input-wrapper\", \"dg-field__input-wrapper\");\n\n    // Date Input\n    const dateInput = document.createElement(\"date-time-input\");\n    dateInput.setAttribute(\"ref\", \"dateInput\");\n    inputWrapper.appendChild(dateInput);\n\n    // Spin Button\n    if (spinButton === \"together\") {\n        const spinBtn = document.createElement(\"date-time-spin-button\");\n        spinBtn.setAttribute(\"ref\", \"spinButton\");\n        inputWrapper.appendChild(spinBtn);\n    }\n\n    // Calendar Icon (if spinButton is 'none' and calendarIcon is true)\n    if (spinButton === \"none\" && calendarIcon) {\n        const calendarIconElement = document.createElement(\"date-picker-icon\");\n        inputWrapper.appendChild(calendarIconElement);\n    }\n\n    // Append input wrapper to container\n    dateTimeContainer.appendChild(inputWrapper);\n    container.appendChild(dateTimeContainer);\n\n    // Description\n    if (generateEmptyDom || description) {\n        const helperText = document.createElement(\"date-time-helper-text\");\n        helperText.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperText);\n    }\n\n    if (generateEmptyDom || error) {\n        const errorElement = document.createElement(\"date-error\");\n        errorElement.setAttribute(\"ref\", \"error\");\n        container.appendChild(errorElement);\n    }\n\n    return container;\n};\n\n\n\n\nfunction RootTemplate(props : any): HTMLElement {\n\tconst { spinButton, getTemplate, label, description, type,calendarIcon,generateEmptyDom, error } = props;\n\tconst classes = useUtilityClasses();\n\tconst div = document.createElement('div');\n\tconst customTemplate = getTemplate(classes);\n\n\tif(type === 'datetimepicker' || type === 'datepicker' || type === 'timepicker') {\n\t\tconst template = DatePickerTemplate(label,description,calendarIcon,spinButton, generateEmptyDom, error);\n\t\tdiv.appendChild(template);\n\t\treturn div.firstChild as HTMLElement;\n\t}\n\n\tconst template = customTemplate ? customTemplate : (spinButton === \"together\" ? spinButtonTogetherTemplate(label,description,generateEmptyDom, error):(spinButton === \"split\" ? splitButtonTemplate(label,description, generateEmptyDom, error) : BasicTemplateWithoutButtons( label, description,generateEmptyDom, error)))\n\n\t// const template = spinButton === 'together' ? (customTemplate ? customTemplate : spinButton ? spinButtonTogetherTemplate(classes,label,helperText) : splitButtonTemplate(classes, label,helperText)): BasicTemplateWithoutButtons(classes, label, helperText);\n\tdiv.appendChild(template);\n\treturn div.firstChild as HTMLElement;\n}\n\nexport class DateTimeRootView extends Component {\n\t@queryAssignedNodes('dateInput') dateInputElement !      : any;\n    @queryAssignedNodes('prefix') prefixElement \t\t\t !: any;\n\t@queryAssignedNodes('suffix') suffixElement \t\t\t !: any;\n\t@queryAssignedNodes('label') LabelElement \t\t\t !: any;\n\t@queryAssignedNodes('description') descriptionElement \t\t\t !: any;\n    @queryAssignedNodes('date-inpu-wrapper') dateInputWrapper !: HTMLElement;\n\n\tprivate appendTo: HTMLElement | undefined;\n\tconstructor(appendTo: HTMLElement | undefined) {\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\t// change for framework view\n\t\tconst component: DateTimeComponentType = {\n\t\t\tgetGui             : () => this.getGui(),\n\t\t\t// getElement             : () => this.getElement(),\n\t\t\taddOrRemoveCssClass: (className : string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className),\n\t\t\tgetInputElement  :  ()=>this.getInputElement(),\n\t\t\tdestroy: () => this.destroy(),\n            getSuffixElement : ()=> this.getSuffixElement(),\n\t\t\tgetPrefixElement : ()=> this.getPrefixElement(),\n\t\t\tgetLabelElement : ()=> this.getLabelElement(),\n\t\t\tgetDescriptionElement : ()=> this.getDescriptionElement(),\n            getDateInputWrapper : () => this.dateInputWrapper\n\t\t};\n\n        // change createMangedBean to createWire\n\t\tconst controller = this.createManagedBean(new DateTimeRootController());\n\n\t\tconst props = controller.getProperty();\n\t\tconst template = RootTemplate(props);\n\n\t\tconst properties = controller.getParamsProperty();\n\t\t\n\t\tthis.setTemplate(template, {\n            incrementButton: properties.incrementButton,\n            decrementButton: properties.decrementButton,\n            spinButton     : properties,\n            label          : properties.label,\n            description    : properties.description,\n            error          : properties.description\n\t\t});\n\n\t\tcontroller.setComponent(component);\n\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n\tgetElement(){\n\t\treturn this.getGui();\n\t}\n\n    getSuffixElement():any{\n\t\treturn this.suffixElement ? this.suffixElement.eGui  : null; \n\t}\n\n\t getLabelElement():any{\n\t\treturn this.LabelElement ? this.LabelElement.eGui  : null\n\t}\n\n\t getDescriptionElement():any{\n\t\treturn this.descriptionElement ? this.descriptionElement.eGui : null;\n\t}\n\n\t getPrefixElement():any{\n\t\treturn this.prefixElement ? this.prefixElement.eGui : null\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprivate appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.appendTo?.remove();\n\t\t\tthis.appendTo = undefined;\n\t\t});\n\t}\n\n\tprivate getInputElement(): HTMLInputElement{\n\t\treturn this.dateInputElement.eGui;\n\t}\n}","import { composeClasses } from \"@dg/utils\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { SpinButtonCompType } from \"./spin-button.types\";\nimport { getDateTimeRootUtilityClass } from \"../date-time-root/date-time-root-classes\";\nimport { DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { AutoWired } from \"@dg/corecomponent\";\nimport { DateTimeEventHandlerType } from \"../model/date-time-event-handler.types\";\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot    : {\n            slot     : 'spinbutton-panel',\n            modifiers: []\n        }\n\t};\n\n\treturn composeClasses(slots, getDateTimeRootUtilityClass);\n};\n\nexport class SpinButtonController extends EventEmitter {\n    private    comp                                                     !: SpinButtonCompType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_EVENT_HANDLER) dateTimeEventHandler !: DateTimeEventHandlerType;\n\n    setComp   (comp : SpinButtonCompType)                               : void {\n        this.comp = comp;\n\n        this.applyClasses();\n    }\n    \n    private applyClasses() : void {\n        const classes = useUtilityClasses();\n        this.comp.addOrRemoveCSSClass(classes.root)\n    }\n\n    getProperty() {\n        return {\n\t\t\tincrementButton: {\n                getIcon          : () =>  this.optionsHandler.getIncrementButtonSVGIconId(),\n                getRenderer      : () => this.optionsHandler.getIncrementRenderer(),\n                getRendererParams: () => this.optionsHandler.getIncrementRendererParams(),\n                callback         : () => this.dateTimeEventHandler.onIncrement(),\n                isDisabled       : () => false,\n                getRole          : () => 'increment',\n                enableStepperButtons : () =>this.optionsHandler.enableStepperButtons(),\n                getSvgClasses : ()=>\"dg-date-time__decrement-svg\"\n\t\t\t},\n\t\t\tdecrementButton: {\n                getIcon       : () =>  this.optionsHandler.getDecrementButtonSVGIconId(),\n                renderer      : () => this.optionsHandler.getDecrementRenderer(),\n                rendererParams: () => this.optionsHandler.getDecrementRendererParams(),\n                callback      : () => this.dateTimeEventHandler.onDecrement(),\n                isDisabled    : () => false,\n                getRole       : () => 'decrement',\n                enableStepperButtons : () =>this.optionsHandler.enableStepperButtons(),\n                getSvgClasses : ()=>\"dg-date-time__increment-svg\"\n\t\t\t},\n\t\t};\n        return{}\n    }\n}","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { SpinButtonController } from \"./spin-button-controller\";\nimport { SpinButtonCompType } from \"./spin-button.types\";\n\nconst spinButtonTemplate = (): HTMLElement => {\n    const container = document.createElement(\"div\");\n\n    const incrementButton = document.createElement(\"date-time-increment\");\n    incrementButton.setAttribute(\"ref\", \"incrementButton\");\n\n    const decrementButton = document.createElement(\"date-time-decrement\");\n    decrementButton.setAttribute(\"ref\", \"decrementButton\");\n\n    container.appendChild(incrementButton);\n    container.appendChild(decrementButton);\n\n    return container;\n};\n\nexport class SpinButtonComponent extends Component {\n    private params : any;\n    constructor(params : any) {\n        super();\n        this.params = params;\n    }\n\n    @PostConstruct()\n    init() : void {\n        const controller = this.createBean(new SpinButtonController());\n\n        this.setTemplate(spinButtonTemplate(), {\n\t\t\tincrementButton: this.params.incrementButton,\n\t\t\tdecrementButton: this.params.decrementButton\n\t\t});\n\n        const comp : SpinButtonCompType = {\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        \n        controller.setComp(comp);\n    }\n\n    private addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n}","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { PopupHandler } from \"./popup-handler\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeControllerHandlerType } from \"./date-time-controller.type\";\nimport { DateTimePickerStateManagerType } from \"./date-picker-state-manager.types\";\nimport { DateTimeModelType } from \"./date-time-model.types\";\nimport { ICalendarConfiguration } from \"../../../../calendar/src/calendar-configuration.types\";\nimport { Calendar } from \"../../../../calendar/src/calendar\";\nimport { PopupComponentPositionParams, Position } from \"../../../../utility/PopupHandler/CorePopupHandler\";\nimport { DATE_TIME_CUSTOM_EVENTS, INTERNAL_EVENTS } from \"../../constant/event-name\";\n\n\n\n@Bean(DATETIME_BEAN_NAME.DATE_PICKER_INTERACTOR)\nexport class DatePickerInteractor extends AbstractController<any>{\n\n    @AutoWired(BEAN_NAME.POPUP_HANDLER) protected popupHandler !: PopupHandler;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_MODEL) protected model !: DateTimeModelType;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_PICKER_STATE_MANAGER) protected stateManager !: DateTimePickerStateManagerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_CONTROLLER_HANDLER) controllerHandler !: DateTimeControllerHandlerType;\n    \n\n    private calendar: any;\n    private popupDestroy :any;\n\n    init(){\n    this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.DESTROY_CALENDAR, (params : any) => this.destroyCalendar(params.event));\n    this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.CREATE_CALENDAR, this.createCalendar.bind(this));\n    this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.UPDATE_CALENDAR, this.setDate.bind(this));\n    this.addListener(this.eventHandler,DATE_TIME_CUSTOM_EVENTS.CLEAR_VALUE_IN_PICKER,this.clearValue.bind(this))\n    }\n      createCalendar():void{\n        if (this.calendar) {\n            // this.destroyCalendar();\n            // return\n        } \n        else {\n            \n            const calendarParams :ICalendarConfiguration = { \n                appendTo      : this.optionsHandler.getDatePickerAppendTo(),\n                \n                value         :  this.model.getSelectedDateTime(),\n                minDate       : this.model.getMinDate(),\n                id      : createId(),\n                maxDate       : this.model.getMaxDate(),\n                monthFormat   : 'MMM',\n                inputElement  : this.controllerHandler.getDateTimeFieldController().getInputElement(),\n                format        : this.model.getFormat(),\n                ariaLabelledby: this.optionsHandler.getAriaLabelledby(),\n                      // className     : this.optionsHandler.getClassName(),\n                type             : this.optionsHandler.getType(),\n                pickerType       : this.optionsHandler.getType(),\n                minuteInterval : this.optionsHandler.getMinuteInterval(),\n                hourCycle        : this.optionsHandler.getHourCycle(),\n                showAdjacentDates: false,\n                showTimePicker   : this.optionsHandler.getShowTimePicker(),\n                onDestroy : this.stateUpdate.bind(this),\n                onChange         : (value:any)=>{\n                                    this.model.setValue(value);\n                                    this.model.setActivatePlaceholder(false);\n                                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE_BY_DATEPICKER});\n                                    const inputElement =  this.controllerHandler.getDateTimeFieldController().getInputElement();\n                                    inputElement.focus();\n                                    setTimeout(() => {\n                                        this.dispatchEvent({\n                                            type: INTERNAL_EVENTS.MAKE_SELECTION\n                                        });\n                                    }, 0);\n\n\n\n                                },\n                onClick : (_event :MouseEvent)=>{\n                                    // const type = this.optionsHandler.getType();\n                                    // if(type !== 'datetimepicker'){\n                                    //     this.destroyCalendar();\n                                    // }\n\n                            }         \n            }\n\n\n            this.calendar = new Calendar(calendarParams);\n    \n            const calendarElement = this.calendar.api.getElement();\n            const sourceElement = this.controllerHandler.getDateTimeFieldController().getDateInputWrapper() as HTMLElement;\n            \n            const positionParams: PopupComponentPositionParams = {\n                popUpElement    : calendarElement,\n                // sourceElement : this.optionsHandler.getAppendTo(),\n                sourceElement,\n                position        : Position.bottomLeft,\n                keepWithinBounds : true,\n                gapX : this.optionsHandler.getHorizontalSpacing(),\n                gapY : this.optionsHandler.getVerticalSpacing(),\n            };\n    \n            const positionCallback = this.popupHandler.positionPopupByComponent.bind(this.popupHandler, positionParams,this.optionsHandler.getDatePickerAppendTo());\n    \n            const addPopup = this.popupHandler.addPopup({\n                                childElement   : calendarElement,\n                                anchorToElement:sourceElement,\n                                // anchorToElement: this.component?.getElement() as HTMLElement,\n                                popupParentElement: this.optionsHandler.getDatePickerAppendTo(),\n                                positionCallback,\n                                ariaLabel : ''\n                            });\n            this.popupDestroy = addPopup.hideFunction;\n\n        }\n        this.stateManager.setState(true);\n        this.optionsHandler.onPickerOpen();\n\n    };\n\n    setDate(){\n        // const date = this.model.getDateAsDayjs();\n        // const formattedDateString = this.placeholderManager.getPlaceholder(); // TODO :  need change hot fix\n        // const isValidDate = !isNaN(new Date(formattedDateString).getTime()); // TODO :  need change hot fix\n        const date= this.model.getDateObject()\n       this.calendar && this.calendar.api.updateProperties({value : date})\n    }\n\n\n    destroyCalendar(event ?: Event){\n        if(this.calendar){\n            this.calendar.api.destroy();\n            this.popupDestroy();\n            this.calendar = null;\n            this.stateManager.setState(false);\n            if(event) { // need to check with implementation\n                // event.preventDefault();\n                // event.stopPropagation();\n            }\n\n        }\n      \n\n    }\n\n    stateUpdate(){\n        this.stateManager.setState(false)\n        this.calendar = null;\n\n\n    }\n\n    getId(){\n        return this.calendar?.api.getId();\n    }\n\n    private clearValue():void{\n        this.calendar.api.updateProperties({value : null})\n    }\n}\n\n\nfunction createId(){\n    return `datepicker-${Math.random().toString(36).substring(2, 9)}`;\n}","import { Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DATE_TIME__BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimePickerStateManagerType } from \"./date-picker-state-manager.types\";\n\n\n\n\n@Bean(DATE_TIME__BEAN_NAME.DATE_TIME_PICKER_STATE_MANAGER)\nexport class DateTimePickerStateManager extends EventEmitter implements DateTimePickerStateManagerType{\n\n    private dateOpenState : boolean = false;\n\n    setState(force : boolean){\n        this.dateOpenState = force\n    }\n\n    getState(): boolean{\n        return this.dateOpenState;\n    }\n\n}","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeApiType, subElement } from \"./date-time-api.type\";\nimport { DateTimeModel } from \"./date-time-model\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DateTimeControllerHandlerType } from \"./date-time-controller.type\";\nimport { DateTimeConfiguration } from \"../../date-time-configuration.types\";\nimport { DatePickerInteractor } from \"./date-picker-interacter\";\nimport { DATE_TIME_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { DateTimeOptionHandlerType } from \"./date-time-options-handler.types\";\nimport dayjs from \"dayjs\";\n\n@Bean(DATETIME_BEAN_NAME.DATETIME_API)\nexport class DateTimeApi extends EventEmitter implements DateTimeApiType {\n\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_CONTROLLER_HANDLER) controllerHandler !        : DateTimeControllerHandlerType;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_MODEL) protected model !                       : DateTimeModel;\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_CONFIGURATION) configuration!                  : DateTimeConfiguration;\n    @AutoWired(DATETIME_BEAN_NAME.DATE_PICKER_INTERACTOR) protected datePickerInteractor !: DatePickerInteractor;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !                        : DateTimeOptionHandlerType;\n \n\n\n\n    getElement() : HTMLElement {\n        return this.controllerHandler.getDateTimeFieldController().getElement();\n    }\n\n    getValue(): Date | null{\n        const selectedDatevalue = this.model.getSelectedDateTime()\n        if(!selectedDatevalue){\n            return null;\n        }else{\n            return this.model.getDateObject();\n        }\n    }\n    destroy(): void{\n         this.controllerHandler.getDateTimeFieldController().destroy();\n         this.datePickerInteractor.destroyCalendar()\n         \n\n\n    }\n\n    focus(){\n        this.controllerHandler.getDateTimeFieldController().focus('api');\n\n    }\n\n    blur(){\n        this.controllerHandler.getDateTimeFieldController().blur('api');\n    }\n\n    hide(subElement?: subElement[]): void {\n        if (!subElement || subElement.length === 0) {\n            // Hide the entire component if no specific elements are specified\n            return this.controllerHandler.getDateTimeFieldController().hide([]);\n        }\n\n        // Validate that all elements in subElement are valid\n        const validElements = subElement.filter(element => \n            ['prefix', 'suffix', 'label', 'description', 'inputPrefix', 'inputSuffix', 'container', 'tooltip', 'errorMessage', 'validationMessage'].includes(element)\n        );\n\n        if (validElements.length === 0) {\n            console.warn('No valid elements specified to hide');\n            return;\n        }\n\n        return this.controllerHandler.getDateTimeFieldController().hide(validElements);\n    }\n    show(subElement?: subElement[]): void {\n        if (!subElement || subElement.length === 0) {\n            // Hide the entire component if no specific elements are specified\n            return this.controllerHandler.getDateTimeFieldController().show([]);\n        }\n\n        // Validate that all elements in subElement are valid\n        const validElements = subElement.filter(element => \n            ['prefix', 'suffix', 'label', 'description', 'inputPrefix', 'inputSuffix', 'container', 'tooltip', 'errorMessage', 'validationMessage'].includes(element)\n        );\n\n        if (validElements.length === 0) {\n            console.warn('No valid elements specified to show');\n            return;\n        }\n\n        return this.controllerHandler.getDateTimeFieldController().show(validElements);\n    }\n\n    setValue(value:any){\n        const dateTime  =  new Date(value);\n        this.model.setValue(dateTime,'api');\n        this.dispatchEvent({type:DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED,option:'API'})\n\n    }\n\n    updateProperties(properties : DateTimeConfiguration) {\n        //this.controllerHandler.getDateTimeFieldController().updateProperties(options);\n        Object.entries(properties).forEach(([key, value]) => {\n            if (value !== undefined) {\n                // Cast key as keyof INumberConfiguration to maintain type safety\n                (this.configuration as any)[key] = value; \n            }\n        });\n        this.dispatchEvent({\n            type: DATE_TIME_CUSTOM_EVENTS.UPDATE_FORMAT,\n            options: properties,\n        })\n        const value = properties.value;\n\n        if(value) {\n            this.model.setValue(value,'api');\n        }else if(value === null){\n            this.model.setValue(value,'api');\n        }\n\n       \n\n        this.dispatchEvent({\n            type: \"PROPERTY_CHANGED\",\n            options: properties,\n        });\n\n    }\n\n\n    showDatePickerIcon(){\n        this.dispatchEvent({type: 'SHOW_DATEPICKER_ICON',});\n    }\n\n    getValueAsTimeStamp(): number|null {\n        const selectedDatevalue = this.model.getSelectedDateTime()\n        if(!selectedDatevalue){\n            return null; // or return Date.now(), or another appropriate default number\n        }else{\n            return this.model.getValueAsTimeStamp();\n        }\n    }\n\n    getFormattedValue(){\n        return this.model.getFormattedValue();\n    }\n\n    getTime(): string | null {\n        if (this.optionHandler.getType() !== 'timepicker') {\n            return null;\n        }\n        const selectedDateTime = this.model.getSelectedDateTime();\n        const dateTime = selectedDateTime || this.model.getDateAsDayjsForCurrentDate();\n        if (!dateTime) {\n            return null;\n        }\n        return dayjs(dateTime).format('HH:mm:ss');\n    }\n\n    openPicker(){\n        this.controllerHandler.getDateTimeFieldController().openPicker();\n    }\n\n    closePicker(){\n        this.controllerHandler.getDateTimeFieldController().closePicker();\n    }\n\n    clear(){\n        this.configuration.showFormatAsPlaceholder = true;\n        this.model.initDate(null);\n        this.model.setSelectedDate(null);\n\n        this.dispatchEvent({\n            type: \"EVENT_VALUE_UPDATE\"\n        });\n        \n\n    }\n\n    showErrorMessage(message ?: string): void {\n        message && this.optionHandler.updateValidationMessage(message);\n        this.optionHandler.updateStatus('error');\n    }\n\n    hideErrorMessage(): void {\n        this.optionHandler.updateValidationMessage(\"\");\n        this.optionHandler.updateStatus(\"none\");\n    }\n}","import { Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeControllerHandlerType } from \"./date-time-controller.type\";\n// import { DateTimeRootControllerType } from \"../date-time-root/date-time-root-controller.type\";\n\n\n@Bean(DATETIME_BEAN_NAME.DATETIME_CONTROLLER_HANDLER)\nexport class DateTimeControllerHandler extends EventEmitter implements DateTimeControllerHandlerType{\n\tprivate dateTimeCtrl!: any;\n\n\tregisterDateTimeFieldController(dateTimeCtrl: any): void {\n\t\tthis.dateTimeCtrl = dateTimeCtrl;\n\t}\n\tgetDateTimeFieldController(): any {\n\t\treturn this.dateTimeCtrl;\n\t}\n}","\nimport { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\n\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DateTimeEventHandlerType } from \"./date-time-event-handler.types\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeModel } from \"./date-time-model\";\nimport { DateTimeOptionHandlerType } from \"./date-time-options-handler.types\";\nimport { DATE_TIME_CUSTOM_EVENTS, INTERNAL_EVENTS } from \"../../constant/event-name\";\nimport {DateTimePlaceholderManagerIntegration} from \"./placeholder-engine-integration\";\n\n@Bean(DATETIME_BEAN_NAME.DATETIME_EVENT_HANDLER)\nexport class DateTimeEventHandler extends EventEmitter implements DateTimeEventHandlerType {\n\t@AutoWired(DATETIME_BEAN_NAME.DATETIME_MODEL) model!: DateTimeModel;\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) optionHandler!: DateTimeOptionHandlerType;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_PLACEHOLDER_MANAGER) protected placeholderManager !: DateTimePlaceholderManagerIntegration;\n\n\n    private  allowedKeys = [ \n        'Backspace', 'Enter', 'Tab', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown',\n        'Home', 'End', 'Delete', 'e', '-', '+', 'Control', 'Meta','.'\n    ];\n\n    private combinationAllowedKeys = ['a', 'c', 'x', 'v'];\n\n\tonInput(_value : string): void {\n\n    //    const selectedField = this.model.getSelectedField();\n\t}\n\n\tonKeyDown(event: KeyboardEvent): void {\n        const key = event.key;\n        const char = event.key;\n        if(key === 'Tab'){\n            return\n\n        }\n        const parsedKey = parseInt(key);\n\n       \n    \n\n        if((event.ctrlKey || event.metaKey) && char === \"a\"){\n            event.stopPropagation();\n            (event.target as HTMLInputElement).select();\n        }\n       \n\n        if (event.ctrlKey || event.metaKey  || ['Control', 'Meta', 'Shift'].includes(char)) {\n            if (['c', 'v', 'x', 'z', 'a', 'y','r'].includes(char.toLowerCase())) {\n                return; // Allow common browser shortcuts\n            }\n            event.stopPropagation();\n        }\n        if(event.shiftKey && !['Tab'].includes(char)){\n            event.stopPropagation();\n        }\n        if (event.ctrlKey || event.metaKey) {\n                return;\n        }\n\n        const allowSpecialKeys = this.model.isAllowSpecialKeys(event);\n\n        if (this.checkAllowedKeys(event) && !allowSpecialKeys) {\n                return;\n        }\n\n        if (isNaN(parsedKey) && !allowSpecialKeys) {\n                event.preventDefault();\n        }\n        \n\t}    \n\n\tonFocus(event?: FocusEvent): void {\n    //    this.numberModel.setFocus(true);\n       this.dispatchEvent({\n\t\t\ttype: INTERNAL_EVENTS.FOCUS_IN,\n\t\t\tevent,\n\t\t});\n\t}\n\n\tonFocusOut(event: FocusEvent): void {\n        // this.numberModel.setFocus(false);\n        this.dispatchEvent({\n\t\t\ttype: INTERNAL_EVENTS.FOCUS_OUT,\n            event\n\t\t});\n\t}\n\n\tonIncrement(event ?:KeyboardEvent): void {\n        const readonly = this.optionHandler.isReadonly();\n        if(readonly){\n            return\n        }\n\t\tconst isIncremented =  this.model.increment();\n        if(!isIncremented){\n            return\n        }\n        \n\n        const selectedDate = this.model.getSelectedDateTime();\n\n        if(!selectedDate){\n            this.placeholderManager.change();\n            // this.placeholderManager.syncModelToEngine();\n        }\n\n        this.dispatchEvent({type: INTERNAL_EVENTS.INCREMENT_UPDATED});\n        // this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n\n        this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n        setTimeout(() => {\n            this.dispatchEvent({type: INTERNAL_EVENTS.MAKE_SELECTION});\n        }, 0);\n        this.optionHandler.onChange({\n            event: {},\n            source: \"ui\",\n            type: \"onChange\",\n            value:this.model.getDateObject() });\n        \n        event && event.preventDefault()\n\n            \n\t}\n\n\tonDecrement(event ?:KeyboardEvent): void {\n        const readonly = this.optionHandler.isReadonly();\n        if(readonly){\n            return\n        }\n\t\tconst isDecremented =  this.model.decrement();\n        if(!isDecremented){\n            return\n        }\n        const selectedDate = this.model.getSelectedDateTime();\n\n        if(!selectedDate){\n            this.placeholderManager.change();\n        }\n        this.dispatchEvent({type: INTERNAL_EVENTS.DECREMENT_UPDATED});\n        this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n\n\n        setTimeout(() => {\n            this.dispatchEvent({type: INTERNAL_EVENTS.MAKE_SELECTION});\n        }, 0);\n        this.optionHandler.onChange({\n            event: {},\n            source: \"ui\",\n            type: \"onChange\",\n            value:this.model.getDateObject() });\n        event && event.preventDefault()\n\n\t}\n\n    onChangeSelectionToForward(event?:KeyboardEvent): void{\n        const readonly = this.optionHandler.isReadonly();\n        if(readonly){\n            return\n        }\n        this.model.changeSelectionToForward();\n        \n        // Sync current input value with placeholder engine after arrow key navigation\n        // This ensures engine state matches current input value when selection changes\n        // Dispatch SYNC_PLACEHOLDER event which the integration class listens to\n        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        \n        this.dispatchEvent({type: INTERNAL_EVENTS.MAKE_SELECTION});\n        event && event.preventDefault()\n\n\n    }\n    onChangeSelectionToBackward(event?:KeyboardEvent): void{\n        const readonly = this.optionHandler.isReadonly();\n        if(readonly){\n            return\n        }\n        this.model.changeSelectionToBackward();\n        \n        // Sync current input value with placeholder engine after arrow key navigation\n        // This ensures engine state matches current input value when selection changes\n        // Dispatch SYNC_PLACEHOLDER event which the integration class listens to\n        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        \n        this.dispatchEvent({type: INTERNAL_EVENTS.MAKE_SELECTION});\n        event && event.preventDefault()\n\n    }\n\n    onClosePicker(event ?: KeyboardEvent)  : void {\n        event && event.preventDefault();\n        event && event?.stopPropagation();\n        this.dispatchEvent( {type : DATE_TIME_CUSTOM_EVENTS.DESTROY_CALENDAR, event})\n    } \n\n\tonBlur(): void {\n        // this.numberModel.blur();\n\t}\n\n    onIncrementByLongStep() : void {\n        // this.numberModel.incrementByLongStep();\n    }\n\n    onDecrementByLongStep() : void {\n        // this.numberModel.decrementByLongStep();\n    }\n\n    onIncrementByShortStep() : void {\n        // this.numberModel.incrementByShortStep();\n    }\n\n    onDecrementByShortStep() : void {\n        // this.numberModel.decrementByShortStep();\n    }\n\n    protected checkAllowedKeys(event: KeyboardEvent){\n        for (let i = 0; i < this.allowedKeys.length; i++) {\n           if(this.allowedKeys[i]===event.key){\n               return true\n           }\n        }\n        for (let i = 0; i < this.combinationAllowedKeys.length; i++) {\n            if(this.combinationAllowedKeys[i]===event.key){\n                if(event.ctrlKey || event.metaKey){\n                    return true\n                }\n               \n            }\n         }\n         return false\n    }\n}\n","/**\n * Constants for DateTime Input Handler\n * Centralized configuration for thresholds and key mappings\n */\n\n/**\n * Input thresholds that trigger immediate forward navigation\n * Values >= threshold trigger navigation to next field\n */\nexport const DATE_INPUT_THRESHOLDS = {\n    /** Values >= 4 trigger immediate forward navigation for date field */\n    SINGLE_DIGIT_MAX: 3,\n    /** Values >= 2 trigger immediate forward navigation for month field */\n    MONTH_SINGLE_DIGIT_MAX: 1,\n    /** Values >= 2 trigger immediate forward navigation for 12-hour cycle */\n    HOUR_12_CYCLE_THRESHOLD: 2,\n    /** Values >= 3 trigger immediate forward navigation for 24-hour cycle */\n    HOUR_24_CYCLE_THRESHOLD: 3,\n    /** Values >= 6 trigger immediate forward navigation for minute field */\n    MINUTE_THRESHOLD: 6,\n    /** Values >= 6 trigger immediate forward navigation for second field */\n    SECOND_THRESHOLD: 6,\n} as const;\n\n/**\n * Keyboard keys that are allowed without special handling\n */\nexport enum DateTimeInputKeys {\n    ENTER = 'Enter',\n    TAB = 'Tab',\n    ARROW_LEFT = 'ArrowLeft',\n    ARROW_RIGHT = 'ArrowRight',\n    ARROW_UP = 'ArrowUp',\n    ARROW_DOWN = 'ArrowDown',\n    HOME = 'Home',\n    END = 'End',\n    DELETE = 'Delete',\n    BACKSPACE = 'Backspace',\n    ESCAPE = 'Escape',\n    E_KEY = 'e',\n    MINUS = '-',\n    PLUS = '+',\n    CONTROL = 'Control',\n    META = 'Meta',\n    PERIOD = '.',\n}\n\n/**\n * Keys that are allowed when combined with Ctrl/Cmd\n */\nexport enum DateTimeCombinationKeys {\n    A = 'a', // Select All\n    C = 'c', // Copy\n    X = 'x', // Cut\n    V = 'v', // Paste\n}\n","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DateTimeEventHandlerType } from \"./date-time-event-handler.types\";\nimport { DateTimeModel } from \"./date-time-model\";\nimport { DATE_TIME_CUSTOM_EVENTS, INTERNAL_EVENTS } from \"../../constant/event-name\";\nimport { DateTimeOptionHandlerType } from \"./date-time-options-handler.types\";\nimport { DateTimeSelectionService } from \"./date-time-selection-service\";\nimport { DATE_INPUT_THRESHOLDS, DateTimeInputKeys, DateTimeCombinationKeys } from \"./date-time-input-constants\";\nimport { DateTimePlaceholderManagerIntegration } from \"./placeholder-engine-integration\";\nimport { isClipboardOperationAllowed, createClipboardGuard } from \"../../../../utility/clipboard\";\n\n\nconst SELECTEDFIELD = {\n    DATE       : 'date',\n    MONTH      : 'month',\n    YEAR       : 'year',\n    HOUR       : 'hour',\n    MINUTE     : 'minute',\n    SECOND     : 'second',\n    MILLISECOND: 'millisecond'\n}\n\n\n@Bean(DATETIME_BEAN_NAME.DATETIME_INPUT_HANDLER)\nexport class DateTimeInputHandler extends EventEmitter {\n    private element!: HTMLInputElement | null;\n    private keyDownHandler?: (event: KeyboardEvent) => void;\n    private compositionStartHandler?: () => void;\n    private compositionEndHandler?: () => void;\n    private pasteHandler?: (event: ClipboardEvent) => void;\n    private clipboardGuardHandler?: (event: ClipboardEvent) => void;\n    \n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_EVENT_HANDLER) dateTimeEventHandler !: DateTimeEventHandlerType;\n\t@AutoWired(DATETIME_BEAN_NAME.DATETIME_MODEL) model!: DateTimeModel;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_PLACEHOLDER_MANAGER) protected placeholderManager !: DateTimePlaceholderManagerIntegration;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler !: DateTimeOptionHandlerType;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_SELECTION_SERVICE) protected selectionService !: DateTimeSelectionService;\n\n    // Re-entrancy and state management\n    private isProcessing = false;\n    private isComposing = false;\n    private lastTypedNumber : string | null = null;\n    private lastSelectedField !:string;\n    private pendingOnChange: ReturnType<typeof setTimeout> | null = null;\n\n    // Allowed keys using constants\n    private allowedKeys = [ \n        DateTimeInputKeys.ENTER,\n        DateTimeInputKeys.TAB,\n        DateTimeInputKeys.ARROW_LEFT,\n        DateTimeInputKeys.ARROW_RIGHT,\n        DateTimeInputKeys.ARROW_UP,\n        DateTimeInputKeys.ARROW_DOWN,\n        DateTimeInputKeys.HOME,\n        DateTimeInputKeys.END,\n        DateTimeInputKeys.E_KEY,\n        DateTimeInputKeys.MINUS,\n        DateTimeInputKeys.PLUS,\n        DateTimeInputKeys.CONTROL,\n        DateTimeInputKeys.META,\n        DateTimeInputKeys.PERIOD,\n    ];\n\n    private combinationAllowedKeys = [\n        DateTimeCombinationKeys.A,\n        DateTimeCombinationKeys.C,\n        DateTimeCombinationKeys.X,\n        DateTimeCombinationKeys.V,\n    ];\n    private monthMaping = {\n        \"j\"  : 0,\n        \"ja\"  : 0,\n        \"f\"  : 1,\n        \"m\"  : 2,\n        \"ma\" : 2,\n        \"mar\": 2,\n        \"a\"  : 3,\n        \"ap\" : 3,\n        \"may\": 4,\n        \"ju\" : 5,\n        \"jun\": 5,\n        \"jul\": 6,\n        \"au\" : 7,\n        \"s\"  : 8,\n        \"o\"  : 9,\n        \"n\"  : 10,\n        \"d\"  : 11,\n    }\n\n\n    registerElement(element: HTMLInputElement): void {\n        this.deregisterElement();\n\n        if (this.element) return;\n\n        this.element = element;\n        \n        // Set input element in placeholder manager so it can sync values\n        // This ensures placeholder engine can access current input value for syncing\n        if (this.placeholderManager && typeof (this.placeholderManager as any).setInputElement === 'function') {\n            (this.placeholderManager as any).setInputElement(element);\n        }\n        \n        this.registerEvents();\n    }\n\n    protected registerEvents(): void {\n        if (this.element) {\n            // Register keydown handler\n            this.keyDownHandler = (event: KeyboardEvent) => this.onKeyDown(event);\n            this.element.addEventListener('keydown', this.keyDownHandler);\n            \n            // Register IME/composition handlers (P0 Fix #1)\n            this.compositionStartHandler = () => {\n                this.isComposing = true;\n            };\n            this.compositionEndHandler = () => {\n                this.isComposing = false;\n            };\n            this.element.addEventListener('compositionstart', this.compositionStartHandler);\n            this.element.addEventListener('compositionend', this.compositionEndHandler);\n            \n            // Register paste handler (P1 Fix #7)\n            this.pasteHandler = (event: ClipboardEvent) => this.onPaste(event);\n            this.element.addEventListener('paste', this.pasteHandler);\n\n            this.clipboardGuardHandler = createClipboardGuard(() => this.optionsHandler.getClipboard());\n            this.element.addEventListener('copy', this.clipboardGuardHandler);\n            this.element.addEventListener('cut', this.clipboardGuardHandler);\n        }\n    }\n\n    deregisterElement(): void {\n        if (this.element) {\n            if (this.keyDownHandler) {\n                this.element.removeEventListener('keydown', this.keyDownHandler);\n                this.keyDownHandler = undefined;\n            }\n            if (this.compositionStartHandler) {\n                this.element.removeEventListener('compositionstart', this.compositionStartHandler);\n                this.compositionStartHandler = undefined;\n            }\n            if (this.compositionEndHandler) {\n                this.element.removeEventListener('compositionend', this.compositionEndHandler);\n                this.compositionEndHandler = undefined;\n            }\n            if (this.pasteHandler) {\n                this.element.removeEventListener('paste', this.pasteHandler);\n                this.pasteHandler = undefined;\n            }\n            if (this.clipboardGuardHandler) {\n                this.element.removeEventListener('copy', this.clipboardGuardHandler);\n                this.element.removeEventListener('cut', this.clipboardGuardHandler);\n                this.clipboardGuardHandler = undefined;\n            }\n            this.element = null;\n        }\n        \n        // Clear pending timeouts\n        if (this.pendingOnChange) {\n            clearTimeout(this.pendingOnChange);\n            this.pendingOnChange = null;\n        }\n        \n        // Reset state\n        this.isProcessing = false;\n        this.isComposing = false;\n        this.lastTypedNumber = null;\n    }\n    protected onKeyDown(event: KeyboardEvent): void {\n        // P0 Fix #3: Re-entrancy protection\n        if (this.isProcessing) {\n            return;\n        }\n        \n        // P0 Fix #1: Block processing during IME composition\n        if (this.isComposing) {\n            return;\n        }\n        \n        try {\n            this.isProcessing = true;\n            \n            // P0 Fix #4: Capture selection before any processing\n            this.captureSelection();\n            \n            // Early return for readonly mode\n            if (this.optionsHandler.isReadonly()) {\n                return;\n            }\n\n            // Handle manual input mode restrictions\n            if (this.optionsHandler.isAllowManualInput()) {\n                const allowSpecialKeys = this.model.isAllowSpecialKeys(event);\n                if (this.checkAllowedKeys(event) && !allowSpecialKeys) {\n                    return;\n                }\n                const isAlphanumeric = /^[a-zA-Z0-9]$/.test(event.key);\n                if (isAlphanumeric) {\n                    return;\n                }\n            }\n\n            // Prevent Alt key on Mac\n            if (event.altKey) {\n                event.preventDefault();\n                return;\n            }\n\n            // Skip processing for all browser default actions with modifier keys (Cmd/Ctrl)\n            // This prevents handler from interfering with browser shortcuts like:\n            // Cmd+R (Refresh), Cmd+S (Save), Cmd+W (Close), Cmd+N (New), Cmd+T (New Tab),\n            // Cmd+P (Print), Cmd+Z (Undo), Cmd+Y (Redo), Cmd+A (Select All), etc.\n            if (event.ctrlKey || event.metaKey) {\n                // Allow only specific combinations we want to handle:\n                // - Cmd/Ctrl+C (Copy) - already in allowedKeys\n                // - Cmd/Ctrl+V (Paste) - we have a paste handler\n                // - Cmd/Ctrl+X (Cut) - already in allowedKeys\n                // - Cmd/Ctrl+A (Select All) - browser handles it\n                const key = event.key.toLowerCase();\n                const allowedModifierKeys = ['c', 'v', 'x', 'a'];\n                \n                // If it's not an allowed modifier combination, skip processing\n                if (!allowedModifierKeys.includes(key)) {\n                    return; // Let browser handle the shortcut\n                }\n                \n                // For Cmd/Ctrl+A, let browser handle Select All\n                if (key === 'a') {\n                    return;\n                }\n                \n                // For Cmd/Ctrl+V, our paste handler will process it\n                // For Cmd/Ctrl+C and Cmd/Ctrl+X, they're in allowedKeys and will be handled by browser\n                // Continue processing for these cases\n            }\n\n            let handled = false;\n\n            // Handle Delete key when all content is selected\n            if (event.key === DateTimeInputKeys.DELETE && this.element) {\n                if (this.isAllContentSelected()) {\n                    this.clearValue();\n                    handled = true;\n                }\n                // P1 Fix #6: Only prevent default if we handled it\n                if (handled) {\n                    event.preventDefault();\n                }\n                return;\n            }\n\n            // Handle Backspace key\n            if (event.key === DateTimeInputKeys.BACKSPACE) {\n                if (this.element && this.isAllContentSelected()) {\n                    this.clearValue();\n                } else {\n                    this.handleBackspaceForSelectedField();\n                }\n                handled = true;\n                // P1 Fix #6: Only prevent default if we handled it\n                if (handled) {\n                    event.preventDefault();\n                }\n                return;\n            }\n\n            // Handle field-specific editing\n            this.handleFieldEditing(event);\n        } catch (error) {\n            // P2 Fix #11: Error handling\n            console.error('Error in onKeyDown:', error, { event });\n            // Fallback: trigger value update to restore state\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        } finally {\n            this.isProcessing = false;\n        }\n    }\n    \n    /**\n     * P0 Fix #4: Capture selection before mutation\n     * Note: Selection is captured but restoration is handled by selectionService\n     */\n    private captureSelection(): void {\n        // Selection capture ensures we have current state before mutation\n        // Actual restoration is handled by selectionService.selectCurrentField()\n        // This method exists for potential future use or debugging\n    }\n    \n    /**\n     * P1 Fix #7: Handle paste events\n     */\n    private onPaste(event: ClipboardEvent): void {\n        if (!isClipboardOperationAllowed(this.optionsHandler.getClipboard(), 'paste')) {\n            event.preventDefault();\n            event.stopPropagation();\n            return;\n        }\n        if (this.isProcessing || this.isComposing) {\n            return;\n        }\n        \n        event.preventDefault();\n        \n        try {\n            this.isProcessing = true;\n            const pastedText = event.clipboardData?.getData('text') || '';\n            \n            if (!pastedText.trim()) {\n                return;\n            }\n            \n            // Parse and validate pasted content\n            const success = this.model.parseAndSetDateFromString(pastedText);\n            if (success) {\n                this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                this.dispatchEvent({ type: INTERNAL_EVENTS.MAKE_SELECTION });\n                this.optionsHandler.onChange({\n                    event: {},\n                    source: \"ui\",\n                    type: \"onChange\",\n                    value: this.model.getDateObject()\n                });\n            } else {\n                // Invalid paste - restore previous value\n                this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n            }\n        } catch (error) {\n            console.error('Error in onPaste:', error);\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        } finally {\n            this.isProcessing = false;\n        }\n    }\n\n    private clearValue(): void {\n        // Sync current input value before clearing (for Cmd+A + Backspace scenario)\n        // This ensures engine knows what was selected before clearing\n        // Dispatch SYNC_PLACEHOLDER event which the integration class listens to\n        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        \n        this.model.setActivatePlaceholder(true);\n        this.model.setSelectedDate(null);\n        this.placeholderManager.resetPlaceholder();\n        this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.CLEAR_VALUE_IN_PICKER });\n        this.optionsHandler.onChange({ event: {}, source: \"ui\", type: \"onChange\", value: null });\n    }\n\n    private handleBackspaceForSelectedField(): void {\n        try {\n            // Sync current input value with placeholder engine before handling backspace\n            // This ensures engine knows current filled values (like \"20\" and \"2020\")\n            // Dispatch SYNC_PLACEHOLDER event which the integration class listens to\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n            \n            this.placeholderManager.changeFormatForSelectedField();\n            this.model.setActivatePlaceholder(true);\n            this.model.setSelectedDate(null);\n            \n            // P0 Fix #5: Validate state sync\n            this.validateStateSync();\n            \n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.CLEAR_VALUE_IN_PICKER });\n            this.optionsHandler.onChange({ event: {}, source: \"ui\", type: \"onChange\", value: null });\n            \n            // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n            this.restoreSelection();\n        } catch (error) {\n            console.error('Error in handleBackspaceForSelectedField:', error);\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n    \n    /**\n     * P1 Fix #8: Restore selection using requestAnimationFrame\n     */\n    private restoreSelection(): void {\n        if (!this.element) return;\n        \n        requestAnimationFrame(() => {\n            if (this.element && document.activeElement === this.element) {\n                this.selectionService.selectCurrentField(this.element, true);\n            }\n        });\n    }\n    \n    /**\n     * P0 Fix #5: Validate state synchronization\n     */\n    private validateStateSync(): void {\n        if (!this.element) return;\n        \n        try {\n            const domValue = this.element.value || '';\n            const modelValue = this.model.getValue();\n            const modelValueStr = modelValue && modelValue !== 'Invalid Date' ? String(modelValue) : '';\n            \n            // If Model has a value, DOM should match (unless placeholder is active)\n            if (this.model.getSelectedDateTime() && !this.model.isActivatePlaceholder()) {\n                if (domValue !== modelValueStr && modelValueStr !== '') {\n                    console.warn('State desync detected: DOM value does not match Model value', {\n                        domValue,\n                        modelValue: modelValueStr\n                    });\n                    // Trigger recovery: sync DOM from Model\n                    this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                }\n            }\n        } catch (error) {\n            console.error('Error validating state sync:', error);\n        }\n    }\n\n    private handleFieldEditing(event: KeyboardEvent): void {\n        try {\n            const selectedField = this.model.getSelectedField();\n            const value = parseInt(event.key);\n\n            // Reset last typed number if field changed\n            if (this.lastSelectedField && selectedField !== this.lastSelectedField) {\n                this.lastTypedNumber = null;\n            }\n\n            // Update last selected field and call appropriate edit method\n            this.lastSelectedField = selectedField;\n\n            switch (selectedField) {\n                case SELECTEDFIELD.DATE:\n                    this.editDate(value, event);\n                    break;\n                case SELECTEDFIELD.MONTH:\n                    this.editMonth(value, event);\n                    break;\n                case SELECTEDFIELD.YEAR:\n                    this.editYear(value, event);\n                    break;\n                case SELECTEDFIELD.HOUR:\n                    this.editHour(value, event);\n                    break;\n                case SELECTEDFIELD.MINUTE:\n                    this.editMinute(value, event);\n                    break;\n                case SELECTEDFIELD.SECOND:\n                    this.editSecond(value, event);\n                    break;\n                case 'meridian':\n                    this.editMeridian(event.key, event);\n                    break;\n            }\n\n            // Sync current input value with placeholder engine after field editing\n            // This ensures engine state matches the updated input value\n            // Dispatch SYNC_PLACEHOLDER event which the integration class listens to\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n\n            // P1 Fix #9: Debounce onChange callbacks\n            this.debouncedOnChange();\n            \n            // P0 Fix #5: Validate state sync after edit\n            this.validateStateSync();\n        } catch (error) {\n            console.error('Error in handleFieldEditing:', error, { event });\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n    \n    /**\n     * P1 Fix #9: Debounce onChange callbacks for rapid input\n     */\n    private debouncedOnChange(): void {\n        if (this.pendingOnChange) {\n            clearTimeout(this.pendingOnChange);\n        }\n        \n        this.pendingOnChange = setTimeout(() => {\n            if (this.model.getSelectedDateTime()) {\n                this.optionsHandler.onChange({ \n                    event: {}, \n                    source: \"ui\", \n                    type: \"onChange\", \n                    value: this.model.getDateObject() \n                });\n            }\n            this.pendingOnChange = null;\n        }, 100); // 100ms debounce\n    }\n\n\n    protected editDate(value: number, event: KeyboardEvent): void {\n        try {\n            if(isNaN(value)) {\n                return;\n            }\n            \n            // P2 Fix #12: Use constants instead of magic numbers\n            if(value > DATE_INPUT_THRESHOLDS.SINGLE_DIGIT_MAX && !this.lastTypedNumber){\n                this.model.setDate(value);\n                const selectedDate = this.model.getSelectedDateTime();\n                if(!selectedDate){\n                    this.placeholderManager.change();\n                }\n                this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                this.dateTimeEventHandler.onChangeSelectionToForward(event);\n            }else{\n                if(!this.lastTypedNumber){\n                    this.model.setDate(value);\n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate){\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                    this.restoreSelection();\n                    this.lastTypedNumber = String(value);\n                }else{\n                    const newValue = `${this.lastTypedNumber}${String(value)}`;\n                    this.model.setDate(parseInt(newValue));\n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate){\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    this.dateTimeEventHandler.onChangeSelectionToForward(event);\n                    this.lastTypedNumber = null;\n                }\n            }\n        } catch (error) {\n            console.error('Error in editDate:', error, { value, event });\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n\n    protected editMonth(value: number, event: KeyboardEvent): void {\n        try {\n            if(!isNaN(value)){\n                // P2 Fix #12: Use constants instead of magic numbers\n                if(value > DATE_INPUT_THRESHOLDS.MONTH_SINGLE_DIGIT_MAX && !this.lastTypedNumber){\n                    this.model.setMonth(value-1);\n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate){\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    this.dateTimeEventHandler.onChangeSelectionToForward(event);\n                }\n                else{\n                    if(!this.lastTypedNumber){\n                        this.model.setMonth(value-1);\n                        const selectedDate = this.model.getSelectedDateTime();\n                        if(!selectedDate){\n                            this.placeholderManager.change();\n                        }\n                        this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                        // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                        this.restoreSelection();\n                        this.lastTypedNumber = String(value);\n                    }else{\n                        const newValue = `${this.lastTypedNumber}${String(value)}`;\n                        const month = parseInt(newValue)-1;\n        \n                        if(month >= 13){\n                            this.model.setMonth(parseInt(this.lastTypedNumber));\n                        }else{\n                            this.model.setMonth(month);\n                        }\n                        const selectedDate = this.model.getSelectedDateTime();\n                        if(!selectedDate){\n                            this.placeholderManager.change();\n                        }\n        \n                        this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                        this.dateTimeEventHandler.onChangeSelectionToForward(event);\n                        this.lastTypedNumber = null;\n                    }\n                }\n\n            }else{\n                const key = event.key.toLowerCase() as (keyof typeof this.monthMaping);\n\n                if((key ==='f'|| key === \"s\" || key ==='o' || key ==='n' || key ==='d') && !this.lastTypedNumber){\n                    const month = this.monthMaping[`${key}`];\n                    this.model.setMonth(month);\n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate){\n                        this.placeholderManager.change();\n                    }\n                    \n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                    this.restoreSelection();\n                    this.dateTimeEventHandler.onChangeSelectionToForward(event);\n\n                }else{\n                    if(!this.lastTypedNumber){\n                        const month = this.monthMaping[`${key}`];\n                        if(month === undefined || month === null){\n                            this.lastTypedNumber = null;\n                            return;\n                        }\n                        this.model.setMonth(month);\n                        const selectedDate = this.model.getSelectedDateTime();\n                        if(!selectedDate){\n                            this.placeholderManager.change();\n                        }\n                        this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                        // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                        this.restoreSelection();\n                        this.lastTypedNumber = key;\n                    }else{\n                        this.lastTypedNumber = `${this.lastTypedNumber}${key}`;\n                        const month = this.monthMaping[`${this.lastTypedNumber}` as keyof typeof this.monthMaping];\n                        if(month === undefined || month === null){\n                            this.lastTypedNumber = null;\n                            return;\n                        }\n                        this.model.setMonth(month);\n                        const selectedDate = this.model.getSelectedDateTime();\n                        if(!selectedDate){\n                            this.placeholderManager.change();\n                        }\n                        this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                        // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                        this.restoreSelection();\n\n                        if (this.lastTypedNumber.length >= 3 || this.lastTypedNumber ===\"au\" || this.lastTypedNumber ===\"ja\") {\n                            this.dateTimeEventHandler.onChangeSelectionToForward(event);\n                            this.lastTypedNumber = null;\n                        } \n\n                    }\n                }\n            }\n        } catch (error) {\n            console.error('Error in editMonth:', error, { value, event });\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n\n\n    protected editYear(value: number, event: KeyboardEvent): void {\n        try {\n            if(isNaN(value)) {\n                return;\n            }\n            \n            // P1 Fix #10: Get actual year length dynamically from format\n            const formatMap = this.model.getFormatMap();\n            const yearPattern = formatMap.year || 'YYYY';\n            const yearLength = yearPattern.length; // Dynamic, not hardcoded\n\n            if (!this.lastTypedNumber) {\n                this.lastTypedNumber = String(value);\n                this.model.setYear(value);\n                const selectedDate = this.model.getSelectedDateTime();\n                if(!selectedDate){\n                    this.placeholderManager.change();\n                }\n                this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                this.restoreSelection();\n            } else {\n                this.lastTypedNumber = `${this.lastTypedNumber}${String(value)}`;\n                this.model.setYear(parseInt(this.lastTypedNumber));\n                const selectedDate = this.model.getSelectedDateTime();\n                if(!selectedDate){\n                    this.placeholderManager.change();\n                }\n                this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                this.restoreSelection();\n\n                if (this.lastTypedNumber.length >= yearLength) {\n                    this.dateTimeEventHandler.onChangeSelectionToForward(event);\n                    this.lastTypedNumber = null;\n                } \n            }\n        } catch (error) {\n            console.error('Error in editYear:', error, { value, event });\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n\n    protected editHour(value: number, event: KeyboardEvent): void {\n        try {\n            if(isNaN(value)) {\n                return;\n            }\n\n            // Get hour cycle (12 or 24)\n            const hourCycle = this.optionsHandler.getHourCycle();\n            const maxHour = hourCycle === 12 ? 12 : 23;\n\n            // P2 Fix #12: Use constants instead of magic numbers\n            const threshold = hourCycle === 12 \n                ? DATE_INPUT_THRESHOLDS.HOUR_12_CYCLE_THRESHOLD \n                : DATE_INPUT_THRESHOLDS.HOUR_24_CYCLE_THRESHOLD;\n\n            if(value > threshold && !this.lastTypedNumber) {\n                // For single digits that are too large to be first digit of valid hour\n                this.model.setHour(value);\n                const selectedDate = this.model.getSelectedDateTime();\n                if(!selectedDate) {\n                    this.placeholderManager.change();\n                }\n                this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                this.dateTimeEventHandler.onChangeSelectionToForward(event);\n            } else {\n                if(!this.lastTypedNumber) {\n                    // First digit entered\n                    this.model.setHour(value);\n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate) {\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                    this.restoreSelection();\n                    this.lastTypedNumber = String(value);\n                } else {\n                    // Second digit entered\n                    const newValue = `${this.lastTypedNumber}${String(value)}`;\n                    const hour = parseInt(newValue);\n                    \n                    // Validate hour based on hour cycle\n                    if(hour > maxHour) {\n                        this.model.setHour(parseInt(this.lastTypedNumber));\n                    } else {\n                        this.model.setHour(hour);\n                    }\n                    \n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate) {\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    this.dateTimeEventHandler.onChangeSelectionToForward(event);\n                    this.lastTypedNumber = null;\n                }\n            }\n        } catch (error) {\n            console.error('Error in editHour:', error, { value, event });\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n\n    protected editMinute(value: number, event: KeyboardEvent): void {\n        try {\n            if(isNaN(value)) {\n                return;\n            }\n\n            // Handle minute intervals if configured\n            const minuteInterval = this.optionsHandler.getMinuteInterval();\n\n            // P2 Fix #12: Use constants instead of magic numbers\n            if(value > DATE_INPUT_THRESHOLDS.MINUTE_THRESHOLD && !this.lastTypedNumber) {\n                // For single digits that are too large to be first digit of valid minute\n                const roundedMinute = Math.round(value / minuteInterval) * minuteInterval;\n                this.model.setMinute(roundedMinute);\n                const selectedDate = this.model.getSelectedDateTime();\n                if(!selectedDate) {\n                    this.placeholderManager.change();\n                }\n                this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                this.dateTimeEventHandler.onChangeSelectionToForward(event);\n            } else {\n                if(!this.lastTypedNumber) {\n                    // First digit entered\n                    this.model.setMinute(value);\n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate) {\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                    this.restoreSelection();\n                    this.lastTypedNumber = String(value);\n                } else {\n                    // Second digit entered\n                    const newValue = `${this.lastTypedNumber}${String(value)}`;\n                    const minute = parseInt(newValue);\n                    \n                    if(minute > 59) {\n                        this.model.setMinute(parseInt(this.lastTypedNumber));\n                    } else {\n                        // Round to nearest interval if configured\n                        const roundedMinute = minuteInterval > 1 ? \n                            Math.round(minute / minuteInterval) * minuteInterval : \n                            minute;\n                        this.model.setMinute(roundedMinute);\n                    }\n                    \n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate) {\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    this.dateTimeEventHandler.onChangeSelectionToForward(event);\n                    this.lastTypedNumber = null;\n                }\n            }\n        } catch (error) {\n            console.error('Error in editMinute:', error, { value, event });\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n\n    protected editSecond(value: number, event: KeyboardEvent): void {\n        try {\n            if(isNaN(value)) {\n                return;\n            }\n\n            // P2 Fix #12: Use constants instead of magic numbers\n            if(value > DATE_INPUT_THRESHOLDS.SECOND_THRESHOLD && !this.lastTypedNumber) {\n                // For single digits that are too large to be first digit of valid second\n                this.model.setSecond(value);\n                const selectedDate = this.model.getSelectedDateTime();\n                if(!selectedDate) {\n                    this.placeholderManager.change();\n                }\n                this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                this.dateTimeEventHandler.onChangeSelectionToForward(event);\n            } else {\n                if(!this.lastTypedNumber) {\n                    // First digit entered\n                    this.model.setSecond(value);\n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate) {\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    // P1 Fix #8: Use requestAnimationFrame instead of setTimeout\n                    this.restoreSelection();\n                    this.lastTypedNumber = String(value);\n                } else {\n                    // Second digit entered\n                    const newValue = `${this.lastTypedNumber}${String(value)}`;\n                    const second = parseInt(newValue);\n                    \n                    if(second > 59) {\n                        this.model.setSecond(parseInt(this.lastTypedNumber));\n                    } else {\n                        this.model.setSecond(second);\n                    }\n                    \n                    const selectedDate = this.model.getSelectedDateTime();\n                    if(!selectedDate) {\n                        this.placeholderManager.change();\n                    }\n                    this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                    this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                    this.dateTimeEventHandler.onChangeSelectionToForward(event);\n                    this.lastTypedNumber = null;\n                }\n            }\n        } catch (error) {\n            console.error('Error in editSecond:', error, { value, event });\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n\n    protected editMeridian(value: string, event: KeyboardEvent): void {\n        try {\n            // Handle 'a' for AM and 'p' for PM\n            const key = value.toString().toLowerCase();\n            \n            if(key === 'a' || key === 'p') {\n                const currentHour = this.model.getCurrentHour();\n                const hour = Number(currentHour);\n                \n                if(key === 'a' && hour >= 12) {\n                    // Convert to AM\n                    this.model.setHour(hour % 12);\n                } else if(key === 'p' && hour < 12) {\n                    // Convert to PM\n                    this.model.setHour(hour + 12);\n                }\n                \n                const selectedDate = this.model.getSelectedDateTime();\n                if(!selectedDate) {\n                    this.placeholderManager.change();\n                }\n                this.dispatchEvent({type: INTERNAL_EVENTS.VALUE_UPDATE});\n                this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n                this.dateTimeEventHandler.onChangeSelectionToForward(event);\n            }\n        } catch (error) {\n            console.error('Error in editMeridian:', error, { value, event });\n            this.dispatchEvent({ type: INTERNAL_EVENTS.VALUE_UPDATE });\n            this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER });\n        }\n    }\n\n    protected isAllContentSelected(): boolean {\n        if (!this.element) {\n            return false;\n        }\n        const el = this.element as HTMLInputElement;\n        const valueLength = el.value ? el.value.length : 0;\n        const selectionStart = el.selectionStart ?? 0;\n        const selectionEnd = el.selectionEnd ?? 0;\n        return valueLength > 0 && selectionStart === 0 && selectionEnd === valueLength;\n    }\n\n    protected checkAllowedKeys(event: KeyboardEvent): boolean {\n        // P2 Fix #12: Use enum values instead of string literals\n        for (let i = 0; i < this.allowedKeys.length; i++) {\n           if(this.allowedKeys[i] === event.key){\n               return true;\n           }\n        }\n        for (let i = 0; i < this.combinationAllowedKeys.length; i++) {\n            if(this.combinationAllowedKeys[i] === event.key){\n                if(event.ctrlKey || event.metaKey){\n                    return true;\n                } \n            }\n         }\n         return false;\n    }\n\n\n    dummy(){\n        \n    }\n\n\n\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { KeyCodes, KeyEventManager } from \"@dg/utils\";\nimport { AutoWired, Bean } from \"@dg/corecomponent\";\nimport { IAdjusterList, IDestroyAdjuster } from \"./date-time-keyboard-shortcut.types\";\nimport { DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeEventHandlerType } from \"./date-time-event-handler.types\";\n\n\n@Bean(DATETIME_BEAN_NAME.KEYBOARD_SHORTCUT_HANDLER)\nexport class DateTimeKeyBoardShortCuts extends EventEmitter {\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_EVENT_HANDLER) dateTimeEventHandler !: DateTimeEventHandlerType;\n\n\n\tprivate adjusterList: IAdjusterList[] = [];\n\tregisterElement(element: HTMLElement): IDestroyAdjuster {\n\t\tconst adjusterIndex = this.getAdjusterIndex(element);\n\n\t\tif (adjusterIndex !== -1) {\n\t\t\tconst adjuster = this.adjusterList[adjusterIndex];\n\t\t\treturn { destroyFunc: () => adjuster.destroyFunc() };\n\t\t}\n\t\tconst keyBoardEventHandler = this.keyBoardEventHandler(element);\n\n\t\tconst adjuster = {\n\t\t\telement: element,\n\t\t\teventHandler: keyBoardEventHandler,\n\t\t\tdestroyFunc: () => keyBoardEventHandler.destroy(),\n\t\t};\n\n\t\tthis.adjusterList.push(adjuster);\n\n\t\treturn {\n\t\t\tdestroyFunc: () => adjuster.destroyFunc(),\n\t\t};\n\t}\n\n\tprotected getAdjusterIndex(element: HTMLElement): number {\n\t\treturn this.adjusterList.findIndex(\n\t\t\t(adjuster) => adjuster.element === element,\n\t\t);\n\t}\n\n\tdeRegisterElement(element: HTMLElement): void {\n\t\tthis.adjusterList = this.adjusterList.filter(\n\t\t\t(adjuster) => adjuster.element !== element,\n\t\t);\n\t}\n\n\tprivate keyBoardEventHandler(element: HTMLElement): KeyEventManager {\n\t\tconst keyBoardShortCuts = [\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ArrowUp],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onIncrement(event),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ArrowUp],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onIncrement(event),\n\t\t\t\trepeat : true\n\t\t\t},\n            {\n\t\t\t\tkeyCombo: [KeyCodes.ArrowLeft],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onChangeSelectionToBackward(event)\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ArrowLeft],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onChangeSelectionToBackward(event),\n\t\t\t\trepeat : true\n\t\t\t},\n            {\n\t\t\t\tkeyCombo: [KeyCodes.ArrowRight],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onChangeSelectionToForward(event)\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ArrowRight],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onChangeSelectionToForward(event),\n\t\t\t\trepeat  : true\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.Enter],\n\t\t\t\tcallback: () => this.dateTimeEventHandler.onBlur(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ArrowDown],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onDecrement(event),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ArrowDown],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onDecrement(event),\n\t\t\t\trepeat : true\n\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ShiftLeft, KeyCodes.ArrowUp],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onIncrement(event),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ShiftLeft, KeyCodes.ArrowDown],\n\t\t\t\tcallback: (event : any) => {this.dateTimeEventHandler.onDecrement(event)},\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ShiftLeft, KeyCodes.ArrowLeft],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onChangeSelectionToBackward(event),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.ShiftLeft, KeyCodes.ArrowRight],\n\t\t\t\tcallback: (event : any) => this.dateTimeEventHandler.onChangeSelectionToForward(event),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.MetaLeft, KeyCodes.ArrowUp],\n\t\t\t\tcallback: () =>\tthis.dateTimeEventHandler.onIncrementByShortStep(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: [KeyCodes.MetaLeft, KeyCodes.ArrowDown],\n\t\t\t\tcallback: () => this.dateTimeEventHandler.onDecrementByShortStep(),\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo : [KeyCodes.Escape],\n\t\t\t\tcallback : (event : any) => this.dateTimeEventHandler.onClosePicker(event)\n\t\t\t}\n\t\t];\n\n\t\tconst keyEventManager = new KeyEventManager(element);\n\t\tkeyEventManager.importEvents(keyBoardShortCuts as any);\n\t\treturn keyEventManager;\n\t}\n}","import dayjs, { Dayjs, UnitType } from \"dayjs\";\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\nimport utc from 'dayjs/plugin/utc.js';\nimport { AutoWired, BEAN_NAME, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { DATE_TIME__BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeModelType, FormatType, PatternType, SelectedPatternType } from \"./date-time-model.types\";\nimport { DateTimeOptionHandlerType, HookInitiator } from \"./date-time-options-handler.types\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DATE_TIME_CUSTOM_EVENTS } from \"../../constant/event-name\";\n\ndayjs.extend(customParseFormat);\ndayjs.extend(utc);\n\nexport const patternMap = {\n    y  : 'yearField',\n    Y  : 'yearField',\n    D  : 'dateField',\n    M  : 'monthField',\n    d  : 'dayField',\n    H  : 'hourField',\n    h  : 'hourField',\n    m  : 'minuteField',\n    s  : 'secondField',\n    S  : 'millisecondField',\n    A  : 'meridianField',\n    \"/\": \"separator\",\n    \"-\": \"separator\",\n    \".\": \"separator\",\n    \",\": \"separator\",\n    \":\": \"separator\",\n    \" \": \"separator\",\n};\n\nexport const formatMap = {\n    y  : 'year',\n    Y  : 'year',\n    D  : 'date',\n    M  : 'month',\n    d  : 'day',\n    H  : 'hour',\n    h  : 'hour',\n    m  : 'minute',\n    s  : 'second',\n    S  : 'millisecond',\n    A  : 'meridian',\n    \"/\": \"separator\",\n    \"-\": \"separator\",\n    \".\": \"separator\",\n    \",\": \"separator\",\n    \":\": \"separator\",\n    \" \": \"separator\",\n};\n\n\n\n\n  const DEFUALT_FORMAT_MAP = {\n    MMMM_D_YYYY_hh_mm_ss_A : 'MMMM D, YYYY hh:mm:ss A',\n    MMMM_D_YYYY: 'MMMM D, YYYY'\n  }\n\n  const MONTH_MAP: Record<string,number> = {\n    1: 0,   // January\n    2: 1,   // February\n    3: 2,   // March\n    4: 3,   // April\n    5: 4,   // May\n    6: 5,   // June\n    7: 6,   // July\n    8: 7,   // August\n    9: 8,   // September\n    j: 0,  // January (string key)\n    J: 0,  // January (string key)\n    f: 1,   // February\n    F: 1,   // February\n    m: 4,  // March\n    M: 4,  // March\n    a: 3,  // April\n    A: 3,  // April\n    s: 8,   // September\n    S: 8,   // September\n    o: 9,   // October\n    O: 9,   // October\n    n: 10,  // November\n    N: 10,  // November\n    d: 11,   // December\n    D: 11   // December\n \n  };\n\n@Bean(DATE_TIME__BEAN_NAME.DATE_TIME_MODEL)\nexport class DateTimeModel extends EventEmitter implements DateTimeModelType{\n    \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: DateTimeOptionHandlerType;\n\n\n    private currentDateTime!: Dayjs;\n    private selectedDateTime !: Dayjs | null;\n    private format         !: string;\n    private formatMap       : FormatType = {};\n    private formatArray     : string[] = [];\n    private patternArray    : PatternType[] = [];\n    private selectedField  !: string ; \n\n\n    private maxDate       : Dayjs | null = null;\n    private minDate       : Dayjs | null = null;\n\n    private year : string | number | null       = null;\n    private monthIndex: string | number | null  = null;\n    private date: string | number | null        = null;\n    private hour: string | number | null        = null;\n    private minute: string | number | null      = null;\n    private second: string | number | null      = null;\n    private millisecond: string | number | null = null;\n\n    private monthFormat !: string;\n    private activatePlaceholder : boolean = false;\n    private monthChanged : boolean = false;\n    private eventKey !: boolean;\n    private compID !:string;\n\n    private minuteInterval !: number;\n\n\n    @PostConstruct() \n    init(): void {\n        let date = this.optionHandler.getDefaultValue();\n\n        this.initDate(date);\n        this.setCompID();\n        this.minDate = this.assignDate(this.optionHandler.getMin(), this.format);\n        this.maxDate = this.assignDate(this.optionHandler.getMax(), this.format);\n        this.minuteInterval = this.optionHandler.getMinuteInterval() \n\n        this.initializeFormatArrays();\n        this.selectedField = this.patternArray[0].fieldName as string;\n        this.handleEventKey();\n\n        // this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, this.setValue.bind(this));\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, this.initializeFormatArrays.bind(this));\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED, this.changeHourCycle.bind(this));\n        this.addListener(this.eventHandler, DATE_TIME_CUSTOM_EVENTS.UPDATE_FORMAT, this.updateFormat.bind(this));\n        \n\n    }\n\n    private setCompID(){\n        this.compID = generateCompID()\n    }\n\n    getCompID(){\n        return this.compID\n    }\n\n\n    private assignDate(value: any, format: string | null): dayjs.Dayjs | null {\n        if (typeof value === 'number') {\n            value = format ? dayjs(value).format(format) : dayjs(value);\n        } \n        \n        if (value instanceof Date) {\n            value = format ? dayjs(value).format(format) : dayjs(value);\n        }\n    \n        return value ? (format ? dayjs(value, format) : dayjs(value)) : null;\n    }\n\n    getMaxDate():Dayjs | null{\n        return this.maxDate;\n    }\n    getMinDate():Dayjs | null{\n        return this.minDate;\n    }\n\n\n\n    initDate(date:any){\n\n       \n\n        const format = this.optionHandler.getFormat();\n\n\n        if(!date){\n            this.activatePlaceholder = true;\n            this.selectedDateTime = null\n            date = dayjs();\n            date = date.set('minutes', 0).set('seconds', 0).set('milliseconds', 0);\n        }else if(date){\n            this.activatePlaceholder = false;\n            this.monthChanged = true;\n\n        }\n\n\n        // date ? date = date : date = dayjs().set('month',0).set('day',1);\n\n        if(date){\n           if(format){\n                if(typeof date === 'string'){\n                    this.currentDateTime = dayjs(date,format);\n                    this.optionHandler.getDefaultValue() ?   this.selectedDateTime =  this.currentDateTime : this.selectedDateTime = null\n\n                }else{\n                    // const hourCycle = this.optionHandler.getHourCycle();\n                    let timeStampDate;\n                    // if(hourCycle){\n                    //     // timeStampDate = dayjs.utc(date as number).format(`${format} [GMT]`);\n                    // }else{\n                    //     timeStampDate = dayjs(date as number).format(format);\n                    // }\n                    timeStampDate = dayjs(date as number).format(format);\n                    if(timeStampDate === 'Invalid Date'){\n                        timeStampDate = dayjs().format(format)\n                    }\n\n                    this.currentDateTime = dayjs(timeStampDate,`${format}`);\n                    this.optionHandler.getDefaultValue() ?   this.selectedDateTime =  this.currentDateTime : this.selectedDateTime = null\n\n\n                }\n                this.format = format;\n           }else{\n            const type = this.optionHandler.getType();\n\n            if(type === 'datefield' || type === \"datepicker\"){\n                this.currentDateTime = dayjs(date,DEFUALT_FORMAT_MAP.MMMM_D_YYYY);\n                this.optionHandler.getDefaultValue() ?   this.selectedDateTime =  this.currentDateTime : this.selectedDateTime = null\n                this.format = DEFUALT_FORMAT_MAP.MMMM_D_YYYY;\n            }else{\n                this.currentDateTime = dayjs(date,DEFUALT_FORMAT_MAP.MMMM_D_YYYY_hh_mm_ss_A);\n                this.optionHandler.getDefaultValue() ?   this.selectedDateTime =  this.currentDateTime : this.selectedDateTime = null\n                this.format = DEFUALT_FORMAT_MAP.MMMM_D_YYYY_hh_mm_ss_A;\n            }\n           }\n        }\n\n        this.changeHourCycle();\n        this.dispatchEvent({type:DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED});\n\n\n\n    }\n\n    getFormatArray():Array<string>{\n        return this.formatArray;\n    }\n\n    handleEventKey(){\n        const eventKey = this.optionHandler.getEventKey();\n        if(!eventKey){\n           return\n        }\n        const fieldName = this.formatArray[0];\n\n        if(fieldName === 'month'){\n            if(this.monthFormat != 'MM' && this.monthFormat != 'M'){\n                if (eventKey in MONTH_MAP) {\n                    const changedDate = this.currentDateTime.set(\"month\", MONTH_MAP[eventKey]);\n                    this.currentDateTime = dayjs(changedDate,this.format);\n                    this.eventKey = true \n                }\n\n            }else if(parseInt(eventKey)){\n                const changedDate = this.currentDateTime.set(fieldName as UnitType, parseInt(eventKey)-1);\n                this.currentDateTime = dayjs(changedDate,this.format);\n                this.eventKey = true \n\n\n\n            }\n            \n        }else{\n            if(parseInt(eventKey)){\n                // const formattedEventKey = `0${eventKey}`\n                const changedDate = this.currentDateTime.set(fieldName as UnitType, parseInt(eventKey));\n                this.currentDateTime = dayjs(changedDate,this.format);\n                this.eventKey = true \n\n\n            }\n           \n        }\n\n\n\n    }\n\n    getEventKey():boolean{\n        return this.eventKey;\n\n    }\n   \n\n    isActivatePlaceholder(): boolean{\n        return this.activatePlaceholder;\n\n    }\n\n    setActivatePlaceholder(value:boolean):void{\n         this.activatePlaceholder = value\n    }\n\n    // getFormattedValue(){\n    //     return this.currentDateTime.format(this.format);\n    // }\n\n    getFormattedValue(){\n        const type = this.optionHandler.getType();\n        if(type === 'timepicker'){\n            return this.getFormattedTime();\n        }else{\n            return this.getFormatedDate();\n        }\n    }\n\n    private getFormattedTime() {\n        // const userFormat = this.optionHandler.getValueFormat();\n        const userFormat = this.optionHandler.getValueFormat() ?? this.optionHandler.getFormat();\n        const format = (userFormat && userFormat.trim() !== '') ? userFormat : 'hh:mm';\n        const date = this.selectedDateTime || this.currentDateTime;\n    \n        const hasHour = /(h{1,2}|H{1,2})/.test(format);\n        const hasMinute = /m{1,2}/i.test(format);\n        const hasSecond = /s{1,2}/i.test(format);\n        const hasMeridian = /A/i.test(format);\n    \n        const finalFormat: string[] = [];\n    \n        if (hasHour) {\n            // If format has A or P (AM/PM), use 12-hour format (hh), otherwise check for H vs h\n            if (hasMeridian) {\n                finalFormat.push('hh');\n            } else {\n                finalFormat.push(/H/.test(format) ? 'HH' : 'hh');\n            }\n        }\n        if (hasMinute) finalFormat.push('mm');\n        if (hasSecond) finalFormat.push('ss');\n        if (hasMeridian) finalFormat.push('A');\n    \n        if (finalFormat.length === 0) {\n            return date.format('hh:mm');\n        }\n    \n        return date.format(finalFormat.join(':'));\n    }\n    private getFormatedDate() {\n        let formatToUse = this.optionHandler.getValueFormat();\n        formatToUse = (formatToUse && formatToUse.trim() !== '') ? formatToUse : this.format;\n\n        if (!formatToUse) {\n            return this.currentDateTime.toString();\n        }\n\n        if (/A/.test(formatToUse)) {\n          formatToUse = formatToUse\n            .replace(/HH/g, 'hh')  // Replace HH with hh\n            .replace(/H/g, 'h');  // Replace any remaining H with h\n        }\n      \n        if (this.optionHandler.getType() === 'datetimepicker') {\n          formatToUse = formatToUse\n            .replace(/MM(?=:)/g, 'mm')  \n            .replace(/SS/g, 'ss'); \n        }\n      \n        const dateToFormat = this.currentDateTime || this.selectedDateTime;\n        return dateToFormat.format(formatToUse);\n      }\n\n    getSelectedDateTime():Dayjs | null{\n        return this.selectedDateTime;\n    }\n\n\n    // #### new methods;\n\n    private initializeFormatArrays(): void {\n        // Clear format arrays before re-initializing to prevent duplicates\n        this.formatArray = [];\n        this.formatMap = {};\n        \n        const formatArray = this.format\n          ? this.format.match(new RegExp('([y|d|M|H|h|m|s|S|a|])+|[/]+|[-]+|[.]+|[,]+|[:]+|[ ]', 'ig')) || []\n          : [];\n\n        this.patternArray = formatArray.map((pattern: string) => {\n          const fieldNameKey = pattern[0] as keyof typeof formatMap; // Ensure proper key typing\n          const fieldName =  formatMap[fieldNameKey]\n          if(fieldName === 'month'){\n                this.monthFormat = pattern\n          }\n          return {\n            fieldName,\n            placeHolder: pattern,\n            className: patternMap[fieldNameKey],\n            callBack: this.setSelectedField.bind(this),\n          };\n        });\n\n        // const customFormat = this.optionHandler.getCustomFormats();\n        // if (customFormat) {\n        //     this.patternArray.forEach(item => {\n        //         if (customFormat[item.fieldName]) {\n        //             item.placeHolder = customFormat[item.fieldName];\n        //         }\n        //     });\n        // }\n\n    \n        formatArray.forEach((pattern: string) => {\n          if (pattern === \"/\" || pattern === \"-\" || pattern === \".\" || pattern === \",\" || pattern === \":\" || pattern === \" \") {\n            return;\n          }\n    \n          const fieldNameKey = pattern[0] as keyof typeof formatMap; // Explicitly define the key type\n          const formatKey = formatMap[fieldNameKey]; // Retrieve key from formatMap\n          if (formatKey) {  // Ensure formatKey exists before pushing it to arrays\n            this.formatArray.push(formatKey);\n            this.formatMap[formatKey as keyof FormatType] = pattern; // Correct type safety\n          }\n        });\n      }\n\n    \n\n    getValue(): string {\n        let formatToUse = this.format;\n\n        if (!formatToUse) {\n            return this.currentDateTime.toString();\n        }\n        \n        if (/A/.test(formatToUse)) {\n            formatToUse = formatToUse\n                .replace(/HH/g, 'hh')  // Replace HH with hh\n                .replace(/H/g, 'h');  // Replace any remaining H with h\n        }\n        \n        return this.currentDateTime.format(formatToUse);\n    }\n\n    getDateAsDayjs(): Dayjs | null{\n        return this.selectedDateTime;\n    }\n\n    getDateAsDayjsForCurrentDate():Dayjs | null{\n        return this.currentDateTime ?? null\n    }\n\n    getDateObject(): Date | null {\n        if(this.selectedDateTime === null){\n            return null;\n        }\n        // return this.selectedDateTime.toDate();\n        if(this.currentDateTime === null){\n            return null;\n        }\n        return this.currentDateTime.toDate();\n\n    }\n\n    setValue(value: any, event?:HookInitiator): void {\n        if(value === null){\n            this.currentDateTime = dayjs();\n            this.selectedDateTime = null;\n            const hookInitiator : HookInitiator = event ? event : 'ui';\n        const params = {\n            type: 'onChange',\n            event : {},\n            value : null,\n            source : hookInitiator\n        }\n        this.optionHandler.onChange(params);\n        this.monthChanged = true;\n        this.activatePlaceholder = true;\n        this.dispatchEvent({type:DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED});\n        return;\n        }\n        let newDate;\n        if(typeof value === 'string'){\n             newDate = dayjs(value,this.format);\n        }else if(typeof value === 'object' || typeof value === 'number'){\n            newDate = dayjs(value);\n        }\n\n        this.currentDateTime = this.format ? dayjs(newDate, this.format):dayjs(newDate);\n        this.selectedDateTime = this.currentDateTime;\n        // this.changeHourCycle();\n\n        const hookInitiator : HookInitiator = event ? event : 'ui';\n        const params = {\n            type: 'onChange',\n            event : {},\n            value : this.getDateObject(),\n            source : hookInitiator\n        }\n        this.optionHandler.onChange(params);\n        this.monthChanged = true;\n        this.activatePlaceholder = false;\n        this.dispatchEvent({type:DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED});\n\n    }\n\n    updateFormat():void{\n        this.format = this.optionHandler.getFormat() || this.format;\n        // Re-initialize format arrays with new format (clears arrays internally)\n        this.initializeFormatArrays();\n        // Update selected field to first field in new format\n        if(this.patternArray.length > 0){\n            this.selectedField = this.patternArray[0].fieldName as string;\n        }\n        // Dispatch events to update UI\n        this.dispatchEvent({type:DATE_TIME_CUSTOM_EVENTS.FORMAT_UPDATED});\n        this.dispatchEvent({type: DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED});\n    }\n\n    changeHourCycle(): void {\n        const hourCycle = this.optionHandler.getHourCycle();\n        if(hourCycle){\n\n            const configFormat = this.optionHandler.getFormat();\n            if(configFormat){\n                const hasHH = /H{1,2}/.test(configFormat);\n                const hashh = /h{1,2}/.test(configFormat);\n                if(hourCycle === 12 && hasHH && !hashh){\n                    return;\n                }\n                if(hourCycle === 24 && hashh && !hasHH){\n                    return;\n                }\n            }\n            \n            if(hourCycle === 12){\n                this.format  = this.format.replace(/H/g, 'h');\n\n            }else{\n                this.format  = this.format.replace(/h/g, 'H');\n            }\n\n            this.dispatchEvent({type:DATE_TIME_CUSTOM_EVENTS.FORMAT_UPDATED})\n\n            this.dispatchEvent({type : DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED})\n        }\n    }\n\n    incrementDate(): boolean {\n\n        if(!this.isWithinRange(this.currentDateTime)){\n            this.minDate ? this.currentDateTime = this.minDate : this.currentDateTime = dayjs();\n            return true\n\n        }\n\n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the next day to check if it would exceed the maximum\n\n            const nextDay = this.currentDateTime.add(1, 'day');\n            \n            // If the next day would be after the maximum date, don't increment\n            if (nextDay.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the next day to check if it would be before the minimum\n            const nextDay = this.currentDateTime.add(1, 'day');\n            \n            // If the next day would be before the minimum date, don't increment\n            if (nextDay.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to increment the day\n        this.currentDateTime = this.currentDateTime.add(1, 'day');\n        return true;\n    }\n\n    incrementMonth(): boolean {\n        if(!this.isWithinRange(this.currentDateTime)){\n            this.minDate ? this.currentDateTime = this.minDate : this.currentDateTime = dayjs();\n            return true\n\n        }\n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the next month to check if it would exceed the maximum\n            const nextMonth = this.currentDateTime.add(1, 'month');\n            \n            // If the next month would be after the maximum date, don't increment\n            if (nextMonth.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the next month to check if it would be before the minimum\n            const nextMonth = this.currentDateTime.add(1, 'month');\n            \n            // If the next month would be before the minimum date, don't increment\n            if (nextMonth.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to increment the month\n        this.currentDateTime = this.currentDateTime.add(1, 'month');\n        return true;\n    }\n\n    incrementYear():boolean{\n        if(!this.isWithinRange(this.currentDateTime)){\n            this.minDate ? this.currentDateTime = this.minDate : this.currentDateTime = dayjs();\n            return true\n\n        }\n        if(this.maxDate){\n            if(this.currentDateTime.isAfter(this.maxDate) || this.currentDateTime.isSame(this.maxDate,'year')){\n                return false\n            }\n        }\n\n        this.currentDateTime = this.currentDateTime.add(1, 'year');\n        return true\n\n\n    }\n\n    incrementHour(): boolean {\n        if(!this.isWithinRange(this.currentDateTime)){\n            this.minDate ? this.currentDateTime = this.minDate : this.currentDateTime = dayjs();\n            return true\n\n        }\n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the next hour to check if it would exceed the maximum\n            const nextHour = this.currentDateTime.add(1, 'hour');\n            \n            // If the next hour would be after the maximum date, don't increment\n            if (nextHour.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the next hour to check if it would be before the minimum\n            const nextHour = this.currentDateTime.add(1, 'hour');\n            \n            // If the next hour would be before the minimum date, don't increment\n            if (nextHour.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to increment the hour\n        this.currentDateTime = this.currentDateTime.add(1, 'hour');\n        return true;\n    }\n\n    incrementMinute(): boolean {\n        if(!this.isWithinRange(this.currentDateTime)){\n            this.minDate ? this.currentDateTime = this.minDate : this.currentDateTime = dayjs();\n            return true\n\n        }\n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the next minute to check if it would exceed the maximum\n            const nextMinute = this.currentDateTime.add(this.minuteInterval, 'minute');\n            \n            // If the next minute would be after the maximum date, don't increment\n            if (nextMinute.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the next minute to check if it would be before the minimum\n            const nextMinute = this.currentDateTime.add(this.minuteInterval, 'minute');\n            \n            // If the next minute would be before the minimum date, don't increment\n            if (nextMinute.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to increment the minute\n        this.currentDateTime = this.currentDateTime.add(this.minuteInterval, 'minute');\n        return true;\n    }\n\n    incrementSecond(): boolean {\n        if(!this.isWithinRange(this.currentDateTime)){\n            this.minDate ? this.currentDateTime = this.minDate : this.currentDateTime = dayjs();\n            return true\n\n        }\n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the next second to check if it would exceed the maximum\n            const nextSecond = this.currentDateTime.add(1, 'second');\n            \n            // If the next second would be after the maximum date, don't increment\n            if (nextSecond.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the next second to check if it would be before the minimum\n            const nextSecond = this.currentDateTime.add(1, 'second');\n            \n            // If the next second would be before the minimum date, don't increment\n            if (nextSecond.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to increment the second\n        this.currentDateTime = this.currentDateTime.add(1, 'second');\n        return true;\n    }\n\n    incrementMillisecond():void{\n        this.currentDateTime = this.currentDateTime.add(1,'millisecond');\n\n\n    }\n\n     isWithinRange(tempDateTime: any): boolean {\n        // Check if the temporary date is within the valid range\n        const isWithinMaxRange = !this.maxDate || \n            (tempDateTime.isBefore(this.maxDate) || tempDateTime.isSame(this.maxDate));\n\n        const isWithinMinRange = !this.minDate || \n            (tempDateTime.isAfter(this.minDate) || tempDateTime.isSame(this.minDate));\n        \n        return isWithinMaxRange && isWithinMinRange;\n    }\n\n    changeMeridian(): void {\n        // Check if we're using a 12-hour cycle\n        if (this.optionHandler.getHourCycle() === 12) {\n            // Get the current hour\n            const currentHour = this.currentDateTime.hour();\n            \n            // Calculate the new hour (add or subtract 12 hours)\n            let newHour;\n            if (currentHour < 12) {\n                newHour = currentHour + 12; // Convert AM to PM\n            } else {\n                newHour = currentHour - 12; // Convert PM to AM\n            }\n            \n            // Create a new date with the same date but different hour\n            const tempDateTime = this.currentDateTime.hour(newHour);\n            \n            // Check if there's a maximum date and if the new time would exceed it\n            if (this.maxDate && tempDateTime.isAfter(this.maxDate)) {\n                this.minDate ? this.currentDateTime = this.minDate : this.currentDateTime = dayjs();\n                return\n            }\n            \n            // Check if there's a minimum date and if the new time would go below it\n            if (this.minDate && tempDateTime.isBefore(this.minDate)) {\n                this.currentDateTime = this.minDate;\n                return; \n            }\n            \n            // If we get here, it's safe to change the meridian\n            this.currentDateTime = tempDateTime;\n        }\n    }\n\n    decrementDate(): boolean {\n       \n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the previous day to check if it would be before the minimum\n            const prevDay = this.currentDateTime.subtract(1, 'day');\n            \n            // If the previous day would be before the minimum date, don't decrement\n            if (prevDay.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the previous day to check if it would exceed the maximum\n            const prevDay = this.currentDateTime.subtract(1, 'day');\n            \n            // If the previous day would be after the maximum date, don't decrement\n            if (prevDay.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to decrement the day\n        this.currentDateTime = this.currentDateTime.subtract(1, 'day');\n        return true;\n    }\n\n    decrementMonth(): boolean {\n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the previous month to check if it would be before the minimum\n            const prevMonth = this.currentDateTime.subtract(1, 'month');\n            \n            // If the previous month would be before the minimum date, don't decrement\n            if (prevMonth.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the previous month to check if it would exceed the maximum\n            const prevMonth = this.currentDateTime.subtract(1, 'month');\n            \n            // If the previous month would be after the maximum date, don't decrement\n            if (prevMonth.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to decrement the month\n        this.currentDateTime = this.currentDateTime.subtract(1, 'month');\n        return true;\n    }\n\n    \n\n    decrementYear():boolean{\n        if(this.minDate){\n            if(this.currentDateTime.isBefore(this.minDate) || this.currentDateTime.isSame(this.minDate,'year')){\n                return false\n            }\n        }\n        this.currentDateTime = this.currentDateTime.subtract(1, 'year');\n        return true\n    }\n\n    decrementHour(): boolean {\n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the previous hour to check if it would be before the minimum\n            const prevHour = this.currentDateTime.subtract(1, 'hour');\n            \n            // If the previous hour would be before the minimum date, don't decrement\n            if (prevHour.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the previous hour to check if it would exceed the maximum\n            const prevHour = this.currentDateTime.subtract(1, 'hour');\n            \n            // If the previous hour would be after the maximum date, don't decrement\n            if (prevHour.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to decrement the hour\n        this.currentDateTime = this.currentDateTime.subtract(1, 'hour');\n        return true;\n    }\n\n    decrementMinute(): boolean {\n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the previous minute to check if it would be before the minimum\n            const prevMinute = this.currentDateTime.subtract(this.minuteInterval, 'minute');\n            \n            // If the previous minute would be before the minimum date, don't decrement\n            if (prevMinute.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the previous minute to check if it would exceed the maximum\n            const prevMinute = this.currentDateTime.subtract(this.minuteInterval, 'minute');\n            \n            // If the previous minute would be after the maximum date, don't decrement\n            if (prevMinute.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to decrement the minute\n        this.currentDateTime = this.currentDateTime.subtract(this.minuteInterval, 'minute');\n        return true;\n    }\n\n    decrementSecond(): boolean {\n        // Check if there's a minimum date\n        if (this.minDate) {\n            // Create a temporary date with the previous second to check if it would be before the minimum\n            const prevSecond = this.currentDateTime.subtract(1, 'second');\n            \n            // If the previous second would be before the minimum date, don't decrement\n            if (prevSecond.isBefore(this.minDate)) {\n                return false;\n            }\n        }\n        \n        // Check if there's a maximum date\n        if (this.maxDate) {\n            // Create a temporary date with the previous second to check if it would exceed the maximum\n            const prevSecond = this.currentDateTime.subtract(1, 'second');\n            \n            // If the previous second would be after the maximum date, don't decrement\n            if (prevSecond.isAfter(this.maxDate)) {\n                return false;\n            }\n        }\n        \n        // If we get here, it's safe to decrement the second\n        this.currentDateTime = this.currentDateTime.subtract(1, 'second');\n        return true;\n    }\n\n    decrementMillisecond():void{\n        this.currentDateTime = this.currentDateTime.subtract(1,'millisecond');\n    }\n\n    increment():boolean{\n        const callBack = getCallbackName(this.selectedField, 'increment');\n        if(this.selectedField === \"meridian\"){\n             this.changeMeridian();\n            return true\n        }\n        if (typeof this[callBack] === 'function' && this.isWithinMaxRange()) {\n            return (this[callBack] as CallableFunction)(this.selectedField);\n            // (this[callBack] as () => SelectedPatternType[]).call(this.selectedField);\n\n        }\n        return false\n    }\n    decrement():boolean{\n        const callBack = getCallbackName(this.selectedField, 'decrement');\n        if(this.selectedField === \"meridian\"){\n             this.changeMeridian()\n             return true\n        }\n        if (typeof this[callBack] === 'function' && this.isWithinMinRange()) {\n            return (this[callBack] as CallableFunction)(this.selectedField); \n            //  (this[callBack] as () => SelectedPatternType[]).call(this.selectedField);\n\n        }\n        return false\n    }\n\n    \n\n    isWithinMaxRange(): boolean {\n        // const \n        return this.maxDate === null || this.currentDateTime.isBefore(this.maxDate);\n    }\n    \n\n    isWithinMinRange(): boolean {\n        return this.minDate === null || this.currentDateTime.isAfter(this.minDate);\n    }\n\n    setCurrentDateTime(dateTime ?: any): void {\n        this.currentDateTime = dateTime\n    }\n\n    setDateValue(value?:any){\n        this.currentDateTime = dayjs(value);\n    }\n\n    setDate(value?: any): void {\n        if (value === undefined || value === null) {\n            return;\n        }\n        \n        const dateValue = Number(value);\n        \n        // Validate the date value (1-31 depending on month)\n        if (isNaN(dateValue) || dateValue < 1 || dateValue > 31) {\n            return;\n        }\n        \n        let tempDateTime = this.currentDateTime.set(\"date\", dateValue);\n        \n        const isWithinMaxRange = !this.maxDate || (tempDateTime.isBefore(this.maxDate) || tempDateTime.isSame(this.maxDate));\n        const isWithinMinRange = !this.minDate || (tempDateTime.isAfter(this.minDate) || tempDateTime.isSame(this.minDate));\n        \n        if (isWithinMaxRange && isWithinMinRange) {\n            this.currentDateTime = tempDateTime;\n        }\n    }\n    \n\n    setMonth(value?: any): void {\n        // If no value is provided, return early\n        if (value === undefined || value === null) {\n            return;\n        }\n        \n        // Convert the value to a number\n        const monthValue = Number(value);\n        \n        // Validate the month value (0-11 for dayjs)\n        if (isNaN(monthValue) || monthValue < 0 || monthValue > 11) {\n            return; // Invalid month value\n        }\n        \n        \n\n        let tempDateTime = this.currentDateTime.set(\"month\", monthValue)\n\n        const isWithinMaxRange = !this.maxDate || (tempDateTime.isBefore(this.maxDate) || tempDateTime.isSame(this.maxDate));\n        const isWithinMinRange = !this.minDate || (tempDateTime.isAfter(this.minDate) || tempDateTime.isSame(this.minDate));\n        \n        // Only set currentDateTime if tempDateTime is within the valid range\n        if (isWithinMaxRange && isWithinMinRange) {\n            this.currentDateTime = tempDateTime;\n        }\n        \n\n      \n        \n        // If we get here, it's safe to set the month\n    }\n\n    setYear(value?: any): void {\n        if (value === undefined || value === null) {\n            return;\n        }\n        \n        const yearValue = Number(value);\n        \n        // Validate the year value\n        if (isNaN(yearValue)) {\n            return;\n        }\n        \n        let tempDateTime = this.currentDateTime.set(\"year\", yearValue);\n        \n        const isWithinMaxRange = !this.maxDate || (tempDateTime.isBefore(this.maxDate) || tempDateTime.isSame(this.maxDate));\n        const isWithinMinRange = !this.minDate || (tempDateTime.isAfter(this.minDate) || tempDateTime.isSame(this.minDate));\n        \n        if (isWithinMaxRange && isWithinMinRange) {\n            this.currentDateTime = tempDateTime;\n        }\n    }\n    \n    setHour(value?: any): void {\n        if (value === undefined || value === null) {\n            return;\n        }\n        \n        const hourValue = Number(value);\n        \n        // Validate the hour value (0-23)\n        if (isNaN(hourValue) || hourValue < 0 || hourValue > 23) {\n            return;\n        }\n        \n        let tempDateTime = this.currentDateTime.set(\"hour\", hourValue);\n        \n        const isWithinMaxRange = !this.maxDate || (tempDateTime.isBefore(this.maxDate) || tempDateTime.isSame(this.maxDate));\n        const isWithinMinRange = !this.minDate || (tempDateTime.isAfter(this.minDate) || tempDateTime.isSame(this.minDate));\n        \n        if (isWithinMaxRange && isWithinMinRange) {\n            this.currentDateTime = tempDateTime;\n        }\n    }\n    \n    setMinute(value?: any): void {\n        if (value === undefined || value === null) {\n            return;\n        }\n        \n        const minuteValue = Number(value);\n        \n        // Validate the minute value (0-59)\n        if (isNaN(minuteValue) || minuteValue < 0 || minuteValue > 59) {\n            return;\n        }\n        \n        let tempDateTime = this.currentDateTime.set(\"minute\", minuteValue);\n        \n        const isWithinMaxRange = !this.maxDate || (tempDateTime.isBefore(this.maxDate) || tempDateTime.isSame(this.maxDate));\n        const isWithinMinRange = !this.minDate || (tempDateTime.isAfter(this.minDate) || tempDateTime.isSame(this.minDate));\n        \n        if (isWithinMaxRange && isWithinMinRange) {\n            this.currentDateTime = tempDateTime;\n        }\n    }\n    \n    setSecond(value?: any): void {\n        if (value === undefined || value === null) {\n            return;\n        }\n        \n        const secondValue = Number(value);\n        \n        // Validate the second value (0-59)\n        if (isNaN(secondValue) || secondValue < 0 || secondValue > 59) {\n            return;\n        }\n        \n        let tempDateTime = this.currentDateTime.set(\"second\", secondValue);\n        \n        const isWithinMaxRange = !this.maxDate || (tempDateTime.isBefore(this.maxDate) || tempDateTime.isSame(this.maxDate));\n        const isWithinMinRange = !this.minDate || (tempDateTime.isAfter(this.minDate) || tempDateTime.isSame(this.minDate));\n        \n        if (isWithinMaxRange && isWithinMinRange) {\n            this.currentDateTime = tempDateTime;\n        }\n    }\n    setMillisecond(value ?:any): void {\n        this.currentDateTime = this.currentDateTime.set(\"millisecond\", value);\n    }\n\n    changeSelectionToForward():void{\n        let index = this.formatArray.indexOf(this.selectedField);\n        if(index === this.formatArray.length-1){\n            index = -1\n        }\n            this.selectedField = this.formatArray[index + 1];\n    }\n\n    changeSelectionToBackward():void{\n        let index = this.formatArray.indexOf(this.selectedField);\n        if(index-1 === -1){\n            index = this.formatArray.length;\n        }\n        this.selectedField = this.formatArray[index - 1];\n        \n\n    }\n\n\n\n    /////////////////////\n\n\n    setSelectedField(fieldName?: string): void {\n        this.selectedField = fieldName as string;\n\n    }\n\n    \n\n    updateDateTime(value ?:any): void {\n        if (this.selectedField === \"year\") {\n            this.setYear(parseInt(value));\n        } else if (this.selectedField === \"month\") {\n            this.setMonth(parseInt(value));\n        } else if (this.selectedField === \"date\") {\n            this.setDate(parseInt(value));\n        } else if (this.selectedField === \"hour\") {\n            this.setHour(parseInt(value));\n        } else if (this.selectedField === \"minute\") {\n            this.setMinute(parseInt(value));\n        } else if (this.selectedField === \"second\") {\n            this.setSecond(parseInt(value));\n        } else if (this.selectedField === \"millisecond\") {\n            this.setMillisecond(parseInt(value));\n        }\n    }\n\n    // ##### ----- Navigators Methods ----- ##### \n\n    navigateToLeft() {\n        let index = this.formatArray.indexOf(this.selectedField);\n        if (index === 0) {\n            index = this.formatArray.length;\n        }\n        return this.selectedField = this.formatArray[index - 1];\n    }\n\n    navigateToRight() {\n        let index = this.formatArray.indexOf(this.selectedField);\n        if (index === this.formatArray.length - 1) {\n            index = -1;\n        }\n        return this.selectedField = this.formatArray[index + 1];\n    }\n\n    navigateToNextDate() {\n        this.date = this.currentDateTime.date();\n        this.currentDateTime = this.currentDateTime.set(\"date\", this.date + 1);\n        return this.getCurrentDate();\n    }\n\n    navigateToNextMonth() {\n        this.monthIndex = this.currentDateTime.month();\n        this.currentDateTime = this.currentDateTime.set(\"month\", this.monthIndex + 1);\n        return this.getCurrentMonth();\n    }\n\n    navigateToNextYear() {\n        this.year = this.currentDateTime.year();\n        this.currentDateTime = this.currentDateTime.set(\"year\", this.year + 1);\n        return this.getCurrentYear();\n    }\n\n    navigateToNextHour() {\n        this.hour = this.currentDateTime.hour();\n        this.currentDateTime = this.currentDateTime.set(\"hour\", this.hour + 1);\n        return this.getCurrentHour();\n    }\n\n    navigateToNextMinute() {\n        this.minute = this.currentDateTime.minute();\n        this.currentDateTime = this.currentDateTime.set(\"minute\", this.minute + 1);\n        return this.getCurrentMinute();\n    }\n\n    navigateToNextSecond() {\n        this.second = this.currentDateTime.second();\n        this.currentDateTime = this.currentDateTime.set(\"second\", this.second + 1);\n        return this.getCurrentSecond();\n    }\n\n    navigateToNextMillisecond() {\n        this.millisecond = this.currentDateTime.millisecond();\n        this.currentDateTime = this.currentDateTime.set(\"millisecond\", this.millisecond + 1);\n        return this.getCurrentMillisecond();\n    }\n\n    navigateToPrevDate() {\n        this.date = this.currentDateTime.date();\n        this.currentDateTime = this.currentDateTime.set(\"date\", this.date - 1);\n        return this.getCurrentDate();\n    }\n\n    navigateToPrevMonth() {\n        this.monthIndex = this.currentDateTime.month();\n        this.currentDateTime = this.currentDateTime.set(\"month\", this.monthIndex - 1);\n        return this.getCurrentMonth();\n    }\n\n    navigateToPrevYear() {\n        this.year = this.currentDateTime.year();\n        this.currentDateTime = this.currentDateTime.set(\"year\", this.year - 1);\n        return this.getCurrentYear();\n    }\n\n    navigateToPrevHour() {\n        this.hour = this.currentDateTime.hour();\n        this.currentDateTime = this.currentDateTime.set(\"hour\", this.hour - 1);\n        return this.getCurrentHour();\n    }\n\n    navigateToPrevMinute() {\n        this.minute = this.currentDateTime.minute();\n        this.currentDateTime = this.currentDateTime.set(\"minute\", this.minute - 1);\n        return this.getCurrentMinute();\n    }\n\n    navigateToPrevSecond() {\n        this.second = this.currentDateTime.second();\n        this.currentDateTime = this.currentDateTime.set(\"second\", this.second - 1);\n        return this.getCurrentSecond();\n    }\n\n    navigateToPrevMillisecond() {\n        this.millisecond = this.currentDateTime.millisecond();\n        this.currentDateTime = this.currentDateTime.set(\"millisecond\", this.millisecond - 1);\n        return this.getCurrentMillisecond();\n    }\n\n    // ##### ----- Getter Methods ----- ##### \n\n    getFormat(): string{\n        return this.format;\n    }\n\n\n    getFormatMap(): FormatType {\n        return this.formatMap;\n    }\n\n    getDefaultPattern() {\n        return this.patternArray;\n    }\n\n    getUpdatedPattern() {\n        const date = this.getCurrentDate();\n        const month = this.getCurrentMonth();\n        const year = this.getCurrentYear();\n        const hour = this.getCurrentHour();\n        const minute = this.getCurrentMinute();\n        const second = this.getCurrentSecond();\n        const millisecond = this.getCurrentMillisecond();\n\n        this.patternArray = this.patternArray.map(item => {\n            if (item.fieldName === 'date') {\n                return { ...item, placeHolder: date };\n            }\n            if (item.fieldName === 'month') {\n                return { ...item, placeHolder: month };\n            }\n            if (item.fieldName === 'year') {\n                return { ...item, placeHolder: year };\n            }\n            if (item.fieldName === 'hour') {\n                return { ...item, placeHolder: hour };\n            }\n            if (item.fieldName === 'minute') {\n                return { ...item, placeHolder: minute };\n            }\n            if (item.fieldName === 'second') {\n                return { ...item, placeHolder: second };\n            }\n            if (item.fieldName === 'millisecond') {\n                return { ...item, placeHolder: millisecond };\n            }\n            return item;\n        });\n        return this.patternArray;\n    }\n\n    getSelectedField(): string {\n        return this.selectedField;\n    }\n\n    // Current DateTime Getters\n\n    getCurrentFullDateTime(): string {\n        return this.format ? this.currentDateTime.format(this.format): this.currentDateTime.toString() ;\n    }\n\n    getCurrentDate(): string {\n        return this.currentDateTime.format(this.formatMap[\"date\"]);\n    }\n\n    getCurrentMonth(): string {\n        return this.currentDateTime.format(this.formatMap[\"month\"]);\n    }\n\n    getDateFormat(): string {\n        return this.formatMap[\"date\"] as string;\n\n    }\n\n    getCurrentYear(): string {\n        return this.currentDateTime.format(this.formatMap[\"year\"]);\n    }\n\n    getCurrentHour(): string {\n        if (this.formatMap[\"meridian\"]) {\n            return this.currentDateTime.format('hh');\n            return this.currentDateTime.format('h');\n        }\n        return this.currentDateTime.format(this.formatMap[\"hour\"]);\n    }\n\n    getCurrentMinute(): string {\n        return this.currentDateTime.format(this.formatMap[\"minute\"]);\n    }\n    getCurrentMeridian():string{\n        return this.currentDateTime.format(this.formatMap[\"meridian\"]);\n    }\n\n    getCurrentSecond(): string {\n        return this.currentDateTime.format(this.formatMap[\"second\"]);\n    }\n\n    getCurrentMillisecond(): string {\n        return this.currentDateTime.format(this.formatMap[\"millisecond\"]);\n    }\n\n    setSelectedDate(date :Dayjs|null){\n        this.selectedDateTime = date\n    }\n\n    private formatDayJs(dateString: string): Dayjs  {\n        const parsedDate = dayjs(dateString.toUpperCase(), this.format, true);\n        return parsedDate;\n    }\n\n    parseAndSetDateFromString(dateString: string): boolean {\n        if (!dateString || !this.format) {\n            return false;\n        }\n        // const parsedDate = dayjs(dateString, this.format, true);\n        const parsedDate = this.formatDayJs(dateString);\n        if (!parsedDate.isValid()) {\n            return false;\n        }\n\n        const isWithinMaxRange = !this.maxDate || (parsedDate.isBefore(this.maxDate) || parsedDate.isSame(this.maxDate));\n        const isWithinMinRange = !this.minDate || (parsedDate.isAfter(this.minDate) || parsedDate.isSame(this.minDate));\n\n        if (!isWithinMaxRange || !isWithinMinRange) {\n            return false;\n        }\n        this.currentDateTime = parsedDate;\n        this.selectedDateTime = parsedDate;\n        this.activatePlaceholder = false;\n        this.monthChanged = true;\n\n        return true;\n    }\n\n   \n\n    // Method to get selection pattern\n    getSelectionPatterns(): SelectedPatternType[] {\n        const selectionPattern : SelectedPatternType[] = [];\n        let currentIndex = 0;\n\n        this.patternArray.forEach((pattern) => {\n            const length = pattern.placeHolder.length;\n            if (pattern.fieldName !== 'separator') {\n                const object = { type: pattern.fieldName, start: currentIndex, end: currentIndex + length }\n                if(pattern.fieldName==='meridian'){\n                    object.end = object.end+1\n                }\n                selectionPattern.push(object);\n                \n            }\n            currentIndex += length;\n        });\n\n\n        return selectionPattern;\n    }\n\n    getSelectionPattern(): SelectedPatternType[] {\n        const selectionPattern: SelectedPatternType[] = [];\n        let currentIndex = 0;\n    \n        for (const pattern of this.patternArray) {\n            if (pattern.fieldName === 'separator') {\n                currentIndex++;\n                continue;\n            }\n    \n            const callBack = getCallbackName(pattern.fieldName, \"getCurrent\") as keyof this;\n            let value = (this[callBack] as CallableFunction)(pattern.fieldName) ;\n            // const value = (this[callBack] as () => SelectedPatternType[]).call(pattern.fieldName);\n            if(pattern.fieldName === 'month'){\n               \n                if(!this.monthChanged){\n                    const customFormat = this.optionHandler.getCustomFormats();\n                    if(customFormat && customFormat['month']){\n                        value = customFormat['month'] as string\n                    }else{\n                        value = this.formatMap['month'] as string\n                    }\n                }\n            }\n            \n            const length = value.length;\n    \n            const object = { type: pattern.fieldName, start: currentIndex, end: currentIndex + length };\n            if (pattern.fieldName === 'meridian') {\n                object.end = object.end + 1;\n            }\n            selectionPattern.push(object);\n    \n            currentIndex += length;\n        }\n    \n        return selectionPattern;\n    }\n\n    getValueAsTimeStamp():number{\n        // const hourCycle = this.optionHandler.getHourCycle();\n        let timestamp = this.currentDateTime.valueOf();\n        // if(hourCycle){\n        // //    const date =  dayjs.utc(timestamp).format(`${this.format} [GMT]`);\n        // //    return dayjs(date).valueOf();\n        // const GMTdate = new Date(timestamp).toUTCString();\n        // console.log(`||| timestamp ${timestamp}`)\n\n        // timestamp = dayjs.utc(GMTdate).valueOf();\n\n        // console.log(`||| GMTdate ${timestamp}`)\n\n\n        // }\n\n        return timestamp;\n    }\n\n    \n\n    setMonthChanged(value:boolean){\n        this.monthChanged = value;\n\n    }\n\n    isAllowSpecialKeys(event: KeyboardEvent): boolean {\n        const type =this.optionHandler.getType()\n        const separatorKeys = ['/', '-', ':', ' ', '.'];\n\n        if(type === 'datetimepicker'){\n            const meridianKeys = ['a','p','m']\n            separatorKeys.push(...meridianKeys)\n        }\n        const allowManualInput = this.optionHandler.isAllowManualInput();\n        const isSeparator = separatorKeys.includes(event.key.toLowerCase());\n        const allowSpecialKeys = allowManualInput && isSeparator;\n        return allowSpecialKeys ?? false;\n    }\n    \n    // getSelectionPattern(): SelectedPatternType[]{\n    //     const selectionPattern: SelectedPatternType[] = [];\n    //     let currentIndex = 0;\n\n\n    //     this.patternArray.forEach((pattern) => {\n\n    //         if (pattern.fieldName === 'separator') {\n    //             currentIndex ++;\n    //             return\n\n    //         }\n\n    //         const callBack = getCallbackName(pattern.fieldName,\"getCurrent\") \n    //         const value = this[callBack]() as SelectedPatternType[];\n    //         const length = value.length\n\n    //         if (pattern.fieldName !== 'separator') {\n\n    //             const object = { type: pattern.fieldName, start: currentIndex, end: currentIndex + length }\n    //             if(pattern.fieldName==='meridian'){\n    //                 object.end = object.end+1\n    //             }\n    //             selectionPattern.push(object);\n                \n    //         }\n    //         currentIndex += length;\n    //     });\n\n\n    //     return selectionPattern;\n    // }\n\n\n\n    // ValidationDateTime\n\n}\n\n// function getCallback(eventName: string, Hookname: string): string {\n//     if (eventName && eventName.length == 2) {\n//         return eventName;\n//     }\n    \n//     return `${Hookname}${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n// }\n\nfunction getCallbackName(field: string, operation: 'increment' | 'decrement' | 'getCurrent'): keyof DateTimeModel {\n    // Example implementation; modify this as per your logic\n    return `${operation}${field.charAt(0).toUpperCase() + field.slice(1)}` as keyof DateTimeModel;\n  }\n\n  export function isSameMonthInSameYear(date1:Dayjs,date2:Dayjs):boolean{\n\n    const month1 = date1.month();\n    const month2= date2.month();\n\n    const year1 =  date1.year();\n    const year2 = date2.year();\n\n    if( (month1 === month2) && (year1 === year2)){\n        return true;\n    }\n    return false;\n\n}\n\n\nfunction generateCompID() {\n    const randomText = Math.random().toString(36).substring(2, 10);\n    return `dg-component--${randomText}`;\n  }","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DateTimeColour, DateTimeConfiguration, DateTimeVariantType, DateType, FieldType, HooksParams, IRenderer ,ICustomFormat} from \"../../date-time-configuration.types\";\nimport { DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { ClipboardConfig } from \"../../../../utility/clipboard\";\n\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class DateTimeOptionHandler extends EventEmitter {\n\n    private domKey = `_DG_${Math.random().toString()}`;\n\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_CONFIGURATION) configuration!: DateTimeConfiguration;\n\n    getDomKey(): string {\n\t\treturn this.domKey;\n\t}\n\n\n    getDomData(element: Node | null, key: string): any {\n\t\tconst domData = (element as any)[this.getDomKey()];\n\t\treturn domData ? domData[key] : undefined;\n\t}\n\n\tsetDomData(element: Element, key: string, value: any): any {\n\t\tconst domKey = this.getDomKey();\n\t\tlet domData = (element as any)[domKey];\n\n\t\tif (!domData) {\n\t\t\tdomData = {};\n\t\t\t(element as any)[domKey] = domData;\n\t\t}\n\n\t\tdomData[key] = value;\n\t}\n\n    getInstanceID(): string | undefined {\n        return this.configuration.instanceID;\n    }\n\n    shouldIgnoreEmptyDOM() : boolean {\n       return this.configuration?.ignoreEmptyDOM !== undefined\n? !this.configuration.ignoreEmptyDOM\n: false;\n    }\n\n    getId(): string {\n        return this.configuration.id ??'';\n    }\n\n    getFormat(): string |null {\n        return this.configuration.format ?? null;\n    }\n\n    getLocale(): string {\n        return this.configuration.locale ?? '';\n    }\n\n    getDefaultValue(): DateType |null{\n        return this.configuration.value ?? null;\n    }\n\n    getMax(): DateType {\n        return this.configuration.maxValue ?? '';\n    }\n\n    getMin(): DateType {\n        return this.configuration.minValue ?? '';\n    }\n\n    getLabel(): string {\n        return this.configuration.label ?? '';\n    }\n\n    getAriaLabelledby(): string {\n\t\treturn this.configuration.ariaLabelledby ?? 'number';\n\t}\n\n\tgetAriaDescribedby(): string {\n\t\treturn this.configuration.ariaDescribedby ?? 'numberHelper';\n\t}\n\n    getName(): string {\n        return this.configuration.name ?? '';\n    }\n\n    getTimezone(): string {\n        return this.configuration.timezone ?? '';\n    }\n\n    getDescriptionRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.descriptionRenderer;\n    }\n\n    getDescriptionRendererParams(): object | undefined {\n        return this.configuration.descriptionRendererParams;\n    }\n\n    getValidationMessageRenderer(): (new() => IRenderer) | undefined {\n        return this.configuration.validationMessageRenderer;\n    }\n\n    getValidationMessageRendererParams(): object | undefined {\n        return this.configuration.validationMessageRendererParams;\n    }\n    getDescription(): string | undefined {\n        return this.configuration.description;\n    }\n\n\n    getValidationMessage(): string |null {\n        return this.configuration.validationMessage ?? null;\n    }\n\n    getTemplate(props:any)              :any{\n        return this.configuration.template && this.configuration.template(props);\n    }\n\n    getSpinButton(): string {\n        return this.configuration.spinButton ?? 'none';\n    }\n\n    enableStepperButtons(): boolean {\n\t\treturn this.configuration.enableStepperButtons ?? false;\n\t}\n    \n    isDisabled(): boolean {\n        return this.configuration.disabled ?? false;\n    }\n\n    isReadonly(): boolean {\n        return this.configuration.readonly ?? false;\n    }\n\n    isAutoFocus(): boolean {\n        return this.configuration.autoFocus ?? false;\n    }\n\n    isClearable(): boolean {\n        return this.configuration.clearable ?? false;\n    }\n\n    isDisablePast(): boolean {\n        return this.configuration.disablePast ?? false;\n    }\n\n    isDisableFuture(): boolean {\n        return this.configuration.disableFuture ?? false;\n    }\n\n    isFocused(): boolean {\n        return this.configuration.focused ?? false;\n    }\n\n    isRequired(): boolean {\n        return this.configuration.required ?? false;\n    }\n\n    getColor(): DateTimeColour | null  {\n        return this.configuration.color ?? null;\n    }\n\n    getSize(): string | undefined {\n        return this.configuration.size;\n    }\n\n    getVariant(): DateTimeVariantType |  null  {\n        return this.configuration.variant ?? null;\n    }\n\n    getAppendTo(): HTMLElement | null  {\n        return this.configuration.appendTo ?? null ;\n    }\n\n    onChange(params:HooksParams): void {\n        if(typeof this.configuration.onChange === 'function') {\n            this.configuration.onChange(params);\n        }\n\n    }\n    onPickerOpen(): void {\n        if(typeof this.configuration.onPickerOpen === 'function') {\n            this.configuration.onPickerOpen();\n        }\n\n    }\n\n    onError(value:string): void {\n        this.configuration.onError && this.configuration.onError(value);\n    }\n    getDecrementButtonSVGIconId(): string  {\n        return this.configuration.decrementButtonSVGIconId ?? \"icon-down-arrow\";\n    }\n\n    getIncrementButtonSVGIconId(): string  {\n        return this.configuration.incrementButtonSVGIconId ?? \"icon-up-arrow\";\n    }\n\n\tgetIncrementButtonRenderer():  { new(...args: any[]): IRenderer } | undefined {\n\t\treturn this.configuration.decrementRenderer;\n\t}\n   \n\tgetIncrementRendererParams(): any {\n\t\treturn this.configuration.incrementRendererParams;\n\t}\n\n\tgetDecrementButtonRenderer(): { new(...args: any[]): IRenderer } | undefined {\n\t\treturn this.configuration.incrementButtonRenderer;\n\t}\n\n\tgetDecrementRendererParams(): any {\n\t\treturn this.configuration.decrementRendererParams;\n\t}\n\n    updateConfiguration(config: DateTimeConfiguration): void {\n        this.configuration = config;\n        this.dispatchEvent({ type: 'PROPERTY_CHANGED' });\n    }\n\n    getAriaLabel(){\n        return this.configuration.ariaLabel?? 'date';\n    }\n\n    getType(): FieldType{\n        return this.configuration.type ?? 'datetimefield';\n    }\n\n    getDatePickerAppendTo():HTMLElement{\n        return this.configuration.datePickerAppendTo?? document.body;\n    }\n    getShowTimePicker(): boolean {\n        return this.configuration.showTimePicker ?? false;\n    }\n\n    // getHourCycle(): IHourCycle{\n    //     const val = Number(this.configuration.hourCycle);\n    //     const isNum = typeof val == 'number';\n    //     return isNum ? (val as  IHourCycle) : undefined\n    // }\n\n    getHourCycle(): IHourCycle{\n        const type = this.getType();\n        if(type  == 'datetimepicker'){\n           const displayFormat = this.getFormat();\n            if(displayFormat){\n                const hasMeridian = /A/i.test(displayFormat) || /P/i.test(displayFormat);\n                return hasMeridian ? 12 as IHourCycle : 24 as IHourCycle;\n            }\n            const valueFormat = this.getValueFormat();\n            if(valueFormat){\n                const splitArray = valueFormat.split(' ');\n                if(splitArray.includes('A') || splitArray.includes('P')){\n                    return 12 as IHourCycle;\n                }else{\n                    return 24 as IHourCycle;\n                }\n            }\n            const val = Number(this.configuration.hourCycle);\n            const isNum = typeof val == 'number';\n            return isNum ? (val as  IHourCycle) : undefined\n        }\n\n        const val = Number(this.configuration.hourCycle);\n        const isNum = typeof val == 'number';\n        return isNum ? (val as  IHourCycle) : undefined\n    }\n\n    getHorizontalSpacing(): number {\n        return this.configuration.horizontalSpacing ?? 0;\n    }\n\n    getVerticalSpacing(): number {\n        return this.configuration.verticalSpacing ?? 0;\n    }\n\n    getTimestamp():number |  null{\n        return this.configuration.timestamp ?? null\n\n    }\n\n    getEventKey(): string{\n        return this.configuration.eventKey ?? '';\n    }\n\n    getPlaceholder(): string | undefined{\n        return this.configuration.placeholder;\n    }\n\n    shouldShowFormatAsPlaceholder(): boolean {\n        return this.configuration.showFormatAsPlaceholder ?? false;\n    }\n\n    shouldAutoFillFormatOnFirstInput(): boolean {\n        return this.configuration.autoFillFormatOnFirstInput ?? false;\n    }\n\n\n    getMinuteInterval(): number {\n        return this.configuration.minuteInterval ?? 1;\n    }\n\n    getCalendarIcon() : boolean {\n        return this.configuration.showDatePicker?? true;\n    }\n\n    getCustomFormats(): ICustomFormat | undefined {\n        return this.configuration.customFormat;\n    }\n\n    getMinDate(): DateType {\n        return this.configuration.maxValue;\n    }\n\n    getMaxDate(): DateType {\n        return this.configuration.minValue;\n    }\n\n    shouldOpenPickerOnFocus(): boolean {\n        return this.configuration.openPickerOnFocus ?? false;\n    }\n    onFocus(params:HooksParams): void {\n        if(typeof this.configuration.onFocus === 'function') {\n            this.configuration.onFocus(params);\n        }\n    }\n\n    onBlur(params:HooksParams): void {\n        if(typeof this.configuration.onBlur === 'function') {\n            this.configuration.onBlur(params);\n        }\n    }\n\n    showErrorState() : boolean {\n        return this.configuration.showErrorState ?? false;\n    }\n\n    isValid(): boolean {\n        return this.configuration.status === 'error';\n    }\n\n    updateStatus(status : 'error' | \"none\") : void {\n        this.configuration.status = status;\n        this.dispatchEvent({\n            type : \"EVENT_VALUE_UPDATE\",\n            force : true\n        })\n    }\n\n    updateValidationMessage(message : string) : void {\n        this.configuration.validationMessage = message;\n    }\n\n    getLabelRenderer() {\n        return this.configuration.labelRenderer;\n    }\n\n    getLabelRendererParams() {\n        return this.configuration.labelRendererParams ?? {};\n    }\n\n    getValueFormat(): string | undefined {\n        return this.configuration.valueFormat ?? undefined;\n    }\n\n    isAllowManualInput(): boolean | undefined {\n        return this.configuration.allowManualInput ?? false;\n    }\n\n    getClipboard(): ClipboardConfig {\n        return this.configuration.clipboard;\n    }\n    \n}\n\nexport type IHourCycle = 12 | 24 |undefined","import { AutoWired, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DateTimeModel } from \"./date-time-model\";\nimport { SelectedPatternType } from \"./date-time-model.types\";\n\n/**\n * Service responsible for managing selection/cursor position in DateTime input.\n * Separated from Controller to follow MVC principles and improve testability.\n */\n\n@Bean(DATE_TIME__BEAN_NAME.DATE_TIME_SELECTION_SERVICE)\nexport class DateTimeSelectionService extends EventEmitter {\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_MODEL) protected model!: DateTimeModel;\n\n    private isMakingSelection = false;\n\n    /**\n     * Finds the field type at a given cursor position\n     * @param cursorPosition - Current cursor position in the input\n     * @param pattern - Selection pattern array from model\n     * @returns Object with selectedField, start, and end positions\n     */\n    private findFieldAtPosition(\n        cursorPosition: number,\n        pattern: SelectedPatternType[]\n    ): { selectedField: string; start: number; end: number } | null {\n        if (!pattern || pattern.length === 0) {\n            return null;\n        }\n\n        for (const part of pattern) {\n            if (cursorPosition >= part.start && cursorPosition <= part.end) {\n                return {\n                    selectedField: part.type,\n                    start: part.start,\n                    end: part.end\n                };\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Finds the selection range for a given field type\n     * @param fieldType - The field type to find (e.g., 'date', 'month', 'year')\n     * @param pattern - Selection pattern array from model\n     * @returns Object with start and end positions, or null if not found\n     */\n    private findFieldRange(\n        fieldType: string,\n        pattern: SelectedPatternType[]\n    ): { start: number; end: number } | null {\n        if (!pattern || pattern.length === 0) {\n            return null;\n        }\n\n        for (const part of pattern) {\n            if (fieldType === part.type) {\n                return {\n                    start: part.start,\n                    end: part.end\n                };\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Validates and normalizes selection range to ensure it's within valid bounds\n     * @param start - Start position\n     * @param end - End position\n     * @param valueLength - Length of the input value\n     * @returns Normalized start and end positions\n     */\n    private validateSelectionRange(\n        start: number,\n        end: number,\n        valueLength: number\n    ): { start: number; end: number } {\n        const validStart = Math.max(0, Math.min(start, valueLength));\n        const validEnd = Math.max(validStart, Math.min(end, valueLength));\n        return { start: validStart, end: validEnd };\n    }\n\n    /**\n     * Applies selection range to the input element\n     * @param element - The HTML input element\n     * @param start - Start position\n     * @param end - End position\n     * @param waitForDOMUpdate - Whether to wait for DOM update using requestAnimationFrame\n     */\n    private applySelectionToElement(\n        element: HTMLInputElement,\n        start: number,\n        end: number,\n        waitForDOMUpdate: boolean = false\n    ): void {\n        const valueLength = element.value ? element.value.length : 0;\n        const { start: validStart, end: validEnd } = this.validateSelectionRange(start, end, valueLength);\n\n        if (waitForDOMUpdate) {\n            // Use requestAnimationFrame to ensure DOM is updated before selection\n            requestAnimationFrame(() => {\n                if (element && document.activeElement === element) {\n                    element.setSelectionRange(validStart, validEnd);\n                }\n            });\n        } else {\n            element.setSelectionRange(validStart, validEnd);\n        }\n    }\n\n    /**\n     * Handles selection based on click position\n     * Determines which field the user clicked on and selects it\n     * @param element - The HTML input element\n     * @param cursorPosition - Current cursor position\n     * @returns true if selection was applied, false otherwise\n     */\n    selectFieldAtCursorPosition(element: HTMLInputElement, cursorPosition: number | null): boolean {\n        if (this.isMakingSelection) {\n            return false; // Re-entrancy protection\n        }\n\n        if (cursorPosition === null || cursorPosition === undefined) {\n            return false;\n        }\n\n        try {\n            this.isMakingSelection = true;\n\n            const dateTimeParts = this.model.getSelectionPattern();\n            const fieldInfo = this.findFieldAtPosition(cursorPosition, dateTimeParts);\n\n            if (!fieldInfo) {\n                return false;\n            }\n\n            // Update model with selected field\n            this.model.setSelectedField(fieldInfo.selectedField);\n\n            // Apply selection to DOM\n            this.applySelectionToElement(element, fieldInfo.start, fieldInfo.end, false);\n\n            return true;\n        } catch (error) {\n            console.error('Error in selectFieldAtCursorPosition:', error);\n            return false;\n        } finally {\n            this.isMakingSelection = false;\n        }\n    }\n\n    /**\n     * Selects the field that is currently active in the model\n     * @param element - The HTML input element\n     * @param waitForDOMUpdate - Whether to wait for DOM update (default: true)\n     * @returns true if selection was applied, false otherwise\n     */\n    selectCurrentField(element: HTMLInputElement, waitForDOMUpdate: boolean = true): boolean {\n        if (this.isMakingSelection) {\n            return false; // Re-entrancy protection\n        }\n\n        try {\n            this.isMakingSelection = true;\n\n            const selectionField = this.model.getSelectedField();\n            if (!selectionField) {\n                return false;\n            }\n\n            const dateTimeParts = this.model.getSelectionPattern();\n            const range = this.findFieldRange(selectionField, dateTimeParts);\n\n            if (!range) {\n                return false;\n            }\n\n            // Apply selection to DOM\n            this.applySelectionToElement(element, range.start, range.end, waitForDOMUpdate);\n\n            return true;\n        } catch (error) {\n            console.error('Error in selectCurrentField:', error);\n            return false;\n        } finally {\n            this.isMakingSelection = false;\n        }\n    }\n\n    /**\n     * Checks if selection is currently being applied\n     * Useful for preventing concurrent selection operations\n     */\n    isSelectionInProgress(): boolean {\n        return this.isMakingSelection;\n    }\n}\n","\n\nimport {  Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DateTimeOptionHandlerType } from \"./date-time-options-handler.types\";\n\n\n@Bean('stateManager')\nexport class DateTimeStateManager extends EventEmitter {\n    isInValid() : boolean {\n        return (this.optionsHandler as DateTimeOptionHandlerType).isValid();\n    }\n}","\nimport { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName, } from '@dg/corecomponent';\nimport {ComponentMetadata} from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport {UserComponentHandler} from '@dg/corecomponent/UserComponentHandler.js';\nimport {UserComponentRegistry} from '@dg/corecomponent/UserComponentRegistry.js';\nimport { IComponentDetails } from '../../../../utility/component-detail.types';\nimport { DateTimeUserComponentHandlerTypes } from './date-time-user-component-handler.types';\nimport { ILabelUserComponentHandler } from '../../../../label/label.types';\n\nexport const enum PropertyName {\n\tPREFIX_RENDERER      = 'prefixRenderer',\n\tSUFFIX_RENDERER      = 'suffixRenderer',\n\tDESCRIPTION_RENDERER = 'descriptionRenderer',\n\tBUTTON_RENDERER      = 'buttonRenderer',\n\tERROR_RENDERER       = 'errorRenderer',\n\tLABEL_RENDERER       = 'labelRenderer'\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class DateTimeUserComponentHandler extends UserComponentHandler implements DateTimeUserComponentHandlerTypes, ILabelUserComponentHandler{\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\n\tgetLabelRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails(item, PropertyName.LABEL_RENDERER, params, PropertyName.LABEL_RENDERER);\n\t}\n\tgetPrefixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.PREFIX_RENDERER, params, PropertyName.PREFIX_RENDERER);\n\t}\n\n    getSuffixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.SUFFIX_RENDERER, params, PropertyName.SUFFIX_RENDERER);\n\t}\n\n\tgetDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.DESCRIPTION_RENDERER, params, PropertyName.DESCRIPTION_RENDERER);\n\t}\n\n\tgetErrorRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.ERROR_RENDERER, params, PropertyName.ERROR_RENDERER);\n\t}\n\n\tgetButtonRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.BUTTON_RENDERER, params, PropertyName.BUTTON_RENDERER);\n\t}\n\t\n\tprotected getComponentDetails( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.PREFIX_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.DESCRIPTION_RENDERER:\n\t\t\tcase PropertyName.ERROR_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.BUTTON_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(item : any, propertyName : PropertyName, params : any) : any {\n        switch(propertyName) {\n            case PropertyName.PREFIX_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n                return this.getUserRendererParams(item, params);\n            default:\n                return {};\n        }\n\n    }\n\n    private getUserRendererParams(item : any, params : any) : any {\n        const rendererParams = item.getUserRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n}\n","/**\n * Placeholder Engine Integration\n * Bridges new PlaceholderEngine with existing DateTimePlaceholderManager interface\n * Drop-in replacement that maintains backward compatibility\n */\n\nimport dayjs from \"dayjs\";\nimport customParseFormat from \"dayjs/plugin/customParseFormat.js\";\n\ndayjs.extend(customParseFormat);\n\nimport { AutoWired, Bean, PostConstruct, BEAN_NAME } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DateTimeModel } from \"./date-time-model\";\nimport { DATE_TIME__BEAN_NAME, DATETIME_BEAN_NAME } from \"../../constant/bean-name-constant\";\nimport { DATE_TIME_CUSTOM_EVENTS } from \"../../constant/event-name\";\nimport { DateTimeOptionHandlerType } from \"./date-time-options-handler.types\";\nimport { DateTimeSelectionService } from \"./date-time-selection-service\";\n\n// Simplified engine imports\nimport { PlaceholderEngine } from \"./placeholder-engine/placeholder-engine\";\nimport { DateTimeFormatProviderAdapter } from \"./placeholder-engine/adapters/format-provider-adapter\";\nimport { EditEvent, SelectionRange, TokenType, PlaceholderToken } from \"./placeholder-engine/types\";\n\nconst SELECTEDFIELD_NAME = {\n    DATE: 'date',\n    MONTH: 'month',\n    YEAR: 'year',\n    HOUR: 'hour',\n    MINUTE: 'minute',\n    SECOND: 'second',\n    MILLISECOND: 'millisecond',\n    MERIDIAN: 'meridian'\n};\n\n/**\n * Integration class that wraps PlaceholderEngine\n * Implements same interface as DateTimePlaceholderManager\n * Maintains backward compatibility\n */\n@Bean(DATE_TIME__BEAN_NAME.DATE_TIME_PLACEHOLDER_MANAGER)\nexport class DateTimePlaceholderManagerIntegration extends EventEmitter {\n    @AutoWired(DATETIME_BEAN_NAME.DATETIME_MODEL) protected model!: DateTimeModel;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler!: DateTimeOptionHandlerType;\n    @AutoWired(DATE_TIME__BEAN_NAME.DATE_TIME_SELECTION_SERVICE) protected selectionService!: DateTimeSelectionService;\n\n    private engine!: PlaceholderEngine;\n    private formatProvider!: DateTimeFormatProviderAdapter;\n    private lastMonth: string = \"\";\n    private element: HTMLInputElement | null = null;\n    private skipSyncOnGetPlaceholder: boolean = false;\n\n    @PostConstruct()\n    init(): void {\n        // Initialize format provider\n        this.formatProvider = new DateTimeFormatProviderAdapter(this.model, this.optionsHandler);\n        \n        // Get format and apply custom formats if present\n        const baseFormat = this.model.getFormat();\n        const format =this.optionsHandler.getCustomFormats();\n        \n        // Initialize engine with format (custom formats already applied)\n        this.engine = new PlaceholderEngine(this.formatProvider, baseFormat,format);\n\n        // Sync initial selected value from model if available\n        this.syncInitialValueFromModel();\n\n        // Handle event key if present\n        const eventKey = this.model.getEventKey();\n        if (eventKey) {\n            this.handleEventKey();\n        }\n\n        // Listen to format updates\n        this.addListener(\n            this.eventHandler,\n            DATE_TIME_CUSTOM_EVENTS.FORMAT_UPDATED,\n            this.setPlaceholder.bind(this)\n        );\n        this.addListener(\n            this.eventHandler,\n            DATE_TIME_CUSTOM_EVENTS.PROPERTY_CHANGED,\n            this.changeCustomFormat.bind(this)\n        );\n\n        // Listen to SYNC_PLACEHOLDER event to sync input value with engine and model\n        // This event is dispatched from input handler, event handler, etc.\n        // when input value changes (typing, backspace, arrow keys, etc.)\n        this.addListener(\n            this.eventHandler,\n            DATE_TIME_CUSTOM_EVENTS.SYNC_PLACEHOLDER,\n            () => {\n                // Sync input value with engine state\n                this.syncInputValueWithEngine();\n                // Sync input/engine state into model so currentDateTime is valid for increment/decrement\n                this.syncFromInputToModel();\n            }\n        );\n\n\n    }\n\n    /**\n     * Applies custom formats to format string\n     * Returns format with custom formats applied\n     * \n     * IMPORTANT: Processes patterns from longest to shortest to avoid partial matches\n     * Example: \"MMMM\" must be replaced before \"MM\" to prevent \"MM\" from matching inside \"MMMM\"\n     * Only replaces patterns that actually exist in the format string\n     */\n    // private applyCustomFormatsToFormat(baseFormat: string): string {\n    //     const customFormats = this.optionsHandler.getCustomFormats();\n    //     if (!customFormats) {\n    //         return baseFormat;\n    //     }\n\n    //     let format = baseFormat;\n    //     const formatArray = this.model.getFormatArray();\n    //     const formatMap = this.model.getFormatMap();\n        \n    //     // Create array of replacements with their patterns\n    //     const replacements: Array<{ pattern: string; newFormat: string; length: number }> = [];\n        \n    //     formatArray.forEach((item: string) => {\n    //         if (customFormats[item]) {\n    //             const formatToBeChanged = formatMap[item as keyof typeof formatMap] as string;\n    //             // Only add replacement if pattern exists in format string\n    //             if (formatToBeChanged && format.includes(formatToBeChanged)) {\n    //                 replacements.push({\n    //                     pattern: formatToBeChanged,\n    //                     newFormat: customFormats[item],\n    //                     length: formatToBeChanged.length,\n    //                 });\n    //             }\n    //         }\n    //     });\n        \n    //     // Sort by length (longest first) to avoid partial matches\n    //     // Example: \"MMMM\" (4 chars) should be replaced before \"MM\" (2 chars)\n    //     replacements.sort((a, b) => b.length - a.length);\n        \n    //     // Apply replacements in order (longest patterns first)\n    //     replacements.forEach(({ pattern, newFormat }) => {\n    //         // Only replace if pattern still exists (avoid double replacement)\n    //         if (format.includes(pattern)) {\n    //             // Use replace with regex to match exact pattern (not partial matches)\n    //             // Escape special regex characters in pattern\n    //             const escapedPattern = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    //             const regex = new RegExp(escapedPattern, 'g');\n    //             format = format.replace(regex, newFormat);\n    //         }\n    //     });\n        \n    //     return format;\n    // }\n\n    /**\n     * Handles custom format changes\n     * Applies custom formats to the format string before creating tokens\n     */\n    changeCustomFormat(): void {\n        const baseFormat = this.model.getFormat();\n        const format = this.optionsHandler.getCustomFormats();\n        \n        // Recreate engine with custom format applied\n        this.engine = new PlaceholderEngine(this.formatProvider, baseFormat,format);\n        \n        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.VALUE_CHANGED });\n    }\n\n    /**\n     * Gets formatted value for a field\n     * Supports custom formats\n     */\n    private getFormattedValueForField(fieldName: string): string {\n        const currentDateTime = this.model.getDateAsDayjsForCurrentDate();\n        const formatMap = this.model.getFormatMap();\n        // const customFormats = this.optionsHandler.getCustomFormats();\n\n        // Check for custom format first\n        const   formatPattern = formatMap[fieldName as keyof typeof formatMap] as string;\n\n        if (currentDateTime) {\n            return currentDateTime.format(formatPattern);\n        }\n\n        // Fallback to model methods\n        switch (fieldName) {\n            case SELECTEDFIELD_NAME.DATE:\n                return this.model.getCurrentDate();\n            case SELECTEDFIELD_NAME.MONTH:\n                return this.model.getCurrentMonth();\n            case SELECTEDFIELD_NAME.YEAR:\n                return this.model.getCurrentYear();\n            case SELECTEDFIELD_NAME.HOUR:\n                return this.model.getCurrentHour();\n            case SELECTEDFIELD_NAME.MINUTE:\n                return this.model.getCurrentMinute();\n            case SELECTEDFIELD_NAME.SECOND:\n                return this.model.getCurrentSecond();\n            case SELECTEDFIELD_NAME.MERIDIAN:\n                return this.model.getCurrentMeridian();\n            default:\n                return \"\";\n        }\n    }\n\n    /**\n     * Syncs initial selected value from model to engine\n     * Called during initialization to populate engine with preloaded values\n     */\n    private syncInitialValueFromModel(): void {\n        // Check if model has a selected date/time value\n        const selectedDateTime = this.model.getSelectedDateTime();\n        const currentDateTime = this.model.getDateAsDayjsForCurrentDate();\n        \n        // Use selected date if available, otherwise use current date\n        const dateTime = selectedDateTime || currentDateTime;\n        \n        if (!dateTime || selectedDateTime === null) {\n            // No date value in model - engine will use placeholder format\n            return;\n        }\n\n        // Get format array to know which fields to fill\n        const formatArray = this.model.getFormatArray();\n        if (!formatArray || formatArray.length === 0) {\n            return;\n        }\n\n        // Fill all fields that exist in the format\n        for (const fieldName of formatArray) {\n            const value = this.getFormattedValueForField(fieldName);\n            if (!value) {\n                continue;\n            }\n\n            // Map field name to token type\n            const tokenType = this.mapFieldNameToTokenType(fieldName);\n            if (!tokenType) {\n                continue;\n            }\n\n            // Fill the field in engine\n            const event: EditEvent = {\n                type: 'fieldFilled',\n                fieldType: tokenType as TokenType,\n                value: value,\n            };\n\n            this.engine.handleEvent(event);\n\n            // Track month change if applicable\n            if (fieldName === SELECTEDFIELD_NAME.MONTH) {\n                this.lastMonth = value;\n                this.model.setMonthChanged(true);\n            }\n        }\n\n        // Check if all fields are filled and update model state\n        this.checkAndUpdateModelState();\n    }\n\n    /**\n     * Handles event key (initial field fill)\n     */\n    handleEventKey(): void {\n        const fieldName = this.model.getFormatArray()[0];\n        if (!fieldName) return;\n\n        const value = this.getFormattedValueForField(fieldName);\n        \n        // Map field name to token type\n        const tokenType = this.mapFieldNameToTokenType(fieldName);\n        if (!tokenType) return;\n\n        // Fill the field\n        const event: EditEvent = {\n            type: 'fieldFilled',\n            fieldType: tokenType as TokenType,\n            value: value,\n        };\n\n        this.engine.handleEvent(event);\n\n        // Update model state if needed\n        if (fieldName === SELECTEDFIELD_NAME.MONTH) {\n            this.lastMonth = value;\n            this.model.setMonthChanged(true);\n        }\n\n        // Check if all fields filled\n        this.checkAndUpdateModelState();\n    }\n\n    /**\n     * Sets placeholder from format\n     * Applies custom formats if present\n     */\n    setPlaceholder(): void {\n        const baseFormat = this.model.getFormat();\n        const format = this.optionsHandler.getCustomFormats()\n        \n        this.engine = new PlaceholderEngine(this.formatProvider,baseFormat, format);\n    }\n\n    /**\n     * Gets placeholder string\n     * Syncs current input value with engine state before rendering\n     * This ensures that filled values are preserved and empty fields show placeholder format\n     * \n     * IMPORTANT: Always syncs when called, even if input value exists (for initial load)\n     * This ensures that preloaded values are properly synced with the engine\n     * \n     * Example: If input is \"December 20, 2020\" and month is deleted:\n     * - Sync will update engine: month=placeholder, day=\"20\", year=\"2020\"\n     * - Render will return: \"MMMM 20, 2020\" (only month shows placeholder)\n     */\n    getPlaceholder(): string {\n        // Always sync input value with engine state if element exists\n        // This ensures the engine knows which fields are filled and which are empty\n        // Even if value is preloaded initially, sync will update the engine\n        // Skip sync only if we just updated the element value in changeFormatForSelectedField()\n        if (this.element && !this.skipSyncOnGetPlaceholder) {\n            // Sync even if value is empty - this will reset all fields to placeholder format\n            this.syncInputValueWithEngine();\n        }\n        // Reset flag after sync check\n        this.skipSyncOnGetPlaceholder = false;\n        \n        // Render will show placeholder format for unfilled tokens and actual values for filled tokens\n        return this.engine.render();\n    }\n\n    /**\n     * Gets formatted value based on engine state\n     * Returns string with filled values and placeholder format for unfilled fields\n     * Example: If only month is filled -> \"May DD, YYYY\"\n     */\n    getFormattedValue(): string {\n        const state = this.engine.getState();\n        \n        // Build formatted string: filled tokens show their value, unfilled show placeholder format\n        return state.tokens\n            .map(token => {\n                if (token.isEditable && token.isFilled) {\n                    // Show actual filled value\n                    return token.displayValue;\n                } else if (token.isEditable) {\n                    // Show placeholder format for unfilled fields\n                    return token.rawFormat;\n                } else {\n                    // Separators and non-editable tokens show as-is\n                    return token.displayValue;\n                }\n            })\n            .join('');\n    }\n\n    /**\n     * Resets placeholder to initial format\n     * Applies custom formats if present\n     */\n    resetPlaceholder(): void {\n        const baseFormat = this.model.getFormat();\n        const format = this.optionsHandler.getCustomFormats();;\n        \n        this.engine = new PlaceholderEngine(this.formatProvider, baseFormat,format);\n    }\n\n    /**\n     * Handles field change (called when field is updated)\n     */\n    change(): void {\n        const selectedField = this.model.getSelectedField();\n        if (!selectedField) return;\n\n        // Check if all fields are filled\n        const state = this.engine.getState();\n        const filledCount = state.tokens.filter(t => t.isEditable && t.isFilled).length;\n        const totalCount = state.tokens.filter(t => t.isEditable).length;\n\n        if (filledCount === totalCount) {\n            const date = this.model.getDateAsDayjsForCurrentDate();\n            this.model.setSelectedDate(date);\n            this.model.setActivatePlaceholder(false);\n            return;\n        }\n\n        // Get formatted value\n        const value = this.getFormattedValueForField(selectedField);\n        const tokenType = this.mapFieldNameToTokenType(selectedField);\n        \n        if (!tokenType) return;\n\n        // Fill the field\n        const event: EditEvent = {\n            type: 'fieldFilled',\n            fieldType: tokenType as TokenType,\n            value: value,\n        };\n\n        this.engine.handleEvent(event);\n\n        // Update model state\n        if (selectedField === SELECTEDFIELD_NAME.MONTH) {\n            this.lastMonth = value;\n            this.model.setMonthChanged(true);\n        }\n\n        // Check if all fields filled\n        this.checkAndUpdateModelState();\n    }\n\n    /**\n     * Public method to sync current input value with engine state\n     * Can be called from external handlers (input handler, event handler, etc.)\n     * to ensure engine state matches current input value\n     */\n    syncInputValue(): void {\n        this.syncInputValueWithEngine();\n    }\n\n    /**\n     * Syncs current input/engine state into the model's currentDateTime.\n     * Replaces placeholder segments with parseable defaults so the model has a valid\n     * base date for increment/decrement on any field (e.g. after backspace on month).\n     * Uses engine token positions (not model selection pattern) so positions match the input.\n     * Does not set selectedDateTime.\n     */\n    syncFromInputToModel(): void {\n        if (!this.element) {\n            return;\n        }\n        this.syncInputValueWithEngine();\n        const inputValue = this.element.value || '';\n        const format = this.model.getFormat();\n        if (!format) {\n            return;\n        }\n        const state = this.engine.getState();\n        // Calculate positions inline\n        const positioned = this.calculateTokenPositions(state.tokens);\n        let built = inputValue;\n        for (let i = positioned.length - 1; i >= 0; i--) {\n            const token = positioned[i];\n            if (!token.isEditable) {\n                continue;\n            }\n            const segment = built.substring(token.start, Math.min(token.end, built.length));\n            const isPlaceholder = !segment ||\n                this.isPlaceholderFormat(segment, token.rawFormat);\n            if (isPlaceholder) {\n                const fieldName = this.mapTokenTypeToFieldName(token.type);\n                const defaultValue = this.getDefaultValueForParsing(fieldName);\n                built = built.substring(0, token.start) + defaultValue + built.substring(Math.min(token.end, built.length));\n            }\n        }\n        const parsed = dayjs(built, format, true);\n        if (parsed.isValid()) {\n            this.model.setCurrentDateTime(parsed);\n        }\n    }\n\n    private mapTokenTypeToFieldName(tokenType: TokenType): string {\n        const mapping: Record<string, string> = {\n            day: SELECTEDFIELD_NAME.DATE,\n            month: SELECTEDFIELD_NAME.MONTH,\n            year: SELECTEDFIELD_NAME.YEAR,\n            hour: SELECTEDFIELD_NAME.HOUR,\n            minute: SELECTEDFIELD_NAME.MINUTE,\n            second: SELECTEDFIELD_NAME.SECOND,\n            millisecond: SELECTEDFIELD_NAME.MILLISECOND,\n            meridian: SELECTEDFIELD_NAME.MERIDIAN,\n        };\n        return mapping[tokenType] ?? '';\n    }\n\n    /**\n     * Default values used when building a parseable string from partial input\n     * (e.g. \"MMMM 02, 2026\" -> \"January 02, 2026\" so model has a valid base for increment/decrement).\n     */\n    private getDefaultValueForParsing(fieldType: string): string {\n        const now = dayjs();\n        const map: Record<string, string> = {\n            [SELECTEDFIELD_NAME.MONTH]: 'January',\n            [SELECTEDFIELD_NAME.DATE]: '01',\n            [SELECTEDFIELD_NAME.YEAR]: String(now.year()),\n            [SELECTEDFIELD_NAME.HOUR]: '12',\n            [SELECTEDFIELD_NAME.MINUTE]: '00',\n            [SELECTEDFIELD_NAME.SECOND]: '00',\n            [SELECTEDFIELD_NAME.MERIDIAN]: 'AM',\n        };\n        return map[fieldType] ?? '';\n    }\n\n    /**\n     * Syncs model's currentDateTime into the engine so display matches model\n     * after increment/decrement. Call after model.increment()/decrement() when\n     * selectedDateTime is null so getPlaceholder() shows the updated partial value.\n     */\n    syncModelToEngine(): void {\n        const currentDateTime = this.model.getDateAsDayjsForCurrentDate();\n        if (!currentDateTime) {\n            return;\n        }\n        const formatArray = this.model.getFormatArray();\n        if (!formatArray?.length) {\n            return;\n        }\n        for (const fieldName of formatArray) {\n            const tokenType = this.mapFieldNameToTokenType(fieldName);\n            if (!tokenType) {\n                continue;\n            }\n            const value = this.getFormattedValueForField(fieldName);\n            if (!value) {\n                continue;\n            }\n            const event: EditEvent = {\n                type: 'fieldFilled',\n                fieldType: tokenType as TokenType,\n                value,\n            };\n            this.engine.handleEvent(event);\n        }\n        if (formatArray.includes(SELECTEDFIELD_NAME.MONTH)) {\n            this.lastMonth = this.getFormattedValueForField(SELECTEDFIELD_NAME.MONTH);\n        }\n        this.skipSyncOnGetPlaceholder = true;\n    }\n\n    /**\n     * Syncs current input value with engine state\n     * Extracts filled values from input and updates tokens to preserve filled values\n     * Also resets empty fields to placeholder format\n     * \n     * This ensures that:\n     * - Filled fields (like \"20\" and \"2020\") are preserved and synced\n     * - Empty fields show placeholder format (like \"MMMM\" or \"Month\")\n     * - When getPlaceholder() is called, it returns mixed format: \"MMMM 20, 2020\"\n     * \n     * Works for both:\n     * - Initial load: \"December 20, 2020\" → syncs all fields\n     * - After deletion: \" 20, 2020\" → syncs day/year, resets month to placeholder\n     */\n    private syncInputValueWithEngine(): void {\n        if (!this.element) {\n            return;\n        }\n\n        const inputValue = this.element.value || '';\n        const dateTimeParts = this.model.getSelectionPattern();\n        \n        if (!dateTimeParts || dateTimeParts.length === 0) {\n            return;\n        }\n\n        // Process each field in the selection pattern\n        // Get fresh state for each field to account for updates\n        for (const part of dateTimeParts) {\n            // Map field type to token type\n            const tokenType = this.mapFieldNameToTokenType(part.type);\n            if (!tokenType) {\n                continue;\n            }\n\n            // Get fresh state to check current token value\n            const state = this.engine.getState();\n            const token = state.tokens.find(t => t.type === tokenType && t.isEditable);\n            if (!token) {\n                continue;\n            }\n\n            // Get substring for this field from input\n            // Use exact positions from selection pattern\n            const fieldValue = inputValue.substring(part.start, Math.min(part.end, inputValue.length)).trim();\n            \n            // Check if field has a meaningful value in input\n            // A value is meaningful if it's not empty and not just placeholder format\n            const hasValue = fieldValue && \n                            fieldValue.length > 0 && \n                            fieldValue !== token.rawFormat &&\n                            !this.isPlaceholderFormat(fieldValue, token.rawFormat);\n            \n            if (hasValue) {\n                // Field has actual value - fill the token\n                if (token.displayValue !== fieldValue || !token.isFilled) {\n                    const event: EditEvent = {\n                        type: 'fieldFilled',\n                        fieldType: tokenType as TokenType,\n                        value: fieldValue,\n                    };\n                    this.engine.handleEvent(event);\n                }\n            } else {\n                // Field is empty or contains placeholder format - reset to placeholder\n                if (token.isFilled || (token.displayValue !== token.rawFormat && fieldValue.length === 0)) {\n                    const event: EditEvent = {\n                        type: 'fieldCleared',\n                        fieldType: tokenType as TokenType,\n                    };\n                    this.engine.handleEvent(event);\n                }\n            }\n        }\n    }\n\n    /**\n     * Checks if a value is just a placeholder format (not an actual value)\n     * Helps distinguish between \"MMMM\" (placeholder) and \"December\" (actual value)\n     */\n    private isPlaceholderFormat(value: string, rawFormat: string): boolean {\n        // If value matches rawFormat exactly, it's placeholder\n        if (value === rawFormat) {\n            return true;\n        }\n        \n        // If value is all the same character as format pattern (e.g., \"MMMM\" = \"MMMM\")\n        if (rawFormat.length > 0 && value.length === rawFormat.length) {\n            const firstChar = rawFormat[0];\n            if (value.split('').every(char => char === firstChar)) {\n                return true;\n            }\n        }\n        \n        return false;\n    }\n\n    /**\n     * Changes format for selected field (BACKSPACE HANDLER)\n     * This is called from DateTimeInputHandler.handleBackspaceForSelectedField()\n     * Uses DateTimeSelectionService to get selection range from model's selection pattern\n     * \n     * IMPORTANT: Syncs current input value with engine state before handling backspace\n     * This ensures that filled fields (like \"20\" and \"2022\") are preserved\n     */\n    changeFormatForSelectedField(): string {\n        const selectedField = this.model.getSelectedField();\n        if (!selectedField) {\n            return this.getPlaceholder();\n        }\n\n        // CRITICAL: Sync current input value with engine state before backspace\n        // This preserves filled values like \"20\" and \"2022\" when resetting month\n        // For hour, minute, second, and meridian, we need to sync to ensure accurate positions\n        const isTimeField = selectedField === SELECTEDFIELD_NAME.HOUR || \n                           selectedField === SELECTEDFIELD_NAME.MINUTE || \n                           selectedField === SELECTEDFIELD_NAME.SECOND || \n                           selectedField === SELECTEDFIELD_NAME.MERIDIAN;\n        \n        // if (isTimeField && this.element) {\n        //     this.syncInputValueWithEngine();\n        // }\n\n        // Get selection range using DateTimeSelectionService\n        // First try to get from element if available (for partial selections)\n        let selection: SelectionRange | undefined;\n        if (this.element) {\n            const elementSelectionStart = this.element.selectionStart || 0;\n            const elementSelectionEnd = this.element.selectionEnd || 0;\n            \n            // If user has selected text (not just cursor), use element selection\n            if (elementSelectionStart !== elementSelectionEnd) {\n                selection = {\n                    start: elementSelectionStart,\n                    end: elementSelectionEnd,\n                };\n            } else {\n                // For hour, minute, second, and meridian, use engine token positions\n                // which are more accurate when custom formats are used\n                if (isTimeField) {\n                    const tokenType = this.mapFieldNameToTokenType(selectedField);\n                    if (tokenType) {\n                        const state = this.engine.getState();\n                        const token = state.tokens.find(t => t.type === tokenType && t.isEditable);\n                        if (token) {\n                            const positioned = this.calculateTokenPositions(state.tokens);\n                            const positionedToken = positioned.find(t => t.id === token.id);\n                            if (positionedToken) {\n                                selection = {\n                                    start: positionedToken.start,\n                                    end: positionedToken.end,\n                                };\n                            }\n                        }\n                    }\n                }\n                \n                // If engine positions not found, fall back to model's selection pattern\n                if (!selection) {\n                    const dateTimeParts = this.model.getSelectionPattern();\n                    const fieldRange = this.getFieldRangeFromPattern(selectedField, dateTimeParts);\n                    if (fieldRange) {\n                        selection = {\n                            start: fieldRange.start,\n                            end: fieldRange.end,\n                        };\n                    }\n                }\n            }\n        } else {\n            // No element, get from model's selection pattern or engine state\n            if (isTimeField) {\n                const tokenType = this.mapFieldNameToTokenType(selectedField);\n                if (tokenType) {\n                    const state = this.engine.getState();\n                    const token = state.tokens.find(t => t.type === tokenType && t.isEditable);\n                    if (token) {\n                        const positioned = this.calculateTokenPositions(state.tokens);\n                        const positionedToken = positioned.find(t => t.id === token.id);\n                        if (positionedToken) {\n                            selection = {\n                                start: positionedToken.start,\n                                end: positionedToken.end,\n                            };\n                        }\n                    }\n                }\n            }\n            \n            // Fall back to model's selection pattern if engine positions not found\n            if (!selection) {\n                const dateTimeParts = this.model.getSelectionPattern();\n                const fieldRange = this.getFieldRangeFromPattern(selectedField, dateTimeParts);\n                if (fieldRange) {\n                    selection = {\n                        start: fieldRange.start,\n                        end: fieldRange.end,\n                    };\n                }\n            }\n        }\n\n        // Map field name to token type\n        const tokenType = this.mapFieldNameToTokenType(selectedField);\n        if (!tokenType) {\n            return this.getPlaceholder();\n        }\n\n        // Create backspace event\n        const event: EditEvent = {\n            type: 'backspace',\n            fieldType: tokenType,\n        };\n\n        // ← THIS IS THE CALLBACK FOR BACKSPACE\n        const result = this.engine.handleEvent(event, selection);\n\n        // Update element value directly with the rendered result\n        // This ensures the element shows the correct value immediately\n        // Set flag to skip sync in getPlaceholder() since we just updated the element\n        // if (this.element) {\n        //     this.element.value = result.renderedValue;\n        //     this.skipSyncOnGetPlaceholder = true;\n        // }\n\n        // Update model state\n        if (selectedField === SELECTEDFIELD_NAME.MONTH) {\n            this.model.setMonthChanged(false);\n        }\n\n        // Update model\n        // this.model.setActivatePlaceholder(true);\n        this.model.setSelectedDate(null);\n\n        // Dispatch events\n        this.dispatchEvent({ type: 'EVENT_VALUE_UPDATE' });\n        this.dispatchEvent({ type: DATE_TIME_CUSTOM_EVENTS.CLEAR_VALUE_IN_PICKER });\n        this.optionsHandler.onChange({\n            event: {},\n            source: \"ui\",\n            type: \"onChange\",\n            value: null\n        });\n\n        return result.renderedValue;\n    }\n\n    /**\n     * Checks if month has changed\n     */\n    hasMonthchanged(): boolean {\n        return !!this.lastMonth;\n    }\n\n    /**\n     * Sets input element (for selection tracking)\n     */\n    setInputElement(element: HTMLInputElement): void {\n        this.element = element;\n    }\n\n    /**\n     * Maps field name to token type\n     */\n    private mapFieldNameToTokenType(fieldName: string): TokenType | null {\n        const mapping: Record<string, TokenType> = {\n            [SELECTEDFIELD_NAME.DATE]: 'day',\n            [SELECTEDFIELD_NAME.MONTH]: 'month',\n            [SELECTEDFIELD_NAME.YEAR]: 'year',\n            [SELECTEDFIELD_NAME.HOUR]: 'hour',\n            [SELECTEDFIELD_NAME.MINUTE]: 'minute',\n            [SELECTEDFIELD_NAME.SECOND]: 'second',\n            [SELECTEDFIELD_NAME.MILLISECOND]: 'millisecond',\n            [SELECTEDFIELD_NAME.MERIDIAN]: 'meridian',\n        };\n        return mapping[fieldName] || null;\n    }\n\n    /**\n     * Checks if all fields are filled and updates model state\n     */\n    private checkAndUpdateModelState(): void {\n        const state = this.engine.getState();\n        const filledCount = state.tokens.filter(t => t.isEditable && t.isFilled).length;\n        const totalCount = state.tokens.filter(t => t.isEditable).length;\n\n        if (filledCount === totalCount) {\n            const date = this.model.getDateAsDayjsForCurrentDate();\n            this.model.setSelectedDate(date);\n            this.model.setActivatePlaceholder(false);\n        }\n    }\n\n    /**\n     * Gets field range from model's selection pattern\n     * Uses same logic as DateTimeSelectionService.findFieldRange\n     */\n    private getFieldRangeFromPattern(\n        fieldType: string,\n        pattern: any[]\n    ): { start: number; end: number } | null {\n        if (!pattern || pattern.length === 0) {\n            return null;\n        }\n\n        for (const part of pattern) {\n            if (fieldType === part.type) {\n                return {\n                    start: part.start,\n                    end: part.end\n                };\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Finds segment for field (for backward compatibility)\n     * Returns positions from engine state\n     */\n    findSegment(type: string): { start: number; end: number } {\n        // First try to get from model's selection pattern (more accurate)\n        const dateTimeParts = this.model.getSelectionPattern();\n        const patternRange = this.getFieldRangeFromPattern(type, dateTimeParts);\n        if (patternRange) {\n            return patternRange;\n        }\n\n        // Fallback to engine state calculation\n        const state = this.engine.getState();\n        const token = state.tokens.find(t => t.type === type);\n        \n        if (!token) {\n            return { start: 0, end: 0 };\n        }\n\n        // Calculate positions\n        const positioned = this.calculateTokenPositions(state.tokens);\n        const positionedToken = positioned.find(t => t.id === token.id);\n        \n        if (positionedToken) {\n            return { start: positionedToken.start, end: positionedToken.end };\n        }\n\n        return { start: 0, end: 0 };\n    }\n\n    /**\n     * Finds segment in placeholder (for backward compatibility)\n     */\n    findSegmentInPlaceholder(type: string): { start: number; end: number } {\n        return this.findSegment(type);\n    }\n\n    /**\n     * Calculates positions for tokens (simplified helper)\n     */\n    private calculateTokenPositions(tokens: ReadonlyArray<PlaceholderToken>): Array<PlaceholderToken & { start: number; end: number }> {\n        const positioned: Array<PlaceholderToken & { start: number; end: number }> = [];\n        let currentPos = 0;\n\n        for (const token of tokens) {\n            const start = currentPos;\n            const end = start + token.displayValue.length;\n\n            positioned.push({\n                ...token,\n                start,\n                end,\n            });\n\n            currentPos = end;\n        }\n\n        return positioned;\n    }\n}\n","/**\n * Format Provider Adapter\n * Adapts DateTimeModel to FormatProvider interface\n * Enables decoupling from model\n */\n\nimport {\n  FormatProvider,\n  TokenType,\n} from '../types';\n\n/**\n * Adapter that wraps DateTimeModel and DateTimeOptionHandler\n * Implements FormatProvider interface\n */\nexport class DateTimeFormatProviderAdapter implements FormatProvider {\n  constructor(\n    private model: any, // DateTimeModel - typed as any to avoid circular dependency\n    private optionsHandler: any // DateTimeOptionHandlerType\n  ) {}\n\n  getFormat(): string {\n    return this.model.getFormat();\n  }\n\n  getFieldFormat(fieldType: TokenType): string {\n    const formatMap = this.model.getFormatMap();\n    const customFormats = this.optionsHandler.getCustomFormats();\n    \n    // Check for custom format first\n    const customFormat = customFormats?.[fieldType];\n    if (customFormat) {\n      return customFormat;\n    }\n    \n    // Use default format from formatMap\n    return formatMap[fieldType as keyof typeof formatMap] || fieldType.toUpperCase();\n  }\n\n  getFieldValue(fieldType: TokenType): string {\n    const currentDateTime = this.model.getDateAsDayjsForCurrentDate();\n    \n    if (currentDateTime) {\n      const formatPattern = this.getFieldFormat(fieldType);\n      if (formatPattern) {\n        return currentDateTime.format(formatPattern);\n      }\n    }\n    \n    // Fallback to model methods\n    return this.getFieldValueFromModel(fieldType);\n  }\n\n  getDefaultValue(fieldType: TokenType, format: string): string {\n    // Check if there's a custom format for this field\n    const customFormats = this.optionsHandler.getCustomFormats();\n    if (customFormats && customFormats[fieldType]) {\n      // Return custom format if available\n      return customFormats[fieldType];\n    }\n    \n    // Return format pattern as default\n    return format;\n  }\n\n  private getFieldValueFromModel(fieldType: TokenType): string {\n    const fieldMap: Record<string, () => string> = {\n      date: () => this.model.getCurrentDate(),\n      day: () => this.model.getCurrentDate(),\n      month: () => this.model.getCurrentMonth(),\n      year: () => this.model.getCurrentYear(),\n      hour: () => this.model.getCurrentHour(),\n      minute: () => this.model.getCurrentMinute(),\n      second: () => this.model.getCurrentSecond(),\n      meridian: () => this.model.getCurrentMeridian(),\n    };\n\n    const getter = fieldMap[fieldType];\n    return getter ? getter() : '';\n  }\n}\n","/**\n * Simplified Placeholder Engine\n * All logic in one file - easy to understand and maintain\n */\n\nimport {\n  PlaceholderToken,\n  TokenType,\n  SelectionRange,\n  EditEvent,\n  FormatProvider,\n  EngineResult,\n} from './types';\n\nimport { ICustomFormat } from '../../../date-time-configuration.types';\n\n/**\n * Field pattern detection map\n */\nconst FIELD_PATTERNS: Record<string, TokenType> = {\n  'M': 'month',\n  'D': 'day',\n  'd': 'day',\n  'Y': 'year',\n  'y': 'year',\n  'H': 'hour',\n  'h': 'hour',\n  'm': 'minute',\n  's': 'second',\n  'S': 'millisecond',\n  'A': 'meridian',\n};\n\nconst SEPARATOR_CHARS = ['/', '-', '.', ',', ':', ' '];\n\n/**\n * Simple Placeholder Engine\n * Manages placeholder tokens and handles edit events\n */\nexport class PlaceholderEngine {\n  private tokens: PlaceholderToken[] = [];\n  private formatProvider: FormatProvider;\n  private tokenIdCounter = 0;\n  private baseFormat: string;\n  private displayFormat: ICustomFormat | string | undefined;\n\n  constructor(formatProvider: FormatProvider, baseFormat: string, displayFormat?: ICustomFormat) {\n    this.formatProvider = formatProvider;\n    this.baseFormat = baseFormat || formatProvider.getFormat();\n    this.displayFormat = displayFormat;\n    \n    // Use baseFormat to parse tokens (for correct field identification)\n    // Use displayFormat for display values (for custom formats)\n    this.tokens = this.createTokensFromFormat(this.baseFormat, this.displayFormat);\n  }\n\n  /**\n   * Creates tokens from format string\n   * Uses baseFormat to identify field types and positions\n   * Uses displayFormat (ICustomFormat object) to set display values (for custom formats)\n   * \n   * Example:\n   * baseFormat: \"MMMM DD, YYYY hh:mm A\"\n   * displayFormat: { month: \"Month\", day: \"DD\", year: \"YYYY\", hour: \"HH\", minute: \"mm\", second: \"ss\", meridian: \"tt\", separator: \":\" }\n   * -> [month token with display \"Month\", separator, day token, separator, year token, separator, hour token with display \"HH\", separator, minute token, separator, meridian token with display \"tt\"]\n   */\n  private createTokensFromFormat(baseFormat: string, displayFormat?: ICustomFormat | string): PlaceholderToken[] {\n    // Parse displayFormat string if it's a string to create a field map\n    let displayFieldMap: Map<number, string> | null = null;\n    if (typeof displayFormat === 'string') {\n      const displayFields = this.parseFormatFields(displayFormat);\n      displayFieldMap = new Map<number, string>();\n      displayFields.forEach((field, index) => {\n        displayFieldMap!.set(index, field.segment);\n      });\n    }\n    \n    // Now create tokens using baseFormat structure but displayFormat values\n    const tokens: PlaceholderToken[] = [];\n    const baseChars = baseFormat.split('');\n    let baseIndex = 0;\n    let fieldIndex = 0; // Track field position for string displayFormat\n    let separatorIndex = 0; // Track separator position for ICustomFormat\n\n    while (baseIndex < baseChars.length) {\n      const char = baseChars[baseIndex];\n\n      // Check if this starts a field pattern (M, D, Y, H, h, m, s, S, A, etc.)\n      const fieldType = FIELD_PATTERNS[char];\n      if (fieldType) {\n        // Extract the pattern from baseFormat (e.g., \"MMMM\", \"DD\", \"YYYY\", \"mm\", \"HH\", \"ss\")\n        const basePattern = this.extractPattern(baseChars, baseIndex, char);\n        \n        // Get display segment from displayFormat\n        const displaySegment = this.getDisplayValueForField(\n          fieldType,\n          displayFormat,\n          basePattern,\n          displayFieldMap,\n          fieldIndex\n        );\n        \n        // Create field token with displayFormat segment\n        const token: PlaceholderToken = {\n          id: this.generateTokenId(),\n          type: fieldType,\n          rawFormat: displaySegment, // Use displayFormat for display\n          displayValue: displaySegment, // Start with display format as placeholder\n          isFilled: false,\n          isEditable: true,\n        };\n        tokens.push(token);\n        \n        baseIndex += basePattern.length;\n        fieldIndex++;\n        continue;\n      }\n\n      // Check if separator (including ':' for time fields and ' ' for meridian)\n      if (SEPARATOR_CHARS.includes(char)) {\n        const baseSeparator = this.extractSeparator(baseChars, baseIndex, tokens);\n        \n        // Only create separator token if separator is not empty\n        if (baseSeparator.length > 0) {\n          // Get separator from displayFormat\n          const displaySeparator = this.getDisplaySeparator(displayFormat, separatorIndex, baseSeparator);\n          \n          const token: PlaceholderToken = {\n            id: this.generateTokenId(),\n            type: 'separator',\n            rawFormat: displaySeparator,\n            displayValue: displaySeparator,\n            isFilled: false,\n            isEditable: false,\n          };\n          tokens.push(token);\n          baseIndex += baseSeparator.length;\n          separatorIndex++;\n        } else {\n          // Skip this character as it's part of a multi-character separator already processed\n          baseIndex++;\n        }\n        continue;\n      }\n\n      // Unknown character - skip\n      baseIndex++;\n    }\n\n    return tokens;\n  }\n\n  /**\n   * Gets display value for a field type from displayFormat\n   * If displayFormat is ICustomFormat object, uses the corresponding property\n   * If displayFormat is string, uses the fieldMap to get segment by position\n   * Otherwise, uses basePattern as fallback\n   */\n  private getDisplayValueForField(\n    fieldType: TokenType,\n    displayFormat: ICustomFormat | string | undefined,\n    basePattern: string,\n    displayFieldMap: Map<number, string> | null,\n    fieldIndex: number\n  ): string {\n    // If displayFormat is ICustomFormat object, get value from property\n    if (displayFormat && typeof displayFormat === 'object') {\n      // Map TokenType to ICustomFormat property name\n      const formatMap: Record<TokenType, keyof ICustomFormat> = {\n        month: 'month',\n        day: 'day',\n        year: 'year',\n        hour: 'hour',\n        minute: 'minute',\n        second: 'second',\n        millisecond: 'second', // Use second for millisecond if not available\n        meridian: 'meridian',\n        separator: 'separator',\n      };\n      \n      const propertyName = formatMap[fieldType];\n      if (propertyName && displayFormat[propertyName]) {\n        return displayFormat[propertyName];\n      }\n    }\n    \n    // If displayFormat is string, use fieldMap to get segment by position\n    if (displayFieldMap && displayFieldMap.has(fieldIndex)) {\n      return displayFieldMap.get(fieldIndex)!;\n    }\n    \n    // Fallback to basePattern\n    return basePattern;\n  }\n\n  /**\n   * Gets separator from displayFormat\n   * If displayFormat is ICustomFormat, uses separator property\n   * If displayFormat is string, extracts from that position\n   * Otherwise, uses baseSeparator\n   */\n  private getDisplaySeparator(\n    displayFormat: ICustomFormat | string | undefined,\n    separatorIndex: number,\n    baseSeparator: string\n  ): string {\n    // If displayFormat is ICustomFormat object, use separator property\n    if (displayFormat && typeof displayFormat === 'object' && displayFormat.separator) {\n      return displayFormat.separator;\n    }\n    \n    // If displayFormat is string, extract separator from that position\n    if (typeof displayFormat === 'string') {\n      const separator = this.getDisplaySeparatorFromString(displayFormat, separatorIndex);\n      if (separator) {\n        return separator;\n      }\n    }\n    \n    // Fallback to baseSeparator\n    return baseSeparator;\n  }\n\n  /**\n   * Gets separator from displayFormat string at the given separator position\n   */\n  private getDisplaySeparatorFromString(displayFormat: string, separatorPosition: number): string | null {\n    const chars = displayFormat.split('');\n    let i = 0;\n    let currentSeparatorPos = 0;\n\n    while (i < chars.length && currentSeparatorPos <= separatorPosition) {\n      const char = chars[i];\n      const fieldType = FIELD_PATTERNS[char];\n      \n      if (fieldType) {\n        const pattern = this.extractPattern(chars, i, char);\n        i += pattern.length;\n        continue;\n      }\n      \n      if (SEPARATOR_CHARS.includes(char)) {\n        if (currentSeparatorPos === separatorPosition) {\n          // This is the separator we're looking for\n          const separator = this.extractSeparator(chars, i, []);\n          return separator.length > 0 ? separator : null;\n        }\n        const separator = this.extractSeparator(chars, i, []);\n        i += separator.length > 0 ? separator.length : 1;\n        currentSeparatorPos++;\n        continue;\n      }\n      \n      i++;\n    }\n\n    return null;\n  }\n\n  /**\n   * Parses format string to extract field information\n   * Returns array of { type, segment, index } for each field\n   */\n  private parseFormatFields(format: string): Array<{ type: TokenType; segment: string; index: number }> {\n    const fields: Array<{ type: TokenType; segment: string; index: number }> = [];\n    const chars = format.split('');\n    let i = 0;\n    let fieldIndex = 0;\n\n    while (i < chars.length) {\n      const char = chars[i];\n      const fieldType = FIELD_PATTERNS[char];\n      \n      if (fieldType) {\n        const pattern = this.extractPattern(chars, i, char);\n        fields.push({\n          type: fieldType,\n          segment: pattern,\n          index: fieldIndex++,\n        });\n        i += pattern.length;\n        continue;\n      }\n      \n      if (SEPARATOR_CHARS.includes(char)) {\n        const separator = this.extractSeparator(chars, i, []);\n        i += separator.length > 0 ? separator.length : 1;\n        continue;\n      }\n      \n      i++;\n    }\n\n    return fields;\n  }\n\n\n  /**\n   * Extracts field pattern (e.g., \"MMMM\", \"DD\", \"YYYY\")\n   */\n  private extractPattern(chars: string[], startIndex: number, patternChar: string): string {\n    let length = 1;\n    let i = startIndex + 1;\n\n    while (i < chars.length && chars[i] === patternChar) {\n      length++;\n      i++;\n    }\n\n    return patternChar.repeat(length);\n  }\n\n  /**\n   * Extracts separator (handles multi-character separators like \", \")\n   * Properly handles separators for time fields (hour, minute, second, meridian)\n   * \n   * @param chars - Array of characters from format string\n   * @param startIndex - Current index in chars array\n   * @param tokens - Already created tokens (to check if previous token was a comma)\n   * @returns Separator string, or empty string if already handled\n   */\n  private extractSeparator(chars: string[], startIndex: number, tokens: PlaceholderToken[]): string {\n    const char = chars[startIndex];\n    \n    // Handle multi-character separator \", \" (comma followed by space)\n    if (char === ',' && startIndex + 1 < chars.length && chars[startIndex + 1] === ' ') {\n      return ', ';\n    }\n    \n    // If this is a space, check if it's part of a \", \" separator that was already processed\n    if (char === ' ' && startIndex > 0) {\n      const prevChar = chars[startIndex - 1];\n      // If previous character was comma, check if last token is \", \" separator\n      if (prevChar === ',') {\n        const lastToken = tokens.length > 0 ? tokens[tokens.length - 1] : null;\n        // If last token is \", \" separator, this space is already part of it\n        if (lastToken && lastToken.type === 'separator' && lastToken.rawFormat === ', ') {\n          return ''; // Already handled as part of \", \"\n        }\n      }\n    }\n    \n    // For all other separators (including ':' for time fields and ' ' for meridian),\n    // return the character as separator\n    // This ensures \":\" between hour:minute:second and \" \" before meridian are properly handled\n    return char;\n  }\n\n  /**\n   * Generates unique token ID\n   */\n  private generateTokenId(): string {\n    return `token-${++this.tokenIdCounter}-${Date.now()}`;\n  }\n\n  /**\n   * Handles edit event and returns result\n   */\n  handleEvent(event: EditEvent, selection?: SelectionRange): EngineResult {\n    switch (event.type) {\n      case 'fieldFilled':\n        if (event.fieldType && event.value) {\n          this.fillField(event.fieldType, event.value);\n        }\n        break;\n\n      case 'fieldCleared':\n        if (event.fieldType) {\n          this.clearField(event.fieldType);\n        }\n        break;\n\n      case 'backspace':\n        this.handleBackspace(event.fieldType, selection);\n        break;\n\n      case 'delete':\n        this.handleDelete(event.fieldType, selection);\n        break;\n\n      case 'selectAll':\n        this.resetAllFields();\n        break;\n\n      case 'reset':\n        this.resetAllFields();\n        break;\n    }\n\n    return {\n      renderedValue: this.render(),\n      cursorPosition: this.calculateCursorPosition(event.fieldType),\n    };\n  }\n\n  /**\n   * Fills a field with a value\n   */\n  private fillField(fieldType: TokenType, value: string): void {\n    const token = this.tokens.find(t => t.type === fieldType && t.isEditable);\n    if (token) {\n      const index = this.tokens.indexOf(token);\n      this.tokens[index] = {\n        ...token,\n        displayValue: value,\n        isFilled: true,\n      };\n    }\n  }\n\n  /**\n   * Clears a field (resets to placeholder format)\n   */\n  private clearField(fieldType: TokenType): void {\n    const token = this.tokens.find(t => t.type === fieldType && t.isEditable);\n    if (token) {\n      const index = this.tokens.indexOf(token);\n      this.tokens[index] = {\n        ...token,\n        displayValue: token.rawFormat,\n        isFilled: false,\n      };\n    }\n  }\n\n  /**\n   * Handles backspace keypress\n   */\n  private handleBackspace(fieldType: TokenType | undefined, selection?: SelectionRange): void {\n    // If selection is provided and covers all text, reset all\n    if (selection && this.isAllSelected(selection)) {\n      this.resetAllFields();\n      return;\n    }\n\n    // If field type is provided, clear that field\n    if (fieldType) {\n      this.clearField(fieldType);\n    }\n  }\n\n  /**\n   * Handles delete keypress (same as backspace)\n   */\n  private handleDelete(fieldType: TokenType | undefined, selection?: SelectionRange): void {\n    this.handleBackspace(fieldType, selection);\n  }\n\n  /**\n   * Resets all editable fields to placeholder format\n   */\n  private resetAllFields(): void {\n    this.tokens = this.tokens.map(token => {\n      if (token.isEditable) {\n        return {\n          ...token,\n          displayValue: token.rawFormat,\n          isFilled: false,\n        };\n      }\n      return token;\n    });\n  }\n\n  /**\n   * Checks if selection covers all text\n   */\n  private isAllSelected(selection: SelectionRange): boolean {\n    const totalLength = this.render().length;\n    return selection.start === 0 && selection.end === totalLength && totalLength > 0;\n  }\n\n  /**\n   * Calculates cursor position for a field\n   */\n  private calculateCursorPosition(fieldType: TokenType | undefined): number | undefined {\n    if (!fieldType) return undefined;\n\n    const positioned = this.calculatePositions();\n    const token = positioned.find(t => t.type === fieldType);\n    return token ? token.start : undefined;\n  }\n\n  /**\n   * Calculates positions for all tokens\n   */\n  private calculatePositions(): Array<PlaceholderToken & { start: number; end: number }> {\n    const positioned: Array<PlaceholderToken & { start: number; end: number }> = [];\n    let currentPos = 0;\n\n    for (const token of this.tokens) {\n      const start = currentPos;\n      const end = start + token.displayValue.length;\n\n      positioned.push({\n        ...token,\n        start,\n        end,\n      });\n\n      currentPos = end;\n    }\n\n    return positioned;\n  }\n\n  /**\n   * Renders tokens to string\n   */\n  render(): string {\n    return this.tokens\n      .map(token => token.displayValue ?? token.rawFormat ?? '')\n      .join('');\n  }\n\n  /**\n   * Gets current tokens\n   */\n  getTokens(): ReadonlyArray<PlaceholderToken> {\n    return this.tokens;\n  }\n\n  /**\n   * Gets current state info\n   */\n  getState() {\n    const editableTokens = this.tokens.filter(t => t.isEditable);\n    const filledCount = editableTokens.filter(t => t.isFilled).length;\n    const totalCount = editableTokens.length;\n\n    return {\n      tokens: this.tokens,\n      filledCount,\n      totalCount,\n      isComplete: filledCount === totalCount && totalCount > 0,\n    };\n  }\n\n  /**\n   * Resets to initial format\n   */\n  reset(baseFormat?: string, displayFormat?: ICustomFormat): void {\n    const base = baseFormat || this.baseFormat || this.formatProvider.getFormat();\n    const display = displayFormat !== undefined ? displayFormat : this.displayFormat;\n    this.baseFormat = base;\n    this.displayFormat = display;\n    this.tokens = this.createTokensFromFormat(base, display);\n  }\n}\n","import { BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { CorePopupHandler } from \"../../../../utility/PopupHandler/CorePopupHandler\";\n\n@Bean(BEAN_NAME.POPUP_HANDLER)\nexport class PopupHandler extends CorePopupHandler {\n   \n}","import { Button } from \"../../../../button/src/button\";\nimport { IButtonConfiguration } from \"../../../../button/src/button-configuration.types\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\n\nexport class ButtonRenderer implements ICustomRenderer{\n    private params : any;\n    private button !: Button|null;\n    \n    init(params : any) {\n        this.params = params;\n        const configuration = this.createConfiguration();\n        this.button = new Button(configuration);\n    }\n\n    getElement(): HTMLElement {\n        return this.button?.api?.getElement() as HTMLElement;\n    }\n\n    private createConfiguration() : IButtonConfiguration {\n        return {\n            text    : this.params.label,\n            callback: this.params.callback,\n            icon    : this.params.icon,\n            showIcon: this.params.showIcon,\n            showText: this.params.showText,\n            disabled: this.params.disabled,\n            readonly : this.params.readonly,\n            ariaLabel : this.params.ariaLabel,\n            classes : this.params.classes,\n            getSvgClasses : this.params.getSvgClasses\n        }\n    }\n\n    destroy() : void {\n        this.button?.api?.destroy();\n        this.button = null;\n        this.params = null;\n    }\n}\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IUserParams } from \"../../utility/user-params.types\";\nimport { DateTimeConfiguration } from \"./date-time-configuration.types\";\nimport { ComponentsRegistry, ComponentMeta } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { DateTimeUserComponentHandler } from \"./core/model/date-time-user-component-handler\";\nimport { DateTimeApi } from \"./core/model/date-time-api\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { BEAN_NAME, traverseObject } from \"@dg/corecomponent\";\nimport { Label } from \"../../label/label-view\";\nimport { DescriptionComponent } from \"../../description/description-view\";\nimport { SpinButtonComponent } from \"./core/date-time-spin-button/spin-button-view\";\nimport { DateTimeInputComponent } from \"./core/date-time-input/date-time-input-view\";\nimport { DateTimeOptionHandler } from \"./core/model/date-time-options-handler\";\nimport { DateTimeStateManager } from \"./core/model/date-time-state-manager\";\nimport { DateTimeControllerHandler } from \"./core/model/date-time-controller\";\nimport { DateTimeModel } from \"./core/model/date-time-model\";\nimport { DateTimeButtonComponent } from \"./core/date-time-button/date-time-button-view\";\nimport { ButtonRenderer } from \"./core/user-component/buttonRenderer\";\nimport { DateTimeEventHandler } from \"./core/model/date-time-event-handler\";\nimport { DateTimeKeyBoardShortCuts } from \"./core/model/date-time-keyboard-shorcuts\";\nimport { DateTimeInputHandler } from \"./core/model/date-time-input-handler\";\nimport { CalendarIconView } from \"./core/calendar-icon/calendar-icon-view\";\nimport { PopupHandler } from \"./core/model/popup-handler\";\nimport { DateTimePickerStateManager } from \"./core/model/date-picker-state-manager\";\nimport { DateTimeReadonlyInputComponent } from \"./core/date-time-readonly-input/date-time-readonly-input-view\";\nimport { CalendarIconReadOnlyView } from \"./core/calendar-icon-readonly/calendar-icon-view\";\n// import { DateTimePlaceholderManager } from \"./core/model/date-time-placeholder-hanlder\";\nimport { DateTimePlaceholderManagerIntegration } from \"./core/model/placeholder-engine-integration\";\nimport { DateTimeSelectionService } from \"./core/model/date-time-selection-service\";\nimport { DatePickerInteractor } from \"./core/model/date-picker-interacter\";\nimport { ErrorComponent } from \"../../error/error-view\";\n\n\nlet nextInstanceId = 1;\n\n\nexport class DateTimeCoreComponent {\n\tinitialize( configuration: DateTimeConfiguration, params: IUserParams = {}, createUI: CallableFunction): void {\n\t\t\n\t\tconst instanceID = configuration.instanceID ?? String(nextInstanceId++);\n\n\t\tconst beanClasses = this.CreateBeanClasses();\n\n\t\tconst context = new Context();\n\n\t\tconst userConfigurations = this.createuserConfiguration(\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t\tinstanceID\n\t\t);\n\n        // Model classes\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n        // Default component registry\n\t\tthis.registerCoreComponent(context);\n        // Default user compoent registry\n\t\tthis.registerDefaultUserComponent(context);\n\t\tcreateUI(context);\n\n\t\t(window as any).context = context;\n\t}\n\n\tprivate CreateBeanClasses(): Set<any> {\n\t\tlet beanList = [\n            DateTimeApi,\n            DateTimeOptionHandler,\n            DateTimeUserComponentHandler,\n\n\t\t\tComponentsRegistry,\n\n\t\t\tUserComponentRegistry,\n\t\t\tComponentMetadataProvider,\n\t\t\tEventHandler,\n            DateTimeStateManager,\n            DateTimeControllerHandler,\n            DateTimeModel,\n            DateTimeEventHandler,\n            DateTimeKeyBoardShortCuts,\n\t\t\tDateTimeInputHandler,\n\t\t\tPopupHandler,\n\t\t\tDateTimePickerStateManager,\n\t\t\t// DateTimePlaceholderManager,\n\t\t\tDatePickerInteractor,\n\t\t\tDateTimePlaceholderManagerIntegration,\n\t\t\tDateTimeSelectionService\n\n            \n\t\t];\n\t\treturn new Set(beanList);\n\t}\n\n\tprivate createuserConfiguration( configuration: any, params: IUserParams, instanceID : string): {\n\t\tconfiguration: any;\n\t\tframeWorkOverrides: IFrameworkOverrides | null;\n\t\tglobalEventListener: Function | null;\n\t\tframeworkComponentWrapper: any | null;\n\t\tinstanceID : string;\n\t} {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n\n\tprivate registerDefaultUserComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n            buttonRenderer : ButtonRenderer\n\n        };\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n\n\n\tprivate registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nexport function createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n        {\n\t\t\tcomponentName: 'date-time-helper-text',\n\t\t\tcomponentClass: DescriptionComponent,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'date-time-label',\n\t\t\tcomponentClass: Label,\n\t\t},\n        {\n\t\t\tcomponentName: 'date-time-spin-button',\n\t\t\tcomponentClass: SpinButtonComponent,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'date-time-input',\n\t\t\tcomponentClass: DateTimeInputComponent,\n\t\t},\n        {\n\t\t\tcomponentName: 'date-time-increment',\n\t\t\tcomponentClass: DateTimeButtonComponent,\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'date-time-decrement',\n\t\t\tcomponentClass: DateTimeButtonComponent,\n\t\t},\n\t\t{\n            componentName :'date-picker-icon',\n            componentClass : CalendarIconView\n        },\n\t\t{\n            componentName :'date-time-readonly-input',\n            componentClass : DateTimeReadonlyInputComponent\n        },\n\t\t{\n\t\t\tcomponentName : 'date-picker-icon-readonly',\n\t\t\tcomponentClass : CalendarIconReadOnlyView\n\t\t},\n\t\t{\n\t\t\tcomponentName : 'date-error',\n\t\t\tcomponentClass : ErrorComponent\n\t\t}\n\t\t\n    ];\n\n\treturn components;\n}\n\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { DateTimeApiType} from \"./core/model/date-time-api.type\";\nimport { DateTimeConfiguration } from \"./date-time-configuration.types\";\nimport { DATETIME_BEAN_NAME } from \"./constant/bean-name-constant\";\nimport { IUserParams } from \"../../utility/user-params.types\";\nimport { DateTimeCoreComponent } from \"./date-time-core-component\";\nimport { DateTimeRootView } from \"./core/date-time-root/date-time-root-view\";\nimport { DateTimeReadonlyRootView } from \"./core/date-time-readonly-root/date-time-readonly-root-view\";\n\n\nexport class DateTime {\n\tpublic api: DateTimeApiType | undefined;\n\tconstructor(configuration: DateTimeConfiguration, params?: IUserParams) {\n\t\tconst createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(DATETIME_BEAN_NAME.DATETIME_API) as DateTimeApiType;\n            context.createBean(new DateTimeRootView(configuration.appendTo));\n\t\t};\n\t\tnew DateTimeCoreComponent().initialize(configuration, params, createUI);\n\t}\n}\nexport class DateTimeReadonlyComponent {\n\tpublic static formatDate(timestamp: number | Date, format: string): string {\n  \t\tconst date: Date = typeof timestamp === 'number' ? new Date(timestamp) : timestamp;\n\n\t\tconst year = date.getFullYear();\n\t\tconst month = date.getMonth();\n\t\tconst day = date.getDate();\n\t\tconst hours = date.getHours();\n\t\tconst minutes = date.getMinutes();\n\t\tconst seconds = date.getSeconds();\n\n\t\tconst pad = (n: number): string => n.toString().padStart(2, '0');\n\n\t\tconst monthNames: string[] = [\n\t\t\t'January', 'February', 'March', 'April', 'May', 'June',\n\t\t\t'July', 'August', 'September', 'October', 'November', 'December'\n\t\t];\n\n\t\tconst hours12 = hours % 12 === 0 ? 12 : hours % 12;\n\t\tconst ampm = hours < 12 ? 'AM' : 'PM';\n\n\t\tconst tokenMap: Record<string, string> = {\n\t\t\t'MMMM': monthNames[month],\n\t\t\t'YYYY': year.toString(),\n\t\t\t'yyyy': year.toString(),\n\t\t\t'yy': year.toString().slice(-2),\n\t\t\t'MM': pad(month + 1),\n\t\t\t'M': (month + 1).toString(),\n\t\t\t'DD': pad(day),\n\t\t\t'D': day.toString(),\n\t\t\t'HH': pad(hours),\n\t\t\t'H': hours.toString(),\n\t\t\t'hh': pad(hours12),\n\t\t\t'h': hours12.toString(),\n\t\t\t'mm': pad(minutes),\n\t\t\t'm': minutes.toString(),\n\t\t\t'ss': pad(seconds),\n\t\t\t's': seconds.toString(),\n\t\t\t'A': ampm\n\t\t};\n\n\t\treturn format.replace(/MMMM|YYYY|yyyy|yy|MM|M|DD|D|HH|H|hh|h|mm|m|ss|s|A/g, (match: string): string => {\n\t\t\treturn tokenMap[match];\n\t\t});\n\t}\n\n\n\n\n\tpublic api: DateTimeApiType | undefined;\n\tconstructor(configuration: DateTimeConfiguration, params?: IUserParams) {\n\t\tconst createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(DATETIME_BEAN_NAME.DATETIME_API) as DateTimeApiType;\n            context.createBean(new DateTimeReadonlyRootView(configuration.appendTo));\n\t\t};\n\t\tnew DateTimeCoreComponent().initialize(configuration, params, createUI);\n\t}\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./modules/CSSRegistry\";\n\nexport function getDescriptionUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('field__description', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\nexport function getValidationUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('field__validation-message', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\n\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IHelperTextComp, IHelperTextUserComponentHandler } from \"./description-view.types\";\nimport { AutoWired, BEAN_NAME, toggleAttribute } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getDescriptionUtilityClass } from \"./description-classes\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: '',\n\t\t\tmodifiers: [\n\n            ],\n\t\t},\n\t};\n    \n    return composeClasses(slots, getDescriptionUtilityClass);\n\n};\nexport class DescriptionController extends EventEmitter {\n    private component!: IHelperTextComp;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: IHelperTextUserComponentHandler;\n\n    \n    setComp(component : IHelperTextComp) {\n        this.component = component;\n\n        this.setRendererDetails();\n\n        this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_FOCUS_OUT\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_VISIBILITY_CHANGED', (params) => this.addHideClassName(params.description));\n        this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.setRendererDetails.bind(this));\n\n    }\n\n    private addHideClassName(hide : boolean = false) : void {\n        const element  = this.component.getElement();\n        hide != undefined && element.classList.toggle('dg-hide', hide);\n    }\n\n    setRendererDetails() : void {\n\n\n        const classes = useUtilityClasses();\n\n        const componentParams = this.component?.getParams();\n        const descriptionClasses = componentParams?.getDescriptionClasses();\n        descriptionClasses ? (classes.root = classes.root + \" \" + descriptionClasses) : \"\";\n\n        const isInvalid = componentParams?.invalid?.() || false;\n        const invalidText = componentParams?.invalidText?.() || \"\";\n        if (isInvalid && invalidText) {\n            classes.root = classes.root + \" dg-field__validation-message\";\n            const validationMessageClasses = componentParams?.getValidationMessageClasses?.();\n            if (validationMessageClasses) {\n                classes.root = classes.root + \" \" + validationMessageClasses;\n            }\n        }\n\n        this.component.addOrRemoveCSSClass(classes.root, true);\n        \n        const rendererWrapper = this.createHelperTextRendererWrapper();\n        const params          = this.createHelperTextRendererParams();\n        const userDetails     = this.userComponentHandler.getDescriptionRendererDetails(rendererWrapper, params) as IComponentDetails;\n\n        this.component.setRendererDetails(userDetails, params.value);\n\n        this.setAccessibility();\n        \n    }\n\n    private setAccessibility() : void {\n        const element = this.component.getElement();\n\n        toggleAttribute(element, 'id', this.optionsHandler.getAriaDescribedby())\n    }\n\n    private createHelperTextRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionsHandler.getDescriptionRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionsHandler.getDescriptionRendererParams()\n\t\t}\n    }\n\n    private createHelperTextRendererParams() {\n        const componentParams = this.component?.getParams();\n        const isInvalid = componentParams?.invalid?.() || false;\n        const invalidText = componentParams?.invalidText?.() || '';\n        \n        return {\n            value : isInvalid && invalidText ? invalidText : this.optionsHandler.getDescription(),\n            invalid : isInvalid,\n            invalidText : invalidText,\n            helperText : this.optionsHandler.getDescription()\n        }\n    }\n\n    refresh() {\n        this.setRendererDetails();\n    }\n}","import { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { DescriptionController } from \"./description-controller\";\nimport { IHelperTextComp } from \"./description-view.types\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\n\n\nconst descriptionTextTemplate = () => {\n\t// const div = document.createElement(\"div\");\n\t// div.innerHTML = `<div></div>`;\n\t// return div.firstChild as HTMLElement;\n\treturn document.createElement(\"div\");\n}\nexport function loadTemplate(template: string): HTMLElement {\n\tconst tempDiv = document.createElement('div');\n\ttempDiv.innerHTML = (template || '').trim();\n\n\treturn tempDiv.firstChild as HTMLElement;\n}\n\nexport function escapeString(toEscape?: string | null, skipHtmlChars?: boolean): string | null {\n\n\t const escapeMap: { [key: string]: string } = {\n\t\t\t'&': '&amp;',\n\t\t\t'<': '&lt;',\n\t\t\t'>': '&gt;',\n\t\t\t'\"': '&quot;',\n\t\t\t\"'\": '&#39;', \n\t\t};\n\n    if (toEscape == null) {\n        return null;\n    }\n\n    const stringResult = toEscape.toString().toString();\n\n    if (skipHtmlChars) {\n\t\treturn stringResult;\n\t}\n\n    return stringResult.replace(/[&<>\"']/g, (chr) => escapeMap[chr]);\n}\nexport class DescriptionComponent extends Component {\n\n\tprivate renderer       : any;\n\tprivate rendererElement: any;\n\tprivate params : any;\n\n\tconstructor(params: any){\n\t\tsuper();\n        this.params = params;\n\t}\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst template = descriptionTextTemplate();\n\t\tthis.setTemplate(template);\n\n\t\tconst comp: IHelperTextComp = {\n\t\t\tsetRendererDetails: (rendererDetails: IComponentDetails, value ?: string) => this.setRendererDetails(rendererDetails , value),\n\t\t\taddOrRemoveCSSClass : (className : string, addOrRemove : boolean) => this.addOrRemoveCssClass(className, addOrRemove),\n\t\t\tgetElement : () => this.getGui(),\n\t\t\tgetParams : () => this.params\n\t\t};\n\n\t\tconst controller = this.createBean(new DescriptionController());\n\t\tcontroller.setComp(comp);\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className\n\t}\n\n\n\tprivate setRendererDetails(rendererDetails: IComponentDetails, value ?: string): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tif(value != undefined){\n\t\t\t\tthis.insertValueWithoutCellRenderer(value)\n\t\t\t}else if(value === null){\n\t\t\t\tthis.insertValueWithoutCellRenderer('')\n\n\n\t\t\t}\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer(value : string) {\n\t\tconst parentElement = this.getGui();\n        clearElement(parentElement);\n\n        // const escapedValue = value != null ? escapeString(value) : null;\n        if (value != null) {\n            parentElement.textContent = value;\n        }\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n}\n","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\n// import { SelectUserComponentHandler, PropertyName } from \"./model/select-user-component-handler\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\n// import { SelectAPI } from \"./model/select-api\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { BEAN_NAME, traverseObject } from \"@dg/corecomponent\";\nimport { DropdownContainerComponent } from \"./src/core/dropdown-container/dropdownContainer-view\";\nimport { IUserParams } from \"../utility/user-params.types\";\nimport { dropdownController } from \"./src/core/model/dropdown-handler\";\nimport { DropdownAPI } from \"./src/core/model/dropdown-api\";\nimport { DropdownDataPart } from \"./src/core/model/dropdown-ds\";\nimport { SelectDropdownOptionComponent } from \"./src/core/dropdown-option/dropdown-option-view\";\nimport { DropDownOptionHandler } from \"./src/core/model/dropdown-option-handler\";\nimport { SearchComponent } from \"./src/core/dropdown-search/dropdown-search-view\";\nimport { DropdownComponent } from \"./src/core/dropdown/dropdown-view\";\nimport { SelectAllComponent } from \"./src/core/dropdown-selectAll/dropdown-selectAll-view\";\nimport { IDropdownConfiguration } from \"./dropdown_configuration\";\nimport { DropdownUserComponentHandler } from \"./src/core/model/dropdown-user-component-handler\";\n// import { DropdownCreateNewOptionController } from \"./src/core/dropdown-create-newoption/dropdown-create-newoption-controller\";\nimport { DropdownCreateNewOptionComponent } from \"./src/core/dropdown-create-newoption/dropdown-create-newoption-view\";\nimport { DropdownBodyContainerComponent } from \"./src/core/dropdown-body-container/dropdownBodyContainer-view\";\nimport { DropdownHeaderContainerComponent } from \"./src/core/dropdown-Header-container/dropdownHeaderContainer-view\";\nimport { DropdownFooterContainerComponent } from \"./src/core/dropdown-Footer-container/dropdownFooterContainer-view\";\nimport { DropdownNoOptionComponent } from \"./src/core/dropdown-no-option/dropdown-no-option-view\";\nimport { DropdownLoadingView } from \"./src/core/dropdown-loading/dropdown-loading-view\";\nimport { LoadingOptionRenderer } from \"../List/src/renderer/loading-option-renderer\";\n\nlet nextInstanceId = 1;\n\nexport class SelectDropdownCoreComponent {\n    initializeSelect(configuration: IDropdownConfiguration, params: IUserParams = {}, createUI: CallableFunction): void {\n        const instanceID = String(nextInstanceId++);\n\n        const beanClasses = this.CreateBeanClasses();\n\n        const context = new Context();\n\n        const userConfigurations = this.createUserConfiguration(\n            configuration,\n            params,\n            instanceID\n        );\n\n        // Model classes\n        context.registerBeanClasses(beanClasses, userConfigurations);\n        // Default component registry\n        this.registerCoreComponent(context);\n        // Default user component registry\n        this.registerDefaultUserComponent(context);\n        createUI(context);\n\n        (window as any).context = context;\n    }\n\n    private CreateBeanClasses(): Set<any> {\n        let beanList = [\n            DropDownOptionHandler,\n            DropdownUserComponentHandler,\n            DropdownAPI,\n            DropdownDataPart,\n            dropdownController,\n            ComponentsRegistry,\n            UserComponentRegistry,\n            ComponentMetadataProvider,\n            EventHandler\n        ];\n        return new Set(beanList);\n    }\n\n    private createUserConfiguration(configuration: any, params: IUserParams, instanceID: string): {\n        configuration: any;\n        frameWorkOverrides: IFrameworkOverrides | null;\n        globalEventListener: Function | null;\n        frameworkComponentWrapper: any | null;\n        instanceID: string;\n    } {\n        let frameWorkOverrides = params.frameworkOverrides ?? null;\n        if (!frameWorkOverrides) {\n            frameWorkOverrides = new VanillaFrameWorkOverrider();\n        }\n        return {\n            configuration,\n            frameWorkOverrides,\n            instanceID,\n            frameworkComponentWrapper: params.frameworkComponentWrapper,\n            globalEventListener: params.globalEventListener ?? null,\n        };\n    }\n\n    private registerDefaultUserComponent(context: Context): void {\n        const userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n        const defaultComponent = {\n            // [PropertyName.REMOVE_SELECT_RENDERER]: SelectIconRenderer,\n            // [PropertyName.LABEL_SELECT_RENDERER]: SelectIconRenderer\n            'loadingRenderer': LoadingOptionRenderer,\n        };\n\n        traverseObject(defaultComponent, (name: string, component: any) => {\n            userComponentRegistry.registerDefaultComponent(name, component);\n        });\n    }\n\n    private registerCoreComponent(context: Context): void {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nexport function createComponentList(): ComponentMeta[] {\n    let components: ComponentMeta[] = [\n        {\n            componentName: 'select-dropdown',\n            componentClass: DropdownContainerComponent,\n        },\n        {\n            componentName: 'select-option',\n            componentClass: SelectDropdownOptionComponent,\n        },\n        {\n            componentName: 'dropdown-search',\n            componentClass: SearchComponent,\n        },\n        {\n            componentName: 'dropdown',\n            componentClass: DropdownComponent,\n        },\n        {\n            componentName: 'select-all',\n            componentClass: SelectAllComponent,\n        },\n        {\n            componentName: 'dropdown-create-newoption',\n            componentClass: DropdownCreateNewOptionComponent,\n        },\n        {\n            componentName : 'dropdown-body-container',\n            componentClass : DropdownBodyContainerComponent,\n        },\n        {\n            componentName : 'dropdown-header-container',\n            componentClass : DropdownHeaderContainerComponent,\n        },\n        {\n            componentName : 'dropdown-footer-container',\n            componentClass : DropdownFooterContainerComponent,\n        },\n        {\n            componentName : 'dropdown-no-option',\n            componentClass : DropdownNoOptionComponent,\n        },\n        {\n            componentName : 'dropdown-loading',\n            componentClass : DropdownLoadingView\n        }\n    ];\n\n    return components;\n}\n\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IUserParams } from \"../utility/user-params.types\";\nimport { SelectDropdownCoreComponent } from \"./dropdown-core\";\nimport { SelectDropdownRootComponent } from \"./src/core/dropdown-root/dropdown-root-view\";\nimport { IDropdownAPI } from \"./src/core/model/dropdown-api\";\nimport { IDropdownConfiguration } from \"./dropdown_configuration\";\nimport { DROPDOWN_DROPDWON_BEAN_NAME } from \"./src/constants/beanname-constant\";\n\nexport class SelectDropdown {\n  public api!: IDropdownAPI;\n  constructor(configuration: IDropdownConfiguration, params?: IUserParams) {\n    const createUI = (context: Context) => {\n      this.api = context.getBean(DROPDOWN_DROPDWON_BEAN_NAME.DROPDOWN_API) as IDropdownAPI;\n      context.createBean(new SelectDropdownRootComponent(configuration.dropdownAppendTo));\n    };\n    new SelectDropdownCoreComponent().initializeSelect(configuration, params, createUI);\n  }\n}\n\n\n(window as any).SelectDropdown = SelectDropdown","\nexport class DefaultSingleSelectChipRenderer{\n    params :any;\n    dom    !: HTMLElement;\n\tinit(params: any): void {\n        this.params = params;\n    }\n\tgetElement(): HTMLElement {\n        const rootDiv = document.createElement(\"div\");\n        rootDiv.classList.add(\n            \"dg-chip__root\",\n            \"dg-chip__root--readonly\",\n            \"dg-chip--filled\",\n            \"dg-chip--default\"\n        );\n        rootDiv.setAttribute(\"tabindex\", \"-1\");\n        rootDiv.setAttribute(\"role\", \"status\");\n        rootDiv.setAttribute(\"aria-disabled\", \"false\");\n        rootDiv.setAttribute(\"aria-readonly\", \"true\");\n    \n        if (this.params?.option?.color) {\n            rootDiv.style.backgroundColor = this.params.option.color;\n        }\n    \n        const labelWrapper = document.createElement(\"div\");\n        labelWrapper.classList.add(\"dg-chip__label-wrapper\");\n        labelWrapper.setAttribute(\"ref\", \"chip-label\");\n    \n        const labelSpan = document.createElement(\"span\");\n        labelSpan.classList.add(\"dg-chip__label\");\n        labelSpan.textContent = this.params?.option?.value || \"\";\n    \n        labelWrapper.appendChild(labelSpan);\n        rootDiv.appendChild(labelWrapper);\n    \n        this.dom = rootDiv;\n        return this.dom;\n    }\n    \n\tdestroy(): void {\n        this.dom.remove();\n    }\n    \n}\n\n\nexport class DefaultMultiSelectChipRenderer{\n    params :any;\n    dom    !: HTMLElement;\n\tinit(params: any): void {\n        this.params = params;\n    }\n\tgetElement(): HTMLElement {\n        const label = document.createElement(\"label\");\n        label.classList.add(\"dg-dropdown__option-label\");\n    \n        // Checkbox Input\n        const checkbox = document.createElement(\"input\");\n        checkbox.setAttribute(\"tabindex\", \"-1\");\n        checkbox.setAttribute(\"type\", \"checkbox\");\n        checkbox.classList.add(\"dg-dropdown__option-checkbox-input\");\n        checkbox.setAttribute(\"role\", \"checkbox\");\n        checkbox.setAttribute(\"aria-disabled\", \"false\");\n        checkbox.setAttribute(\"aria-checked\", \"true\");\n        checkbox.setAttribute(\"aria-label\", \"checkbox\");\n    \n        // Custom Checkbox Styling Span\n        const customCheckbox = document.createElement(\"span\");\n        customCheckbox.classList.add(\"dg-dropdown__option-checkbox-input--custom\");\n        customCheckbox.style.setProperty(\"--checked-border-color\", \"black\");\n        customCheckbox.style.setProperty(\"--checked-fill-color\", \"red\");\n        customCheckbox.style.setProperty(\"--unchecked-border-color\", \"green\");\n    \n        // Chip Root\n        const chipRoot = document.createElement(\"div\");\n        chipRoot.classList.add(\n            \"dg-chip__root\",\n            \"dg-chip__root--readonly\",\n            \"dg-chip--filled\",\n            \"dg-chip--default\"\n        );\n        chipRoot.setAttribute(\"tabindex\", \"-1\");\n        chipRoot.setAttribute(\"role\", \"status\");\n        chipRoot.setAttribute(\"aria-disabled\", \"false\");\n        chipRoot.setAttribute(\"aria-readonly\", \"true\");\n    \n        if (this.params?.option?.color) {\n            chipRoot.style.backgroundColor = this.params.option.color;\n        }\n    \n        // Chip Label Wrapper\n        const labelWrapper = document.createElement(\"div\");\n        labelWrapper.classList.add(\"dg-chip__label-wrapper\");\n        labelWrapper.setAttribute(\"ref\", \"chip-label\");\n    \n        // Chip Label\n        const chipLabel = document.createElement(\"span\");\n        chipLabel.classList.add(\"dg-chip__label\");\n\n        \n        if(this.params?.option?.label) {\n            chipLabel.textContent = this.params?.option?.label || \"\";\n        chipLabel.setAttribute(\"title\", this.params?.option?.label || \"\");\n        }else{\n        chipLabel.setAttribute(\"title\", this.params?.option?.value || \"\");\n        chipLabel.textContent = this.params?.option?.value || \"\";\n\n        }\n    \n        // Build the structure\n        labelWrapper.appendChild(chipLabel);\n        chipRoot.appendChild(labelWrapper);\n        label.appendChild(checkbox);\n        label.appendChild(customCheckbox);\n        label.appendChild(chipRoot);\n    \n        this.dom = label;\n        return this.dom;\n    }\n    \n\tdestroy(): void {\n        this.dom.remove();\n    }\n    \n}\n","\nexport class DefaultLabelRenderer{\n    params :any;\n    dom    !: HTMLElement;\n\tinit(params: any): void {\n        this.params = params;\n    }\n\tgetElement(): HTMLElement {\n        const label = document.createElement(\"label\");\n        label.classList.add(\"dg-dropdown__option-label\");\n    \n        const labelText = document.createElement(\"div\");\n        labelText.classList.add(\"dg-dropdown__option-label-text\");\n        if(this.params?.option?.label) {\n            labelText.textContent = this.params?.option?.label || \"\";\n\n        }else{\n            labelText.textContent = this.params?.option?.value || \"\";\n\n        }\n    \n        label.appendChild(labelText);\n    \n        this.dom = label;\n        return this.dom;\n    }\n    \n\tdestroy(): void {\n        this.dom.remove();\n    }\n}\n","export const DROPDOWN_DROPDWON_BEAN_NAME = {\n\tDROPDOWN_API: 'dropdownApi',\n\tDROPDOWN_CONFIGURATION: 'configuration',\n\tCSSCLASSNAMEGENERATOR: 'CSSClassNameGenerator',\n\tDROPDOWN_OPTIONS_HANDLER: 'dropdownOptionsHandler',\n\tFORMATTER: 'formatter',\n\tKEYBOARD_SHORTCUT_HANDLER: 'KeyBoardShortCutsHandler',\n\tDROPDOWN_EVENT_HANDLER: 'dropdownEventHandler',\n\tDROPDOWN_CONTROLLER_HANDLER: 'dropdownControllerHandler',\n};","import { EventEmitter } from '@dg/corecomponent/EventEmitter.js';\n\n// import { ISelectOptionHandler } from '../../../../select/src/core/model/select-option-handler.types';\nimport { AutoWired, BEAN_NAME } from '@dg/corecomponent';\nimport { dropdownController } from '../model/dropdown-handler';\nimport { IDropdownDataPart } from '../model/dropdown-ds';\nimport { getDropdownRootUtilityClass } from '../dropdown-root/dropdown-root-classes';\nimport { composeClasses } from '@dg/utils';\nimport { IDropdownOptionHandler } from '../model/dropdown-option-handler.types';\nimport { DropdownFooterContainerCompType } from './dropdownFooterContainer.types';\nimport { DropdownUserComponentHandler } from '../model/dropdown-user-component-handler';\nimport { IComponentDetails } from '../../../../utility/component-detail.types';\n\nconst useUtilityClasses = (_ownerState : any) =>{\n    // const {disabled, readonly} = ownerState;\n    const slots ={\n        root : {\n            slot : 'footer-container',\n            modifiers:[\n                // disabled && 'disabled',\n                // readonly &&'readonly',\n            ],\n        },\n\n    };\n    return composeClasses(slots, getDropdownRootUtilityClass);\n}\n\nexport class DropdownFooterContainerController extends EventEmitter{\n    comp!: DropdownFooterContainerCompType;\n    searchComp!: HTMLElement; \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownCtrlHandler !: dropdownController;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: DropdownUserComponentHandler;\n\n\n\n    setComp(comp:DropdownFooterContainerCompType){\n        this.comp = comp;\n        // this.registerDropdownContainer();\n        this.applyClasses();\n        this.setAriaAttributes();\n        this.optionHandler.getDropdownFooterRenderer() && this.setRendererDetails();\n    }\n\n    setSearchComp(searchComp : HTMLElement){\n        this.searchComp = searchComp;\n    }\n\n    // registerBodyDropdownContainer(){\n    //     this.dropdownCtrlHandler.registerDropdownContainer(this);\n    // }\n\n\n    private setAriaAttributes() {\n    }\n\n    private applyClasses() : void { \n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n        // let className = this.optionHandler.getClassName();\n        // if (className) {\n        //     if (typeof className === 'string') {\n        //         this.comp.getElement().classList.add(className);\n        //     } else if (Array.isArray(className)) {\n        //         (className as string[]).forEach(c => this.comp.getElement().classList.add(c));\n        //     }\n        // }\n    }\n\n    // private refresh() : void {\n    //     this.applyClasses();\n    // }\n\n    private getOwnerState() {\n        return {\n            // disabled: this.optionHandler.isDisabled(),\n            // readonly: this.optionHandler.isReadOnly(),\n            multiple: this.optionHandler.isMultiple()\n        }\n\t}\n\n     getProperty(){\n        return {\n            options : this.optionHandler.getOptions(),\n            isSearchable : ()=>this.optionHandler.isSearchable(),\n            isSelectAll : ()=>this.optionHandler.isSelectAllButtonEnabled(),\n            isMultiple : ()=>this.optionHandler.isMultiple(),\n        }\n    }\n\n    setRendererDetails() : void {\n        \n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails    = this.userComponentHandler.getDropdownFooterRendererDetails(rendererWrapper, params) as IComponentDetails;\n\n        this.comp.setRendererDetails(userDetails);\n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionHandler.getDropdownFooterRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionHandler.getDropdownFooterRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionHandler.getDropdownFooterRendererParams(),\n            element : this.comp.getElement()\n\t\t};\n    }\n\n}","import { Component } from \"@dg/corecomponent/Component.js\";\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { DropdownFooterContainerCompType } from \"./dropdownFooterContainer.types\";\nimport { DropdownFooterContainerController } from \"./dropdownFooterContainer-controller\"\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\n\nconst dropdownContainer = (_props: any) =>{\n    const DropdownFooterContainer = document.createElement(\"div\");\n    DropdownFooterContainer.tabIndex = 0;\n    return DropdownFooterContainer;\n}\n\n\nexport class DropdownFooterContainerComponent extends Component {\n\n    private renderer       : any;\n\tprivate rendererElement: any;\n    \n    @PostConstruct()\n    init(){\n        const comp:DropdownFooterContainerCompType = {\n            getElement :()=>this.getGui(),\n            addOrRemoveCSSClass : (className:string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails : (rendererDetails: IComponentDetails)=>this.setRendererDetails(rendererDetails),\n            destroy : () => this.destroy()\n        }\n        const controller = this.createManagedBean(new DropdownFooterContainerController());\n        const props = controller.getProperty();\n\n        const DropdownContainer =  dropdownContainer(props);\n        this.setTemplate(DropdownContainer);\n        controller.setComp(comp);\n    }\n\n    private addOrRemoveCSSClass(className:string):void{\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutCellRenderer()\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer() {\n\t\tconst parentElement = this.getGui();\n        clearElement(parentElement);\n\t\t// this.setTemplate(RootownDropdowntTemplate());\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n    \n    destroy(): void {\n        this.getGui().remove();\n    }\n}\n\n\n","import { EventEmitter } from '@dg/corecomponent/EventEmitter.js';\n\n// import { ISelectOptionHandler } from '../../../../select/src/core/model/select-option-handler.types';\nimport { AutoWired, BEAN_NAME } from '@dg/corecomponent';\nimport { dropdownController } from '../model/dropdown-handler';\nimport { IDropdownDataPart } from '../model/dropdown-ds';\nimport { getDropdownRootUtilityClass } from '../dropdown-root/dropdown-root-classes';\nimport { composeClasses } from '@dg/utils';\nimport { IDropdownOptionHandler } from '../model/dropdown-option-handler.types';\nimport { DropdownHeaderContainerCompType } from './dropdownHeaderContainer.types';\nimport { DropdownUserComponentHandler } from '../model/dropdown-user-component-handler';\nimport { IComponentDetails } from '../../../../utility/component-detail.types';\n\nconst useUtilityClasses = (_ownerState : any) =>{\n    // const {disabled, readonly} = ownerState;\n    const slots ={\n        root : {\n            slot : 'header-container',\n            modifiers:[\n                // disabled && 'disabled',\n                // readonly &&'readonly',\n            ],\n        },\n\n    };\n    return composeClasses(slots, getDropdownRootUtilityClass);\n}\n\nexport class DropdownHeaderContainerController extends EventEmitter{\n    comp!: DropdownHeaderContainerCompType;\n    searchComp!: HTMLElement; \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownCtrlHandler !: dropdownController;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: DropdownUserComponentHandler;\n\n\n\n    setComp(comp:DropdownHeaderContainerCompType){\n        this.comp = comp;\n        // this.registerDropdownContainer();\n        this.applyClasses();\n        this.setAriaAttributes();\n        this.optionHandler.getDropdownHeaderRenderer() && this.setRendererDetails();\n    }\n\n    setSearchComp(searchComp : HTMLElement){\n        this.searchComp = searchComp;\n    }\n\n    // registerBodyDropdownContainer(){\n    //     this.dropdownCtrlHandler.registerDropdownContainer(this);\n    // }\n\n\n    private setAriaAttributes() {\n    }\n\n    private applyClasses() : void { \n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n        // let className = this.optionHandler.getClassName();\n        // if (className) {\n        //     if (typeof className === 'string') {\n        //         this.comp.getElement().classList.add(className);\n        //     } else if (Array.isArray(className)) {\n        //         (className as string[]).forEach(c => this.comp.getElement().classList.add(c));\n        //     }\n        // }\n    }\n\n    // private refresh() : void {\n    //     this.applyClasses();\n    // }\n\n    private getOwnerState() {\n        return {\n            // disabled: this.optionHandler.isDisabled(),\n            // readonly: this.optionHandler.isReadOnly(),\n            multiple: this.optionHandler.isMultiple()\n        }\n\t}\n\n     getProperty(){\n        return {\n            options     : this.optionHandler.getOptions(),\n            isSearchable: ()=>this.optionHandler.isSearchable(),\n            isSelectAll : ()=>this.optionHandler.isSelectAllButtonEnabled(),\n            isMultiple  : ()=>this.optionHandler.isMultiple()\n        }\n    }\n\n\n    setRendererDetails() : void {\n        \n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails    = this.userComponentHandler.getDropdownHeaderRendererDetails(rendererWrapper, params) as IComponentDetails;\n\n        this.comp.setRendererDetails(userDetails);\n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionHandler.getDropdownHeaderRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionHandler.getDropdownHeaderRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionHandler.getDropdownHeaderRendererParams(),\n\t\t};\n    }\n\n}","import { Component } from \"@dg/corecomponent/Component.js\";\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { DropdownHeaderContainerCompType } from \"./dropdownHeaderContainer.types\";\nimport { DropdownHeaderContainerController } from \"./dropdownHeaderContainer-controller\"\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\n\nconst dropdownContainer = (props: any) =>{\n    const DropdownHeaderContainer = document.createElement(\"div\");\n    DropdownHeaderContainer.tabIndex = 0;\n    \n    if(props.isSearchable()){\n        const searchComp = document.createElement(\"dropdown-search\");\n        DropdownHeaderContainer.appendChild(searchComp);\n    }\n\n    if(props.isSelectAll() && props.isMultiple()){\n        const selectall = document.createElement(\"select-all\");\n        DropdownHeaderContainer.appendChild(selectall);\n    }\n \n\n\n    return DropdownHeaderContainer;\n}\n\n\nexport class DropdownHeaderContainerComponent extends Component {\n    private renderer       : any;\n\tprivate rendererElement: any;\n    @PostConstruct()\n    init(){\n        const comp:DropdownHeaderContainerCompType = {\n            getElement :()=>this.getGui(),\n            addOrRemoveCSSClass : (className:string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails : (rendererDetails: IComponentDetails)=>this.setRendererDetails(rendererDetails),\n            destroy : () => this.destroy()\n        }\n        const controller = this.createManagedBean(new DropdownHeaderContainerController());\n        const props = controller.getProperty();\n\n        const DropdownContainer =  dropdownContainer(props);\n        this.setTemplate(DropdownContainer);\n        controller.setComp(comp);\n    }\n\n    private addOrRemoveCSSClass(className:string):void{\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutCellRenderer()\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer() {\n\t\tconst parentElement = this.getGui();\n        clearElement(parentElement);\n\t\t// this.setTemplate(RootownDropdowntTemplate());\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n    \n    destroy(): void {\n        this.getGui().remove();\n    }\n}","import { EventEmitter } from '@dg/corecomponent/EventEmitter.js';\n\n// import { ISelectOptionHandler } from '../../../../select/src/core/model/select-option-handler.types';\nimport { AutoWired, BEAN_NAME } from '@dg/corecomponent';\nimport { dropdownController } from '../model/dropdown-handler';\nimport { IDropdownDataPart } from '../model/dropdown-ds';\nimport { getDropdownRootUtilityClass } from '../dropdown-root/dropdown-root-classes';\nimport { composeClasses } from '@dg/utils';\nimport { IDropdownOptionHandler } from '../model/dropdown-option-handler.types';\nimport { DropdownBodyContainerCompType } from './dropdownBodyContainer.types';\nimport { DropdownUserComponentHandler } from '../model/dropdown-user-component-handler';\n// import { IComponentDetails } from '../../../../utility/component-detail.types';\n\nconst useUtilityClasses = (_ownerState : any) =>{\n    // const {disabled, readonly} = ownerState;\n    const slots ={\n        root : {\n            slot : 'body-container',\n            modifiers:[\n                // disabled && 'disabled',\n                // readonly &&'readonly',\n            ],\n        },\n\n    };\n    return composeClasses(slots, getDropdownRootUtilityClass);\n}\n\nexport class DropdownBodyContainerController extends EventEmitter{\n    comp!: DropdownBodyContainerCompType;\n    searchComp!: HTMLElement; \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownCtrlHandler !: dropdownController;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: DropdownUserComponentHandler;\n\n\n\n    setComp(comp:DropdownBodyContainerCompType){\n        this.comp = comp;\n        // this.registerDropdownContainer();\n        this.applyClasses();\n        this.setAriaAttributes();\n        // this.setRendererDetails();\n    }\n\n    setSearchComp(searchComp : HTMLElement){\n        this.searchComp = searchComp;\n    }\n\n    // registerBodyDropdownContainer(){\n    //     this.dropdownCtrlHandler.registerDropdownContainer(this);\n    // }\n\n\n    private setAriaAttributes() {\n    }\n\n    private applyClasses() : void { \n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n        // let className = this.optionHandler.getClassName();\n        // if (className) {\n        //     if (typeof className === 'string') {\n        //         this.comp.getElement().classList.add(className);\n        //     } else if (Array.isArray(className)) {\n        //         (className as string[]).forEach(c => this.comp.getElement().classList.add(c));\n        //     }\n        // }\n    }\n\n    // private refresh() : void {\n    //     this.applyClasses();\n    // }\n\n    private getOwnerState() {\n        return {\n            // disabled: this.optionHandler.isDisabled(),\n            // readonly: this.optionHandler.isReadOnly(),\n            multiple: this.optionHandler.isMultiple()\n        }\n\t}\n\n     getProperty(){\n        return {\n            options : this.optionHandler.getOptions(),\n            isSearchable : ()=>this.optionHandler.isSearchable(),\n            isSelectAll : ()=>this.optionHandler.isSelectAllButtonEnabled(),\n            isMultiple : ()=>this.optionHandler.isMultiple(),\n        }\n    }\n\n\n    // setRendererDetails() : void {\n        \n    //     const rendererWrapper = this.createIconRendererWrapper();\n    //     const params          = this.createRendererParams();\n    //     const  userDetails    = this.userComponentHandler.getDropdownRendererDetails(rendererWrapper, params) as IComponentDetails;\n\n    //     this.comp.setRendererDetails(userDetails);\n    // }\n    // private createIconRendererWrapper() {\n    //     return {\n\t// \t\tgetRenderer          : () => this.optionHandler.getDropdownRenderer(),\n\t// \t\tgetUserRendererParams: () => this.optionHandler.getDropdownRendererParams(),\n\t// \t};\n    // }\n    // private createRendererParams() {\n    //     return {\n\t// \t\tvalue: this.optionHandler.getDropdownRendererParams(),\n\t// \t};\n    // }\n\n}","import { Component } from \"@dg/corecomponent/Component.js\";\nimport { PostConstruct  } from \"@dg/corecomponent\";\nimport { DropdownBodyContainerCompType } from \"./dropdownBodyContainer.types\";\nimport { DropdownBodyContainerController } from \"./dropdownBodyContainer-controller\"\n// import { IComponentDetails } from \"../../../../utility/component-detail.types\";\n\n\nconst dropdownContainer = (_props?: any) =>{\n    const DropdownBodyContainer = document.createElement(\"div\");\n    DropdownBodyContainer.tabIndex = 0;\n\n    const dropdownComp = document.createElement(\"dropdown\");\n    DropdownBodyContainer.appendChild(dropdownComp);\n\n    return DropdownBodyContainer;\n}\n\n\n\n\nexport class DropdownBodyContainerComponent extends Component {\n\n    // private renderer       : any;\n\t// private rendererElement: any;\n\n    @PostConstruct()\n    init(){\n        const comp:DropdownBodyContainerCompType = {\n            getElement :()=>this.getGui(),\n            addOrRemoveCSSClass : (className:string) => this.addOrRemoveCSSClass(className),\n            // setRendererDetails : (rendererDetails: IComponentDetails)=>this.setRendererDetails(rendererDetails),\n            destroy : () => this.destroy()\n        }\n        const controller = this.createManagedBean(new DropdownBodyContainerController());\n        const props = controller.getProperty();\n\n        const DropdownContainer =  dropdownContainer(props);\n        this.setTemplate(DropdownContainer);\n        controller.setComp(comp);\n    }\n\n    private addOrRemoveCSSClass(className:string):void{\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    // private setRendererDetails(rendererDetails: IComponentDetails): void {\n\t// \tif (rendererDetails) {\n\t// \t\tthis.destroyRenderer();\n\t// \t\tconst callback = this.afterRenderer.bind(this);\n\t// \t\tconst componentInstance = rendererDetails.newInstance();\n\t// \t\tif (componentInstance) {\n\t// \t\t\tcomponentInstance.then(callback);\n\t// \t\t}\n\t// \t}else {\n\t// \t\tthis.destroyRenderer();\n\t// \t\tthis.insertValueWithoutCellRenderer()\n\t// \t}\n\t// }\n\n\t//  private destroyRenderer(): void {\n\t// \tthis.renderer = this.context.destroyBean(this.renderer);\n\t// \tremoveFromParent(this.rendererElement);\n\t// \tthis.rendererElement = null;\n\t// }\n\n\t// private insertValueWithoutCellRenderer() {\n\t// \tconst parentElement = this.getGui();\n    //     clearElement(parentElement);\n\t// \tthis.setTemplate(dropdownContainer());\n\t// }\n\n\t// private afterRenderer(renderer: any) {\n\t// \tthis.renderer = renderer;\n\t// \tthis.rendererElement = renderer.getElement?.() ?? null;\n\t// \tif (this.rendererElement) {\n\t// \t\tconst parentElement = this.getGui() as HTMLElement;\n\t// \t\tclearElement(parentElement);\n\t// \t\tparentElement.appendChild(this.rendererElement);\n\t// \t}\n\t// }\n    \n    destroy(): void {\n        this.getGui().remove();\n    } \n\n}","import { EventEmitter } from '@dg/corecomponent/EventEmitter.js';\nimport {DropdownContainerCompType} from \"./dropdownContainer.types\"\n// import { ISelectOptionHandler } from '../../../../select/src/core/model/select-option-handler.types';\nimport { AutoWired, BEAN_NAME } from '@dg/corecomponent';\nimport { dropdownController } from '../model/dropdown-handler';\nimport { IDropdownDataPart } from '../model/dropdown-ds';\nimport { getDropdownRootUtilityClass } from '../dropdown-root/dropdown-root-classes';\nimport { composeClasses } from '@dg/utils';\nimport { IDropdownOptionHandler } from '../model/dropdown-option-handler.types';\n\nconst useUtilityClasses = (_ownerState : any) =>{\n    // const {disabled, readonly} = ownerState;\n    const slots ={\n        root : {\n            slot : 'container',\n            modifiers:[\n                // disabled && 'disabled',\n                // readonly &&'readonly',\n            ],\n        },\n\n    };\n    return composeClasses(slots, getDropdownRootUtilityClass);\n}\n\nexport class DropdownContainerController extends EventEmitter{\n\n    static DOM_KEY = '_DG_DROPDOWN_CONTAINER';\n\n    private domKey = `_DG_${Math.random().toString()}`;\n\n    comp!: DropdownContainerCompType;\n    searchComp!: HTMLElement; \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownCtrlHandler !: dropdownController;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n\n\n\n    setComp(comp:DropdownContainerCompType){\n        this.comp = comp;\n        this.registerDropdownContainer();\n        this.applyClasses();\n        this.setAriaAttributes();\n\n        this.optionHandler.setDomData(comp.getElement(), DropdownContainerController.DOM_KEY, this.domKey);\n\n        this.addListener(this.comp.getElement(), 'focusout', (event : FocusEvent) => {\n            const elementWithFocus = event.relatedTarget as HTMLElement;\n\n            const focusInsideComponent = this.isElementFromParent(elementWithFocus);\n\n            const closeCallback = () => {\n                document.hasFocus() && this.optionHandler.onBeforeDropdownClose(false);\n            }\n\n            if(!focusInsideComponent) {\n                if(!this.isElementWithinCustomPopup(elementWithFocus)) {\n                    closeCallback();\n                }\n            }\n        })\n\n        // this.addListener(this.comp.getElement(), 'keydown', (event : KeyboardEvent) => {\n        //     if(event.key === ' ') {\n        //         this.optionHandler.onBeforeDropdownClose();\n        //     }\n        // })\n    }\n\n    setSearchComp(searchComp : HTMLElement){\n        this.searchComp = searchComp;\n    }\n\n    registerDropdownContainer(){\n        this.dropdownCtrlHandler.registerDropdownContainer(this);\n    }\n\n    private isElementWithinCustomPopup(element: HTMLElement): boolean {\n        let pointer: HTMLElement | null = element;\n        \n        while (pointer) {\n            if (pointer.classList.contains('ZG-has-popup')) {\n                return true;\n            }\n            pointer = pointer.parentElement;\n        }\n\n        return false;\n    }\n\n    private isElementFromParent(element : HTMLElement) : boolean {\n        let pointer: HTMLElement | null = element;\n        while (pointer) {\n            const uniqueKey = this.optionsHandler.getDomData(pointer, DropdownContainerController.DOM_KEY);\n            if(!!uniqueKey) {\n                const eventFromThisParent = uniqueKey === this.domKey;\n                return eventFromThisParent;\n            }           \n            pointer = pointer.parentElement;\n        }\n        return false;\n    }\n\n\n    private setAriaAttributes() {\n    }\n\n    private applyClasses() : void { \n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n        let className = this.optionHandler.getClassName();\n        if (className) {\n            if (typeof className === 'string') {\n                this.comp.getElement().classList.add(className);\n            } else if (Array.isArray(className)) {\n                (className as string[]).forEach(c => this.comp.getElement().classList.add(c));\n            }\n        }\n    }\n\n    // private refresh() : void {\n    //     this.applyClasses();\n    // }\n\n    private getOwnerState() {\n        return {\n            // disabled: this.optionHandler.isDisabled(),\n            // readonly: this.optionHandler.isReadOnly(),\n            multiple: this.optionHandler.isMultiple()\n        }\n\t}\n\n     getProperty(){\n        return {\n            options : this.optionHandler.getOptions(),\n            isSearchable : ()=>this.optionHandler.isSearchable(),\n            isSelectAll : ()=>this.optionHandler.isSelectAllButtonEnabled(),\n            isMultiple : ()=>this.optionHandler.isMultiple(),\n        }\n    }\n\n    focus(){\n        this.comp.getElement().focus({\n            preventScroll :true \n        });\n        this.optionHandler.onFocus();   \n    }\n\n    blur(){\n        this.comp.getElement().blur();\n        this.optionHandler.onBlur();\n    }\n\n}","import { Component } from \"@dg/corecomponent/Component.js\";\nimport { PostConstruct } from \"@dg/corecomponent\";\nimport { DropdownContainerCompType } from \"./dropdownContainer.types\";\nimport { DropdownContainerController } from \"./dropdownContainer-controller\"\n\nconst dropdownContainer = (_props: any) =>{\n    const DropdownContainer = document.createElement(\"div\");\n    DropdownContainer.tabIndex = 0;\n    // DropdownContainer.className ='select-dropdown-container'\n\n    // if(props.isSearchable()){\n    //     const searchComp = document.createElement(\"dropdown-search\");\n    //     DropdownContainer.appendChild(searchComp);\n    // }\n\n    // if(props.isSelectAll() && props.isMultiple()){\n    //     const selectall = document.createElement(\"select-all\");\n    //     DropdownContainer.appendChild(selectall);\n    // }\n \n    // const dropdownComp = document.createElement(\"dropdown\");\n    // DropdownContainer.appendChild(dropdownComp);\n\n    const dropdownHeaderComp =  document.createElement(\"dropdown-header-container\");\n    DropdownContainer.appendChild(dropdownHeaderComp);\n\n    const dropdownBodyComp =  document.createElement(\"dropdown-body-container\");\n    DropdownContainer.appendChild(dropdownBodyComp);\n\n    const dropdownFooterComp =  document.createElement(\"dropdown-footer-container\");\n    DropdownContainer.appendChild(dropdownFooterComp);\n\n    return DropdownContainer;\n}\n\n\nexport class DropdownContainerComponent extends Component {\n    @PostConstruct()\n    init(){\n        const comp:DropdownContainerCompType = {\n            getElement :()=>this.getGui(),\n            addOrRemoveCSSClass : (className:string) => this.addOrRemoveCSSClass(className),\n        }\n        const controller = this.createManagedBean(new DropdownContainerController());\n        const props = controller.getProperty();\n\n        const DropdownContainer =  dropdownContainer(props);\n        this.setTemplate(DropdownContainer);\n        controller.setComp(comp);\n    }\n\n    private addOrRemoveCSSClass(className:string):void{\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n}","\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { dropdownCreateNewOptiontype } from \"./dropdown-create-newoption.types\";\nimport { IDropdownOptionHandler } from \"../model/dropdown-option-handler.types\";\nimport { dropdownController } from \"../model/dropdown-handler\";\nimport { DropdownUserComponentHandler } from \"../model/dropdown-user-component-handler\";\n\n// const useUtilityClasses = () => {\n// \tconst slots = {\n// \t\troot: {\n// \t\t\tslot: 'dropdown-icon',\n// \t\t\tmodifiers: [\n\t\t\t\t\n// \t\t\t],\n// \t\t},\n// \t};\n\n// \treturn composeClasses(slots, getSelectRootUtilityClass);\n// };\n\nexport class DropdownCreateNewOptionController extends EventEmitter {\n    private component !: dropdownCreateNewOptiontype\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownHandler !: dropdownController;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: DropdownUserComponentHandler;\n\n    \n    setComponent(component : dropdownCreateNewOptiontype){\n        this.component = component;\n        this.applyClassNames();\n        this.setRendererDetails();\n        this.dropdownHandler.registerDropdownCreateNewOptionController(this);\n        this.registerEvents();\n    }\n\n    private registerEvents(){\n        const createNewOptionDom =  this.component.getElement();\n        if(this.optionHandler.isCreateNewOptionEnabled()){\n             createNewOptionDom.addEventListener(\"click\",(event:any)=>{\n                                                                        this.dropdownHandler.getDropdown().addNewOption();\n                                                                        event.stopPropagation();\n                                                                    });\n\n            createNewOptionDom.addEventListener(\"mouseover\",(_event)=>{\n                this.dropdownHandler.getDropdownComponent().setHoveredOption('new', -1)\n             });\n        }\n    }\n\n    private applyClassNames(){\n\t\tthis.component.getElement().classList.add(\"dg-dropdown__option\");\n        this.component.getElement().classList.add(\"dg-dropdown__option-create\");\n    }\n\n    setRendererDetails() : void {\n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails     = this.userComponentHandler.getCreateNewOptionRendererDetails(rendererWrapper, params) as IComponentDetails;\n        this.component.setRendererDetails(userDetails,params);\n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionHandler.getCreateNewOptionRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionHandler.getCreateNewOptionRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionHandler.getCreateNewOptionRenderer(),\n            enableCreateNewOption  : this.optionHandler.isCreateNewOptionEnabled(),\n            newOption              : this.dropdownHandler.getSearch().getValue(),\n\t\t};\n    }\n\n    getElement(): HTMLElement{\n        return this.component.getElement();\n    }\n}","\n\n\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { dropdownCreateNewOptiontype } from \"./dropdown-create-newoption.types\";\nimport { DropdownCreateNewOptionController } from \"./dropdown-create-newoption-controller\";\n\n\nconst createNewOptionTemplate = ()=>{\n    const createNewOption =  document.createElement(\"li\");\n\tcreateNewOption.setAttribute('tabIndex', '0');\n    return createNewOption;\n}\n\nexport class DropdownCreateNewOptionComponent extends Component {\n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    @PostConstruct()\n    init() {\n        const comp : dropdownCreateNewOptiontype = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails : (rendererDetails: IComponentDetails,params :any)=>this.setRendererDetails(rendererDetails,params),\n\t\t\tdestroy                     : () => this.destroy()\n        }\n\n        const controller = this.createBean(new DropdownCreateNewOptionController());\n        this.setTemplate(createNewOptionTemplate())\n        controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails,params:any): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tparams.enableCreateNewOption && this.insertValueWithoutCellRenderer(params.newOption);\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer(newOption: string) {\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\n\t\tconst button = document.createElement(\"button\");\n\t\tbutton.classList.add(\"dg-dropdown__option-label\");\n\n\t\tconst loaderWrapper = document.createElement(\"span\");\n\t\tloaderWrapper.classList.add(\"ZTCL-delay\");\n\n\t\tconst loader = document.createElement(\"span\");\n\t\tloader.classList.add(\"ZT-circleLoader\", \"ZT-cmNone\", \"ZTCL-small\");\n\t\tloaderWrapper.appendChild(loader);\n\n\t\tconst createIcon = document.createElement(\"span\");\n\t\tcreateIcon.classList.add(\"dg-dropdown__option-create-icon\");\n\t\tcreateIcon.textContent = \"+\";\n\n\t\tconst text = document.createElement(\"span\");\n\t\ttext.textContent = \"Create a option named \";\n\n\t\tconst optionText = document.createElement(\"span\");\n\t\toptionText.classList.add(\"dg-dropdown__option-create-text\");\n\t\toptionText.textContent = newOption;\n\n\t\tbutton.append(loaderWrapper, createIcon, text, optionText);\n\t\tparentElement.appendChild(button);\n\t}\n\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\t\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\t}\n\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DropdownLoadingControllerType, DropdownLoadingViewWrapperType } from \"./dropdown-loading.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { IDropdownUserComponentHandlerTypes } from \"../model/dropdown-user-component-handler.types\";\n\nexport class DropdownLoadingController extends EventEmitter implements DropdownLoadingControllerType {\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) private userComponentHandler !: IDropdownUserComponentHandlerTypes;\n    private component !: DropdownLoadingViewWrapperType;\n    setComponent(component : DropdownLoadingViewWrapperType) : void {\n        this.component = component;\n        this.setRenderDetails();\n    }\n\n    private setRenderDetails() : void {\n        const items = this.getProperty();\n        const componentDetails = this.userComponentHandler.getLoadingRendererDetails(items, {});\n        this.component.setRenderDetails(componentDetails);\n    }\n\n    private getProperty() : any {\n        return {\n            getRenderer          : () => this.optionsHandler.getLoadingRenderer(),\n            getUserRendererParams: () => this.optionsHandler.getLoadingRendererParams()\n        }\n    }\n}","import { Component } from \"@dg/corecomponent/Component.js\";\nimport { DropdownLoadingViewType, DropdownLoadingViewWrapperType } from \"./dropdown-loading.types\";\nimport { clearElement, PostConstruct, removeFromParent } from \"@dg/corecomponent\";\nimport { IComponentDetails } from \"@dg/corecomponent/UserComponentHandler.js\";\nimport { DropdownLoadingController } from \"./dropdown-loading-controller\";\nconst getTemplate = () => {\n    const div = document.createElement('div');\n    return div;\n}\nexport class DropdownLoadingView extends Component implements DropdownLoadingViewType {\n    private optionRenderer : any| null                 = null;\n    private optionRendererElement : HTMLElement | null = null;\n    @PostConstruct()\n    init() {\n        this.setTemplate(getTemplate())\n        const component : DropdownLoadingViewWrapperType = {\n            getElement : () => this.getGui(),\n            setRenderDetails : (componentDetails : IComponentDetails) => this.setRenderDetails(componentDetails)\n        }\n\n        const controller = this.createManagedBean(new DropdownLoadingController());\n        controller.setComponent(component);\n    }\n\n    private setRenderDetails(componentDetails : IComponentDetails) : void {\n         if (componentDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = componentDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}\n    }\n\n    private destroyRenderer(): void {\n\t\tthis.optionRenderer = this.context.destroyBean(this.optionRenderer);\n\t\tremoveFromParent(this.optionRendererElement);\n\t\tthis.optionRendererElement = null;\n\t}\n\n    private afterRenderer(renderer: any) {\n\t\tthis.optionRenderer = renderer;\n\t\tthis.optionRendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.optionRendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.optionRendererElement)\n\t\t}\n\t}\n}","\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { dropdownNoOptiontype } from \"./dropdown-no-option.types\";\nimport { IDropdownOptionHandler } from \"../model/dropdown-option-handler.types\";\nimport { dropdownController } from \"../model/dropdown-handler\";\nimport { DropdownUserComponentHandler } from \"../model/dropdown-user-component-handler\";\n\n// const useUtilityClasses = () => {\n// \tconst slots = {\n// \t\troot: {\n// \t\t\tslot: 'dropdown-icon',\n// \t\t\tmodifiers: [\n\t\t\t\t\n// \t\t\t],\n// \t\t},\n// \t};\n\n// \treturn composeClasses(slots, getSelectRootUtilityClass);\n// };\n\nexport class DropdownNoOptionController extends EventEmitter {\n    private component !: dropdownNoOptiontype\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownHandler !: dropdownController;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: DropdownUserComponentHandler;\n\n    \n    setComponent(component : dropdownNoOptiontype){\n        this.component = component;\n        this.applyClassNames();\n        this.setRendererDetails();\n        // this.dropdownHandler.registerDropdownCreateNewOptionController(this);\n        this.registerEvents();\n    }\n\n    private registerEvents(){\n\n    }\n\n    private applyClassNames(){\n\t\tthis.component.getElement().classList.add(\"dg-dropdown__option\");\n        this.component.getElement().classList.add(\"dg-dropdown__option-no-result-found\");\n    }\n\n    setRendererDetails() : void {\n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails     = this.userComponentHandler.getNoOptionRendererDetails(rendererWrapper, params) as IComponentDetails;\n        this.component.setRendererDetails(userDetails,params);\n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionHandler.getNoOptionRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionHandler.getNoOptionRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionHandler.getCreateNewOptionRenderer(),\n\t\t};\n    }\n\n    getElement(): HTMLElement{\n        return this.component.getElement();\n    }\n}","\n\n\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { dropdownNoOptiontype } from \"./dropdown-no-option.types\";\nimport { DropdownNoOptionController } from \"./dropdown-no-option-controller\";\n\n\n\nconst createNoOptionTemplate = ()=>{\n    const createNewOption =  document.createElement(\"li\");\n    return createNewOption;\n}\n\nexport class DropdownNoOptionComponent extends Component {\n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    @PostConstruct()\n    init() {\n        const comp : dropdownNoOptiontype = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails : (rendererDetails: IComponentDetails,params :any)=>this.setRendererDetails(rendererDetails,params),\n\t\t\tdestroy                     : () => this.destroy()\n        }\n\n        const controller = this.createBean(new DropdownNoOptionController());\n        this.setTemplate(createNoOptionTemplate())\n        controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails,_params:any): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t        this.insertValueWithoutCellRenderer();\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer() {\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\t\n\t\tconst label = document.createElement(\"label\");\n\t\tlabel.classList.add(\"dg-dropdown__option-label\");\n\t\n\t\tconst textDiv = document.createElement(\"div\");\n\t\ttextDiv.classList.add(\"dg-dropdown__option-label-text\");\n\t\ttextDiv.textContent = \"No Option\";\n\t\n\t\tlabel.appendChild(textDiv);\n\t\tparentElement.appendChild(label);\n\t}\n\t\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\t\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\t}\n\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { SelectDropdownOptionCompType } from \"./dropdown-option.types\";\n\n\nimport { AutoWired, BEAN_NAME, setAriaDisabled, setAriaLabel, setAriaRole, setAriaSelected } from \"@dg/corecomponent\";\n\nimport { IDropdownDataPart } from \"../model/dropdown-ds\";\nimport { dropdownController } from \"../model/dropdown-handler\";\nimport { getDropdownRootUtilityClass } from \"../dropdown-root/dropdown-root-classes\";\nimport { composeClasses } from \"@dg/utils\";\nimport { DROPDOWN_DROPDWON_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { IDropdownAPI } from \"../model/dropdown-api\";\nimport { Intiator, DropdownOptionElementModel } from \"../../../dropdown_configuration\";\n// import { Chip } from \"../../../../chip/chip\";\n// import { IChipConfiguration } from \"../../../../chip/chip-configuration.types\";\nimport { IDropdownOptionHandler } from \"../model/dropdown-option-handler.types\";\nimport { DropdownUserComponentHandler } from \"../model/dropdown-user-component-handler\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { DefaultLabelRenderer } from \"../../component/DefaultLabelRenderer\";\nimport { DefaultMultiSelectChipRenderer, DefaultSingleSelectChipRenderer } from \"../../component/DefaultChipRenderer\";\n// import { DropdownUserComponentHandler } from \"../model/dropdown-user-component-handler\";\n\nconst useUtilityClasses = (ownerState : any) =>{\n    const {disabled, readonly} = ownerState;\n    const slots ={\n        root : {\n            slot : 'option',\n            modifiers:[\n                disabled && 'disabled',\n                readonly &&'readonly',\n            ],\n        },\n    };\n    return composeClasses(slots, getDropdownRootUtilityClass);\n}\n\n\n\nexport class SelectDropdownOptionController extends EventEmitter{\n    comp !: SelectDropdownOptionCompType;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: IDropdownOptionHandler;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart!: IDropdownDataPart;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") dropdownHandler !: dropdownController;\n    @AutoWired(DROPDOWN_DROPDWON_BEAN_NAME.DROPDOWN_API) dropdownAPI!: IDropdownAPI;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: DropdownUserComponentHandler;\n    // @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) private UserComponentHandler!: DropdownUserComponentHandler;\n\n    index = 0;\n    option!: DropdownOptionElementModel;\n    checkbox !:any;\n    item !:any;\n\n    setValue(){\n        this.option = this.dropdownDatapart.getOption();\n        this.index = this.dropdownDatapart.getOptionIndex()-1;\n    }\n\n    setComp(comp:SelectDropdownOptionCompType){\n        this.comp = comp;\n        // this.setRenderer();\n        this.applyClasses();\n        this.setAriaAttributes();\n        this.registerEventHandler();\n        this.setRendererDetails();\n        this.setOptionHidden();\n        this.dropdownDatapart.updateOptionsController(this);\n        this.isSelected() && this.focus();\n\n    }\n\n    private setOptionHidden() {\n        const element = this.comp.getElement();\n        const isHidden = this.option.dropdownHidden ?? false;\n        element.classList.toggle(\"ZG-hidden\", isHidden);\n    }\n\n    registerCheckboxElement(checkbox:any){\n        this.checkbox = checkbox;\n    }\n\n\n\n    private setAriaAttributes() {\n        const element = this.comp.getElement();\n        setAriaRole(element ,'option');\n        setAriaLabel(element,this.option?.value ?? '');\n        setAriaSelected(element ,this.isSelected());\n        setAriaDisabled(element ,this.option.disabled ?? false);\n    }\n\n    private applyClasses() : void {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n        const isSelected = this.isSelected();\n        isSelected ?this.comp.getElement().classList.add('dg-dropdown__option--selected') : this.comp.getElement().classList.remove('dg-dropdown__option--selected');\n    }\n\n     refresh() : void {\n        this.applyClasses();\n        this.setAriaAttributes();\n    }\n\n    private getOwnerState() {\n        return {\n            disabled: this.option.disabled ?? false,\n            readonly: this.option.readonly ?? false,\n        }\n\t}\n\n\n\n    private registerEventHandler(){\n        const element = this.comp.getElement();\n        const searchComp =  this.dropdownHandler.getSearch();\n        const ownerState = this.getOwnerState();\n\n        if(ownerState.disabled || ownerState.readonly){\n            return ;\n        }\n\n        element.addEventListener(\"mouseover\",(_event)=>{\n            this.setHoveredOption();\n        });\n         element.addEventListener(\"mouseout\",(_event)=>{\n            this.cleatHoverOptions();\n        });\n\n\n        element.addEventListener(\"click\",(event)=>{\n            event.preventDefault()\n            this.clickOption(event,  this.dropdownDatapart.isSelectAll());\n        });\n\n        this.addListener(element, 'keydown', (event: KeyboardEvent) => {\n\n            const isCharacter = event.key.length === 1 && /[a-zA-Z0-9]/.test(event.key);\n            // let focusedIndex = -1;\n            if (isCharacter || event.key === \"Backspace\") {\n                searchComp.focus();\n                event.stopPropagation();\n                return;\n              }\n\n            switch(event.key){\n\n                case 'Enter' :\n                    case ' ' :\n                    event.preventDefault();\n                    const focusedOptionContrl = this.dropdownDatapart.getOptionController(this.index);\n                    if(focusedOptionContrl){\n                        focusedOptionContrl.clickOption(event,  this.dropdownDatapart.isSelectAll());\n                        focusedOptionContrl.focus();\n                    }\n                    event.stopPropagation();\n                    break;\n\n                case 'Escape' : \n                //     this.dropdownAPI.destroy();\n                    this.optionsHandler.onBeforeDropdownClose();\n                     break;\n                case ' ':\n                    this.optionHandler.onBeforeDropdownClose();\n\n                default : break;\n\n            }\n            // searchComp?.focus();\n        })\n        \n    }\n\n    setHoveredOption(){\n        this.dropdownHandler.getDropdownComponent().setHoveredOption(null, this.index);\n    }\n\n    cleatHoverOptions(){\n        this.dropdownHandler.getDropdownComponent().resetFocuesdOption();\n    }\n\n    isBeforeSelectALL(count:number) : boolean {\n        return this.dropdownDatapart.getSelectedOptions().length + count === this.dropdownDatapart.getOptions().length;\n    }\n\n    clickOption(event: Event, selectALL : boolean, force : boolean = false, selectAllTriggered : boolean = false){\n\n        if(this.option.disabled) {\n            return;\n        }\n\n        const isSelected = this.isSelected();\n\n        const isMultiple = this.optionHandler.isMultiple();\n        const params =  this.createParams(\"UI\", force ? selectALL : this.isBeforeSelectALL(isSelected ? -1 : 1), selectAllTriggered);\n\n        if(!isMultiple && isSelected) {\n            const closeOnSelect = this.optionHandler.isCloseOnSelect();\n            if(closeOnSelect) {\n                this.optionHandler.onBeforeDropdownClose();\n            }\n            return;\n        }\n        \n        if(!isSelected){\n            const value = this.optionHandler.onBeforeSelect(params);\n            if(value) {\n                this.dropdownDatapart.updateSelectedOptions(this.option);\n                this.optionHandler.onAfterSelect(params);\n            }\n        }\n        else{\n            const value = this.optionHandler.onBeforeDeselect(params);\n            if(value) {\n                this.dropdownDatapart.deleteSelectedOption(this.option);\n                this.optionHandler.onAfterDeselect(params);\n            }\n        }\n        // this.optionHandler.isMultiple() && this.updateCheckBox(isSelected);\n\n        (this.dropdownDatapart?.selectOption?.length != this.optionHandler?.getOptions()?.length) && this.dropdownHandler?.getSelectAllController()?.clearSelectAllCheckbox();  \n\n        this.refresh();\n\n        this.dropdownHandler.getDropdownComponent().applyFocusToActiveOption();\n        event.stopPropagation();\n    }\n\n    // updateCheckBox(isSelected : boolean){\n    //     this.comp.getCheckbox() && (this.comp.getCheckbox().checked = isSelected);\n    // }\n\n    selectOption(initiator : Intiator = \"API\"):void{\n        const isSelected = this.isSelected();\n        if(isSelected){\n            return;\n        }\n        else{\n            const params =  this.createParams(initiator, this.isBeforeSelectALL(1), false);\n            const value = this.optionHandler.onBeforeSelect(params);\n            if(value) {\n                this.dropdownDatapart.updateSelectedOptions(this.option);\n                this.optionHandler.onAfterSelect(params);\n                this.dropdownHandler.getDropdownComponent().applyFocusToActiveOption();\n            }\n            \n        }\n    }\n\n    deSelectOption(initiator : Intiator = \"API\"):void{\n        const isSelected = this.isSelected();\n        if(isSelected){ \n            const params =  this.createParams(initiator, this.isBeforeSelectALL(-1), false);\n            const value = this.optionHandler.onBeforeDeselect(params);\n            if(value) {\n                this.dropdownDatapart.deleteSelectedOption(this.option );\n                this.optionHandler.onAfterDeselect(params);\n            }  \n        }\n    }\n\n    private createParams(initiator : Intiator, selectALL : boolean, selectAllTriggered : boolean):any {\n        return{\n            value : this.option,\n            initiator,\n            selectAll           : selectALL,\n            selectAllTriggered: selectAllTriggered\n        }\n    }\n\n    private isSelected(){\n        return (this.dropdownDatapart.getDefaultSelectedOptions().includes(this.option?.id)) ? true : false;\n    }\n\n    getProperty():any{\n        return {\n            isMultiple   : ()=>this.optionHandler.isMultiple(),\n            selectedOptions : ()=>this.dropdownDatapart.getDefaultSelectedOptions(),\n            onAfterSelect : ()=>this.optionHandler.onAfterSelect(this.option),\n            id : this.option?.id,\n            // getOption : (optionDom: HTMLElement)=>this.getOption(optionDom),\n            getCheckboxConfig : ()=>{\n                const checkboxConfiguration = {\n                    readonly : false,\n                    checkboxSize : 20,\n                    borderRadius : 5,\n                    checkedFillColor : 'red',   \n                    checkedBorderColor : 'black',\n                    uncheckedBorderColor : 'green',\n                    uncheckedboxFillColor : 'grey',\n                    uncheckedBorderWidth : 1,\n                    checkedBorderWidth : 1,\n                    ariaLabel : 'checkbox',\n                    onclick : (event : Event)=>{\n                        this.clickOption(event,  this.dropdownDatapart.isSelectAll());\n                    }\n                }\n                return checkboxConfiguration;\n            },\n           value :  this.option.label ?? this.option.value,\n        };\n    }\n\n    // getOption(optionDom : HTMLElement):any{\n    //     if(this.option?.dropdownOptionRenderer){\n    //         const customOptionRenderer =  new this.option.dropdownOptionRenderer;\n    //         customOptionRenderer.init(this.createRendererParams());\n    //         optionDom.appendChild(customOptionRenderer.createElement());\n    //     }\n    //     else if(this.optionsHandler.isOptionAsChip()){\n\n    //         const chipConfig : IChipConfiguration= {\n    //             appendTo: optionDom,\n    //             label: this.option.label ?? this.option.value,\n    //             readOnly : true,\n    //             chipColor: this.option.color,\n    //         };\n\n    //         if(this.optionHandler.shouldShowTooltip()){\n    //             chipConfig.tooltip = this.optionHandler.shouldShowTooltip();\n    //             chipConfig.tooltipAppendto = this.optionHandler.getTooltipAppendto();\n    //             chipConfig.tooltipMessage = this.option.value;\n    //             chipConfig.tooltipRegex = this.optionHandler.getTooltipRegex();\n    //             chipConfig.tooltipPosition = this.optionHandler.getTooltipPosition();\n    //             chipConfig.tooltipHideDelay = this.optionHandler.getTooltipHideDelay();\n    //         }\n\n    //         new Chip(chipConfig);\n    //     }\n    //     else{\n    //         optionDom.innerText = `${this.option.label ??  this.option.value}`;\n    //     }\n    // }\n\n\n\n    updateSelectedOptions(){\n        this.dropdownDatapart.updateSelectedOptions(this.option);\n    }\n\n    getValue(){\n        return this.option;\n    }\n\n    // setRenderer(): void {\n    //     const componentDetails = this.UserComponentHandler.getDropdownOptionRendererDetails( this.item, this.createRendererParams() );\n    //     // this.comp.setRenderer(componentDetails);\n    // }\n\n    // private createRendererParams(): any {\n    //     return {\n    //         option :  this.option,\n    //         readonly : this.optionHandler.isReadOnly()\n    //     };\n    // }\n\n\n    focus():void{\n        this.comp.getElement().focus();\n        this.optionHandler.onFocus();\n    }\n\n    blur():void{\n        this.comp.getElement().blur();\n        this.optionHandler.onBlur();\n    }\n\n    setRendererDetails() : void {\n        \n        const rendererWrapper = this.createOptionRendererWrapper();\n        const params          = this.createRendererParam();\n        const  userDetails    = this.userComponentHandler.getDropdownOptionRendererDetails(rendererWrapper, params) as IComponentDetails;\n\n        this.comp.setRendererDetails(userDetails);\n    }\n\n    updateDisabled(disabled : boolean) : void {\n        this.option.disabled = disabled;\n        this.refresh();\n    }\n    private createOptionRendererWrapper() {\n        let renderer:any = DefaultLabelRenderer;\n        if(this.optionHandler.isOptionAsChip()){\n            renderer  = this.optionHandler.isMultiple()? DefaultMultiSelectChipRenderer : DefaultSingleSelectChipRenderer;\n        }\n        if(this.option.dropdownOptionRenderer){\n            renderer = this.option.dropdownOptionRenderer;\n        }\n        return {\n\t\t\tgetRenderer          : () => renderer,\n\t\t\tgetUserRendererParams: () => this.option.dropdownOptionRendererParams,\n\n\t\t};\n    }\n    private createRendererParam() {\n        return {\n\t\t\toption: this.option,\n            optionParams : this.option.dropdownOptionRendererParams, \n\t\t};\n    }\n\n}","import { PostConstruct,clearElement,queryAssignedNodes, removeFromParent} from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { SelectDropdownOptionCompType } from \"./dropdown-option.types\";\nimport { SelectDropdownOptionController } from \"./dropdown-option-controller\";\nimport { Checkbox } from \"../../../../Checkbox/checkbox\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nexport interface IRenderer<T = any>{\n    init?(param : T):void;\n    getGui():HTMLElement;\n    destroy?():void\n}\n\nconst optionTemplate = (_props:any): HTMLElement => {\n    const li = document.createElement(\"li\");\n    li.tabIndex = 0;\n\n//     const option_label = document.createElement(\"label\");\n//     option_label.className = \"dg-dropdown__option-label\";\n\n//    option_label.innerHTML = `\n//    <div class=\"dg-dropdown__option-label-text\" > ${prop.getOption()}</div>\n//    `;\n\n    // const option_label_text = document.createElement(\"div\");\n    // option_label_text.className = \"dg-dropdown__option-label-text\"\n    // option_label_text.textContent = props.value\n    // // prop.getOption(option_label_text);\n    // li.appendChild(option_label_text);\n\n//     if(prop.isMultiple()){\n//         checkbox(option_label);\n//     }   \n\n//     option_label.appendChild(option_label_text);\n// li.appendChild(option_label);\n    return li as HTMLElement;\n};\n\n// const checkbox = (appendTo: HTMLElement) => {\n//     const innerHtmlContent = `\n//     <input tabindex=\"-1\" type=\"checkbox\"  ref = \"checkbox\" class=\"dg-dropdown__option-checkbox-input\" role=\"checkbox\" aria-disabled=\"false\" aria-checked=\"true\" aria-label=\"checkbox\">\n//     <span class=\"dg-dropdown__option-checkbox-input--custom\" style=\"\n//                     --checked-border-color: black;\n//                     --checked-fill-color: red;\n//                     --unchecked-border-color: green;\n//                     \"></span>\n//     `;\n//     appendTo.insertAdjacentHTML(\"beforeend\", innerHtmlContent); // Append the inner HTML directly\n// };\n\n\n// function clearElement(el: HTMLElement): void {\n//     while (el && el.firstChild) { el.removeChild(el.firstChild); }\n// }\n\nexport class SelectDropdownOptionComponent extends Component{\n    @queryAssignedNodes('checkbox') checkbox !: any;\n    \n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    @PostConstruct()\n    init(){\n        const comp:SelectDropdownOptionCompType = {\n            getElement :()=>this.getGui(),\n            addOrRemoveCSSClass : (className:string) => this.addOrRemoveCSSClass(className),\n            getCheckbox: ()=>this.getCheckbox(),\n            getParentComp : ()=>this.getParentComponent(),\n            setRendererDetails : (rendererDetails: IComponentDetails)=>this.setRendererDetails(rendererDetails),\n            destroy : () => this.destroy()\n          \n        }\n        const controller = this.createBean(new SelectDropdownOptionController());\n        controller.setValue();\n        const props = controller.getProperty();\n        this.setTemplate(optionTemplate(props));\n\n        controller.setComp(comp); \n        // if(props.isMultiple()){\n            if(props.selectedOptions().includes(props.id)){\n                // props.isMultiple() && controller.updateCheckBox(true);\n                controller.updateSelectedOptions(); \n            }\n        // }\n\n        \n    }\n    private addOrRemoveCSSClass(className: string): void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    loadAfterRenderOption(defaultValue:boolean,props:any) {\n      const checkboxConfiguration =  props.getCheckboxConfig();\n      checkboxConfiguration.appendTo = this.getGui();\n      checkboxConfiguration.defaultValue = defaultValue;\n      return  new Checkbox(checkboxConfiguration);\n    }\n\n    getCheckbox(){\n        return this.checkbox;\n    }\n\n    getElement(): HTMLElement {\n        return this.getGui();\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutCellRenderer()\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer() {\n\t\tconst parentElement = this.getGui();\n        clearElement(parentElement);\n\t\t// this.setTemplate(RootownDropdowntTemplate());\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n    \n    destroy(): void {\n        this.getGui().remove();\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport {CSSRegistry} from \"../../modules/CSSRegistry\";\n\n// const globalNameSpace = CSSRegistry.getNameSpaces();\n\nexport function getDropdownRootUtilityClass(slots: { slot: string, modifiers: string[] }): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('dropdown', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\"\nimport { dropdownController } from \"../model/dropdown-handler\"\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DropdownRootCompType } from \"./dropdown-root-types\";\nimport { IDropdownDataPart } from \"../model/dropdown-ds\";\nimport { SelectDropdownOptionController } from \"../dropdown-option/dropdown-option-controller\";\nimport { IDropdownAPI } from \"../model/dropdown-api\";\nimport { DROPDOWN_DROPDWON_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { DropdownOptionElementModel } from \"../../../dropdown_configuration\";\nimport { DropdownUserComponentHandler } from \"../model/dropdown-user-component-handler\";\nimport { IDropdownOptionHandler } from \"../model/dropdown-option-handler.types\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\n\n// const useUtilityClasses = (ownerState : any ) =>{\n//     const slots = {\n//         root : {\n//             slot : 'root',\n//             modifiers : []\n//         },\n\n//     };\n//     return composeClasses(slots,getSelectRootUtilityClass)\n// }\n\n\nexport class SelectDropdownRootController extends EventEmitter{\n\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") dropdownHandler !: dropdownController;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n    @AutoWired(DROPDOWN_DROPDWON_BEAN_NAME.DROPDOWN_API) dropdownAPI!: IDropdownAPI;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: DropdownUserComponentHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n\n    comp         !: DropdownRootCompType;\n    activeOption !: SelectDropdownOptionController | null;\n    focusedExtraOption: 'none' | 'new' | null = null;\n    focusedIndex = -1;\n\n    setComponent(component: DropdownRootCompType) {\n        this.comp = component;\n        this.setRendererDetails();\n        this.dropdownHandler.registerDropdownComponent(this)\n        this.registerEvents();\n        // this.applyClasses();\n      \n        \n    }\n\n    getProperty(): any{\n        return {\n        }\n    }\n\n    init(){\n        this.dropdownHandler.registerDropdownComponent(this);\n    }\n\n    private registerEvents() : void {\n\n        \n        const searchComp =  this.dropdownHandler.getSearch();\n        \n        \n        this.addListener(this.comp.getGui(), 'keydown', (event: KeyboardEvent) => {\n\n\n\n            const isCharacter = event.key.length === 1 && /[a-zA-Z0-9]/.test(event.key);\n            if (isCharacter) {\n                searchComp?.focus();\n                return;\n            }\n            \n            switch(event.key){\n                case 'ArrowDown' :  \n                   event.preventDefault();\n                   this.moveNextOption();\n                   break;\n\n                case 'ArrowUp' :  \n                    event.preventDefault();\n                    this.movePreviousOption();\n                    break;\n\n                case 'Escape' : \n                    this.optionsHandler.onBeforeDropdownClose();\n                    break;\n                \n                case 'Enter' :\n                    if(this.focusedExtraOption == \"none\"){\n                        this.dropdownHandler.getDropdown().noneOption();\n                        event.stopPropagation();\n                    }\n                    else if(this.focusedExtraOption == \"new\"){\n                        this.dropdownHandler.getDropdown().addNewOption();\n                        event.stopPropagation();\n                    }\n                    else if(this.activeOption){\n                        this.activeOption.clickOption(event,  this.dropdownDatapart.isSelectAll());\n                    }\n                    else{\n                        this.optionsHandler.onBeforeDropdownClose();\n                    }\n                    break;\n                case ' ':\n                    event.preventDefault();\n                    break;\n\n                default : break;\n\n            }\n            this.optionHandler.onKeydown(event);\n        })\n    }\n\n    destroy(): void {\n        super.destroy();\n        this.comp.destroy();\n    }\n\n    focus(){\n        this.comp.getGui().focus({\n            preventScroll :true \n        });\n        this.optionHandler.onFocus();   \n    }\n\n    blur(){\n        this.comp.getGui().blur();\n        this.optionHandler.onBlur();\n    }\n\n    getElement(){\n        return this.comp.getGui();\n    }\n\n    resetActiveElement(){\n        this.activeOption?.comp.getElement().classList.remove('dg-dropdown__option-focused');\n        this.focusedIndex = -1;\n        this.activeOption = null;\n    }\n\n\n    moveNextOption(): void {\n        const noneOptionComp = this.dropdownHandler.getDropdown().getNoneOption() ?? null;\n        const newOptionComp = this.dropdownHandler.getDropdownCreateNewOptionController()?.getElement() ?? null;\n        const allOptions = this.dropdownDatapart.getAllOptions() ?? [];\n        const totalOptions = allOptions.length;\n    \n        this.clearFocus();\n    \n        // If only noneOption and newOption are available, handle circular navigation between them\n        if((totalOptions === 0) && noneOptionComp && newOptionComp) {\n            if (this.focusedExtraOption === 'none') {\n                // Move to newOption if we're on noneOption\n                this.focusedExtraOption = 'new';\n            } else {\n                // Otherwise, loop back to noneOption\n                this.focusedExtraOption = 'none';\n            }\n        }\n        else if (totalOptions === 0) {\n            newOptionComp && (this.focusedExtraOption = 'new');\n        } else {\n            // Handle cases where we have options in allOptions\n            if (this.focusedExtraOption === null && this.focusedIndex === -1) {\n                // Initial focus on noneOptionComp if available\n                this.focusedExtraOption = noneOptionComp ? 'none' : null;\n                this.focusedIndex = noneOptionComp ? -1 : 0;\n            } else if (this.focusedExtraOption === 'none') {\n                this.focusedExtraOption = null;\n                this.focusedIndex = 0;  // Move from noneOption to the first in allOptions\n            } else if (this.focusedIndex === totalOptions - 1) {\n                if (newOptionComp) {\n                    this.focusedExtraOption = 'new';\n                    this.focusedIndex = -1;\n                } else {\n                    this.focusedExtraOption = noneOptionComp ? 'none' : null;\n                    this.focusedIndex = noneOptionComp ? -1 : 0;\n                }\n            } else if (this.focusedExtraOption === 'new') {\n                this.focusedExtraOption = noneOptionComp ? 'none' : null;\n                this.focusedIndex = noneOptionComp ? -1 : 0;\n            } else {\n                this.focusedIndex++;\n            }\n        }\n    \n        this.applyFocus(noneOptionComp, newOptionComp, allOptions);\n    }\n    \n    movePreviousOption(): void {\n        const noneOptionComp = this.dropdownHandler.getDropdown().getNoneOption() ?? null;\n        const newOptionComp = this.dropdownHandler.getDropdownCreateNewOptionController()?.getElement() ?? null;\n        const allOptions = this.dropdownDatapart.getAllOptions() ?? [];\n        const totalOptions = allOptions.length;\n    \n        this.clearFocus();\n    \n        // Handle cases where we only have noneOption and newOption\n        if((totalOptions === 0) && noneOptionComp && newOptionComp) {\n            if (this.focusedExtraOption === 'new') {\n                this.focusedExtraOption = 'none';\n            } else {\n                this.focusedExtraOption = 'new';\n            }\n        }\n        else if (totalOptions === 0) {\n            newOptionComp && (this.focusedExtraOption = 'new');\n\n        } else {\n            // Handle cases where we have options in allOptions\n            if (this.focusedExtraOption === 'new') {\n                this.focusedExtraOption = null;\n                this.focusedIndex = totalOptions - 1;\n            } else if (this.focusedIndex === 0) {\n                // Move to noneOption if we're at the first item\n                this.focusedExtraOption = noneOptionComp ? 'none' : (newOptionComp ? 'new' : null);\n                this.focusedIndex = noneOptionComp || newOptionComp ? -1 : totalOptions - 1;\n            } else if (this.focusedExtraOption === 'none') {\n                // Move to newOption if available; otherwise, loop to last option\n                this.focusedExtraOption = newOptionComp ? 'new' : null;\n                this.focusedIndex = newOptionComp ? -1 : totalOptions - 1;\n            } else if (this.focusedIndex > 0) {\n                // Navigate within allOptions\n                this.focusedIndex--;\n            } else {\n                // Default fallback if focusedIndex is -1 or an unexpected value\n                this.focusedIndex = totalOptions - 1;\n            }\n        }\n    \n        this.applyFocus(noneOptionComp, newOptionComp, allOptions);\n    }\n    \n    \n    private clearFocus(): void {\n        if (this.focusedExtraOption === 'none') {\n            this.dropdownHandler.getDropdown().getNoneOption()?.classList.remove('dg-dropdown__option-focused');\n        } else if (this.focusedExtraOption === 'new') {\n            this.dropdownHandler.getDropdownCreateNewOptionController()?.getElement()?.classList.remove('dg-dropdown__option-focused');\n        } else if (this.activeOption) {\n            this.activeOption.comp.getElement().classList.remove('dg-dropdown__option-focused');\n        }\n    }\n    \n    \n    applyFocus(\n        noneOptionComp: HTMLElement | null,\n        newOptionComp: HTMLElement | null,\n        allOptions: DropdownOptionElementModel[]\n    ): void {\n        if (this.focusedExtraOption === 'none' && noneOptionComp) {\n            noneOptionComp.classList.add('dg-dropdown__option-focused');\n            // noneOptionComp.focus();\n            noneOptionComp.scrollIntoView({ block: 'nearest' })\n        } else if (this.focusedExtraOption === 'new' && newOptionComp) {\n            newOptionComp.classList.add('dg-dropdown__option-focused');\n            // newOptionComp.focus();\n            newOptionComp.scrollIntoView({ block: 'nearest' })\n        } else if (this.focusedIndex >= 0 && allOptions.length > 0) {\n            this.applyFocusToActiveOption();\n        }\n    }\n\n    applyFocusToActiveOption(): void {\n            this.activeOption = this.dropdownDatapart.getOptionController(this.focusedIndex);\n            this.activeOption?.comp.getElement().classList.add('dg-dropdown__option-focused');\n            // this.activeOption?.comp.getElement().focus()\n            this.activeOption?.comp.getElement().scrollIntoView({ block: 'nearest' });\n    }\n\n    resetFocuesdOption() : void{\n        this.focusedExtraOption = null;\n        this.focusedIndex = -1;\n        this.clearFocus();\n    }\n\n     setHoveredOption(extraOption: 'none' | 'new' | null, index: number): void {\n        this.clearFocus();\n        this.focusedExtraOption = extraOption;\n        this.focusedIndex = index;\n    \n        const noneOptionComp = this.dropdownHandler.getDropdown().getNoneOption() ?? null;\n        const newOptionComp = this.dropdownHandler.getDropdownCreateNewOptionController()?.getElement()  ?? null;\n        const allOptions = this.dropdownDatapart.getAllOptions() ?? [];\n        \n        this.applyFocus(noneOptionComp, newOptionComp, allOptions);\n    }\n\n    setRendererDetails() : void {\n        \n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails    = this.userComponentHandler.getDropdownRendererDetails(rendererWrapper, params) as IComponentDetails;\n\n        this.comp.setRendererDetails(userDetails);\n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionHandler.getDropdownRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionHandler.getDropdownRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionHandler.getDropdownRendererParams(),\n\t\t};\n    }\n\n    \n\n}","\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { SelectDropdownRootController } from \"./dropdown-root-controller\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { DropdownRootCompType } from \"./dropdown-root-types\";\n\n\n \n\nconst dropdownTemplate = ()=>{\n\treturn `<div tabindex=\"0\">\t </div> ` \n}\n\nconst ownDropdown = ()=>{\n\treturn `<div tabindex=\"0\">\n\t<select-dropdown> </select-dropdown></div> ` \n}\n\n\nfunction RootownDropdowntTemplate() : HTMLElement {\n\tconst div = document.createElement('div');\n\tconst template = ownDropdown();\n\tdiv.innerHTML = template ;\n\treturn div.firstChild as HTMLElement;\n}\n\nfunction RootTemplate(_props :any) : HTMLElement {\n\tconst div = document.createElement('div');\n\tconst template = dropdownTemplate();\n\tdiv.innerHTML = template ;\n\treturn div.firstChild as HTMLElement;\n}\n\nexport class SelectDropdownRootComponent extends Component{\n\n\tprivate renderer       : any;\n\tprivate rendererElement: any;\n\n\t// private appendTo: HTMLElement | null;\n\tconstructor(_appendTo : HTMLElement | undefined){\n\t\tsuper();\n\t\t// this.appendTo = _appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst component :DropdownRootCompType ={\n\t\t\tgetGui : () =>this.getGui(),\n\t\t\taddOrRemoveCssClass : (className :string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className),\n\t\t\tsetRendererDetails : (rendererDetails: IComponentDetails)=>this.setRendererDetails(rendererDetails),\n            destroy : () => this.destroy()\n\t\t}\n\t\tconst controller  =  this.createManagedBean(new SelectDropdownRootController());\n        \n\t\tconst props =  controller.getProperty();\n\t\tconst template =  RootTemplate(props);\n\t\tthis.setTemplate(template);\n\n        controller.setComponent(component);\n\n\t\t// this.appendElementIntoUserDom();\n\n\t}\n\tprivate addOrRemoveCSSClass(className : string ): void{\n\t\tconst element = this.getGui();\n\t\telement && (element.className =  className);\n\t}\n\n\t// private appendElementIntoUserDom() :void{\n\t// \tconst eGui = this.getGui();\n\t// \tthis.appendTo && this.appendTo.appendChild(eGui);\n\t// \tthis.addDestroyFunc(()=>{\n\t// \t\tthis.appendTo?.remove();\n\t// \t\tthis.appendTo = null;\n\t// \t})\n\t// }\n\n\n\n\tprivate setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutCellRenderer()\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer() {\n\t\tconst parentElement = this.getGui();\n        clearElement(parentElement);\n\t\tthis.setTemplate(RootownDropdowntTemplate());\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t\tthis.renderer.afterElementAttached && this.renderer.afterElementAttached();\n\t\t}\n\t}\n\n\n    destroy(): void {\n        this.getGui()?.remove();\n    }\n\n}","import { EventEmitter } from '@dg/corecomponent/EventEmitter.js';\nimport {SearchCompType} from \"./dropdown-search.types\"\nimport { AutoWired, BEAN_NAME, setAriaControls, setAriaDisabled, setAriaLabel } from '@dg/corecomponent';\nimport { IDropdownDataPart } from '../model/dropdown-ds';\nimport { dropdownController } from '../model/dropdown-handler';\nimport { IDropdownOptionHandler } from '../model/dropdown-option-handler.types';\n// import { composeClasses } from '@dg/utils';\n// import { getDropdownRootUtilityClass } from '../dropdown-root/dropdown-root-classes';\n\n// const useUtilityClasses =  (_ownerState : any) =>{\n//     // const {disabled, readonly} = ownerState;\n//     const slots ={\n//         root : {\n//             slot : 'search',\n//             modifiers:[\n//             ],\n//         },\n//     };\n//     return composeClasses(slots,getDropdownRootUtilityClass);\n// }\n\nexport class SearchController extends EventEmitter{\n    comp!: SearchCompType;\n    dropdown:any;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownCtrlHandler !: dropdownController;\n    \n\n\n    setComp(comp:SearchCompType){\n        this.comp = comp;\n        this.registerSearch();\n        // this.applyClasses();\n        this.registerEvents();\n        this.setAriaAttributes();\n        this.setDisableState();\n        this.addListener(this.eventHandler, 'EVENT_OPTION_LOADED', this.setDisableState.bind(this));\n        // this.createOptions();\n    }\n\n    private registerSearch(){\n        this.dropdownCtrlHandler.registerSearch(this);\n    }\n\n    setDisableState() : void {\n        const element = this.comp.getElement();\n        const isLoaded = this.dropdownDatapart.getIsLoaded();\n        setAriaDisabled(element, !isLoaded);\n        element.classList.toggle('dg-dropdown__search--disables', !isLoaded);\n\n        element.disabled = !isLoaded;\n    }\n\n    private setAriaAttributes() {\n        const element = this.comp.getElement();\n        setAriaLabel(element,\"search options\")\n        setAriaControls(element,\"dropdown-listbox\")\n    }\n\n    // private applyClasses() : void {\n    //     const ownerState = this.getOwnerState();\n    //     const classes = useUtilityClasses(ownerState);\n    //     this.comp.addOrRemoveCSSClass(classes.root);\n    // }\n\n    // private getOwnerState() {\n    //     return {\n    //     }\n\t// }\n\n    // private refresh() : void {\n    //     this.applyClasses();\n\n    // }\n\n     getProperty(){\n        return {\n            options : this.optionHandler.getOptions(),\n            searchBoxPlaceholder : this.optionHandler.getSearchBoxPlaceholder(),\n        }\n    }\n\n    private registerEvents() : void {\n        this.addListener(this.comp.getElement(),'input', (event:any) => {\n            this.optionHandler.onKeydown(event);\n            this.searchInput();\n        });\n\n        this.addListener(this.comp.getElement(),'click', (event) => {\n            this.focus();\n            event.stopPropagation();\n        });\n        this.addListener(this.comp.getElement(),'keydown', (event:any) => {\n            if(event.key === ' ') {\n                event.stopPropagation();\n            }\n        });\n    }\n\n    searchInput():void{\n        const searchComp =  this.comp.getElement() as HTMLInputElement;\n        this.dropdownDatapart.filterOptions(searchComp.value);\n        this.dropdownCtrlHandler.getDropdown().updateDropdownOption(searchComp.value);\n\n        this.dropdownCtrlHandler.getDropdownComponent().resetActiveElement();\n        if(searchComp.value){\n            this.dropdownCtrlHandler.getDropdownComponent().resetFocuesdOption();\n            this.dropdownCtrlHandler.getDropdownComponent().moveNextOption();\n        }\n    }\n\n    focus(){\n        this.comp.getElement().focus({\n            preventScroll :true \n        });\n        this.optionHandler.onFocus();  \n    }\n\n\n    blur(){\n        this.comp.getElement().blur();\n        this.optionHandler.onBlur();\n    }\n\n    clearsearch(){\n        this.comp.getElement().value = '';\n    }\n\n    onSearch(value : string){\n        this.comp.getElement().value = value;\n        this.searchInput();\n    }\n    \n    getValue():string{\n        const searchComp =  this.comp.getElement() as HTMLInputElement;\n        return   searchComp.value;\n    }\n\n}","import { Component } from \"@dg/corecomponent/Component.js\";\nimport { PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { SearchCompType } from \"./dropdown-search.types\";\nimport {SearchController} from \"./dropdown-search-controller\"\n\nconst search = (props: any): HTMLElement => {\n    const searchBlock = document.createElement(\"label\");\n    searchBlock.style.position = \"relative\";\n    searchBlock.classList.add(\"dg-dropdown__search-wrapper\");\n\n    \n    const searchInput = document.createElement(\"input\");\n    // Assigning ref property to the element (not an actual HTML attribute)\n    (searchInput as any).setAttribute('ref', \"search-input\");\n    searchInput.type = \"text\";\n    searchInput.tabIndex = 0;\n    searchInput.classList.add(\"dg-dropdown__search\");\n    searchInput.placeholder = props.searchBoxPlaceholder || \"Find the option\";\n    searchInput.setAttribute(\"aria-label\", \"Search options\");\n    searchInput.setAttribute(\"aria-controls\", \"dropdown-listbox\");\n\n    const searchIcon = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    searchIcon.setAttribute(\"width\", \"14\");\n    searchIcon.setAttribute(\"height\", \"14\");\n    searchIcon.setAttribute(\"viewBox\", \"4 3 21 21\");\n    searchIcon.classList.add(\"dg-dropdown__search-icon\");\n\n    const gLayer2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n    gLayer2.setAttribute(\"data-name\", \"Layer 2\");\n\n    const gLayer11 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n    gLayer11.setAttribute(\"data-name\", \"Layer 11\");\n\n    const path1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    path1.setAttribute(\n        \"d\",\n        \"M20.53 19.47l-1.9-1.91a7.26 7.26 0 10-1.07 1.07l1.91 1.9a.75.75 0 001.06 0 .75.75 0 000-1.06zM13 18.75A5.75 5.75 0 1118.75 13 5.76 5.76 0 0113 18.75z\"\n    );\n\n    const path2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n    path2.setAttribute(\"fill\", \"none\");\n    path2.setAttribute(\"d\", \"M0 0h26v26H0z\");\n\n    gLayer11.append(path1, path2);\n    gLayer2.appendChild(gLayer11);\n    searchIcon.appendChild(gLayer2);\n\n    // Append elements\n    searchBlock.append(searchInput, searchIcon);\n\n    return searchBlock;\n};\n \n\n\n\nexport class SearchComponent extends Component {\n\n    @queryAssignedNodes('search-input') searchInputComp !: any;\n\n    @PostConstruct()\n    init(){\n\n        const controller = this.createManagedBean(new SearchController());\n        const props = controller.getProperty();\n        const searchInput = search(props);\n        const comp:SearchCompType = {\n            getElement :()=>this.getSearchInputComp() as HTMLInputElement,\n            addOrRemoveCSSClass : (className:string) => this.addOrRemoveCSSClass(className),\n        }\n        this.setTemplate(searchInput);\n        controller.setComp(comp);\n    }\n\n    private addOrRemoveCSSClass(className:string):void{\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    getSearchInputComp():HTMLElement{\n        return this.searchInputComp;\n    }\n\n\n}","import {SelectAllCompType} from \"./dropdown-selectAll.types\"\nimport { AutoWired, BEAN_NAME, setAriaDisabled, setAriaSelected } from '@dg/corecomponent';\nimport { IDropdownDataPart } from '../model/dropdown-ds';\nimport { dropdownController } from '../model/dropdown-handler';\nimport { composeClasses } from '@dg/utils';\nimport { getDropdownRootUtilityClass } from '../dropdown-root/dropdown-root-classes';\nimport { SelectDropdownOptionController } from '../dropdown-option/dropdown-option-controller';\nimport { AbstractController } from '../../../../utility/abstract-controller';\nimport { IDropdownOptionHandler } from \"../model/dropdown-option-handler.types\";\n\nconst useUtilityClasses =  (_ownerState : any) =>{\n    // const {disabled, readonly} = ownerState;\n    const slots ={\n        root : {\n            slot : 'option-select-all',\n            modifiers:[\n                // disabled && 'disabled',\n                // readonly &&'readonly',\n            ],\n        },\n    };\n    return composeClasses(slots,getDropdownRootUtilityClass);\n}\n\nexport class SelectAllController extends AbstractController<SelectAllCompType>{\n    comp!: SelectAllCompType;\n    dropdown:any;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownCtrlHandler !: dropdownController;\n\n\n    setComp(comp:SelectAllCompType){\n        this.comp = comp;\n        this.applyClasses();\n        this.setAriaAttributes();\n        this.registerEvents();\n        this.dropdownCtrlHandler.registerSelectAllController(this);\n        this.setDisableState();\n        this.updateSelectALLClassname();\n        this.setNoOptionState();\n\n        this.addListener(this.eventHandler, 'EVENT_OPTION_LOADED',() => {\n            this.setDisableState();\n            this.setNoOptionState();\n            this.updateSelectALLClassname();\n        });\n\n        this.addListener(this.eventHandler, 'EVENT_DATA_UPDATED', () => {\n            this.setNoOptionState();\n        })\n\n\n    }\n\n    setDisableState() : void {\n        const element = this.comp.getElement();\n        const isLoaded = this.dropdownDatapart.getIsLoaded();\n        setAriaDisabled(element, !isLoaded);\n        element.classList.toggle('dg-dropdown__select-all--disables', !isLoaded);\n        const checkboxElement = this.comp.getSelectAllCheckbox();\n        if(checkboxElement) {\n            setAriaDisabled(checkboxElement, !isLoaded);\n        }\n    }\n\n    setNoOptionState(): void {\n        const element = this.comp.getElement();\n        element.classList.toggle('dg-dropdown__select-all--no-options', !(this.dropdownDatapart.getAllOptions().length > 0));\n    }\n\n\n    private setAriaAttributes() {\n        const element = this.comp.getElement();\n        // setAriaLabel(element,\"select all\")\n        setAriaSelected(element, false);\n        setAriaDisabled(element, false);\n    }\n\n    private applyClasses() : void {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n    }\n\n    private getOwnerState() {\n        return {\n            // disabled: this.optionHandler.isDisabled(),\n            // readonly: this.optionHandler.isReadOnly(),\n        }\n\t}\n\n    // private refresh() : void {\n    //     this.applyClasses();\n\n    // }\n\n     getProperty(){\n        return {\n            options : this.optionHandler.getOptions(),\n        }\n    }\n\n    private registerEvents() : void {\n        this.addListener(this.eventHandler, 'EVENT_OPTION_SELECTION_UPDATED', this.updateSelectALLClassname.bind(this));\n        this.addListener(this.comp.getElement(),'click', (event) => {\n            event.preventDefault();\n            const isSelectAll = this.dropdownDatapart.isSelectAll();\n            const options = this.dropdownDatapart.getAllOptions() ;\n            const beforeSelectALL = this.optionHandler.onBeforeSelectAll({ isSelectAll: !isSelectAll, event: event, options : options })\n            if(beforeSelectALL) {\n                if (this.dropdownDatapart.getIsLoaded()) {\n                    if (!isSelectAll) {\n                        this.selectAll(event);\n                        this.comp.getSelectAllCheckbox().checked = true;\n                    } else {\n                        this.deSelectAll(event);\n                        this.dispatchEvent({ type: \"clearOptions\" });\n                        this.comp.getSelectAllCheckbox().checked = false;\n                    }\n\n                    this.optionHandler.onSelectAll({\n                        isSelectAll: !isSelectAll,\n                        event      : event,\n                        options    : options\n                    });\n\n                    this.updateSelectALLClassname();\n\n                     this.optionHandler.onAfterSelectAll({\n                        isSelectAll: !isSelectAll,\n                        event      : event,\n                        options    : options\n                    });\n                }\n            }\n           \n            \n        });\n\n        this.addListener(this.eventHandler, 'unCheckSelectAll',()=>{\n            this.comp.getSelectAllCheckbox().checked = false;\n        })\n\n        this.addListener(this.eventHandler, 'EVENT_OPTION_REMOVED',() => {\n            this.updateSelectALLClassname();\n            this.updateSelectALL()\n        })\n\n         this.addListener(this.eventHandler, 'EVENT_OPTION_ADDED',() => {\n            this.updateSelectALLClassname();\n            this.updateSelectALL()\n        })\n    }\n\n    private updateSelectALLClassname() : void {\n        const element = this.comp?.getElement();\n        if(element) {\n            const isSelectAll = this.dropdownDatapart.isSelectAll();\n            const hasSelection = this.dropdownDatapart.getSelectedOptions().length !== 0;\n\n            element.classList.toggle('dg-dropdown__option--selected', isSelectAll);\n            element.classList.toggle('dg-checkbox--indeterminate', !isSelectAll && hasSelection);\n        }\n    }\n\n    private updateSelectALL() : void {\n        this.comp.getSelectAllCheckbox().checked = this.dropdownDatapart.isSelectAll();\n    }\n\n    clearSelectAllCheckbox(){\n        this.comp.getSelectAllCheckbox().checked = false;\n    }\n\n    selectAll(event:Event){\n        const getAllOptionsIntance:SelectDropdownOptionController[] =  this.dropdownDatapart.getAllOptionsIntance();\n        const selectedOptions = this.dropdownDatapart.getSelectedOptions();\n        for(let index=0;index<getAllOptionsIntance.length;index++){\n            if(!selectedOptions.includes(getAllOptionsIntance[index].getValue())){\n                !getAllOptionsIntance[index].option.disabled && getAllOptionsIntance[index].clickOption(event, true, true, true);\n            }\n   \n        }\n    }\n\n    deSelectAll(event:Event){\n        const allOptions = this.dropdownDatapart.getAllOptionsIntance();\n        const selectedValues = this.dropdownDatapart.getSelectedOptions();\n\n        for (let i = 0; i < allOptions.length; i++) {\n            const option = allOptions[i];\n            const value = option.getValue();\n\n            if (selectedValues.includes(value) && !option.option.disabled) {\n                option.clickOption(event, false, true, true);\n            }\n        }\n    }\n\n    focus(){\n        this.comp.getElement().focus();      \n    }\n    \n\n}","import { Component } from \"@dg/corecomponent/Component.js\";\nimport { PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { SelectAllController} from \"./dropdown-selectAll-controller\"\nimport { SelectAllCompType } from \"./dropdown-selectAll.types\";\n\nconst selectAll = (_props: any): HTMLElement => {\n    const div = document.createElement(\"div\");\n    div.tabIndex = 0;\n    div.classList.add(\"dg-dropdown__option\", \"dg-dropdown__option-select-all\");\n    div.role = \"option\";\n    div.setAttribute(\"aria-selected\", \"false\");\n    div.setAttribute(\"aria-disabled\", \"false\");\n\n    const label = document.createElement(\"label\");\n    label.classList.add(\"dg-dropdown__option-label\");\n\n    const checkbox = document.createElement(\"input\");\n    checkbox.type = \"checkbox\";\n    checkbox.classList.add(\"dg-dropdown__option-checkbox-input\");\n    checkbox.role = \"checkbox\";\n    checkbox.tabIndex = -1;\n    checkbox.setAttribute(\"aria-disabled\", \"false\");\n    checkbox.setAttribute(\"aria-checked\", \"false\");\n    checkbox.setAttribute(\"aria-label\", \"checkbox\");\n    checkbox.setAttribute('ref', 'selectAll-checkbox');\n\n    const customCheckbox = document.createElement(\"span\");\n    customCheckbox.classList.add('dg-checkbox__input--custom');\n    customCheckbox.classList.add(\"dg-dropdown__option-checkbox-input--custom\");\n\n    const text = document.createElement(\"div\");\n    text.classList.add(\"dg-dropdown__option-label-text\");\n    text.textContent = \"Select All\";\n\n    // Appending elements\n    label.appendChild(checkbox);\n    label.appendChild(customCheckbox);\n    label.appendChild(text);\n    div.appendChild(label);\n\n    return div;\n};\n\n\nexport class SelectAllComponent extends Component {\n \n    @queryAssignedNodes('selectAll-checkbox') selectAllCheckbox !: any;\n\n    @PostConstruct()\n    init(){\n\n        const controller = this.createManagedBean(new SelectAllController());\n        const props = controller.getProperty();\n        const selectAllComp = selectAll(props);\n        const comp:SelectAllCompType = {\n            getElement :()=>this.getGui(),\n            addOrRemoveCSSClass : (className:string) => this.addOrRemoveCSSClass(className),\n            getSelectAllCheckbox : ()=>this.getSelectAllCheckbox(),\n        }\n        this.setTemplate(selectAllComp);\n        controller.setComp(comp);\n    }\n\n    private addOrRemoveCSSClass(className:string):void{\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n\n    getSelectAllCheckbox():any{\n        return this.selectAllCheckbox;\n    }\n\n\n    \n\n\n}","import {DropdownCompType} from \"./dropdown.types\"\nimport { AutoWired, BEAN_NAME, setAriaRole } from '@dg/corecomponent';\nimport { IDropdownDataPart } from '../model/dropdown-ds';\nimport { dropdownController } from '../model/dropdown-handler';\nimport { getDropdownRootUtilityClass } from '../dropdown-root/dropdown-root-classes';\nimport { composeClasses } from '@dg/utils';\nimport { IDropdownOptionHandler } from '../model/dropdown-option-handler.types';\nimport { AbstractController } from '../../../../utility/abstract-controller';\nimport { DropdownOptionElementModel } from \"../../../dropdown_configuration\";\n\nconst useUtilityClasses = (_ownerState : any) =>{\n    // const {disabled, readonly} = ownerState;\n    const slots ={\n        root : {\n            slot : 'options-listbox',\n            modifiers:[\n                // disabled && 'disabled',\n                // readonly &&'readonly',\n            ],\n        },\n\n    };\n    return composeClasses(slots, getDropdownRootUtilityClass);\n}\n\nexport class DropdownController extends AbstractController<DropdownCompType>{\n    comp!: DropdownCompType;\n    dropdown:any;\n    parentComp :any;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: IDropdownOptionHandler;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") protected dropdownCtrlHandler !: dropdownController;\n    \n\n\n    setComp(comp:DropdownCompType){\n        this.comp = comp;\n        this.registerDropdownElement(this.comp.getElement());\n        this.registerParentComp();\n        this.applyClasses();\n        this.setAriaAttributes();\n        this.registerEvents();\n        // this.registerCreateNewOptionEvent();\n        this.registerNoneOptionEvent();\n\n        this.addListener(this.eventHandler, 'EVENT_OPTION_LOADED', this.reRender.bind(this));\n    }\n    registerDropdownElement(_dropdown:any):void{\n        this.dropdownCtrlHandler.registerDropdown(this);\n    }\n\n    registerParentComp():void{\n        this.parentComp =  this.comp.getParentComp();\n    }\n\n    private setAriaAttributes() {\n        const element = this.comp.getElement();\n        setAriaRole(element,\"listbox\");\n    }\n\n    private applyClasses() : void {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n    }\n\n    refresh() : void {\n        this.applyClasses();\n        // this.registerNoneOptionEvent();\n    }\n\n    private getOwnerState() {\n        return {\n        //     disabled: this.optionHandler.isDisabled(),\n        //     readonly: this.optionHandler.isReadOnly(),\n            multiple: this.optionHandler.isMultiple()\n        }\n\t}\n     getProperty(){\n        return {\n            options : this.dropdownDatapart.getAllOptions(),\n            isVirtualList : this.optionHandler.isVirtualListEnabled(),\n            isNoneOptionEnabled : this.optionHandler.isNoneOptionEnabled(),\n            isCreateNewOptionEnabled : this.optionHandler.isCreateNewOptionEnabled(),\n            // isAddCollaboratorEnabled : this.optionHandler.isAddCollaboratorEnabled(),\n            isMultiple                : this.optionHandler.isMultiple(),\n            isLoaded : this.dropdownDatapart.getIsLoaded()\n        }\n    }\n\n    registerEvents():void{\n        this.addListener(this.eventHandler,\"clearAllSelectedOptions\", ()=>{this.clearAllSelectedOptions()});\n        this.addListener(this.eventHandler,\"clearOptions\", ()=>{this.clearOptions()});\n    }  \n\n    // registerCreateNewOptionEvent():void{\n    //     const newOptionButton  =  this.dropdownCtrlHandler.getDropdownCreateNewOptionController()?.getElement();\n    //     newOptionButton && newOptionButton.addEventListener('click',(event)=>{\n    //         this.addNewOption();\n    //         this.dropdownCtrlHandler.getSearch().focus();\n    //         event.stopPropagation();\n    //     })\n\n    //     newOptionButton && newOptionButton.addEventListener(\"mouseover\",(_event)=>{\n    //         this.dropdownCtrlHandler.getDropdownComponent().setHoveredOption('new', -1)\n    //      });\n    // }\n\n    registerNoneOptionEvent():void{\n        const noneOptionComp = this.comp.getNoneOptionComp();\n        noneOptionComp && noneOptionComp.addEventListener('click',(event)=>{\n            this.noneOption();\n            event.stopPropagation();\n        })\n        noneOptionComp && noneOptionComp.addEventListener(\"mouseenter\",(_event)=>{\n            this.dropdownCtrlHandler.getDropdownComponent().setHoveredOption('none', -1)\n         });\n    }\n\n    noneOption():void{\n        if(this.optionHandler.isMultiple()){\n            const selectedOption :  DropdownOptionElementModel[] = this.dropdownDatapart.getSelectedOptions();\n            for(let index = 0;index < selectedOption.length; index++){\n                this.optionHandler.onAfterDeselect(selectedOption[index]);\n            }\n            this.clearAllSelectedOptions();\n        \n        }\n        else{\n            const selectedOption :  DropdownOptionElementModel[] = this.dropdownDatapart.getSelectedOptions();\n            this.optionHandler.onAfterDeselect(selectedOption[0]);\n            this.clearAllSelectedOptions();\n            this.optionHandler.onBeforeDropdownClose();\n        }\n    }\n\n    updateDropdownOption(newOption:string){\n        this.comp.renderFilteredOptions(this.parentComp,this,newOption);\n        this.registerNoneOptionEvent();\n    }\n\n    updateVirtualList(){\n        this.comp.updateVirtualList();\n    }\n\n    clearAllSelectedOptions(){\n        this.dropdownDatapart.deleteAllSelectedOptions();\n        const optionsInstance = this.dropdownDatapart.getAllOptionsIntance();\n        if(this.optionHandler.isMultiple()){\n            for(let index = 0; index < optionsInstance.length; index++){\n                // optionsInstance[index].updateCheckBox(false);\n                optionsInstance[index].refresh();\n            }\n            this.dispatchEvent({\n                type : \"unCheckSelectAll\"\n            });\n        }\n        else{\n            for(let index = 0; index < optionsInstance.length; index++){\n                optionsInstance[index].deSelectOption();\n                optionsInstance[index].refresh();\n\n            }\n        }\n\n    }\n\n    clearOptions(){\n        // this.dropdownDatapart.deleteAllSelectedOptions();\n        const optionsInstance = this.dropdownDatapart.getAllOptionsIntance();\n        for(let index = 0; index < optionsInstance.length; index++){\n            // optionsInstance[index].updateCheckBox(false);\n            optionsInstance[index].refresh();\n            this.optionHandler.onAfterSelect(optionsInstance[index].getValue());\n        }\n        this.dispatchEvent({\n            type : \"unCheckSelectAll\"\n        });\n    }\n\n    addNewOption() {\n\n        let newValue : string | DropdownOptionElementModel= this.dropdownCtrlHandler.getSearch().getValue();\n    \n        if (!newValue || newValue === '') {\n            return; // Exit if no value\n        }\n\n        const onBeforeCreateOptionHook = this.optionHandler?.onBeforeCreateOption?.({ value: newValue });\n    \n        if (typeof onBeforeCreateOptionHook === 'boolean') {\n            if (!onBeforeCreateOptionHook) {\n                // this.dropdownDatapart.reset();\n                // this.comp.rerenderer(this.comp.getParentComp(), this);\n                // this.dropdownCtrlHandler.getSearch().clearsearch();\n                return;\n            }\n        } else if (typeof onBeforeCreateOptionHook === 'object' || onBeforeCreateOptionHook) {\n            newValue = onBeforeCreateOptionHook;\n        }\n    \n        this.optionHandler?.onCreateOption?.(newValue);\n        (typeof newValue === 'object') ?  this.addOption(newValue) : this.addOption({id : newValue, value : newValue});\n        this.dropdownCtrlHandler.getSearch().searchInput();\n        this.optionHandler?.onAfterCreateOption?.(newValue);\n    }\n\n    selectOption(newValue :string | DropdownOptionElementModel){\n        if (typeof newValue === 'string') {\n            this.dropdownDatapart.selectOption(newValue);\n        } else  if (typeof newValue === 'object')  {\n            this.dropdownDatapart.selectOption(newValue?.id);\n        }\n    }\n\n    addOption(option : DropdownOptionElementModel){\n        // if (typeof option === 'string') {\n        //     this.optionHandler.addOption({ id: option,value : option});\n        // } else if (typeof option === 'object') {\n        //     this.optionHandler.addOption(option);\n        // }\n        this.dropdownDatapart.addOptions([option]);\n        this.reRender();\n        this.selectOption(option.id);\n        this.dropdownCtrlHandler.getSearch().searchInput();\n        this.dropdownCtrlHandler.getSearch().focus();\n    }\n\n    removeOption(option : string | DropdownOptionElementModel){\n        \n        if (typeof option === 'string') {\n            this.dropdownDatapart.removeOptions([{ id: option}]);\n        } else if (typeof option === 'object') {\n            this.dropdownDatapart.removeOptions([option]);\n        }\n        this.reRender();\n        this.dropdownCtrlHandler.getSearch().searchInput();\n    }\n    \n    reRender(){\n        const searchElement = this.dropdownCtrlHandler.getSearch();\n        if(searchElement) {\n            searchElement.focus();\n        };\n        this.dropdownDatapart.reset();\n        this.comp.rerenderer(this.comp.getParentComp(), this);\n    }\n    \n\n    getNoneOption(): HTMLElement | undefined{\n        return this.comp.getNoneOptionComp();\n    }\n\n    // getNewOption(): HTMLElement | undefined{\n    //     return this.comp.getNewOptionButton();\n    // }\n\n\n}","import { ElementVirtualList } from \"../../../../VirtualList/ElementVirtualList\";\n\nexport interface IElementVirtualListModel {\n    //CRUD methods\n\tgetElement(index : Number) : HTMLElement;\n    appendTo(): HTMLElement;\n\n\t//check methods\n    getIndexesToDraw(indexToDraw: number[])                         : number[];\n    keepRowVirtualized(index: number)                               : boolean;\n    isRowToDraw(index: number)                                      : boolean;\n    getBufferSize()                                                 : number;\n    getDefaultHeight()                                              : number;\n    scrollToTop()                                                   : void;\n    getHeight()                                                     : number;\n    isHeightAsNull()                                                : boolean;\n    isSuppressScrollOnNewData()                                     : boolean;\n    isSuppressVirtualisation()                                      : boolean;\n    getFirstRow()                                                   : number;\n    getLastRow()                                                    : number;\n    getIndexByPosition(pixel : number, position ?: 'first' | 'last'): number;\n    isLoading(index : number)                                       : boolean;\n    getContainer()                                                  : HTMLElement;\n\n\t//events\n\tonViewPortChange(viewPort: IViewPort): void;\n\tonDisplayChanged()                   : void;\n\tonHeightChanged?(height: number)     : void;\n\tonHeightScaleChanged?()              : void;\n}\n\ninterface IViewPort {\n    fromIndex : number;\n    toIndex : number;\n}\n\nexport class List implements IElementVirtualListModel{\n    axis : DropdownAxis;\n    appendContainer : HTMLElement;\n    selectDropdown !: HTMLElement;\n    constructor(axis : DropdownAxis, appendContainer : HTMLElement, parentContainer : HTMLElement) {\n        this.axis = axis;\n        this.appendContainer = appendContainer;\n        this.selectDropdown = parentContainer;\n        parentContainer.addEventListener('scroll', () => {\n            dummy.refresh();\n        })\n    }\n    getElement(index: number): HTMLElement {\n        const top = this.axis.getTop(index);\n        const height = this.axis.getDefaultHeight();\n        const data = this.axis.getData(index);\n        data.style.position = \"absolute\";\n        data.style.top = `${top}px`;\n        data.style.left = `0px`;    \n        data.style.height = `${height}px`;\n        return data;\n    }\n    appendTo(): HTMLElement {\n        return this.appendContainer;\n    }\n    getIndexesToDraw(indexToDraw: number[]): number[] {\n        return indexToDraw;\n    }\n    keepRowVirtualized(_index: number): boolean {\n        return false;\n    }\n    isRowToDraw(_index: number): boolean {\n        return true;\n    }\n    getBufferSize(): number {\n        return 2;\n    }\n    getDefaultHeight(): number {\n        return this.axis.getDefaultHeight();\n    }\n    // Need to change as refresh\n    scrollToTop(): void {\n        // onScroll\n\n        // New Data changes\n        // \n    }\n    // getTotalContainerHeight\n    getHeight(): number {\n        return this.axis.getTotalHeight();\n    }\n    isHeightAsNull(): boolean {\n        return false;\n    }\n    isSuppressScrollOnNewData(): boolean {\n        return false;\n    }\n    isSuppressVirtualisation(): boolean {\n        return false;\n    }\n    getFirstRow(): number {\n        return 0;\n    }\n    getLastRow(): number {\n        return this.axis.getLastRow();\n    }\n    getIndexByPosition(pixel: number, position?: \"first\" | \"last\"): number {\n        return this.axis.getIndexByPosition(pixel, position);\n    }\n    // check if needed\n    isLoading(_index: number): boolean {\n        return false;\n        throw new Error(\"Method not implemented.\");\n    }\n    getContainer(): HTMLElement {\n        return this.selectDropdown;\n    }\n    onViewPortChange(_viewPort: IViewPort): void {\n        // console.log(\"onViewPortChange\", viewPort)\n    }\n    onDisplayChanged(): void {\n        // throw new Error(\"Method not implemented.\");\n    }\n    onHeightChanged(height: number): void {\n        this.appendContainer.style.height = `${height}px`;\n    }\n    onHeightScaleChanged(): void {\n        // throw new Error(\"Method not implemented.\");\n    }\n}\n\nclass DropdownAxis{\n    data : Array<HTMLElement>\n    height : number\n    constructor(data : Array<HTMLElement>, {height} :{height:number}){\n        this.data = data;\n        this.height = height;        \n    }\n    getTotalHeight(){\n        return this.data.length * this.height\n    }\n    getData(index : number) : HTMLElement{\n        return this.data[index];\n    }\n    getLastRow(){\n        return this.data.length-1;\n    }\n    getDefaultHeight() : number{\n        return this.height;\n    }\n    getIndexByPosition(pixel: number, _position?: \"first\" | \"last\"): number {\n        return Math.floor(pixel / this.height);\n    }\n    getTop(index : number) : number{\n        return (index) * this.height;\n    }\n}\n\n\nconst dummy = new ElementVirtualList();\nexport function createVirtualList(data:HTMLElement[],selectDropdown:HTMLElement){\n    const axis = new DropdownAxis(data, {height:50});\n\n    // const dummyelement = document.createElement('ul');\n    // selectDropdown.appendChild(dummyelement);\n    // dummyelement.style.position = \"absolute\";\n    // dummyelement.style.width = \"100%\";\n    // dummyelement.className = \"dg-dropdown__options-listbox\";\n\n    // selectDropdown.style.position = \"relative\";\n    selectDropdown.style.width = \"100%\";\n    selectDropdown.classList.add(\"dg-dropdown__virtual-scroll\");\n\n    const list = new List(axis,selectDropdown, selectDropdown);\n    dummy.setModel(list);\n    dummy.refreshAfterModelUpdate({});\n    return dummy;\n}   ","import { Component } from \"@dg/corecomponent/Component.js\";\nimport { PostConstruct } from \"@dg/corecomponent\";\nimport { DropdownCompType } from \"./dropdown.types\";\nimport {DropdownController} from \"./dropdown-controller\"\nimport { createVirtualList } from \"./dropdown-list\";\nimport { DropdownOptionElementModel } from \"../../../dropdown_configuration\";\n\n\n\n\n\n\nconst dropdown = (props: any,newOption ?: string) =>{\n    const selectDropdown = document.createElement(\"ul\");\n    selectDropdown.tabIndex = 0;\n\n    if(!props.isLoaded) {\n        const element = document.createElement('dropdown-loading');\n        selectDropdown.appendChild(element);\n    }else {\n\n        if(props.isNoneOptionEnabled && !(newOption)){\n            selectDropdown.appendChild(createNoneOptionComp());\n        }\n\n        (props.options.length <=0 && !newOption && props.isMultiple) &&  selectDropdown.appendChild(createNoResultFoundComp());\n\n        for(let i = 0; i < props.options.length; i++) {\n            const option = document.createElement('select-option'); \n            selectDropdown.appendChild(option);\n        }\n\n        const typedValue = newOption;\n        if (typedValue) {\n\n            const matchWithoutCase = props.options.some(\n                (option: DropdownOptionElementModel) =>\n                    option.value?.toLowerCase().trim() === typedValue.toLowerCase().trim()\n            );\n\n            // Always allow create-new if typed doesn't exactly match any option (case-sensitive or case-insensitive)\n            if (props.isCreateNewOptionEnabled && !matchWithoutCase) {\n                const dropdownCreateNewOption = document.createElement('dropdown-create-newoption');\n                selectDropdown.appendChild(dropdownCreateNewOption);\n            }else if(newOption && (!props.options.some((option: DropdownOptionElementModel) => option.value!.toLowerCase().includes(newOption.toLowerCase()) ))){\n                selectDropdown.appendChild(createNoResultFoundComp());\n            }\n        }\n\n        \n    }\n    return selectDropdown as HTMLElement;\n}\n\n\n// const createNewOptionComp = (newOption : string): HTMLElement =>{\n//     const createNewOption =  document.createElement(\"li\");\n//     createNewOption.setAttribute(\"ref\", \"createNewOption\");\n//     createNewOption.classList.add(\"dg-dropdown__option\");\n//     createNewOption.classList.add(\"dg-dropdown__option-create\");\n//     createNewOption.innerHTML = \n//     `<button class=\"dg-dropdown__option-label\">\n//             <span class=\"dg-dropdown__option-create-icon\">+</span>\n//             Create a option named \n//             <span class=\"dg-dropdown__option-create-text\">${newOption}</span>\n//     </button>\n//     `;\n//     return createNewOption as HTMLElement;\n// }\n\n// const addCollaboratorComp = (_newOption : string): HTMLElement =>{\n//     const createNewOption =  document.createElement(\"li\");\n//     createNewOption.setAttribute(\"ref\", \"createNewOption\");\n//     createNewOption.classList.add(\"dg-dropdown__option\");\n//     createNewOption.classList.add(\"dg-dropdown__option-create\");\n//     createNewOption.classList.add(\"dg-dropdown__option-create--collaborator\");\n//     createNewOption.innerHTML = \n//     `<button class=\"dg-dropdown__option-label\">\n//             <span class=\"dg-dropdown__option-label-text\">+ Add Collaborator</span>\n//     </button>\n//     `;\n//     return createNewOption as HTMLElement;\n// }\n\nconst createNoneOptionComp = (): HTMLElement => {\n    const li = document.createElement(\"li\");\n    li.setAttribute(\"ref\", \"noneOption\");\n    li.classList.add(\"dg-dropdown__option\", \"dg-dropdown__option-none\");\n\n    const label = document.createElement(\"label\");\n    label.classList.add(\"dg-dropdown__option-label\");\n\n    const labelText = document.createElement(\"div\");\n    labelText.classList.add(\"dg-dropdown__option-label-text\");\n    labelText.textContent = \"None\";\n\n    label.appendChild(labelText);\n    li.appendChild(label);\n\n    return li;\n};\n\n\nconst createNoResultFoundComp = ()=>{\n    // const noResultFoundComp =  document.createElement(\"li\");\n    // noResultFoundComp.setAttribute(\"ref\", \"noResultFound\");\n    // noResultFoundComp.classList.add(\"dg-dropdown__option\");\n    // noResultFoundComp.classList.add(\"dg-dropdown__option-no-result-found\");\n    // noResultFoundComp.innerHTML = \n    // `<label class=\"dg-dropdown__option-label\">\n    //   <div class=\"dg-dropdown__option-label-text\">No Option</div>\n    // </label>\n    // `;\n\n    const noOptionComp = document.createElement('dropdown-no-option');\n    return noOptionComp as HTMLElement;\n}\n\nexport class DropdownComponent extends Component {\n\n    @PostConstruct()\n    init(){\n        const comp:DropdownCompType = this.getComponent();\n        const controller = this.createManagedBean(new DropdownController());\n        const props = controller.getProperty();\n        const dropdownComp = dropdown(props);  \n        this.setTemplate(dropdownComp);\n        controller.setComp(comp);\n    }\n\n    updateVirtualList(){\n        const dropdownElement = this.getGui();\n        const optionElements :HTMLElement[] = [];\n        while (dropdownElement.firstChild) {\n            optionElements.push(dropdownElement.firstChild as HTMLElement) ;\n            dropdownElement.removeChild(dropdownElement.firstChild);\n        }\n        createVirtualList(optionElements,dropdownElement);\n    }\n\n    private addOrRemoveCSSClass(className:string):void{\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    getComponent():DropdownCompType{\n        return {\n            getElement :()=>this.getGui(),\n            addOrRemoveCSSClass : (className:string) => this.addOrRemoveCSSClass(className),\n            renderFilteredOptions : (parentComp:any,controller:DropdownController,newOption:string) => this.renderFilteredOptions(parentComp,controller,newOption),\n            getParentComp : ()=>this.getParentComponent(),\n            rerenderer :(parentComp:any,controller:DropdownController)=> this.rerenderer(parentComp,controller),\n            updateVirtualList : ()=> this.updateVirtualList(),\n            getNoneOptionComp : () => this.getNoneOptionComp(),\n        };\n    }\n\n    renderFilteredOptions(parentComp:any,controller:DropdownController,newOption:string){\n        const props =  controller.getProperty();\n        this.destroy();\n        this.setTemplate(dropdown(props,newOption));\n        parentComp.appendChild(this.getGui());\n        controller.refresh();\n        props.isVirtualList && this.updateVirtualList();\n    }\n\n    rerenderer(parentComp:any,controller:DropdownController):void{\n        const props =  controller.getProperty();\n        this.destroy();\n        this.setTemplate(dropdown(props));\n        parentComp.appendChild(this.getGui());\n        controller.refresh()\n        props.isVirtualList && this.updateVirtualList();\n    }\n\n    protected destroy(): void {\n\t\tthis.getGui().remove();    \n\t}\n\n    // getNewOptionButton():HTMLElement{\n    //     let newOptionButton = this.getGui().querySelector('[ref=\"createNewOption\"]');\n    //     return newOptionButton as HTMLElement;\n    // }\n\n    getNoneOptionComp(): HTMLElement{\n        let noneOption = this.getGui().querySelector('[ref=\"noneOption\"]');\n        return noneOption as HTMLElement;\n    }\n}","import { AutoWired, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { dropdownController } from \"./dropdown-handler\";\nimport {IDropdownDataPart} from \"./dropdown-ds\";\nimport { DROPDOWN_DROPDWON_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { Intiator, DropdownOptionElementModel } from \"../../../dropdown_configuration\";\n\nexport interface IDropdownAPI{\n    destroy():void;\n    clear():void;\n    onSearch(value : string):void;\n    autoFocusSelectedOption() :void;\n\n    getElement():HTMLElement,\n    clear():void,\n    select(option : string  | DropdownOptionElementModel, initiator ?: Intiator):void,\n    deselect(option : string  | DropdownOptionElementModel, initiator ?: Intiator):void,\n    getSelectedOptions():DropdownOptionElementModel[],\n\n\n    destroy():void,\n    focus():void,\n    autoFocusSelectedOption():void,\n    blur():void\n\n    updateVirtualList():void,\n    updateSelectedOption(options:DropdownOptionElementModel[]):void,\n    addOptions(options:string[] | DropdownOptionElementModel[]):void,\n    removeOptions(options:string[] | DropdownOptionElementModel[]):void,\n    onSearch(value : string):void\n    disableOptions(optionIDs : string[]) : void;\n    enableOptions(optionIDs : string[]) : void;\n}\n@Bean(DROPDOWN_DROPDWON_BEAN_NAME.DROPDOWN_API)\nexport class DropdownAPI extends EventEmitter implements IDropdownAPI {\n\n    @AutoWired(\"DROPDOWN_CONTROLLER_HANDLER\") dropdownHandler !: dropdownController;\n    @AutoWired(\"Dropdown_Datapart\") protected dropdownDatapart !: IDropdownDataPart;\n    \n\n    getElement():HTMLElement{\n        return this.dropdownHandler.getDropdownComponent().getElement();\n    }\n\n    clear():void{\n        this.dropdownHandler.getDropdown().clearAllSelectedOptions();\n    }\n\n    select(option : string  | DropdownOptionElementModel , initiator:Intiator =  \"API\"):void{\n        if (typeof option === 'string') {\n            this.dropdownDatapart.selectOption(option,initiator);\n        } else  if (typeof option === 'object')  {\n            this.dropdownDatapart.selectOption(option?.id, initiator);\n        }\n\n        this.dispatchEvent({\n            type : \"EVENT_OPTION_ADDED\"\n        })\n    }\n\n    deselect(option : string  | DropdownOptionElementModel, initiator:Intiator =  \"API\"):void{\n        if (typeof option === 'string') {\n            this.dropdownDatapart.deSelectOption(option,initiator);\n        } else  if (typeof option === 'object')  {\n            this.dropdownDatapart.deSelectOption(option?.id,initiator);\n        }\n         this.dispatchEvent({\n            type : \"EVENT_OPTION_REMOVED\"\n        })\n    }\n\n    getSelectedOptions():DropdownOptionElementModel[]{\n        return this.dropdownDatapart.getSelectedOptions();\n    };\n\n\n    //Common APIs\\\n    destroy():void{\n        const dropdownController =  this.dropdownHandler.getDropdownComponent();\n           if(dropdownController){\n               dropdownController.destroy();\n           }\n    }\n   \n   \n    focus():void{\n        const searchController = this.dropdownHandler.getSearch();\n        const isLoaded =this.dropdownDatapart.getIsLoaded();\n        if(searchController && isLoaded){\n            searchController.focus();\n        }\n        else{\n            this.dropdownHandler.getDropdownContainer()?.focus();\n        }\n    }\n\n    autoFocusSelectedOption():void{\n        this.dropdownDatapart.autoFocusSelectedOption();\n        const searchController = this.dropdownHandler.getSearch();\n        searchController?.focus();\n    }\n\n    blur():void{\n        const searchController = this.dropdownHandler.getSearch();\n        if(searchController){\n            searchController.blur();\n        }\n        else{\n            this.dropdownHandler.getDropdownContainer().blur();\n        }\n    }\n\n    updateVirtualList():void{\n\n        const dropdownController =  this.dropdownHandler.getDropdown();\n        if(dropdownController){\n            dropdownController.updateVirtualList();\n        }\n    }\n\n    updateSelectedOption(options:DropdownOptionElementModel[]):void{\n        this.dropdownDatapart.setSelectedOption(options);\n    }\n\n    addOptions(options:string[] | DropdownOptionElementModel[]):void{\n        options.forEach(option => {\n            (typeof option === 'object') ? this.dropdownHandler.getDropdown().addOption(option) : this.dropdownHandler.getDropdown().addOption({id : option, value : option});\n        });\n        // this.dropdownHandler.getDropdown()?.reRender();\n        // this.dropdownHandler.getSearch()?.focus();\n    }\n\n    removeOptions(options:string[] | DropdownOptionElementModel[]):void{\n        options.forEach(option => {\n            this.dropdownHandler.getDropdown().removeOption(option);\n        });\n        this.dropdownHandler.getDropdown().reRender();\n        this.dropdownHandler.getSearch()?.focus();\n    }\n\n    onSearch(value : string):void{\n        this.dropdownHandler.getSearch()?.onSearch(value)\n    }\n\n    disableOptions(optionIDs : string[]) : void {\n        this.dropdownDatapart.setOptionsDisabled(optionIDs, true);\n    }\n\n    enableOptions(optionIDs : string[]) : void {\n        this.dropdownDatapart.setOptionsDisabled(optionIDs, false);\n    }\n\n    hasOption(optionID : string) : boolean {\n        return this.dropdownDatapart.hasOption(optionID)\n    }\n}\n","import { AutoWired, BEAN_NAME, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { SelectDropdownOptionController } from \"../dropdown-option/dropdown-option-controller\";\nimport { Intiator, DropdownOptionElementModel } from \"../../../dropdown_configuration\";\nimport { IDropdownOptionHandler } from \"./dropdown-option-handler.types\";\n\nexport interface IDropdownDataPart{\n    getOption()                                                               : any,\n    getAllOptions()                                                           : DropdownOptionElementModel[],\n    filterOptions(value:string)                                               : void,\n    getFilteredOptions()                                                      : DropdownOptionElementModel[],\n    getOptionController(index:number)                                         : SelectDropdownOptionController,\n    updateOptionsController(optionController : SelectDropdownOptionController): void,\n    getOptionIndex()                                                          : number,\n    setSelectedOption(options:DropdownOptionElementModel[])                   : void,\n    getSelectedOptions()                                                      : DropdownOptionElementModel[],\n    getAllOptionsIntance()                                                    : SelectDropdownOptionController[],\n    updateSelectedOptions(option:DropdownOptionElementModel)                  : void,\n    deleteSelectedOption(option:DropdownOptionElementModel)                   : void,\n    deleteAllSelectedOptions()                                                : void,\n    getDefaultSelectedOptions()                                               : string[],\n    selectOption (selectedOption:string,initiator ?:Intiator )                : void,\n    deSelectOption(selectedOption:string,initiator ?:Intiator )               : void,\n    updateFilteredOptions(option : DropdownOptionElementModel)                : void,\n    reset()                                                                   : void,\n    autoFocusSelectedOption()                                                 : void\n    getIsLoaded()                                                             : boolean;\n    isSelectAll()                                                             : boolean;\n    getOptions()                                                              : DropdownOptionElementModel[]\n    removeOptions(options: DropdownOptionElementModel[])                      : void;\n    addOptions(options: DropdownOptionElementModel[])                         : void;\n    setOptionsDisabled(optionIDs: string[], disabled: boolean)                : void\n    hasOption(optionID : string)                                              : boolean;\n\n}\n\n\n@Bean(\"Dropdown_Datapart\")\nexport class DropdownDataPart extends EventEmitter implements IDropdownDataPart{\n\n    optionsController    : SelectDropdownOptionController[] = [];\n    options              : DropdownOptionElementModel[] = [];\n    elementsValue        : number = 0;\n    filteredOptions      : DropdownOptionElementModel[] = [];\n    selectedOptions      : DropdownOptionElementModel[] = [];\n\n    \n    // options             !: DropdownOptionElementModel[];\n    // elementsValue       !: number;\n    // optionIds           !: string[];\n    // optionsController   !: any;\n    // filteredOptions     !: any;\n    // selectedOptions     !: any;\n\n    private isLoaded : boolean = false;\n\n\n\n\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected dropdownOptionHandler!: IDropdownOptionHandler;\n\n    sortByValueAscending = (a: { value?: string }, b: { value?: string }): number => {\n        if (!a?.value || !b?.value) return 0; \n        if (a.value.toLowerCase() < b.value.toLowerCase()) return -1;\n        if (a.value.toLowerCase() > b.value.toLowerCase()) return 1;\n        return 0;\n    };\n    sortByValueDescending = (a: { value?: string }, b: { value?: string }): number => {\n        if (!a?.value || !b?.value) return 0; \n        if (a.value.toLowerCase() > b.value.toLowerCase()) return -1;\n        if (a.value.toLowerCase() < b.value.toLowerCase()) return 1;\n        return 0;\n    };\n\n\n\n    @PostConstruct()\n    init(){\n        const model = this.optionsHandler.getDropdownModel();\n        const options = this.optionsHandler.getOptions()\n        if(model === 'remote' && typeof options === 'function') {\n            options({\n                onSuccess : (data : DropdownOptionElementModel[]) => {\n                    this.optionsController = [];\n                    this.options = data;\n                    this.elementsValue = 0;\n                    this.dropdownOptionHandler.isSortEnabled() && this.sortOptions(this.dropdownOptionHandler.getSortOrder() ??  \"asc\");\n                    this.options.forEach(opt => {\n                        opt.selected = this.selectedOptions.some(sel => sel.value === opt.value);\n                    });\n                    this.filteredOptions =  this.options.map((option:DropdownOptionElementModel)=> option);\n                    this.selectedOptions = [];\n\n                    this.isLoaded = true;\n\n                    this.dispatchEvent({\n                        type : \"EVENT_OPTION_LOADED\"\n                    })\n                },\n                onFailure : () => {\n\n                }\n            })\n        }else {\n            this.optionsController = [];\n            this.options = this.optionsHandler.getOptions();\n            this.elementsValue = 0;\n            this.dropdownOptionHandler.isSortEnabled() && this.sortOptions(this.dropdownOptionHandler.getSortOrder() ??  \"asc\");\n            this.options.forEach(opt => {\n                opt.selected = this.selectedOptions.some(sel => sel.value === opt.value);\n            });\n            this.filteredOptions =  this.options.map((option:DropdownOptionElementModel)=> option);\n            this.selectedOptions = [];\n            this.isLoaded = true;\n        }\n       \n    }\n\n    getOption(){\n        const option = this.filteredOptions[this.elementsValue];\n        this.elementsValue++;\n        return option;\n    }\n\n    getAllOptions():DropdownOptionElementModel[]{\n        return this.filteredOptions;\n    }\n\n    getOptionIndex():number{\n        return this.elementsValue;\n    }\n\n    filterOptions(value:string){\n        const options = this.options.map((option:any)=> option);\n        this.filteredOptions = options.filter((option:DropdownOptionElementModel) => option?.value?.toLowerCase().includes(value.toLowerCase()));\n        this.elementsValue = 0;\n        this.optionsController= [];\n        this.dispatchEvent({\n            type : \"EVENT_DATA_UPDATED\"\n        })\n    }\n\n    updateFilteredOptions(option : DropdownOptionElementModel):void {\n        this.filteredOptions.push(option);\n    }\n\n    getFilteredOptions(){\n        return this.filteredOptions;\n    }\n\n    getOptionController(index:number) : SelectDropdownOptionController{\n        return this.optionsController[index];\n    }\n\n    updateOptionsController(optionController : SelectDropdownOptionController) :  void{\n        this.optionsController.push(optionController);\n    }\n\n    setSelectedOption(options:DropdownOptionElementModel[]):void{\n        this.selectedOptions = options;\n    }\n\n    getSelectedOptions(): DropdownOptionElementModel[]{\n        return this.selectedOptions;\n    }\n\n    updateSelectedOptions(option:DropdownOptionElementModel):void{\n        if (!this.selectedOptions.find(({ id }) => id === option.id)) {\n            option.selected = true;\n            this.selectedOptions.push(option);\n            this.dispatchEvent({\n                type : 'EVENT_OPTION_SELECTION_UPDATED'\n            })\n        }\n    }\n\n    deleteSelectedOption(option:DropdownOptionElementModel):void{\n        const index = this.selectedOptions.indexOf(option);\n        if(index > -1){\n            option.selected = false;\n            this.selectedOptions.splice(index, 1);\n             this.dispatchEvent({\n                type : 'EVENT_OPTION_SELECTION_UPDATED'\n            })\n        }\n    }\n\n    deleteAllSelectedOptions():void{\n        this.selectedOptions = [];\n    }\n\n    getAllOptionsIntance():SelectDropdownOptionController[]{\n        return this.optionsController;\n    }\n\n    sortOptions(sortOrder:string){\n        let sortedOptions:any[];\n        if(sortOrder === 'none'){\n            this.options =  this.optionsHandler.getOptions();\n        }\n        else{\n            sortedOptions = (sortOrder==\"asc\") ? this.options.sort(this.sortByValueAscending) : this.options.sort(this.sortByValueDescending);\n            this.options = sortedOptions;\n        }\n    }\n\n    getDefaultSelectedOptions():string[]{\n        const selectedOptionsData  = this.dropdownOptionHandler.getSelectedData();\n        return selectedOptionsData ?? [];\n    }\n\n    // used for select and deselect option via api \n\n    getOptionControllerByOption(selectedOptionId: string): SelectDropdownOptionController | null {\n        const index = this.optionsController.findIndex(\n            controller => controller.getValue().id === selectedOptionId\n        );\n\n        return index >= 0 ? this.optionsController[index] : null;\n    }\n\n    selectOption (selectedOptionId:string, initiator :Intiator = \"API\"):void{\n        const selectedOptionController = this.getOptionControllerByOption(selectedOptionId);\n        selectedOptionController?.selectOption(initiator);\n        selectedOptionController?.refresh();\n    }\n    \n    deSelectOption(selectedOptionId: string, initiator: Intiator = \"API\"): void {\n        const selectedOptionController = this.getOptionControllerByOption(selectedOptionId);\n\n        if (selectedOptionController) {\n            // Case 1: Controller exists for this option\n            selectedOptionController.deSelectOption(initiator);\n            selectedOptionController.refresh();\n        } else {\n            const option = this.options.find(option => option.id === selectedOptionId);\n\n            if (!option) {\n                return;\n            }\n\n            const params = this.createParams(option, initiator, this.isBeforeSelectALL(-1), false);\n            const canDeselect = this.optionsHandler.onBeforeDeselect(params);\n\n            if (canDeselect) {\n                this.deleteSelectedOption(option);\n                this.optionsHandler.onAfterDeselect(params);\n            }\n        }\n    }\n\n    reset():void{\n        this.optionsController = [];\n        this.elementsValue = 0\n        this.dropdownOptionHandler.isSortEnabled() && this.sortOptions(this.dropdownOptionHandler.getSortOrder() ??  \"none\");\n        this.filteredOptions =  this.options.map((option:DropdownOptionElementModel)=> option);\n    }\n\n    autoFocusSelectedOption() : void{\n        if(this.selectedOptions.length > 0 &&  this.optionsHandler.isautoFocusSelectedOptionEnabled()){\n            const selectedOptionId = this.selectedOptions[0]?.id;\n            const optionController = this.getOptionControllerByOption(selectedOptionId);\n            optionController?.setHoveredOption();\n        }\n    }\n\n    getIsLoaded() : boolean {\n        return this.isLoaded;\n    }\n\n    isSelectAll(): boolean {\n        const enabledOptions = this.options.filter(opt => !opt.disabled);\n        const selectedEnabled = enabledOptions.filter(opt => this.selectedOptions.includes(opt));\n\n        return enabledOptions.length > 0 && enabledOptions.length === selectedEnabled.length;\n    }\n\n    getOptions() :DropdownOptionElementModel[] {\n        return this.options;\n    }\n\n    addOptions(options : DropdownOptionElementModel[]) : void {\n        this.options.push(...options);\n    }\n\n    removeOptions(options: DropdownOptionElementModel[]): void {\n        const idsToRemove = new Set(options.map(opt => opt.id));\n        this.options = this.options.filter(opt => !idsToRemove.has(opt.id));\n    }\n\n   setOptionsDisabled(optionIDs: string[], disabled: boolean): void {\n        this.options.forEach((option) => {\n            if (optionIDs.includes(option.id)) {\n                option.disabled = disabled;\n                const controller = this.getOptionControllerByOption(option.id);\n                if(controller) {\n                    controller.updateDisabled(disabled);\n                }\n            }\n        });\n    }\n\n    hasOption(optionID : string) : boolean {\n        if(this.filteredOptions.length !== 0) {\n            return this.filteredOptions.some((option) => option.id === optionID);\n        }\n\n        return false;\n    }\n\n    private isBeforeSelectALL(count:number) : boolean {\n        return this.getSelectedOptions().length + count === this.getOptions().length;\n    }\n\n    private createParams(option : DropdownOptionElementModel, initiator : Intiator, selectALL : boolean, selectAllTriggered : boolean):any {\n        return{\n            value : option,\n            initiator,\n            selectAll           : selectALL,\n            selectAllTriggered: selectAllTriggered\n        }\n    }\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Bean } from \"@dg/corecomponent\";\nimport { SelectDropdownRootController } from \"../dropdown-root/dropdown-root-controller\";\nimport { DropdownController } from \"../dropdown/dropdown-controller\";\nimport { DropdownContainerController } from \"../dropdown-container/dropdownContainer-controller\";\nimport { SearchController } from \"../dropdown-search/dropdown-search-controller\";\nimport { SelectAllController } from \"../dropdown-selectAll/dropdown-selectAll-controller\";\nimport { DropdownCreateNewOptionController } from \"../dropdown-create-newoption/dropdown-create-newoption-controller\";\n\n@Bean(\"DROPDOWN_CONTROLLER_HANDLER\")\nexport class dropdownController extends EventEmitter{\n    private dropdownRootController !: SelectDropdownRootController;\n    private dropdownController !: DropdownController;\n    private dropdownContainerHandler  !: DropdownContainerController;\n    private searchController !: SearchController;\n    private selectAllController !: SelectAllController;\n    private dropdownCreateNewOptionController !: DropdownCreateNewOptionController;\n\n\n    registerDropdownComponent(dropdownRootController : SelectDropdownRootController) : void {\n        this.dropdownRootController = dropdownRootController;\n    }\n\n    getDropdownComponent() : SelectDropdownRootController{\n        return this.dropdownRootController;\n    }\n\n    registerDropdown(dropdownController : DropdownController) : void {\n        this.dropdownController = dropdownController;\n    }\n\n    getDropdown() : DropdownController{\n        return this.dropdownController;\n    }\n\n    registerDropdownContainer(dropdownContainerHandler : DropdownContainerController) : void {\n        this.dropdownContainerHandler = dropdownContainerHandler;\n    }\n\n    getDropdownContainer() : DropdownContainerController{\n        return this.dropdownContainerHandler;\n    }\n\n    registerSearch(searchController : SearchController) : void {\n        this.searchController = searchController;\n    }\n\n    getSearch() : SearchController{\n        return this.searchController;\n    }\n\n    registerSelectAllController(selectAllController : SelectAllController) : void {\n        this.selectAllController = selectAllController;\n    }\n\n    getSelectAllController() : SelectAllController{\n        return this.selectAllController;\n    }\n\n    registerDropdownCreateNewOptionController(dropdownCreateNewOptionController : DropdownCreateNewOptionController) : void {\n        this.dropdownCreateNewOptionController = dropdownCreateNewOptionController;\n    }\n\n    getDropdownCreateNewOptionController() : DropdownCreateNewOptionController{\n        return this.dropdownCreateNewOptionController;\n    }\n}\n","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { DROPDOWN_DROPDWON_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { IDropdownOptionHandler } from \"./dropdown-option-handler.types\";\nimport {  DropdownOptionElementModel, IDropdownConfiguration, SelectAllEventParams } from \"../../../dropdown_configuration\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\nimport { Position } from \"../../../../utility/PopupHandler/CorePopupHandler\";\n\n\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class DropDownOptionHandler extends EventEmitter implements IDropdownOptionHandler {\n    onCreateCustomOption(_option: any) {\n        throw new Error(\"Method not implemented.\");\n    }\n\n\t@AutoWired(DROPDOWN_DROPDWON_BEAN_NAME.DROPDOWN_CONFIGURATION)\n\tconfiguration!: IDropdownConfiguration;\n\n    private domKey = `_DG_${Math.random().toString()}`;\n\n\n    getDomKey(): string {\n\t\treturn this.domKey;\n\t}\n\n\tgetDomData(element: Node | null, key: string): any {\n        if(!element) {\n            return;\n        }\n        const domData = (element as any)[this.getDomKey()];\n\t\treturn domData ? domData[key] : undefined;\n\t}\n\n\tsetDomData(element: Element, key: string, value: any): any {\n\t\tconst domKey = this.getDomKey();\n\t\tlet domData = (element as any)[domKey];\n\n\t\tif (!domData) {\n\t\t\tdomData = {};\n\t\t\t(element as any)[domKey] = domData;\n\t\t}\n\n\t\tdomData[key] = value;\n\t}\n\n    // Getter methods for configuration properties\n    getOptions(): DropdownOptionElementModel[] | ((params : any) => void) | undefined {\n        return this.configuration.options;\n    }\n\n    isMultiple(): boolean {\n        return this.configuration.multiple ?? false;\n    }\n\n    getSelectedData(): string[] | undefined {\n        return this.configuration.selectedData?.();\n    }\n\n    getSelectionLimit(): number | undefined {\n        return this.configuration.selectionLimit;\n    }\n\n    isCloseOnSelect(): boolean {\n        return this.configuration.closeOnSelect ?? true;\n    }\n\n    getDropdownAppendTo(): HTMLElement {\n        return this.configuration.dropdownAppendTo ?? document.body;\n    }\n\n    isSearchable(): boolean {\n        return this.configuration.searchable ?? false;\n    }\n    \n    getSearchBoxPlaceholder(): string {\n        return this.configuration.searchBoxPlaceholder?? '';\n    }\n\n    isVirtualListEnabled(): boolean {\n        return this.configuration.virtualList ?? false;\n    }\n\n    isSortEnabled(): boolean {\n        return this.configuration.sort ?? false;\n    }\n\n    getSortOrder(): 'asc' | 'desc' | undefined {\n        return this.configuration.sortOrder;\n    }\n\n    isGroupByEnabled(): boolean {\n        return this.configuration.groupBy ?? false;\n    }\n\n    isSelectAllButtonEnabled(): boolean {\n        return this.configuration.selectAllButton ?? false;\n    }\n\n    isClearableEnabled(): boolean {\n        return this.configuration.clearable ?? false;\n    }\n\n    isAcceptNewValuesEnabled(): boolean {\n        return this.configuration.acceptNewValues ?? false;\n    }\n\n    getNewValuePattern(): RegExp | undefined {\n        return this.configuration.newValuePattern;\n    }\n\n    getValidation(): ((value: any) => boolean) | undefined {\n        return this.configuration.validation;\n    }\n\n    // Event handlers\n    onBeforeDropdownOpen(): void {\n        this.configuration.onBeforeDropdownOpen?.();\n    }\n\n    onAfterDropdownOpen(): void {\n        this.configuration.onAfterDropdownOpen?.();\n    }\n\n    onBeforeDropdownClose(focus?:boolean): void {\n        this.configuration.onBeforeDropdownClose?.(focus);\n    }\n\n    onAfterDropdownClose(): void {\n        this.configuration.onAfterDropdownClose?.();\n    }\n\n    onBeforeSelect(params : any): boolean {\n        return this.configuration.onBeforeSelect?.(params) ?? true;\n    }\n\n    onAfterSelect(params :any): void {\n        this.configuration.onAfterSelect?.(params);\n    }\n\n    onBeforeDeselect(params : any): boolean {\n        return this.configuration.onBeforeDeselect?.(params ) ?? true;\n    }\n\n    onAfterDeselect(params: any): void {\n        this.configuration.onAfterDeselect?.(params);\n    }\n\n    onChange(params:any): void {\n        this.configuration.onChange?.(params);\n    }\n    onCreateOption(newOption:any){\n        this.configuration.onCreateOption?.(newOption);\n    }\n\n    onBeforeCreateOption(option:any): any{\n        return this.configuration.onBeforeCreateOption?.(option)?? true;\n    }\n\n    onAfterCreateOption(option:any): any{\n        return this.configuration.onAfterCreateOption?.(option)?? true;\n    }\n\n    onKeydown(event:KeyboardEvent):void{\n        this.configuration.onKeydown?.(event);\n    }\n\n    addOption(newOption : DropdownOptionElementModel): void {\n        this.configuration.options?.push(newOption);\n    }\n\n    removeOption(newOption : DropdownOptionElementModel):void{\n        this.configuration.options = this.configuration.options?.filter((option:DropdownOptionElementModel) => option.value!== newOption.id);\n    }\n\n    isOptionAsChip():boolean{\n        return this.configuration.isOptionAsChip ?? false;\n    }\n\n    isCreateNewOptionEnabled():boolean{\n        return this.configuration.enableCreateNewOption?? false;\n    }\n\n    // isAddCollaboratorEnabled(): boolean {\n    //     return this.configuration.enableAddCollaborator ?? false;\n    // }\n\n    isNoneOptionEnabled():boolean{\n        return this.configuration.enableNoneOption ?? false;\n    }\n\n    isReadOnly(): boolean {\n        return this.configuration.readonly ?? false;\n    }\n\n\n\n    getClassName(): string | string[] {\n        return this.configuration.classname?? '';\n    }\n\n    getDropdownRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.dropdownRenderer;\n    }\n\n    getDropdownRendererParams(): object | undefined {\n        return this.configuration.dropdownRendererParams;\n    }\n\n    getDropdownFooterRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.dropdownFooterRenderer;\n    }\n\n    getDropdownFooterRendererParams(): object | undefined {\n        return this.configuration.dropdownFooterRendererParams;\n    }\n\n    getDropdownHeaderRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.dropdownHeaderRenderer;\n    }\n\n    getDropdownHeaderRendererParams(): object | undefined {\n        return this.configuration.dropdownHeaderRendererParams;\n    }\n\n    getCreateNewOptionRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.createNewOptionRenderer;\n    }\n\n    getCreateNewOptionRendererParams(): object | undefined {\n        return this.configuration.createNewOptionRendererParams;\n    }\n    getNoOptionRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.noOptionRenderer;\n    }\n\n    getNoOptionRendererParams(): object | undefined {\n        return this.configuration.noOptionRendererParams;\n    }\n\n    isautoFocusSelectedOptionEnabled(): boolean { \n        return this.configuration.autoFocusSelectedOption ?? false;\n    }\n\n    getDropdownModel() : 'remote' | 'local' {\n        return this.configuration.model ?? 'local';\n    }\n    \n    // tool tip  based api started//\n    shouldShowTooltip(): boolean {\n    return this.configuration.tooltip ?? false;\n    }\n\n    getTooltipMessage(): string  {\n    return this.configuration.tooltipMessage ?? \"please enter a number\";\n    }\n\n    getTooltipRegex(): RegExp | undefined {\n    return this.configuration.tooltipRegex;\n    }\n\n    getTooltipPosition(): Position  {\n    return this.configuration.tooltipPosition ?? Position.bottomRight;\n    }\n\n    getTooltipAppendto(): HTMLElement | undefined {\n    return this.configuration.tooltipAppendto ?? document.body;\n    }\n\n    getTooltipHideDelay(): number  {\n    return this.configuration.tooltipHideDelay?? 700;\n    }\n\n    // tool tip  based api ended//\n\n    onFocus():any{\n        return this.configuration.onFocus?.() ?? true;\n    }\n\n    onBlur():any{\n        return this.configuration.onBlur?.() ?? true;\n    }\n\n\n    getLoadingRenderer() : { new (...args: any[]): ICustomRenderer }| undefined {\n        return this.configuration.loadingRenderer;\n    }\n        \n    getLoadingRendererParams() : Record<string, any> {\n        return this.configuration.loadingRendererParams ?? {};\n    }\n\n    onSelectAll(params : SelectAllEventParams) : void {\n        this.configuration.onSelectAll && this.configuration.onSelectAll(params);\n    }\n\n    onBeforeSelectAll(params : SelectAllEventParams) : boolean {\n        return (this.configuration.onBeforeSelectAll && this.configuration.onBeforeSelectAll(params)) ?? true;\n    }\n\n    onAfterSelectAll(params : SelectAllEventParams) : void {\n        this.configuration.onAfterSelectAll && this.configuration.onAfterSelectAll(params);\n    }\n}","\nimport { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName, } from '@dg/corecomponent';\nimport {ComponentMetadata} from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport {UserComponentHandler} from '@dg/corecomponent/UserComponentHandler.js';\nimport {UserComponentRegistry} from '@dg/corecomponent/UserComponentRegistry.js';\nimport { IComponentDetails } from '../../../../utility/component-detail.types';\nimport { IDropdownUserComponentHandlerTypes } from './dropdown-user-component-handler.types';\n\nexport const enum PropertyName {\n\tPREFIX_RENDERER           = 'prefixRenderer',\n\tSUFFIX_RENDERER           = 'suffixRenderer',\n\tHELPER_TEXT_RENDERER      = 'helpTextRenderer',\n\tBUTTON_RENDERER           = 'buttonRenderer',\n\tDROPDOWN_OPTION_RENDERER  = 'dropdownOptionRenderer',\n\tSELECTED_VALUE_RENDERER   = 'selectedValueRenderer',\n\tDROPDOWN_RENDERER         = 'dropdownRenderer',\n\tCREATE_NEWOPTION_RENDERER = 'createNewOptionRenderer',\n\tDROPDOWN_FOOTER_RENDERER  = 'dropdownFooterRenderer',\n\tDROPDOWN_HEADER_RENDERER  = 'dropdownHeaderRenderer',\n\tNO_OPTION_RENDERER        = 'noOptionRenderer',\n\tLOADING_RENDERER          = 'loadingRenderer'\n\t\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class DropdownUserComponentHandler extends UserComponentHandler implements IDropdownUserComponentHandlerTypes{\n\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\n\tgetPrefixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.PREFIX_RENDERER, params, PropertyName.PREFIX_RENDERER);\n\t}\n\n    getSuffixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.SUFFIX_RENDERER, params, PropertyName.SUFFIX_RENDERER);\n\t}\n\n\tgetDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.HELPER_TEXT_RENDERER, params, PropertyName.HELPER_TEXT_RENDERER);\n\t}\n\n\tgetButtonRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.BUTTON_RENDERER, params, PropertyName.BUTTON_RENDERER);\n\t}\n\t\n\tgetDropdownOptionRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.DROPDOWN_OPTION_RENDERER, params, PropertyName.DROPDOWN_OPTION_RENDERER)\n\t}\n\tgetSelectedValueRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.SELECTED_VALUE_RENDERER, params, PropertyName.SELECTED_VALUE_RENDERER)\n\t}\n\n\tgetDropdownRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.DROPDOWN_RENDERER, params, PropertyName.DROPDOWN_RENDERER);\n\t}\n\n\tgetCreateNewOptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.CREATE_NEWOPTION_RENDERER, params, PropertyName.CREATE_NEWOPTION_RENDERER);\n\n\t}\n\n\tgetDropdownFooterRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.DROPDOWN_FOOTER_RENDERER, params, PropertyName.DROPDOWN_FOOTER_RENDERER);\n\t}\n\n\tgetDropdownHeaderRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.DROPDOWN_HEADER_RENDERER, params, PropertyName.DROPDOWN_HEADER_RENDERER);\n\t}\n\n\tgetNoOptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.NO_OPTION_RENDERER, params, PropertyName.NO_OPTION_RENDERER);\n\t}\n\n\tgetLoadingRendererDetails(item : any, params : any)  : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.LOADING_RENDERER, params, PropertyName.LOADING_RENDERER);\n\t}\n\n\tprotected getComponentDetail( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\t\n\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.PREFIX_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.HELPER_TEXT_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.BUTTON_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.DROPDOWN_OPTION_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.DROPDOWN_RENDERER:\n\t\t\t\t  return item.getRenderer();\n\t\t\tcase PropertyName.CREATE_NEWOPTION_RENDERER:\n\t\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.DROPDOWN_FOOTER_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.DROPDOWN_HEADER_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.NO_OPTION_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.LOADING_RENDERER:\n\t\t\t\treturn item.getRenderer();\n            \n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(item : any, propertyName : PropertyName, params : any) : any {\n        switch(propertyName) {\n            case PropertyName.PREFIX_RENDERER:\n                return this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.DROPDOWN_OPTION_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.DROPDOWN_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.CREATE_NEWOPTION_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.DROPDOWN_FOOTER_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.DROPDOWN_HEADER_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.NO_OPTION_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.LOADING_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n            default:\n                return {};\n        }\n\n    }\n\n    private getUserRendererParams(item : any, params : any) : any {\n        const rendererParams = item.getUserRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n\tgetHelperTextRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.HELPER_TEXT_RENDERER, params, PropertyName.HELPER_TEXT_RENDERER);\n\t}\n\n\n\n}\n","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./modules/CSSRegistry\";\n\nexport function getValidationUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('field__validation-message', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\n\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IErrorComp, IStateManager, IErrorUserComponentHandler } from \"./error-view.types\";\nimport { AutoWired, BEAN_NAME, toggleAttribute } from \"@dg/corecomponent\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getValidationUtilityClass } from \"./error-classes\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\n\nconst useUtilityClasses = (ownerState : any) => {\n    const {inValid} = ownerState;\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: '',\n\t\t\tmodifiers: [\n                inValid && 'error'\n            ],\n\t\t},\n\t};\n\treturn composeClasses(slots, getValidationUtilityClass);\n\n};\nexport class ErrorController extends EventEmitter {\n    private component!: IErrorComp;\n\n    private isInValid : boolean = false;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: IErrorUserComponentHandler;\n\n    @AutoWired('stateManager') stateManager !: IStateManager;\n    \n    setComp(component : IErrorComp) {\n        this.component = component;\n\n        this.setRendererDetails();\n\n        this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_FOCUS_OUT\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, \"EVENT_VALUE_UPDATE\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_VISIBILITY_CHANGED', (params) => this.addHideClassName(params.error))\n\n    }\n\n    private addHideClassName(hide : boolean = false) : void {\n        const element  = this.component.getElement();\n        hide != undefined && element.classList.toggle('dg-hide', hide);\n    }\n\n    setRendererDetails(event : {force : boolean} = { force: false }) : void {\n\n        const force = event.force ?? false;\n\n        const inValid = this.stateManager.isInValid(); \n\n        if(!force  && this.isInValid === inValid) {\n            return;\n        }\n\n        this.isInValid = inValid;\n\n\n        const classes = useUtilityClasses({ inValid });\n        const showErrorState = this.optionsHandler.showErrorState ? this.optionsHandler.showErrorState(): false;\n\n        if(inValid && showErrorState){\n            const params = this.component?.getParams();\n            const validationMessageClasses = params.getValidationMessageClasses()\n            validationMessageClasses ? classes.root = classes.root + \" \" + validationMessageClasses : \"\";\n            this.addHideClassName(false);\n    \t\tthis.component.addOrRemoveCSSClass(classes.root, true);\n        }else {\n            this.addHideClassName(true);\n        }\n\n        \n        let userDetails: IComponentDetails;\n\n\n        let params : any = {};\n        if(inValid) {\n            const rendererWrapper = this.createInvalidTextRendererWrapper();\n                  params          = this.createInvalidTextRendererParams();\n                  userDetails     = this.userComponentHandler.getErrorRendererDetails(rendererWrapper, params) as IComponentDetails;\n        }\n\n        this.component.setRendererDetails(userDetails!, params.value);\n\n        this.setAccessibility();\n        \n    }\n\n    private setAccessibility() : void {\n        const element = this.component.getElement();\n\n        toggleAttribute(element, 'id', this.optionsHandler.getAriaDescribedby())\n    }\n\n     private createInvalidTextRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionsHandler.getValidationMessageRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionsHandler.getValidationMessageRendererParams(),\n\t\t};\n    }\n\n    private createInvalidTextRendererParams() {\n        return {\n\t\t\tvalue: this.optionsHandler.getValidationMessage(),\n\t\t};\n    }\n\n    refresh() {\n        this.setRendererDetails();\n    }\n}","import { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IErrorComp } from \"./error-view.types\";\nimport { IComponentDetails } from \"../utility/component-detail.types\";\nimport { ErrorController } from \"./error-controller\";\n\n\nconst errorTextTemplate = () => {\n\t// const div = document.createElement(\"div\");\n\t// div.innerHTML = `<div></div>`;\n\t// return div.firstChild as HTMLElement;\n\treturn document.createElement(\"div\");\n}\nexport function loadTemplate(template: string): HTMLElement {\n\tconst tempDiv = document.createElement('div');\n\ttempDiv.innerHTML = (template || '').trim();\n\n\treturn tempDiv.firstChild as HTMLElement;\n}\n\nexport function escapeString(toEscape?: string | null, skipHtmlChars?: boolean): string | null {\n\n\t const escapeMap: { [key: string]: string } = {\n\t\t\t'&': '&amp;',\n\t\t\t'<': '&lt;',\n\t\t\t'>': '&gt;',\n\t\t\t'\"': '&quot;',\n\t\t\t\"'\": '&#39;', \n\t\t};\n\n    if (toEscape == null) {\n        return null;\n    }\n\n    const stringResult = toEscape.toString().toString();\n\n    if (skipHtmlChars) {\n\t\treturn stringResult;\n\t}\n\n    return stringResult.replace(/[&<>\"']/g, (chr) => escapeMap[chr]);\n}\nexport class ErrorComponent extends Component {\n\n\tprivate renderer       : any;\n\tprivate rendererElement: any;\n\tprivate params : any;\n\n\tconstructor(params: any){\n\t\tsuper();\n        this.params = params;\n\t}\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst template = errorTextTemplate();\n\t\tthis.setTemplate(template);\n\n\t\tconst comp: IErrorComp = {\n\t\t\tsetRendererDetails: (rendererDetails: IComponentDetails, value ?: string) => this.setRendererDetails(rendererDetails , value),\n\t\t\taddOrRemoveCSSClass : (className : string, addOrRemove : boolean) => this.addOrRemoveCssClass(className, addOrRemove),\n\t\t\tgetElement : () => this.getGui(),\n\t\t\tgetParams : () => this.params\n\t\t};\n\n\t\tconst controller = this.createBean(new ErrorController());\n\t\tcontroller.setComp(comp);\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className\n\t}\n\n\n\tprivate setRendererDetails(rendererDetails: IComponentDetails, value ?: string): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutCellRenderer(value!)\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer(value : string) {\n\t\tconst parentElement = this.getGui();\n        clearElement(parentElement);\n\n        const escapedValue = value != null ? escapeString(value) : null;\n        if (escapedValue != null) {\n            parentElement.innerHTML = escapedValue;\n        }\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n}\n","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./modules/CSSRegistry\";\n\nexport function getFormLabelUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('field__label', slots.slot, slots.modifiers,globalNameSpace as string[]);\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IFormLabelComp, ILabelUserComponentHandler } from \"./label.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getFormLabelUtilityClass } from \"./form-label-classes\";\nimport { AutoWired, BEAN_NAME, toggleAttribute } from \"@dg/corecomponent\";\nimport { IComponentDetails } from \"@dg/corecomponent/UserComponentHandler\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot    : {\n            slot     : '',\n            modifiers: []\n        }\n\t};\n\n\treturn composeClasses(slots, getFormLabelUtilityClass);\n};\n\nconst useUtilityClassesForTitle = () => {\n\tconst slots = {\n\t\troot    : {\n            slot     : 'title',\n            modifiers: []\n        }\n\t};\n\n\treturn composeClasses(slots, getFormLabelUtilityClass);\n};\nexport class FormLabelController extends EventEmitter {\n    private component !: IFormLabelComp;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: ILabelUserComponentHandler;\n\n    // private params :any;\n    setComp(comp : IFormLabelComp) : void {\n        this.component = comp;\n        this.init();\n\n        this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_VISIBILITY_CHANGED', (params) => this.addHideClassName(params.label))\n\n    }\n\n    private init() : void{\n        this.setRendererDetails();\n        this.applyClasses();\n        this.setAccessibility();\n    }\n\n    private addHideClassName(hide : boolean = false) : void {\n        const element  = this.component.getElement();\n        hide != undefined && element.classList.toggle('dg-hide', hide);\n    }\n\n    private applyClasses(){\n        const classes = useUtilityClasses();\n        const titleClasses = useUtilityClassesForTitle();\n        const params = this.component.getParams();\n        if(params){\n            const labelClasses = typeof params.getLabelClasses === \"function\" ? params.getLabelClasses() : \"\";\n        const labelTitleClasses = typeof params.getLabelTitleClasses === \"function\" ? params.getLabelTitleClasses() : \"\";\n        labelClasses ? classes.root = classes.root + \" \" + labelClasses : \"\";\n        labelTitleClasses ? titleClasses.root = titleClasses.root + \" \" + labelTitleClasses : \"\";\n\n        }\n        \n        this.component.addClassName(classes.root);\n        // this.component.getTitleElement().className = titleClasses.root;\n        if(this.component.getTitleElement() && titleClasses?.root){\n            this.component.getTitleElement().className = titleClasses.root;\n        }\n\n    }\n\n    private setAccessibility() : void {\n        const element = this.component.getElement();\n        toggleAttribute(element, 'for', this.optionsHandler.getAriaLabelledby());\n    }\n\n    private setRendererDetails() : void {\n        const props =this.createProps();\n        const isLabel = props.label.length > 0;\n\n        if(isLabel) {\n            this.addHideClassName(false);\n        }else {\n            this.addHideClassName(true);\n        }\n        const rendererWrapper = this.createRendererWrapper();\n        const userDetails     = this.userComponentHandler.getLabelRendererDetails(rendererWrapper, props) as IComponentDetails;\n        this.component.setRendererDetails(userDetails, props)\n\n    }\n\n    private createProps() : any {\n        // const parmas = this.component?.getParams();\n        return {\n            label : this.optionsHandler.getLabel() || \"\",\n            required : this.optionsHandler.isRequired(),\n            ariaLabelledby : this.optionsHandler.getAriaLabelledby(),\n        }\n    }\n\n    private createRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionsHandler.getLabelRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionsHandler.getLabelRendererParams()\n\t\t}\n    }\n}","import { PostConstruct, clearElement, queryAssignedNodes, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { FormLabelController } from \"./label-controller\";\nimport { IFormLabelComp } from \"./label.types\";\nimport { getFormLabelUtilityClass } from \"./form-label-classes\";\nimport { composeClasses } from \"@dg/utils\";\nimport { IComponentDetails } from \"@dg/corecomponent/UserComponentHandler.js\";\n\nconst LabelTamplate = () => {\n    // const div = document.createElement(\"div\");\n    // div.innerHTML = `<div></div>`    \n    // return div.firstChild as HTMLElement;\n    return document.createElement(\"div\");\n}\nconst TITLE_CLASS_NAME = 'dg-field__label__title';\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n        label : {\n            slot : '',\n            modifiers : []\n        },\n\t\tasterisk: {\n            slot     : 'asterisk',\n            modifiers: []\n        },\n\t};\n\n\treturn composeClasses(slots, getFormLabelUtilityClass);\n};\n\nexport function loadTemplate(template: HTMLElement): HTMLElement {\n\tconst tempDiv = document.createElement('div');\n    template && tempDiv.appendChild(template);\n\t// tempDiv.innerHTML = \n\n\treturn tempDiv as HTMLElement;\n}\n\nexport function escapeString(toEscape?: string | null, skipHtmlChars?: boolean): string | null {\n\n\t const escapeMap: { [key: string]: string } = {\n\t\t\t'&': '&amp;',\n\t\t\t'<': '&lt;',\n\t\t\t'>': '&gt;',\n\t\t\t'\"': '&quot;',\n\t\t\t\"'\": '&#39;', \n\t\t};\n\n    if (toEscape == null) {\n        return null;\n    }\n\n    const stringResult = toEscape.toString().toString();\n\n    if (skipHtmlChars) {\n\t\treturn stringResult;\n\t}\n\n    return stringResult.replace(/[&<>\"']/g, (chr) => escapeMap[chr]);\n}\nexport class Label extends Component {\n\t@queryAssignedNodes('span-title') titleElement !      : any;\n\n    private requiredElement ! : HTMLElement|null;\n    private params: any;\n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    constructor(params: any){\n        super();\n        this.params = params;\n        \n    }\n\n\t@PostConstruct()\n\tinit(): void {\n        const template = LabelTamplate();\n        this.setTemplate(template);\n\n\t\tconst comp : IFormLabelComp = {\n            addOrRemoveClassName: (className : string, force : boolean) => this.addOrRemoveCssClass(className, force),\n            addClassName        : (className : string) => this.addOrRemoveCssClass(className, true),\n            removeClassName     : (className : string) => this.addOrRemoveCssClass(className, false),\n            setRendererDetails  : (componentDetails : IComponentDetails ,props : any) => this.setRendererDetails(componentDetails,props),\n            getElement : () => this.getGui(),\n            getParams :()=> this.params,\n            getTitleElement : () => this.titleElement,\n            updateLabelProperties : (props: any) => this.updateLabelProperties(props),\n            loadRequiredElement : (required : boolean, classes : string) => this.loadRequiredElement(required, classes),\n        };\n\n        const controller = this.createBean(new FormLabelController());\n        controller.setComp(comp);\n\t}\n\n    private setRendererDetails(componentDetails : IComponentDetails, props : any): void {\n        if (componentDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = componentDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutRenderer(props);\n\t\t}\n\t}\n\n    private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n    private afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n    private updateLabelProperties(props: any): void {\n        const {label, required, ariaLabelledby} = props;\n        const classes = useUtilityClasses();\n\n        if(label == null) {\n            this.setDisplayed(false);\n            return;\n        }\n\n        this.setDisplayed(true);\n\n        this.loadLabelElement(label,ariaLabelledby);\n\t\t\n\t\tthis.loadRequiredElement(required, classes.asterisk)\n\n    }\n\n    private insertValueWithoutRenderer(props : any) : void {\n\n\t\tconst {label, required, ariaLabelledby} = props;\n\n        const classes = useUtilityClasses();\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\n\n        // if(label == null) {\n        //     this.setDisplayed(false);\n        //     return;\n        // }\n\n        this.setDisplayed(true);\n\n        this.loadLabelElement(label,ariaLabelledby);\n\t\t\n\t\tthis.loadRequiredElement(required, classes.asterisk)\n\t}\n\n    private loadLabelElement(label: string,ariaLabelledby : string) : void {\n        if(label == null || label === undefined) {\n            label = \"\"\n\n        }\n            let labelElement = document.createElement('label');\n            labelElement.setAttribute('ref', 'span-title');\n            labelElement.classList.add(TITLE_CLASS_NAME);\n            labelElement.setAttribute('id',ariaLabelledby) ;\n            labelElement.innerText = label;\n\n        //    const template = loadTemplate(labelElement);\n\n            // this.setTemplate(template);\n            this.appendChild(labelElement);\n    }\n\n    private loadRequiredElement(required : boolean , _classes : string) : void {\n\t\t\t// let requiredElement = loadTemplate(`<span class=\"dg-number__label--required\">*</span>`);\n\t\t\t// this.appendChild(requiredElement);\n            // !required ? requiredElement.style.display = 'none' : null;\n\n        if (required) {\n            this.requiredElement = document.createElement('span');\n            this.requiredElement.className = 'dg-field__label--required';\n            this.requiredElement.textContent = '*';\n\t\t\tthis.appendChild(this.requiredElement);\n\t\t}else if(!required) {\n            this.requiredElement && this.requiredElement.remove();\n            this.requiredElement = null\n\n        }\n    }\n}\n","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","const LinkBeanConstants = {\n    LINK_CONFIGURATION : 'configuration',\n    LINK_API : 'linkApi',\n    LINK_STATE : 'linkState',\n    LINK_CONTROLLER_HANDLER : 'linkControllerHandler'\n}\n\nexport {\n    LinkBeanConstants\n}","import { Bean } from \"@dg/corecomponent\";\nimport { LinkBeanConstants } from \"../../constants/link-constants\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { LinkControllerHandlerType } from \"./link-controller-handler.types\";\nimport { LinkRootController } from \"./link-root-controller\";\n\n@Bean(LinkBeanConstants.LINK_CONTROLLER_HANDLER)\nclass LinkControllerHandler extends EventEmitter implements LinkControllerHandlerType {\n    private linkCtrl !: LinkRootController;\n    registerCtrl(linkCtrl : LinkRootController) : void {\n        this.linkCtrl = linkCtrl;\n    }\n\n    getLinkCtrl() : LinkRootController {\n        return this.linkCtrl;\n    }\n}\n\nexport {\n    LinkControllerHandler\n}\n\n\n","import { AutoWired, BEAN_NAME, setAriaLabel } from \"@dg/corecomponent\";\nimport { LinkOptionHandler } from \"../model/link-options-handler\";\nimport { LinkBeanConstants } from \"../../constants/link-constants\";\nimport { LinkComponentType } from \"./link-root-types\";\nimport { AbstractController } from \"../../../utility/abstract-controller\";\nimport { LinkControllerHandlerType } from \"./link-controller-handler.types\";\nimport { getClassName, ILinkConfiguration, LinkEventOrigin } from \"../../link-configuration.types\";\nimport { formatValue } from \"../model/PhoneFormatter\";\nimport type { LinkStateManager } from \"../model/link-state-manager\";\nimport { MultilineComponent } from \"../../../Multiline/src/multiline\";\nimport { IMultilineConfiguration } from \"../../../Multiline/src/multiline-configuration.types\";\nimport { registerClipboardGuards } from \"../../../utility/clipboard\";\n\nclass LinkRootController extends AbstractController<LinkComponentType> {\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionsHandler! : LinkOptionHandler;\n    @AutoWired(LinkBeanConstants.LINK_CONTROLLER_HANDLER) private controllerHandler! : LinkControllerHandlerType;\n    @AutoWired('stateManager') private stateManager !: LinkStateManager;\n\n\n    init() : void {\n        this.registerEvent();\n        this.refresh();\n        this.controllerHandler.registerCtrl(this);\n        const initialValue    = this.optionsHandler.getValue();\n        this.optionsHandler.setInitailValue(initialValue);\n        const isDisabled      = this.optionsHandler.isDisabled();\n        const isEditable      = this.optionsHandler.isEditable();\n        const wrapper         = this.component?.getLinkWrapperElement();\n        const anchorElement   = this.component?.getAnchorElement();\n\n        if(!isDisabled && wrapper && anchorElement){\n            this.addListener(wrapper, 'blur', this.onBlur.bind(this));\n            this.addListener(wrapper, 'focus', this.onFocus.bind(this));\n            this.addListener(anchorElement, 'click', this.click.bind(this))\n            this.addListener(anchorElement,'contextmenu', this.onContextMenu.bind(this));\n            this.addListener(anchorElement, 'mousedown', this.mouseDown.bind(this));\n            if(isEditable) {\n                if(this.component?.getElement()){   \n                    this.addListener(this.component.getElement(), 'focus', this.onFocusEdit.bind(this));\n                }\n            }\n        }\n\n\t\tthis.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.addErrorClassName.bind(this));\n        this.addErrorClassName();\n\n        registerClipboardGuards(\n            this.component?.getElement(),\n            () => this.optionsHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n\n    }\n\n    private addErrorClassName() : void {\n\t\tconst isInValid = this.stateManager.isInValid();\n\t\tthis.component!.getElement().classList.toggle(\"dg-input__status--error\", isInValid)\n\t}\n\n    private onBlur(event: FocusEvent): void {\n        this.optionsHandler.onBlur(event);\n     }\n    private onFocus(event: FocusEvent): void {\n        this.optionsHandler.onFocus(event);\n\n \n    }\n    private click(event: MouseEvent): void {\n        event.stopPropagation();\n        this.optionsHandler.onClick(event);\n    }\n\n    private mouseDown(event: MouseEvent): void {\n        this.optionsHandler.onMouseDown(event);\n    }\n\n    private onContextMenu(event: MouseEvent): void {\n        this.optionsHandler.onContextMenu(event);\n    }\n\n\n    private onFocusEdit(event: FocusEvent): void {\n        event.preventDefault();\n        event.stopPropagation();\n        this.enableEdit();\n    }\n\n    updateProperties(options : ILinkConfiguration){\n        this.optionsHandler.updateProperties(options);\n        this.refresh();\n    }\n\n    registerEvent() : void {\n       this.addListener;\n       const element =  this.component?.getElement();\n       element?.classList.add('dg-textarea__root');\n       element?.classList.add('dg-field__root');\n       element?.classList.add('dg-link__root');    \n       element?.classList.add('dg-field--render-state');\n       const type =  this.optionsHandler.getType();\n       const classType = getClassName(type);\n       element?.classList.add(classType); \n\n    }\n\n    getElement() :  HTMLElement |  null{\n        return this.component?.getElement() ?? null;\n    }\n\n    getURL() :  string{\n        const element =  this.component?.getAnchorElement();\n        return element?.href?? '';\n    }\n\n    private enableEdit() : void { \n        const isReadOnly = this.optionsHandler.isReadOnly();\n        if(isReadOnly){\n            return;\n        }\n        const element = this.component?.getElement(); \n        const linkElement = this.component?.getElement().querySelector('a') as HTMLAnchorElement;\n        \n        let multilineInstance : MultilineComponent;\n        const multilineConfiguration : IMultilineConfiguration = {\n            appendTo :  element ?? undefined ,\n            value : this.optionsHandler.getValue(),\n            min : 1,\n            max : 1000,\n            onKeydown :(event :  KeyboardEvent )=>{\n                event.stopPropagation();\n                if (event.key === 'Enter' && !event.shiftKey) {\n                    const newValue = multilineInstance.api?.getValue();\n                    const normalizedValue = newValue !== undefined && newValue !== null ? newValue.toString() : undefined;\n                    if (normalizedValue) {\n                        this.applyValueChange(normalizedValue, 'ui');\n                        this.editRefresh(multilineInstance, linkElement, normalizedValue);\n                    }\n                }\n            },\n\n            onBlur :(event :  FocusEvent ) =>{\n                const newValue = multilineInstance.api?.getValue();\n                const normalizedValue = newValue !== undefined && newValue !== null ? newValue.toString() : undefined;\n                if (normalizedValue) {\n                    this.applyValueChange(normalizedValue, 'ui');\n                    this.editRefresh(multilineInstance, linkElement, normalizedValue);\n                }\n                const onBlur = this.optionsHandler.getOnBlurCallback()\n                const textComponentValue =  multilineInstance.api?.getValue() ??'';\n                \n                onBlur && onBlur({\n                    value : textComponentValue,\n                    event : event\n                });\n            }\n        }\n        multilineInstance  =  new MultilineComponent(multilineConfiguration);\n        linkElement && (linkElement.style.display = 'none');        \n        multilineInstance.api?.focus();\n    }\n\n    private applyValueChange(newValue: string | undefined, eventOrigin: LinkEventOrigin): boolean {\n        if (newValue === undefined || newValue === null) {\n            return false;\n        }\n        const normalizedValue = newValue.toString();\n        const previousValue = this.optionsHandler.getValue();\n\n        if (normalizedValue === previousValue) {\n            return false;\n        }\n\n        this.optionsHandler.updateAnchorText(normalizedValue);\n        this.component?.refresh();\n        this.optionsHandler.onChange(previousValue, normalizedValue, eventOrigin);\n        return true;\n    }\n\n    private editRefresh(multilineInstance : MultilineComponent,linkElement : HTMLAnchorElement,newValue : string | undefined) : void {\n        multilineInstance.api?.destroy();\n        if(linkElement && newValue){\n            linkElement.style.display = '';\n            linkElement.href = newValue;\n            linkElement.innerText = newValue;\n        }\n    }\n\n    private refresh() : void { \n        this.updateLabel();\n        this.updateTarget();\n        this.updateValue();\n        this.setAccessibility();\n    }\n\n    private updateValue() : void {\n        const newValue = this.optionsHandler.getValue();\n        const element = this.component?.getAnchorElement();\n        if(element){\n            const type = this.optionsHandler.configuration.type;\n            const format = this.optionsHandler.configuration.format;\n            if(type && format) {\n                const value =  formatValue(newValue,format);\n                element.innerText = value;\n\n            }else{\n                element.innerText = newValue;\n            }\n        }\n\n    }\n\n    private updateLabel() : void {\n        const label = this.optionsHandler.getLabel();\n        const labelElement = this.component?.getElement().querySelector('label');\n        const spanElement = labelElement?.querySelector('span');\n        if(spanElement && label){\n            spanElement.textContent =label\n        }\n    }\n\n    private updateTarget() :  void{\n        const target = this.optionsHandler.getTarget();\n        const element = this.component?.getAnchorElement();\n        if(element){\n            if(target == 'none'){\n                element.href ='#';\n                element.target = '_self'\n            }\n            else {\n                element.target = target;\n                this.optionsHandler.configuration.href ? element.href= this.optionsHandler.configuration.href: null;\n            }\n        }\n    }\n\n    // private updateTitle()  {\n    //     // const title = this.optionsHandler.;\n    //     // const element = this.component?.getAnchorElement();\n    //     // if(element){\n    //     //     element.title = title;\n    //     // }\n    // }\n\n    // private updateReadOnly() : void {\n    //     const element = this.component?.getElement();\n    //     const isReadOnly = this.optionsHandler.isReadOnly();\n    //     if(isReadOnly){\n    //         element?.classList.add('disabled');\n    //     }else {\n    //         element?.classList.remove('disabled');\n    //     }\n    // }\n\n    // private updateType() {\n\n    // }\n\n    // private updateDisabled(){\n\n    // }\n\n    // private updateFormat() {\n\n    // }\n\n    // private udateRTL(){\n\n    // }\n\n\n\n    setAccessibility() : void {\n        const rootElement = this.component?.getElement()\n        if(rootElement){\n            const inputElement = rootElement.childNodes[0] as HTMLElement;\n            if(!inputElement)  return;\n            const ariaLabel = this.optionsHandler.getAriaLabel();\n            const isDisabled   =  this.optionsHandler.isDisabled();\n            ariaLabel && setAriaLabel(inputElement, ariaLabel);\n            (isDisabled) &&inputElement.classList.add('disabled');\n            // const wrapperElement = this.component?.getLinkWrapperElement()\n            // setMaxVisibleLines(wrapperElement);\n\n        }\n\n    }\n\n    getProperty() {\n        const linkProperties = {\n            href                : this.optionsHandler.getHref(),\n            target              : this.optionsHandler.getTarget(),\n            underline           : this.optionsHandler.getUndlerLine(),\n            value               : this.optionsHandler.getValue(),\n            isToolTipEnabled    : this.optionsHandler.isTooltipEnabled(),\n            isReadOnly          : this.optionsHandler.isReadOnly(),\n            isDisabled          : this.optionsHandler.isDisabled(),\n            isEditable          : this.optionsHandler.isEditable(),\n            type                : this.optionsHandler.getType(),\n            rtl                 : this.optionsHandler.isRTL(),\n            format              : this.optionsHandler.getFormat()\n        }\n        return linkProperties;\n    }\n\n    getParamsProperty() {\n        return {\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> {\n\t\t\t\t\treturn\"dg-link__label\"\n\t\t\t\t},\n\t\t\t\tgetLabelTitleClasses :()=> {\n\t\t\t\t\treturn \"dg-link__label-title\"\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses: ()=>  \"dg-link__validation-message\",\n\t\t\t\tgetDescriptionClasses      : ()=> \"dg-link__description\"\n\t\t\t}\n\t\t};\n    }\n\n    getValue() : any {\n        return this.optionsHandler.getValue();\n    }\n\n    getFormattedValue() {\n        const type =  this.optionsHandler.getType();\n        if(type == 'telephone'){\n            const element=this.component?.getAnchorElement();\n            return element?.textContent;\n        }\n        else{\n            return  this.optionsHandler.getValue();\n        }\n\n    }\n\n    setValue(value : string |  number) {\n        const isDisabled =  this.optionsHandler.isDisabled();\n        const isReadOnly = this.optionsHandler.isReadOnly();\n        if(isDisabled || isReadOnly){\n            return;\n        }\n\n        const normalizedValue = value !== undefined && value !== null ? value.toString() : undefined;\n        this.applyValueChange(normalizedValue, 'api');\n    }\n\n    focus() : void {\n        this.enableEdit()\n    }\n\n    blur() : void {\n\n    }\n    disable(value :  boolean) : void {\n        const isComponentDisabled =  this.optionsHandler.isDisabled();\n        if(isComponentDisabled == value){return}\n        const element = this.component?.getAnchorElement();\n        if(!element) return ;\n        if(value == true){\n            element.classList.add('disabled');\n            this.optionsHandler.setDisabled(value)\n        }\n        else{\n            element.classList.remove('disabled');\n            this.optionsHandler.setDisabled(value)\n        }\n        this.refresh();\n    }\n    \n    enable(value: boolean): void {\n        const isComponentEnabled = !this.optionsHandler.isDisabled();\n        if (isComponentEnabled == value) { return; }\n    \n        const element = this.component?.getAnchorElement();\n        if (!element) return;\n    \n        if (value === true) {\n            element.classList.remove('disabled');\n            this.optionsHandler.setDisabled(false);\n        } else {\n            element.classList.add('disabled');\n            this.optionsHandler.setDisabled(true);\n        }\n    \n        this.refresh();\n    }\n    \n    \n    resetValue() {\n        const initialValue =  this.optionsHandler.getInitailValue();\n        (initialValue.length>1) && this.setValue(initialValue);\n    }\n\n    hide(): void {\n       this.component && (this.component.getElement().style.display = 'none');\n    }\n    show(): void {\n        this.component && (this.component.getElement().style.display = 'block');\n    }\n    clear() :  void {\n        this.setValue('')\n    }\n}\n\n\nexport {\n    LinkRootController\n}","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../label/modules/CSSRegistry\";\n\nexport function getLinkUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n    const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n    return generateUtilityClass('link', slots.slot, slots.modifiers,globalNameSpace as string[]);\n}","const maxIteraction = 20;\nfunction formatValue(value : string, format : string) {\n    if (typeof format !== 'string' || !format) {\n        return value;\n    }\n    if (value === '') {\n        return '';\n    }\n    let xCount = format.split('').filter(char => char === 'x').length;\n    if (value.length > xCount) {\n        return value;\n    }\n    let matchCount = 0;\n    let formattedValue = '';\n    const iteration = Math.min(format.length, maxIteraction);\n    for (let index = 0; index < iteration; index++) {\n        formattedValue += (format[index] === 'x') ? value[matchCount++] : format[index];\n        if (matchCount === value.length) break;\n    }\n    return formattedValue;\n}\nexport {\n    formatValue\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { LinkAPITypes } from \"./link-api.types\";\nimport { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { LinkBeanConstants } from \"../../constants/link-constants\";\nimport { LinkControllerHandlerType } from \"../controller/link-controller-handler.types\";\nimport { ILinkConfiguration } from \"../../link-configuration.types\";\nimport { LinkOptionHandlerTypes } from \"./link-option-handler.types\";\n\n\n@Bean(LinkBeanConstants.LINK_API)\nclass LinkAPI extends EventEmitter implements LinkAPITypes {\n\n    @AutoWired(LinkBeanConstants.LINK_CONTROLLER_HANDLER) private controller !: LinkControllerHandlerType;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: LinkOptionHandlerTypes;\n\n    focus(): void {\n        return this.controller.getLinkCtrl().focus();\n    }\n\n    blur(): void {\n        return this.controller.getLinkCtrl().blur();\n    }\n\n    getValue() : any {\n        return this.controller.getLinkCtrl().getValue();\n    }\n\n    setValue(value: number |  string): void {\n        return this.controller.getLinkCtrl().setValue(value);\n    }\n\n    disable(value : boolean): void {\n        return this.controller.getLinkCtrl().disable(value ?? true);\n    }\n\n    resetValue(): void {\n        return this.controller.getLinkCtrl().resetValue();\n    }\n\n    hide(): void {\n        this.controller.getLinkCtrl().hide();\n    }\n    show(): void {\n        this.controller.getLinkCtrl().show();\n    }\n    clear(): void {\n        this.controller.getLinkCtrl().clear();\n    }\n    destroy(): void {\n        const component = this.controller.getLinkCtrl().component\n        const rootElement = component?.getAnchorElement();\n        if(rootElement){\n            const newElement = rootElement.cloneNode(true);\n            rootElement.parentNode?.replaceChild(newElement, rootElement);\n        }\n        component?.getElement().remove();\n    }\n    enable(value: boolean): void {\n        return this.controller.getLinkCtrl().enable(value ?? true);\n    }\n\n    getElement(): HTMLElement |  null{\n        return this.controller.getLinkCtrl().getElement() ?? null;\n    }\n    getURL(): string {\n        return this.controller.getLinkCtrl().getURL();\n    }\n\n    updateProperties(options: ILinkConfiguration): void {\n        this.controller.getLinkCtrl().updateProperties(options);\n    }\n\n    getLabel(): string {\n        return this.optionHandler.getLabel();\n    }\n    getDescription(): string {\n        return this.optionHandler.getDescription();\n    }\n\n    getFormattedValue(): string {\n        return this.controller.getLinkCtrl().getFormattedValue() ?? \"\";\n    }\n\n    showErrorMessage(message ?: string): void {\n        message && this.optionHandler.updateValidationMessage(message);\n        this.optionHandler.updateStatus('error');\n    }\n\n    hideErrorMessage(): void {\n        this.optionHandler.updateValidationMessage(\"\");\n        this.optionHandler.updateStatus(\"none\");\n    }\n}\n\nexport {\n    LinkAPI\n}","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { LinkBeanConstants } from \"../../constants/link-constants\";\nimport { ILinkConfiguration, ILinkErrorRenderer, LinkEventOrigin, linkProperties, linkTarget, listenerCallback } from \"../../link-configuration.types\";\nimport { LinkOptionHandlerTypes } from \"./link-option-handler.types\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ClipboardConfig } from \"../../../utility/clipboard\";\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nclass LinkOptionHandler  extends EventEmitter implements LinkOptionHandlerTypes{\n\n    @AutoWired(LinkBeanConstants.LINK_CONFIGURATION) configuration !: ILinkConfiguration;\n    private initialValue !:  string;\n    getHref() : string {\n        return this.configuration.href ?? \"\";\n    }\n\n    getAriaLabel(): string {\n        return this.configuration.ariaLabel ?? \"\";\n    }\n    getAppendTo() : HTMLElement {\n        return this.configuration.appendTo ?? document.body;\n    }\n\n    getTarget() : linkTarget {\n        return this.configuration?.target ?? '_self';\n    }\n\n    getUndlerLine() : boolean {\n        return this.configuration.underline ?? false;\n    }\n\n    getValue() : string{\n        return typeof this.configuration.value === 'string' ? this.configuration.value : \"\";\n    }\n\n    getType() : string {\n        return this.configuration.type ?? \"url\";\n    }\n\n    isTooltipEnabled() : boolean {\n        return this.configuration.title ?? false;\n    }\n\n    isReadOnly() : boolean {\n        return this.configuration.readOnly ?? false;\n    }\n\n    isDisabled() : boolean {\n        return this.configuration.disabled ??  false;\n    }\n\n    isEditable() : boolean {\n        return this.configuration.editable ?? false;\n    }\n\n    getClickCallback() : listenerCallback {\n        return this.configuration.onClick  || (() => {});\n    }\n\n    getOnBlurCallback() {\n        return this.configuration.onBlur;\n    }\n\n    updateAnchorText(value : string) : void {\n        this.configuration.value = value;\n    }\n\n    isInEditorPanel(): boolean {\n        return this.configuration.isInEditorPanel ?? false;\n    }\n\n    isRTL(): boolean {\n        return this.configuration.rtl ?? false;\n    }\n\n    setDisabled(value : boolean): void {\n        this.configuration.disabled = value;\n    }\n\n    setInitailValue(value: any): void {\n        this.initialValue = value;\n    }\n    getInitailValue(): string {\n        return this.initialValue ?? \"\";\n    }\n\n    onBlur(event: FocusEvent): void {\n        if(this.configuration.onBlur){\n            this.configuration.onBlur(event);\n        }\n        \n    }\n    onFocus(event: FocusEvent): void {\n        if(this.configuration.onFocus){\n            return this.configuration?.onFocus(event);\n        }\n    }\n    onClick(event: MouseEvent): void {\n        if(this.configuration.onClick){\n            return this.configuration?.onClick(event);\n        }\n    }\n\n    onMouseDown(event: MouseEvent): void {\n        if(this.configuration.onMouseDown){\n            return this.configuration.onMouseDown(event);\n        }\n    }\n\n    onChange(oldValue: string, newValue: string, eventOrigin: LinkEventOrigin = 'ui'): void {\n        const onChangeHandler = this.configuration.onChange;\n        if (!onChangeHandler) {\n            return;\n        }\n        onChangeHandler(oldValue, newValue, eventOrigin);\n    }\n\n    onContextMenu(event: MouseEvent): void {\n        if(this.configuration.onContextMenu){\n            return this.configuration.onContextMenu(event);\n        }\n    }\n\n    getFormat(): string | null {\n        return this.configuration.format || null;\n    }\n    updateProperties(options: ILinkConfiguration): void {\n        const userProperty = Object.keys(options);\n        for(let i = 0; i < userProperty.length; i++){\n            const userKey = userProperty[i]\n            const isValidProperty = linkProperties.includes(userKey);\n            if(isValidProperty){\n                (this.configuration as any)[userKey] = (options as any)[userKey];\n            }  else {\n                console.warn(`Invalid property ${userKey} in options. Ignoring.`);\n            }\n        }\n\n        this.dispatchEvent({\n            type : 'PROPERTY_CHANGED'\n        })\n    }\n\n    getLabel(): string {\n        return this.configuration.label ?? \"\"    \n    }\n    getDescription(): string {\n        return this.configuration.description ?? \"\"    \n    }\n\n    isRequired(): boolean {\n        return this.configuration.required ?? false;\n    }\n    getAriaLabelledby(): string {\n        return this.configuration.ariaLabelledby?? \"CheckBox label\"    \n    }\n\n    getDescriptionRenderer() {\n        // return this.configuration.descriptionRenderer ?? '';\n        return this.configuration?.descriptionRenderer;\n    }\n    getDescriptionRendererParams() {\n        // return this.configuration.descriptionRendererParams ?? '';\n        return this.configuration?.descriptionRendererParams;\n    }\n\n    shouldGenerateEmptyDom(): boolean {\n        return this.configuration?.generateEmptyDom ?? false;\n    }\n\n    showErrorState(): boolean {\n        return this.configuration.showErrorState ?? false;\n    }\n\n    isValid(): boolean {\n        return this.configuration.status === 'error';\n    }\n\n    updateStatus(status : 'error' | \"none\") : void {\n        this.configuration.status = status;\n        this.dispatchEvent({\n            type: \"EVENT_VALUE_UPDATE\",\n            force : true\n        })\n    }\n\n    updateValidationMessage(message : string) : void {\n        this.configuration.validationMessage = message;\n    }\n\n    getAriaDescribedby(): string {\n        return this.configuration.ariaDescribedby ?? '';\n    }\n\n    getValidationMessage(): string {\n        return this.configuration.validationMessage ?? '';\n    }\n\n    getValidationMessageRenderer(): ( new() => ILinkErrorRenderer ) | undefined {\n        return this.configuration.validationMessageRenderer;\n    }\n\n    getValidationMessageRendererParams(): object | undefined {\n        return this.configuration.validationMessageRendererParams;\n    }\n\n    getLabelRenderer() {\n        return this.configuration.labelRenderer;\n    }\n\n    getLabelRendererParams() {\n        return this.configuration.labelRendererParams ?? {};\n    }\n\n    getClipboard(): ClipboardConfig {\n        return this.configuration.clipboard;\n    }\n}\n\nexport {\n    LinkOptionHandler\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { LinkStateHandlerType } from \"./link-state-handler.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { LinkOptionHandlerTypes } from \"./link-option-handler.types\";\n\nclass LinkStateHandler extends EventEmitter implements LinkStateHandlerType {\n\n\n    private focused !: boolean;\n    private disabled !: boolean;\n    private opened !: boolean;\n    private activated !: boolean;\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) linkOptionHandler !: LinkOptionHandlerTypes;\n    setURLFocuseState(_isFocused: boolean): void {\n        \n    }\n\n    setURLActiveState(_isActive: boolean): void {\n        \n    }\n\n    setURLDisableState(_isDisabled: boolean): void {\n        \n    }\n\n    setURLasOpenState(_isOpened: boolean): void {\n        \n    }\n\n    isURLOpened(): boolean {\n        return this.opened;\n    }\n\n    isURLActive(): boolean {\n        return this.activated;\n    }\n\n    isURLDisabled(): boolean {\n        return this.disabled;\n    }\n\n    isURLFocused(): boolean {\n        return this.focused;\n    }\n\n}\n\nexport {\n    LinkStateHandler\n}","\nimport {  Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { LinkOptionHandlerTypes } from \"./link-option-handler.types\";\n\n@Bean('stateManager')\n class LinkStateManager extends EventEmitter {\n\n    isInValid() : boolean {\n        return (this.optionsHandler as LinkOptionHandlerTypes).isValid();;\n    }\n}\nexport {\n    LinkStateManager\n}","import { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n\n// import { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { ComponentMetadata } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport {  UserComponentHandler } from \"@dg/corecomponent/UserComponentHandler.js\";\nimport { LinkUserComponentHandlerType } from \"./link-user-component-handler.types\";\nimport { IComponentDetails } from \"../../../utility/component-detail.types\";\nimport { ILabelUserComponentHandler } from \"../../../label/label.types\";\n\n\nexport const enum PropertyName {\n\tHELPER_TEXT_RENDERER = 'helpTextRenderer',\n\tERROR_RENDERER       = 'errorRenderer',\n\tLABEL_RENDERER       = 'labelRenderer'\n}\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nclass LinkUserComponentHandler extends UserComponentHandler implements LinkUserComponentHandlerType, ILabelUserComponentHandler{\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\tgetLabelRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails(item, PropertyName.LABEL_RENDERER, params, PropertyName.LABEL_RENDERER);\n\t}\n\n\tgetDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.HELPER_TEXT_RENDERER, params, PropertyName.HELPER_TEXT_RENDERER);\n\t}\n\n\tgetErrorRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.ERROR_RENDERER, params, PropertyName.ERROR_RENDERER);\n\t}\n\n\t\n\t// protected getComponentDetail( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t// \tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n    //     const looUpRegistry = (name: string) => {\n\t// \t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t// \t\tconst item = userComponentRegistry.retrieve(name);\n\t// \t\tif (item) { \n    //             jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t// \t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n    //         }\n\t// \t};\n\n\t// \tif (componentName != null) {\n\t// \t\tlooUpRegistry(componentName);\n\t// \t}\n\n\t// \tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t// \t\tlooUpRegistry(defautName);\n\t// \t}\n\n\t// \tif (!jsComponent && !frameworkComponent) {\n\t// \t\treturn undefined;\n\t// \t}\n\n\t// \tconst componentFramework = jsComponent == null;\n\t// \tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n    //     const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t// \treturn {\n\t// \t\tcomponentFramework,\n\t// \t\tcomponentClass,\n\t// \t\tparams : mergedParams,\n\t// \t\tpropertyName,\n\t// \t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t// \t};\n\t// }\n\tprotected getComponentDetail( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta{\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\t// case PropertyName.PREFIX_RENDERER:\n\t\t\t// \treturn item.getRenderer();\n\t\t\tcase PropertyName.HELPER_TEXT_RENDERER:\n\t\t\tcase PropertyName.ERROR_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\t// case PropertyName.BUTTON_RENDERER:\n\t\t\t// \treturn item.getRenderer();\n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(item : any, propertyName : PropertyName, params : any) : any {\n        switch(propertyName) {\n\t\t\tcase PropertyName.LABEL_RENDERER:\n                return this.getUserRendererParams(item, params);\n            default:\n                return {};\n        }\n\n    }\n\n    private getUserRendererParams(item : any, params : any) : any {\n        const rendererParams = item.getUserRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n}\n\nexport {\n\tLinkUserComponentHandler\n}","import { AutoWired, BEAN_NAME, PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\"\nimport { LinkComponentType } from \"./link-root-types\";\nimport { LinkRootController } from \"../controller/link-root-controller\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getLinkUtilityClass } from \"../link-root-classes\";\nimport { LinkOptionHandlerTypes } from \"../model/link-option-handler.types\";\nimport { getAnchorHref } from \"../../link-configuration.types\";\nimport { formatValue } from \"../model/PhoneFormatter\";\n\n\nconst anchorTag = 'anchorTag';\nconst wrapper  = 'wrapper';\nconst useUtilityClasses = () => {\n    return composeClasses(\n        {\n            value: { slot: 'anchor-text', modifiers: [] },\n            root: { slot: 'root', modifiers: [] }\n        },\n        getLinkUtilityClass\n    );\n};\n\n\nconst rootTemplate = (props :  any, emptyDom : boolean, error : boolean) => {\n    const classes = useUtilityClasses();\n    const rootDiv = document.createElement('div');\n    rootDiv.classList.add(classes.root);\n    props.rtl && rootDiv.setAttribute('dir', 'rtl');\n    \n    if (props.isEditable) {\n        rootDiv.setAttribute('data-editable', 'true');\n        rootDiv.setAttribute('tabindex', '0');\n    }\n\n    const aTag = document.createElement('a');\n    aTag.target = props.target ?? '_blank';\n    aTag.setAttribute('ref', 'anchorTag');\n    if (aTag.target === '_blank') {// needed only for blank targeted\n        aTag.rel = 'noopener noreferrer'; // security and privacy\n      }\n    aTag.href = getAnchorHref(props.type,props.href);\n    if(props.target =='none'){\n        aTag.href ='#';\n        aTag.target = '_self'\n    }\n    \n    if (props.type === 'file') aTag.download = '';\n    if (props.value) {\n        if(props.type =='telephone' && props.format){\n            const value =  formatValue(props.value,props.format);\n            aTag.textContent = value;\n        }\n        else{\n            typeof props.value === 'string' ? aTag.textContent = props.value : aTag.append(props.value);\n        }\n    }\n    \n    \n    aTag.classList.add('dg-text__input', 'dg-field__input');\n\n    const linkWrapper = document.createElement('div');\n    linkWrapper.setAttribute('ref','wrapper');\n    linkWrapper.classList.add('dg-text__input-wrapper', 'dg-field__input-wrapper');\n    linkWrapper.append(aTag);\n    \n    if(emptyDom){\n        const textLabel = document.createElement(\"text-label\");\n        textLabel.setAttribute(\"ref\", 'label');\n        rootDiv.appendChild(textLabel);\n    }\n\n    const linkContainer = document.createElement('div');\n    linkContainer.classList.add('dg-text__container', 'dg-field__container');\n    linkContainer.append(linkWrapper);\n    rootDiv.append(linkContainer);\n\n    if(emptyDom){\n        const textHelper = document.createElement(\"text-helper\");\n        textHelper.setAttribute(\"ref\", 'description');\n        rootDiv.appendChild(textHelper);\n    }\n\n     if(emptyDom || error) {\n        const errorElement = document.createElement(\"link-error\");\n        errorElement.setAttribute(\"ref\", 'error');\n        rootDiv.appendChild(errorElement);\n    }\n    \n    return rootDiv;\n};\n\nclass LinkRootView extends Component{\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: LinkOptionHandlerTypes;\n\n    @queryAssignedNodes(anchorTag) private anchorElement !: HTMLAnchorElement;\n    @queryAssignedNodes(wrapper) private wrapperElement !: HTMLElement;\n\n    private appendTo : HTMLElement |  null;\n\n    constructor(appendTo : HTMLElement) {\n        super();\n        this.appendTo = appendTo;\n        if (appendTo) {\n            appendTo.style.width = '100%';\n            appendTo.style.height = '100%';\n            appendTo.style.minHeight = '0';\n        }\n    }\n\n    @PostConstruct()\n    init() : void {\n\n        const component : LinkComponentType = {\n            addOrRemoveCssClassName : (className : string) =>  this.addOrRemoveCssClassName(className),\n            getElement              : () => this.getGui(),\n            refresh                 : () => this.refresh(),\n            destroy                 : () => this.destroy(),\n            getAnchorElement        : () => { return this.anchorElement},\n            getLinkWrapperElement   : () => { return this.wrapperElement},\n\n        }\n\n        const controller = this.createBean(new LinkRootController());\n        \n        const props = controller.getProperty();\n        const properties = controller.getParamsProperty();\n        const emptyDom = this.shouldGenerateEmptyDom()\n        this.setTemplate(rootTemplate(props,emptyDom, this.optionHandler.showErrorState()), {\n            error      : properties.description,\n            label      : properties.label,\n            description: properties.description\n        });\n\n\n        controller.setComponent(component);\n\n        this.appendElementIntoUserDom();\n    }\n\n    shouldGenerateEmptyDom(){\n\t\tconst generateEmptyDom = this.optionHandler.shouldGenerateEmptyDom();\n\t\tconst label = this.optionHandler.getLabel();\n\t\tconst description = this.optionHandler.getDescription();\n        const isLabel =  label.length > 0;\n        const isDescription = description.length > 0;\n\t\tif( isLabel || isDescription){\n\t\t\treturn true\n\t\t}else if(generateEmptyDom){\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n    private addOrRemoveCssClassName(className : string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.appendTo && this.appendTo.removeChild(eGui);\n\t\t\tthis.appendTo = null;\n\t\t});\n\t}\n\n    private refresh() : void {\n        const anchorTextValue = this.optionsHandler.getValue();\n        this.anchorElement && (this.anchorElement.innerText = anchorTextValue);\n    }\n\n}\n\nexport {\n    LinkRootView\n}","import { IClipboard } from \"../utility/clipboard\";\n\ninterface IValue {\n    value: string | HTMLElement;\n}\n\nexport interface IRenderer {\n    getElement(): HTMLElement;\n    init(params: object): void;\n    destroy(): void;\n}\ninterface ILinkConfiguration {\n    appendTo?: HTMLElement;\n    href?: string;\n    target?: linkTarget;//target\n    value?: IValue | string; //value\n    type?: ILinkType; //type\n    title?: boolean; //title\n\n    readOnly?: boolean;\n    disabled?: boolean;\n    editable?: boolean;\n\n    // onClick ?: listenerCallback; //events\n\n    onClick?: (event: any) => void;\n    onBlur?: (event: any) => void;\n    onFocus?: (event: any) => void;\n    onContextMenu?: (event: any) => void;\n    onMouseDown?: (event: any) => void;\n    onChange?: (oldValue: string, newValue: string, eventOrigin?: LinkEventOrigin) => void;\n\n\n    //onfocus\n    //keyboard navigation -> on Enter open new tab\n    // rel // string | string[] with validation\n    ariaLabel?: string;\n\n    instanceID?: string;//\n\n    //css \n    underline?: boolean;\n\n    isInEditorPanel?: boolean;\n\n    //commonConfig \n    rtl?: boolean;\n    format?: string;\n    label?: string;\n    description?: string;\n    ariaLabelledby?: string;\n    descriptionRenderer?: {}; // need to discuss\n    descriptionRendererParams?: object,\n    generateEmptyDom?: boolean,\n\n    showErrorState?: boolean;\n    status?: 'error' | \"none\";\n    validationMessage?: string;\n    ariaDescribedby?: string;\n    validationMessageRenderer?: new () => ILinkErrorRenderer;\n    validationMessageRendererParams?: object;\n\n    labelRenderer?: { new(): IRenderer } | undefined;\n    labelRendererParams?: object;\n\n    required?: boolean;\n\n    clipboard?: IClipboard | boolean;\n\n}\n\nexport interface ILinkErrorRenderer {\n    getElement(): HTMLElement;\n    init(params: object): void;\n    destroy(): void;\n}\n\n// type ILinkType = 'mail' | 'telephone' | 'file'\ntype ILinkType = 'mail' | 'telephone' | 'file' | 'url' | 'whatsapp' | 'sms' | 'facetime' | 'skype' | 'ftp';\n\ntype LinkEventOrigin = 'api' | 'ui';\n\ntype listenerCallback = (event: Event) => void;\n\n// type linkTarget = '_blank' | '_self' | '_parent' | '_top' | string // frame validation no need\ntype linkTarget = '_blank' | '_self' | '_parent' | '_top' | 'none' | string // frame validation no need\n\nfunction getAnchorHref(type: ILinkType, value: string): string {\n    switch (type) {\n        case 'mail':\n            return `mailto:${value}`;\n        case 'telephone':\n            return `tel:${value}`;\n        case 'file':\n            return `/${value}`;\n        case 'url':\n            return value.startsWith('http://') || value.startsWith('https://') ? value : `http://${value}`;\n        case 'whatsapp':\n            return `https://wa.me/${value}`;\n        case 'sms':\n            return `sms:${value}`;\n        case 'facetime':\n            return `facetime:${value}`;\n        case 'skype':\n            return `skype:${value}?call`;\n        case 'ftp':\n            return `ftp://${value}`;\n        default:\n            return '';\n    }\n}\nfunction getClassName(type: any) {\n    const typeToClassMap = {\n        mail: 'dg-email__root',\n        telephone: 'dg-telephone__root',\n        file: 'dg-file__root',\n        url: 'dg-url__root',\n        whatsapp: 'dg-whatsapp__root',\n        sms: 'dg-sms__root',\n        facetime: 'dg-facetime__root',\n        skype: 'dg-skype__root',\n        ftp: 'dg-ftp__root'\n    };\n\n    return (typeToClassMap as any)[type] || 'dg-default__root';\n}\n\n\nfunction setMaxVisibleLines(anchorElement: any) {\n    setTimeout(() => {\n        const computedStyles = window.getComputedStyle(anchorElement);\n        const fontSize = parseFloat(computedStyles.fontSize);\n        const lineHeight = parseFloat(computedStyles.lineHeight) || fontSize * 1.2;\n        const containerHeight = anchorElement.clientHeight;\n        const maxLines = Math.floor(containerHeight / lineHeight)\n        anchorElement.style.overflow = 'hidden';\n        anchorElement.style.webkitLineClamp = maxLines.toString();\n    })\n}\nconst linkProperties = [\n    'appendTo',\n    'href',\n    'target',\n    'value',\n    'type',\n    'title',\n    'readOnly',\n    'disabled',\n    'editable',\n    'onClick',\n    'onBlur',\n    'onFocus',\n    'ariaLabel',\n    'instanceID',\n    'underline',\n    'isInEditorPanel',\n    'rtl',\n    'format',\n    'label',\n    'description',\n    \"required\",\n    \"label\",\n    \"clipboard\"\n]\nexport {\n    ILinkConfiguration,\n    listenerCallback,\n    linkTarget,\n    IValue,\n    getAnchorHref,\n    getClassName,\n    linkProperties,\n    setMaxVisibleLines,\n    LinkEventOrigin\n}\n\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { BEAN_NAME, traverseObject } from \"@dg/corecomponent\";\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport { ILinkConfiguration } from \"./link-configuration.types\";\nimport { LinkAPI } from \"./core/model/link-api\";\nimport { LinkOptionHandler } from \"./core/model/link-options-handler\";\nimport { IUserParams } from \"../utility/user-params.types\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { LinkControllerHandler } from \"./core/controller/link-controller-handler\";\nimport { LinkUserComponentHandler } from \"./core/model/link-user-component-handler\";\nimport { LinkStateHandler } from \"./core/model/link-state-handler\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\n// import { DescriptionComponent } from \"../description/description-view\";\nimport { Label } from \"../label/label-view\";\nimport { LinkStateManager } from \"./core/model/link-state-manager\";\nimport { ErrorComponent } from \"../error/error-view\";\nimport { DescriptionComponent } from \"../description/description-view\";\n\n\ninterface IUserConfigurationMergedParams {\n    configuration: any;\n    frameWorkOverrides: IFrameworkOverrides | null;\n    globalEventListener: Function | null;\n    frameworkComponentWrapper: any | null;\n    instanceID : string;\n}\n\nlet nextInstanceId = 1;\n\nclass LinkCoreComponent {\n\n    initialize(configuration : ILinkConfiguration, params : IUserParams = {}, createUI : CallableFunction) {\n\n        const instanceID = configuration.instanceID ?? String(nextInstanceId++);\n\n        const beanClasses = this.createBeanClasses();\n\n        const context = new Context();\n\n        const userConfiguration = this.createuserConfiguration(configuration, params, instanceID);\n\n        context.registerBeanClasses(beanClasses, userConfiguration);\n\n        this.registerCoreComponent(context);\n\n        this.registerDefaultUserComponent(context);\n\n        createUI(context);\n\n        (window as any).linkContext = context;\n\n    }\n\n    createBeanClasses() : Set<any> {\n        let beanClassList = [\n            LinkAPI,\n            LinkOptionHandler,\n            LinkControllerHandler,\n            LinkStateHandler,\n            LinkUserComponentHandler,\n\t\t\tUserComponentRegistry,\n            ComponentsRegistry,\n            EventHandler,\n            ComponentMetadataProvider,\n            LinkStateManager\n        ];\n        const beanClassSet = new Set(beanClassList);\n        return beanClassSet;\n    }\n\n    private createuserConfiguration(configuration : any, params : IUserParams, instanceID : string) : IUserConfigurationMergedParams {\n        let frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n    }\n\n    private registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n\n        \n    }\n\n\n\tprivate registerDefaultUserComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n    \n        };\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n}\nfunction createComponentList(): ComponentMeta[] {\n    let components: ComponentMeta[] = [{\n        componentName: 'text-label',\n        componentClass: Label\n    },\n    {\n        componentName : \"link-error\",\n        componentClass: ErrorComponent\n    },\n    {\n        componentName: 'text-helper',\n        componentClass : DescriptionComponent\n    }\n]\n    return components;\n}\nexport {\n    LinkCoreComponent\n}","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { LinkAPITypes } from \"./core/model/link-api.types\"\nimport { LinkBeanConstants } from \"./constants/link-constants\";\nimport { ILinkConfiguration } from \"./link-configuration.types\";\nimport { LinkRootView } from \"./core/view/link-root-view\";\nimport { LinkCoreComponent } from \"./link-core-component\";\nimport { IFrameworkOverrides } from \"@dg/corecomponent/FrameWork.js\";\nimport { IModule } from \"../core/modules.types\";\nimport { formatValue } from \"./core/model/PhoneFormatter\";\n\ninterface IUserParams {\n\tglobalEventListener      ?: Function;\n\tframeworkOverrides       ?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n\tmodules                  ?: IModule[];\n}\n\nclass Link {\n    public static formatPhoneNumber(value: string, format: string): string {\n        return formatValue(value, format);\n    }\n\n    public api !: LinkAPITypes;\n\n    constructor(configuration : ILinkConfiguration, params ?: IUserParams) {\n\n        const createUI = (context : Context) => {\n            this.api = context.getBean(LinkBeanConstants.LINK_API) as LinkAPITypes;\n            context.createBean(new LinkRootView(configuration.appendTo ??  document.body));\n        }\n\n        const linkCoreComponent = new LinkCoreComponent();\n        linkCoreComponent.initialize(configuration, params, createUI);\n    }\n\n}\n\nexport {\n    Link\n}","export const NUMBER_BEAN_NAME = {\n\tNUMBER_API               : 'numberAPI',\n\tNUMBER_CONFIGURATION     : 'configuration',\n\tCSSCLASSNAMEGENERATOR    : 'CSSClassNameGenartor',\n\tNUMBER_ADJUSTER_HANDLER  : 'NumberAdjusterHandler',\n\tFORMATTER                : 'formatter',\n\tKEYBOARD_SHORTCUT_HANDLER: 'KeyBoardShortCutsHandler',\n\tNUMBER_EVENT_HANDLER     : 'NumberEventHandler',\n\tNUMBER_CONTROLLER_HANDLER: 'NumberControllerHandler',\n\tNUMBER_TOOLTIP_HANDLER   : 'NumberTooltipHandler',\n};","export const EVENT_NAME = {\n    KEYDOWN  : 'keydown',\n    FOCUS    : 'focus',\n    BLUR     : 'blur',\n    MOUSEDOWN: 'mousedown',\n    CLICK    : 'click',\n    SHOW_TOOLTIP :'show_tooltip'\n}","import { clamp } from '@dg/utils';\nimport { INumberAdjusterModel } from './number-adjuster-model.types';\n\n\n\nexport class NumericModel{\n    private model           : INumberAdjusterModel;\n    private oldValue        : number | null ;\n    private isValid         : boolean | null;\n    private ariaLabelledby! : string;\n    private ariaDescribedby!: string;\n    private isEmpty : boolean;\n     \n\n\n    constructor(model: INumberAdjusterModel) {\n        this.model           = model;\n        this.oldValue        = this.model.getValue() as number;\n        this.isEmpty         = this.oldValue === null || this.oldValue === undefined;\n        this.isValid         = this.isWithinRange(this.oldValue);\n        this.ariaLabelledby  = generateUniqueId(\"aria-labelledby\");\n        this.ariaDescribedby = generateUniqueId(\"aria-describedby\");\n    }\n\n    getAriaLabelledby(): string{\n        return this.ariaLabelledby;\n    }\n\n    isEmty(): boolean{\n        return this.isEmpty;\n    }\n\n    setIsEmpty(value: boolean): void{\n        this.isEmpty = value;\n    }\n\n    getAriaDescribedby(): string{\n        return this.ariaDescribedby;\n\n    }\n\n    increment() {\n        const step = this.model.getStep();\n        this.incrementValue(step);\n    }\n\n    decrement() {\n        const step = this.model.getStep();\n        this.decrementValue(step);\n    }\n\n    incrementByLongStep() {\n        const longStep = this.model.getLongStep();\n        this.incrementValue(longStep);\n    }\n\n    decrementByLongStep() {\n        const longStep = this.model.getLongStep();\n        this.decrementValue(longStep);\n    }\n\n    incrementByShortStep() {\n        const shortStep = this.model.getShortStep();\n        this.incrementValue(shortStep);\n    }\n\n    decrementByShortStep() {\n        const shortStep = this.model.getShortStep();\n        this.decrementValue(shortStep);\n    }\n\n    blur(): void {\n        // Empty stays empty — do not coerce null/'' to 0 on blur\n        if (this.isEmpty) {\n            return;\n        }\n        const parsedValue = this.model.getValue();\n        const asString = String(parsedValue);\n        if (asString === '-' || asString === '+') {\n            this.setValue(null);\n            return;\n        }\n        // Always validate on blur, clamp if enabled\n        if (this.model.isClapValueOnBlur()) {\n            const value = clamp(\n                parsedValue,\n                this.model.getMinValue(),\n                this.model.getMaxValue(),\n            );\n            this.setValue(value.toString());\n        } else {\n            // Validate without clamping - setValue will handle validation\n            if (parsedValue !== null && parsedValue !== undefined && !isNaN(parsedValue)) {\n                this.setValue(parsedValue.toString());\n            }\n        }\n    }\n\n    setValue(value: string | null): void {\n       // Handle null values - treat as empty\n       if (value === null || value === undefined) {\n           this.model.setIsEmpty(true);\n           this.isValid = true;\n           this.oldValue = this.model.getValue();\n           this.model.onValueUpdate(0, '');\n           return;\n       }\n       \n       // Check if letter 'T' is in value, if so replace it with empty string\n       // Example: '32T' becomes '32'\n       const formattedValue = value.includes('T') ? value.replace(/T/g, '') : value;\n\n        if (formattedValue === '-' || formattedValue === '+') {\n            this.isValid = true;\n            this.model.setIsEmpty(false);\n            this.oldValue = this.model.getValue();\n            this.model.onValueUpdate(0, formattedValue);\n            return;\n        }\n\n       const numberValue = Number(formattedValue);\n\n        if (!Number.isFinite(numberValue)) {\n            return;\n        }\n\n        this.isValid = this.isWithinRange(numberValue);\n\n        if (this.isValid) {\n            this.model.onSuccess(numberValue);\n        } else {\n            // this.model.onError(value);\n            const minValue = this.model.getMinValue(); \n            const maxValue = this.model.getMaxValue();\n            const result =\n                numberValue < minValue ? 'min' :\n                numberValue > maxValue ? 'max' :\n                'max';\n            this.model.onError({type: result,value : numberValue});\n\n        }\n\n        if (!this.isValid && this.model.onBoundaryExceeded) {\n            this.model.onBoundaryExceeded(this.oldValue as number, numberValue);\n        }\n\n        if (numberValue === this.model.getMaxValue()) {\n            this.model.onMaxReached(numberValue);\n        } else if (numberValue === this.model.getMinValue()) {\n            this.model.onMinReached(numberValue);\n        }\n\n        this.oldValue = this.model.getValue();\n         this.model.onValueUpdate(numberValue, value);\n    }\n\n    incrementValue(step: number) {\n        this.model.setIsEmpty(false);\n        const newValue = (this.model.getValueAsNumber() ? this.model.getValueAsNumber() + step : 0+step).toString();\n        if (this.model.isKeepWithinRange()) {\n            if (newValue >= this.model.getMaxValue()) {\n                if (this.model.isWrapAround()) {\n                    this.setValue(this.model.getMinValue().toString());\n                } else {\n                    this.setValue(this.model.getMaxValue().toString());\n                }\n            } else {\n                this.setValue(newValue);\n            }\n        } else {\n            this.setValue(newValue);\n        }\n    }\n\n    decrementValue(step: number) {\n        this.model.setIsEmpty(false);\n        const newValue = (this.model.getValueAsNumber()?this.model.getValueAsNumber() - step:0 -step).toString();\n        if (this.model.isKeepWithinRange()) {\n            if (newValue <= this.model.getMinValue()) {\n                if (this.model.isWrapAround()) {\n                    this.setValue(this.model.getMaxValue().toString());\n                } else {\n                    this.setValue(this.model.getMinValue().toString());\n                }\n            } else {\n                this.setValue(newValue);\n            }\n        } else {\n            this.setValue(newValue);\n        }\n    }\n\n    isWithinRange(number: number): boolean {\n        if(number === undefined || number === null){\n            return true;\n        }\n        const keepWithinRange = this.model.isKeepWithinRange();\n        const max= this.model.getMaxValue();\n        const min = this.model.getMinValue();\n        return (keepWithinRange || (number >= min && number <= max));\n    }\n\n    isWithinMax(number: number): boolean {\n        // const keepWithinRange = this.model.isKeepWithinRange();\n        return   number < this.model.getMaxValue() || false;\n    }\n\n    isWithinMin(number: number): boolean {\n        // const keepWithinRange = this.model.isKeepWithinRange();\n        return  number > this.model.getMinValue() || false;\n    }\n\n    getValue(): number {\n        return this.model.getValue();\n    }\n\n    destroy(): void {\n        this.oldValue = null;\n        this.isValid = null;\n    }\n\n\tgetValid(): boolean {\n\t\treturn this.isValid as boolean;\n\t}\n    isIncrementDisabled(): boolean {\n        const value = this.model.getValue();\n        return  this.model.isKeepWithinRange() && value >= this.model.getMaxValue();\n    }\n\n    isDecrementDisabled(): boolean {\n        const value = this.model.getValue();\n        return this.model.isKeepWithinRange() && value <= this.model.getMinValue();\n    }\n}\n\n\n\n\nfunction generateUniqueId(prefix = 'id') {\n    return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;\n}\n","import { Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { NumericModel } from \"./number-adjuster-model\";\nimport { IErrorMeta, INumberAdjusterModel } from \"./number-adjuster-model.types\";\nimport { INumericAdjusterModel } from \"./number-adjuster.types\";\nimport type { NumberChangeOrigin } from \"./number-option-handler.types\";\n\n@Bean('NumberAdjusterHandler')\nexport class NumericAdjusterModel extends EventEmitter implements INumericAdjusterModel{\n\tprivate value       : number = 0;\n\tprivate valueString : string = '0';\n\tprivate model!      : NumericModel | null;\n\tprivate focus       : boolean = false;\n\tprivate lastEmittedValueString: string | null = null;\n\n\n\t@PostConstruct()\n\tinit() {\n\t\tthis.value        = this.optionsHandler.getValue();\n\t\tthis.valueString  =  this.optionsHandler.getValue() ? this.value.toString() : this.optionsHandler.getValue();\n\t\tthis.lastEmittedValueString = this.valueString ?? null;\n\n\t\tconst adjusterModel: INumberAdjusterModel = {\n\t\t\tgetValue: () => this.valueString,\n\t\t\tgetValueAsNumber : () => +this.valueString,\n\t\t\tisEmty: () => this.model?.isEmty() as boolean,\n\t\t\tgetMinValue: () => this.optionsHandler.getMin(),\n\t\t\tgetMaxValue: () => this.optionsHandler.getMax(),\n\t\t\tgetLongStep: () => this.optionsHandler.getLongStep(),\n\t\t\tgetShortStep: () => this.optionsHandler.getShortStep(),\n\t\t\tgetPrecision: () => this.optionsHandler.getPrecision(),\n\t\t\tgetStep: () => this.optionsHandler.getStep(),\n\t\t\tisClapValueOnBlur: () => this.optionsHandler.isClampValueOnBlur(),\n\t\t\tisKeepWithinRange: () => this.optionsHandler.isKeepWithinRange(),\n\t\t\tisWrapAround: () => this.optionsHandler.isAllowWrapAround(),\n\t\t\tonValueUpdate: (value: number, valuString : string) => this.onValueUpdate(value, valuString),\n\t\t\tonBoundaryExceeded: (oldValue: number, newValue: number) => this.onBoundaryExceeded(oldValue, newValue),\n\t\t\tonError: (meta :  IErrorMeta) => this.onError(meta),\n\t\t\tonSuccess: (value: number) => this.onSuccess(value),\n\t\t\tonMaxReached: (value: number) => this.onMaxReached(value),\n\t\t\tonMinReached: (value: number) => this.onMinReached(value),\n\t\t\tsetIsEmpty:  (value: boolean) => this.setIsEmpty(value)\n\t\t};\n\n\t\tthis.model = this.createManagedBean(new NumericModel(adjusterModel));\n\t\tconst isKeepWithinRange = adjusterModel.isKeepWithinRange();\n\t\tif(isKeepWithinRange){\n\t\t\tif(!this.model.isWithinMax(this.value)){\n\t\t\t\tthis.value = this.optionsHandler.getMax();\n\t\t\t}\n\t\t\tif(!this.model.isWithinMin(this.value)){\n\t\t\t\tthis.value = this.optionsHandler.getMin();\n\t\t\t}\n\t\t\tthis.valueString = this.value.toString();\n\t\t\tthis.lastEmittedValueString = this.valueString;\n\t\t}\n\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.model?.destroy();\n\t\t\tthis.model = null;\n\t\t});\n\t}\n\n\tincrement(): void {\n\t\tthis.model?.increment();\n\t}\n\n\n\n\tgetAriaLabelledby(): string{\n        return this.model?.getAriaLabelledby() as string;\n\n    }\n    getAriaDescribedby(): string{\n        return this.model?.getAriaDescribedby() as string;\n\n    }\n\n\tdecrement(): void {\n\t\tthis.model?.decrement();\n\t}\n\n\tblur(): void {\n\t\tthis.setFocus(false);\n\t\tthis.model?.blur();\n\t}\n\n\tincrementByLongStep(): void {\n\t\tthis.model?.incrementByLongStep();\n\t}\n\n\tdecrementByLongStep(): void {\n\t\tthis.model?.decrementByLongStep();\n\t}\n\n\tincrementByShortStep(): void {\n\t\tthis.model?.incrementByShortStep();\n\t}\n\n\tgetDefaultValue():number {\n\t\treturn this.optionsHandler.getDefaultValue();\n\t}\n\n\tdecrementByShortStep(): void {\n\t\tthis.model?.decrementByShortStep();\n\t}\n\n\tonValueUpdate(value: number, valueString : string): void {\n\t\tthis.value = value;\n\t\tthis.valueString = valueString;\n\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'EVENT_VALUE_UPDATE',\n\t\t});\n\t}\n\n\tcommitChange(eventOrigin: NumberChangeOrigin): void {\n\t\tconst previousValueString = this.lastEmittedValueString;\n\t\tconst currentValueString = this.valueString;\n\t\tconst previousWasEmpty =\n\t\t\tpreviousValueString === null ||\n\t\t\tpreviousValueString === undefined ||\n\t\t\tpreviousValueString === '';\n\t\tconst currentlyEmpty = this.isEmty();\n\n\t\t// Empty field focus/blur must not emit onChange when internal empty\n\t\t// representation shifts (null → '' / '0') without a user edit.\n\t\tif (previousWasEmpty && currentlyEmpty) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (previousValueString === currentValueString) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst oldValue = this.normalizeValue(previousValueString);\n\t\tconst newValue = this.normalizeValue(currentValueString);\n\n\t\tthis.optionsHandler.onChange(oldValue as number, newValue as number, eventOrigin);\n\t\tthis.lastEmittedValueString = currentValueString ?? null;\n\t}\n\n\tsetValue(value: string | null): void {\n\t\t// Reject non-finite numbers: allow typing but don't store - no refresh to avoid overwriting input\n\t\tif (value !== null && value !== undefined) {\n\t\t\tconst normalized = value.replace(/T/g, '').replace(/D/g, '.');\n\t\t\tif (normalized === '-' || normalized === '+') {\n\t\t\t\tthis.model?.setValue(value);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst num = Number(normalized);\n\t\t\tif (!Number.isFinite(num)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tthis.model?.setValue(value);\n\t}\n\n\tgetValue(): number | null{\n\t\treturn this.model?.getValue() ?? null;\n\t}\n\n\tonBoundaryExceeded(oldValue: number, currentValue: number): void {\n\t\tthis.dispatchEvent({\n\t\t\ttype: 'boundaryExceeded',\n\t\t\toldValue: oldValue,\n\t\t\tnewValue: currentValue,\n\t\t});\n\t}\n\n\tonSuccess(value: number): void {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('validateSuccess', { detail: { value } }),\n\t\t);\n\t}\n\n\tonError(meta :  IErrorMeta): void {\n\t\tthis.optionsHandler.onError(meta);\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('validateError', { detail: { meta } }),\n\t\t);\n\t}\n\n\tonMaxReached(value: number): void {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('EVENT_MAX_REACHED', { detail: { value } }),\n\t\t);\n\t}\n\n\tonMinReached(value: number): void {\n\t\tthis.dispatchEvent(\n\t\t\tnew CustomEvent('EVENT_MIN_REACHED', { detail: { value } }),\n\t\t);\n\t}\n\n\tsetFocus(focus: boolean): void {\n\t\tthis.focus = focus;\n\t}\n\n\tisFocused(): boolean {\n\t\treturn this.focus;\n\t}\n\n\tisValid(): boolean {\n\t\treturn this.model?.getValid() ?? false;\n\t}\n\n\tisWithinMax(): boolean {\n\t\treturn this.model?.isWithinMax(this.value) ?? false;\n\t}\n\n\tisWithinMin(): boolean {\n\t\treturn this.model?.isWithinMin(this.value) ?? false;\n\t}\n\n    isIncrementDisabled(): boolean {\n        return this.model?.isIncrementDisabled() ?? false;\n    }\n\n    isDecrementDisabled(): boolean {\n        return this.model?.isDecrementDisabled() ?? false;\n    }\n\tisEmty(): boolean {\n\t\treturn this.model?.isEmty() ?? false;\n\t}\n\n\tsetIsEmpty(value: boolean): void{\n\t\tthis.model?.setIsEmpty(value);\n\t}\n\tgetValueAsNumber() : number {\n\t\tif (!this.valueString) {\n\t\t\treturn this.value;\n\t\t}\n\t\t\n\t\tlet normalized = this.valueString;\n\t\tif (normalized === '.' || normalized.startsWith('.')) {\n\t\t\tnormalized = '0' + normalized;\n\t\t} else if (normalized.startsWith('-') && (normalized.slice(1) === '.' || normalized.slice(1).startsWith('.'))) {\n\t\t\tnormalized = '-0' + normalized.slice(1);\n\t\t}\n\t\tconst parsed = Number(normalized);\n\t\tif (!isNaN(parsed)) {\n\t\t\treturn parsed;\n\t\t}\n\n\t\tif (this.valueString.includes('e') || this.valueString.includes('E')) {\n\t\t\tconst scientificParsed = Number(this.valueString);\n\t\t\tif (!isNaN(scientificParsed)) {\n\t\t\t\treturn scientificParsed;\n\t\t\t}\n\t\t}\n\t\treturn this.value;\n\t}\n\n\tgetValueAsString() : string | null {\n\t\tif (this.model?.isEmty()) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.valueString;\n\t}\n\n\tprivate normalizeValue(value: string | number | null): number | null {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst parsed = Number(value);\n\t\tif (isNaN(parsed)) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn parsed;\n\t}\n\t\n}","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport {EventEmitter}from '@dg/corecomponent/EventEmitter.js';\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { INumberConfiguration } from \"../../number-configuration.types\";\nimport { NumberControllerHandler } from \"./number-controller\";\nimport { INumberAPI, subElement } from \"./number-api.types\";\nimport { INumericAdjusterModel } from \"./number-adjuster.types\";\nimport { NumberTooltipHandlerType } from \"./number-tooltip-handler.types\";\nimport { IFormatter } from \"../../formatter/formatter.types\";\nimport type { NumberOptionHandler } from \"./number-option-handler\";\nimport type { NumberStateManager } from \"./number-state-manager\";\n\n\n\n\n@Bean(NUMBER_BEAN_NAME.NUMBER_API)\nexport class NumberAPI extends EventEmitter implements INumberAPI{\n\n    @AutoWired('configuration') configuration!: INumberConfiguration;\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_CONTROLLER_HANDLER) controllerHandler !: NumberControllerHandler;\n\t@AutoWired('NumberAdjusterHandler') numberModel !: INumericAdjusterModel;\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_TOOLTIP_HANDLER) numberTooltipHandler!: NumberTooltipHandlerType;\n    @AutoWired(NUMBER_BEAN_NAME.FORMATTER) formatter !: IFormatter;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler !: NumberOptionHandler;\n    @AutoWired(\"stateManager\") private stateManager !: NumberStateManager;\n\n    disable(_force: boolean): void {\n       this.updateProperties({\n           disabled: true\n       })\n    }\n    setFocus(_position?: number | undefined, _selectContent?: boolean | undefined): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    hide(subElement?: subElement[]): void {\n        if (!subElement || subElement.length === 0) {\n            // Hide the entire component if no specific elements are specified\n            return this.controllerHandler.getNumberCtrl().hide([]);\n        }\n\n        // Validate that all elements in subElement are valid\n        const validElements = subElement.filter(element => \n            ['prefix', 'suffix', 'label', 'description', 'inputPrefix', 'inputSuffix', 'container', 'tooltip', 'errorMessage', 'validationMessage'].includes(element)\n        );\n\n        if (validElements.length === 0) {\n            console.warn('No valid elements specified to hide');\n            return;\n        }\n\n        return this.controllerHandler.getNumberCtrl().hide(validElements);\n    }\n    show(subElement?: subElement[]): void {\n        if (!subElement || subElement.length === 0) {\n            // Hide the entire component if no specific elements are specified\n            return this.controllerHandler.getNumberCtrl().show([]);\n        }\n\n        // Validate that all elements in subElement are valid\n        const validElements = subElement.filter(element => \n            ['prefix', 'suffix', 'label', 'description', 'inputPrefix', 'inputSuffix', 'container', 'tooltip', 'errorMessage', 'validationMessage'].includes(element)\n        );\n\n        if (validElements.length === 0) {\n            console.warn('No valid elements specified to show');\n            return;\n        }\n\n        return this.controllerHandler.getNumberCtrl().show(validElements);\n    }\n\n    isValid(): boolean {\n        return !this.stateManager.isInValid();\n    }\n\n    getProperties(): INumberConfiguration {\n       return this.configuration;\n    }\n   \n\n    getName() { \n        return NUMBER_BEAN_NAME.NUMBER_API\n    };\n\n\n    getElement() : HTMLElement {\n        return this.controllerHandler.getNumberCtrl().getElement() as HTMLElement;\n    }\n\n    getValue():number | null{\n        const isEmty = this.numberModel.isEmty();\n        if(isEmty){\n            return null;\n        }\n        const numValue = this.numberModel.getValueAsNumber();\n        const stringValue = this.numberModel.getValueAsString();\n        \n        if (!stringValue) {\n            return numValue;\n        }\n    \n        // If stringValue contains scientific notation, parse it to get the correct numeric value\n        const stringValueHasScientificNotation = stringValue.includes('e') || stringValue.includes('E');\n        if (stringValueHasScientificNotation) {\n            const parsed = Number(stringValue);\n            // Return the parsed numeric value, not the string\n            return isNaN(parsed) ? numValue : parsed;\n        }\n        \n        const numValueString = numValue.toString();\n        const hasScientificNotation = numValueString.includes('e') || numValueString.includes('E');\n        \n        // If the number value has scientific notation but the string doesn't, use the string to get the correct value\n        if (hasScientificNotation && !stringValueHasScientificNotation) {\n            const parsed = Number(stringValue);\n            return isNaN(parsed) ? numValue : parsed;\n        }\n        \n        // If the number exceeds MAX_SAFE_INTEGER and string doesn't have scientific notation, use string value\n        if (Math.abs(numValue) > Number.MAX_SAFE_INTEGER && !stringValueHasScientificNotation) {\n            const parsed = Number(stringValue);\n            // Return the parsed value (it's still a number, even if it would display in scientific notation)\n            return parsed;\n        }\n        \n        return numValue;\n    }\n\n    focus():void{\n        this.controllerHandler.getNumberCtrl().focus();\n    }\n\n    setValue(value:number):void{\n        \n        if (!isNaN(value)) {\n            this.numberModel.setIsEmpty(false);\n            const valueString = value ? value.toString() : value;\n\n            this.numberModel.setValue(valueString as string);\n            this.numberModel.commitChange('api');\n        }\n\n    }\n\n    validate():boolean{\n        return this.numberModel.isValid();\n    }\n\n    resetValue():void{\n        const value = this.numberModel.getDefaultValue();\n        const valueString = value ? value.toString() : value;\n        this.numberModel.onValueUpdate(value, valueString as string);\n    }\n\n    clear():void{\n        this.numberModel.setIsEmpty(true); \n        this.numberModel.onValueUpdate(0, '0');\n\n    }\n\n    increment():void{\n        const oldValue = this.numberModel.getValue();\n        this.numberModel.increment();\n        const newValue = this.numberModel.getValue();\n        this.optionsHandler.onIncrement(oldValue, newValue);\n    }\n\n    decrement():void{\n        const oldValue = this.numberModel.getValue();\n        this.numberModel.decrement();\n        const newValue = this.numberModel.getValue();\n        this.optionsHandler.onDecrement(oldValue, newValue);\n    }\n\n    blur(): void{\n        this.controllerHandler.getNumberCtrl().blur();\n\n    }\n\n     destroy(): void {\n        this.controllerHandler.getNumberCtrl().destroy();\n        this.numberTooltipHandler.destroyTooltip();\n    }\n\n    updateProperties(properties: INumberConfiguration): void {\n        // Iterate over the keys of properties and update configuration\n        Object.entries(properties).forEach(([key, value]) => {\n            // if (value !== undefined) {\n                // Cast key as keyof INumberConfiguration to maintain type safety\n                (this.configuration as any)[key] = value; \n            // }\n        });\n\n        // properties.value = !properties.value ? this.numberModel.getValue() : properties.value\n    \n        // If 'value' is specifically updated, handle it separately\n        \n        if(properties.hasOwnProperty(\"value\") && containsNumberOnly(properties.value)){\n            if(typeof properties.value === 'string' || properties.value == null) {\n                this.numberModel.setValue(null)\n                this.numberModel.setIsEmpty(true); \n            }else {\n                this.numberModel.setValue(properties.value!.toString())\n                this.numberModel.setIsEmpty(false); \n            }\n            \n        }\n\n        this.dispatchEvent({\n            type: \"PROPERTY_CHANGED\",\n            options: properties,\n        });\n\n        // if(properties.prefix !== undefined){\n        //     this.dispatchEvent({\n        //         type: \"EVENT_SET_PREFIX\",\n        //         options: properties,\n        //     });\n        // }\n        // if(properties.suffix!== undefined){\n        //     this.dispatchEvent({\n        //         type: \"EVENT_SET_SUFFIX\",\n        //         options: properties,\n        //     });\n        // }\n\n        if(properties.hasOwnProperty(\"value\")) {\n            if(properties.value === null){\n                this.numberModel.setValue(null);\n                this.numberModel.setIsEmpty(true);\n\n                this.dispatchEvent({\n                    type: \"EVENT_CLEAR_VALUE\",\n                    options: properties,\n                });\n            }else if(properties.value !== undefined  && !isNaN(properties.value as number)){ \n                const formattedValue = properties.value.toString();\n                this.numberModel.setValue(formattedValue);\n            }\n        }\n        \n\n        \n        \n    \n        // Dispatch the event to notify listeners of the property changes\n       \n        \n        \n    }\n\n    destroyToolTip(): void {\n        this.numberTooltipHandler.destroyTooltip();\n    }\n\n    openToolTip(): void {\n        this.numberTooltipHandler.createToolTip(this.getElement())\n        this.numberTooltipHandler.openToolTip();\n    }\n\n    getFormattedValue(){\n        return this.formatter.formatter()\n    }\n\n    showErrorMessage(message ?: string): void {\n        message && this.optionHandler.updateValidationMessage(message);\n        this.optionHandler.updateStatus('error');\n    }\n\n    hideErrorMessage(): void {\n        this.optionHandler.updateValidationMessage(\"\");\n        this.optionHandler.updateStatus(\"none\");\n    }\n}\n\n\nfunction containsNumberOnly(_value: any): boolean{\n    // need to be implement the locgc for number check\n\n\n    return true;\n\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Bean } from \"@dg/corecomponent\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { NumberController } from \"../number-root/number-root-controller\";\n\n@Bean(NUMBER_BEAN_NAME.NUMBER_CONTROLLER_HANDLER)\nexport class NumberControllerHandler extends EventEmitter {\n\tprivate numberCtrl!: any;\n\tregisterNumber(numberCtrl: any): void {\n\t\tthis.numberCtrl = numberCtrl;\n\t}\n\n\tgetNumberCtrl(): NumberController {\n\t\treturn this.numberCtrl;\n\t}\n}","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { INumberEventHandler } from \"./number-event-handler.types\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { INumericAdjusterModel } from \"./number-adjuster.types\";\nimport { NumberTooltipHandlerType } from \"./number-tooltip-handler.types\";\nimport { EVENT_NAME } from \"../../constants/event-name\";\nimport { INumberOptionHandler } from \"./number-option-handler.types\";\n\n\n\n\n@Bean(NUMBER_BEAN_NAME.NUMBER_EVENT_HANDLER)\nexport class NumberEventHandler extends EventEmitter implements INumberEventHandler {\n\t\n    \n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_ADJUSTER_HANDLER)\n\tnumberModel!: INumericAdjusterModel;\n\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_TOOLTIP_HANDLER)\n\tnumberTooltipHandler!: NumberTooltipHandlerType;\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER)\n\toptionsHandler!: INumberOptionHandler;\n    \n\n    private dotCount = 0;\n\n    private  allowedKeys = [ \n        'Backspace', 'Enter', 'Tab', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown',\n        'Home', 'End', 'Delete', 'e', '-', '+','Control', 'Meta'\n    ];\n\n\n\n\n    onKeyDown(event: KeyboardEvent): void {\n        const char = event.key;\n        // Stop propagation for special keys like Control, Command, and Shift\n        const preventState = this.optionsHandler.onKeydown(event);\n    \n        // Prevent default behavior based on custom logic\n        if (preventState) {\n            event.preventDefault();\n            this.dispatchEvent({\n                type: EVENT_NAME.SHOW_TOOLTIP,\n            });\n        }\n        if((event.ctrlKey || event.metaKey) && char === \"a\"){\n            event.stopPropagation();\n            (event.target as HTMLInputElement).select();\n        }\n       \n\n        if (event.ctrlKey || event.metaKey  || ['Control', 'Meta', 'Shift'].includes(char)) {\n            if (['c', 'v', 'x', 'z', 'a', 'y','r',1,2,3,4,5,6,7,8,9,'1','2','3','4','5','6','7','8','9'].includes(char.toLowerCase())) {\n                return; // Allow common browser shortcuts\n            }\n            event.stopPropagation();\n        }\n        if(event.shiftKey && !['Tab'].includes(char)){\n            event.stopPropagation();\n        }\n        \n\n        const decimalSeparator = this.optionsHandler.getDecimalSeparator();\n        const thousandSeparator = this.optionsHandler.getThousandSeparatorChar();\n        \n        // Prevent typing thousand separator if the previous character is already a thousand separator\n        if (thousandSeparator && char === thousandSeparator) {\n            const inputElement = event.target as HTMLInputElement;\n            if (inputElement) {\n                const currentValue = inputElement.value;\n                const cursorPosition = inputElement.selectionStart || 0;\n                const previousChar = currentValue[cursorPosition - 1];\n                \n                // If previous character is a thousand separator, prevent typing another one\n                if (previousChar === thousandSeparator) {\n                    event.preventDefault();\n                    this.dispatchEvent({\n                        type: EVENT_NAME.SHOW_TOOLTIP,\n                    });\n                    return;\n                }\n            }\n        }\n        \n        // Handle decimal separator: if one already exists, move it to the end instead of preventing\n        if (char === decimalSeparator) {\n            const inputElement = event.target as HTMLInputElement;\n            if (inputElement) {\n                const currentValue = inputElement.value;\n                \n                // Check if decimal separator already exists in the value\n                if (currentValue.includes(decimalSeparator)) {\n                    event.preventDefault();\n                    // Remove the existing decimal separator and add it at the end\n                    const valueWithoutDecimal = currentValue.replace(new RegExp(this.escapeRegExp(decimalSeparator), 'g'), '');\n                    const newValue = valueWithoutDecimal + decimalSeparator;\n                    inputElement.value = newValue;\n                    // Move cursor to after the decimal separator at the end\n                    inputElement.setSelectionRange(newValue.length, newValue.length);\n                    return;\n                }\n                \n                // If thousand separator is space, also prevent decimal separator right after space\n                if (thousandSeparator === \" \") {\n                    const cursorPosition = inputElement.selectionStart || 0;\n                    const previousChar = currentValue[cursorPosition - 1];\n                    \n                    // If previous character is space (thousand separator), prevent decimal separator\n                    // This prevents double space from being converted to dot\n                    if (previousChar === \" \") {\n                        event.preventDefault();\n                        this.dispatchEvent({\n                            type: EVENT_NAME.SHOW_TOOLTIP,\n                        });\n                        return;\n                    }\n                }\n            }\n        }\n        \n        const allowedKeysWithDecimal = [...this.allowedKeys];\n        if (!allowedKeysWithDecimal.includes(decimalSeparator)) {\n            allowedKeysWithDecimal.push(decimalSeparator);\n        }\n        \n        if (thousandSeparator  && !allowedKeysWithDecimal.includes(thousandSeparator)) {\n            allowedKeysWithDecimal.push(thousandSeparator);\n        }\n        \n        if (allowedKeysWithDecimal.includes(char)) {\n            return;\n        }\n\n        // Handle space key: allow if it's the thousand separator, prevent otherwise\n        if (char === \" \") {\n            // If space is the thousand separator, it's already handled above (line 70-86)\n            // If space is NOT the thousand separator, prevent it\n            if (thousandSeparator !== \" \") {\n                this.dispatchEvent({\n                    type: EVENT_NAME.SHOW_TOOLTIP,\n                });\n                event.preventDefault();\n                return;\n            }\n            // If space IS the thousand separator, allow it (consecutive spaces already prevented above)\n            return;\n        }\n\n        if ((event.shiftKey && /^[a-zA-Z]$/.test(char)|| char ===\" \")) {\n            this.dispatchEvent({\n                type: EVENT_NAME.SHOW_TOOLTIP,\n            });\n            event.preventDefault();\n            return;\n        }\n\n        // Prevent combinations of Shift + Cmd/Meta + printable characters\n        if ((event.metaKey || event.shiftKey) && char.length === 1) {\n            this.dispatchEvent({\n                type: EVENT_NAME.SHOW_TOOLTIP,\n            });\n            event.preventDefault();\n            return;\n        }\n    \n        \n        const decimalSeparatorEscaped = this.escapeRegExp(decimalSeparator);\n        const thousandSeparatorEscaped = thousandSeparator ? this.escapeRegExp(thousandSeparator) : '';\n        const regex = thousandSeparator\n            ? new RegExp(`^[\\\\d${thousandSeparatorEscaped}${decimalSeparatorEscaped}]$`) \n            : new RegExp(`^[\\\\d${decimalSeparatorEscaped}]$`);\n    \n        // Block invalid characters\n        if (!regex.test(char)) {\n            if (/^[a-zA-Z]$|[^\\w\\s]/.test(char)) {\n                this.dispatchEvent({\n                    type: EVENT_NAME.SHOW_TOOLTIP,\n                });\n            }\n    \n            event.preventDefault(); // Block invalid input\n            return;\n        }\n    }\n    \n    private escapeRegExp(string: string): string {\n        return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n    }\n    \n    /**\n     * Formats a number string with thousand separators\n     * @param value - The number string (with internal placeholders: 'D' for decimal, 'T' for thousand)\n     * @param groupingSeparator - The configured grouping separator to use in display\n     * @param internalDecimalSeparator - The internal decimal separator placeholder ('D')\n     * @returns Formatted string with thousand separators\n     */\n    private formatWithThousandSeparator(value: string, groupingSeparator: string | null, internalDecimalSeparator: string): string {\n        if (!groupingSeparator || value === '' || value === '-') {\n            return value;\n        }\n        \n        const internalThousandSeparator = 'T';\n        const isNegative = value.startsWith('-');\n        const valueWithoutSign = isNegative ? value.substring(1) : value;\n        \n        // Check if the original value contains a decimal separator (even if no decimal part yet)\n        const hasDecimalSeparator = valueWithoutSign.includes(internalDecimalSeparator);\n        \n        // Split into integer and decimal parts using internal placeholder\n        const parts = valueWithoutSign.split(internalDecimalSeparator);\n        let integerPart = parts[0];\n        const decimalPart = parts[1] || '';\n        \n        // Remove any existing thousand separator placeholders from integer part before formatting\n        integerPart = integerPart.replace(new RegExp(internalThousandSeparator, 'g'), '');\n        \n        // Format integer part with thousand separators (every 3 digits from right)\n        if (integerPart.length > 3) {\n            const formattedInteger = integerPart.replace(/\\B(?=(\\d{3})+(?!\\d))/g, groupingSeparator);\n            integerPart = formattedInteger;\n        }\n        \n        // Reconstruct the value (keep internal placeholders for now, will be converted to display format later)\n        let formattedValue = integerPart;\n        // Preserve decimal separator even if decimalPart is empty (user is typing decimal separator)\n        if (decimalPart || hasDecimalSeparator) {\n            formattedValue += internalDecimalSeparator + decimalPart;\n        }\n        \n        return isNegative ? '-' + formattedValue : formattedValue;\n    }\n    \n    \n    \n    \n    \n    \n    // onInput(event: Event): void {\n    //     const inputElement = event.target as HTMLInputElement;\n    //     let value = inputElement.value;\n    \n    //     // Remove all characters except numbers and dots\n    //     value = value.replace(/[^0-9.]/g, '');\n    \n    //     // If there are multiple dots, remove the last one\n    //     const dotCount = (value.match(/\\./g) || []).length;\n    //     if (dotCount > 1) {\n    //         const lastDotIndex = value.lastIndexOf('.');\n    //         value = value.slice(0, lastDotIndex) ;\n    //     }\n    \n    //     // Convert sanitized value to a number\n    //     const numericValue = Number(value);\n    \n    //     // Check if it's a valid number, else set to 0\n    //     if (isNaN(numericValue) || inputElement.value === '') {\n    //         this.numberModel.setValue(0); // Or handle as appropriate\n    //         this.numberModel.setIsEmpty(true);\n    //     } else {\n    //         this.numberModel.setValue(numericValue);\n    //         this.numberModel.setIsEmpty(false);\n    //     }\n\n    //     // Trigger the `onInput` handler for any additional logic\n    //     this.optionsHandler.onInput(event);\n    // }\n\n    onInput(event: Event): void {\n        const inputElement = event.target as HTMLInputElement;\n        let inputValue = inputElement.value;\n        \n        const decimalSeparator = this.optionsHandler.getDecimalSeparator();\n        const decimalSeparatorEscaped = this.escapeRegExp(decimalSeparator);\n        const groupingSeparator = this.optionsHandler.getThousandSeparatorChar();\n        const groupingSeparatorEscaped = groupingSeparator ? this.escapeRegExp(groupingSeparator) : '';\n        \n        // Internal decimal separator is always '.' for numeric processing\n        const internalDecimalSeparator = 'D';\n        const internalDecimalSeparatorEscaped = this.escapeRegExp(internalDecimalSeparator);\n        \n        // Internal thousand separator is always ',' for numeric processing\n        const internalThousandSeparator = 'T';\n        const internalThousandSeparatorEscaped = this.escapeRegExp(internalThousandSeparator);\n        \n        // Check if value contains scientific notation (E or e)\n        const hasScientificNotation = /[eE]/.test(inputValue);\n        \n        // If thousand separator is space, fix double space -> dot conversion immediately\n        if (groupingSeparator === \" \") {\n            // Replace \" .\" (space + dot) with just space (double space converted to dot)\n            if (decimalSeparator === \".\") {\n                inputValue = inputValue.replace(/\\s\\./g, ' ');\n            }\n            // Also collapse any consecutive spaces to single space\n            inputValue = inputValue.replace(/\\s{2,}/g, ' ');\n            \n            // Update input element immediately if we fixed the value\n            if (inputValue !== inputElement.value) {\n                const cursorPosition = inputElement.selectionStart || 0;\n                inputElement.value = inputValue;\n                const newPosition = Math.min(cursorPosition, inputValue.length);\n                inputElement.setSelectionRange(newPosition, newPosition);\n            }\n        }\n        \n        // Clean input value: remove invalid characters but preserve configured separators\n        // If scientific notation is present, also allow E, e, +, - for the exponent part\n        const allowedInputPattern = hasScientificNotation \n            ? `[^0-9${decimalSeparatorEscaped}${groupingSeparatorEscaped}\\\\-eE\\\\+]`\n            : `[^0-9${decimalSeparatorEscaped}${groupingSeparatorEscaped}\\\\-]`;\n        let cleanedInputValue = inputValue.replace(new RegExp(allowedInputPattern, 'g'), '');\n        \n        // If thousand separator is space, ensure no \" .\" pattern remains after cleaning\n        if (groupingSeparator === \" \" && decimalSeparator === \".\") {\n            cleanedInputValue = cleanedInputValue.replace(/\\s\\./g, ' ');\n        }\n        \n        // Update input element to preserve grouping separator in display\n        if (cleanedInputValue !== inputValue) {\n            // Preserve cursor position\n            const cursorPosition = inputElement.selectionStart || 0;\n            inputElement.value = cleanedInputValue;\n            // Restore cursor position (adjust for removed characters)\n            const newPosition = Math.min(cursorPosition, cleanedInputValue.length);\n            inputElement.setSelectionRange(newPosition, newPosition);\n        }\n        \n        // Create a copy for numeric processing\n        let value = cleanedInputValue;\n        \n        // If scientific notation is present, don't convert decimal separators\n        // Skip decimal separator conversion if E or e is present\n        if (!hasScientificNotation) {\n            // Convert grouping separator to 'T' placeholder for internal processing (similar to decimal separator conversion)\n            // Enable thousand separator if groupingSeparator is provided and not null\n            // Only convert if grouping separator is different from decimal separator to avoid conflicts\n            if (groupingSeparator && groupingSeparator !== decimalSeparator && groupingSeparator !== internalThousandSeparator) {\n                value = value.replace(new RegExp(groupingSeparatorEscaped, 'g'), internalThousandSeparator);\n            }\n            \n            // Convert decimal separator to 'D' placeholder for internal processing\n            if (decimalSeparator !== internalDecimalSeparator && value.includes(decimalSeparator)) {\n                value = value.replace(new RegExp(decimalSeparatorEscaped, 'g'), internalDecimalSeparator);\n            }\n        }\n    \n        // Allow only numbers, a single leading minus sign, decimal placeholder, and thousand placeholder\n        // At this point, value should have 'D' as decimal placeholder and 'T' as thousand placeholder (converted above)\n        // If scientific notation is present, also preserve E, e, + for the exponent part\n        if (hasScientificNotation) {\n            value = value.replace(new RegExp(`[^0-9${internalDecimalSeparatorEscaped}${internalThousandSeparatorEscaped}\\\\-eE\\\\+]`, 'g'), ''); // Remove invalid characters but preserve scientific notation\n        } else {\n            value = value.replace(new RegExp(`[^0-9${internalDecimalSeparatorEscaped}${internalThousandSeparatorEscaped}\\\\-]`, 'g'), ''); // Remove invalid characters\n        }\n        \n        // Prevent multiple decimal separators - keep only the first one\n        if (value.includes(internalDecimalSeparator)) {\n            const decimalSeparatorIndex = value.indexOf(internalDecimalSeparator);\n            // Keep only the first decimal separator, remove all others\n            value = value.substring(0, decimalSeparatorIndex + 1) + value.substring(decimalSeparatorIndex + 1).replace(new RegExp(internalDecimalSeparatorEscaped, 'g'), '');\n        }\n        \n        // Prevent consecutive thousand separators - remove duplicate 'T' placeholders\n        if (value.includes(internalThousandSeparator)) {\n            // Replace consecutive thousand separators with a single one\n            const consecutiveThousandSeparatorRegex = new RegExp(`${internalThousandSeparatorEscaped}+`, 'g');\n            value = value.replace(consecutiveThousandSeparatorRegex, internalThousandSeparator);\n        }\n    \n        // Ensure the minus sign is only at the beginning\n        if (value.includes('-')) {\n            // Check if '-' is not at the start\n            if (!value.startsWith('-')) {\n                value = value.replace(/-/g, ''); // Remove all '-' if not at the start\n            }\n        \n            // Check if '-' appears more than once\n            if ((value.match(/-/g) || []).length > 1) {\n\n                // Validate the value: Keep only the first valid '-' at the start\n                if(value.startsWith('-')){\n                    value = value.replace('-', '');\n                }\n                const indexOfDash = value.indexOf('-');\n                value = value.substring(0, indexOfDash).replace(/[^0-9]/g, ''); // Get only digits before '-'\n                    \n                // value = value.replace(/-/g, ''); // Remove all '-'\n                value = '-' + value; // Add '-' at the start if needed\n            }\n        }\n    \n        // At this point, value should have 'D' as decimal placeholder and 'T' as thousand placeholder (converted above)\n        // If scientific notation is present, skip decimal separator count check and conversion\n        if (!hasScientificNotation) {\n            this.dotCount = (value.match(new RegExp(internalDecimalSeparatorEscaped, 'g')) || []).length;\n            if (this.dotCount > 1) {\n                // Keep only the first dot and remove all others\n                value = value.replace(new RegExp(`${internalDecimalSeparatorEscaped}(?=.*${internalDecimalSeparatorEscaped})`, 'g'), '');\n                this.dotCount = 1;\n            }\n        } else {\n            // For scientific notation, count decimal separators in the mantissa part (before E/e)\n            const mantissaPart = value.split(/[eE]/)[0];\n            this.dotCount = (mantissaPart.match(new RegExp(internalDecimalSeparatorEscaped, 'g')) || []).length;\n        }\n    \n        // Format value for numeric conversion: replace 'D' with '.' and 'T' with '' (empty string)\n        // This formatted value will be used for numeric processing\n        // If scientific notation is present and decimal separator wasn't converted, convert it now for numeric processing\n        let formattedNumericValue = value;\n        if (hasScientificNotation) {\n            // For scientific notation, convert decimal separator to '.' only in the mantissa part (before E/e)\n            const scientificNotationMatch = formattedNumericValue.match(/[eE]/);\n            if (scientificNotationMatch) {\n                const eIndex = scientificNotationMatch.index!;\n                const mantissa = formattedNumericValue.substring(0, eIndex);\n                const exponent = formattedNumericValue.substring(eIndex);\n                // Convert decimal separator to '.' in mantissa if it wasn't already converted\n                const mantissaFormatted = mantissa.includes('D') \n                    ? mantissa.replace(/D/g, '.')\n                    : (decimalSeparator !== '.' && mantissa.includes(decimalSeparator)\n                        ? mantissa.replace(new RegExp(decimalSeparatorEscaped, 'g'), '.')\n                        : mantissa);\n                formattedNumericValue = mantissaFormatted + exponent;\n            }\n            // Remove thousand separators for numeric processing\n            formattedNumericValue = formattedNumericValue.replace(/T/g, '');\n        } else {\n            formattedNumericValue = formattedNumericValue.replace(/D/g, '.');\n            // Remove thousand separators for numeric processing\n            formattedNumericValue = formattedNumericValue.replace(/T/g, '');\n        }\n    \n        // Format display value with thousand separators\n        // First format with thousand separators (value has 'D' as decimal and 'T' as thousand placeholders internally)\n        let displayValue = value;\n        \n        // If scientific notation is present, don't format with thousand separators or convert decimal separators\n        if (!hasScientificNotation) {\n            if (groupingSeparator && groupingSeparator !== decimalSeparator) {\n                displayValue = this.formatWithThousandSeparator(value, groupingSeparator, internalDecimalSeparator);\n            }\n            \n            // Convert any remaining internal thousand separator placeholder 'T' to configured grouping separator\n            if (groupingSeparator && displayValue.includes(internalThousandSeparator)) {\n                displayValue = displayValue.replace(new RegExp(internalThousandSeparatorEscaped, 'g'), groupingSeparator);\n            }\n            \n            // Convert internal decimal separator placeholder 'D' back to configured decimal separator for display\n            if (decimalSeparator !== internalDecimalSeparator && displayValue.includes(internalDecimalSeparator)) {\n                displayValue = displayValue.replace(new RegExp(internalDecimalSeparatorEscaped, 'g'), decimalSeparator);\n            }\n        } else {\n            // For scientific notation, preserve the original format (decimal separator not converted)\n            // Just remove any internal thousand separator placeholders if they exist\n            if (groupingSeparator && displayValue.includes(internalThousandSeparator)) {\n                displayValue = displayValue.replace(new RegExp(internalThousandSeparatorEscaped, 'g'), groupingSeparator);\n            }\n        }\n        \n        // // Update input element to show formatted value with thousand separators\n        // if (displayValue !== inputElement.value) {\n        //     const cursorPosition = inputElement.selectionStart || 0;\n        //     inputElement.value = displayValue;\n        //     // Adjust cursor position to account for added/removed separators\n        //     const newPosition = Math.min(cursorPosition, displayValue.length);\n        //     inputElement.setSelectionRange(newPosition, newPosition);\n        // }\n    \n        // Check if it's a valid number, else set to 0\n        // If value is empty or contains only placeholders (after processing), treat as empty\n        // At this point, value should have 'D' as decimal placeholder and 'T' as thousand placeholder (converted above)\n        const valueWithoutSeparators = value.replace(new RegExp(`[${internalDecimalSeparatorEscaped}${internalThousandSeparatorEscaped}\\\\-]`, 'g'), '');\n        if (value === '-' || value === '+') {\n            this.numberModel.setIsEmpty(false);\n            this.numberModel.setValue(value);\n        } else if(value ==='0'){\n            this.numberModel.setIsEmpty(false);\n            this.numberModel.setValue('0'); // Or handle as appropriate\n        }else if (value === '' || valueWithoutSeparators === '') {\n            // Value is empty or contains only separators (grouping or decimal)\n            // Keep empty as null — do not coerce to '0' (that falsely triggers onChange on blur)\n            if (value === '') {\n                this.numberModel.setIsEmpty(true);\n                this.numberModel.setValue(null);\n            }\n            // If value contains only separators (like just \".\" when dot is grouping separator),\n            // don't update the model - let user continue typing\n        } else {\n            this.numberModel.setIsEmpty(false);\n            // If scientific notation is present, preserve the original cleaned input value to avoid precision loss\n            // Otherwise, use the formatted numeric value\n            if (hasScientificNotation) {\n                // For scientific notation, use the cleaned input value (with decimal separator preserved)\n                // but ensure decimal separator is '.' for JavaScript Number() parsing\n                let scientificValue = cleanedInputValue;\n                // Convert decimal separator to '.' only if it's not already '.'\n                if (decimalSeparator !== '.' && scientificValue.includes(decimalSeparator)) {\n                    // Only convert in the mantissa part (before E/e)\n                    const scientificNotationMatch = scientificValue.match(/[eE]/);\n                    if (scientificNotationMatch) {\n                        const eIndex = scientificNotationMatch.index!;\n                        const mantissa = scientificValue.substring(0, eIndex);\n                        const exponent = scientificValue.substring(eIndex);\n                        const mantissaFormatted = mantissa.replace(new RegExp(decimalSeparatorEscaped, 'g'), '.');\n                        scientificValue = mantissaFormatted + exponent;\n                    }\n                }\n                // Remove thousand separators if present\n                if (groupingSeparator && scientificValue.includes(groupingSeparator)) {\n                    scientificValue = scientificValue.replace(new RegExp(groupingSeparatorEscaped, 'g'), '');\n                }\n                this.numberModel.setValue(scientificValue);\n            } else {\n                // Pass formatted value (with 'D' -> '.' and 'T' -> '') for numeric processing\n                this.numberModel.setValue(formattedNumericValue);\n            }\n        }\n    \n        // Trigger the `onInput` handler for any additional logic\n        // this.optionsHandler.onInput(this.numberModel.getValue());\n        this.optionsHandler.onInput(this.numberModel.getValue() as number);\n    }\n    \n\n\tonFocus(_event?: FocusEvent): void {\n       this.numberModel.setFocus(true);\n    //    this.dispatchEvent({\n\t// \t\ttype: 'EVENT_FOCUS_IN',\n\t// \t\tevent,\n\t// \t});\n        // this.optionsHandler.onFocus(event)\n\t}\n\n\tonFocusOut(event: FocusEvent): void {\n        // Set focus to false FIRST, before processing input\n        // This ensures that any EVENT_VALUE_UPDATE triggered by onInput will format the value correctly\n        this.numberModel.setFocus(false);\n        \n        // Process the current input value: remove all thousand separators and spaces, then process via onInput\n        const inputElement = event.target as HTMLInputElement;\n        if (inputElement) {\n            let inputValue = inputElement.value.trim();\n            \n            const groupingSeparator = this.optionsHandler.getThousandSeparatorChar();\n            \n            // Remove all spaces from the input value\n            inputValue = inputValue.replace(/\\s/g, '');\n            \n            // Remove all thousand separators from the input value before processing\n            if (groupingSeparator && inputValue.includes(groupingSeparator)) {\n                inputValue = inputValue.replace(new RegExp(this.escapeRegExp(groupingSeparator), 'g'), '');\n            }\n            \n            // Update the input element value with cleaned value (without thousand separators)\n            // This ensures onInput processes a clean value\n            if (inputElement.value !== inputValue) {\n                inputElement.value = inputValue;\n            }\n            \n            // Process the cleaned input value via synthetic event\n            const syntheticInputEvent = new Event('input', { bubbles: true, cancelable: true });\n            Object.defineProperty(syntheticInputEvent, 'target', { \n                value: inputElement, \n                enumerable: true,\n                configurable: true \n            });\n            this.onInput(syntheticInputEvent);\n        }\n        \n        // Call blur() to validate and clamp if needed\n        this.numberModel.blur();\n        this.dispatchEvent({\n\t\t\ttype: 'EVENT_FOCUS_OUT',\n            event\n\t\t});\n        this.optionsHandler.onBlur();\n        this.numberModel.commitChange('ui');\n\t}\n\n\tonIncrement(event:KeyboardEvent): void {\n\t\tconst oldValue = this.numberModel.getValue();\n\t\tthis.numberModel.increment();\n        this.dispatchEvent({\n            type : \"EVENT_INCREMENT_UPDATED\"\n        })\n        const newValue = this.numberModel.getValue();\n        if(oldValue && newValue){\n            this.optionsHandler.onIncrement(oldValue, newValue)\n        }\n        event.preventDefault();\n\n\n\t}\n\n\tonDecrement(event:KeyboardEvent): void {\n        const oldValue = this.numberModel.getValue();\n\t\tthis.numberModel.decrement();\n         this.dispatchEvent({\n\t\t\t\ttype: 'EVENT_DECREMENT_UPDATED',\n\t\t\t});\n\n        const newValue = this.numberModel.getValue();\n        if(oldValue && newValue){\n            this.optionsHandler.onDecrement(oldValue, newValue);\n        }\n        event.preventDefault();\n\t}\n\n\n\tonBlur(): void {\n        this.numberModel.blur();\n        this.numberModel.commitChange('ui');\n\n\t}\n\n    onEnter():void{\n        this.numberModel.blur();\n        const value = this.numberModel.getValueAsNumber();\n        if (value !== null && value !== undefined && !isNaN(value)) {\n            this.optionsHandler.onEnter(value);\n        }\n        this.dispatchEvent({ type: 'EVENT_BLUR'})\n        this.numberModel.commitChange('ui');\n    }\n\n    onIncrementByLongStep(event:KeyboardEvent) : void {\n        const oldValue = this.numberModel.getValue();\n        this.numberModel.incrementByLongStep();\n        const newValue = this.numberModel.getValue();\n        if(oldValue && newValue){\n            this.optionsHandler.onIncrement(oldValue, newValue);\n        }\n        event.preventDefault();\n\n    }\n\n    onDecrementByLongStep(event:KeyboardEvent) : void {\n        const oldValue = this.numberModel.getValue();\n        this.numberModel.decrementByLongStep();\n        const newValue = this.numberModel.getValue();\n        if(oldValue && newValue){\n            this.optionsHandler.onDecrement(oldValue, newValue);\n        }\n        event.preventDefault();\n\n    }\n\n    onIncrementByShortStep(event:KeyboardEvent) : void {\n        const oldValue = this.numberModel.getValue();\n        this.numberModel.incrementByShortStep();\n        const newValue = this.numberModel.getValue();\n        if(oldValue && newValue){\n            this.optionsHandler.onIncrement(oldValue, newValue);\n        }\n        event.preventDefault();\n        \n    }\n\n    onDecrementByShortStep(event:KeyboardEvent) : void {\n        const oldValue = this.numberModel.getValue();\n        this.numberModel.decrementByShortStep();\n        const newValue = this.numberModel.getValue();\n        if(oldValue && newValue){\n            this.optionsHandler.onDecrement(oldValue, newValue);\n        }\n        event.preventDefault();\n\n    }\n\n\n    getDotCount(): number {\n        return this.dotCount;\n    }\n\n    setDotCount(count: number): void {\n        this.dotCount = count;\n    }\n\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IAdjusterList, IDestroyAdjuster } from \"./number-keyboard-shortcuts.types\";\nimport { AutoWired, Bean } from \"@dg/corecomponent\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { INumberEventHandler } from \"./number-event-handler.types\";\nimport { KeyCodes, KeyEventHandler } from \"../../../../token/src/utilities/KeyEventHandler\";\n\n@Bean(NUMBER_BEAN_NAME.KEYBOARD_SHORTCUT_HANDLER)\nexport class NumberKeyBoardShortCuts extends EventEmitter {\n\t@AutoWired(NUMBER_BEAN_NAME.NUMBER_EVENT_HANDLER) numberEventHandler!: INumberEventHandler;\n\n\tprivate adjusterList: IAdjusterList[] = [];\n\tregisterElement(element: HTMLElement): IDestroyAdjuster {\n\t\tconst adjusterIndex = this.getAdjusterIndex(element);\n\n\t\tif (adjusterIndex !== -1) {\n\t\t\tconst adjuster = this.adjusterList[adjusterIndex];\n\t\t\treturn { destroyFunc: () => adjuster.destroyFunc() };\n\t\t}\n\t\tconst keyBoardEventHandler = this.keyBoardEventHandler(element);\n\n\t\tconst adjuster = {\n\t\t\telement: element,\n\t\t\teventHandler: keyBoardEventHandler,\n\t\t\tdestroyFunc: () => keyBoardEventHandler.destroy(),\n\t\t};\n\n\t\tthis.adjusterList.push(adjuster);\n\n\t\treturn {\n\t\t\tdestroyFunc: () => adjuster.destroyFunc(),\n\t\t};\n\t}\n\n\tprotected getAdjusterIndex(element: HTMLElement): number {\n\t\treturn this.adjusterList.findIndex(\n\t\t\t(adjuster) => adjuster.element === element,\n\t\t);\n\t}\n\n\tdeRegisterElement(element: HTMLElement): void {\n\t\tthis.adjusterList = this.adjusterList.filter(\n\t\t\t(adjuster) => adjuster.element !== element,\n\t\t);\n\t}\n\n\tprivate keyBoardEventHandler(element: HTMLElement): KeyEventHandler {\n\t\tconst keyBoardShortCuts = [\n\t\t\t{\n\t\t\t\tkeyCombo: `${KeyCodes.ArrowUp}`,\n\t\t\t\tcallback: (event : any) => this.numberEventHandler.onIncrement(event.event),\n\t\t\t\t// repeat : true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: `${KeyCodes.ArrowDown}`,\n\t\t\t\tcallback: (event : any) => this.numberEventHandler.onDecrement(event.event),\n\t\t\t\t// repeat : true,\n\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: `${KeyCodes.Enter}`,\n\t\t\t\tcallback: () => this.numberEventHandler.onEnter(),\n\t\t\t},\n\n\t\t\t\n\t\t\t{\n\t\t\t\tkeyCombo: `${KeyCodes.ShiftLeft}+${KeyCodes.ArrowUp}`,\n\t\t\t\tcallback: (event : any) => this.numberEventHandler.onIncrementByLongStep(event.event),\n\t\t\t\t// repeat : true,\n\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: `${KeyCodes.ShiftLeft}+${KeyCodes.ArrowDown}`,\n\t\t\t\tcallback: (event : any) => this.numberEventHandler.onDecrementByLongStep(event.event),\n\t\t\t\t// repeat : true,\n\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: `${KeyCodes.MetaLeft}+${KeyCodes.ArrowUp}`,\n\t\t\t\tcallback: (event : any) => this.numberEventHandler.onIncrementByShortStep(event.event),\n\t\t\t\t// repeat : true,\n\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyCombo: `${KeyCodes.MetaLeft}+${KeyCodes.ArrowDown}`,\n\t\t\t\tcallback: (event : any) => this.numberEventHandler.onDecrementByShortStep(event.event),\n\t\t\t\t// repeat : true,\n\n\t\t\t},\n\t\t];\n\n\t\tconst keyEventManager = new KeyEventHandler(element);\n\t\tkeyEventManager.importEvents(keyBoardShortCuts as any);\n\t\treturn keyEventManager;\n\t}\n}","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\n\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { INumberOptionHandler, NumberChangeOrigin } from \"./number-option-handler.types\";\nimport { INumberAPI } from \"./number-api.types\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { INumberConfiguration, IRenderer } from \"../../number-configuration.types\";\nimport { INumericAdjusterModel } from \"./number-adjuster.types\";\nimport { Position } from \"../../../../utility/PopupHandler/CorePopupHandler\";\nimport { ClipboardConfig } from \"../../../../utility/clipboard\";\n\n\n\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class NumberOptionHandler extends EventEmitter implements INumberOptionHandler {\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_API) api!: INumberAPI;\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_CONFIGURATION) configuration!: INumberConfiguration;\n    @AutoWired('NumberAdjusterHandler') adjusterModel !: INumericAdjusterModel;\n\n\n    getInstanceID(): string | undefined {\n        return this.configuration.instanceID;\n    }\n\n    getDefaultValue():number | undefined {\n        const value = this.configuration.defaultValue ?? undefined\n        return typeof value === 'string' ? undefined : value;\n    }\n\n    getValue(): number  | null{\n        const value = this.configuration.value ?? null\n        return typeof value === 'string' ? null : value;\n    }\n\n    isReadonly(): boolean | undefined {\n        return this.configuration.readonly;\n    }\n\n    isDisabled(): boolean | undefined {\n        return this.configuration.disabled;\n    }\n\n    getSize(): 'xs' | 'sm' | 'md' | 'lg' | undefined {\n        return this.configuration.size;\n    }\n\n    getValidator(): CallableFunction | undefined {\n        return this.configuration.validator;\n    }\n\n    getValidationMessage(): string | undefined {\n        return this.configuration.validationMessage;\n    }\n\n    isRequired(): boolean {\n        return this.configuration.required ??  false;\n    }\n\n    getName(): string | undefined {\n        return this.configuration.name;\n    }\n\n    isAllowNull(): boolean | undefined {\n        return this.configuration.allowNull ?? true;\n    }\n\n\tisAllowWrapAround():boolean  {\n\t\treturn this.configuration.allowWrapAround ?? false;\n\n\t}\n\n    getLabel(): string | undefined {\n        return this.configuration.label;\n    }\n\n    getPlaceholder(): string | undefined {\n        return this.configuration.placeholder;\n    }\n\n    getTitle(): string | undefined {\n        return this.configuration.title;\n    }\n\n    getDescription(): string | undefined {\n        return this.configuration.description;\n    }\n\n    getClassName(): string | string[]  | undefined {\n        return this.configuration.className;\n    }\n\n    getAriaLabel(): string | undefined {\n        return this.configuration.ariaLabel ?? \"numbercomponent\";\n    }\n\n    getAppendTo(): HTMLElement | undefined {\n        return this.configuration.appendTo;\n    }\n\n    getPrefixValue(): string | undefined {\n        return this.configuration.prefix;\n    }\n\n    getSuffixValue(): string | undefined {\n        return this.configuration.suffix;\n    }\n\n    isPrefixRenderer(): boolean {\n        return this.configuration.prefix ? true : false\n    }\n    isSuffixRenderer(): boolean {\n        return this.configuration.suffix  ? true : false;\n    }\n\n    getPrefixRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.prefixRenderer;\n    }\n\n    getPrefixRendererParams(): object | undefined {\n        return this.configuration.prefixRendererParams;\n    }\n\n    getSuffixRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.suffixRenderer;\n    }\n\n    getSuffixRendererParams(): object | undefined {\n        return this.configuration.suffixRendererParams;\n    }\n\n    getDescriptionRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.descriptionRenderer;\n    }\n\n    getDescriptionRendererParams(): object | undefined {\n        return this.configuration.descriptionRendererParams;\n    }\n\n    getValidationMessageRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.validationMessageRenderer;\n    }\n\n    getValidationMessageRendererParams(): object | undefined {\n        return this.configuration.validationMessageRendererParams;\n    }\n\n    getMin(): number  {\n        const min = this.configuration.min ?? Number.MIN_SAFE_INTEGER;\n        return typeof min === 'string' ? Number.MIN_SAFE_INTEGER : min;\n    }\n\n    getMax(): number  {\n        const max = this.configuration.max ?? Number.MAX_SAFE_INTEGER;\n        return typeof max === 'string' ? Number.MAX_SAFE_INTEGER : max  ;\n    }\n\n    getStep(): number | undefined {\n        return this.configuration.step ?? 1;\n    }\n\n    getShortStep(): number | undefined {\n        return this.configuration.shortStep ?? 0;\n    }\n\n    getLongStep(): number | undefined {\n        return this.configuration.longStep ?? 0;\n    }\n\n    getDecimalPrecision(): number | null | undefined {\n        return this.configuration.decimalPrecision;\n    }\n\n    isKeepWithinRange(): boolean | undefined {\n        return this.configuration.keepWithinRange;\n    }\n\n    isClampValueOnBlur(): boolean | undefined {\n        return this.configuration.clampValueOnBlur;\n    }\n\n    hasThousandsSeparator(): boolean | undefined {\n        return this.configuration.thousandsSeparator ??  false;\n    }\n\n    getThousandSeparatorChar(): string | undefined {\n        return this.configuration.thousandSeparatorChar;\n    }\n\n    getDecimalSeparator(): string {\n        return this.configuration.decimalSeparator ?? '.';\n    }\n\n    getSpinButton(): 'split' | 'together' | 'none' | undefined {\n        return this.configuration.spinButton;\n    }\n\n    isAllowMouseWheel(): boolean | undefined {\n        return this.configuration.allowMouseWheel;\n    }\n\n    getCustomValidationMessage(): CallableFunction | undefined {\n        return this.configuration.customValidationMessage;\n    }\n\n    getTemplate(props:any): object | undefined {\n        return this.configuration.template && this.configuration.template(props);\n    }\n\n    getFormatter(value : string):any {\n        if(this.configuration.formatter){\n            return this.configuration.formatter(value);\n        }\n    }\n\n    getDecrementButtonSVGIconId(): string  {\n        return this.configuration.decrementButtonSVGIconId ?? \"icon-down-arrow\";\n    }\n\n    getIncrementButtonSVGIconId(): string  {\n        return this.configuration.incrementButtonSVGIconId ?? \"icon-up-arrow\";\n    }\n\n    getDecrementButtonRenderer(): { new(...args: any[]): IRenderer } | undefined {\n        return this.configuration.decrementButtonRenderer;\n    }\n\n    getDecrementButtonRendererParams(): object | undefined {\n        return this.configuration.decrementButtonRendererParams;\n    }\n\n    getIncrementButtonRenderer(): { new(...args: any[]): IRenderer } | undefined {\n        return this.configuration.incrementButtonRenderer;\n    }\n\n    getIncrementButtonRendererParams(): object | undefined {\n        return this.configuration.incrementButtonRendererParams;\n    }\n\n    getLocale(): string | undefined {\n        return this.configuration.locale;\n    }\n\n    getCurrencyCode(): string  {\n        return this.configuration.currencyCode ?? \"INR\";\n    }\n\n    getUseCurrencyCode(): boolean  {\n        return this.configuration.useCurrencyCode ?? false;\n    }\n\n    getCurrencySymbol(): string  {\n        return this.configuration.currencySymbol ?? \"\";\n    }\n\n    // Hook Methods\n    onChange(oldValue: number, newValue: number, eventOrigin: NumberChangeOrigin): void {\n        if (this.configuration.onChange) {\n            this.configuration.onChange(oldValue, newValue, eventOrigin);\n        }\n    }\n\n    onFocus(event : FocusEvent): void {\n        if (this.configuration.onFocus) {\n            this.configuration.onFocus(event);\n        }\n    }\n\n    onBlur(): void {\n        if (this.configuration.onBlur) {\n            this.configuration.onBlur();\n        }\n    }\n\n    onInput(value: number): void {\n        if (this.configuration.onInput) {\n            this.configuration.onInput(value);\n        }\n    }\n    onKeydown(event :KeyboardEvent): boolean | undefined {\n        if (this.configuration.onKeydown) {\n           return  this.configuration.onKeydown(event);\n        }\n        return undefined\n        \n\n    }\n\n    onError(value: number): void {\n        if (this.configuration.onError) {\n            this.configuration.onError(value);\n        }\n    }\n\n    onEnter( newValue: number): void {\n        if (this.configuration.onEnter) {\n            this.configuration.onEnter(newValue);\n        }\n    }\n\n    onIncrement(oldValue: number, newValue: number): void {\n        if (this.configuration.onIncrement) {\n            this.configuration.onIncrement(+oldValue, +newValue);\n        }\n    }\n\n    onDecrement(oldValue: number, newValue: number): void {\n        if (this.configuration.onDecrement) {\n            this.configuration.onDecrement(+oldValue, +newValue);\n        }\n    }\n\n\tgetAriaLabelledby() : string{\n\t\treturn this.adjusterModel.getAriaLabelledby();\n\t}\n\n\tgetAriaDescribedby(): string {\n\t\treturn this.adjusterModel.getAriaDescribedby();\n\t}\n\n    isEnabledKeyboard() :boolean{\n       return this.configuration.keyboard ?? false; \n    }\n\n    isHideSymbol():boolean{\n        return this.configuration.hideSymbol ?? false;\n    }\n\n    getStartAdornmentValue(): string | undefined {\n        return this.configuration.inputPrefix;\n    }\n\n    getEndAdornmentValue(): string | undefined {\n        return this.configuration.inputSuffix;\n    }\n\n    getType(): string {\n        return this.configuration.type?? \"decimal\";\n    }\n\n    getSymbolPosition(): string |undefined{\n        return this.configuration.symbolPosition; \n    }\n\n\n    shouldGenerateEmptyDom(): boolean {\n return this.configuration?.ignoreEmptyDOM !== undefined\n? !this.configuration.ignoreEmptyDOM\n: false;\n }\n    shouldAllowComma() : boolean {\n       return this.configuration.allowComma ?? false;\n    }\n\n\n    getTooltipMessage(): string  {\n        return this.configuration.tooltipMessage ?? \"please enter a number\";\n    }\n\n    getTooltipRegex(): RegExp | undefined {\n        return this.configuration.tooltipRegex;\n    }\n\n    getTooltipPosition(): string  {\n        return this.configuration.tooltipPosition ?? Position.bottomRight;\n    }\n\n    getTooltipAppendto(): HTMLElement | undefined {\n        return this.configuration.tooltipAppendto ?? document.body;\n    }\n\n    getTooltipHideDelay(): number  {\n        return this.configuration.tooltipHideDelay?? 700;\n\n    }\n    shouldShowTooltip(): boolean {\n        return this.configuration.tooltip ?? false;\n\n    }\n\n    showErrorState(): boolean {\n        return this.configuration.showErrorState ?? false;\n    }\n\n\n    getEventKey () : string{\n        return this.configuration.eventKey ?? '';\n\n    }\n\n    isValid(): boolean {\n        return this.configuration.status === 'error';\n    }\n\n    updateStatus(status : 'error' | \"none\") : void {\n        this.configuration.status = status;\n        this.dispatchEvent({\n            type: \"EVENT_VALUE_UPDATE\",\n            force : true\n        })\n    }\n\n    updateValidationMessage(message : string) : void {\n        this.configuration.validationMessage = message;\n        // Dispatch event to trigger re-render of description component\n        this.dispatchEvent({\n            type: \"EVENT_VALUE_UPDATE\",\n            force : true\n        });\n    }\n\n    getLabelRenderer() {\n        return this.configuration.labelRenderer;\n    }\n\n    getLabelRendererParams() {\n        return this.configuration.labelRendererParams ?? {};\n    }\n\n    getClipboard(): ClipboardConfig {\n        return this.configuration.clipboard;\n    }\n}\n","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { INumericAdjusterModel } from \"./number-adjuster.types\";\nimport { INumberOptionHandler } from \"./number-option-handler.types\";\n\n@Bean('stateManager')\nexport class NumberStateManager extends EventEmitter {\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_ADJUSTER_HANDLER) adjusterModel!: INumericAdjusterModel;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler        !: INumberOptionHandler;\n\n    isInValid() : boolean {\n        // const isEmpty = this.adjusterModel.isEmty();\n        // const required = this.optionHandler.isRequired();\n        // if (required && isEmpty) {\n        //     return true;\n        // }\n        return this.optionHandler.isValid() || !this.adjusterModel.isValid()\n    }\n}","import { AutoWired, Bean } from \"@dg/corecomponent\";\nimport { NumberTooltipHandlerType } from \"./number-tooltip-handler.types\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Tooltip } from \"../../../../Tooltip/src/Tooltip\";\nimport { NumberControllerHandler } from \"./number-controller\";\n\n@Bean(NUMBER_BEAN_NAME.NUMBER_TOOLTIP_HANDLER)\nexport class NumberTooltipHandler extends EventEmitter implements NumberTooltipHandlerType {\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_CONTROLLER_HANDLER) controllerHandler!: NumberControllerHandler;\n    private tooltipComponent: any;\n    private tooltipTimeoutId: number | null = null;\n    private openState: boolean = false;\n\n    createToolTip(Component: HTMLElement): void {\n        if (this.tooltipComponent) {\n            this.destroyTooltip();\n\n        }\n        const tooolTipConfiguration = {\n            popupParent: this.optionsHandler.getTooltipAppendto(),\n            tooltipValue: this.optionsHandler.getTooltipMessage(),\n            shouldShowTooltip: () => true,\n            shouldAttachEvents: false,\n            hideTooltip: false,\n            position: this.optionsHandler.getTooltipPosition(),\n            gapX: 7,\n            gapY: 2,\n            arrow: true\n        }\n\n        this.tooltipComponent = new Tooltip(Component, tooolTipConfiguration);\n    }\n\n    openToolTip(): void {\n        if (this.openState) {\n            this.destroyTooltip();\n            this.openState = false;\n        }\n\n        if (!this.tooltipComponent) {\n            return;\n        }\n\n        this.tooltipComponent.api.open();\n        this.openState = true;\n        const tooltipDelay = this.optionsHandler.getTooltipHideDelay();\n\n        if (this.tooltipTimeoutId) {\n            clearTimeout(this.tooltipTimeoutId);\n            this.tooltipTimeoutId = null;\n        }\n\n        this.tooltipTimeoutId = window.setTimeout(() => {\n            this.destroyTooltip();\n            this.tooltipTimeoutId = null;\n        }, tooltipDelay);\n    }\n\n    destroyTooltip(): void {\n        if (!this.tooltipComponent) {\n            return;\n        }\n\n        this.tooltipComponent.api.destroy();\n        this.openState = false;\n        this.tooltipComponent = null;\n        if (this.tooltipTimeoutId) {\n            clearTimeout(this.tooltipTimeoutId);\n            this.tooltipTimeoutId = null;\n        }\n    }\n}","\nimport { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName, } from '@dg/corecomponent';\nimport {ComponentMetadata} from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport {UserComponentHandler} from '@dg/corecomponent/UserComponentHandler.js';\nimport {UserComponentRegistry} from '@dg/corecomponent/UserComponentRegistry.js';\nimport {INumberUserComponentHandler } from './number-user-component-handler.types';\nimport { IComponentDetails } from '../../../../utility/component-detail.types';\nimport { ILabelUserComponentHandler } from '../../../../label/label.types';\n\nexport const enum PropertyName {\n\tPREFIX_RENDERER      = 'prefixRenderer',\n\tSUFFIX_RENDERER      = 'suffixRenderer',\n\tDESCRIPTION_RENDERER = 'descriptionRenderer',\n\tBUTTON_RENDERER      = 'buttonRenderer',\n\tERROR_RENDERER       = 'errorRenderer',\n\tLABEL_RENDERER       = 'labelRenderer'\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class NumberUserComponentHandler extends UserComponentHandler implements INumberUserComponentHandler, ILabelUserComponentHandler {\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\n\tgetLabelRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails(item, PropertyName.LABEL_RENDERER, params, PropertyName.LABEL_RENDERER);\n\t}\n\t\n\tgetPrefixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.PREFIX_RENDERER, params, PropertyName.PREFIX_RENDERER);\n\t}\n\n    getSuffixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.SUFFIX_RENDERER, params, PropertyName.SUFFIX_RENDERER);\n\t}\n\n\tgetDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.DESCRIPTION_RENDERER, params, PropertyName.DESCRIPTION_RENDERER);\n\t}\n\n\tgetErrorRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.ERROR_RENDERER, params, PropertyName.ERROR_RENDERER);\n\t}\n\n\tgetButtonRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.BUTTON_RENDERER, params, PropertyName.BUTTON_RENDERER);\n\t}\n\t\n\tprotected getComponentDetail( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.PREFIX_RENDERER:\n\t\t\tcase PropertyName.SUFFIX_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.DESCRIPTION_RENDERER:\n\t\t\tcase PropertyName.ERROR_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.BUTTON_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(item : any, propertyName : PropertyName, params : any) : any {\n        switch(propertyName) {\n            case PropertyName.PREFIX_RENDERER:\n\t\t\tcase PropertyName.SUFFIX_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n                return this.getUserRendererParams(item, params);\n            default:\n                return {};\n        }\n\n    }\n\n    private getUserRendererParams(item : any, params : any) : any {\n        const rendererParams = item.getUserRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n}\n","import { CurrencyFormatter } from \"../../formatter/CurrencyFormatter\";\n\n\nexport const CurrencyModule = {\n    version : '1.0.0',\n    moduleName : 'curreny',\n    modelType : 'currency',\n    beans : [CurrencyFormatter]\n}\n","import { NumberFormatter } from \"../../formatter/NumberFormatter\";\n\n\nexport const DecimalModule = {\n    version : '1.0.0',\n    moduleName : 'decimal',\n    modelType : 'decimal',\n    beans : [NumberFormatter]\n}","import { PercentageFormatter } from \"../../formatter/PercentageFormatter\";\n\n\nexport const PercentageModule = {\n    version   : '1.0.0',\n    moduleName: 'percentage',\n    modelType : 'percent',\n    beans     : [PercentageFormatter]\n}","import { composeClasses } from \"@dg/utils\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { INumberEventHandler } from \"../model/number-event-handler.types\";\nimport { NumberButtonType } from \"./number-button.types\";\nimport { INumericAdjusterModel } from \"../model/number-adjuster.types\";\nimport { getNumberRootUtilityClass } from \"../number-utils/number-classnames-slots\";\n\nconst useUtilityClasses = (ownerState : any) => {\n    const {disabled, role} = ownerState;\n\tconst slots = {\n\t\troot    : {\n            slot     : role,\n            modifiers: [\n                disabled && 'disabled'\n            ]\n        }\n\t};\n\n\treturn composeClasses(slots, getNumberRootUtilityClass);\n};\n\nexport class NumberButtonController extends EventEmitter {\n\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_ADJUSTER_HANDLER) adjusterModel !: INumericAdjusterModel;\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_EVENT_HANDLER) numberEventHandler !: INumberEventHandler;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: any;\n    \n    private comp !: NumberButtonType;\n\n    private ownerState : {disabled : boolean|null,spinButton :boolean} = {disabled : null,spinButton:false};\n    setComp(comp : NumberButtonType) : void {\n        this.comp = comp;\n        this.applyStaticClasses();\n        this.applyState();\n        this.setRendererDetails();\n        this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.applyState.bind(this));\n    }\n\n    private applyStaticClasses() {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCssClass(classes.root, true);\n    }\n\n    private applyState() : void {\n\n        const ownerState = this.getOwnerState();\n\n        if(this.ownerState.disabled === ownerState.disabled ) {\n            return;\n        }\n\n        this.ownerState = ownerState;\n        const element = this.comp.getElement();\n        element.classList.toggle('dg-number__increment--disabled', ownerState.disabled);\n        element.classList.toggle('dg-button__root--disabled', ownerState.disabled);\n\n\n    }\n\n    private setRendererDetails() : void {\n        \n        const params          = this.createRendererParams();\n        const rendererWrapper = this.createRendererWrapper();\n        const compDetails     = this.userComponentHandler.getButtonRendererDetails(rendererWrapper, params);\n\n        this.comp.setRendererDetails(compDetails);\n    }\n\n    private createRendererParams() {\n        const params = this.comp.getParams() ?? {};\n        return {\n            parentElement: this.comp.getElement(),\n            callback     : (event:any) => params.callback && params.callback(event),\n            icon         : params.getIcon(),\n            showIcon     : true,\n            showText     : false,\n            disabled     : params.isDisabled(),\n            readonly : params.isReadonly(),\n            ariaLabel    : params.getRole(),\n            classes : params.getClasses(),\n            tabindex : params.getTabindex(),\n            getSvgClasses : ()=>\"dg-number__spinbutton-svg\"\n\n\t\t};\n    }\n\n    private createRendererWrapper() {\n        const {getRenderer, getRendererParams} = this.comp.getParams() ?? {};\n        return {\n\t\t\tgetRenderer          : () => getRenderer ? getRenderer() : undefined,\n\t\t\tgetUserRendererParams: () => getRendererParams ? getRendererParams() : undefined\n\t\t}\n    } \n\n    private getOwnerState() {\n        const { isDisabled, getRole , getSpinButton} = this.comp.getParams() ?? {};\n        return {\n            disabled : isDisabled(),\n            role : getRole(),\n            spinButton : getSpinButton()\n        }\n    }\n}","import { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { NumberButtonController } from \"./number-button-controller\";\nimport { NumberButtonType } from \"./number-button.types\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\n\nconst numberIncrementTemplate = () => {\n    // const div = document.createElement(\"div\");\n    // div.innerHTML = '<div></div>';\n    // return div.firstChild as HTMLElement;\n\treturn document.createElement(\"div\");\n}\nexport class NumberButtonComponent extends Component {\n\tprivate renderer: any;\n\tprivate rendererElement: any;\n    private params : any;\n\n    constructor(params : any) {\n        super();\n        this.params = params;\n    }\n\n\t@PostConstruct()\n\tinit() {\n\t\tthis.setTemplate(numberIncrementTemplate());\n\t\tconst comp : NumberButtonType = {\n            addOrRemoveCssClass: (className: string, force: boolean) => this.addOrRemoveCssClass(className, force),\n            setRendererDetails : (rendererDetails: IComponentDetails) => this.setRendererDetails(rendererDetails),\n            getElement         : () => this.getGui(),\n            getParams          : () => this.params\n\t\t};\n\n\t\tconst controller = this.createBean(new NumberButtonController());\n\t\tcontroller.setComp(comp);\n\t}\n\n\tprivate setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate destroyRenderer(): void {\n\t\tthis.renderer = this.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n    private afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\t\n\t\t\t// const parentcomp = this.getParentComponent();\n\t\t\tclearElement(parentElement);\n\t\t\t// parentElement.remove();\n\t\t\tthis.setTemplate(this.rendererElement);\n\t\t\tparentElement.replaceWith(this.rendererElement);\n\t\t\t// parentcomp?.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n\taddOrRemoveCssClass(className: string, _addOrRemove: boolean): void {\n\t\tconst element = this.getGui();\n\t\telement.className = className;\n\t}\n}","    import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n    import { NumberInputCompType } from \"./number-input.types\";\n    import { AutoWired, BEAN_NAME, setAriaDescribedBy, setAriaInvalid, setAriaLabel, setAriaLabelledBy, setAriaRequired, setAriaValueMax, setAriaValueMin, setAriaValueNow, toggleAttribute } from \"@dg/corecomponent\";\n    import { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\n    import { NumberKeyBoardShortCuts } from \"../model/number-keyboard-shortcuts\";\n    import { IDestroyAdjuster } from \"../model/number-keyboard-shortcuts.types\";\n    import { INumberEventHandler } from \"../model/number-event-handler.types\";\n    import { IFormatter } from \"../../formatter/formatter.types\";\n    import { composeClasses } from \"@dg/utils\";\n    import { INumberOptionHandler } from \"../model/number-option-handler.types\";\n    import { INumericAdjusterModel } from \"../model/number-adjuster.types\";\nimport { getNumberRootUtilityClass } from \"../number-utils/number-classnames-slots\";\nimport { EVENT_NAME } from \"../../constants/event-name\";\nimport { isClipboardOperationAllowed, registerClipboardGuards } from \"../../../../utility/clipboard\";\n\n    const useUtilityClasses = (_ownerState : any) => {\n        // const { invalid, disabled, readonly, focus } = ownerState;\n        const slots = {\n            root: {\n                slot: 'input',\n                modifiers: [\n                    // invalid && 'error',\n                    // disabled && 'disabled',\n                    // readonly && 'readonly',\n                    // focus && 'focus'\n                ],\n            },\n        };\n\n        return composeClasses(slots, getNumberRootUtilityClass);\n    };\n    export class NumberInputController extends EventEmitter {\n\n        @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: INumberOptionHandler;\n        @AutoWired('NumberAdjusterHandler') adjusterModel !: INumericAdjusterModel;\n        @AutoWired(NUMBER_BEAN_NAME.KEYBOARD_SHORTCUT_HANDLER) adjusterEventHandler !: NumberKeyBoardShortCuts;\n        @AutoWired(NUMBER_BEAN_NAME.NUMBER_EVENT_HANDLER) numberEventHandler !: INumberEventHandler;\n        @AutoWired(NUMBER_BEAN_NAME.FORMATTER) formatter !: IFormatter;\n\n        private comp !: NumberInputCompType;\n\n        private numberAdjusterRef : IDestroyAdjuster |null = null;\n        private eventKey!: string\n        // private zerosAfterDecimal!:string | null;\n        // private userInputValue !:string;\n        // private isEmty !: boolean;\n        \n        setComp(comp : NumberInputCompType ) {\n            this.comp = comp;\n             this.eventKey = this.optionHandler.getEventKey();\n\n\n            this.applyClasses();\n            // this.userInputValue = this.validateInput(String(this.adjusterModel.getValue()))\n            this.setValue();\n            this.setAriaAttributes();\n            this.registerEventHandler();\n            this.registerAdjusterEventHandler();\n            this.setTabIndex(\"0\");\n            this.setPlaceholder();\n            this.setRequired();\n            this.handleEventKey();\n            this.setRole()\n            \n        }\n\n        private handleEventKey(){\n            let eventKey = this.optionHandler.getEventKey();\n            if(!eventKey){\n                return\n            }\n         \n            const decimalSeparator = this.optionHandler.getDecimalSeparator();\n            const decimalSeparatorEscaped = decimalSeparator === '.' ? '\\\\.' : decimalSeparator.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n            const allowedCharsRegex = new RegExp(`[^0-9.${decimalSeparatorEscaped}\\\\-\\\\+]`, 'g');\n            \n            eventKey = eventKey.replace(allowedCharsRegex, ''); // Remove invalid characters\n            \n            // Convert custom decimal separator to '.' for internal processing\n            if (decimalSeparator !== '.' && eventKey.includes(decimalSeparator)) {\n                eventKey = eventKey.replace(new RegExp(decimalSeparatorEscaped, 'g'), '.');\n            }\n    \n            // Handle decimal separator \".\" - display just the decimal separator\n            if (eventKey === '.' || eventKey === decimalSeparator) {\n                this.adjusterModel.setIsEmpty(false);\n                this.adjusterModel.setValue(\".\");\n                (this.comp.getElement() as HTMLInputElement).value = decimalSeparator;\n            }\n            // Ensure the minus sign is only at the beginning (handle \"-\" or \"+\")\n            else if (eventKey.includes('-') || eventKey.includes('+')) {\n                const sign = eventKey.includes('-') ? '-' : '+';\n                this.adjusterModel.setIsEmpty(false);\n                this.adjusterModel.setValue(sign);\n                let displayValue = eventKey;\n                if (decimalSeparator !== '.' && displayValue.includes('.')) {\n                    displayValue = displayValue.replace(/\\./g, decimalSeparator);\n                }\n                const inputEl = this.comp.getElement() as HTMLInputElement;\n                inputEl.value = /^[\\-+]/.test(displayValue) ? displayValue : sign;\n\n            }else if( eventKey !== '' && !isNaN(Number(eventKey))){\n                this.adjusterModel.setIsEmpty(false);\n                this.adjusterModel.setValue(eventKey); // Automatically SetValue called for the Input Element\n\n            }else {\n                this.adjusterModel.setValue(\"0\");\n                this.adjusterModel.setIsEmpty(true);\n                (this.comp.getElement() as HTMLInputElement).value = \"\"\n            }\n            if(this.eventKey != '-'){\n                this.eventKey = ''\n            }\n              \n\n\n        \n        }\n\n        private applyClasses() : void {\n            const ownerState = this.getOwnerState();\n            const classes = useUtilityClasses(ownerState);\n            this.comp.addOrRemoveCSSClass(classes.root);\n            this.comp.getElement().classList.add(\"dg-field__input\")\n            \n        }\n\n        private setPlaceholder() {\n            const placeholder = this.optionHandler?.getPlaceholder();\n            if(placeholder != undefined) {\n                (this.comp.getElement() as HTMLInputElement).placeholder = placeholder;\n            }else if(placeholder === null){\n                (this.comp.getElement() as HTMLInputElement).placeholder = '';\n\n            }\n             \n        }\n        \n\n        private setRequired(){\n            this.optionHandler.isRequired() && ((this.comp.getElement() as HTMLInputElement).setAttribute(\"required\",\"\"))\n        }\n\n        private setTabIndex(index : string){\n            this.comp.getElement().setAttribute(\"tabIndex\", index);\n        }\n        \n        private refresh() : void {\n            this.applyClasses();\n\n        }\n\n        private getOwnerState() {\n            const showErrorState = this.optionHandler.showErrorState();\n            return {\n                invalid : showErrorState ? !this.adjusterModel?.isValid(): false,\n                disabled: this.optionHandler.isDisabled(),\n                readonly: this.optionHandler.isReadonly(),\n                focus   : this.adjusterModel?.isFocused() ??  true,\n            }\n        }\n\n        private registerEventHandler() {\n            const ownerState = this.getOwnerState();\n            const element = this.comp.getElement() as HTMLInputElement;\n\n            registerClipboardGuards(\n                element,\n                () => this.optionHandler.getClipboard(),\n                (target, event, listener) => this.addListener(target, event, listener)\n            );\n\n            if(ownerState.disabled) {\n                return \n            }\n            this.addListener(element,'focus', (event : FocusEvent)=>{\n                const ownerState = this.getOwnerState();\n                const relatedTarget = event.relatedTarget;\n    \n                if( ownerState.disabled || ownerState.readonly) {\n                    return\n                }\n                this.dispatchEvent({type : 'FOCUS_IN'})\n\n                // Handle eventKey if present, otherwise preserve formatted value\n                if(this.eventKey){\n                    this.handleEventKey();\n                    this.eventKey = ''\n                } else if(!this.adjusterModel.isFocused()) {\n                    // Keep formatted value with separators and decimals when focused\n                    this.setFormattedValue();\n                }\n                this.optionHandler.onFocus(event);\n\n                relatedTarget !== null && relatedTarget !== element && element.select();\n    \n            });\n    \n\n            this.addListener(element, 'focusin', (_event) => {\n                if(ownerState.readonly){\n                    return\n                }\n\n\n                \n            });\n\n\n            this.addListener(element, 'focusout', (event) => {\n                if(ownerState.readonly){\n                    return\n                }\n                this.numberEventHandler.onFocusOut(event);\n                this.refresh();\n            });\n\n            this.addListener(element, 'keydown', (event) => {\n                if(ownerState.readonly){\n                    return\n                }\n                this.numberEventHandler.onKeyDown(event);\n                // this.optionHandler.onKeydown(this.adjusterModel.getValue() as number);\n\n                // if ((event.metaKey || event.ctrlKey) && event.key === 'a') {\n                //     event.stopPropagation(); // Stop the event from propagating\n                //     return;\n                // }\n               \n\n                \n            });\n\n            // this.addListener(element, 'input', (event: InputEvent) => { // Old Code\n\n            //     if (ownerState.readonly) {\n            //         return;\n            //     }\n                \n            //     event.preventDefault();\n            //     const inputElement = event.target as HTMLInputElement;\n            //     let value = inputElement.value;\n             \n            //     // Validate input: ensure only valid characters (numbers, one \".\", \"+\", \"-\")\n            //     this.userInputValue = this.validateInput(value);\n            //     let numericValue = parseFloat(this.userInputValue);\n\n            //     // Check if the input exceeds Number.MAX_SAFE_INTEGER\n            //     if (numericValue > Number.MAX_SAFE_INTEGER) {\n            //         this.isEmty = true;\n            //         // Optionally, you can reset the input or show an error message\n            //         // inputElement.value = ''; // Clear the input if it exceeds the max safe integer\n            //         return; // Exit early since the input is invalid\n            //     } else {\n            //         this.isEmty = false;\n            //     }\n\n\n                \n            //     if (this.formattedState.hasDecimal) {\n            //         const formattedValue = parseFloat( this.userInputValue ); // parseFloat retains decimals\n            //         if(!isNaN(formattedValue)) {\n            //             this.numberEventHandler.onInput(formattedValue);\n            //             this.isEmty = false;\n            //             this.optionHandler.onInput(this.adjusterModel.getValue() as number);\n                        \n            //         }\n            //         // this.setValue()\n                    \n\n            //     } else {\n            //         if(value === \"\"){\n            //             this.userInputValue = \"0\";\n            //             this.isEmty = true;\n\n            //         }\n            //         const formattedValue = parseFloat( this.userInputValue ); // parseFloat retains decimals\n            //         this.numberEventHandler.onInput(formattedValue);\n            //     }\n            \n            //     // this.optionHandler.onInput(this.adjusterModel.getValue() as number);\n            // });\n            \n            this.addListener(element, 'input', (event: InputEvent) => {\n                     if (ownerState.readonly) {\n                            return;\n                        }\n                        this.numberEventHandler.onInput(event);\n\n            });\n\n            this.addListener(element, 'paste', (event: ClipboardEvent) => {\n                if (!isClipboardOperationAllowed(this.optionHandler.getClipboard(), 'paste')) {\n                    event.preventDefault();\n                    event.stopPropagation();\n                    return;\n                }\n                if (ownerState.readonly) {\n                    return; // Exit early if the field is read-only\n                }\n\n                const pasteData = event.clipboardData?.getData('text') || '';\n                const decimalSeparator = this.optionHandler.getDecimalSeparator();\n                \n                // Convert custom decimal separator to '.' for validation\n                let normalizedPasteData = pasteData;\n                if (decimalSeparator !== '.' && pasteData.includes(decimalSeparator)) {\n                    normalizedPasteData = pasteData.replace(new RegExp(decimalSeparator.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'), '.');\n                }\n\n                // Regex to check if the pasted data is entirely numeric\n                const isNumeric = Number(normalizedPasteData);\n            \n                if (isNaN(isNumeric)) {\n                    event.preventDefault()\n\n                    this.dispatchEvent({\n                        type: EVENT_NAME.SHOW_TOOLTIP,\n                    });;\n                    return; // Exit without updating the input value\n                }\n                \n            \n                // Prevent default paste behavior\n                // event.preventDefault();\n            \n                // Get the input element and its current value\n                // const inputElement = event.target as HTMLInputElement;\n                // const currentValue = inputElement.value || '';\n            \n                // // Get the caret (cursor) position\n                // const caretPosition = inputElement.selectionStart || 0;\n            \n                // // Get pasted content\n                // const pasteData = event.clipboardData?.getData('text') || '';\n            \n                // // Allow only valid numeric characters (numbers, e, +, -, .)\n                // const numericValue = pasteData.replace(/[^0-9eE+\\-.]/g, '');\n            \n                // // Construct the new value based on the caret position\n                // const newValue =\n                //     currentValue.slice(0, caretPosition) + // Text before the caret\n                //     numericValue +                         // Pasted numeric content\n                //     currentValue.slice(inputElement.selectionEnd || 0); // Text after the caret\n            \n                // // Validate and set the input value\n                // inputElement.value = newValue;\n            \n                // // Notify the component of the new value\n                // this.optionHandler.onInput(Number(newValue)); // Adjust this as per your logic\n            \n                // // Calculate the new caret position\n                // const newCaretPosition = caretPosition + numericValue.length;\n                // inputElement.setSelectionRange(newCaretPosition, newCaretPosition);\n            });\n            \n            \n            \n            \n\n\n            this.addListener(this.eventHandler, 'EVENT_FOCUS_OUT', this.setValue.bind(this));\n            this.addListener(this.eventHandler, 'EVENT_FOCUS_IN', this.setValue.bind(this));\n            this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.setValue.bind(this));\n            this.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.refresh.bind(this));\n            this.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.setValue.bind(this));\n            this.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.refresh.bind(this));\n            this.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.setValue.bind(this));\n            this.addListener(this.eventHandler, 'EVENT_REFRESH', this.refresh.bind(this));\n            this.addListener(this.eventHandler, 'FOCUS_IN', this.focusIn.bind(this));\n            this.addListener(this.eventHandler, 'PROPERTY_CHANGED', this.setPlaceholder.bind(this));\n            this.addListener(this.eventHandler, 'PROPERTY_CHANGED', this.setRequired.bind(this));\n            this.addListener(this.eventHandler, 'PROPERTY_CHANGED', this.setValue.bind(this));\n            this.addListener(this.eventHandler, 'EVENT_CLEAR_VALUE', this.clear.bind(this));\n\n        }\n        // private validateInput(value: string): string {\n        //     let filteredValue = '';\n        //     let hasDecimal = false;\n        //     let hasExponent = false;\n        //     let plusMinusCount = 0; // Track the number of \"+\" and \"-\" signs\n            \n        //     for (let i = 0; i < value.length; i++) {\n        //         const char = value[i];\n                \n                \n        //         // Allow one decimal point, but only before the exponent part\n        //         if (char === '.' && !hasDecimal && !hasExponent) {\n        //             hasDecimal = true;\n        //             this.formattedState.hasDecimal = true;\n        //             filteredValue += char;\n        //         }\n        //         // Allow \"e\" or \"E\" for scientific notation, but only one and not as the first character\n        //         else if ((char === 'e' || char === 'E') && !hasExponent && filteredValue.length > 0) {\n        //             hasExponent = true;\n        //             filteredValue += char;\n        //         }\n        //         // Allow \"+\" or \"-\" up to two times in the expression\n        //         else if ((char === '+' || char === '-') && plusMinusCount < 2) {\n        //             plusMinusCount++; // Increment count for \"+\" and \"-\"\n        //             filteredValue += char;\n        //         }\n        //         // Allow digits (0-9) at any position\n        //         else if (/\\d/.test(char)) {\n        //             filteredValue += char;\n        //             if (hasDecimal) {\n        //                 // Check if the current filteredValue matches the regex for zeros after decimal\n        //                 const match = filteredValue.match(/(?<=\\.)0+$/);\n        //                 if (match) {\n        //                     // this.zerosAfterDecimal = match[0]; // Store the matched zeros\n        //                 }\n        //                 if (/[1-9]/.test(filteredValue)) {\n        //                     // this.zerosAfterDecimal = \"\"; // Reset to null\n        //                 }\n        //             }\n        //         }\n\n        //     }\n            \n        //     return filteredValue;\n        // }\n        \n        // private validateInput(value: string): string {\n        //     let filteredValue = '';\n        //     let hasDecimal = false;\n        //     let hasExponent = false;\n        //     let plusMinusCount = 0; // Track the number of \"+\" and \"-\" signs\n        \n        //     for (let i = 0; i < value.length; i++) {\n        //         const char = value[i];\n        \n        //         // Allow one decimal point, but only before the exponent part\n        //         if (char === '.' && !hasDecimal && !hasExponent) {\n        //             hasDecimal = true;\n        //             this.formattedState.hasDecimal = true;\n        //             filteredValue += char;\n        //         }\n        //         // Allow \"e\" or \"E\" for scientific notation, but only one and not as the first character\n        //         else if ((char === 'e' || char === 'E') && !hasExponent && filteredValue.length > 0) {\n        //             hasExponent = true;\n        //             filteredValue += char;\n        //         }\n        //         // Allow \"+\" or \"-\" up to two times in the expression\n        //         else if ((char === '+' || char === '-') && plusMinusCount < 2) {\n        //             plusMinusCount++; // Increment count for \"+\" and \"-\"\n        //             filteredValue += char;\n        //         }\n        //         // Allow commas\n        //         else if (char === ',') {\n        //             filteredValue += char;\n        //         }\n        //         // Allow digits (0-9) at any position\n        //         else if (/\\d/.test(char)) {\n        //             filteredValue += char;\n        //             if (hasDecimal) {\n        //                 // Check if the current filteredValue matches the regex for zeros after decimal\n        //                 const match = filteredValue.match(/(?<=\\.)0+$/);\n        //                 if (match) {\n        //                     // this.zerosAfterDecimal = match[0]; // Store the matched zeros\n        //                 }\n        //                 if (/[1-9]/.test(filteredValue)) {\n        //                     // this.zerosAfterDecimal = \"\"; // Reset to null\n        //                 }\n        //             }\n        //         }\n        //     }\n        \n        //     return filteredValue;\n        // }\n        \n\n        private setAccessibility() : void {\n            this.setAriaAttributes();\n            this.setRole();\n        }\n\n        private setRole() : void {\n            const element = this.comp.getElement();\n            element.setAttribute('role', 'spinbutton');\n            toggleAttribute(element, 'role', 'spinbutton');\n        }\n\n        private setAriaAttributes() : void {\n            const element = this.comp.getElement();\n            setAriaValueMin(element, this.optionHandler.getMin());\n            setAriaValueMax(element, this.optionHandler.getMax());\n            setAriaValueNow(element, this.adjusterModel.getValue() as  number);\n            // // setAriaDisabled(element, this.optionHandler.isDisabled());\n            // // setAriaReadOnly(element, this.optionHandler.isReadOnly());\n            setAriaInvalid(element, !this.adjusterModel.isValid());\n            setAriaRequired(element, this.optionHandler.isRequired());\n            setAriaLabel(element, this.optionHandler.getAriaLabel());\n            (this.optionHandler.getLabel()) ? setAriaLabelledBy(element, this.adjusterModel.getAriaLabelledby()) :null;\n            (this.optionHandler.getDescription()) ? setAriaDescribedBy(element, this.adjusterModel.getAriaDescribedby()):null;\n            this.optionHandler.isReadonly() ? element.setAttribute(\"readonly\",\"\") : element.removeAttribute(\"readonly\");\n            this.optionHandler.isDisabled() ? element.setAttribute(\"disabled\",\"\") : element.removeAttribute(\"disabled\");\n        }\n\n        private setValue() : void {\n            if(this.adjusterModel.isEmty()){\n                const element = this.comp.getElement() as HTMLInputElement;\n                element.value = \"\";\n                return\n            }\n            const value = this.adjusterModel.getValue();\n            if(value === null || isNaN(value)) {\n                this.setPlaceholder();\n            }\n            else if(!this.adjusterModel?.isFocused()) {\n                // Only format when not focused (on blur)\n                // While focused, let the user type freely without formatting\n                this.setFormattedValue();\n            }else if(this.adjusterModel?.isFocused() && true) {\n                this.setNonFormattedValue();\n            }\n            // When focused, don't update the input value - let user's typing control it\n\n            this.refresh()\n            this.setAccessibility();\n        \n        }\n\n        setNonFormattedValue(): void {\n            if(this.eventKey){\n                this.handleEventKey();\n                this.eventKey = ''\n                return\n            }\n            \n            if(this.adjusterModel.isEmty()){\n                const element = this.comp.getElement() as HTMLInputElement;\n                element.value = \"\";\n                return\n            }\n            \n            const value = this.adjusterModel.getValue();\n            if(value === null || isNaN(value)) {\n                return\n            }\n\n            const element = this.comp.getElement() as HTMLInputElement;\n            const dotCount = this.numberEventHandler.getDotCount();\n            const decimalSeparator = this.optionHandler.getDecimalSeparator();\n            const groupingSeparator = this.optionHandler.getThousandSeparatorChar();\n\n            // Get the raw value string from the model (without formatting)\n            let rawValue = String(value);\n            const isNegative = rawValue.startsWith('-');\n            \n            // Remove all thousand separators to ensure we show the raw value\n            // This preserves the typed state without formatting\n            if (groupingSeparator && rawValue.includes(groupingSeparator)) {\n                // Escape special regex characters in grouping separator\n                const escapedSeparator = groupingSeparator.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n                rawValue = rawValue.replace(new RegExp(escapedSeparator, 'g'), '');\n            }\n            \n            // Also remove spaces if space is used as thousand separator\n            if (groupingSeparator === ' ') {\n                rawValue = rawValue.replace(/\\s/g, '');\n            }\n            \n            // Internal decimal separator placeholder\n            const internalDecimalSeparator = 'D';\n            \n            // Check if value contains decimal separator ('.') before converting\n            const hasDecimalSeparator = rawValue.includes('.');\n            \n            // If no decimal separator exists, display as is (without thousand separators)\n            if (!hasDecimalSeparator) {\n                element.value = rawValue;\n                return;\n            }\n            \n            // Convert '.' to 'D' placeholder for processing (value comes from model with '.' format)\n            // This allows us to use 'D' string for final replacement with configured decimal separator\n            let formattedValue = rawValue.replace(/\\./g, internalDecimalSeparator);\n            \n            const valueWithoutSign = isNegative ? formattedValue.substring(1) : formattedValue;\n            \n            // Split into integer and decimal parts using internal decimal separator placeholder\n            let integerPart = valueWithoutSign.split(internalDecimalSeparator)[0];\n            let decimalPart = valueWithoutSign.split(internalDecimalSeparator).pop() || '';\n\n            // Remove any remaining separators from integer part (ensure no thousand separators)\n            // Do NOT format with thousand separators while focused - formatting only happens on blur\n            integerPart = integerPart.replace(/[^\\d]/g, '');\n\n            // Handle decimal part - DO NOT limit decimal precision while typing\n            // Decimal precision will be applied on blur via setFormattedValue()\n            if (dotCount > 0 && decimalPart) {\n                // Allow unlimited decimal digits while typing - precision will be applied on blur\n                formattedValue = (isNegative ? '-' : '') + integerPart + decimalSeparator + decimalPart;\n                this.numberEventHandler.setDotCount(0);\n                element.value = formattedValue;\n\n            } else {\n                // Reconstruct value without thousand separators\n                let tempFormattedValue = (isNegative ? '-' : '') + integerPart;\n                if (decimalPart) {\n                    tempFormattedValue += decimalSeparator + decimalPart;\n                } else if (decimalSeparator !== internalDecimalSeparator && formattedValue.includes(internalDecimalSeparator)) {\n                    // Replace internal decimal separator placeholder with custom decimal separator if it exists in the value\n                    tempFormattedValue = formattedValue.replace(internalDecimalSeparator, decimalSeparator);\n                }\n                element.value = tempFormattedValue;\n            }\n\n        }\n        \n\n        private setFormattedValue() : void {\n            this.numberEventHandler.setDotCount(0);\n\n            const element = this.comp.getElement() as HTMLInputElement;\n\n            if(this.adjusterModel.isEmty()){\n                element.value = \"\";\n                return;\n            }\n\n            const value = this.adjusterModel.getValueAsNumber();\n\n            if(value === null || isNaN(value) || !Number.isFinite(value)){\n                return;\n            }\n\n            if(value >= Number.MAX_SAFE_INTEGER){\n                element.value = String(value);\n                return;\n            }\n            \n            // Always format the value - use formatter if available, otherwise format manually\n            if(this.formatter){\n                let formattedValue = this.formatter.formatter();\n                element.value = formattedValue;\n            } else {\n                // Fallback: format the value even if formatter doesn't exist\n                // This ensures formatting is always applied on blur\n                const formattedValue = this.formatValueFallback(value);\n                element.value = formattedValue;\n            }\n        }\n\n        private formatValueFallback(value: number): string {\n            const decimalSeparator = this.optionHandler.getDecimalSeparator();\n            const groupingSeparator = this.optionHandler.getThousandSeparatorChar();\n            const precision = this.optionHandler.getDecimalPrecision();\n            const useThousandSeparator = this.optionHandler.hasThousandsSeparator();\n            \n            // Format with precision\n            let formattedValue = precision != null \n                ? value.toFixed(precision) \n                : value.toString();\n            \n            // Apply thousand separators if needed\n            if (groupingSeparator && useThousandSeparator) {\n                const parts = formattedValue.split('.');\n                parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, groupingSeparator);\n                formattedValue = parts.join('.');\n            }\n            \n            // Replace decimal separator if needed\n            if (decimalSeparator !== '.') {\n                formattedValue = formattedValue.replace('.', decimalSeparator);\n            }\n            \n            return formattedValue;\n        }\n\n        private registerAdjusterEventHandler() {\n            const ownerState = this.getOwnerState();\n            const keyboardBehavior = this.optionHandler.isEnabledKeyboard()\n            if(ownerState.readonly || ownerState.disabled || !keyboardBehavior) {\n                return\n            }\n\n            const element = this.comp.getElement();\n\n            this.numberAdjusterRef = this.adjusterEventHandler.registerElement(element);\n\n            this.addDestroyFunc(() => {\n                this.numberAdjusterRef && this.numberAdjusterRef.destroyFunc()\n                this.numberAdjusterRef = null;\n            })\n        }\n\n        destroy(): void {\n            super.destroy();\n        }\n\n        private focusIn(event:FocusEvent):void{\n            // const element = this.comp.getElement() as HTMLInputElement;\n            this.numberEventHandler.onFocus(event);\n            this.setValue()\n                // const value  = String(this.adjusterModel.getValue());\n                // const lenght = value.length\n                // element.setSelectionRange(lenght, lenght);\n\n        }\n\n        clear(){\n            (this.comp.getElement()as HTMLInputElement).value = '';\n        }\n    }","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { NumberInputController } from \"./number-input-controller\";\nimport { NumberInputCompType } from \"./number-input.types\";\n\nconst numberInputTemplate = () => {\n    const input = document.createElement(\"input\");\n    input.type = \"text\";\n    return input;\n};\n\n\nexport class NumberInputComponent extends Component {\n\n    constructor() {\n        super();\n        this.setTemplate(numberInputTemplate())\n    }\n\n    @PostConstruct()\n    init() {\n        const comp : NumberInputCompType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        const controller = this.createBean(new NumberInputController());\n        controller.setComp(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n}","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { INumberOptionHandler } from \"../model/number-option-handler.types\";\nimport { INumberEventHandler } from \"../model/number-event-handler.types\";\nimport { NumberKeyBoardShortCuts } from \"../model/number-keyboard-shortcuts\";\nimport { NumberRootCompType } from \"./number-root.types\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { NumberControllerHandler } from \"../model/number-controller\";\nimport { INumericAdjusterModel } from \"../model/number-adjuster.types\";\nimport { useUtilityClasses } from \"../number-utils/number-classnames-slots\";\nimport { NumberTooltipHandlerType } from \"../model/number-tooltip-handler.types\";\nimport { EVENT_NAME } from \"../../constants/event-name\";\nimport { subElement } from \"../model/number-api.types\";\nimport type { NumberStateManager } from \"../model/number-state-manager\";\n\n\n\n\nexport class NumberController extends AbstractController<NumberRootCompType> {\n    \n    // Model should only be autowired for controller\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !               : INumberOptionHandler;\n\t@AutoWired(NUMBER_BEAN_NAME.NUMBER_EVENT_HANDLER) numberEventHandler !       : INumberEventHandler;\n\t@AutoWired(NUMBER_BEAN_NAME.KEYBOARD_SHORTCUT_HANDLER) adjusterEventHandler !: NumberKeyBoardShortCuts;\n\t@AutoWired('NumberAdjusterHandler') adjusterModel !                            : INumericAdjusterModel;\n\t@AutoWired(NUMBER_BEAN_NAME.NUMBER_CONTROLLER_HANDLER) controllerHandler !   : NumberControllerHandler;\n\t@AutoWired(NUMBER_BEAN_NAME.NUMBER_TOOLTIP_HANDLER)\n\tnumberTooltipHandler!: NumberTooltipHandlerType;\n\n\t@AutoWired('stateManager') private stateManager !: NumberStateManager;\n\n\tprivate    wrapperFocused !                                                  : boolean;\n\tprefixComponent!                                                  : HTMLElement | null;\n\tsuffixComponent!                                                  : HTMLElement| null;\n\n    init(){\n        this.registerEvents();\n\t\tthis.applyClassNames();\n\t\tthis.addListeners();\n\n\t\tthis.controllerHandler.registerNumber(this);\n\t\tthis.prefixComponent = this.component?.getPrefixElement() ? this.component?.getPrefixElement() : null;\n\t\tthis.suffixComponent = this.component?.getSuffixElement() ? this.component?.getSuffixElement() : null;\n    }\n\n\tprivate addListeners(){\n\t\tthis.component?.getGui().addEventListener('focusin', (_event)=>{\n\t\t\tconst ownerState = this.getOwnerState();\n\t\t\tthis.wrapperFocused = true;\n\t\t\t\n\t\t\tif( ownerState.readonly || ownerState.disabled) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.refresh();\n\t\t\t// this.onFocusIn(event)\n\t\t});\n\t\t\n\t\tthis.component?.getGui().addEventListener('mousedown', (_event)=>{\n\t\t\tconst ownerState = this.getOwnerState();\n\t\t\tthis.wrapperFocused = true;\n\n\n\t\t\tif( ownerState.readonly || ownerState.disabled) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.refresh();\n\n\t\t\t// this.onFocusIn(event)\n\t\t\t\n\t\t});\n\t\tthis.component?.getGui().addEventListener('focusout', (event)=>{\n\t\t\tconst ownerState = this.getOwnerState();\n\t\t\tthis.wrapperFocused = false;\n\n\t\t\tif( ownerState.readonly || ownerState.disabled) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.refresh();\n\t\t\tthis.numberEventHandler.onFocusOut(event);\n\n\n\t\t\t// this.onFocusIn(event)\n\t\t});\n\t}\n\n\n    private registerEvents() {\n        this.addListener(this.eventHandler, 'EVENT_FOCUS_OUT', this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_RERENDER', this.rerender.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_BLUR', this.blur.bind(this));\n\t\t// this.addListener(this.eventHandler, 'EVENT_SET_PREFIX', this.setPrefix.bind(this));\n\t\t// this.addListener(this.eventHandler, 'EVENT_SET_SUFFIX', this.setSuffix.bind(this));\n\t\tthis.addListener(this.eventHandler, EVENT_NAME.SHOW_TOOLTIP, this.enableTooltip.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.addErrorClassName.bind(this));\n\t\tthis.addListener(this.eventHandler, 'PROPERTY_CHANGED', this.refresh.bind(this));\n\n    }\n\n\tprivate addErrorClassName() : void {\n\t\tconst isInValid = this.stateManager.isInValid();\n\t\tthis.component!.getGui().classList.toggle(\"dg-input__status--error\", isInValid)\n\t}\n\n\tprivate refresh(){\n\t\tthis.applyClassNames();\n\t}\n\n\tprivate applyClassNames(){\n\t\tconst ownerState = this.getOwnerState();\n\t\t\tif(this.wrapperFocused === true){\n\t\t\t\townerState.focus = true;\n\t\t\t}\n\t\tconst classes = useUtilityClasses('root');\n\t\tthis.component?.addOrRemoveCssClass(classes.root);\n\t\tthis.component?.getGui().classList.add(\"dg-field__root\");\n\t\tconst userClassName = this.optionHandler.getClassName();\n\t\tif(userClassName){\n\t\t\tif(typeof userClassName != 'string' ){\n\t\t\t\tfor(const className of userClassName){\n\t\t\t\tthis.component?.getGui().classList.add(className);\n\t\t\t}\n\t\t\t}else{\n\t\t\t\tthis.component?.getGui().classList.add(userClassName);\n\t\t\t}\n\t\t}\n\t\tthis.component?.getGui().classList.add(\"dg-field__root\");\n\t\townerState.disabled &&  this.component?.getGui().classList.add(\"dg-input__status--disabled\")\n\t\townerState.readonly &&  this.component?.getGui().classList.add(\"dg-input__status--readonly\")\n\t\townerState.focus && this.component?.getGui().classList.add(\"dg-input__status--focus\")\n\t\tthis.addErrorClassName();\n\t\tthis.addPrefixAndSuffixClassNames();\n\t}\n\n\tprivate addPrefixAndSuffixClassNames(){\n\t\tconst prefix      = this.optionHandler.getPrefixValue() || this.optionHandler.getPrefixRenderer();\n\t\tconst suffix      = this.optionHandler.getSuffixValue() || this.optionHandler.getSuffixRenderer();\n\t\tconst inputPrefix = this.optionHandler.getStartAdornmentValue();\n\t\tconst inputSuffix = this.optionHandler.getEndAdornmentValue();\n\t\tif(prefix){\n\t\t\tthis.component?.getGui().classList.add(\"dg-field__prefix--active\");\n\t\t}\n\t\tif(suffix){\n\t\t\tthis.component?.getGui().classList.add(\"dg-field__suffix--active\");\n\t\t}\n\n\t\tif(inputPrefix){\n\t\t\tthis.component?.getGui().classList.add(\"dg-field__input-prefix--active\");\n\t\t}\n\t\tif(inputSuffix){\n\t\t\tthis.component?.getGui().classList.add(\"dg-field__input-suffix--active\");\n\t\t}\n\t}\n\n\tprivate getOwnerState() {\n\t\tconst showErrorState = this.optionHandler.showErrorState();\n\t\treturn {\n\t\t\tinvalid : showErrorState ? !this.adjusterModel?.isValid(): false,\n\t\t\tfocus   : this.adjusterModel.isFocused(),\n\t\t\tdisabled: this.optionHandler.isDisabled(),\n\t\t\treadonly: this.optionHandler.isReadonly(),\n\t\t\tsize    : this.optionHandler.getSize(),\n\t\t}\n\t}\n\n    private onFocusIn(_event : FocusEvent) : void {\n\t\t// this.numberEventHandler.onFocus(event);\n\t\tthis.component?.getInputElement().focus();\n\n\t}\n\n\tprivate onFocusOut(event : FocusEvent) : void {\n\t\tthis.numberEventHandler.onFocusOut(event);\n\n\t}\n\n\tprivate onInput(_value : number) : void {\n\t\t// this.numberEventHandler.onInput(value);\n\t}\n\n\tprivate onKeyDown(event : KeyboardEvent) : void {\n\t\tthis.numberEventHandler.onKeyDown(event);\n\n\t}\n\n    getProperty() : any {\n        return {\n\t\t\tonInput                : this.onInput.bind(this),\n\t\t\tonKeyDown              : this.onKeyDown.bind(this),\n\t\t\tonFocusIn              : this.onFocusIn.bind(this),\n\t\t\tonFocusOut             : this.onFocusOut.bind(this),\n\t\t\tisvalid                : this.adjusterModel.isValid(),\n\t\t\tfocused                : this.adjusterModel.isFocused(),\n\t\t\tlabel                  : this.optionHandler.getLabel(),\n\t\t\tdescription            : this.optionHandler.getDescription() ||this.optionHandler.getDescriptionRenderer(),\n\t\t\tgenerateEmptyDom       : this.optionHandler.shouldGenerateEmptyDom(),\n\t\t\tprefix                 : this.optionHandler.getPrefixValue() || this.optionHandler.getPrefixRenderer(),\n\t\t\tsuffix                 : this.optionHandler.getSuffixValue() || this.optionHandler.getSuffixRenderer(),\n\t\t\tinputPrefix            : this.optionHandler.getStartAdornmentValue(),\n\t\t\tinputSuffix            : this.optionHandler.getEndAdornmentValue(),\n\t\t\thelperText             : this.optionHandler.getDescription(),\n\t\t\thtmlFor                : 'number',\n\t\t\tid                     : 'number',\n\t\t\trequired               : this.optionHandler.isRequired(),\n\t\t\treadOnly               : this.optionHandler.isReadonly(),\n\t\t\tdisabled               : this.optionHandler.isDisabled(),\n\t\t\tonIncrement            : (event:any) => this.numberEventHandler.onIncrement(event),\n\t\t\tonDecrement            : (event: any) => this.numberEventHandler.onDecrement(event),\n\t\t\tincrementDisabled      : this.adjusterModel.isIncrementDisabled(),\n\t\t\tdecrementDisabled      : this.adjusterModel.isDecrementDisabled(),\n\t\t\tspinButton             : this.optionHandler.getSpinButton(),\n\t\t\tregisterAdjusterElement: (element : HTMLElement) => this.adjusterEventHandler.registerElement(element),\n\t\t\tgetTemplate            : (props: any) => this.optionHandler.getTemplate(props),\n\t\t\terror                  : this.optionsHandler.showErrorState()\n\t\t};\n    }\n\n\tgetParamsProperty() {\n        return {\n\t\t\tincrementButton: {\n                getIcon          : () =>  this.optionsHandler.getIncrementButtonSVGIconId(),\n                getRenderer      : () => this.optionsHandler.getIncrementButtonRenderer(),\n                getRendererParams: () => this.optionsHandler. getIncrementButtonRendererParams(),\n                callback         : (event: any) =>  !this.adjusterModel.isIncrementDisabled() && this.numberEventHandler.onIncrement(event),\n                isDisabled       : () => this.adjusterModel.isIncrementDisabled(),\n\t\t\t\tisReadonly : () => this.optionHandler.isReadonly(),\n                getRole          : () => 'increment',\n\t\t\t\tgetSpinButton : () =>(this.optionsHandler.getSpinButton() === 'split' ? true : false),\n\t\t\t\t// getClasses : ()=> [useUtilityClasses(\"spinbutton\").root, useUtilityClasses(\"spin-upbtn\").root],\n\t\t\t\tgetClasses : ()=> [useUtilityClasses(\"spinbutton\").root, useUtilityClasses(\"spin-upbtn\").root],\n\t\t\t\tgetTabindex : ()=> \"-1\"\n\t\t\t},\n\t\t\tdecrementButton: {\n\t\t\t\tgetIcon          : () =>  this.optionsHandler.getDecrementButtonSVGIconId(),\n\t\t\t\tgetRenderer      : () => this.optionsHandler.getDecrementButtonRenderer(),\n\t\t\t\tgetRendererParams: () => this.optionsHandler.getDecrementButtonRendererParams(),\n\t\t\t\tcallback         : (event : any) =>  !this.adjusterModel.isDecrementDisabled() &&  this.numberEventHandler.onDecrement(event),\n\t\t\t\tisDisabled       : () => this.adjusterModel.isDecrementDisabled(),\n\t\t\t\tisReadonly       : () => this.optionHandler.isReadonly(),\n\t\t\t\tgetRole          : () => 'decrement',\n\t\t\t\tgetSpinButton    : () =>(this.optionsHandler.getSpinButton() === 'split' ? true : false),\n\t\t\t\tgetClasses       : ()=> [ \"dg-number__spinbutton\", \"dg-number__spin-downbtn\"],\n\t\t\t\tgetTabindex      : ()=> \"-1\"\n\n\t\t\t},\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> useUtilityClasses('label').root,\n\t\t\t\tgetLabelTitleClasses :()=> useUtilityClasses('label-title').root\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  useUtilityClasses('validation-message').root,\n\t\t\t\tgetDescriptionClasses :()=> useUtilityClasses('description').root\n\t\t\t},\n\t\t\tsuffix : {\n\t\t\t\tgetUserClasses : ()=> useUtilityClasses('suffix-elem').root\n\t\t\t},\n\t\t\tprefix : {\n\t\t\t\tgetUserClasses : ()=> useUtilityClasses('prefix-elem').root\n\t\t\t},\n\t\t\tinputSuffix:{\n\t\t\t\tgetUserClasses : ()=> useUtilityClasses('input-suffix').root\n\t\t\t},\n\t\t\tinputPrefix:{\n\t\t\t\tgetUserClasses : ()=>useUtilityClasses('input-prefix').root \n\t\t\t}\n\t\t};\n    }\n\n\tgetElement() : HTMLElement |  undefined {\n\t\treturn this.component?.getGui();\n\t}\n\n\tfocus(): void{\n\t\tthis.component?.getInputElement().focus();\n\t\tthis.dispatchEvent({type : 'FOCUS_IN'});\n\t\tconst inputElement = this.component?.getInputElement() as HTMLInputElement;\n\n\t\tif(inputElement) {\n\t\t\tconst length = inputElement.value.length;\n    \t\tinputElement.setSelectionRange(length, length);\n\t\t}\n\t\t\n\t}\n\n\tblur(): void{\n        this.component?.getInputElement().blur();\n\t\t// this.component?.getGui().blur();\n\t\tthis.wrapperFocused = false;\n\t\tthis.refresh();\n\n    }\n\t \n\tdestroy():void{\n\n\t\t// this.component?.getGui().remove();\n\t\t// super.destroy();\n\t\t\n\t}\n\n\tgetshouldGenerateEmptyDom(){\n\t\tconst generateEmptyDom = this.optionHandler.shouldGenerateEmptyDom();\n\t\tconst label = this.optionHandler.getLabel();\n\t\tconst description = this.optionHandler.getDescription();\n\t\tif( label || description){\n\t\t\treturn true\n\t\t}else if(generateEmptyDom){\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\trerender():void{\n\t\tthis.component?.rerender()\n\t\tthis.refresh();\n\n\n\t}\n\n\t// setPrefix(params:any){\n\t// \tthis.prefixComponent && this.prefixComponent.remove();\n\t// \tif(!params.options.prefix){\n\t// \t\treturn\n\n\t// \t}\n\t// \tconst container = this.component?.getContainerElement();\n\t// \t this.prefixComponent = document.createElement('div');\n\t// \tthis.prefixComponent.classList.add(\"dg-number__prefix-elem\");\n\t// \tthis.prefixComponent.classList.add(\"dg-prefix-elem\");\n\t// \tthis.prefixComponent.setAttribute(\"ref\",\"prefix\")\n\n\t// \tthis.prefixComponent.innerHTML = params.options.prefix;\n\t// \tcontainer?.insertBefore(this.prefixComponent, container.firstChild);\n\n\t// }\n\t// setSuffix(params:any){\n\t// \tthis.suffixComponent && this.suffixComponent.remove();\n\t// \tif(!params.options.suffix){\n\t// \t\treturn\n\t// \t}\n\t// \tconst container = this.component?.getContainerElement();\n\t// \tthis.suffixComponent = document.createElement('div');\n\t// \tthis.suffixComponent.classList.add(\"dg-number__suffix-elem\");\n\t// \tthis.suffixComponent.classList.add(\"dg-suffix-elem\");\n\t// \tthis.suffixComponent.innerHTML = params.options.suffix;\n\t// \tthis.suffixComponent.setAttribute(\"ref\",\"suffix\")\n\t// \tcontainer?.appendChild(this.suffixComponent);\n\t// }\n\n\thide(subElement: subElement[]): void {\n\t\tif (!this.component?.getGui()) {\n\t\t\tconsole.warn('Component GUI not available');\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subElement || subElement.length === 0) {\n\t\t\t// Hide the entire component\n\t\t\tconst elem = this.component.getGui();\n\t\t\telem.style.display = \"none\";\n\t\t\treturn;\n\t\t}\n\n\t\t// Hide specific elements\n\t\tsubElement.forEach(element => {\n\t\t\tlet elem: HTMLElement | null = null;\n\n\t\t\tswitch (element) {\n\t\t\t\tcase 'suffix':\n\t\t\t\t\telem = this.component?.getSuffixElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'prefix':\n\t\t\t\t\telem = this.component?.getPrefixElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'label':\n\t\t\t\t\telem = this.component?.getLabelElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'description':\n\t\t\t\t\telem = this.component?.getDescriptionElement();\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn(`Unknown element type to hide: ${element}`);\n\t\t\t}\n\n\t\t\tif (elem) {\n\t\t\t\telem.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t}\n\n\tshow(subElement: subElement[]): void {\n\t\tif (!this.component?.getGui()) {\n\t\t\tconsole.warn('Component GUI not available');\n\t\t\treturn;\n\t\t}\n\n\t\tif (!subElement || subElement.length === 0) {\n\t\t\t// Hide the entire component\n\t\t\tconst elem = this.component.getGui();\n\t\t\telem.style.display = \"block\";\n\t\t\treturn;\n\t\t}\n\n\t\t// Hide specific elements\n\t\tsubElement.forEach(element => {\n\t\t\tlet elem: HTMLElement | null = null;\n\n\t\t\tswitch (element) {\n\t\t\t\tcase 'suffix':\n\t\t\t\t\telem = this.component?.getSuffixElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'prefix':\n\t\t\t\t\telem = this.component?.getPrefixElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'label':\n\t\t\t\t\telem = this.component?.getLabelElement();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'description':\n\t\t\t\t\telem = this.component?.getDescriptionElement();\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn(`Unknown element type to hide: ${element}`);\n\t\t\t}\n\n\t\t\tif (elem) {\n\t\t\t\tif(element === 'label' || element === 'description'){\n\t\t\t\t\t\telem.style.display = \"block\";\n\t\t\t\t}else{\n\t\t\t\telem.style.display = \"flex\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t\n\n\n\tenableTooltip(): void {\n\t\tconst shouldShowTooltip =  this.optionHandler.shouldShowTooltip()\n\t\tif(!shouldShowTooltip){\n\t\t\treturn;\n\t\t}\n\t\tthis.numberTooltipHandler.createToolTip(this.component?.getGui() as HTMLElement);\n\t\tthis.numberTooltipHandler.openToolTip();\n\n\t}\n\n}\n\n\n","import { PostConstruct, queryAssignedNodes } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { NumberController } from './number-root-controller';\nimport { composeClasses } from '@dg/utils';\nimport { BasicTemplateWithoutButtons, spinButtonTogetherTemplate, splitButtonTemplate } from '../number-utils/number-template';\nimport { getNumberRootUtilityClass } from '../number-utils/number-classnames-slots';\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'container',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\treturn composeClasses(slots, getNumberRootUtilityClass)\n}\n\n\n\nfunction RootTemplate(props : any): HTMLElement {\n\tconst { spinButton, getTemplate,prefix, suffix, generateEmptyDom, label, description, error, inputPrefix, inputSuffix } = props;\n\tconst classes = useUtilityClasses();\n\tconst customTemplate = getTemplate(classes);\n\tconst template = customTemplate ? customTemplate : (spinButton === \"together\" ? spinButtonTogetherTemplate(prefix, suffix, generateEmptyDom, label, description, error):(spinButton === \"split\" ? splitButtonTemplate( prefix, suffix, generateEmptyDom,  label, description, error) : BasicTemplateWithoutButtons( prefix, suffix, generateEmptyDom, label, description, error, inputPrefix, inputSuffix)))\n\treturn template;\n}\n\nexport class NumberRootComponent extends Component {\n\n\t@queryAssignedNodes('numberInputRef') numberInputElement !: any;\n\t@queryAssignedNodes('container') containerElement \t\t !: any;\n\t@queryAssignedNodes('prefix') prefixElement \t\t\t !: any;\n\t@queryAssignedNodes('suffix') suffixElement \t\t\t !: any;\n\t@queryAssignedNodes('label') LabelElement \t\t\t !: any;\n\t@queryAssignedNodes('description') descriptionElement \t\t\t !: any;\n\n\tprivate appendTo: HTMLElement | undefined ;\n\tconstructor(appendTo: HTMLElement | undefined) {\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\t// change for framework view\n\t\tconst component: any = {\n\t\t\tgetGui             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className),\n\t\t\tgetInputElement : ()=> this.getInputElement(),\n\t\t\tgetSuffixElement : ()=> this.getSuffixElement(),\n\t\t\tgetPrefixElement : ()=> this.getPrefixElement(),\n\t\t\tgetLabelElement : ()=> this.getLabelElement(),\n\t\t\tgetDescriptionElement : ()=> this.getDescriptionElement(),\n\t\t\trerender : () => this.rerenderComponent(controller),\n\t\t\tgetContainerElement : ()=> this.getContainerElement(),\n\t\t};\n\n        // change createMangedBean to createWire\n\t\tconst controller = this.createManagedBean(new NumberController());\n\n\t\tconst props = controller.getProperty();\n\t\tconst template = RootTemplate(props);\n\n\t\tconst properties = controller.getParamsProperty();\n\t\t\n\t\tthis.setTemplate(template, {\n\t\t\tincrementButton: properties.incrementButton,\n\t\t\tdecrementButton: properties.decrementButton,\n\t\t\tspinButton     : properties,\n\t\t\tlabel          : properties.label,\n\t\t\tdescription    : properties.description,\n\t\t\tsuffix         : properties.suffix,\n\t\t\tprefix         : properties.prefix,\n\t\t\tinputSuffix    : properties.inputSuffix,\n\t\t\tinputPrefix    : properties.inputPrefix,\n\t\t\terror          : properties.description\n\t\t});\n\n\t\tcontroller.setComponent(component);\n\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprivate appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.appendTo?.remove();\n\t\t\tthis.appendTo  = undefined;\n\t\t});\n\t}\n\n\t getSuffixElement():any{\n\t\treturn this.suffixElement ? this.suffixElement.eGui  : null; \n\t}\n\n\t getLabelElement():any{\n\t\treturn this.LabelElement ? this.LabelElement.eGui  : null\n\t}\n\n\t getDescriptionElement():any{\n\t\treturn this.descriptionElement ? this.descriptionElement.eGui : null;\n\t}\n\n\t getPrefixElement():any{\n\t\treturn this.prefixElement ? this.prefixElement.eGui : null\n\t}\n\n\n\tgetInputElement(): HTMLElement {\n\t\treturn this.numberInputElement.eGui;\n\t}\n\tgetContainerElement(): HTMLElement {\n\t\treturn this.containerElement;\n\t}\n\trerenderComponent(controller: NumberController): void {\n\t\tcontroller.destroy()\n\t\tconst props = controller.getProperty();\n\t\tconst properties = controller.getParamsProperty();\n\t\tconst newTemplate = RootTemplate(props);\n\t\tthis.setTemplate(newTemplate, {\n\t\t\tincrementButton: properties.incrementButton,\n\t\t\tdecrementButton: properties.decrementButton,\n\t\t\tspinButton     : properties,\n\t\t\tlabel          : properties.label,\n\t\t\tdescription    : properties.description,\n\t\t\tsuffix         : properties.suffix,\n\t\t\tprefix         : properties.prefix,\n\t\t\tinputSuffix    : properties.inputSuffix,\n\t\t\tinputPrefix    : properties.inputPrefix,\n\t\t});\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n}","\n\n\n\nimport { composeClasses, generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../modules/CSSRegistry\";\n\n\nconst useUtilityClasses = (slot:string,modifiers?:any) => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: slot,\n\t\t\tmodifiers: modifiers?modifiers:[],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getNumberRootUtilityClass);\n};\n\n\n\nfunction getNumberRootUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('number', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\n\nfunction getInputUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('input', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\n\n\n\nconst NUMBER_SLOTS = {\n    SPINBUTTON        : \"spinbutton\",\n    SPIN_DOWNBTN      : \"spin-downbtn\",\n    SPIN_UPBTN        : \"spin-upbtn\",\n    LABEL             : \"label\",\n    LABEL_TITLE       : \"label-title\",\n    VALIDATION_MESSAGE: \"validation-message\",\n    DESCRIPTION       : \"description\",\n    SUFFIX_ELEM       : \"suffix-elem\",\n    PREFIX_ELEM       : \"prefix-elem\",\n    INPUT_SUFFIX      : \"input-suffix\",\n    INPUT_PREFIX      : \"input-prefix\",\n}\n\nconst NUMBER_STATES = {\n    STATUS_ERROR   : \"status--error\",\n    STATUS_DISABLED: \"status--disabled\",\n    STATUS_READONLY: \"status--readonly\",\n    STATUS_FOCUS   : \"status--focus\",\n}\n\n\nexport {\n    NUMBER_SLOTS,\n    NUMBER_STATES,\n    getNumberRootUtilityClass,\n    getInputUtilityClass,\n    useUtilityClasses\n}","\n\n\nconst splitButtonTemplate = (\n\tprefix?: string,\n\tsuffix?: string,\n\tignoreEmptyDOM ?: boolean,\n\tlabel?:string\n\t, description?:string,\n\terror ?: boolean\n): HTMLElement => {\n\t\n\t// Container for everything\n\tconst wrapper = document.createElement('div');\n\tconst fragmentElemet = document.createDocumentFragment();\n\n\t\n\t// Label, if present\n\tif(ignoreEmptyDOM || label){\n\t\tconst labelElement = document.createElement('number-label');\n\t\tlabelElement.setAttribute('ref', 'label');\n\t\tfragmentElemet.appendChild(labelElement);\n\n\t}\n\t\n\t\n\t// Main container\n\tconst container = document.createElement('div');\n\tcontainer.setAttribute('ref', 'container');\n\tcontainer.classList.add('dg-number__container', 'dg-field__container');\n\t\n\t// Prefix, if present\n\tif (prefix || ignoreEmptyDOM) {\n\t\tconst prefixElement = document.createElement('number-prefix');\n\t\tprefixElement.setAttribute('ref', 'prefix');\n\t\tcontainer.appendChild(prefixElement);\n\t\tif(!prefix){\n\t\t\tcontainer.classList.add('dg-field__prefix--hidden');\n\t\t}\n\t}\n\t\n\t// Input Wrapper with Increment and Decrement buttons\n\tconst inputWrapper = document.createElement('div');\n\tinputWrapper.classList.add('dg-number__input-wrapper', 'dg-field__input-wrapper');\n\tinputWrapper.setAttribute('tabindex', '-1');\n\t\n\tconst incrementButton = document.createElement('number-increment');\n\tincrementButton.setAttribute('ref', 'incrementButton');\n\tinputWrapper.appendChild(incrementButton);\n\t\n\tconst inputElement = document.createElement('number-input');\n\tinputElement.setAttribute('ref', 'numberInputRef');\n\tinputWrapper.appendChild(inputElement);\n\t\n\tconst decrementButton = document.createElement('number-decrement');\n\tdecrementButton.setAttribute('ref', 'decrementButton');\n\tinputWrapper.appendChild(decrementButton);\n\t\n\t// Append input wrapper to container\n\tcontainer.appendChild(inputWrapper);\n\t\n\t// Suffix, if present\n\tif (suffix || ignoreEmptyDOM) {\n\t\tconst suffixElement = document.createElement('number-suffix');\n\t\tsuffixElement.setAttribute('ref', 'suffix');\n\t\tcontainer.appendChild(suffixElement);\n\t\tif(!suffix){\n\t\t\tcontainer.classList.add('dg-field__suffix--hidden');\n\t\t}\n\t}\n\t\n\t// Append container to fragmentElemet\n\tfragmentElemet.appendChild(container);\n\t\n\t// Helper text, if present\n\tif(ignoreEmptyDOM || description){\n\t\tconst helperTextElement = document.createElement('number-helper-text');\n\t\thelperTextElement.setAttribute('ref', 'description');\n\t\tfragmentElemet.appendChild(helperTextElement);\n\t}\n\t\n\tif(ignoreEmptyDOM || error){\n\t\tconst errorElement = document.createElement('number-error');\n\t\terrorElement.setAttribute('ref', 'error');\n\t\tfragmentElemet.appendChild(errorElement);\n\t}\n\n\twrapper.append(fragmentElemet)\n\n\t\n\t\n\treturn wrapper;\n};\nconst spinButtonTogetherTemplate = (\n\tprefix?: string,\n\tsuffix?: string,\n\tignoreEmptyDOM ?: boolean,\n\tlabel?:string,\n\tdescription?:string,\n\terror ?: boolean\n): HTMLElement => {\n\t\n\t// Container for everything\n\tconst wrapper = document.createElement('div');\n\tconst fragmentElemet = document.createDocumentFragment();\n\n\t\n\t// Label, if present\n\tif(ignoreEmptyDOM || label){\n\t\tconst labelElement = document.createElement('number-label');\n\t\tlabelElement.setAttribute('ref', 'label');\n\t\tfragmentElemet.appendChild(labelElement);\n\t}\n\t\n\t\n\t// Main container\n\tconst container = document.createElement('div');\n\tcontainer.setAttribute('ref', 'container');\n\tcontainer.classList.add('dg-number__container', 'dg-field__container');\n\t\n\t// Prefix, if present\n\tif (ignoreEmptyDOM || prefix) {\n\t\tconst prefixElement = document.createElement('number-prefix');\n\t\tprefixElement.setAttribute('ref', 'prefix');\n\t\tcontainer.appendChild(prefixElement);\n\t\tif(!prefix){\n\t\t\tcontainer.classList.add('dg-field__prefix--hidden');\n\t\t}\n\t}\n\t\n\t// Input Wrapper with Spin Button\n\tconst inputWrapper = document.createElement('div');\n\tinputWrapper.classList.add('dg-number__input-wrapper', 'dg-field__input-wrapper');\n\tinputWrapper.setAttribute('tabindex', '-1');\n\t\n\tconst inputElement = document.createElement('number-input');\n\tinputElement.setAttribute('ref', 'numberInputRef');\n\tinputWrapper.appendChild(inputElement);\n\t\n\tconst spinButton = document.createElement('number-spin-button');\n\tspinButton.setAttribute('ref', 'spinButton');\n\tinputWrapper.appendChild(spinButton);\n\t\n\t// Append input wrapper to container\n\tcontainer.appendChild(inputWrapper);\n\t\n\t// Suffix, if present\n\tif (ignoreEmptyDOM || suffix) {\n\t\tconst suffixElement = document.createElement('number-suffix');\n\t\tsuffixElement.setAttribute('ref', 'suffix');\n\t\tcontainer.appendChild(suffixElement);\n\t\tif(!suffix){\n\t\t\tcontainer.classList.add('dg-field__suffix--hidden');\n\t\t}\n\t}\n\t\n\t// Append container to wrapper\n\tfragmentElemet.appendChild(container);\n\t\n\t// Helper text, if present\n\tif(ignoreEmptyDOM || description){\n\t\tconst helperTextElement = document.createElement('number-helper-text');\n\t\thelperTextElement.setAttribute('ref', 'description');\n\t\tfragmentElemet.appendChild(helperTextElement);\n\t}\n\n\tif(ignoreEmptyDOM || error){\n\t\tconst errorElement = document.createElement('number-error');\n\t\terrorElement.setAttribute('ref', 'error');\n\t\tfragmentElemet.appendChild(errorElement);\n\t}\n\n\twrapper.append(fragmentElemet)\n\n\treturn wrapper;\n};\nconst BasicTemplateWithoutButtons = (\n\tprefix?: string,\n\tsuffix?: string,\n\tignoreEmptyDOM ?: boolean,\n\tlabel?:string,\n\tdescription?:string,\n\terror ?: boolean,\n\tinputPrefix?: string,\n\tinputSuffix?: string\n): HTMLElement => {\n\t\n\t// Container for everything\n\tconst wrapper = document.createElement('div');\n\n\tconst fragmentElemet = document.createDocumentFragment();\n;\t\n\t// Label, if present\n\tif(ignoreEmptyDOM || label){\n\t\tconst labelElement = document.createElement('number-label');\n\t\tlabelElement.setAttribute('ref', 'label');\n\t\tfragmentElemet.appendChild(labelElement);\n\t}\n\t\n\n\t\n\t// // Main container\n\tconst container = document.createElement('div');\n\tcontainer.setAttribute('ref', 'container');\n\tcontainer.classList.add('dg-number__container', 'dg-field__container');\n\t\n\t// // Prefix, if present\n\tif (ignoreEmptyDOM || prefix) {\n\t\tconst prefixElement = document.createElement('number-prefix');\n\t\tprefixElement.setAttribute('ref', 'prefix');\n\t\tcontainer.appendChild(prefixElement);\n\t\tif(!prefix){\n\t\t\tcontainer.classList.add('dg-field__prefix--hidden');\n\t\t}\n\t}\n\t\n\t// // Input Wrapper\n\tconst inputWrapper = document.createElement('div');\n\tinputWrapper.classList.add('dg-number__input-wrapper', 'dg-field__input-wrapper');\n\tinputWrapper.setAttribute('tabindex', '-1');\n\n\tif(ignoreEmptyDOM || inputPrefix){\n\t\tconst inputPrefixElement = document.createElement('input-prefix');\n\t\tinputPrefixElement.setAttribute('ref', 'inputPrefix');\n\t\tinputWrapper.appendChild(inputPrefixElement);\n\t}\n\t\n\t// // Input Element\n\tconst inputElement = document.createElement('number-input');\n\tinputElement.setAttribute('ref', 'numberInputRef');\n\tinputWrapper.appendChild(inputElement);\n\t\n\tif(ignoreEmptyDOM || inputSuffix){\n\t\tconst inputSuffixElement = document.createElement('input-suffix');\n\t\tinputSuffixElement.setAttribute('ref', 'inputSuffix');\n\t\tinputWrapper.appendChild(inputSuffixElement);\n\t}\n\t\n\t// Append input wrapper to container\n\tcontainer.appendChild(inputWrapper);\n\t\n\t// Suffix, if present\n\tif (ignoreEmptyDOM || suffix) {\n\t\tconst suffixElement = document.createElement('number-suffix');\n\t\tsuffixElement.setAttribute('ref', 'suffix');\n\t\tcontainer.appendChild(suffixElement);\n\t\tif(!suffix){\n\t\t\tcontainer.classList.add('dg-field__suffix--hidden');\n\t\t}\n\t}\n\t\n\t// Append container to wrapper\n\tfragmentElemet.appendChild(container);\n\t\n\t// Helper text, if present\n\tif(ignoreEmptyDOM || description){\n\t\tconst helperTextElement = document.createElement('number-helper-text');\n\t\thelperTextElement.setAttribute('ref', 'description');\n\t\tfragmentElemet.appendChild(helperTextElement);\n\t}\n\n\tif(ignoreEmptyDOM || error){\n\t\tconst errorElement = document.createElement('number-error');\n\t\terrorElement.setAttribute('ref', 'error');\n\t\tfragmentElemet.appendChild(errorElement);\n\t}\n\t\n\n\twrapper.appendChild(fragmentElemet);\n\t\n\treturn wrapper;\n};\n\nexport {\n    splitButtonTemplate,\n    spinButtonTogetherTemplate,\n    BasicTemplateWithoutButtons\n\n}","    import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n    import { AutoWired, BEAN_NAME, setAriaDescribedBy, setAriaInvalid, setAriaLabel, setAriaLabelledBy, setAriaRequired, setAriaValueMax, setAriaValueMin, setAriaValueNow, toggleAttribute } from \"@dg/corecomponent\";\n    import { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\n    import { NumberKeyBoardShortCuts } from \"../model/number-keyboard-shortcuts\";\n    // import { IDestroyAdjuster } from \"../model/number-keyboard-shortcuts.types\";\n    import { INumberEventHandler } from \"../model/number-event-handler.types\";\n    import { IFormatter } from \"../../formatter/formatter.types\";\n    import { composeClasses } from \"@dg/utils\";\n    import { INumberOptionHandler } from \"../model/number-option-handler.types\";\n    import { INumericAdjusterModel } from \"../model/number-adjuster.types\";\nimport { RenderingNumberInputCompType } from \"./rendering-number-input.types\";\nimport { getNumberRootUtilityClass } from \"../number-utils/number-classnames-slots\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\n    const useUtilityClasses = (_ownerState : any) => {\n        // const { invalid, disabled, readonly, focus } = ownerState;\n        const slots = {\n            root: {\n                slot: 'input',\n                modifiers: [\n                    // invalid && 'error',\n                    // disabled && 'disabled',\n                    // readonly && 'readonly',\n                    // focus && 'focus'\n                ],\n            },\n        };\n\n        return composeClasses(slots, getNumberRootUtilityClass);\n    };\n    export class RenderingNumberInputController extends EventEmitter {\n\n        @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: INumberOptionHandler;\n        @AutoWired('NumberAdjusterHandler') adjusterModel !: INumericAdjusterModel;\n        @AutoWired(NUMBER_BEAN_NAME.KEYBOARD_SHORTCUT_HANDLER) adjusterEventHandler !: NumberKeyBoardShortCuts;\n        @AutoWired(NUMBER_BEAN_NAME.NUMBER_EVENT_HANDLER) numberEventHandler !: INumberEventHandler;\n        // @AutoWired(NUMBER_BEAN_NAME.NUMBER_ADJUSTER_HANDLER) numericAdjusterModel !: NumericAdjusterModel;\n        @AutoWired(NUMBER_BEAN_NAME.FORMATTER) formatter !: IFormatter;\n\n        private comp !: RenderingNumberInputCompType;\n\n        // private numberAdjusterRef : IDestroyAdjuster |null = null;\n        // private zerosAfterDecimal!:string | null;\n        private userInputValue !:string;\n        private formattedState = {\n            hasDecimal: false,\n            hasPlus: false,\n            hasMinus: false,\n            zeroAfterDecimal: false,\n        };\n\n        private nonFormattedState = {\n            hasDecimal: false,\n            hasPlus: false,\n            hasMinus: false,\n        };\n        \n        setComp(comp : RenderingNumberInputCompType ) {\n            this.comp = comp;\n\n            this.applyClasses();\n            // this.userInputValue = this.validateInput(String(this.adjusterModel.getValue()))\n            this.setValue();\n            this.setAriaAttributes();\n            this.registerEventHandler();\n            // this.registerAdjusterEventHandler();\n            this.setTabIndex(\"-1\");\n            // this.setPlaceholder();\n            // this.setRequired();\n            \n        }\n\n        private applyClasses() : void {\n            const ownerState = this.getOwnerState();\n            const classes = useUtilityClasses(ownerState);\n            this.comp.addOrRemoveCSSClass(classes.root);\n            this.comp.getElement().classList.add(\"dg-field__input\");\n            if(this.optionHandler.getType() === \"currency\" ){\n            this.comp.getElement().classList.add(\"dg-currency__root\");\n            }else if(this.optionHandler.getType() === \"percent\"){\n            this.comp.getElement().classList.add(\"dg-percentage__root\");\n            }\n            \n        }\n\n        private setPlaceholder() {\n            const placeholder = this.optionHandler?.getPlaceholder();\n            placeholder && ((this.comp.getElement() as HTMLInputElement).placeholder = placeholder);\n        }\n        \n\n        // private setRequired(){\n        //     this.optionHandler.isRequired() && ((this.comp.getElement() as HTMLInputElement).setAttribute(\"required\",\"\"))\n        // }\n\n        private setTabIndex(index : string){\n            this.comp.getElement().setAttribute(\"tabIndex\", index);\n        }\n        \n        private refresh() : void {\n            this.applyClasses();\n\n        }\n\n        private getOwnerState() {\n            return {\n                invalid : !this.adjusterModel.isValid(),\n                disabled: this.optionHandler.isDisabled(),\n                readonly: this.optionHandler.isReadonly(),\n                focus   : this.adjusterModel?.isFocused() ??  true,\n            }\n        }\n\n        private registerEventHandler() {\n            const ownerState = this.getOwnerState();\n            const element = this.comp.getElement() as HTMLInputElement;\n\n            registerClipboardGuards(\n                element,\n                () => this.optionHandler.getClipboard(),\n                (target, event, listener) => this.addListener(target, event, listener)\n            );\n\n            if(ownerState.disabled) {\n                return \n            }\n\n            if(ownerState.readonly){\n                // this.addListener(element, 'focusin', (_event) => {\n                //     this.adjusterModel.setFocus(true)\n                //     this.refresh()\n\n                // })\n                // this.addListener(element, 'focusout', (_event) => {\n                //     this.adjusterModel.setFocus(false)\n                //     this.refresh()\n\n                // })\n            }\n            \n            this.addListener(element, 'focusin', (_event) => {\n                if(ownerState.readonly){\n                    return\n                }\n                this.dispatchEvent({type : 'FOCUS_IN'})\n                \n            });\n\n\n            // this.addListener(element, 'focusout', (event) => {\n            //     // if(ownerState.readonly){\n            //     //     return\n            //     // }\n            //     this.numberEventHandler.onFocusOut(event);\n            //     this.refresh()\n\n            // });\n\n            // this.addListener(element, 'keydown', (event) => {\n            //     if(ownerState.readonly){\n            //         return\n            //     }\n            //     this.numberEventHandler.onKeyDown(event);\n            //     this.optionHandler.onKeydown(this.adjusterModel.getValue() as number)\n                \n            //     // const value = String(this.adjusterModel.getValue())\n            //     // const length = value.length;\n            //     // const key = event.key;\n            //     // if(key === 'ArrowUp' || key === 'ArrowDown'){\n            //     //     // element.setSelectionRange(0, 0)  \n            //     // }\n\n\n                \n                \n            // });\n\n            // this.addListener(element, 'input', (event: InputEvent) => {\n            //     if (ownerState.readonly) {\n            //         return;\n            //     }\n            //     event.preventDefault();\n            //     const inputElement = event.target as HTMLInputElement;\n            //     let value = inputElement.value;\n\n            //     // Remove invalid characters and ensure single instance of . + -\n            //     const filteredValue = this.validateInput(value);\n\n            //     inputElement.value = filteredValue;\n\n            //     const formattedValue = Number(filteredValue);\n            //     this.numberEventHandler.onInput(formattedValue);\n            //     this.optionHandler.onInput(this.adjusterModel.getValue() as number);\n            // });\n            // this.addListener(element, 'input', (event: InputEvent) => {\n            //     if (ownerState.readonly) {\n            //         return;\n            //     }\n                \n            //     event.preventDefault();\n            //     const inputElement = event.target as HTMLInputElement;\n            //     let value = inputElement.value;\n                \n            //     // Validate input: ensure only valid characters (numbers, one \".\", \"+\", \"-\")\n            //     this.userInputValue = this.validateInput(value);\n                \n            //     if (this.formattedState.hasDecimal) {\n            //         const formattedValue = parseFloat( this.userInputValue ); // parseFloat retains decimals\n            //         if(!isNaN(formattedValue)) {\n            //             this.numberEventHandler.onInput(formattedValue);\n            //             this.optionHandler.onInput(this.adjusterModel.getValue() as number);\n                        \n            //         }\n            //         // this.setValue()\n                    \n\n            //     } else {\n            //         const formattedValue = parseFloat( this.userInputValue ); // parseFloat retains decimals\n            //         this.numberEventHandler.onInput(formattedValue);\n            //     }\n            \n            //     // this.optionHandler.onInput(this.adjusterModel.getValue() as number);\n            // });\n            \n\n            // this.addListener(element, 'paste', (event: ClipboardEvent) => {\n            //     if (ownerState.readonly) {\n            //         return;\n            //     }\n            //     event.preventDefault(); // Prevent default paste behavior\n            \n            //     // Get the input element and its current value\n            //     const inputElement = event.target as HTMLInputElement;\n            //     const currentValue = inputElement.value || '';\n            \n            //     // Get the caret (cursor) position\n            //     const caretPosition = inputElement.selectionStart || 0;\n            \n            //     // Get pasted content\n            //     const pasteData = event.clipboardData?.getData('text') || '';\n            \n            //     // Filter to allow numbers, e, +, -, and . for valid numeric input\n            //     const numericValue = pasteData.replace(/[^0-9eE+\\-\\.]/g, ''); // Extract valid numeric characters\n            \n            //     // Split the current value at the caret position\n            //     const newValue = \n            //         currentValue.slice(0, caretPosition) + // Text before caret\n            //         numericValue +                         // Pasted numeric content\n            //         currentValue.slice(caretPosition);     // Text after caret\n            \n            //     // Update the input field value\n            //     inputElement.value = newValue;\n            \n            //     // Dispatch the input event to handle the new numeric value\n            //     this.numberEventHandler.onInput(Number(newValue));  // Pass the new value\n            //     this.optionHandler.onInput(this.adjusterModel.getValue() as number);\n            \n            //     // Move the caret to the end of the pasted content\n            //     const newCaretPosition = caretPosition + numericValue.length;\n            //     inputElement.setSelectionRange(newCaretPosition, newCaretPosition);\n            // });\n            \n            \n            \n\n\n            // this.addListener(this.eventHandler, 'EVENT_FOCUS_OUT', this.setValue.bind(this));\n            // this.addListener(this.eventHandler, 'EVENT_FOCUS_IN', this.setValue.bind(this));\n            // this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.setValue.bind(this));\n            // this.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.refresh.bind(this));\n            // this.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.setValue.bind(this));\n            // this.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.refresh.bind(this));\n            // this.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.setValue.bind(this));\n            // this.addListener(this.eventHandler, 'EVENT_REFRESH', this.refresh.bind(this));\n            // this.addListener(this.eventHandler, 'FOCUS_IN', this.focusIn.bind(this));\n            // this.addListener(this.eventHandler, 'PROPERTY_CHANGED', this.setPlaceholder.bind(this));\n            // this.addListener(this.eventHandler, 'PROPERTY_CHANGED', this.setRequired.bind(this));\n            // this.addListener(this.eventHandler, 'PROPERTY_CHANGED', this.setValue.bind(this));\n            // this.addListener(this.eventHandler, 'EVENT_CLEAR_VALUE', this.clear.bind(this));\n\n        }\n        // private validateInput(value: string): string {\n        //     let filteredValue = '';\n        //     let hasDecimal = false;\n        //     let hasExponent = false;\n        //     let plusMinusCount = 0; // Track the number of \"+\" and \"-\" signs\n            \n        //     for (let i = 0; i < value.length; i++) {\n        //         const char = value[i];\n                \n                \n        //         // Allow one decimal point, but only before the exponent part\n        //         if (char === '.' && !hasDecimal && !hasExponent) {\n        //             hasDecimal = true;\n        //             this.formattedState.hasDecimal = true;\n        //             filteredValue += char;\n        //         }\n        //         // Allow \"e\" or \"E\" for scientific notation, but only one and not as the first character\n        //         else if ((char === 'e' || char === 'E') && !hasExponent && filteredValue.length > 0) {\n        //             hasExponent = true;\n        //             filteredValue += char;\n        //         }\n        //         // Allow \"+\" or \"-\" up to two times in the expression\n        //         else if ((char === '+' || char === '-') && plusMinusCount < 2) {\n        //             plusMinusCount++; // Increment count for \"+\" and \"-\"\n        //             filteredValue += char;\n        //         }\n        //         // else if (char === '0' && hasDecimal) {\n        //         //     this.formattedState.zeroAfterDecimal = true; // Set the zeroAfterDecimal flag\n        //         //     filteredValue += char;\n        //         // } \n        //         // Allow digits (0-9) at any position\n        //         else if (/\\d/.test(char)) {\n        //             filteredValue += char;\n        //             if (hasDecimal) {\n        //                 // Check if the current filteredValue matches the regex for zeros after decimal\n        //                 const match = filteredValue.match(/(?<=\\.)0+$/);\n        //                 if (match) {\n        //                     // this.zerosAfterDecimal = match[0]; // Store the matched zeros\n        //                 }\n        //                 if (/[1-9]/.test(filteredValue)) {\n        //                     // this.zerosAfterDecimal = \"\"; // Reset to null\n        //                 }\n        //             }\n        //         }\n\n        //     }\n            \n        //     return filteredValue;\n        // }\n        \n        \n        // private updateformattedState(value: string) {\n        //     this.formattedState.hasDecimal = value.includes('.');\n        //     this.formattedState.hasPlus = value.includes('+');\n        //     this.formattedState.hasMinus = value.includes('-');\n        // }\n\n        // private resetformattedState() {\n        //     this.formattedState.hasDecimal = false;\n        //     this.formattedState.hasPlus = false;\n        //     this.formattedState.hasMinus = false;\n        // }\n\n        private setAccessibility() : void {\n            this.setAriaAttributes();\n            this.setRole();\n        }\n\n        private setRole() : void {\n            const element = this.comp.getElement();\n            toggleAttribute(element, 'role', 'spinbutton');\n        }\n\n        // private setClassOnFocus():void{\n\n        // }\n\n        private setAriaAttributes() : void {\n            const element = this.comp.getElement();\n            setAriaValueMin(element, this.optionHandler.getMin());\n            setAriaValueMax(element, this.optionHandler.getMax());\n            setAriaValueNow(element, this.adjusterModel.getValue() as  number);\n            // // setAriaDisabled(element, this.optionHandler.isDisabled());\n            // // setAriaReadOnly(element, this.optionHandler.isReadOnly());\n            setAriaInvalid(element, !this.adjusterModel.isValid());\n            setAriaRequired(element, this.optionHandler.isRequired());\n            setAriaLabel(element, this.optionHandler.getAriaLabel());\n            (this.optionHandler.getLabel()) ? setAriaLabelledBy(element, this.adjusterModel.getAriaLabelledby()) :null;\n            (this.optionHandler.getDescription()) ? setAriaDescribedBy(element, this.adjusterModel.getAriaDescribedby()):null;\n            this.optionHandler.isReadonly() ? element.setAttribute(\"readonly\",\"\") : element.removeAttribute(\"readonly\");\n            this.optionHandler.isDisabled() ? element.setAttribute(\"disabled\",\"\") : element.removeAttribute(\"disabled\");\n        }\n\n        private setValue() : void {\n            const value = this.adjusterModel.getValue();\n            const numValue = value == null ? null : Number(value);\n            if (numValue === null || !Number.isFinite(numValue)) {\n                this.setPlaceholder();\n            } else if(this.adjusterModel?.isFocused() && true) {\n                this.setNonFormattedValue();\n            }else {\n                this.setFormattedValue();\n            }\n\n            this.refresh()\n            this.setAccessibility();\n        \n        }\n\n        private setNonFormattedValue(): void {\n            // Use getValueAsString() to preserve decimal input during typing\n            const valueString = this.adjusterModel.getValueAsString();\n            const element = this.comp.getElement() as HTMLInputElement;\n            const numericValue = this.adjusterModel.getValueAsNumber();\n            if (!Number.isFinite(numericValue)) {\n                return;\n            }\n            let formattedValue = valueString !== null ? valueString : '';\n\n            this.userInputValue ? this.userInputValue :this.userInputValue = formattedValue;\n\n            const userInputParts = this.userInputValue.split('.');\n        \n            // Ensure that a decimal is added if `this.formattedState.hasDecimal` is true but the formatted value lacks one\n            if (this.formattedState.hasDecimal && !formattedValue.includes(\".\")) {\n                formattedValue += \".\";\n                this.formattedState.hasDecimal = false;\n            }\n            const formattedValueParts = formattedValue.split('.');\n\n            if(this.userInputValue === \"0.0\"){\n                formattedValue = \"0.0\"\n            }\n\n        \n            // If both user input and formatted value have a decimal, compare the fractional parts\n            if (userInputParts.length > 1 && formattedValueParts.length > 1) {\n                const fractionalUserInput = userInputParts[1];\n                const fractionalFormatted = formattedValueParts[1];\n        \n                // Update formattedValue only if the fractional part differs\n                if (fractionalUserInput !== fractionalFormatted) {\n                    formattedValue = formattedValueParts[0] + '.' + fractionalUserInput;\n                }\n            }\n        \n            // Add any trailing zeros after the decimal, if necessary\n            // if (this.zerosAfterDecimal) {\n            //     formattedValue += this.zerosAfterDecimal;\n            //     this.zerosAfterDecimal = \"\"; // Reset the zerosAfterDecimal flag\n            // }\n        \n            // Set the updated value to the input element\n            element.innerText = formattedValue;\n        }\n        \n\n        private setFormattedValue() : void {\n            const element = this.comp.getElement() as HTMLInputElement;\n\n            const value = this.adjusterModel.getValueAsNumber();\n            if (!Number.isFinite(value)) {\n                return;\n            }\n            const decimal = this.optionHandler.getDecimalPrecision();\n            const decimalValue = Number(value).toFixed(decimal?decimal:0);\n\n            const userFormattedValue = this.optionHandler.getFormatter(decimalValue);\n\n            if(userFormattedValue){\n                element.innerText = userFormattedValue;\n                return;\n            }\n\n            // let formattedValue = this.formatter.formatter();\n            let formattedValue = \"\";\n            if(this.formatter){\n                formattedValue = this.formatter.formatter();\n                element.innerText = formattedValue;\n                return;\n            }\n            const type = this.optionHandler.getType();\n            const position =  this.optionHandler.getSymbolPosition() \n\n            if(type === 'currency' && position === 'left'){\n                formattedValue = setSybmol(formattedValue,this.optionHandler.getCurrencySymbol() as string)\n            }\n\n            if (this.nonFormattedState.hasDecimal && !formattedValue.includes(\".\")) {\n                formattedValue += \".\";\n                this.nonFormattedState.hasDecimal = false\n                this.formattedState.hasDecimal = true\n\n            }\n\n\n            element.innerText = formattedValue;\n        }\n\n        // private registerAdjusterEventHandler() {\n        //     const ownerState = this.getOwnerState();\n        //     if(ownerState.readonly || ownerState.disabled) {\n        //         return\n        //     }\n\n        //     const element = this.comp.getElement();\n\n        //     this.numberAdjusterRef = this.adjusterEventHandler.registerElement(element);\n\n        //     this.addDestroyFunc(() => {\n        //         this.numberAdjusterRef && this.numberAdjusterRef.destroyFunc()\n        //         this.numberAdjusterRef = null;\n        //     })\n        // }\n\n        destroy(): void {\n            super.destroy();\n        }\n\n        // private focusIn(event:FocusEvent):void{\n        //     // const element = this.comp.getElement() as HTMLInputElement;\n        //     this.numberEventHandler.onFocus(event);\n        //         this.refresh()\n        //         // const value  = String(this.adjusterModel.getValue());\n        //         // const lenght = value.length\n        //         // element.setSelectionRange(lenght, lenght);\n\n        // }\n\n        clear(){\n            (this.comp.getElement()as HTMLInputElement).value = '';\n        }\n    }\n\n    function setSybmol(formattedValue: string, currencySymbol: string) {\n        const trimmed = formattedValue.trim();\n        const isNegative = trimmed.startsWith('-');\n        const core = isNegative ? trimmed.slice(1).trim() : trimmed;\n        return isNegative ? `-${currencySymbol}${core}` : `${currencySymbol}${core}`;\n    }\n    ","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport {  RenderingNumberInputController } from \"./rendering-number-input-controller\";\nimport { RenderingNumberInputCompType } from \"./rendering-number-input.types\";\n\n\nconst numberInputTemplate = () => {\n    const div = document.createElement(\"span\");\n    return div as HTMLElement;\n}\n\nexport class RenderingNumberInputComponent extends Component {\n\n    constructor() {\n        super();\n        this.setTemplate(numberInputTemplate())\n    }\n\n    @PostConstruct()\n    init() {\n        const comp : RenderingNumberInputCompType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        const controller = this.createBean(new RenderingNumberInputController());\n        controller.setComp(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n}","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { INumberOptionHandler } from \"../model/number-option-handler.types\";\nimport { INumberEventHandler } from \"../model/number-event-handler.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { NumberKeyBoardShortCuts } from \"../model/number-keyboard-shortcuts\";\nimport { NumberRootCompType } from \"./rendering-number-root.types\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { NumberControllerHandler } from \"../model/number-controller\";\nimport { INumericAdjusterModel } from \"../model/number-adjuster.types\";\nimport { getNumberRootUtilityClass } from \"../number-utils/number-classnames-slots\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'root',\n\t\t\tmodifiers: [],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getNumberRootUtilityClass);\n};\n\n\n\n\nexport class RenderingNumberController extends AbstractController<NumberRootCompType> {\n    \n    // Model should only be autowired for controller\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: INumberOptionHandler;\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_EVENT_HANDLER) numberEventHandler !: INumberEventHandler;\n\t@AutoWired(NUMBER_BEAN_NAME.KEYBOARD_SHORTCUT_HANDLER) adjusterEventHandler !: NumberKeyBoardShortCuts;\n\t@AutoWired('NumberAdjusterHandler') adjusterModel !: INumericAdjusterModel;\n\t@AutoWired(NUMBER_BEAN_NAME.NUMBER_CONTROLLER_HANDLER) controllerHandler !: NumberControllerHandler;\n\tprivate wrapperFocused !: boolean;\n\tprivate prefixComponent!: HTMLElement | null;\n\tprivate suffixComponent!: HTMLElement| null;\n\n    init(){\n        this.registerEvents();\n\t\tthis.applyClassNames();\n\t\t// this.addListeners();\n\n\t\tthis.controllerHandler.registerNumber(this);\n\t\tthis.prefixComponent = this.component?.getPrefixElement() ? this.component?.getPrefixElement().eGui : null;\n\t\tthis.suffixComponent = this.component?.getSuffixElement() ? this.component?.getSuffixElement().eGui : null;\n    }\n\n\t// private addListeners(){\n\t// \tthis.component?.getGui().addEventListener('focusin', (event)=>{\n\t// \t\tconst ownerState = this.getOwnerState();\n\t// \t\tthis.wrapperFocused = true;\n\t// \t\tthis.refresh();\n\n\t// \t\tif( ownerState.readonly || ownerState.disabled) {\n\t// \t\t\treturn\n\t// \t\t}\n\t// \t\tthis.onFocusIn(event)\n\t// \t});\n\n\t// \tthis.component?.getGui().addEventListener('mousedown', (event)=>{\n\t// \t\tconst ownerState = this.getOwnerState();\n\t// \t\tthis.wrapperFocused = true;\n\n\n\t// \t\tthis.refresh();\n\n\n\t// \t\tif( ownerState.readonly || ownerState.disabled) {\n\t// \t\t\treturn\n\t// \t\t}\n\t// \t\tthis.onFocusIn(event)\n\t\t\t\n\t// \t});\n\t// \tthis.component?.getGui().addEventListener('focusout', (_event)=>{\n\t// \t\tconst ownerState = this.getOwnerState();\n\t// \t\tthis.wrapperFocused = false;\n\t// \t\tthis.refresh();\n\n\t// \t\tif( ownerState.readonly || ownerState.disabled) {\n\t// \t\t\treturn\n\t// \t\t}\n\t// \t\t// this.onFocusIn(event)\n\t// \t});\n\t// }\n\n\n    private registerEvents() {\n        this.addListener(this.eventHandler, 'EVENT_FOCUS_OUT', this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_INCREMENT_UPDATED', this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_DECREMENT_UPDATED', this.applyClassNames.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_RERENDER', this.rerender.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_BLUR', this.blur.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_SET_PREFIX', this.setPrefix.bind(this));\n\t\tthis.addListener(this.eventHandler, 'EVENT_SET_SUFFIX', this.setSuffix.bind(this));\n\n\t\t\n\n    }\n\n\tprivate refresh(){\n\t\tthis.applyClassNames();\n\t}\n\n\tprivate applyClassNames(){\n\t\tconst ownerState = this.getOwnerState();\n\t\t\tif(this.wrapperFocused === true){\n\t\t\t\townerState.focus = true;\n\t\t\t}\n\t\tconst classes = useUtilityClasses();\n\t\tthis.component?.addOrRemoveCssClass(classes.root);\n\t\tthis.component?.getGui().classList.add(\"dg-field__root\");\n\t\tthis.component?.getGui().classList.add(\"dg-field--render-state\");\n\t\tif(this.optionHandler.getType() === \"currency\" ){\n            this.component?.getGui().classList.add(\"dg-currency__root\");\n            }else if(this.optionHandler.getType() === \"percent\"){\n            this.component?.getGui().classList.add(\"dg-percentage__root\");\n            }\n\t\townerState.invalid &&  this.component?.getGui().classList.add(\"dg-input__status--error\")\n\t\townerState.disabled &&  this.component?.getGui().classList.add(\"dg-input__status--disabled\")\n\t\townerState.readonly &&  this.component?.getGui().classList.add(\"dg-input__status--readonly\")\n\t\townerState.focus && this.component?.getGui().classList.add(\"dg-input__status--focus\")\n\t\t// this.component.getGui().setAttribute(\"tabindex\",\"0\")\n\t}\n\n\tprivate getOwnerState() {\n\t\tconst showErrorState = this.optionHandler.showErrorState();\n\t\treturn {\n\t\t\tinvalid : showErrorState ? !this.adjusterModel?.isValid(): false,\n\t\t\tfocus : this.adjusterModel.isFocused(),\n\t\t\tdisabled : this.optionHandler.isDisabled(),\n\t\t\treadonly : this.optionHandler.isReadonly(),\n\t\t\tsize : this.optionHandler.getSize(),\n\t\t}\n\t}\n\n    private onFocusIn(event : FocusEvent) : void {\n\t\tthis.numberEventHandler.onFocus(event);\n\t\tthis.component?.getInputElement().focus();\n\t\t// this.component.getGui().classList.add(\"dg-input__status--focus\")\n\t}\n\n\tprivate onFocusOut(event : FocusEvent) : void {\n\t\tthis.numberEventHandler.onFocusOut(event);\n\t\t// this.component.getGui().classList.remove(\"dg-input__status--focus\")\n\n\t}\n\n\tprivate onInput(_value : number) : void {\n\t\t// this.numberEventHandler.onInput(value);\n\t}\n\n\tprivate onKeyDown(event : KeyboardEvent) : void {\n\t\tthis.numberEventHandler.onKeyDown(event);\n\t\t// this.component.getGui().classList.add(\"dg-input__status--focus\")\n\n\t}\n\n    getProperty() : any {\n        return {\n\t\t\tonInput                : this.onInput.bind(this),\n\t\t\tonKeyDown              : this.onKeyDown.bind(this),\n\t\t\tonFocusIn              : this.onFocusIn.bind(this),\n\t\t\tonFocusOut             : this.onFocusOut.bind(this),\n\t\t\tisvalid                : this.adjusterModel.isValid(),\n\t\t\tfocused                : this.adjusterModel.isFocused(),\n\t\t\tlabel                  : this.optionHandler.getLabel(),\n\t\t\tprefix : this.optionHandler.getPrefixValue(),\n\t\t\tsuffix : this.optionHandler.getSuffixValue(),\n\t\t\tinputPrefix : this.optionHandler.getStartAdornmentValue(),\n\t\t\tinputSuffix : this.optionHandler.getEndAdornmentValue(),\n\t\t\thelperText             : this.optionHandler.getDescription(),\n\t\t\thtmlFor                : 'number',\n\t\t\tid                     : 'number',\n\t\t\trequired               : this.optionHandler.isRequired(),\n\t\t\treadOnly               : this.optionHandler.isReadonly(),\n\t\t\tdisabled               : this.optionHandler.isDisabled(),\n\t\t\tonIncrement            : (event:any) => this.numberEventHandler.onIncrement(event),\n\t\t\tonDecrement            : (event: any) => this.numberEventHandler.onDecrement(event),\n\t\t\tincrementDisabled      : this.adjusterModel.isIncrementDisabled(),\n\t\t\tdecrementDisabled      : this.adjusterModel.isDecrementDisabled(),\n\t\t\tspinButton             : this.optionHandler.getSpinButton(),\n\t\t\tregisterAdjusterElement: (element : HTMLElement) => this.adjusterEventHandler.registerElement(element),\n\t\t\tgetTemplate            : (props: any) => this.optionHandler.getTemplate(props),\n\t\t\tdescription            : this.optionHandler.getDescription() || this.optionHandler.getDescriptionRenderer(),\n\t\t\terror                  : this.optionsHandler.showErrorState(),\n\t\t\tinvalid                : !this.optionHandler.isValid(),\n\t\t\tinvalidText            : this.optionHandler.getValidationMessage(),\n\t\t};\n    }\n\n\tgetParamsProperty() {\n        return {\n\t\t\tincrementButton: {\n                getIcon          : () =>  this.optionsHandler.getIncrementButtonSVGIconId(),\n                getRenderer      : () => this.optionsHandler.getIncrementButtonRenderer(),\n                getRendererParams: () => this.optionsHandler. getIncrementButtonRendererParams(),\n                callback         : (event: any) => this.numberEventHandler.onIncrement(event),\n                isDisabled       : () => this.adjusterModel.isIncrementDisabled(),\n\t\t\t\tisReadonly : () => this.optionHandler.isReadonly(),\n                getRole          : () => 'increment',\n\t\t\t\tgetSpinButton : () =>(this.optionsHandler.getSpinButton() === 'split' ? true : false),\n\t\t\t\tgetClasses : ()=> [\"dg-number__spinbutton\", \"dg-number__spin-downbtn\"],\n\t\t\t\tgetTabindex : ()=> \"-1\"\n\t\t\t},\n\t\t\tdecrementButton: {\n                getIcon       : () =>  this.optionsHandler.getDecrementButtonSVGIconId(),\n                renderer      : () => this.optionsHandler.getDecrementButtonRenderer(),\n                rendererParams: () => this.optionsHandler.getDecrementButtonRendererParams(),\n                callback      : (event : any) => this.numberEventHandler.onDecrement(event),\n                isDisabled    : () => this.adjusterModel.isDecrementDisabled(),\n\t\t\t\tisReadonly : () => this.optionHandler.isReadonly(),\n                getRole       : () => 'decrement',\n\t\t\t\tgetSpinButton : () =>(this.optionsHandler.getSpinButton() === 'split' ? true : false),\n\t\t\t\tgetClasses    : ()=> [ \"dg-number__spinbutton\", \"dg-number__spin-downbtn\"],\n\t\t\t\tgetTabindex : ()=> \"-1\"\n\n\t\t\t},\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> \"dg-number__label\",\n\t\t\t\tgetLabelTitleClasses :()=> \"dg-number__label-title\"\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-number__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-number__description\",\n\t\t\t\tinvalid : () => {\n\t\t\t\t\tconst showErrorState = this.optionHandler.showErrorState();\n\t\t\t\t\treturn showErrorState ? !this.adjusterModel?.isValid() : false;\n\t\t\t\t},\n\t\t\t\tinvalidText : () => this.optionHandler.getValidationMessage()\n\t\t\t},\n\t\t\tsuffix : {\n\t\t\t\tgetUserClasses : ()=> \"dg-number__suffix-elem\"\n\t\t\t},\n\t\t\tprefix : {\n\t\t\t\tgetUserClasses : ()=> \"dg-number__prefix-elem\"\n\t\t\t},\n\t\t\tinputSuffix:{\n\t\t\t\tgetUserClasses : ()=> \"dg-number__input-suffix\"\n\t\t\t},\n\t\t\tinputPrefix:{\n\t\t\t\tgetUserClasses : ()=> \"dg-number__input-prefix\"\n\t\t\t}\n\t\t};\n    }\n\n\tgetElement() : HTMLElement |  undefined {\n\t\treturn this.component?.getGui();\n\t}\n\n\tfocus(): void{\n\t\tthis.component?.getInputElement().focus();\n\t\tthis.dispatchEvent({type : 'FOCUS_IN'})\n\t}\n\n\tblur(): void{\n        this.component?.getInputElement().blur();\n\t\t// this.component?.getGui().blur();\n\t\tthis.wrapperFocused = false;\n\t\tthis.refresh();\n\n    }\n\t \n\tdestroy():void{\n\n\t\t// this.component?.getGui().remove();\n\t\t// super.destroy();\n\t\t\n\t}\n\n\trerender():void{\n\t\tthis.component?.rerender()\n\t\tthis.refresh();\n\n\n\t}\n\n\tsetPrefix(params:any){\n\t\tthis.prefixComponent && this.prefixComponent.remove();\n\t\tif(!params.options.prefix){\n\t\t\treturn\n\n\t\t}\n\t\tconst container = this.component?.getContainerElement();\n\t\t this.prefixComponent = document.createElement('div');\n\t\tthis.prefixComponent.classList.add(\"dg-number__prefix-elem\");\n\t\tthis.prefixComponent.classList.add(\"dg-prefix-elem\");\n\t\tthis.prefixComponent.setAttribute(\"ref\",\"prefix\")\n\n\t\tthis.prefixComponent.innerHTML = params.options.prefix;\n\t\tcontainer?.insertBefore(this.prefixComponent, container.firstChild);\n\n\t}\n\tsetSuffix(params:any){\n\t\tthis.suffixComponent && this.suffixComponent.remove();\n\t\tif(!params.options.suffix){\n\t\t\treturn\n\t\t}\n\t\tconst container = this.component?.getContainerElement();\n\t\tthis.suffixComponent = document.createElement('div');\n\t\tthis.suffixComponent.classList.add(\"dg-number__suffix-elem\");\n\t\tthis.suffixComponent.classList.add(\"dg-suffix-elem\");\n\t\tthis.suffixComponent.innerHTML = params.options.suffix;\n\t\tthis.suffixComponent.setAttribute(\"ref\",\"suffix\")\n\t\tcontainer?.appendChild(this.suffixComponent);\n\t}\n\n\thide(){\n\t\t// this.component?.getGui().style.display = 'none';\n\t}\n\n\tshow(){\n\t\t// this.component?.getGui().style.display = 'flex';\n\t}\n\n}\n\n\n","import { PostConstruct, queryAssignedNodes } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { RenderingNumberController } from './rendering-number-root-controller';\nimport { composeClasses } from '@dg/utils';\nimport { getNumberRootUtilityClass } from '../number-utils/number-classnames-slots';\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'container',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getNumberRootUtilityClass)\n}\n\n// const splitButtonTemplate = (label:string, helperText : any, prefix:string, suffix:string) => {\n// \treturn `<div>\n// \t${label ? `<number-label ref=\"label\"></number-label>` : ''}\n// \t\t<div ref=\"container\" class=\"dg-number__container dg-field__container\">\n// \t\t${prefix ? `<number-prefix ref=\"prefix\"></number-prefix>` : ''}\n\n// \t\t\t\t<div class=\"dg-number__input-wrapper dg-field__input-wrapper\" tabindex=\"0\">\n// \t\t\t\t\t<number-increment ref=\"incrementButton\"></number-increment>\n// \t\t\t\t\t<number-rendering-element ref = \"numberInputRef\"></number-rendering-element>\n// \t\t\t\t\t<number-decrement ref=\"decrementButton\"></number-decrement>\n// \t\t\t\t</div>\n// \t\t${suffix ? `<number-suffix ref=\"suffix\"></number-suffix>` : ''}\n\n// \t\t</div>\n// \t\t${helperText ? `<number-helper-text ref = \"description\"></number-helper-text>` : ''}\n// \t</div>`;\n// }\n// const spinButtonTogetherTemplate = (label:string, helperText : any, prefix:string, suffix:string) => {\n\n// \t\treturn `<div>\n// \t\t${label ? `<number-label ref=\"label\"></number-label>` : ''}\n// \t\t<div ref=\"container\" class=\"dg-number__container dg-field__container\">\n// \t\t${prefix ? `<number-prefix ref=\"prefix\"></number-prefix>` : ''}\n// \t\t\t<div class=\"dg-number__input-wrapper dg-field__input-wrapper\" tabindex=\"0\">\n// \t\t\t<number-rendering-element ref = \"numberInputRef\" ></number-rendering-element>\n// \t\t\t<number-spin-button ref=\"spinButton\"></number-spin-button>\n// \t\t\t${suffix ? `<number-suffix ref=\"suffix\"></number-suffix>` : ''}\n// \t\t\t</div>\n// \t\t</div>\n// \t\t${helperText ? `<number-helper-text ref = \"description\"></number-helper-text>` : ''}\n// \t</div>`;\n\n\t\n// }\n\n// const BasicTemplateWithoutButtons = (label:string, helperText : any, prefix:string, suffix:string,inputPrefix:string,inputSuffix:string) =>{\n\t\n// \treturn `<div>\n// \t     ${label ? `<number-label ref=\"label\"></number-label>` : ''}\n// \t\t<div ref=\"container\" class=\"dg-number__container dg-field__container\">\n// \t\t${prefix ? `<number-prefix ref=\"prefix\"></number-prefix>` : ''}\n// \t\t\t<div class=\"dg-number__input-wrapper dg-field__input-wrapper\" tabindex=\"0\">\n// \t\t\t\t${inputPrefix ? `<input-prefix ref=\"inputPrefix\"></input-prefix>` : ''}\n// \t\t\t\t\t\t<number-rendering-element ref = \"numberInputRef\" ></number-rendering-element>\n// \t\t\t\t${inputSuffix ? `<input-suffix ref=\"inputSuffix\"></input-suffix>` : ''}\n\n// \t\t\t</div>\n// \t\t${suffix ? `<number-suffix ref=\"suffix\"></number-suffix>` : ''}\n\n// \t\t</div>\n// \t\t${helperText ? `<number-helper-text ref = \"description\"></number-helper-text>` : ''}\n// \t\t</div>`;\n// }\n\nconst splitButtonTemplate = (\n    label: string, \n    helperText: boolean, \n    prefix: string, \n    suffix: string\n): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (label) {\n        const labelElement = document.createElement(\"number-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Number container\n    const numberContainer = document.createElement(\"div\");\n    numberContainer.setAttribute(\"ref\", \"container\");\n    numberContainer.classList.add(\"dg-number__container\", \"dg-field__container\");\n\n    // Prefix\n    if (prefix) {\n        const prefixElement = document.createElement(\"number-prefix\");\n        prefixElement.setAttribute(\"ref\", \"prefix\");\n        numberContainer.appendChild(prefixElement);\n    }\n\n    // Input wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.classList.add(\"dg-number__input-wrapper\", \"dg-field__input-wrapper\");\n    inputWrapper.setAttribute(\"tabindex\", \"0\");\n\n    // Increment button\n    const incrementButton = document.createElement(\"number-increment\");\n    incrementButton.setAttribute(\"ref\", \"incrementButton\");\n\n    // Number rendering element\n    const numberInput = document.createElement(\"number-rendering-element\");\n    numberInput.setAttribute(\"ref\", \"numberInputRef\");\n\n    // Decrement button\n    const decrementButton = document.createElement(\"number-decrement\");\n    decrementButton.setAttribute(\"ref\", \"decrementButton\");\n\n    // Append elements to input wrapper\n    inputWrapper.appendChild(incrementButton);\n    inputWrapper.appendChild(numberInput);\n    inputWrapper.appendChild(decrementButton);\n\n    // Append input wrapper to number container\n    numberContainer.appendChild(inputWrapper);\n\n    // Suffix\n    if (suffix) {\n        const suffixElement = document.createElement(\"number-suffix\");\n        suffixElement.setAttribute(\"ref\", \"suffix\");\n        numberContainer.appendChild(suffixElement);\n    }\n\n    // Append number container to main container\n    container.appendChild(numberContainer);\n\n    // Helper text\n    if (helperText) {\n        const helperTextElement = document.createElement(\"number-helper-text\");\n        helperTextElement.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperTextElement);\n    }\n\n    return container;\n};\nconst spinButtonTogetherTemplate = (\n    label: string, \n    helperText: boolean, \n    prefix: string, \n    suffix: string\n): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (label) {\n        const labelElement = document.createElement(\"number-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Number container\n    const numberContainer = document.createElement(\"div\");\n    numberContainer.setAttribute(\"ref\", \"container\");\n    numberContainer.classList.add(\"dg-number__container\", \"dg-field__container\");\n\n    // Prefix\n    if (prefix) {\n        const prefixElement = document.createElement(\"number-prefix\");\n        prefixElement.setAttribute(\"ref\", \"prefix\");\n        numberContainer.appendChild(prefixElement);\n    }\n\n    // Input wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.classList.add(\"dg-number__input-wrapper\", \"dg-field__input-wrapper\");\n    inputWrapper.setAttribute(\"tabindex\", \"0\");\n\n    // Number rendering element\n    const numberInput = document.createElement(\"number-rendering-element\");\n    numberInput.setAttribute(\"ref\", \"numberInputRef\");\n\n    // Spin button\n    const spinButton = document.createElement(\"number-spin-button\");\n    spinButton.setAttribute(\"ref\", \"spinButton\");\n\n    // Append elements to input wrapper\n    inputWrapper.appendChild(numberInput);\n    inputWrapper.appendChild(spinButton);\n\n    // Suffix\n    if (suffix) {\n        const suffixElement = document.createElement(\"number-suffix\");\n        suffixElement.setAttribute(\"ref\", \"suffix\");\n        inputWrapper.appendChild(suffixElement);\n    }\n\n    // Append input wrapper to number container\n    numberContainer.appendChild(inputWrapper);\n\n    // Append number container to main container\n    container.appendChild(numberContainer);\n\n    // Helper text\n    if (helperText) {\n        const helperTextElement = document.createElement(\"number-helper-text\");\n        helperTextElement.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperTextElement);\n    }\n\n    return container;\n};\nconst BasicTemplateWithoutButtons = (\n    label: string, \n    helperText: boolean, \n    prefix: string, \n    suffix: string, \n    inputPrefix: string, \n    inputSuffix: string\n): HTMLDivElement => {\n    const container = document.createElement(\"div\");\n\n    // Label\n    if (label) {\n        const labelElement = document.createElement(\"number-label\");\n        labelElement.setAttribute(\"ref\", \"label\");\n        container.appendChild(labelElement);\n    }\n\n    // Number container\n    const numberContainer = document.createElement(\"div\");\n    numberContainer.setAttribute(\"ref\", \"container\");\n    numberContainer.classList.add(\"dg-number__container\", \"dg-field__container\");\n\n    // Prefix\n    if (prefix) {\n        const prefixElement = document.createElement(\"number-prefix\");\n        prefixElement.setAttribute(\"ref\", \"prefix\");\n        numberContainer.appendChild(prefixElement);\n    }\n\n    // Input wrapper\n    const inputWrapper = document.createElement(\"div\");\n    inputWrapper.classList.add(\"dg-number__input-wrapper\", \"dg-field__input-wrapper\");\n    inputWrapper.setAttribute(\"tabindex\", \"0\");\n\n    // Input Prefix\n    if (inputPrefix) {\n        const inputPrefixElement = document.createElement(\"input-prefix\");\n        inputPrefixElement.setAttribute(\"ref\", \"inputPrefix\");\n        inputWrapper.appendChild(inputPrefixElement);\n    }\n\n    // Number rendering element\n    const numberInput = document.createElement(\"number-rendering-element\");\n    numberInput.setAttribute(\"ref\", \"numberInputRef\");\n    inputWrapper.appendChild(numberInput);\n\n    // Input Suffix\n    if (inputSuffix) {\n        const inputSuffixElement = document.createElement(\"input-suffix\");\n        inputSuffixElement.setAttribute(\"ref\", \"inputSuffix\");\n        inputWrapper.appendChild(inputSuffixElement);\n    }\n\n    // Append input wrapper to number container\n    numberContainer.appendChild(inputWrapper);\n\n    // Suffix\n    if (suffix) {\n        const suffixElement = document.createElement(\"number-suffix\");\n        suffixElement.setAttribute(\"ref\", \"suffix\");\n        numberContainer.appendChild(suffixElement);\n    }\n\n    // Append number container to main container\n    container.appendChild(numberContainer);\n\n    // Helper text\n    if (helperText) {\n        const helperTextElement = document.createElement(\"number-helper-text\");\n        helperTextElement.setAttribute(\"ref\", \"description\");\n        container.appendChild(helperTextElement);\n    }\n\n    return container;\n};\n\n\n\n\n\n\nfunction RootTemplate(props : any): HTMLElement {\n\tconst { spinButton, getTemplate, label,helperText,prefix, suffix,inputPrefix,inputSuffix } = props;\n\tconst classes = useUtilityClasses();\n\tconst div = document.createElement('div');\n\tconst customTemplate = getTemplate(classes);\n\n\tconst template = customTemplate ? customTemplate : (spinButton === \"together\" ? spinButtonTogetherTemplate(label,helperText, prefix, suffix):(spinButton === \"split\" ? splitButtonTemplate(label,helperText, prefix, suffix) : BasicTemplateWithoutButtons(label, helperText, prefix, suffix,inputPrefix,inputSuffix)))\n\n\t// const template = spinButton === 'together' ? (customTemplate ? customTemplate : spinButton ? spinButtonTogetherTemplate(classes,label,helperText) : splitButtonTemplate(classes, label,helperText)): BasicTemplateWithoutButtons(classes, label, helperText);\n\n\tdiv.appendChild(template)\n\treturn div.firstChild as HTMLElement;\n}\n\nexport class RenderingNumberRootComponent extends Component {\n\n\t@queryAssignedNodes('numberInputRef') numberInputElement !      : any;\n\t@queryAssignedNodes('container') containerElement !      : any;\n\t@queryAssignedNodes('prefix') prefixElement !      : any;\n\t@queryAssignedNodes('suffix') suffixElement !      : any;\n\n\tprivate appendTo: HTMLElement | undefined ;\n\tconstructor(appendTo: HTMLElement | undefined) {\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\t// change for framework view\n\t\tconst component: any = {\n\t\t\tgetGui             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className),\n\t\t\tgetInputElement : ()=> this.getInputElement(),\n\t\t\tgetSuffixElement : ()=> this.getSuffixElement(),\n\t\t\tgetPrefixElement : ()=> this.getPrefixElement(),\n\t\t\trerender : () => this.rerenderComponent(controller),\n\t\t\tgetContainerElement : ()=> this.getContainerElement(),\n\t\t};\n\n        // change createMangedBean to createWire\n\t\tconst controller = this.createManagedBean(new RenderingNumberController());\n\n\t\tconst props = controller.getProperty();\n\t\tconst template = RootTemplate(props);\n\n\t\tconst properties = controller.getParamsProperty();\n\t\t\n\t\tthis.setTemplate(template, {\n\t\t\tincrementButton: properties.incrementButton,\n\t\t\tdecrementButton: properties.decrementButton,\n\t\t\tspinButton     : properties,\n\t\t\tlabel : properties.label,\n\t\t\tdescription : properties.description,\n\t\t\tsuffix : properties.suffix,\n\t\t\tprefix  : properties.prefix,\n\t\t\tinputSuffix :properties.inputSuffix,\n\t\t\tinputPrefix :properties.inputPrefix,\n\t\t});\n\n\t\tcontroller.setComponent(component);\n\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprivate appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.appendTo?.remove();\n\t\t\tthis.appendTo  = undefined;\n\t\t});\n\t}\n\n\tprivate getSuffixElement():any{\n\t\treturn this.suffixElement;\n\t}\n\n\tprivate getPrefixElement():any{\n\t\treturn this.prefixElement\n\t}\n\n\tgetInputElement(): HTMLElement {\n\t\treturn this.numberInputElement.eGui;\n\t}\n\tgetContainerElement(): HTMLElement {\n\t\treturn this.containerElement;\n\t}\n\trerenderComponent(controller: RenderingNumberController): void {\n\t\tcontroller.destroy()\n\t\tconst props = controller.getProperty();\n\t\tconst properties = controller.getParamsProperty();\n\t\tconst newTemplate = RootTemplate(props);\n\t\tthis.setTemplate(newTemplate, {\n\t\t\tincrementButton: properties.incrementButton,\n\t\t\tdecrementButton: properties.decrementButton,\n\t\t\tspinButton     : properties,\n\t\t\tlabel : properties.label,\n\t\t\tdescription : properties.description\n\t\t});\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n}","import { composeClasses } from \"@dg/utils\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { SpinButtonCompType } from \"./spin-button.types\";\nimport { INumberEventHandler } from \"../model/number-event-handler.types\";\nimport { NUMBER_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { AutoWired } from \"@dg/corecomponent\";\nimport { INumericAdjusterModel } from \"../model/number-adjuster.types\";\nimport { getNumberRootUtilityClass } from \"../number-utils/number-classnames-slots\";\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot    : {\n            slot     : 'spinbutton-panel',\n            modifiers: []\n        }\n\t};\n    \n\n\treturn composeClasses(slots, getNumberRootUtilityClass);\n};\n\nexport class SpinButtonController extends EventEmitter {\n    @AutoWired(NUMBER_BEAN_NAME.NUMBER_EVENT_HANDLER) numberEventHandler !: INumberEventHandler;\n     @AutoWired(NUMBER_BEAN_NAME.NUMBER_ADJUSTER_HANDLER) adjusterModel !: INumericAdjusterModel;\n    private comp !: SpinButtonCompType;\n    setComp(comp : SpinButtonCompType) : void {\n        this.comp = comp;\n\n        this.applyClasses();\n    }\n    \n    private applyClasses() : void {\n        const classes = useUtilityClasses();\n        this.comp.addOrRemoveCSSClass(classes.root)\n    }\n\n    getProperty() {\n        return {\n\t\t\tincrementButton: {\n                getIcon          : () =>  this.optionsHandler.getIncrementButtonSVGIconId(),\n                getRenderer      : () => this.optionsHandler.getIncrementRenderer(),\n                getRendererParams: () => this.optionsHandler.getIncrementRendererParams(),\n                callback         : (event :any) => this.numberEventHandler.onIncrement(event),\n                isDisabled       : () => this.adjusterModel.isIncrementDisabled(),\n                getRole          : () => 'increment',\n                getClasses : ()=> \"dg-number__spinbutton dg-number__spin-upbtn\",\n                getTabindex : ()=> \"-1\"\n\t\t\t},\n\t\t\tdecrementButton: {\n                getIcon       : () =>  this.optionsHandler.getDecrementButtonSVGIconId(),\n                renderer      : () => this.optionsHandler.getDecrementRenderer(),\n                rendererParams: () => this.optionsHandler.getDecrementRendererParams(),\n                callback      : (event : any) => this.numberEventHandler.onDecrement(event),\n                isDisabled    : () => this.adjusterModel.isDecrementDisabled(),\n                getRole       : () => 'decrement',\n                getClasses    : ()=>  \"dg-number__spinbutton dg-number__spin-downbtn\",\n                getTabindex : ()=> \"-1\"\n\n\n                \n\t\t\t},\n\t\t};\n    }\n}","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { SpinButtonController } from \"./spin-button-controller\";\nimport { SpinButtonCompType } from \"./spin-button.types\";\n\nconst spinButtonTemplate = () => {\n    const wrapperDiv = document.createElement(\"div\");\n\n    const incrementButton = document.createElement(\"number-increment\");\n    incrementButton.setAttribute(\"ref\", \"incrementButton\");\n\n    const decrementButton = document.createElement(\"number-decrement\");\n    decrementButton.setAttribute(\"ref\", \"decrementButton\");\n\n    wrapperDiv.appendChild(incrementButton);\n    wrapperDiv.appendChild(decrementButton);\n\n    return wrapperDiv;\n};\n\nexport class SpinButtonComponent extends Component {\n    private params : any;\n    constructor(params : any) {\n        super();\n        this.params = params;\n    }\n\n    @PostConstruct()\n    init() : void {\n        const controller = this.createBean(new SpinButtonController());\n\n        this.setTemplate(spinButtonTemplate(), {\n\t\t\tincrementButton: this.params.incrementButton,\n\t\t\tdecrementButton: this.params.decrementButton\n\t\t});\n\n        const comp : SpinButtonCompType = {\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        \n        controller.setComp(comp);\n    }\n\n    private addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n}\n","import { Button } from \"../../../../button/src/button\";\nimport { IButtonConfiguration } from \"../../../../button/src/button-configuration.types\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\n\nexport class ButtonRenderer implements ICustomRenderer{\n    private params : any;\n    private button !: Button|null;\n    \n    init(params : any) {\n        this.params = params;\n        const configuration = this.createConfiguration();\n        this.button = new Button(configuration);\n    }\n\n    getElement(): HTMLElement {\n        return this.button?.api?.getElement() as HTMLElement;\n    }\n\n    private createConfiguration() : IButtonConfiguration {\n        return {\n            text    : this.params.label,\n            callback: this.params.callback,\n            icon    : this.params.icon,\n            showIcon: this.params.showIcon,\n            showText: this.params.showText,\n            disabled: this.params.disabled,\n            readonly : this.params.readonly,\n            ariaLabel : this.params.ariaLabel,\n            classes : this.params.classes,\n            tabindex : this.params.tabindex,\n            getSvgClasses : this.params.getSvgClasses\n        }\n    }\n\n    destroy() : void {\n        this.button?.api?.destroy();\n        this.button = null;\n        this.params = null;\n    }\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { IFormatter } from \"./formatter.types\";\nimport { INumericAdjusterModel } from \"../core/model/number-adjuster.types\";\n\n \n@Bean('formatter')\nexport class CurrencyFormatter extends EventEmitter implements IFormatter {\n\t@AutoWired(\"NumberAdjusterHandler\") protected adjusterHandler!: INumericAdjusterModel;\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: any; // Adjust the type and import path as needed\n  \n\tformatter(): string {\n\t\tconst isEmpty = this.adjusterHandler.isEmty();\n\t\tif (isEmpty) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst value                = this.adjusterHandler.getValue() as number;\n\t\tconst precision            = this.optionsHandler.getDecimalPrecision();\n\t\tconst locale               = this.optionsHandler.getLocale();\n\t\tlet   currencyCode         = this.optionsHandler.getCurrencyCode();\n\t\tconst useThousandSeparator = this.optionsHandler.hasThousandsSeparator();\n\t\tconst customSeparator      = this.optionsHandler.getThousandSeparatorChar();\n\t\tconst decimalSeparator    = this.optionsHandler.getDecimalSeparator();\n\t\tconst useCurrencyCode      = this.optionsHandler.getUseCurrencyCode();\n\t\tconst hideSymbol           = this.optionsHandler.isHideSymbol();\n\t\tconst symbolPosition       = this.optionsHandler.getSymbolPosition();\n\t\tconst currencySymbol       = this.optionsHandler.getCurrencySymbol();\n\n  \n\t\tif (isNullish(value)) {\n\t\t\treturn \"\";\n\t\t}\n  \n\t  const currencyDisplay = useCurrencyCode ? \"code\" : \"symbol\";\n\n\t  let option : Intl.NumberFormatOptions ;\n\n\t  if(hideSymbol){\n\t\toption = {\n\t\t\tstyle: \"decimal\",\n\t\t\tmaximumFractionDigits: precision,\n\t\t\tminimumFractionDigits: precision,\n\t\t\tuseGrouping:useThousandSeparator\n\t\t};\n\n\t  } else{\n\t\toption  = { \n\t\t\tstyle: hideSymbol ? 'decimal':'currency',\n\t\t\tcurrencyDisplay,\n\t\t\tcurrency: currencyCode,\n\t\t\tmaximumFractionDigits: precision,\n\t\t\tminimumFractionDigits: precision,\n\t\t\tuseGrouping: useThousandSeparator,\n\t\t  } \n\t  }\n  \n  \n\t  const formatter = createNumberFormatter(locale, option);\n\t  let formattedValue = formatter.format(value);\n\n\t  if (useThousandSeparator && customSeparator) {\n\t\tformattedValue = replaceThousandSeparator(formattedValue, locale, option, customSeparator);\n\t  }\n\t  if (decimalSeparator !== '.') {\n\t\tformattedValue = replaceDecimalSeparator(formattedValue, locale, option, decimalSeparator);\n\t  }\n\t  \n\t  \n\t  if(currencySymbol){\n\t\tformattedValue = setSybmol(formattedValue,currencySymbol,symbolPosition) as string;\n\t  }else{\n\t\tformattedValue = formatString(locale, currencyCode, formattedValue,symbolPosition) as string\n\t  }\n\n\t  return formattedValue;\n\t}\n  }\n  \n  function isNullish(value: unknown): value is number {\n\treturn value === null || value === undefined;\n  }\n\n   export function setSybmol(formattedValue: string, currencySymbol :string,position:string){\n\t\n\tif(position === \"right\"){\n\t\treturn `${formattedValue} ${currencySymbol}`\n\t}else if(position === \"left\"){\n\t\tconst trimmed = formattedValue.trim();\n\t\tconst isNegative = trimmed.startsWith('-');\n\t\tconst core = isNegative ? trimmed.slice(1).trim() : trimmed;\n\t\t// Match Intl currency sign placement (e.g. en-IN INR: -₹1,74,317.00 not ₹ -1,74,317.00)\n\t\treturn isNegative ? `-${currencySymbol}${core}` : `${currencySymbol}${core}`;\n\t}else{\n\t\treturn formattedValue; // Return original if no position provided or invalid position provided.\n\t}\n  }\n\n  export function formatString(locale : string, currency : string, inputString:string, position?:string){\n\tif (!position) {\n\t\treturn inputString\n\t} \n\n\tconst parts = createNumberFormatter(locale, {\n\t\tstyle: 'currency',\n\t\tcurrency,\n\t\tcurrencyDisplay: 'symbol',\n\t\tminimumFractionDigits: 0,\n\t\tmaximumFractionDigits: 0,\n\t}).formatToParts(1);\n\n\tconst symbolPart = parts.find(p => p.type === 'currency');\n\tconst symbol = symbolPart ? symbolPart.value : '';\n\n\tconst numeric = inputString.replace(symbol, '').trim();\n\n\tif(position === \"right\") {\n\t\treturn `${numeric} ${symbol}`;\n\t} else if(position === \"left\") {\n\t\tif (numeric.startsWith('-')) {\n\t\t\treturn `-${symbol}${numeric.slice(1).trim()}`;\n\t\t}\n\t\treturn `${symbol}${numeric}`;\n\t} else {\n\t\treturn inputString;\n\t}\n\t\n}\n\n\nfunction replaceThousandSeparator(formattedValue: string,locale: string | undefined,options: Intl.NumberFormatOptions,customSeparator: string): string {\n\tconst parts = createNumberFormatter(locale, options).formatToParts(1234567);\n\tconst groupingPart = parts.find(part => part.type === 'group');\n\tconst localeSeparator = groupingPart ? groupingPart.value : ',';\n\treturn formattedValue.replace(new RegExp(escapeRegExp(localeSeparator), 'g'), customSeparator);\n}\n\nfunction replaceDecimalSeparator(formattedValue: string,locale: string | undefined,options: Intl.NumberFormatOptions,customSeparator: string): string {\n\tconst parts = createNumberFormatter(locale, options).formatToParts(1.5);\n\tconst decimalPart = parts.find(part => part.type === 'decimal');\n\tconst localeSeparator = decimalPart ? decimalPart.value : '.';\n\tconst lastIndex = formattedValue.lastIndexOf(localeSeparator);\n\tif (lastIndex === -1) {\n\t\treturn formattedValue;\n\t}\n\treturn formattedValue.substring(0, lastIndex) + customSeparator + formattedValue.substring(lastIndex + 1);\n}\n\nfunction escapeRegExp(string: string): string {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction normalizeLocale(locale?: string): string | undefined {\n\tif (!locale || locale.toLowerCase() === 'none') {\n\t\treturn undefined;\n\t}\n\treturn locale;\n}\n\nfunction createNumberFormatter(locale: string | undefined, options: Intl.NumberFormatOptions): Intl.NumberFormat {\n\tconst normalizedLocale = normalizeLocale(locale);\n\ttry {\n\t\treturn new Intl.NumberFormat(normalizedLocale, options);\n\t} catch {\n\t\treturn new Intl.NumberFormat(undefined, options);\n\t}\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\nimport { AutoWired, BEAN_NAME, Bean} from \"@dg/corecomponent\";\nimport { IFormatter } from \"./formatter.types\";\nimport { INumericAdjusterModel } from \"../core/model/number-adjuster.types\";\n\n@Bean('formatter')\nexport class NumberFormatter extends EventEmitter implements IFormatter {\n    @AutoWired(\"NumberAdjusterHandler\") protected adjusterHandler !: INumericAdjusterModel;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: any;\n\n    formatter():string {\n        const isEmpty = this.adjusterHandler.isEmty();\n        if (isEmpty) {\n            return \"\";\n        }\n        const value                = this.adjusterHandler.getValue()as number;\n        let precision            = this.optionsHandler.getDecimalPrecision();\n        const locale               = this.optionsHandler.getLocale();\n        const useThousandSeparator = this.optionsHandler.hasThousandsSeparator();\n        const customSeparator      = this.optionsHandler.getThousandSeparatorChar();\n        const decimalSeparator     = this.optionsHandler.getDecimalSeparator();\n\n        if (isNullish(value)) {\n            return \"\";\n        }\n        if (precision == null) {\n            precision = calculatePrecision(value);\n        }\n\n        const options: Intl.NumberFormatOptions = {\n            style: \"decimal\",\n            maximumFractionDigits: precision,\n            minimumFractionDigits: precision,\n            useGrouping:useThousandSeparator\n        };\n\n        const formatter = createNumberFormatter(locale, options);\n        let formattedValue = formatter.format(value);\n        if (useThousandSeparator && customSeparator) {\n            formattedValue = replaceThousandSeparator(formattedValue, locale, options, customSeparator);\n        }\n        if (decimalSeparator !== '.') {\n            formattedValue = replaceDecimalSeparator(formattedValue, locale, options, decimalSeparator);\n        }\n        \n        return formattedValue;\n    }\n}\n\nexport function isNullish(value: unknown): value is null | undefined {\n    return value === null || value === undefined;\n}\n\n\nexport function calculatePrecision(value: number): number {\n    const valueString = value.toString();\n    const decimalIndex = valueString.indexOf('.');\n    if (decimalIndex === -1) {\n        return 0; // No decimal places\n    }\n    return valueString.length - decimalIndex - 1; // Number of digits after the decimal point\n}\n\nfunction replaceThousandSeparator(formattedValue: string,locale: string | undefined,options: Intl.NumberFormatOptions,customSeparator: string): string {\n    const parts = createNumberFormatter(locale, options).formatToParts(1234567);\n    const groupingPart = parts.find(part => part.type === 'group');\n    const localeSeparator = groupingPart ? groupingPart.value : ',';\n    return formattedValue.replace(new RegExp(escapeRegExp(localeSeparator), 'g'), customSeparator);\n}\n\nfunction replaceDecimalSeparator(formattedValue: string,locale: string | undefined,options: Intl.NumberFormatOptions,customSeparator: string): string {\n    const parts = createNumberFormatter(locale, options).formatToParts(1.5);\n    const decimalPart = parts.find(part => part.type === 'decimal');\n    const localeSeparator = decimalPart ? decimalPart.value : '.';\n    const lastIndex = formattedValue.lastIndexOf(localeSeparator);\n    if (lastIndex === -1) {\n        return formattedValue;\n    }\n    \n    return formattedValue.substring(0, lastIndex) + customSeparator + formattedValue.substring(lastIndex + 1);\n}\n\nfunction escapeRegExp(string: string): string {\n    return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction normalizeLocale(locale?: string): string | undefined {\n    if (!locale || locale.toLowerCase() === 'none') {\n        return undefined;\n    }\n    return locale;\n}\n\nfunction createNumberFormatter(locale: string | undefined, options: Intl.NumberFormatOptions): Intl.NumberFormat {\n    const normalizedLocale = normalizeLocale(locale);\n    try {\n        return new Intl.NumberFormat(normalizedLocale, options);\n    } catch {\n        // Fallback to default locale when provided value is invalid\n        return new Intl.NumberFormat(undefined, options);\n    }\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { IFormatter } from \"./formatter.types\";\nimport { INumericAdjusterModel } from \"../core/model/number-adjuster.types\";\n\n@Bean('formatter')\nexport class PercentageFormatter extends EventEmitter implements IFormatter {\n    @AutoWired(\"NumberAdjusterHandler\") protected adjusterHandler !: INumericAdjusterModel;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: any;\n\n    formatter():string {\n        const isEmpty = this.adjusterHandler.isEmty();\n        if (isEmpty) {\n            return \"\";\n        }\n        \n        const value                = this.adjusterHandler.getValue();\n        const precision            = this.optionsHandler.getDecimalPrecision();\n        const locale               = this.optionsHandler.getLocale();\n        const useThousandSeparator = this.optionsHandler.hasThousandsSeparator();\n        const hideSymbol           = this.optionsHandler.isHideSymbol();\n        const customSeparator      = this.optionsHandler.getThousandSeparatorChar();\n        const decimalSeparator     = this.optionsHandler.getDecimalSeparator();\n        \n\n        if (isNullish(value)) {\n            return \"\";\n        }\n\n        const options: Intl.NumberFormatOptions = {\n            style: hideSymbol ?\"decimal\":\"percent\",\n            maximumFractionDigits: precision,\n            minimumFractionDigits: precision,\n            useGrouping: useThousandSeparator\n        };\n        \n\n        const formatter = createNumberFormatter(locale, options);\n        let formattedValue = formatter.format(value as number);\n        if (useThousandSeparator && customSeparator) {\n            formattedValue = replaceThousandSeparator(formattedValue, locale, options, customSeparator);\n        }\n        if (decimalSeparator !== '.') {\n            formattedValue = replaceDecimalSeparator(formattedValue, locale, options, decimalSeparator);\n        }\n        \n        return formattedValue;\n    }\n}\n\nfunction isNullish(value: unknown): value is null | undefined {\n    return value === null || value === undefined;\n}\n\nfunction replaceThousandSeparator(formattedValue: string,locale: string | undefined,options: Intl.NumberFormatOptions,customSeparator: string): string {\n    const parts = createNumberFormatter(locale, options).formatToParts(1234567);\n    const groupingPart = parts.find(part => part.type === 'group');\n    const localeSeparator = groupingPart ? groupingPart.value : ',';\n    return formattedValue.replace(new RegExp(escapeRegExp(localeSeparator), 'g'), customSeparator);\n}\n\nfunction replaceDecimalSeparator(formattedValue: string,locale: string | undefined,options: Intl.NumberFormatOptions,customSeparator: string): string {\n    const parts = createNumberFormatter(locale, options).formatToParts(1.5);\n    const decimalPart = parts.find(part => part.type === 'decimal');\n    const localeSeparator = decimalPart ? decimalPart.value : '.';\n    const lastIndex = formattedValue.lastIndexOf(localeSeparator);\n    if (lastIndex === -1) {\n        return formattedValue;\n    }\n    return formattedValue.substring(0, lastIndex) + customSeparator + formattedValue.substring(lastIndex + 1);\n}\n\nfunction escapeRegExp(string: string): string {\n    return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction normalizeLocale(locale?: string): string | undefined {\n    if (!locale || locale.toLowerCase() === 'none') {\n        return undefined;\n    }\n    return locale;\n}\n\nfunction createNumberFormatter(locale: string | undefined, options: Intl.NumberFormatOptions): Intl.NumberFormat {\n    const normalizedLocale = normalizeLocale(locale);\n    try {\n        return new Intl.NumberFormat(normalizedLocale, options);\n    } catch {\n        return new Intl.NumberFormat(undefined, options);\n    }\n}","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { values } from \"@dg/corecomponent\";\nimport { IModule } from \"../../../core/modules.types\";\ntype globalModuleMap = { [name: string]: IModule };\ntype instanceModulesMap = { [instanceID: string]: { [name: string]: IModule } };\n\nexport class ModuleRegistry {\n\n    private static globalModulesMap: globalModuleMap      = {};\n    private static instanceModulesMap: instanceModulesMap = {};\n\n    public static register(module: IModule): void {\n        ModuleRegistry.__register(module, undefined);\n    }\n\n    public static registerModules(modules: IModule[]): void {\n        ModuleRegistry.__registerModules(modules, undefined);\n    }\n\n    public static __registerModules(modules: IModule[], instanceID: string | undefined): void {\n        if (!modules) {\n            return;\n        }\n        modules.forEach(module => ModuleRegistry.__register(module, instanceID));\n    }\n\n    public static __unRegisterInstanceModules(instanceID: string): void {\n        delete ModuleRegistry.instanceModulesMap[instanceID];\n    }\n\n    public static __getRegisteredModules(instanceID: string): IModule[] {\n        return [...values(ModuleRegistry.globalModulesMap), ...values(ModuleRegistry.instanceModulesMap[instanceID] || {})];\n    }\n\n    public static __isRegistered(moduleName: string, instanceID: string): boolean {\n        return !!ModuleRegistry.globalModulesMap[moduleName] || !!ModuleRegistry.instanceModulesMap[instanceID]?.[moduleName];\n    }\n\n    public static __getInstanceRegisteredModules(instanceID: string): IModule[] {\n        return values(ModuleRegistry.instanceModulesMap[instanceID] ?? {}) || [];\n    }\n\n    public static __assertRegistered(moduleName: string, reason: string, instanceID: string): boolean {\n        if (this.__isRegistered(moduleName, instanceID)) {\n            return true;\n        }\n\n        console.error(reason);\n\n        return false;\n    }\n\n    public static __register(module: IModule, instanceID: string | undefined): void {\n        // ModuleRegistry.runVersionChecks(module);\n\n        if (instanceID !== undefined) {\n            if (ModuleRegistry.instanceModulesMap[instanceID] === undefined) {\n                ModuleRegistry.instanceModulesMap[instanceID] = {};\n            }\n            ModuleRegistry.instanceModulesMap[instanceID][module.moduleName] = module;\n        } else {\n            ModuleRegistry.globalModulesMap[module.moduleName] = module;\n        }\n    }\n\n    // private static runVersionChecks(_module: IModule) : void {\n    //     // if (!module.version) {\n    //     //     throw Error(`You are using incompatible versions of ${moduleName} modules. Major and minor versions should always match across modules. '${module.moduleName}' is incompatible. Please update all modules to the same version.`);\n    //     // } else if (!ModuleRegistry.isValidModuleVersion(module.version, dependencyVersion[module.moduleName])) {\n    //     //     throw Error(`You are using incompatible versions of ${moduleName} modules. Major and minor versions should always match across modules. '${module.moduleName}' is version ${module.version} but the other modules are version ${dependencyVersion[module.moduleName]}. Please update all modules to the same version.`);\n    //     // }\n    // }\n\n    // private static isValidModuleVersion(version : string, dependencyVersion : string) : boolean {\n    //     return isValidModuleVersion(version, dependencyVersion);\n    // }\n}\n\n","\nimport { BEAN_NAME, traverseObject } from \"@dg/corecomponent\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { ComponentMetadataProvider } from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport { UserComponentRegistry } from '@dg/corecomponent/UserComponentRegistry.js';\nimport { Context } from \"@dg/corecomponent/Context.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { NumberAPI } from \"./core/model/number-api\";\nimport { NumberOptionHandler } from \"./core/model/number-option-handler\";\nimport { NumberUserComponentHandler } from \"./core/model/number-user-component-handler\";\nimport { INumberConfiguration } from \"./number-configuration.types\";\nimport { NumberEventHandler } from \"./core/model/number-event-handler\";\nimport { IModule } from '../../core/modules.types';\nimport { NumericAdjusterModel } from \"./core/model/number-adjuster\";\nimport { ModuleRegistry } from \"./modules/ModuleRegistry\";\nimport { NumberKeyBoardShortCuts } from \"./core/model/number-keyboard-shortcuts\";\nimport { Label } from \"../../label/label-view\";\nimport { DescriptionComponent } from \"../../description/description-view\";\nimport { NumberStateManager } from \"./core/model/number-state-manager\";\nimport { NumberButtonComponent } from \"./core/number-button/number-button-view\";\nimport { ButtonRenderer } from \"./core/user-component/buttonRenderer\";\nimport { SpinButtonComponent } from \"./core/spin-button/spin-button-view\";\nimport { NumberInputComponent } from \"./core/number-input/number-input-view\";\nimport { NumberControllerHandler } from \"./core/model/number-controller\";\nimport { PropertyName } from \"../../button/src/model/button-user-component-handler\";\nimport { SuffixComponent } from \"../../Suffix/suffix-view\";\nimport { PrefixComponent } from \"../../Prefix/prefix-view\";\nimport { RenderingNumberInputComponent } from \"./core/rendering-number-input/rendering-number-input-view\";\nimport { StartAdonrmentComponent } from \"../../addOnBefore/start-adornment-view\";\nimport { EndAdonrmentComponent } from \"../../addOnAfter/end-adornment-view\";\nimport { NumberTooltipHandler } from \"./core/model/number-tooltip-handler\";\nimport { ErrorComponent } from \"../../error/error-view\";\n\nexport interface IUserParams {\n\tglobalEventListener      ?: Function;\n\tframeworkOverrides       ?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n\tmodules                  ?: IModule[];\n}\n\n\nlet nextInstanceId = 1;\n\n\nexport class NumberCoreComponent {\n\tinitializeNumber( configuration: INumberConfiguration, params: IUserParams = {}, createUI: CallableFunction, ): void {\n\t\t\n\t\tconst instanceID = configuration.instanceID ?? String(nextInstanceId++);\n\n\t\tconst registeredModules = this.getRegisteredModules(params, instanceID);\n\n\t\tconst beanClasses = this.CreateBeanClasses(registeredModules, configuration);\n\n\t\tconst context = new Context();\n\n\t\tconst userConfigurations = this.createuserConfiguration(\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t\tinstanceID\n\t\t);\n\n        // Model classes\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n        // Default component registry\n\t\tthis.registerCoreComponent(context);\n        // Default user compoent registry\n\t\tthis.registerDefaultUserComponent(context);\n        // Optional Dependency Module\n\t\tthis.registerModuleUserComponents(context, registeredModules);\n        // \n\t\tthis.registerStackComponents(context, registeredModules);\n\n\t\tcreateUI(context);\n\n\t\t(window as any).context = context;\n\t}\n\n\tprivate CreateBeanClasses(registeredModules : IModule[], _configuration : INumberConfiguration): Set<any> {\n\t\t// const formattedNumberModules = this.extractModuleEntity(registeredModules, (module : IModule) => module.modelType != configuration.format)\n\t\tlet beanList = [\n\t\t\t//default framework\n\t\t\tComponentsRegistry, // component registry\n\t\t\tUserComponentRegistry, // user component registry\n\t\t\tEventHandler, // pub sub model\n\t\t\tNumberOptionHandler, //configuation\n\t\t\tComponentMetadataProvider, // framework component metadata provider\n\t\t\tNumberUserComponentHandler, // framework custom rendering\n\n\t\t\t//number component model layer\n\t\t\tNumberAPI, //api part\n\t\t\tNumberEventHandler, // callback for custom layout\n\t\t\tNumberKeyBoardShortCuts, //\n\t\t\tNumberStateManager, // helper, label\n\n\t\t\tNumericAdjusterModel, // data part\n\t\t\tNumberControllerHandler,\n\t\t\tNumberTooltipHandler\n\t\t];\n\n \t\tconst moduleBeans = this.extractModuleEntity(registeredModules, (module : IModule) => module.beans ? module.beans : []);\n        beanList.push(...moduleBeans);\n\n\t\t// if(formattedNumberModules) {\n\t\t// \tbeanList.push(...formattedNumberModules);\n\t\t// }\n\n\t\treturn new Set(beanList);\n\t}\n\tprivate createuserConfiguration( configuration: any, params: IUserParams, instanceID : string): { configuration: any; frameWorkOverrides: IFrameworkOverrides | null; globalEventListener: Function | null; frameworkComponentWrapper: any | null; instanceID : string; } {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n\n\tprivate registerDefaultUserComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n            [PropertyName.BUTTON_RENDERER] : ButtonRenderer\n        };\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n\n\tprivate registerModuleUserComponents(context: Context, registeredModules: IModule[]): void {\n        const moduleUserComps: { componentName: string, componentClass: any; }[] = this.extractModuleEntity(registeredModules, (module : IModule) => module.userComponents ? module.userComponents : []);\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY);\n        moduleUserComps.forEach(compMeta => {\n            userComponentRegistry.registerDefaultComponent(compMeta.componentName, compMeta.componentClass);\n        });\n    }\n\n\tprivate registerStackComponents(context: Context, registeredModules: IModule[]): void {\n        const Components = this.createComponentsList(registeredModules);\n\t\tconst componentRegistry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY);\n        componentRegistry.setupComponents(Components);\n    }\n\n\tprivate extractModuleEntity(moduleEntities: any[], extractor: (module: any) => any) {\n        return [].concat(...moduleEntities.map(extractor));\n    }\n\n\tprivate createComponentsList(registeredModules: IModule[]): any[] {\n\t\tlet components: ComponentMeta[] = []\n\n        const moduleComps = this.extractModuleEntity(registeredModules, (module : IModule) => module.components ? module.components : []);\n\n        components = components.concat(moduleComps);\n\n        return components;\n\t}\n\n\tprivate getRegisteredModules( params: IUserParams | undefined, instanceID: string, ): IModule[] {\n\t\tconst passedViaConstructor: IModule[] | undefined | null = params ? params.modules : null;\n\t\tconst registered = ModuleRegistry.__getRegisteredModules(instanceID);\n\n\t\tconst allModules: IModule[] = [];\n\t\tconst mapNames: { [name: string]: boolean } = {};\n\n\t\tconst addModule = (mod: IModule, instanceID: string | undefined) => {\n\t\t\tconst addIndividualModule = (currentModule: IModule) => {\n\t\t\t\tif (!mapNames[currentModule.moduleName]) {\n\t\t\t\t\tmapNames[currentModule.moduleName] = true;\n\t\t\t\t\tallModules.push(currentModule);\n\t\t\t\t\tModuleRegistry.__register(currentModule, instanceID);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\taddIndividualModule(mod);\n\t\t\tif (mod.dependantModules) {\n\t\t\t\tmod.dependantModules.forEach((m) => addModule(m, instanceID));\n\t\t\t}\n\t\t};\n\n\t\tif (passedViaConstructor) {\n\t\t\tpassedViaConstructor.forEach((m) => addModule(m, instanceID));\n\t\t}\n\n\t\tif (registered) {\n\t\t\tregistered.forEach((module) =>\n\t\t\t\taddModule( module, undefined),\n\t\t\t);\n\t\t}\n\n\t\treturn allModules;\n\t}\n\n\tprivate registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nexport function createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n        {\n\t\t\tcomponentName: 'number-label',\n\t\t\tcomponentClass: Label\n\t\t},\n\t\t{\n            componentName: 'number-helper-text',\n\t\t\tcomponentClass: DescriptionComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'number-increment',\n\t\t\tcomponentClass: NumberButtonComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'number-decrement',\n\t\t\tcomponentClass: NumberButtonComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'number-spin-button',\n\t\t\tcomponentClass: SpinButtonComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'number-input',\n\t\t\tcomponentClass: NumberInputComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'number-prefix',\n\t\t\tcomponentClass: PrefixComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'input-prefix',\n\t\t\tcomponentClass: StartAdonrmentComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'input-suffix',\n\t\t\tcomponentClass: EndAdonrmentComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'number-suffix',\n\t\t\tcomponentClass: SuffixComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName :\"number-rendering-element\",\n\t\t\tcomponentClass :RenderingNumberInputComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName : \"number-error\",\n\t\t\tcomponentClass : ErrorComponent\n\t\t}\n\t\t\n    ];\n\n\treturn components;\n}\n\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { INumberAPI } from \"./core/model/number-api.types\";\nimport { NUMBER_BEAN_NAME } from \"./constants/beanname-constants\";\nimport { IUserParams, NumberCoreComponent } from \"./number-core-component\";\nimport { INumberConfiguration } from \"./number-configuration.types\";\nimport { NumberRootComponent } from \"./core/number-root/number-root-view\";\nimport { RenderingNumberRootComponent } from \"./core/rendering-number-root/rendering-number-root-view\";\nimport { isNullish } from \"./formatter/NumberFormatter\";\nimport { calculatePrecision } from \"./formatter/NumberFormatter\";\nimport { formatString } from \"./formatter/CurrencyFormatter\";\n\n\n\nfunction setSybmol(formattedValue: string, currencySymbol: string) {\n\tconst trimmed = formattedValue.trim();\n\tconst isNegative = trimmed.startsWith('-');\n\tconst core = isNegative ? trimmed.slice(1).trim() : trimmed;\n\treturn isNegative ? `-${currencySymbol}${core}` : `${currencySymbol}${core}`;\n}\n\nexport class NumberComponent {\n\n\t\n\n\tpublic api: INumberAPI | undefined;\n\tconstructor(configuration: INumberConfiguration, params?: IUserParams) {\n\t\tconst createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(NUMBER_BEAN_NAME.NUMBER_API) as INumberAPI;\n            context.createBean(new NumberRootComponent(configuration.appendTo));\n\t\t};\n\t\tnew NumberCoreComponent().initializeNumber(configuration, params, createUI);\n\t}\n}\n\nexport class RenderingNumberComponent {\n\n\tpublic static formatNumber(value: number, precision: number, useThousandSeparator: boolean, locale: string):string {\n        if (isNullish(value)) {\n            return \"\";\n        }\n        if (precision === undefined) {\n            precision = calculatePrecision(value);\n        }\n\n\t\tconst options: Intl.NumberFormatOptions = {\n\t\t\tstyle: \"decimal\",\n\t\t\tmaximumFractionDigits: precision,\n\t\t\tminimumFractionDigits: precision,\n\t\t\tuseGrouping:useThousandSeparator\n\t\t};\n\n\t\tconst formatter = createNumberFormatter(locale, options);\n\t\treturn formatter.format(value);\n\t}\n\n\tpublic static formatPercentage(value: number, precision: number, useThousandSeparator: boolean, hideSymbol: boolean, locale: string):string {\n\n        if (isNullish(value)) {\n            return \"\";\n        }\n\n\t\tconst options: Intl.NumberFormatOptions = {\n\t\t\tstyle: hideSymbol ?\"decimal\":\"percent\",\n\t\t\tmaximumFractionDigits: precision,\n\t\t\tminimumFractionDigits: precision,\n\t\t\tuseGrouping: useThousandSeparator\n\t\t};\n\n\t\tconst formatter = createNumberFormatter(locale, options);\n\t\treturn formatter.format(value as number);\n\t}\n\n\tpublic static formatCurrency(value: number, precision: number, useThousandSeparator: boolean, hideSymbol: boolean, symbolPosition: string, currencySymbol: string, locale: string): string {\n\t\tif (isNullish(value)) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tconst currencyCode    = \"INR\";\n\t\tconst currencyDisplay = \"symbol\";\n\n\t\tlet option : Intl.NumberFormatOptions ;\n\n\t\tif(hideSymbol){\n\t\t\toption = {\n\t\t\t\tstyle: \"decimal\",\n\t\t\t\tmaximumFractionDigits: precision,\n\t\t\t\tminimumFractionDigits: precision,\n\t\t\t\tuseGrouping:useThousandSeparator\n\t\t\t};\n\n\t\t} else{\n\t\t\toption  = { \n\t\t\t\tstyle: hideSymbol ? 'decimal':'currency',\n\t\t\t\tcurrencyDisplay,\n\t\t\t\tcurrency: currencyCode,\n\t\t\t\tmaximumFractionDigits: precision,\n\t\t\t\tminimumFractionDigits: precision,\n\t\t\t\tuseGrouping: useThousandSeparator,\n\t\t\t} \n\t\t}\n\n\n\t\tconst formatter = createNumberFormatter(locale, option);\n\t\tlet formattedValue = formatter.format(value);\n\t\tif(currencySymbol){\n\t\t\tif(symbolPosition == \"left\"){\n\t\t\t\tformattedValue = setSybmol(formattedValue,currencySymbol) as string;\n\t\t\t}\n\t\t}else{\n\t\t\tformattedValue = formatString(locale, currencyCode, formattedValue,symbolPosition) as string\n\t\t}\n\n\t\treturn formattedValue;\n\t}\n\t\n\tpublic api: INumberAPI | undefined;\n\tconstructor(configuration: INumberConfiguration, params?: IUserParams) {\n\t\tconst createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(NUMBER_BEAN_NAME.NUMBER_API) as INumberAPI;\n            context.createBean(new RenderingNumberRootComponent(configuration.appendTo));\n\t\t};\n\t\tnew NumberCoreComponent().initializeNumber(configuration, params, createUI);\n\t}\n}\n\nfunction normalizeLocale(locale?: string): string | undefined {\n\tif (!locale || locale.toLowerCase() === \"none\") {\n\t\treturn undefined;\n\t}\n\treturn locale;\n}\n\nfunction createNumberFormatter(locale: string | undefined, options: Intl.NumberFormatOptions): Intl.NumberFormat {\n\tconst normalizedLocale = normalizeLocale(locale);\n\ttry {\n\t\treturn new Intl.NumberFormat(normalizedLocale, options);\n\t} catch {\n\t\treturn new Intl.NumberFormat(undefined, options);\n\t}\n}","export const RATING_BEAN_NAME = {\n\tRATING_API               : 'ratingapi',\n\tRATING_MODEl             : \"ratingModel\",\n\tRATING_CONFIGURATION     : 'configuration',\n\tCSSCLASSNAMEGENERATOR    : 'CSSClassNameGenartor',\n\tRATING_ADJUSTER_HANDLER  : 'ratingAdjusterHandler',\n\tKEYBOARD_SHORTCUT_HANDLER: 'KeyBoardShortCutsHandler',\n\tRATING_EVENT_HANDLER     : 'ratingEventHandler',\n\tRATING_CONTROLLER_HANDLER: 'ratingControllerHandler',\n};","export const RATING_EVENTS = {\n    KEYDOWN         : 'keydown',\n    FOCUS           : 'focus',\n    BLUR            : 'blur',\n    MOUSEDOWN       : 'mousedown',\n    CLICK           : 'click',\n    ON_CHANGE       : 'onchange',\n    HOVER           : 'hover',\n    ON_BEFORE_CHANGE: 'onbeforchange',\n    ON_AFTER_CHANGE : 'onafterchange',\n    ON_FOCUS        : 'onfocus',\n    ON_BLUR         : 'onblur',\n    ON_MOUSE_LEAVE  : 'onmouseleave',\n    ON_MOUSE_ENTER  : 'onmouseenter',\n    REFRESH         : 'refresh',\n}","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport {EventEmitter}from '@dg/corecomponent/EventEmitter.js';\nimport { RATING_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { IRatingConfiguration } from \"../../rating-configuration.types\";\nimport { RatingControllerHandler } from \"./rating-controller\";\nimport { RatingModelType } from \"./rating-model.types\";\nimport { IRatingOptionHandler } from \"./rating-option-handler.types\";\n\n\n@Bean(RATING_BEAN_NAME.RATING_API)\nexport class RatingAPI extends EventEmitter {\n    @AutoWired('configuration') configuration !: IRatingConfiguration;\n    @AutoWired(RATING_BEAN_NAME.RATING_CONTROLLER_HANDLER) controllerHandler !: RatingControllerHandler;\n    @AutoWired(RATING_BEAN_NAME.RATING_MODEl) model !: RatingModelType;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler !: IRatingOptionHandler;\n\n    \n\n\n    getName() { return RATING_BEAN_NAME.RATING_API};\n\n    updateProperty(options : IRatingConfiguration) {\n        const properties = Object.keys(this.configuration);\n\n        properties.forEach((_key) => {\n            // this.configuration[key] = options[key] ?? properties[key];\n        })\n        \n        this.dispatchEvent({\n            type : \"PROPERTY_CHANGED\",\n            options\n        })\n    }\n\n    getElement() : HTMLElement {\n        return this.controllerHandler.getRatingCtrl().getElement() as HTMLElement;\n    }\n\n    getValue():number{\n        return this.model.getValue();\n    }\n\n    setValue(value:number):void{\n        return this.model.setValue(value);\n    }\n\n\n    focus():void{\n        this.controllerHandler.getRatingCtrl().focus();\n    }\n\n    blur():void{\n        this.controllerHandler.getRatingCtrl().blur();\n    }\n\n    getFormattedValue() : any {\n        return this.getValue();\n    }\n\n    showErrorMessage(message ?: string): void {\n        message && this.optionHandler.updateValidationMessage(message);\n        this.optionHandler.updateStatus('error');\n    }\n\n    hideErrorMessage(): void {\n        this.optionHandler.updateValidationMessage(\"\");\n        this.optionHandler.updateStatus(\"none\");\n    }\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Bean } from \"@dg/corecomponent\";\nimport {RATING_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { RatingRootControllerType } from \"../rating-root/rating-root.types\";\n\n\n@Bean(RATING_BEAN_NAME.RATING_CONTROLLER_HANDLER)\nexport class RatingControllerHandler extends EventEmitter {\n\tprivate ratingCtrl!: RatingRootControllerType;\n\tregisterNumber(ratingCtrl: RatingRootControllerType): void {\n\t\tthis.ratingCtrl = ratingCtrl;\n\t}\n\n\tgetRatingCtrl(): RatingRootControllerType {\n\t\treturn this.ratingCtrl;\n\t}\n}","import { AutoWired, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { RATING_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { RatingEventHandlerType } from \"./rating-event-handler.types\";\nimport { RATING_EVENTS } from \"../../constants/event-name\";\nimport { RatingModelType } from \"./rating-model.types\";\n\n\n\n\n@Bean(RATING_BEAN_NAME.RATING_EVENT_HANDLER)\nexport class RaitngEventHandler extends EventEmitter implements RatingEventHandlerType{\n    @AutoWired(RATING_BEAN_NAME.RATING_MODEl) ratingModel !   : RatingModelType;\n\n    @PostConstruct()\n    init(){\n        this.addListener(this.eventHandler,RATING_EVENTS.ON_CHANGE, this.onChange.bind(this)); \n        this.addListener(this.eventHandler,RATING_EVENTS.ON_BEFORE_CHANGE, this.onBeforeChange.bind(this));  \n    }\n\n    onFocus(event: FocusEvent): void {\n        this.optionsHandler.onFocus(event);\n    }\n    onBlur(event: FocusEvent): void {\n        this.optionsHandler.onBlur(event);\n    }\n    onKeydown(event: KeyboardEvent): void {\n        this.optionsHandler.onKeydown(event);\n    }\n\n    onClick(event: MouseEvent): void {\n        this.optionsHandler.onClick(event);\n    }\n\n    onMouseLeave(event: MouseEvent): void {\n        this.optionsHandler.onLeave(event); \n    }\n\n    onMouseEnter(event: MouseEvent): void {\n        this.optionsHandler.onHover(event);  \n    }\n\n    onMouseOver(event: MouseEvent): void {\n        this.optionsHandler.onHover(event);\n    }\n\n    onChange(){\n        const value = this.ratingModel.getValue();\n        this.optionsHandler.onChange(value);\n    }\n\n    onBeforeChange() : void {\n        const value = this.ratingModel.getValue();  // get the current value before change\n        this.optionsHandler.onBeforeChange(value);\n    }\n\n\n} ","import { Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { RATING_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { RatingModelType } from \"./rating-model.types\";\nimport { RATING_EVENTS } from \"../../constants/event-name\";\n\n@Bean(RATING_BEAN_NAME.RATING_MODEl)\nclass RatingModel extends EventEmitter implements RatingModelType {\n  private value!: number; // Holds the current rating value\n  private maxValue!: number; // Maximum allowed rating (e.g., 5 stars)\n  private counter!: number;\n  private hoverValue!: number;\n\n  @PostConstruct()\n  init() {\n    this.value = this.hoverValue = this.optionsHandler.getValue();\n    this.maxValue = this.optionsHandler.getMaxValue();\n    this.counter = 1;\n  }\n\n  // Get the current rating value\n  getValue(): number {\n    return this.value;\n  }\n\n  // Set a new rating value (with validation and change detection)\n  setValue(newValue: number): void {\n    if (newValue >= 0 && newValue <= this.maxValue) {\n      if (this.value !== newValue) { // Check if the value has changed\n\n        this.dispatchEvent({\n          type: RATING_EVENTS.ON_BEFORE_CHANGE, // Dispatch the ONCHANGE event\n        });\n\n        this.value = newValue;\n\n        this.dispatchEvent({\n          type: RATING_EVENTS.ON_CHANGE, // Dispatch the ONCHANGE event\n        });\n      }else{\n        this.dispatchEvent({\n          type: RATING_EVENTS.ON_BEFORE_CHANGE, // Dispatch the ONCHANGE event\n        });\n\n        this.value = 0;\n\n        this.dispatchEvent({\n          type: RATING_EVENTS.ON_CHANGE, // Dispatch the ONCHANGE event\n        });\n\n      }\n      this.dispatchEvent({\n        type: RATING_EVENTS.REFRESH, // Existing refresh event\n      });\n    } else {\n      return; // Do nothing if the value is out of range\n    }\n  }\n\n  // Update the rating value by a delta (increment or decrement)\n  updateValue(delta: number): void {\n    const updatedValue = this.value + delta;\n    this.setValue(updatedValue); // Reuse validation logic from setValue\n  }\n\n  setCounter(value?: number): void {\n    if (value) {\n      this.counter = value;\n    } else {\n      this.counter = this.counter + 1;\n    }\n  }\n\n  resetCounter(): void {\n    this.counter = 1;\n  }\n\n  isChecked(): boolean {\n    return this.counter <= this.value;\n  }\n\n  getCounterValue(): number {\n    return this.counter;\n  }\n\n  isHoverable(): boolean {\n    return this.counter <= this.hoverValue;\n  }\n\n  setHoverValue(value: number): void {\n    this.hoverValue = value;\n  }\n\n  // New API to check if a number is within the range of value and maxValue\n  isInRange(num: number): boolean {\n    return  num <= this.maxValue;\n  }\n}\n\nexport { RatingModel };\n","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\n\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IRatingOptionHandler } from \"./rating-option-handler.types\";\nimport { IRatingAPI } from \"./rating-api.types\";\nimport { RATING_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { IRatingConfiguration, IRenderer } from \"../../rating-configuration.types\";\nimport { ICustomRenderer } from \"../../../../utility/custom-render.types\";\nimport { ClipboardConfig } from \"../../../../utility/clipboard\";\n\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class RatingOptionHandler extends EventEmitter implements  IRatingOptionHandler{\n\t\n\t\n\t@AutoWired(RATING_BEAN_NAME.RATING_API) api!: IRatingAPI;\n\n\t@AutoWired(RATING_BEAN_NAME.RATING_CONFIGURATION) configuration!: IRatingConfiguration;\n\n\tgetValue():number{\n\t\treturn this.configuration.value ?? 0;\n\t}\n\n\tgetMaxValue():number{\n\t\treturn this.configuration.maxValue ?? 5;\n\t}\n\n\tisDisabled():boolean{\n\t\treturn this.configuration.disabled?? false;\n\t}\n\n\tgetLabel():string|undefined{\n\t\treturn this.configuration.label\n\t}\n\tisRequired():boolean {\n\t\treturn this.configuration.required ?? false;\n\t}\n\n\tgetAriaLabelledby():string|undefined{\n\t\treturn \"\"\n\t}\n\n\tgetIconRenderer():ICustomRenderer |undefined{\n\t\treturn this.configuration.iconRenderer;\n\t}\n\tgetIconRendererParams():any{\n\t\treturn this.configuration.iconRendererParams;\n\t}\n\n\tisReadOnly():boolean{\n        return this.configuration.readonly?? false;\n    }\n\t\n\tonChange(value:number): void {\n\t\tthis.configuration.onChange && this.configuration.onChange(value);\n\t}\n\tonBeforeChange(value: number): void {\n\t\tthis.configuration.onBeforeChange && this.configuration.onBeforeChange(value);\n\t}\n\tonHover(value: number): void {\n\t\tthis.configuration.onHover && this.configuration.onHover(value);\n\t}\n\tonLeave(value: number): void {\n\t\tthis.configuration.onLeave && this.configuration.onLeave(value);\n\t}\n\tonFocus(event: FocusEvent): void {\n\t\tthis.configuration.onFocus && this.configuration.onFocus(event);\n\t}\n\tonBlur(event: FocusEvent): void {\n\t\tthis.configuration.onBlur && this.configuration.onBlur(event);\n\t}\n\tonKeydown(event: KeyboardEvent): void {\n\t\tthis.configuration.onKeydown && this.configuration.onKeydown(event);\n\t}\n\tonClick(event: MouseEvent): void {\n\t\tthis.configuration.onClick && this.configuration.onClick(event);\n\t}\n\n\tshouldIgnoreEmptyDOM(): boolean {\n\t\treturn this.configuration.ignoreEmptyDOM ?? false;\n\t}\n\n\tgetDescription(): string | undefined {\n\t\treturn this.configuration.description ?? undefined;\n\n\t}\n\n\tgetDescriptionRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.descriptionRenderer;\n    }\n\n    getDescriptionRendererParams(): object | undefined {\n        return this.configuration.descriptionRendererParams;\n    }\n\n    getValidationMessageRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.validationMessageRenderer;\n    }\n\n    getValidationMessageRendererParams(): object | undefined {\n        return this.configuration.validationMessageRendererParams;\n    }\n\n\tgetAriaDescribedby(): string {\n\t\treturn '';\n\t}\n\n\tshowErrorState(): boolean {\n\t\treturn this.configuration.showErrorState ?? false;\n\t}\n\n\tisValid(): boolean {\n\t\treturn this.configuration.status === 'error';\n\t}\n\n\tupdateStatus(status : 'error' | \"none\") : void {\n\t\tthis.configuration.status = status;\n\t\tthis.dispatchEvent({\n\t\t\ttype: \"EVENT_VALUE_UPDATE\",\n\t\t\tforce : true\n\t\t})\n\t}\n\n\tupdateValidationMessage(message : string) : void {\n\t\tthis.configuration.validationMessage = message;\n\t}\n\n\n    getValidationMessage(): string {\n        return this.configuration.validationMessage ?? '';\n    }\n\n\tgetLabelRenderer() {\n        return this.configuration.labelRenderer;\n    }\n\n    getLabelRendererParams() {\n        return this.configuration.labelRendererParams ?? {};\n    }\n\n\tgetClipboard(): ClipboardConfig {\n\t\treturn this.configuration.clipboard;\n\t}\n\n}","import {  Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { IRatingOptionHandler } from \"./rating-option-handler.types\";\n\n@Bean('stateManager')\nexport class RatingStateManager extends EventEmitter {\n    isInValid() : boolean {\n        return (this.optionsHandler as IRatingOptionHandler).isValid();\n    }\n}","\nimport { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName, } from '@dg/corecomponent';\nimport {ComponentMetadata} from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport {UserComponentHandler} from '@dg/corecomponent/UserComponentHandler.js';\nimport {UserComponentRegistry} from '@dg/corecomponent/UserComponentRegistry.js';\nimport {IRatingUserComponentHandler } from './rating-user-component-handler.types';\nimport { IComponentDetails } from '../../../../utility/component-detail.types';\nimport { ILabelUserComponentHandler } from '../../../../label/label.types';\n\nexport const enum PropertyName  {\n\tDESCRIPTION_RENDERER = 'descriptionRenderer',\n\tICON_RENDERER = 'iconRenderer',\n\tERROR_RENDERER = 'errorRenderer',\n\tLABEL_RENDERER = 'labelRenderer'\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class RatingUserComponentHandler extends UserComponentHandler implements IRatingUserComponentHandler , ILabelUserComponentHandler{\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\tgetLabelRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails(item, PropertyName.LABEL_RENDERER, params, PropertyName.LABEL_RENDERER);\n\t}\n\n\tgetDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.DESCRIPTION_RENDERER, params, PropertyName.DESCRIPTION_RENDERER);\n\t}\n\n\tgetErrorRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.ERROR_RENDERER, params, PropertyName.ERROR_RENDERER);\n\t}\n\n\tgetIconRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.ICON_RENDERER, params, PropertyName.ICON_RENDERER);\n\n\t}\n\n\n\n\t\n\tprotected getComponentDetail( item: any, propertyName: string, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: string; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta( item: any, propertyName: string, _params?: any, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: string, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.ICON_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.DESCRIPTION_RENDERER:\n\t\t\tcase PropertyName.ERROR_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: string, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : string, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(item : any, propertyName : string, params : any) : any {\n        switch(propertyName) {\n            case PropertyName.ICON_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n                return this.getUserRendererParams(item, params);\n            default:\n                return {};\n        }\n\n    }\n\n    private getUserRendererParams(item : any, params : any) : any {\n        const rendererParams = item.getUserRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { RatingContainerComponentType, RatingContainerControllerType } from \"./rating-container.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getRadioUtilityClass } from \"../rating-utils/rating-classes\";\n\nconst useUtilityClassesContainer = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'container',\n\t\t\tmodifiers: [\n\t\t\t\t\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getRadioUtilityClass);\n};\n\n\n\n\nexport class RatingContainerController extends EventEmitter implements RatingContainerControllerType {\n    private component !: RatingContainerComponentType\n    setComponent(component:RatingContainerComponentType){\n        this.component = component;\n        this.applyClassNames();\n    }\n\n    private applyClassNames(){\n        const radioClasses = useUtilityClassesContainer();\n\t\tthis.component.getElement().classList.add(radioClasses.root)\n\t\tthis.component.getElement().classList.add(\"dg-field__container\")\n\t\t// this.component.getElement().classList.add(\"dg-field__input-wrapper\")\n\n       \n\n    }\n\n\n    getProperty(){\n        return{\n            maxValue : this.optionsHandler.getMaxValue(),\n            value : this.optionsHandler.getValue()\n        }\n    }\n\n\n\n\n}","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { RatingContainerComponentType } from \"./rating-container.types\";\nimport { RatingContainerController } from \"./rating-container-contoller\";\n\nconst RatingContainerTemplate = (property : any)=>{\n    const container = document.createElement(\"div\");\n\n    const {maxValue, value} = property;\n\n    for (let index = 1; index <= maxValue; index++) {\n        const div = document.createElement(\"rating-input-wrapper\"); \n        if(index <= value){\n            div.setAttribute(\"value\", value);\n        }\n        container.appendChild(div);\n    }\n\n    \n    return container\n}\n\nexport class RatingContainerComponent extends Component {\n\n    @PostConstruct()\n    init() {\n        const comp : RatingContainerComponentType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        const controller = this.createBean(new RatingContainerController());\n        const property = controller.getProperty()\n        this.setTemplate(RatingContainerTemplate(property))\n        controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { RatingInputWrapperComponentType } from \"./rating-input-wrapper.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getRadioUtilityClass } from \"../rating-utils/rating-classes\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { RATING_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { RatingModelType } from \"../model/rating-model.types\";\nimport { RATING_EVENTS } from \"../../constants/event-name\";\nimport { RatingEventHandlerType } from \"../model/rating-event-handler.types\";\nimport { IRatingOptionHandler } from \"../model/rating-option-handler.types\";\n\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'input-wrapper',\n\t\t\tmodifiers: [\n\t\t\t\t\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getRadioUtilityClass);\n};\n\n\n\n\nexport class RatingInputWrapperController extends EventEmitter {\n    private component !: RatingInputWrapperComponentType;\n    private element!: HTMLElement;\n    private value!:number;\n    @AutoWired(RATING_BEAN_NAME.RATING_MODEl) model !: RatingModelType;\n\t@AutoWired(RATING_BEAN_NAME.RATING_EVENT_HANDLER) ratingEventHandler !   : RatingEventHandlerType;\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) optionHandler !   : IRatingOptionHandler;\n\n    \n    setComponent(component : RatingInputWrapperComponentType){\n        this.component = component;\n        this.element = this.component.getGui();\n        this.value = this.model.getCounterValue();\n        this.applyClassNames();\n        this.addEvents();\n    }\n\n\n    private applyClassNames(){\n        const radioClasses = useUtilityClasses();\n\t\tthis.element.classList.add(radioClasses.root);\n\n        this.model.isChecked() && this.element.classList.add(\"dg-rating__input-checked\");\n        this.model.isHoverable() && this.element.classList.add(\"dg-rating__input-hover\");\n        this.model.setCounter();\n\n    }\n\n    private refresh() : void {\n        this.removeClassNames();\n        this.removeHoverClassNames();\n        this.applyClassNames();\n    }\n\n    private removeClassNames(){\n        this.element.classList.remove(\"dg-rating__input-checked\");\n    }\n\n    private removeHoverClassNames(){\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        this.element.classList.remove(\"dg-rating__input-hover\");\n    }\n\n    private addEvents(){\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        this.addListener(this.element,\"mousedown\",this.handleClick.bind(this));\n        this.addListener(this.element,\"mouseenter\",this.handleMove.bind(this));\n        // this.addListener(this.element,\"mouseleave\",this.handleMove.bind(this));\n        this.addListener(this.eventHandler, RATING_EVENTS.REFRESH, this.refresh.bind(this)); \n        this.addListener(this.eventHandler, 'ONMOUSELEAVE', this.removeHoverClassNames.bind(this)); \n        this.element.addEventListener(\"mouseleave\",()=>{\n            const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n            this.dispatchEvent({\n                type: 'ONMOUSELEAVE',\n            });\n            this.model.resetCounter();\n            this.model.setHoverValue(0);\n\n        })  \n\n    }\n\n    \n\n    private handleClick(event : MouseEvent){\n        if(this.isRightClickByEvent(event)) {\n            return;\n        }\n        const readonly  = this.optionHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        this.model.setValue(this.value)\n        this.ratingEventHandler.onClick(event);\n        this.model.resetCounter();\n        this.dispatchEvent({\n\t\t\ttype: RATING_EVENTS.REFRESH,\n\t\t});\n\n    }\n\n    private isRightClickByEvent(event : MouseEvent) : boolean {\n\t\tif(event.button === 2) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n    private handleMove(){\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        this.model.setHoverValue(this.value);\n        this.model.resetCounter();\n        this.dispatchEvent({\n\t\t\ttype: RATING_EVENTS.REFRESH,\n\t\t});\n\n    }\n\n\n\n    getProperty(){\n\n    }\n}","\n\n\nimport { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { RatingInputWrapperComponentType } from \"./rating-input-wrapper.types\";\nimport { RatingInputWrapperController } from \"./rating-input-wrapper-controller\";\n\n\nconst RatingInputWrapperComponentTemplate = (_property : any)=>{\n    const labelContainer = document.createElement(\"label\");\n    const radioInput = document.createElement(\"rating-input\");\n    const ratingSVG = document.createElement(\"rating-svg\");\n    labelContainer.appendChild(radioInput);\n    labelContainer.appendChild(ratingSVG);\n    return labelContainer\n}\n\nexport class RatingInputWrapperComponent extends Component {\n\n    @PostConstruct()\n    init() {\n        const comp : RatingInputWrapperComponentType = {\n            getGui : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        const controller = this.createBean(new RatingInputWrapperController());\n        const property = controller.getProperty()\n        this.setTemplate(RatingInputWrapperComponentTemplate(property))\n        controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n}\n","\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { RatingInputComponentType } from \"./rating-input.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getRadioUtilityClass } from \"../rating-utils/rating-classes\";\n\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'input',\n\t\t\tmodifiers: [\n\t\t\t\t\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getRadioUtilityClass);\n};\n\n\n\n\nexport class RatingInputController extends EventEmitter {\n    private component !: RatingInputComponentType\n    \n    setComponent(component : RatingInputComponentType){\n        this.component = component;\n        this.applyClassNames();\n    }\n\n    private applyClassNames(){\n        const radioClasses = useUtilityClasses();\n\t\tthis.component.getElement().classList.add(radioClasses.root)\n       \n\n    }\n\n    getProperty(){\n\n    }\n}","\n\n\nimport { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { RatingInputComponentType } from \"./rating-input.types\";\nimport { RatingInputController } from \"./rating-input-controller\";\n\n\nconst RatingInputComponentTemplate = (_property : any)=>{\n    const ratingInput = document.createElement(\"input\");\n    ratingInput.type = \"radio\";\n    return ratingInput\n}\n\nexport class RatingInputComponent extends Component {\n\n    @PostConstruct()\n    init() {\n        const comp : RatingInputComponentType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className)\n        }\n\n        const controller = this.createBean(new RatingInputController());\n        const property = controller.getProperty()\n        this.setTemplate(RatingInputComponentTemplate(property))\n        controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n}\n","\nimport { composeClasses } from \"@dg/utils\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { RatingRootComponentType, RatingRootControllerType } from \"./rating-root.types\";\nimport { getRadioUtilityClass } from \"../rating-utils/rating-classes\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { RATING_BEAN_NAME } from \"../../constants/beanname-constants\";\nimport { RatingControllerHandler } from \"../model/rating-controller\";\nimport { RatingEventHandlerType } from \"../model/rating-event-handler.types\";\nimport {IKeyboardEventManager, KeyboardEventManager} from \"../rating-utils/keyboard-event-util\"\nimport { RatingModelType } from \"../model/rating-model.types\";\nimport { RATING_EVENTS } from \"../../constants/event-name\";\nimport type { RatingStateManager } from \"../model/rating-state-manager\";\nimport { IRatingOptionHandler } from \"../model/rating-option-handler.types\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\n\nconst useUtilityClassesForRadio = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'root',\n\t\t\tmodifiers: [\n\t\t\t\t\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getRadioUtilityClass);\n};\n\n\n\n\nexport class RatingRootController extends AbstractController<RatingRootComponentType> implements RatingRootControllerType{\n   \n\t@AutoWired(RATING_BEAN_NAME.RATING_CONTROLLER_HANDLER) controllerHandler !   : RatingControllerHandler;\n\t@AutoWired(RATING_BEAN_NAME.RATING_EVENT_HANDLER) ratingEventHandler !   : RatingEventHandlerType;\n\t@AutoWired(RATING_BEAN_NAME.RATING_MODEl) ratingModel !   : RatingModelType;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionsHandler !: IRatingOptionHandler;\n    private element !: HTMLElement \n    private keyboardManager !:IKeyboardEventManager;\n    @AutoWired('stateManager') private stateManager !: RatingStateManager;\n\n\n\n    init(): void {\n        this.element = this.component?.getElement() as HTMLElement;\n        this.applyClassNames();\n        this.setTabindex();\n        this.keyboardManager = new KeyboardEventManager();\n        this.addListeners();\n        this.controllerHandler.registerNumber(this);\n        this.setAriaAttributes();\n\n        this.addListener(this.eventHandler, 'EVENT_VALUE_UPDATE', this.addErrorClassName.bind(this));\n        this.addErrorClassName();\n\n        registerClipboardGuards(\n            this.element,\n            () => this.optionsHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n    }\n\n     private addErrorClassName() : void {\n\t\tconst isInValid = this.stateManager.isInValid();\n\t\tthis.component!.getElement().classList.toggle(\"dg-input__status--error\", isInValid)\n\t}\n\n\n    \n\n    private applyClassNames(){\n        const radioClasses = useUtilityClassesForRadio();\n\t\tthis.element.classList.add(radioClasses.root)\n        this.element.classList.add(\"dg-rating__root\")\n        this.element.classList.add(\"dg-field__root\")\n    }\n    \n    private setTabindex(): void{\n        this.element.setAttribute('tabindex', '0');\n    }\n\n    getElement(): HTMLElement {\n       return this.element;\n    }\n\n    private setAriaAttributes(): void{\n        if (!this.element) return;  // Ensure element is defined\n        this.element.setAttribute('role', 'radiogroup');\n    }\n    \n\n\n    addListeners() : void{\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        if (!this.element) return;  // Ensure element is defined\n    \n        // Add mouseover event listener\n        this.element.addEventListener('mouseover', this.handleMouseOver.bind(this));\n    \n        // Add mouseleave event listener\n        this.element.addEventListener('mouseleave', this.handleMouseLeave.bind(this));\n\n        // Add keydown event listener\n        this.keyboardManager.registerElement(this.element,this.handleKeyDown.bind(this));\n\n        // Add focus event listener\n        this.element.addEventListener('focus', this.handleFocus.bind(this));\n\n        // Add blur event listener\n        this.element.addEventListener('blur', this.handleBlur.bind(this));\n\n\n        this.addListener(this.eventHandler, RATING_EVENTS.FOCUS, this.focus.bind(this)); \n\n\n    }\n\n    \n    private handleMouseOver(event:MouseEvent): void {\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        this.ratingEventHandler.onMouseOver(event);\n       \n    }\n    \n    private handleMouseLeave(event :MouseEvent): void {\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        this.ratingEventHandler.onMouseLeave(event);\n\n    }\n\n    private handleKeyDown(event : KeyboardEvent):void{\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n    const numberValue = this.keyboardManager.getNumberIfPressed(event);\n    if (numberValue !== null) {\n       const isInRange =  this.ratingModel.isInRange(Number(numberValue))\n       isInRange && this.ratingModel.resetCounter();\n       isInRange && this.ratingModel.setHoverValue(0);\n       isInRange && this.ratingModel.setValue(Number(numberValue));\n    }\n        this.ratingEventHandler.onKeydown(event);\n    }\n\n\n   \n\n    private handleFocus(event : FocusEvent): void {\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        this.ratingEventHandler.onFocus(event);\n\n    }\n\n    private handleBlur(event : FocusEvent): void {\n        const readonly  = this.optionsHandler.isReadOnly()\n        if(readonly){\n            return\n        }\n        this.ratingEventHandler.onBlur(event);\n\n    }\n\n        \n    getProperty(){\n        return{\n            getTemplate   : ()=>{ return null},\n            label         : this.optionsHandler.getLabel(),\n            ignoreEmptyDOM: this.optionsHandler.shouldIgnoreEmptyDOM(),\n            description   : this.optionsHandler.getDescription(),\n            error         : this.optionsHandler.showErrorState()\n        }\n        \n\n    }\n\n    focus(): void {\n       this.element.focus();\n    }\n    blur(): void {\n        this.element.blur();\n    }\n    hide(): void {\n    if (this.element ) {\n        this.element.style.display = \"none\"; \n    }\n    }\n    show(): void {\n        if (this.element ) {\n            this.element.style.display = \"block\"; \n        }\n    }\n\n    getParamsProperty() {\n        return {\n\t\t\tlabel : {\n\t\t\t\tgetLabelClasses :()=> {\n\t\t\t\t\treturn\"dg-rating__label\"\n\t\t\t\t},\n\t\t\t\tgetLabelTitleClasses :()=> {\n\t\t\t\t\treturn \"dg-rating__label-title\"\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses: ()=>  \"dg-rating__validation-message\",\n\t\t\t\tgetDescriptionClasses      : ()=> \"dg-rating__description\"\n\t\t\t}\n\t\t};\n    }\n\n\n}","import { PostConstruct } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent/Component.js'\nimport { composeClasses } from '@dg/utils';\nimport { RatingRootController } from './rating-root-controller';\nimport { getRatingRootUtilityClass } from '../rating-utils/rating-classes';\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'container',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getRatingRootUtilityClass)\n}\n\n\nconst BasicTemplate= (params:any) =>{\n\tconst wrapper = document.createElement('div');\n\n\tconst fragmentElemet = document.createDocumentFragment();\n\n\tif(params.ignoreEmptyDOM || params.label){\n\t\tconst labelElement = document.createElement('rating-label');\n\t\tlabelElement.setAttribute('ref', 'label');\n\t\tfragmentElemet.appendChild(labelElement);\n\n\t}\n\n\tconst container = document.createElement('rating-container');\n\tfragmentElemet.appendChild(container);\n\n\n\tif(params.ignoreEmptyDOM || params.description){\n\t\tconst descriptionElement = document.createElement('rating-description');\n\t\tdescriptionElement.setAttribute('ref', 'description');\n\t\tfragmentElemet.appendChild(descriptionElement);\n\n\t}\n\n\tif(params.ignoreEmptyDOM || params.error){\n\t\tconst errorElement = document.createElement('rating-error');\n\t\terrorElement.setAttribute('ref', 'error');\n\t\tfragmentElemet.appendChild(errorElement);\n\n\t}\n\n\twrapper.append(fragmentElemet);\n\treturn wrapper;\n\t\n\n}\n\n\nfunction RootTemplate(props : any): HTMLElement {\n\tconst { getTemplate } = props;\n\tconst classes        = useUtilityClasses();\n\tconst customTemplate = getTemplate(classes);\n\tconst template       = customTemplate ? customTemplate : BasicTemplate(props);\n\treturn template as HTMLElement;\n}\n\nexport class RatingRootComponent extends Component {\n\tprivate appendTo: HTMLElement |  null | undefined;\n\tconstructor(appendTo: HTMLElement |  undefined |  null) {\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\t// change for framework view\n\t\tconst component: any = {\n\t\t\tgetElement             : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className)\n\t\t};\n\n        // change createMangedBean to createWire\n\t\tconst controller = this.createManagedBean(new RatingRootController());\n\n\t\tconst props = controller.getProperty();\n\t\tconst properties = controller.getParamsProperty();\n\t\tconst template = RootTemplate(props);\n\n\t\t// const properties = controller.getParamsProperty();\n\t\t\n\t\tthis.setTemplate(template, {\n\t\t\tlabel      : properties.label,\n\t\t\terror      : properties.description,\n\t\t\tdescription: properties.description\n\t\t});\n\n\t\tcontroller.setComponent(component);\n\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprivate appendElementIntoUserDom() : void {\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.appendTo?.remove();\n\t\t\tthis.appendTo = null;\n\t\t});\n\t}\n}","\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { RatingSVGComponentType } from \"./rating-svg.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { getRadioUtilityClass } from \"../rating-utils/rating-classes\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { IRatingUserComponentHandler } from \"../model/rating-user-component-handler.types\";\n\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'input--custom',\n\t\t\tmodifiers: [\n\t\t\t\t\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getRadioUtilityClass);\n};\n\n\n\n\nexport class RatingSVGController extends EventEmitter {\n    private component !: RatingSVGComponentType\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: IRatingUserComponentHandler;\n\n    \n    setComponent(component : RatingSVGComponentType){\n        this.component = component;\n        this.applyClassNames();\n        this.setRendererDetails();\n    }\n\n    private applyClassNames(){\n        const radioClasses = useUtilityClasses();\n\t\tthis.component.getElement().classList.add(radioClasses.root)\n\n\n    }\n\n    setRendererDetails() : void {\n        \n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails     = this.userComponentHandler.getIconRendererDetails(rendererWrapper, params) as IComponentDetails;\n\n\n        // this.isInValid = inValid;\n\n        this.component.setRendererDetails(userDetails);\n\n        \n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionsHandler.getIconRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionsHandler.getIconRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionsHandler.getIconRendererParams(),\n\t\t};\n    }\n    getProperty(){\n\n    }\n}","\n\n\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { RatingSVGComponentType } from \"./rating-svg.types\";\nimport { RatingSVGController } from \"./rating-svg-controller\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\n\n\nconst RatingSVGComponentTemplate = (_property : any)=>{\n    const ratingSVG = document.createElement(\"span\");\n    return ratingSVG\n}\n\nexport class RatingSVGComponent extends Component {\n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    @PostConstruct()\n    init() {\n        const comp : RatingSVGComponentType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails : (rendererDetails: IComponentDetails)=>this.setRendererDetails(rendererDetails)\n        }\n\n        const controller = this.createBean(new RatingSVGController());\n        const property = controller.getProperty()\n        this.setTemplate(RatingSVGComponentTemplate(property))\n        controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutCellRenderer()\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer() {\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\t\n\t\tconst svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tsvg.setAttribute(\"width\", \"16\");\n\t\tsvg.setAttribute(\"height\", \"16\");\n\t\tsvg.setAttribute(\"viewBox\", \"0 -1 16 16\");\n\t\tsvg.setAttribute(\"fill\", \"none\");\n\t\tsvg.setAttribute(\"xmlns\", \"http://www.w3.org/2000/svg\");\n\t\tsvg.style.cssText = \"--ratingChecked: #FCB515; --ratingUnChecked: #E3E3E3;\";\n\t\n\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tg.setAttribute(\"id\", \"ratingIcon\");\n\t\n\t\tconst path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n\t\tpath.setAttribute(\"fill-rule\", \"evenodd\");\n\t\tpath.setAttribute(\"class\", \"star\");\n\t\tpath.setAttribute(\"d\", \"M6.21077 0.910679C6.61656 -0.303561 8.38344 -0.303559 8.78923 0.910681L9.63043 3.42774C9.8119 3.97077 10.3324 4.33842 10.9197 4.33842H13.6418C14.955 4.33842 15.501 5.97217 14.4386 6.72261L12.2363 8.27824C11.7612 8.61385 11.5624 9.20872 11.7439 9.75175L12.5851 12.2688C12.9909 13.483 11.5615 14.4928 10.4991 13.7423L8.29679 12.1867C7.82168 11.8511 7.17832 11.8511 6.70321 12.1867L4.50093 13.7423C3.43855 14.4928 2.00912 13.483 2.41491 12.2688L3.25611 9.75175C3.43758 9.20872 3.23878 8.61385 2.76366 8.27824L0.561388 6.72261C-0.500999 5.97217 0.0449977 4.33842 1.35818 4.33842H4.08034C4.66761 4.33842 5.1881 3.97076 5.36957 3.42774L6.21077 0.910679Z\");\n\t\n\t\tg.appendChild(path);\n\t\tsvg.appendChild(g);\n\t\tparentElement.appendChild(svg);\n\t}\n\t\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n}\n","export interface IKeyboardEventManager {\n  registerElement(element: HTMLElement, callback: (event: KeyboardEvent, numberValue: string | null) => void): void;\n  unregisterElement(element: HTMLElement): void;\n  getNumberIfPressed(event: KeyboardEvent): string | null;\n}\n\nexport class KeyboardEventManager implements IKeyboardEventManager {\n  private registeredElements: Map<HTMLElement, (event: KeyboardEvent) => void>;\n\n  constructor() {\n    this.registeredElements = new Map();\n  }\n\n  /**\n   * Registers an element and adds a keydown event listener.\n   * @param element - The target HTML element to register.\n   * @param callback - The function to call when a keydown event occurs.\n   */\n  registerElement(element: HTMLElement, callback: (event: KeyboardEvent, numberValue: string | null) => void): void {\n    if (!this.registeredElements.has(element)) {\n      const handler = (event: KeyboardEvent) => {\n        const numberValue = this.getNumberIfPressed(event);\n        callback(event, numberValue); // Pass both the event and the numeric value\n      };\n      element.addEventListener(\"keydown\", handler);\n      this.registeredElements.set(element, handler);\n      // console.log(`Element registered: ${element.id}`);\n    } else {\n      // console.warn(`Element already registered: ${element.id}`);\n    }\n  }\n\n  /**\n   * Unregisters an element and removes its keydown event listener.\n   * @param element - The target HTML element to unregister.\n   */\n  unregisterElement(element: HTMLElement): void {\n    const handler = this.registeredElements.get(element);\n    if (handler) {\n      element.removeEventListener(\"keydown\", handler);\n      this.registeredElements.delete(element);\n      // console.log(`Element unregistered: ${element.id}`);\n    } else {\n      // console.warn(`Element not registered: ${element.id}`);\n    }\n  }\n\n  /**\n   * Handles the buffer logic with a delay and returns the accumulated number.\n   * @param event - The KeyboardEvent to check.\n   * @returns The accumulated number if numeric keys are pressed within the delay, otherwise null.\n   */\n   getNumberIfPressed(event: KeyboardEvent): string | null {\n    return /^[0-9]$/.test(event.key) ? event.key :null;\n   }\n}\n\n// Example usage:\n// const keyboardManager = new KeyboardEventManager();\n// const inputField = document.getElementById(\"myInput\") as HTMLInputElement;\n\n// keyboardManager.registerElement(inputField, (event, numberValue) => {\n//   if (numberValue !== null) {\n//     console.log(`Accumulated number: ${numberValue}`);\n//   } else {\n//     console.log(`Non-numeric key pressed: ${event.key}`);\n//   }\n// });\n","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"../../modules/CSSRegistry\";\n\nexport function getRatingRootUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('rating', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n\nexport function getRadioUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('radio', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { values } from \"@dg/corecomponent\";\nimport { IModule } from \"../../../core/modules.types\";\n// import { isValidModuleVersion } from \"../../../core/VersionValidation\";\n// import { dependencyVersion, moduleName } from \"../version.js\";\ntype globalModuleMap = { [name: string]: IModule };\ntype instanceModulesMap = { [instanceID: string]: { [name: string]: IModule } };\n\nexport class ModuleRegistry {\n\n    private static globalModulesMap: globalModuleMap      = {};\n    private static instanceModulesMap: instanceModulesMap = {};\n\n    public static register(module: IModule): void {\n        ModuleRegistry.__register(module, undefined);\n    }\n\n    public static registerModules(modules: IModule[]): void {\n        ModuleRegistry.__registerModules(modules, undefined);\n    }\n\n    public static __registerModules(modules: IModule[], instanceID: string | undefined): void {\n        if (!modules) {\n            return;\n        }\n        modules.forEach(module => ModuleRegistry.__register(module, instanceID));\n    }\n\n    public static __unRegisterInstanceModules(instanceID: string): void {\n        delete ModuleRegistry.instanceModulesMap[instanceID];\n    }\n\n    public static __getRegisteredModules(instanceID: string): IModule[] {\n        return [...values(ModuleRegistry.globalModulesMap), ...values(ModuleRegistry.instanceModulesMap[instanceID] || {})];\n    }\n\n    public static __isRegistered(moduleName: string, instanceID: string): boolean {\n        return !!ModuleRegistry.globalModulesMap[moduleName] || !!ModuleRegistry.instanceModulesMap[instanceID]?.[moduleName];\n    }\n\n    public static __getInstanceRegisteredModules(instanceID: string): IModule[] {\n        return values(ModuleRegistry.instanceModulesMap[instanceID] ?? {}) || [];\n    }\n\n    public static __assertRegistered(moduleName: string, reason: string, instanceID: string): boolean {\n        if (this.__isRegistered(moduleName, instanceID)) {\n            return true;\n        }\n\n        console.error(reason);\n\n        return false;\n    }\n\n    public static __register(module: IModule, instanceID: string | undefined): void {\n        // ModuleRegistry.runVersionChecks(module);\n\n        if (instanceID !== undefined) {\n            if (ModuleRegistry.instanceModulesMap[instanceID] === undefined) {\n                ModuleRegistry.instanceModulesMap[instanceID] = {};\n            }\n            ModuleRegistry.instanceModulesMap[instanceID][module.moduleName] = module;\n        } else {\n            ModuleRegistry.globalModulesMap[module.moduleName] = module;\n        }\n    }\n\n    // private static runVersionChecks(module: IModule) : void {\n    //     // if (!module.version) {\n    //     //     throw Error(`You are using incompatible versions of ${moduleName} modules. Major and minor versions should always match across modules. '${module.moduleName}' is incompatible. Please update all modules to the same version.`);\n    //     // } else if (!ModuleRegistry.isValidModuleVersion(module.version, dependencyVersion[module.moduleName])) {\n    //     //     throw Error(`You are using incompatible versions of ${moduleName} modules. Major and minor versions should always match across modules. '${module.moduleName}' is version ${module.version} but the other modules are version ${dependencyVersion[module.moduleName]}. Please update all modules to the same version.`);\n    //     // }\n    // }\n\n    // private static isValidModuleVersion(version : string, dependencyVersion : string) : boolean {\n    //     return isValidModuleVersion(version, dependencyVersion);\n    // }\n}\n\n","\nimport { BEAN_NAME, traverseObject } from \"@dg/corecomponent\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { ComponentMetadataProvider } from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport { UserComponentRegistry } from '@dg/corecomponent/UserComponentRegistry.js';\nimport { Context } from \"@dg/corecomponent/Context.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { RatingAPI } from \"./core/model/rating-api\";\nimport { IRatingConfiguration } from \"./rating-configuration.types\";\nimport { IModule } from '../../core/modules.types';\nimport { ModuleRegistry } from \"./modules/ModuleRegistry\";\nimport { Label } from \"../../label/label-view\";\nimport { DescriptionComponent } from \"../../description/description-view\";\nimport { RatingControllerHandler } from \"./core/model/rating-controller\";\nimport { RatingOptionHandler } from \"./core/model/rating-option-handler\";\nimport {RatingContainerComponent} from \"./core/rating-container/rating-container-view\"\nimport { RatingInputWrapperComponent } from \"./core/rating-input-wrapper/rating-input-wrapper-view\";\nimport { RatingInputComponent } from \"./core/rating-input/rating-input-view\";\nimport { RatingSVGComponent } from \"./core/rating-svg/rating-svg-view\";\nimport { RatingUserComponentHandler } from \"./core/model/rating-user-component-handler\";\nimport { RatingModel } from \"./core/model/rating-model\";\nimport { RaitngEventHandler } from \"./core/model/rating-event-handler\";\nimport { RatingStateManager } from \"./core/model/rating-state-manager\";\nimport { ErrorComponent } from \"../../error/error-view\";\n\nexport interface IUserParams {\n\tglobalEventListener      ?: Function;\n\tframeworkOverrides       ?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n\tmodules                  ?: IModule[];\n}\n\n\nlet nextInstanceId = 1;\n\n\nexport class RatingCoreComponent {\n\tinitializeRating( configuration: IRatingConfiguration, params: IUserParams = {}, createUI: CallableFunction, ): void {\n\t\t\n\t\tconst instanceID = configuration.instanceID ?? String(nextInstanceId++);\n\n\t\tconst registeredModules = this.getRegisteredModules(params, instanceID);\n\n\t\tconst beanClasses = this.CreateBeanClasses(registeredModules, configuration);\n\n\t\tconst context = new Context();\n\n\t\tconst userConfigurations = this.createuserConfiguration(\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t\tinstanceID\n\t\t);\n\n        // Model classes\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n        // Default component registry\n\t\tthis.registerCoreComponent(context);\n        // Default user compoent registry\n\t\tthis.registerDefaultUserComponent(context);\n        // Optional Dependency Module\n\t\tthis.registerModuleUserComponents(context, registeredModules);\n        // \n\t\tthis.registerStackComponents(context, registeredModules);\n\n\t\tcreateUI(context);\n\n\t\t(window as any).context = context;\n\t}\n\n\tprivate CreateBeanClasses(registeredModules : IModule[], _configuration : IRatingConfiguration): Set<any> {\n\t\tlet beanList = [\n\t\t\t//default framework\n\t\t\tComponentsRegistry, // component registry\n\t\t\tUserComponentRegistry, // user component registry\n\t\t\tEventHandler, // pub sub model\n\t\t\tRatingOptionHandler, //configuation\n\t\t\tComponentMetadataProvider, // framework component metadata provider\n\t\t\tRatingUserComponentHandler, // framework custom rendering\n\n\t\t\t//Rating component model layer\n\t\t\tRatingAPI, //api part\n\t\t\tRatingModel,\n\t\t\t// RatingEventHandler, // callback for custom layout\n\t\t\tRatingControllerHandler,\n\t\t\tRaitngEventHandler,\n\t\t\tRatingStateManager\n\t\t];\n\n \t\tconst moduleBeans = this.extractModuleEntity(registeredModules, (module : IModule) => module.beans ? module.beans : []);\n        beanList.push(...moduleBeans);\n\n\t\t\n\n\t\treturn new Set(beanList);\n\t}\n\tprivate createuserConfiguration( configuration: any, params: IUserParams, instanceID : string): { configuration: any; frameWorkOverrides: IFrameworkOverrides | null; globalEventListener: Function | null; frameworkComponentWrapper: any | null; instanceID : string; } {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tinstanceID,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n\n\tprivate registerDefaultUserComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n        };\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n\n\tprivate registerModuleUserComponents(context: Context, registeredModules: IModule[]): void {\n        const moduleUserComps: { componentName: string, componentClass: any; }[] = this.extractModuleEntity(registeredModules, (module : IModule) => module.userComponents ? module.userComponents : []);\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY);\n        moduleUserComps.forEach(compMeta => {\n            userComponentRegistry.registerDefaultComponent(compMeta.componentName, compMeta.componentClass);\n        });\n    }\n\n\tprivate registerStackComponents(context: Context, registeredModules: IModule[]): void {\n        const Components = this.createComponentsList(registeredModules);\n\t\tconst componentRegistry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY);\n        componentRegistry.setupComponents(Components);\n    }\n\n\tprivate extractModuleEntity(moduleEntities: any[], extractor: (module: any) => any) {\n        return [].concat(...moduleEntities.map(extractor));\n    }\n\n\tprivate createComponentsList(registeredModules: IModule[]): any[] {\n\t\tlet components: ComponentMeta[] = []\n\n        const moduleComps = this.extractModuleEntity(registeredModules, (module : IModule) => module.components ? module.components : []);\n\n        components = components.concat(moduleComps);\n\n        return components;\n\t}\n\n\tprivate getRegisteredModules( params: IUserParams | undefined, instanceID: string, ): IModule[] {\n\t\tconst passedViaConstructor: IModule[] | undefined | null = params ? params.modules : null;\n\t\tconst registered = ModuleRegistry.__getRegisteredModules(instanceID);\n\n\t\tconst allModules: IModule[] = [];\n\t\tconst mapNames: { [name: string]: boolean } = {};\n\n\t\tconst addModule = (mod: IModule, instanceID: string | undefined) => {\n\t\t\tconst addIndividualModule = (currentModule: IModule) => {\n\t\t\t\tif (!mapNames[currentModule.moduleName]) {\n\t\t\t\t\tmapNames[currentModule.moduleName] = true;\n\t\t\t\t\tallModules.push(currentModule);\n\t\t\t\t\tModuleRegistry.__register(currentModule, instanceID);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\taddIndividualModule(mod);\n\t\t\tif (mod.dependantModules) {\n\t\t\t\tmod.dependantModules.forEach((m) => addModule(m, instanceID));\n\t\t\t}\n\t\t};\n\n\t\tif (passedViaConstructor) {\n\t\t\tpassedViaConstructor.forEach((m) => addModule(m, instanceID));\n\t\t}\n\n\t\tif (registered) {\n\t\t\tregistered.forEach((module) =>\n\t\t\t\taddModule( module, undefined),\n\t\t\t);\n\t\t}\n\n\t\treturn allModules;\n\t}\n\n\tprivate registerCoreComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nexport function createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n        {\n\t\t\tcomponentName: 'rating-label',\n\t\t\tcomponentClass: Label\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'rating-description',\n\t\t\tcomponentClass: DescriptionComponent\n\t\t},\n\n\t\t{\n\t\t\tcomponentName : \"rating-container\",\n\t\t\tcomponentClass : RatingContainerComponent\n\t\t},\n\n\t\t{\n\t\t\tcomponentName : \"rating-input-wrapper\",\n\t\t\tcomponentClass : RatingInputWrapperComponent\n\t\t},\n\n\t\t{\n\t\t\tcomponentName : \"rating-input\",\n\t\t\tcomponentClass : RatingInputComponent\n\t\t},\n\n\t\t{\n\t\t\tcomponentName: \"rating-svg\",\n\t\t\tcomponentClass : RatingSVGComponent\n\t\t},\n\t\t{\n\t\t\tcomponentName : 'rating-error',\n\t\t\tcomponentClass: ErrorComponent\n\t\t}\n\t\t\n\n\n    ];\n\n\treturn components;\n}\n\n","import { Context } from \"@dg/corecomponent/Context.js\";\nimport { RATING_BEAN_NAME } from \"./constants/beanname-constants\";\n\nimport { IRatingConfiguration } from \"./rating-configuration.types\";\nimport { IUserParams, RatingCoreComponent } from \"./rating-core-component\";\nimport { IRatingAPI } from \"./core/model/rating-api.types\";\nimport { RatingRootComponent } from \"./core/rating-root/rating-root-view\";\n\n\nexport class RatingComponent {\n\tpublic api: IRatingAPI | undefined;\n\tconstructor(configuration: IRatingConfiguration, params?: IUserParams) {\n\t\tconst createUI = (context: Context) => {\n\t\t\tthis.api = context.getBean(RATING_BEAN_NAME.RATING_API) as IRatingAPI;\n            context.createBean(new RatingRootComponent(configuration.appendTo));\n\t\t};\n\t\tnew RatingCoreComponent().initializeRating(configuration, params, createUI);\n\t}\n}","import { Context } from \"@dg/corecomponent/Context.js\";\nimport {IUserParams} from \"../utility/user-params.types\"\nimport { ComponentMeta, ComponentsRegistry } from \"@dg/corecomponent/ComponentRegistry.js\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry.js\";\nimport { ComponentMetadataProvider } from \"@dg/corecomponent/ComponentMetadataProvider.js\";\nimport { EventHandler } from \"@dg/corecomponent/EventHandler.js\";\nimport { SelectOptionHandler } from \"./src/core/model/select-option-handler\";\nimport { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent/FrameWork.js\";\nimport { BEAN_NAME, traverseObject } from \"@dg/corecomponent\";\nimport{ISelectConfiguration} from \"./src/select-configuration-types/select_configuration\";\nimport { SelectInputComponent } from \"./src/core/select-input/select-input-view\";\nimport { SelectDataPart } from \"../select/src/core/model/select-ds\";\nimport { ControllerHandler } from \"./src/core/model/select-input-handler\";\nimport { SelectInputAPI } from \"./src/core/model/select-api\";\nimport { PopupHandler } from \"./src/core/model/popup-handler\";\nimport { SelectInputController } from \"./src/core/select-input/select-input-controller\";\nimport { Label } from \"../label/label-view\";\nimport { SelectInputWrapperComponent } from \"./src/core/select-input-wrapper/select-input-wrapper-view\";\nimport { SelectConfigAPI } from \"./src/core/model/select-configApi\";\nimport { DescriptionComponent } from \"../description/description-view\";\nimport { SelectStateManager } from \"./src/core/model/select-state-manager\";\nimport { SelectUserComponentHandler } from \"./src/core/model/select-user-component-handler\";\nimport { SelectContainerComponent } from \"./src/core/select-container/select-container-view\";\nimport { SelectboxIconComponent } from \"./src/core/selectbox-icon/selectbox-icon-view\";\nimport { PlusIconComponent } from \"./src/core/plus-icon/plus-icon-view\";\nimport { ErrorComponent } from \"../error/error-view\";\n\n\nlet nextInstanceId = 1;\n\nexport class SelectCoreComponent {\n    initializeSelect(configuration: ISelectConfiguration, params: IUserParams = {}, createUI: CallableFunction): void {\n        const instanceID = String(nextInstanceId++);\n\n        const beanClasses = this.CreateBeanClasses();\n\n        const context = new Context();\n\n        const userConfigurations = this.createUserConfiguration(\n            configuration,\n            params,\n            instanceID\n        );\n\n        // Model classes\n        context.registerBeanClasses(beanClasses, userConfigurations);\n        // Default component registry\n        this.registerCoreComponent(context);\n        // Default user component registry\n        this.registerDefaultUserComponent(context);\n        createUI(context);\n\n        (window as any).context = context;\n    }\n\n    private CreateBeanClasses(): Set<any> {\n        let beanList = [\n            SelectStateManager,\n            SelectUserComponentHandler,\n            SelectInputAPI,\n            SelectOptionHandler,\n            SelectDataPart,\n            ControllerHandler,\n            PopupHandler,\n            SelectDataPart,\n            SelectInputController,\n            ComponentsRegistry,\n            UserComponentRegistry,\n            ComponentMetadataProvider,\n            EventHandler,\n            SelectConfigAPI,\n        ];\n        return new Set(beanList);\n    }\n\n    private createUserConfiguration(configuration: any, params: IUserParams, instanceID: string): {\n        configuration: any;\n        frameWorkOverrides: IFrameworkOverrides | null;\n        globalEventListener: Function | null;\n        frameworkComponentWrapper: any | null;\n        instanceID: string;\n    } {\n        let frameWorkOverrides = params.frameworkOverrides ?? null;\n        if (!frameWorkOverrides) {\n            frameWorkOverrides = new VanillaFrameWorkOverrider();\n        }\n        return {\n            configuration,\n            frameWorkOverrides,\n            instanceID,\n            frameworkComponentWrapper: params.frameworkComponentWrapper,\n            globalEventListener: params.globalEventListener ?? null,\n        };\n    }\n\n    private registerDefaultUserComponent(context: Context): void {\n        const userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n        const defaultComponent = {\n            // [PropertyName.REMOVE_SELECT_RENDERER]: SelectIconRenderer,\n            // [PropertyName.LABEL_SELECT_RENDERER]: SelectIconRenderer\n        };\n\n        traverseObject(defaultComponent, (name: string, component: any) => {\n            userComponentRegistry.registerDefaultComponent(name, component);\n        });\n    }\n\n    private registerCoreComponent(context: Context): void {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n}\n\nexport function createComponentList(): ComponentMeta[] {\n    let components: ComponentMeta[] = [\n        {\n            componentName: 'select-input',\n            componentClass: SelectInputComponent,\n        },\n        {\n\t\t\tcomponentName: 'select-label',\n\t\t\tcomponentClass: Label\n\t\t},\n        {\n            componentName: 'select-container',\n            componentClass: SelectContainerComponent,\n        },\n        {\n            componentName: 'select-input-wrapper',\n            componentClass: SelectInputWrapperComponent,\n        },\n        {\n\t\t\tcomponentName: 'select-helper-text',\n\t\t\tcomponentClass: DescriptionComponent,\n\t\t},\n        {\n\t\t\tcomponentName: 'select-icon',\n\t\t\tcomponentClass: SelectboxIconComponent,\n\t\t},\n        {\n\t\t\tcomponentName: 'plus-icon',\n\t\t\tcomponentClass: PlusIconComponent,\n\t\t},\n        {\n            componentName : \"select-error\",\n            componentClass : ErrorComponent\n        }\n        \n        \n    ];\n\n    return components;\n}\n\n","import { SelectCoreComponent } from './select-core-component';\nimport { Context } from \"@dg/corecomponent/Context.js\";\nimport {ISelectConfiguration} from \"./src/select-configuration-types/select_configuration\"\nimport {IUserParams} from \"../utility/user-params.types\";\nimport {SELECT_BEAN_NAME} from \"./src/constants/beanname-constant\";\nimport { ISelectInputAPI } from './src/core/model/select-api';\nimport { SelectRootComponent } from './src/core/select-root/select-root-view';\nexport class Select {\n  public api: ISelectInputAPI | undefined;\n\n  constructor(configuration: ISelectConfiguration, params?: IUserParams) {\n   \n    const createUI = (context: Context) =>{\n      this.api = context.getBean(SELECT_BEAN_NAME.SELECT_API) as ISelectInputAPI;\n      context.createBean(new SelectRootComponent(configuration.appendTo));\n    };\n    new SelectCoreComponent().initializeSelect(configuration, params, createUI);\n  }\n\n}\n(window as any).SelectComponent = Select;\n","export const SELECT_BEAN_NAME = {\n\tSELECT_API: 'selectAPI',\n\tSELECT_CONFIGURATION: 'configuration',\n\tCSSCLASSNAMEGENERATOR: 'CSSClassNameGenerator',\n\tSELECT_OPTIONS_HANDLER: 'SelectOptionsHandler',\n\tFORMATTER: 'formatter',\n\tKEYBOARD_SHORTCUT_HANDLER: 'KeyBoardShortCutsHandler',\n\tSELECT_EVENT_HANDLER: 'SelectEventHandler',\n\tSELECT_CONTROLLER_HANDLER: 'SelectControllerHandler',\n\tPOPUP_HANDLER : \"PopupHandler\",\n\tSELECT_TOOLTIP_HANDLER : \"SELECT_TOOLTIP_HANDLER\"\n};","\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n// import { composeClasses } from \"@dg/utils\";\n// import { getRadioUtilityClass } from \"../rating-utils/rating-classes\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { SelectUserComponentHandlerTypes } from \"../model/select-user-component-handler.types\";\nimport { ISelectOptionHandler } from \"../model/select-option-handler.types\";\nimport { EllipsesComponentType } from \"./ellipses.types\";\nimport { ISelectInputHandler } from \"../model/select-input-handler\";\nimport { SELECT_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { ISelectInputAPI } from \"../model/select-api\";\n// import { IRatingUserComponentHandler } from \"../model/rating-user-component-handler.types\";\n\n\n\n// const useUtilityClasses = () => {\n// \tconst slots = {\n// \t\troot: {\n// \t\t\tslot: '',\n// \t\t\tmodifiers: [\n\t\t\t\t\n// \t\t\t],\n// \t\t},\n// \t};\n\n// \treturn composeClasses(slots, getSelectRootUtilityClass);\n// };\n\n\n\n\nexport class EllipsesController extends EventEmitter {\n    private component !: EllipsesComponentType\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: SelectUserComponentHandlerTypes;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n    @AutoWired(SELECT_BEAN_NAME.SELECT_API) selectAPI !: ISelectInputAPI;\n\n\n\n    setComponent(component : EllipsesComponentType){\n        this.component = component;\n        this.applyClassNames();\n        this.setRendererDetails();\n        this.registerEventHandlers();\n        this.optionHandler.getEllipsesRenderer() &&  this.setRendererDetails();\n    }\n\n    private registerEventHandlers(){\n        const plusIcon = this.component.getElement();\n        if(plusIcon && !this.optionHandler.isReadOnly()){\n            plusIcon.addEventListener(\"click\",()=>this.selectAPI.toggleDropdown());\n        }\n    }\n\n    private applyClassNames(){\n\t\tthis.component.getElement().classList.add(\"dg-ellispes_icon\");\n    }\n\n    setRendererDetails() : void {\n        \n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails     = this.userComponentHandler.getEllipsesRendererDetails(rendererWrapper, params) as IComponentDetails;\n        // this.isInValid = inValid;\n        this.component.setRendererDetails(userDetails);\n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionHandler.getEllipsesRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionHandler.getEllipsesRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionHandler.getEllipsesRendererParams(),\n\t\t};\n    }\n\n    reRenderIcon():void{\n        this.setRendererDetails();\n    }\n    getProperty(){\n\n    }\n\n    getElement(){\n        return this.component.getElement();\n    }\n\n     destroy(): void {\n      this.component.destroy();  \n    }\n\n\n}","\n\n\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { EllipsesComponentType } from \"./ellipses.types\";\nimport { EllipsesController } from \"./ellipses-controller\";\n\n\nconst EllipsesComponentTemplate = (_property : any)=>{\n    const plusIconcomp =  document.createElement('div');\n    return plusIconcomp;\n}\n\nexport class EllipsesComponent extends Component {\n    private renderer       : any;\n\tprivate rendererElement: any;\n\tprivate controller !: EllipsesController;\n\n    @PostConstruct()\n    init() {\n        const comp : EllipsesComponentType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails : (rendererDetails: IComponentDetails)=>this.setRendererDetails(rendererDetails),\n\t\t\tdestroy : () => this.destroyRenderer(),\n        }\n\n        this.controller = this.createBean(new EllipsesController());\n        const property = this.controller.getProperty()\n        this.setTemplate(EllipsesComponentTemplate(property))\n        this.controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutCellRenderer()\n\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer() {\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\t\t\n\t\t// Create SVG element using proper namespace\n\t\tconst svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tsvg.setAttribute(\"width\", \"12\");\n\t\tsvg.setAttribute(\"height\", \"12\");\n\t\tsvg.setAttribute(\"viewBox\", \"-2 0 2 10\");\n\t\tsvg.setAttribute(\"class\", \"dg-chip__ellipse-svg\");\n\t\tsvg.style.transform = \"rotate(90deg)\";\n\t\t\n\t\t// Create g element\n\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tg.setAttribute(\"fill-rule\", \"evenodd\");\n\t\t\n\t\t// Create three circle elements\n\t\tconst circle1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n\t\tcircle1.setAttribute(\"cx\", \"1\");\n\t\tcircle1.setAttribute(\"cy\", \"1\");\n\t\tcircle1.setAttribute(\"r\", \"1\");\n\t\t\n\t\tconst circle2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n\t\tcircle2.setAttribute(\"cx\", \"1\");\n\t\tcircle2.setAttribute(\"cy\", \"5\");\n\t\tcircle2.setAttribute(\"r\", \"1\");\n\t\t\n\t\tconst circle3 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n\t\tcircle3.setAttribute(\"cx\", \"1\");\n\t\tcircle3.setAttribute(\"cy\", \"9\");\n\t\tcircle3.setAttribute(\"r\", \"1\");\n\t\t\n\t\t// Assemble the elements\n\t\tg.appendChild(circle1);\n\t\tg.appendChild(circle2);\n\t\tg.appendChild(circle3);\n\t\tsvg.appendChild(g);\n\t\t\n\t\t// Add to parent\n\t\tparentElement.appendChild(svg);\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n\tgetElement():HTMLElement{\n\t\treturn this.getGui();\n\t}\n\n\tdestroy(){\n\t\tthis.getGui().remove();\n\t}\n\n\treRender():void{\n\t\tthis.controller.setRendererDetails();\n\t}\n}\n","import { BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { CorePopupHandler } from \"../../../../utility/PopupHandler/CorePopupHandler\";\n\n@Bean(BEAN_NAME.POPUP_HANDLER)\nexport class PopupHandler extends CorePopupHandler {\n   \n}","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { SELECT_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { ISelectInputHandler } from \"./select-input-handler\";\nimport { ISelectDataPart } from \"./select-ds\";\nimport { ISelectDropdownInteractor } from \"../../../../selectInteractor/selectDropdownInteractor\";\nimport { ISelectConfigAPI } from \"./select-configApi\";\nimport { ICustomRenderer, ISelectConfiguration, Intiator, SelectOptionElementModel } from \"../../select-configuration-types/select_configuration\";\nimport { DropdownOptionElementModel } from \"../../../../dropdown/dropdown_configuration\";\nimport { ISelectOptionHandler } from \"./select-option-handler.types\";\n\n\nexport interface ISelectInputAPI{\n    openDropdown():void;\n    closeDropdown(focus?:boolean):void;\n    closeDropdownWithoutCellFocus():void;\n    isDropdownOpened():boolean;\n    toggleDropdown():void;\n    clear():void;\n    select(option:SelectOptionElementModel,initiator ?: Intiator):void;\n    deselect(id:string  ,initiator ?: Intiator):void;\n    selectAllOption(initiator ?: Intiator):void;\n    deselectAllOption(initiator ?: Intiator):void;\n    getSelectedOptions():DropdownOptionElementModel[];\n    // getSelectedValues() : string[]\n    getSelectedIDs() : string[];\n    getFormattedValue():string;\n    getSelectedChipDoms(): Record<string, HTMLElement | undefined>\n\n\n    focus():void;\n    blur():void;\n    enable():void;\n    disable():void;\n    destroy():void;\n    validate():void;\n    getValue():string[];\n    setValue(options : SelectOptionElementModel[]):void;\n    updateProperties(properties: ISelectConfiguration): void\n    getElement() : HTMLElement;\n    reset():void;\n\n\n    getPlusIconDOM() : HTMLElement | undefined;\n    addOptions(options :DropdownOptionElementModel[],selectOption : boolean):void;\n    removeOptions(options :DropdownOptionElementModel[]):void;\n    setSelectBoxIcon(selectBoxIconRenderer ?: { new (...args: any[]): ICustomRenderer }, selectBoxIconRendererParams     ?: object):void;\n    search(value:string):void\n    updateOption(option : DropdownOptionElementModel):void\n    reOrderOptions(IdsOrder : string[]):void\n\n    showErrorMessage(message ?: string) : void;\n    hideErrorMessage() : void;\n}\n\n@Bean(SELECT_BEAN_NAME.SELECT_API)\nexport class SelectInputAPI extends EventEmitter implements ISelectInputAPI {\n\n    @AutoWired('configuration') configuration!: ISelectConfiguration;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n    @AutoWired(\"SelectDataPart\") protected SelectDataPart !: ISelectDataPart;\n    @AutoWired(\"SelectConfigAPI\") protected selectConfigAPI !: ISelectConfigAPI;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n\n    handleClickBound: EventListener | null = null;\n\n\n\n    openDropdown():void{\n        this.selectInputHandler?.getSelectInputWrapper()?.openDropdown();\n        this.addCloseDropdownEvent();\n    }\n\n    closeDropdown(focus?: boolean):void{\n       this.selectInputHandler?.getSelectInputWrapper()?.closeDropdown(focus);\n       this.removeCloseDropdownEvent();\n    }\n\n    closeDropdownWithoutCellFocus():void{\n        this.selectInputHandler?.getSelectInputWrapper()?.closeDropdown(false);\n        this.removeCloseDropdownEvent();\n    }\n\n    isDropdownOpened():boolean{\n        return this.selectInputHandler?.getSelectInputWrapper()?.isDropdownOpen();\n    }\n\n    toggleDropdown():void{\n        this.selectInputHandler?.getSelectInputWrapper()?.toggleDropdown();\n    }\n\n    clear():void{\n        this.selectInputHandler.getSelectInputWrapper().clearAllOptions('api');\n    }\n\n    select(option:SelectOptionElementModel,initiator:Intiator =  \"API\", updateUI : boolean = true):void{\n        const isSelected  =  this.SelectDataPart.isOptionAdded({id:option.id});\n        if(isSelected){\n            return;\n        }\n\n        const dropdownInteractor  :ISelectDropdownInteractor | null = this.selectInputHandler.getSelectInputWrapper().getSelectDropdownInteractor();\n        if(dropdownInteractor && !(this.configuration.dropdownRenderer)){\n            const dropdown = dropdownInteractor.getInstance();\n            const hasOption = dropdown.api.hasOption(option.id);\n            if(!hasOption) {\n                dropdown.api.addOptions([option]);\n            }\n            dropdown.api.select(option.id,initiator);\n        }\n        else{\n            if(option){\n                const params = {\n                    value : option,\n                    initiator,\n                    updateUI\n                }\n                this.selectConfigAPI.onBeforeSelect(params);\n                this.selectConfigAPI.onAfterSelect(params);\n            }\n        }\n    }\n\n    deselect(optionId:string,initiator:Intiator =  \"API\"):void{\n\n        const isSelected = this.SelectDataPart.isOptionAdded({id: optionId});\n        if(!isSelected){\n            return;\n        }\n        \n        const dropdownInteractor :ISelectDropdownInteractor | null = this.selectInputHandler.getSelectInputWrapper().getSelectDropdownInteractor();\n        if(dropdownInteractor  && !(this.configuration.dropdownRenderer)){\n            const dropdown = dropdownInteractor.getInstance();\n            dropdown.api.deselect(optionId,initiator);\n        }\n        else{\n            const optionModel = this.SelectDataPart.getOption(optionId);\n            if(optionModel){\n                const params = {\n                    value : optionModel,\n                    initiator,\n                    api : this\n                }\n                this.selectConfigAPI.onBeforeDeselect(params);\n                this.selectConfigAPI.onAfterDeselect(params);\n            }\n\n        }\n    }\n\n    selectAllOption(initiator:Intiator = \"API\"):void{\n        const allOptions = this.optionHandler.getOptions();\n        if(!allOptions || allOptions.length === 0){\n            return;\n        }\n\n        // Filter out already selected options\n        const unselectedOptions = allOptions.filter(option => {\n            return !this.SelectDataPart.isOptionAdded({id: option.id});\n        });\n\n        if(unselectedOptions.length === 0){\n            return;\n        }\n\n        const dropdownInteractor :ISelectDropdownInteractor | null = this.selectInputHandler.getSelectInputWrapper().getSelectDropdownInteractor();\n        \n        if(dropdownInteractor && !(this.configuration.dropdownRenderer)){\n            // Handle dropdown interactor path\n            // First, ensure all options are added to dropdown\n            const dropdown = dropdownInteractor.getInstance();\n            const optionsToAdd = unselectedOptions.filter(option => !dropdown.api.hasOption(option.id));\n            if(optionsToAdd.length > 0){\n                dropdown.api.addOptions(optionsToAdd);\n            }\n            \n            // Select all options - dropdown will handle batching internally\n            // But to ensure single rerender, we'll use the config API path with updateUI control\n            unselectedOptions.forEach((option, index) => {\n                const isLastOption = index === unselectedOptions.length - 1;\n                const params = {\n                    value : option,\n                    initiator,\n                    updateUI : isLastOption, // Only update UI on the last option\n                    selectAll : true,\n                    selectAllTriggered : true\n                };\n                this.selectConfigAPI.onBeforeSelect(params);\n                this.selectConfigAPI.onAfterSelect(params);\n            });\n        }\n        else{\n            // Handle config API path - select all options but only update UI once\n            unselectedOptions.forEach((option, index) => {\n                const isLastOption = index === unselectedOptions.length - 1;\n                const params = {\n                    value : option,\n                    initiator,\n                    updateUI : isLastOption, // Only update UI on the last option\n                    selectAll : true,\n                    selectAllTriggered : true\n                };\n                this.selectConfigAPI.onBeforeSelect(params);\n                this.selectConfigAPI.onAfterSelect(params);\n            });\n        }\n    }\n\n    deselectAllOption(initiator:Intiator = \"API\"):void{\n        const selectedOptions = this.SelectDataPart.getSelectedOptions();\n        if(!selectedOptions || selectedOptions.length === 0){\n            return;\n        }\n\n        const hadSelections = selectedOptions.length > 0;\n        this.selectInputHandler.getSelectInputWrapper().clearAllOptions('api');\n        if(this.optionHandler.isMultiple() && hadSelections){\n            const hooksParams = {\n                values: [],\n                initiator: initiator,\n                selectAll: false,\n                selectAllTriggered: false\n            };\n            this.optionHandler.onChange?.(hooksParams);\n        }\n    }\n\n    getSelectedOptions():DropdownOptionElementModel[]{\n        return this.SelectDataPart.getSelectedOptions()\n    }\n\n    // getSelectedValues() : string[]{\n    //     const values:string []  = this.SelectDataPart.getSelectedOptions().map(option => option.value);\n    //     return values;\n    // }\n\n    getSelectedIDs() : string[] {\n        const ids: string[] = this.SelectDataPart.getSelectedOptions()\n            .map(option => option.id) \n            .filter((id): id is string => id !== undefined); \n        return ids;\n    }\n\n    getFormattedValue():string{\n        const isMultiple = this.optionHandler.isMultiple();\n        const values:string []  = this.SelectDataPart.getSelectedOptions().map(option => option.value ?? \"null\");\n        if(isMultiple){\n            return values.join(\",\") ?? \"\";\n        }\n        else{\n            return values[0]?? \"\";\n        }\n    }\n    \n\n    getSelectedChipDoms(): Record<string, HTMLElement | undefined>{\n        if(!this.optionHandler.isOptionAsChip()){\n            return {};\n        }\n        const chipDoms: Record<string, HTMLElement | undefined> = {};\n        const selectedOptions = this.SelectDataPart.getSelectedOptions();\n        selectedOptions.forEach(option => {\n            const id = option.id;\n            chipDoms[id] = this.SelectDataPart.getChipsInstance(option.id)?.api.getElement();\n        });\n        return chipDoms;\n    }\n\n\n     //commom APIS\n\n    getValue():string[]{\n        const ids:string []  = this.SelectDataPart.getSelectedOptions().map(option => option.id ?? \"null\");\n        return ids;\n    }\n\n    setValue(options : SelectOptionElementModel[]):void{\n        this.clear();\n        options.forEach((option, index) => {\n            this.select(option, 'API' , index === (options.length - 1));\n        });\n        \n    }\n\n    focus():void{\n        this.selectInputHandler.getSelectInputWrapper().focus();\n    }\n\n    blur():void{\n        this.selectInputHandler.getSelectInputWrapper().blur();\n    }\n\n    enable():void{\n        this.selectInputHandler.getSelectInputWrapper().enableListener();\n    }\n\n    disable():void{\n        this.selectInputHandler.getSelectInputWrapper().disableListener();\n    }\n\n    destroy():void{\n        this.closeDropdown(false);\n        this.selectInputHandler.getSelectRoot().destroy();\n        this.removeCloseDropdownEvent();\n\n    }\n\n    validate():void{\n        throw new Error(\"method not implemented\");\n    }\n\n\n\n    setProperty(_key:string, _value:any){\n        throw new Error(\"method not implemented\");\n    }\n\n    getProperty(key:string):any{\n        return (this.configuration as any)[key]; \n    }\n\n    getElement() : HTMLElement {\n        return this.selectInputHandler?.getSelectRoot()?.getElement() as HTMLElement;\n    }\n\n    hide(subElements ?: string[]):void{\n        this.closeDropdown();\n        this.selectInputHandler.getSelectRoot()?.hide(subElements);\n    }\n\n    show(subElements ?: string[]):void{\n        this.selectInputHandler.getSelectRoot()?.show(subElements);\n    }\n\n    reset():void{\n        this.clear();\n    }   \n\n    updateProperties(properties: ISelectConfiguration): void {\n        // Iterate over the keys of properties and update configuration\n        // Object.entries(properties).forEach(([key, value]) => {\n        //     if (value !== undefined) {\n        //         (this.configuration as any)[key] = value; \n        //     }\n        // });\n        // this.dispatchEvent({\n        //     type: \"PROPERTY_CHANGED\",\n        //     options: properties,\n        // });\n\n\n\n        Object.entries(properties).forEach(([key, value]) => {\n            if (value !== undefined) {\n                // Update the configuration\n                (this.configuration as Record<string, any>)[key] = value;\n    \n                // Dispatch different events based on the property being updated\n                switch (key) {\n                    \n                    case \"enablePlusIcon\":\n                        this.dispatchEvent({\n                            type: \"EnablePlusIcon_Property_Changed\",\n                            options: { [key]: value },\n                        });\n                        break;\n                    \n                    case \"showDropdownIcon\":\n                        this.dispatchEvent({\n                            type: \"ShowDropdownIcon_Property_Changed\",\n                            options: { [key]: value },\n                        });\n                        break;\n\n                    case \"tooltip\":\n                            this.dispatchEvent({\n                                type: \"Tooltip_Property_Changed\",\n                                options: { [key]: value },\n                            });\n                            break;\n\n                    case \"useElipses\":\n                        this.dispatchEvent({\n                            type: \"UseEllipsis_Property_Changed\",\n                            options: { [key]: value },\n                        });\n                        break;\n                    case \"ellipsesRendererParams\":\n                        this.configuration.ellipsesRendererParams =  value;\n                        break;\n                    \n                    case \"selectBoxIconRenderer\":\n                        this.configuration.selectBoxIconRenderer = value;\n                        this.selectInputHandler?.getSelectBoxIcon()?.reRenderIcon();\n                        break;\n\n                    case \"selectBoxIconRendererParams\":\n                        this.configuration.selectBoxIconRendererParams = value;\n                        this.selectInputHandler?.getSelectBoxIcon()?.reRenderIcon();\n                        break;\n                    case \"placeholder\":\n                        this.configuration.placeholder = value;\n                        this.dispatchEvent({\n                            type : \"EVENT_PLACEHOLDER_CHANGED\"\n                        })\n                        break;\n                    case \"selectedIndex\":\n                     \n                            this.dispatchEvent({\n                                type : 'EVENT_DATA_UPDATED'\n                            })\n                        \n                        break;\n\n                    // Add additional cases for other properties as needed\n                    default:\n                        this.dispatchEvent({\n                            type: \"PROPERTY_CHANGED\",\n                            options: { [key]: value },\n                        });\n                        break;\n            }\n            }\n        });\n    }\n\n\n    addCloseDropdownEvent(){\n        \n        this.handleClickBound = this.handlerCloseDropdown.bind(this);\n        document.addEventListener('click',(event:any)=>{\n            event.stopPropagation();\n            this.handleClickBound\n        });\n    }\n\n    removeCloseDropdownEvent(){\n        if (this.handleClickBound) {\n            document.removeEventListener('click', this.handleClickBound);\n            this.handleClickBound = null; // Clear the reference\n        }\n    }\n\n\n    handlerCloseDropdown(event : any){\n        event.stopPropagation();\n        const dropdownElement  =  this.getElement() as HTMLElement;\n        if(!event.composedPath().includes(dropdownElement)){\n            this.closeDropdownWithoutCellFocus();\n        }\n    }\n\n\n    getPlusIconDOM() : HTMLElement | undefined{\n        return this.selectInputHandler.getSelectInput().getPlusIconDom() ?? undefined;\n    }\n\n\n    addOptions(options :DropdownOptionElementModel[],selectOption: boolean = true):void{\n        this.selectInputHandler.getSelectInput().addOptions(options,selectOption);\n    }\n\n    removeOptions(options :DropdownOptionElementModel[]):void{\n        this.selectInputHandler.getSelectInput().removeOptions(options);\n\n    }\n\n    setSelectBoxIcon(selectBoxIconRenderer ?:{ new (...args: any[]): ICustomRenderer } , selectBoxIconRendererParams     ?: object){\n        this.configuration.selectBoxIconRenderer = selectBoxIconRenderer;\n        this.configuration.selectBoxIconRendererParams = selectBoxIconRendererParams;\n        this.selectInputHandler?.getSelectBoxIcon()?.reRenderIcon();\n    }\n\n    getEllipsesIcon():HTMLElement{\n        return this.selectInputHandler.getSelectInput().getEllipsesIcon();\n    }\n\n    search(value:string):void{\n        this.openDropdown();\n        this.selectInputHandler.getDropdownInteractor()?.onSearch(value)\n    }\n\n    updateOption(option : DropdownOptionElementModel):void{\n        this.selectInputHandler.getSelectInput().updateOption(option);\n    }\n\n    reOrderOptions(IdsOrder : string[]):void{\n        if(!IdsOrder || IdsOrder.length <2){\n            return;\n        }\n        this.closeDropdown();\n        this.SelectDataPart.reOrderOptions(IdsOrder);\n    }\n\n    showErrorMessage(message ?: string): void {\n        message && this.optionHandler.updateValidationMessage(message);\n        this.optionHandler.updateStatus('error');\n    }\n\n    hideErrorMessage(): void {\n        this.optionHandler.updateValidationMessage(\"\");\n        this.optionHandler.updateStatus(\"none\");\n    }\n\n    disableOptions(optionsIds : string[]) : void {\n         this.selectInputHandler.getSelectInput().setOptionsDisabled(optionsIds, true);\n    }   \n\n    enableOptions(optionIds : string[]) : void {\n        this.selectInputHandler.getSelectInput().setOptionsDisabled(optionIds, false);\n    }\n}\n","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport {SELECT_BEAN_NAME} from \"../../constants/beanname-constant\"\nimport {ICustomRenderer, ISelectConfiguration, SelectOptionElementModel} from \"../../select-configuration-types/select_configuration\"\nimport {ISelectOptionHandler} from \"./select-option-handler.types\"\nimport { Position } from \"../../../../utility/PopupHandler/CorePopupHandler\";\nimport { ISelectDataPart } from \"./select-ds\";\nimport { ISelectInputHandler } from \"./select-input-handler\";\nimport { ISelectInputAPI } from \"./select-api\";\nimport { SelectAllEventParams } from \"../../../../dropdown/dropdown_configuration\";\n\n\nexport interface ISelectConfigAPI {\n    getConfiguration(): ISelectConfiguration;\n    getAppendTo(): HTMLElement ;\n    getSelectInputWrapper():HTMLElement\n    setAppendTo(appendTo : HTMLElement): void;\n    getDropdownAppendTo(): HTMLElement;\n    getOptions(): SelectOptionElementModel[] | undefined;\n    isMultiple(): boolean;\n    getSelectedData(): string[];\n    getSelectionLimit(): number | undefined;\n    isCloseOnSelect(): boolean;\n    getDropdownPosition(): Position | undefined;\n    isSearchable(): boolean;\n    getSearchBoxPlaceholder(): string; \n    isVirtualList(): boolean;\n    isSortEnabled(): boolean;\n    getSortOrder(): 'asc' | 'desc' | undefined;\n    isGroupByEnabled(): boolean;\n    isSelectAllButtonEnabled(): boolean;\n    isClearableButtonEnabled(): boolean;\n    isDisabled(): boolean;\n    isReadOnly(): boolean;\n    getPlaceholder(): string | undefined;\n    getValidation(): ((value: any) => boolean) | undefined;\n    isRequired(): boolean;\n    isOptionAsChip(): boolean;\n    getLabel(): string | undefined;\n    getHelperText(): string | undefined;\n    isCreateNewOptionEnabled():boolean;\n    // isAddCollaboratorEnabled(): boolean;\n    isNoneOptionEnabled():boolean;\n    getGapX():number;\n    getGapY():number;\n    getDropdownRenderer(): { new (...args: any[]): ICustomRenderer } | undefined\n    getDropdownRendererParams(): object | undefined;\n    getDropdownFooterRenderer(): { new (...args: any[]): ICustomRenderer } | undefined\n    getDropdownFooterRendererParams(): object | undefined;\n    getDropdownHeaderRenderer():  { new (...args: any[]): ICustomRenderer } | undefined\n    getDropdownHeaderRendererParams(): object | undefined\n    getCreateNewOptionRenderer(): { new (...args: any[]): ICustomRenderer } | undefined;\n    getCreateNewOptionRendererParams(): object | undefined;\n    getNoOptionRenderer(): { new (...args: any[]): ICustomRenderer } | undefined;\n    getNoOptionRendererParams(): object | undefined;\n    isautoFocusSelectedOptionEnabled(): boolean \n\n    shouldShowTooltip(): boolean;\n    getTooltipMessage(): string;  \n    getTooltipRegex(): RegExp | undefined;\n    getTooltipPosition(): Position;\n    getTooltipAppendto(): HTMLElement | undefined;\n    getTooltipHideDelay(): number;\n\n    \n    // Event handlers\n    onBeforeDropdownOpen(): void;\n    onAfterDropdownOpen(): void;\n    onBeforeDropdownClose(focus?:boolean): void;\n    onAfterDropdownClose(): void;\n    onBeforeSelect(params: any): boolean;\n    onAfterSelect(params: any): void;\n    onBeforeDeselect(params: any): boolean;\n    onAfterDeselect(params: any): void;\n    onChange(params:any): void;\n    onCreateOption(newOption:any):void;\n    onBeforeCreateOption(option:any): any;\n    onAfterCreateOption(option:any): any\n    onKeydown(event:KeyboardEvent):void;\n\n    getAriaLabelledby(): string;\n    getDropdownClassname(): string | string[] ;\n\n    getModel() : 'local' | 'remote';\n\n    onSelectAll(params : SelectAllEventParams) : void; \n    onBeforeSelectAll(params : SelectAllEventParams) : boolean; \n    onAfterSelectAll(params : SelectAllEventParams) : void; \n\n}\n\n@Bean(\"SelectConfigAPI\")\nexport class SelectConfigAPI extends EventEmitter  implements  ISelectConfigAPI{\n\n    @AutoWired(SELECT_BEAN_NAME.SELECT_CONFIGURATION) configuration!: ISelectConfiguration;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n    @AutoWired(\"SelectDataPart\") protected selectDataPart !: ISelectDataPart;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n    @AutoWired(SELECT_BEAN_NAME.SELECT_API) protected selectApi !: ISelectInputAPI;\n\n    getConfiguration(): ISelectConfiguration {\n        return this.configuration;\n    }\n\n    getAppendTo(): HTMLElement {\n        return  this.selectInputHandler.getSelectRoot().getElement()  ?? this.optionHandler.getAppendTo() as HTMLElement;\n    }\n\n    getSelectInputWrapper():HTMLElement{\n        return this.selectInputHandler.getSelectInputWrapper().getElement()\n    }\n\n    setAppendTo(appendTo : HTMLElement) {\n            this.configuration.appendTo  = appendTo;\n    }\n\n    getDropdownAppendTo(): HTMLElement {\n        return this.configuration.dropdownAppendTo ?? document.body;\n    }\n\n    getOptions(): SelectOptionElementModel[] | undefined {\n        return this.configuration.options;\n    }\n\n    isMultiple(): boolean {\n        return this.configuration.multiple ?? false;\n    }\n\n    getSelectedData() : string[] {\n        return this.selectDataPart.getSelectedOptions().map((data) => data.id);\n        // return this.configuration.selectedIndex;\n    }\n\n    getSelectionLimit(): number | undefined {\n        return this.configuration.selectionLimit;\n    }\n\n    isCloseOnSelect(): boolean {\n        return this.configuration.closeOnSelect ?? false;\n    }\n\n    getDropdownPosition(): Position | undefined {\n        return this.configuration.dropdownPosition ?? Position.bottomLeft;\n    }\n\n    isSearchable(): boolean {\n        return this.configuration.searchable ?? false;\n    }\n\n    getSearchBoxPlaceholder(): string {\n        return this.configuration.searchBoxPlaceholder ?? '';\n}\n\n    isVirtualList(): boolean {\n        return this.configuration.virtualList ?? false;\n    }\n\n    isSortEnabled(): boolean {\n        return this.configuration.sort ?? false;\n    }\n\n    getSortOrder(): 'asc' | 'desc' | undefined {\n        return this.configuration.sortOrder;\n    }\n\n    isGroupByEnabled(): boolean {\n        return this.configuration.groupBy ?? false;\n    }\n\n    isSelectAllButtonEnabled(): boolean {\n        return this.configuration.selectAllButton ?? false;\n    }\n\n    isClearableButtonEnabled(): boolean {\n        return this.configuration.clearable ?? false;\n    }\n\n\n    isDisabled(): boolean {\n        return this.configuration.disabled ?? false;\n    }\n\n    isReadOnly(): boolean {\n        return this.configuration.readonly ?? false;\n    }\n\n    getPlaceholder(): string | undefined {\n        return this.configuration.placeholder;\n    }\n\n    getValidation(): ((value: any) => boolean) | undefined {\n        return this.configuration.validation;\n    }\n\n    isRequired(): boolean {\n        return this.configuration.required ?? false;\n    }\n\n    isOptionAsChip(): boolean {\n        return this.configuration.optionAsChip?? false;\n    }\n\n    getLabel(): string | undefined {\n        return this.configuration.label;\n    }\n\n    getHelperText(): string | undefined {\n        return this.configuration.helpertext;\n    }\n\n    isCreateNewOptionEnabled():boolean{\n        return this.configuration.enableCreateNewOption?? false;\n    }\n\n    // isAddCollaboratorEnabled(): boolean {\n    //     return this.configuration.enableAddCollaborator ?? false;\n    // }\n\n    isNoneOptionEnabled():boolean{\n        return this.configuration.enableNoneOption ?? false;\n    }\n\n\n\n    // Event handlers\n    onBeforeDropdownOpen(): void {\n        this.configuration.onBeforeDropdownOpen?.();\n    }\n\n    onAfterDropdownOpen(): void {\n        this.configuration.onAfterDropdownOpen?.();\n    }\n\n    onBeforeDropdownClose(focus?:boolean): void {\n        this.configuration.onBeforeDropdownClose?.();\n        this.selectApi.closeDropdown(focus);\n    }\n\n    onAfterDropdownClose(): void {\n        this.configuration.onAfterDropdownClose?.();\n    }\n\n    onBeforeSelect(params : any): boolean {\n\n        const option =  params.value\n        if(this.isSelectedOptionIncluded(option)){\n\n            const value = this.configuration.onBeforeSelect?.(params) ?? true;\n\n            if(value) {\n                if(this.optionHandler.isMultiple()){\n                    this.dispatchEvent({\n                        type : \"updateMultiSelectData\",\n                        // value : option,\n                        params : params\n        \n                    });\n                }\n                else{\n                    this.dispatchEvent({\n                        type : \"updateSingleSelectData\",\n                        // value : option,\n                        params : params\n                    });\n                }\n            }\n            return value;\n        }\n\n        return true;\n\n    }\n    onAfterSelect(params : any): void {\n        const option = params.value;\n        this.isSelectedOptionIncluded(option) &&  this.configuration.onAfterSelect?.(params);\n    }\n\n    onBeforeDeselect(params : any): boolean {\n\n        const option = params.value;\n\n        if(this.isSelectedOptionIncluded(option)){\n\n            const value = this.configuration.onBeforeDeselect?.(params) ?? true;\n\n            if(value) {\n                if(this.optionHandler.isMultiple()){\n                    this.dispatchEvent({\n                        type : \"updateMultiSelectData\",\n                        // value : option,\n                        params : params,\n                    });\n                }\n                else{\n                    this.dispatchEvent({\n                        type : \"clearSingleSelectData\",\n                        // value : option,\n                        params : params,\n                        initator : 'api'\n                    });\n                }\n            }\n\n            return value;\n            \n        }\n        return true;\n        // if(this.isSelectedOptionIncluded(option)){\n        //     this.configuration.onBeforeDeselect?.(option);\n        // }\n    }\n\n    onAfterDeselect(params : any): void {\n \n     this.configuration.onAfterDeselect?.(params);\n    //     if(this.isSelectedOptionIncluded(option)){ \n\n    //         if(this.optionHandler.isMultiple()){\n    //             this.dispatchEvent({\n    //                 type : \"updateMultiSelectData\",\n    //                 value : option\n    \n    //             });\n    //         }\n    //         else{\n    //             this.dispatchEvent({\n    //                 type : \"clearSingleSelectData\",\n    //                 value : option\n    //             });\n    //         }\n    //         this.configuration.onBeforeDeselect?.(option);\n    // }\n    }\n\n    onChange(params:any): void {\n        this.configuration.onChange?.(params);\n    }\n\n    onCreateOption(newOption: any) {\n        this.configuration.onCreateOption?.(newOption);\n    }\n\n    onBeforeCreateOption(option:any): any{\n        return this.configuration.onBeforeCreateOption?.(option) ?? true;\n    }\n    onAfterCreateOption(option:any) :any{\n        return this.configuration.onAfterCreateOption?.(option) ?? true;\n    }\n\n    onKeydown(event:KeyboardEvent):void{\n        this.configuration.onKeydown?.(event);\n    }\n\n    getAriaLabelledby():string{\n        return this.configuration.ariaLabelledby ?? \"label\";\n    }\n\n    getModel(): \"local\" | \"remote\" {\n        return this.configuration.model ?? \"local\";\n    }\n\n    private isSelectedOptionIncluded(_selectedOption:SelectOptionElementModel): boolean {\n        return true;    \n     }\n\n     getGapX():number{\n        return this.optionHandler.getGapX();\n     }\n\n     getGapY():number{\n        return this.optionHandler.getGapY();\n     }\n\n\n     getDropdownRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.optionHandler.getDropdownRenderer();\n    }\n\n    getDropdownRendererParams(): object | undefined {\n        return this.optionHandler.getDropdownRendererParams();\n    }\n\n    getDropdownFooterRenderer(): { new (...args: any[]): ICustomRenderer } | undefined  {\n        return this.optionHandler.getDropdownFooterRenderer();\n    }\n\n    getDropdownFooterRendererParams(): object | undefined {\n        return this.optionHandler.getDropdownFooterRendererParams();\n    }\n\n    getDropdownHeaderRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.optionHandler.getDropdownHeaderRenderer();\n    }\n\n    getDropdownHeaderRendererParams(): object | undefined {\n        return this.optionHandler.getDropdownHeaderRendererParams();\n    }\n\n    getCreateNewOptionRenderer(): (new (...args: any[]) => ICustomRenderer) | undefined {\n        return this.optionHandler.getCreateNewOptionRenderer();\n    }\n\n    getCreateNewOptionRendererParams(): object | undefined {\n        return this.optionHandler.getCreateNewOptionRendererParams();\n    }\n\n    getNoOptionRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.optionHandler.getNoOptionRenderer();\n    }\n\n    getNoOptionRendererParams(): object | undefined {\n        return this.optionHandler.getNoOptionRendererParams();\n    }\n\n    isautoFocusSelectedOptionEnabled(): boolean { \n        return this.configuration.autoFocusSelectedOption ?? false;\n    }\n\n    shouldShowTooltip(): boolean{\n        return this.configuration.tooltip ?? false;\n    }\n    getTooltipMessage(): string{\n        return this.configuration.tooltipMessage ?? \"\";\n    }\n    getTooltipRegex(): RegExp | undefined{\n        return this.configuration.tooltipRegex;\n    }\n    getTooltipPosition(): Position{\n        return this.configuration.tooltipPosition ?? Position.bottomRight;\n    }\n    getTooltipAppendto(): HTMLElement | undefined{\n        return this.configuration.tooltipAppendto ?? document.body;\n    }\n    getTooltipHideDelay(): number{\n        return this.configuration.tooltipHideDelay ?? 700;\n    }\n\n    getDropdownClassname(): string | string[] {\n        return this.configuration.dropdownClassName ?? '';\n    }\n\n    onSelectAll(params: SelectAllEventParams): void {\n        this.configuration.onSelectAll && this.configuration.onSelectAll(params);\n    }\n\n    onBeforeSelectAll(params: SelectAllEventParams): boolean {\n        return (this.configuration.onBeforeSelectAll && this.configuration.onBeforeSelectAll(params)) ?? true;\n    }\n\n    onAfterSelectAll(params: SelectAllEventParams): void {\n        this.configuration.onAfterSelectAll && this.configuration.onAfterSelectAll(params);\n    }\n\n}\n\n\n\n","import { AutoWired, BEAN_NAME, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { ISelectOptionHandler } from \"./select-option-handler.types\";\nimport { ISelectConfiguration, SelectOptionElementModel } from \"../../select-configuration-types/select_configuration\";\nimport { SELECT_BEAN_NAME } from \"../../constants/beanname-constant\";\n\nexport interface ISelectDataPart {\n    addOption(option: SelectOptionElementModel): void;\n    updateChipInstance(option: SelectOptionElementModel, chipInstance: any): void;\n    deleteOption(option: SelectOptionElementModel): void;\n    isOptionAdded(option: SelectOptionElementModel): boolean;\n    getSelectedOptions(): SelectOptionElementModel[];\n    resetOptions(): void;\n    deleteAllOptions(): void;\n    deleteAllChipInstance(): void;\n    getChipsInstance(chip: string): any;\n    getChipsInstances(): any;\n    deleteChipInstance(option: SelectOptionElementModel): void;\n    getOption(id: string): SelectOptionElementModel | undefined;\n    updateOption(option: SelectOptionElementModel): void;\n    reOrderOptions(OptionIdsOrder: string[]): void;\n    setOptionsDisabled(optionIDs: string[], disabled: boolean): void;\n}\n\n@Bean(\"SelectDataPart\")\nexport class SelectDataPart extends EventEmitter implements ISelectDataPart {\n    selectedOptions!: SelectOptionElementModel[];\n    chipsInstance!: Record<string, any>;\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler!: ISelectOptionHandler;\n    @AutoWired(SELECT_BEAN_NAME.SELECT_CONFIGURATION) configuration!: ISelectConfiguration;\n\n    @PostConstruct()\n    init() {\n        this.selectedOptions = [];\n        this.chipsInstance = {};\n    }\n\n    addOption(option: SelectOptionElementModel): void {\n        if (!this.isOptionAdded(option)) {\n            option.selected = true;\n            this.selectedOptions.push(option);\n        }\n    }\n\n    updateOption(selectedOption: SelectOptionElementModel): void {\n        const index = this.selectedOptions.findIndex(o => o.id === selectedOption.id);\n        if (index !== -1) {\n            this.selectedOptions[index] = selectedOption;\n        }\n\n        const options = this.configuration.options;\n        if (Array.isArray(options)) {\n            const targetOption = options.find(option => option.id === selectedOption.id);\n            if (targetOption) {\n                Object.assign(targetOption, selectedOption);\n            }\n        }\n        \n    }\n\n    updateChipInstance(option: SelectOptionElementModel, chipInstance: any): void {\n        this.chipsInstance[option.id] = chipInstance;\n    }\n\n    deleteOption(option: SelectOptionElementModel): void {\n        const index = this.selectedOptions.findIndex(o => o.id === option.id);\n        if (index !== -1) {\n            option.selected = false;\n            this.selectedOptions.splice(index, 1);\n            delete this.chipsInstance[option.id];\n        }\n    }\n\n    deleteAllOptions(): void {\n        if (this.optionHandler.isMultiple() && this.optionHandler.isOptionAsChip()) {\n            this.deleteAllChipInstance();\n        }\n        this.selectedOptions = [];\n        this.chipsInstance = {};\n    }\n\n    deleteAllChipInstance(): void {\n        this.selectedOptions.forEach(option => {\n            const instance = this.chipsInstance[option.id];\n            if (!instance) return;\n\n            if (option.selectedValueRenderer) {\n                instance?.destroy();\n            } else {\n                instance.api.destroyComponent();\n            }\n        });\n        this.chipsInstance = {};\n    }\n\n    deleteChipInstance(option: SelectOptionElementModel): void {\n        const chipInstance = this.chipsInstance[option.id];\n        if (option.selectedValueRenderer) {\n            chipInstance?.destroy();\n        } else {\n            chipInstance?.api.destroyComponent();\n        }\n        delete this.chipsInstance[option.id];\n    }\n\n    isOptionAdded(option: SelectOptionElementModel): boolean {\n        return this.selectedOptions.some(o => o.id === option.id);\n    }\n\n    getOption(id: string): SelectOptionElementModel | undefined {\n        return this.selectedOptions.find(option => option.id === id);\n    }\n\n    getChipsInstance(optionId: string): any {\n        return this.chipsInstance[optionId];\n    }\n\n    getChipsInstances(): any {\n        return this.chipsInstance;\n    }\n\n    getSelectedOptions(): SelectOptionElementModel[] {\n        return this.selectedOptions;\n    }\n\n    resetOptions(): void {\n        this.selectedOptions = [];\n        this.chipsInstance = {};\n    }\n\n    reOrderOptions(OptionIdsOrder: string[]): void {\n        if (this.configuration.options) {\n            this.configuration.options = [...this.configuration.options].sort(\n                (a, b) => OptionIdsOrder.indexOf(a.id) - OptionIdsOrder.indexOf(b.id)\n            );\n        }\n    }\n\n    setOptionsDisabled(optionIDs: string[], disabled: boolean): void {\n        optionIDs.forEach(id => {\n           const option = this.getOption(id);\n           if(option) {\n                option.disabled = disabled;\n                this.updateOption(option);\n           }\n        })\n    }\n\n\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { Bean } from \"@dg/corecomponent\";\nimport { SelectInputWrapperController } from \"../select-input-wrapper/select-input-wrapper-controller\";\nimport { SelectInputController } from \"../select-input/select-input-controller\";\nimport { SelectContainerController } from \"../select-container/select-container-controller\";\nimport { SelectRootController } from \"../select-root/select-root-controller\";\nimport { ISelectDropdownInteractor } from \"../../../../selectInteractor/selectDropdownInteractor\";\nimport { SelectBoxIconController } from \"../selectbox-icon/selectbox-icon-controller\";\n\nexport interface ISelectInputHandler{\n    registerSelectRoot(selectRootCtrl : SelectRootController) : void ,\n    getSelectRoot() : SelectRootController,\n    registerSelectContainer(selectContainerCtrl : SelectContainerController) : void ,\n    getSelectContainer() : SelectContainerController,\n    registerSelectInputWrapper(selectInputWarpperCtrl : SelectInputWrapperController) : void,\n    getSelectInputWrapper() : SelectInputWrapperController,\n    registerSelectInput(selectInputCtrl : SelectInputController) : void,\n    getSelectInput() : SelectInputController,\n    getDropdownInteractor() : ISelectDropdownInteractor | null,\n    registerSelectBoxIcon(SelectBoxIconCtrl :SelectBoxIconController):void,\n    getSelectBoxIcon() : SelectBoxIconController | null,\n}\n\n@Bean(\"controllerHandler\")\nexport class ControllerHandler extends EventEmitter{\n    private selectRootCtrl !: SelectRootController;\n    private selectContainerCtrl !:  SelectContainerController;\n    private selectInputWarpperCtrl !: SelectInputWrapperController;\n    private selectInputController !: SelectInputController;\n    private selectBoxIconCtrl !: SelectBoxIconController;\n \n\n    registerSelectRoot(selectRootCtrl : SelectRootController) : void {\n        this.selectRootCtrl = selectRootCtrl;\n    }\n    getSelectRoot() : SelectRootController{\n        return this.selectRootCtrl;\n    }\n    \n    registerSelectContainer(selectContainerCtrl : SelectContainerController) : void {\n        this.selectContainerCtrl = selectContainerCtrl;\n    }\n    getSelectContainer() : SelectContainerController{\n        return this.selectContainerCtrl;\n    }\n\n    registerSelectInputWrapper(selectInputWarpperCtrl : SelectInputWrapperController) : void{\n        this.selectInputWarpperCtrl = selectInputWarpperCtrl;\n    }\n\n    getSelectInputWrapper() : SelectInputWrapperController{\n        return this.selectInputWarpperCtrl;\n    }\n\n    registerSelectInput(selectInputCtrl : SelectInputController) : void {\n        this.selectInputController = selectInputCtrl;\n    }\n\n    getSelectInput() : SelectInputController{\n        return this.selectInputController;\n    }\n\n    getDropdownInteractor() : ISelectDropdownInteractor | null{\n        return this.getSelectInputWrapper()?.getSelectDropdownInteractor() ??  null;\n    }\n\n    registerSelectBoxIcon(SelectBoxIconCtrl :SelectBoxIconController):void{\n        this.selectBoxIconCtrl = SelectBoxIconCtrl;\n    }\n\n    getSelectBoxIcon() : SelectBoxIconController{\n        return this.selectBoxIconCtrl;\n    }\n}\n\n","import { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport {SELECT_BEAN_NAME} from \"../../constants/beanname-constant\"\nimport {ICustomRenderer, ISelectConfiguration, SelectOptionElementModel} from \"../../select-configuration-types/select_configuration\"\nimport {IErrorRenderer, ISelectOptionHandler} from \"./select-option-handler.types\"\nimport { Position } from \"../../../../utility/PopupHandler/CorePopupHandler\";\nimport { IRenderer } from \"../../../../date-time-field/src/date-time-configuration.types\";\nimport { IPlaceHolderRendererInterface } from \"../../select-configuration-types/placeholder-renderer.types\";\nimport { ClipboardConfig } from \"../../../../utility/clipboard\";\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class SelectOptionHandler extends EventEmitter implements ISelectOptionHandler {\n\n\n    @AutoWired(SELECT_BEAN_NAME.SELECT_CONFIGURATION)\n    configuration!: ISelectConfiguration;\n\n\tprivate domKey = `_DG_${Math.random().toString()}`;\n\n\n    getDomKey(): string {\n\t\treturn this.domKey;\n\t}\n\n\tgetDomData(element: Node | null, key: string): any {\n        if(!element) {\n            return;\n        }\n        const domData = (element as any)[this.getDomKey()];\n\t\treturn domData ? domData[key] : undefined;\n\t}\n\n\tsetDomData(element: Element, key: string, value: any): any {\n\t\tconst domKey = this.getDomKey();\n\t\tlet domData = (element as any)[domKey];\n\n\t\tif (!domData) {\n\t\t\tdomData = {};\n\t\t\t(element as any)[domKey] = domData;\n\t\t}\n\n\t\tdomData[key] = value;\n\t}\n\n    getConfiguration(): ISelectConfiguration {\n        return this.configuration;\n    }\n\n    getAppendTo(): HTMLElement | undefined {\n        return this.configuration.appendTo;\n    }\n\n    getDropdownAppendTo(): HTMLElement {\n        return this.configuration.dropdownAppendTo ?? document.body;\n    }\n\n    getOptions(): SelectOptionElementModel[] | undefined {\n        return this.configuration.options;\n    }\n\n    isMultiple(): boolean {\n        return this.configuration.multiple ?? false;\n    }\n\n    getSelectedData(): SelectOptionElementModel[] {\n        return this.configuration.selectedOptions ?? [];\n    }\n\n    getSelectionLimit(): number | undefined {\n        return this.configuration.selectionLimit;\n    }\n\n    isCloseOnSelect(): boolean {\n        return this.configuration.closeOnSelect ?? false;\n    }\n\n    getDropdownPosition(): Position | undefined {\n        return this.configuration.dropdownPosition ?? Position.bottomLeft;\n    }\n\n    isSearchable(): boolean {\n        return this.configuration.searchable ?? false;\n    }\n\n    getSearchBoxPlaceholder(): string  {\n        return this.configuration.searchBoxPlaceholder?? '';\n    }\n\n    isVirtualList(): boolean {\n        return this.configuration.virtualList ?? false;\n    }\n\n    isSortEnabled(): boolean {\n        return this.configuration.sort ?? false;\n    }\n\n    getSortOrder(): 'asc' | 'desc' | undefined {\n        return this.configuration.sortOrder;\n    }\n\n    isGroupByEnabled(): boolean {\n        return this.configuration.groupBy ?? false;\n    }\n\n    isSelectAllButtonEnabled(): boolean {\n        return this.configuration.selectAllButton ?? false;\n    }\n\n    isClearableButtonEnabled(): boolean {\n        return this.configuration.clearable ?? false;\n    }\n\n    isDisabled(): boolean {\n        return this.configuration.disabled ?? false;\n    }\n\n    isReadOnly(): boolean {\n        return this.configuration.readonly ?? false;\n    }\n\n    getPlaceholder(): string | undefined {\n        return this.configuration.placeholder;\n    }\n\n    getPlaceHolderRenderer(): { new (...args: any[]): IPlaceHolderRendererInterface } | undefined {\n        return this.configuration.placeHolderRenderer;\n    }\n\n    getPlaceHolderRendererParams(): object | undefined {\n        return this.configuration.placeHolderRendererParams;\n    }\n\n    getValidation(): ((value: any) => boolean) | undefined {\n        return this.configuration.validation;\n    }\n\n    isRequired(): boolean {\n        return this.configuration.required ?? false;\n    }\n\n    getLabel(): string | undefined {\n        return this.configuration.label;\n    }\n\n    getHelperText(): string | undefined {\n        return this.configuration.helpertext;\n    }\n\n    // Event handlers\n    onBeforeDropdownOpen(): void {\n        this.configuration.onBeforeDropdownOpen?.();\n    }\n\n    onAfterDropdownOpen(): void {\n        this.configuration.onAfterDropdownOpen?.();\n    }\n\n    onBeforeDropdownClose(): void {\n        this.configuration.onBeforeDropdownClose?.();\n    }\n\n    onAfterDropdownClose(): void {\n        this.configuration.onAfterDropdownClose?.();\n    }\n\n    onBeforeSelect(option: any): void {\n        this.configuration.onBeforeSelect?.(option);\n    }\n\n    onAfterSelect(option: any): void {\n        this.configuration.onAfterSelect?.(option);\n    }\n\n    onBeforeDeselect(option: any): void {\n        this.configuration.onBeforeDeselect?.(option);\n    }\n\n    onAfterDeselect(option: any): void {\n        this.configuration.onAfterDeselect?.(option);\n    }\n\n    onChange(params:any): void {\n        this.configuration.onChange?.(params);\n    }\n\n    onCreateOption(option :any):any{\n        this.configuration.onCreateOption?.(option);\n    }\n\n    onBeforeCreateOption(option:any): any{\n        return this.configuration.onBeforeCreateOption?.(option) ?? true;\n    }\n    onAfterCreateOption(option:any) :any{\n        return this.configuration.onAfterCreateOption?.(option) ?? true;\n    }\n\n    onFocus():void{\n         this.configuration.onFocus?.();\n    }\n\n    onBlur():void{\n         this.configuration.onBlur?.();\n    }\n\n    onKeydown(event:KeyboardEvent):void{\n        this.configuration.onKeydown?.(event);\n    }\n\n    getAriaLabelledby():string{\n        return this.configuration.ariaLabelledby ?? \"label\";\n    }\n\n    getDescription(): string {\n        return this.configuration.description?? \"\";\n    }\n\n    getDescriptionRenderer(): { new(): IRenderer } | undefined {\n        return this.configuration.descriptionRenderer;\n    }\n\n    getDescriptionRendererParams(): object | undefined {\n        return this.configuration.descriptionRendererParams;\n    }\n\n    getAriaDescribedby(): string {\n\t\treturn this.configuration.ariaDescribedby ?? 'SelectDropdownHelper';\n\t}\n\n    isOptionAsChip(): boolean{\n        return this.configuration.optionAsChip?? false;\n    }\n\n\n    isUseElipses():boolean {\n        return this.configuration.useElipses?? false;\n    }\n\n    getshowEllipsisAfter():number{\n        return ((this.configuration?.showEllipsisAfter ?? 1) - 1) || 0;\n    }\n\n    isCreateNewOptionEnabled():boolean{\n        return this.configuration.enableCreateNewOption?? false;\n    }\n\n    // isAddCollaboratorEnabled(): boolean {\n    //     return this.configuration.enableAddCollaborator?? false;\n    // }\n\n    isNoneOptionEnabled():boolean{\n        return this.configuration.enableNoneOption ?? false;\n    }\n\n    isPlusIconEnabled():boolean{\n        return this.configuration.enablePlusIcon?? false;\n    }\n\n    showDropdownIcon():boolean{\n        return this.configuration.showDropdownIcon?? false;\n    }\n\n    canGenerateEmptyDom():boolean{\n        return this.configuration?.ignoreEmptyDOM !== undefined ? !this.configuration?.ignoreEmptyDOM :false;\n    }\n\n\n    getGapX():number{\n        return this.configuration.horizontalSpacing ?? 0;\n    }\n\n    getGapY(): number {\n        return this.configuration?.verticalSpacing ?? 0;\n    }\n\n    getClassName(): string {\n        return this.configuration?.className ?? '';\n    }\n\n    getDropdownClassName(): string |string[]{\n        return this.configuration.dropdownClassName ?? '';\n    }\n\n    getSelectBoxIconRenderer():  { new (...args: any[]): ICustomRenderer }  | undefined {\n        return this.configuration.selectBoxIconRenderer;\n    }\n\n    getSelectBoxIconRendererParams(): object | undefined {\n        return this.configuration.selectBoxIconRendererParams;\n    }\n\n    getDropdownRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.dropdownRenderer;\n    }\n\n    getDropdownRendererParams(): object | undefined {\n        return this.configuration.dropdownRendererParams;\n    }\n\n    getDropdownFooterRenderer():  { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.dropdownFooterRenderer;\n    }\n\n    getDropdownFooterRendererParams(): object | undefined {\n        return this.configuration.dropdownFooterRendererParams;\n    }\n\n    getDropdownHeaderRenderer():  { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.dropdownHeaderRenderer;\n    }\n\n    getDropdownHeaderRendererParams(): object | undefined {\n        return this.configuration.dropdownHeaderRendererParams;\n    }\n\n    getEllipsesRenderer():  { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.ellipsesRenderer;\n    }\n\n    updateEllipsesRendererParams(params: object): void {\n        this.configuration.ellipsesRendererParams =  {\n            ...this.configuration.ellipsesRendererParams,\n            ...params\n        };\n    }\n\n    getEllipsesRendererParams(): object | undefined {\n        return this.configuration.ellipsesRendererParams;\n    }\n\n    // tool tip related apis started//\n\n    getTooltipMessage(): string  {\n        return this.configuration.tooltipMessage ?? \"\";\n    }\n\n    getTooltipRegex(): RegExp | undefined {\n        return this.configuration.tooltipRegex;\n    }\n\n    getTooltipPosition(): Position  {\n        return this.configuration.tooltipPosition ?? Position.bottomRight;\n    }\n\n    getTooltipAppendto(): HTMLElement | undefined {\n        return this.configuration.tooltipAppendto ?? document.body;\n    }\n\n    getTooltipHideDelay(): number  {\n        return this.configuration.tooltipHideDelay?? 700;\n\n    }\n    shouldShowTooltip(): boolean {\n        return this.configuration.tooltip ?? false;\n\n    }\n\n    // tool tip related apis ended//\n\n    getPlusIconRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.plusIconRenderer;\n    }\n\n    getPlusIconRendererParams(): object | undefined {\n        return this.configuration.plusIconRendererParams;\n    }\n\n    getCreateNewOptionRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.createNewOptionRenderer;\n    }\n\n    getCreateNewOptionRendererParams(): object | undefined {\n        return this.configuration.createNewOptionRendererParams;\n    }\n\n    getNoOptionRenderer(): { new (...args: any[]): ICustomRenderer } | undefined {\n        return this.configuration.noOptionRenderer;\n    }\n\n    getNoOptionRendererParams(): object | undefined {\n        return this.configuration.noOptionRendererParams;\n    }\n\n    isautoFocusSelectedOptionEnabled(): boolean { \n        return this.configuration.autoFocusSelectedOption ?? false;\n    }\n\n    isDropdownOpenPrevented():boolean{\n        return this.configuration.preventDropdownOpen ?? false;\n    }\n\n \n    showErrorState(): boolean {\n        return this.configuration.showErrorState ?? false;\n    }\n\n    getValidationMessage(): string | undefined {\n        return this.configuration.validationMessage ?? undefined;\n    }\n\n    isValid(): boolean {\n        return this.configuration.status === 'error';\n    }\n\n    updateStatus(status : 'error' | \"none\") : void {\n        this.configuration.status = status;\n        this.dispatchEvent({\n            type: \"EVENT_VALUE_UPDATE\",\n            force : true\n        })\n    }\n\n    updateValidationMessage(message : string) : void {\n        this.configuration.validationMessage = message;\n    }\n\n    getValidationMessageRenderer(): (new() => IErrorRenderer) | undefined {\n        return this.configuration.validationMessageRenderer;\n    }\n\n    getValidationMessageRendererParams(): object | undefined {\n        return this.configuration.validationMessageRendererParams;\n    }\n\n    getLabelRenderer() {\n        return this.configuration.labelRenderer;\n    }\n\n    getLabelRendererParams() {\n        return this.configuration.labelRendererParams ?? {};\n    }\n\n    isImageRenderer() : boolean {\n        return this.configuration.isImageRenderer ?? false;\n    }\n\n    getClipboard(): ClipboardConfig {\n        return this.configuration.clipboard;\n    }\n}\n\n\n\n","import {  AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport type { SelectOptionHandler } from \"./select-option-handler\";\n\n\n@Bean('stateManager')\nexport class SelectStateManager extends EventEmitter {\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler !: SelectOptionHandler;\n    isInValid() : boolean {\n        return this.optionHandler.isValid();\n    }\n}","\nimport { AutoWired, BEAN_NAME, Bean, getBeanInstanceByBeanName, } from '@dg/corecomponent';\nimport {ComponentMetadata} from '@dg/corecomponent/ComponentMetadataProvider.js';\nimport {UserComponentHandler} from '@dg/corecomponent/UserComponentHandler.js';\nimport {UserComponentRegistry} from '@dg/corecomponent/UserComponentRegistry.js';\nimport { IComponentDetails } from '../../../../utility/component-detail.types';\nimport { SelectUserComponentHandlerTypes } from './select-user-component-handler.types';\nimport { ILabelUserComponentHandler } from '../../../../label/label.types';\n\nexport const enum PropertyName {\n\tPREFIX_RENDERER          = 'prefixRenderer',\n\tSUFFIX_RENDERER          = 'suffixRenderer',\n\tHELPER_TEXT_RENDERER     = 'helpTextRenderer',\n\tBUTTON_RENDERER          = 'buttonRenderer',\n\tDROPDOWN_OPTION_RENDERER = 'dropdownOptionRenderer',\n\tSELECTED_VALUE_RENDERER  = 'selectedValueRenderer',\n\tICON_RENDERER            = 'iconRenderer',\n\tPLUSICON_RENDERER        = 'plusIconRenderer',\n\tELLIPSES_RENDERER        = 'ellipsesRenderer',\n\tERROR_RENDERER           = 'errorRenderer',\n\tLABEL_RENDERER           = 'labelRenderer'\n\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class SelectUserComponentHandler extends UserComponentHandler implements SelectUserComponentHandlerTypes, ILabelUserComponentHandler{\n\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\n\tgetLabelRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails(item, PropertyName.LABEL_RENDERER, params, PropertyName.LABEL_RENDERER);\n\t}\n\tgetPrefixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.PREFIX_RENDERER, params, PropertyName.PREFIX_RENDERER);\n\t}\n\n    getSuffixRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.SUFFIX_RENDERER, params, PropertyName.SUFFIX_RENDERER);\n\t}\n\n\tgetDescriptionRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.HELPER_TEXT_RENDERER, params, PropertyName.HELPER_TEXT_RENDERER);\n\t}\n\n\tgetErrorRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.ERROR_RENDERER, params, PropertyName.ERROR_RENDERER);\n\t}\n\n\tgetButtonRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.BUTTON_RENDERER, params, PropertyName.BUTTON_RENDERER);\n\t}\n\n\tgetIconRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.ICON_RENDERER, params, PropertyName.ICON_RENDERER);\n\n\t}\n\n\n\tgetPlusIconRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.PLUSICON_RENDERER, params, PropertyName.PLUSICON_RENDERER);\n\n\t}\n\n\tgetEllipsesRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetail( item, PropertyName.ELLIPSES_RENDERER, params, PropertyName.ELLIPSES_RENDERER);\n\n\t}\n\n\n\n\tprotected getComponentDetail( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\t\n\n\tprotected getComponentMeta( item: any, propertyName: PropertyName, _params?: any, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass( this.getComponent(item, propertyName), );\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: any, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.PREFIX_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.HELPER_TEXT_RENDERER:\n\t\t\tcase PropertyName.ERROR_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.BUTTON_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.ICON_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.PLUSICON_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.ELLIPSES_RENDERER:\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\t\n         \n\t\t}\n\t}\n    protected newInstance( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    private getMergeParams(item : any, propertyName : PropertyName, params : any) : any {\n        return {...params, ...this.getUserParams(item, propertyName, params)};\n    }\n\n    private getUserParams(item : any, propertyName : PropertyName, params : any) : any {\n        switch(propertyName) {\n            case PropertyName.PREFIX_RENDERER:\n                return this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.ICON_RENDERER:\n                return this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.PLUSICON_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.ELLIPSES_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tcase PropertyName.LABEL_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n            default:\n                return {};\n        }\n\n    }\n\n    private getUserRendererParams(item : any, params : any) : any {\n        const rendererParams = item.getUserRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n\tgetHelperTextRendererDetails(item: any, params?: any) : IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.HELPER_TEXT_RENDERER, params, PropertyName.HELPER_TEXT_RENDERER);\n\t}\n\n\tgetDropdownOptionRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.DROPDOWN_OPTION_RENDERER, params, PropertyName.DROPDOWN_OPTION_RENDERER)\n\t}\n\tgetSelectedValueRendererDetails(item: any, params?: any): IComponentDetails | undefined {\n\t\treturn this.getComponentDetails( item, PropertyName.SELECTED_VALUE_RENDERER, params, PropertyName.SELECTED_VALUE_RENDERER)\n\t}\n\n}\n","\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n// import { composeClasses } from \"@dg/utils\";\n// import { getRadioUtilityClass } from \"../rating-utils/rating-classes\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { SelectUserComponentHandlerTypes } from \"../model/select-user-component-handler.types\";\nimport { ISelectOptionHandler } from \"../model/select-option-handler.types\";\nimport { PlusIconComponentType } from \"./plus-icon.types\";\nimport { ISelectInputHandler } from \"../model/select-input-handler\";\nimport { SELECT_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { ISelectInputAPI } from \"../model/select-api\";\n// import { IRatingUserComponentHandler } from \"../model/rating-user-component-handler.types\";\n\n\n\n// const useUtilityClasses = () => {\n// \tconst slots = {\n// \t\troot: {\n// \t\t\tslot: '',\n// \t\t\tmodifiers: [\n\t\t\t\t\n// \t\t\t],\n// \t\t},\n// \t};\n\n// \treturn composeClasses(slots, getSelectRootUtilityClass);\n// };\n\n\n\n\nexport class PlusIconController extends EventEmitter {\n    private component !: PlusIconComponentType\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: SelectUserComponentHandlerTypes;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n    @AutoWired(SELECT_BEAN_NAME.SELECT_API) selectAPI !: ISelectInputAPI;\n\n    setComponent(component : PlusIconComponentType){\n        this.component = component;\n        this.applyClassNames();\n        this.setRendererDetails();\n        this.registerEventHandlers();\n\n        // this.selectInputHandler.registerSelectBoxIcon(this);\n    }\n\n    private registerEventHandlers(){\n        const plusIcon = this.component.getElement();\n        if(plusIcon && !this.optionHandler.isReadOnly()){\n            plusIcon.addEventListener(\"click\",()=>this.selectAPI.toggleDropdown());\n        }\n    }\n\n    private applyClassNames(){\n\t\tthis.component.getElement().classList.add(\"dg-plus-icon\");\n    }\n\n    setRendererDetails() : void {\n        \n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails     = this.userComponentHandler.getPlusIconRendererDetails(rendererWrapper, params) as IComponentDetails;\n        // this.isInValid = inValid;\n        this.component.setRendererDetails(userDetails);\n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionHandler.getPlusIconRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionHandler.getPlusIconRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionHandler.getPlusIconRenderer(),\n            parentElement  :  this.component.getElement(),\n\t\t};\n    }\n\n    reRenderIcon():void{\n        this.setRendererDetails();\n    }\n    getProperty(){\n\n    }\n\n    getElement(){\n        return this.component.getElement();\n    }\n\n     destroy(): void {\n      this.component.destroy();  \n    }\n\n\n}","\n\n\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { PlusIconComponentType } from \"./plus-icon.types\";\nimport { PlusIconController } from \"./plus-icon-controller\";\n\n\nconst PlusIconComponentTemplate = (_property : any)=>{\n    const plusIconcomp =  document.createElement('div');\n    return plusIconcomp;\n}\n\nexport class PlusIconComponent extends Component {\n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    @PostConstruct()\n    init() {\n        const comp : PlusIconComponentType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails : (rendererDetails: IComponentDetails)=>this.setRendererDetails(rendererDetails),\n\t\t\tdestroy : () => this.destroyRenderer(),\n        }\n\n        const controller = this.createBean(new PlusIconController());\n        const property = controller.getProperty()\n        this.setTemplate(PlusIconComponentTemplate(property))\n        controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tthis.insertValueWithoutCellRenderer()\n\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\t\tprivate insertValueWithoutCellRenderer() {\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\t\t\n\t\t// Create SVG element with namespace\n\t\tconst svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tsvg.setAttribute(\"width\", \"14px\");\n\t\tsvg.setAttribute(\"height\", \"14px\");\n\t\tsvg.setAttribute(\"viewBox\", \"-1 -1 15 15\");\n\t\tsvg.setAttribute(\"class\", \"dg-plus-icon-svg\");\n\t\t\n\t\t// Create first g element (Layer 2)\n\t\tconst g1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tg1.setAttribute(\"data-name\", \"Layer 2\");\n\t\t\n\t\t// Create second g element (Fill Icon)\n\t\tconst g2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tg2.setAttribute(\"data-name\", \"Fill Icon\");\n\t\t\n\t\t// Create first path element (plus icon)\n\t\tconst path1 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n\t\tpath1.setAttribute(\"d\", \"M10.5 5.75H7.25V2.5a.75.75 0 00-1.5 0v3.25H2.5a.75.75 0 000 1.5h3.25v3.25a.75.75 0 001.5 0V7.25h3.25a.75.75 0 000-1.5z\");\n\t\t\n\t\t// Create second path element (transparent background)\n\t\tconst path2 = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n\t\tpath2.setAttribute(\"fill\", \"none\");\n\t\tpath2.setAttribute(\"d\", \"M0 0h13v13H0z\");\n\t\t\n\t\t// Assemble the elements\n\t\tg2.appendChild(path1);\n\t\tg2.appendChild(path2);\n\t\tg1.appendChild(g2);\n\t\tsvg.appendChild(g1);\n\t\t\n\t\t// Add to parent\n\t\tparentElement.appendChild(svg);\n\t}\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n\tgetElement():HTMLElement{\n\t\treturn this.getGui();\n\t}\n\n\tdestroy(){\n\t\tthis.getGui().remove();\n\t}\n\n}\n","import {SelectContainerCompType} from \"./select-container-types\"\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { ISelectInputHandler } from \"../model/select-input-handler\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { composeClasses } from \"@dg/utils\";\nimport { ISelectOptionHandler } from \"../model/select-option-handler.types\";\nimport { ISelectDataPart } from \"../model/select-ds\";\nimport { PopupHandler } from \"../model/popup-handler\";\nimport { getSelectRootUtilityClass } from \"../select-root/select-root-classes\";\n\nconst useUtilityClasses = () =>{\n    const slots ={\n        root : {\n            slot : 'container',\n            modifiers:[\n            ],\n        },\n\n    };\n    return composeClasses(slots, getSelectRootUtilityClass);\n}\n\nexport class SelectContainerController extends EventEmitter{\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n    @AutoWired(\"SelectDataPart\") protected selectDataPart !: ISelectDataPart;\n    @AutoWired(BEAN_NAME.POPUP_HANDLER) protected popupHandler !: PopupHandler;\n    \n    private comp!: SelectContainerCompType\n\n    setComponent(component: SelectContainerCompType): void {\n        this.comp = component;\n        this.applyClasses();\n        this.selectInputHandler.registerSelectContainer(this);\n    }\n\n    private applyClasses() : void {\n        const classes = useUtilityClasses();\n        this.comp.addOrRemoveCssClass(classes.root);\n        this.comp.getGui().classList.add('dg-field__container');\n    }\n\n    getProperty(): any{\n        return {\n            isDisabled : ()=>this.optionHandler.isDisabled(),\n            isReadOnly : ()=>this.optionHandler.isReadOnly(),\n            isClearable : ()=>this.optionHandler.isClearableButtonEnabled(),\n            getLabel : ()=>this.optionHandler.getLabel(),\n            isRequired : ()=>this.optionHandler.isRequired(),\n            getDescription : ()=>this.optionHandler.getDescription(),\n\n        }\n    }\n\n    getParamsProperty(){\n        return {\n            label : {\n\t\t\t\tgetLabelClasses :()=> \"dg-selectbox__label\",\n\t\t\t\tgetLabelTitleClasses :()=> \"dg-selectbox__label-title\"\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-selectbox__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-selectbox__description\"\n\n\n\t\t\t}\n        };\n    }\n\n    getElement() : HTMLElement | undefined {\n        return this.comp?.getGui();\n    }\n\n    hide(){\n        const compGui = this.comp?.getGui();\n        if (compGui) {\n          compGui.style.display = 'none';\n        }\t\n\t}\n\n\tshow(){\n        const compGui = this.comp?.getGui();\n        if (compGui) {\n          compGui.style.display = 'flex';\n        }\t\n\t}\n\n    \n}","import {Component} from \"@dg/corecomponent/Component.js\";\nimport {PostConstruct} from \"@dg/corecomponent\"\nimport { SelectContainerController } from \"./select-container-controller\";\nimport { SelectContainerCompType } from \"./select-container-types\";\n \n\n\nfunction getTemplate(_props :any) {\n\t// const label = props.getLabel();\n\t// const description = props.getDescription();\n\tconst selectWrapper = document.createElement(\"select-input-wrapper\");\n\treturn selectWrapper;\n}\n\nfunction rootTemplate(props :any){\n\tconst root =  document.createElement(\"div\");\n\t// const fragment = document.createDocumentFragment();\n\t// fragment.appendChild(getTemplate(props))\n\troot.appendChild(getTemplate(props));\n\treturn root\t\n}\n\n\nexport class SelectContainerComponent extends Component{\n\n\tprivate appendTo: HTMLElement | null;\n\tconstructor(appendTo : HTMLElement){\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst component :SelectContainerCompType ={\n\t\t\tgetGui : () =>this.getGui(),\n\t\t\taddOrRemoveCssClass : (className :string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className),\n\t\t}\n\n\t\tconst controller  =  this.createManagedBean(new SelectContainerController());\n\t\tconst props =  controller.getProperty();\n\t\tconst root = rootTemplate(props);\n\t\tconst paramsProperty = controller.getParamsProperty();\n\t\tthis.setTemplate(root,{\n\t\t\tlabel : paramsProperty.label,\n\t\t\tdescription :  paramsProperty.description\n\t\t});\n\t\tcontroller.setComponent(component);\n\t\tthis.appendTo && this.appendElementIntoUserDom();\n\n\t}\n\n\tprivate addOrRemoveCSSClass(className : string ): void{\n\t\tconst element = this.getGui();\n\t\telement && (element.className =  className);\n\t}\n\n\tprivate appendElementIntoUserDom() :void{\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(()=>{\n\t\t\tthis.appendTo?.remove();\n\t\t\tthis.appendTo = null;\n\t\t})\n\t}\n\n\n}","import { SelectInputWrapperCompType} from \"./select-input-wrapper-types\"\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { setAriaDisabled, setAriaExpanded, setAriaLabel, setAriaRole } from \"@dg/corecomponent\";\nimport { ISelectInputHandler } from \"../model/select-input-handler\";\nimport { composeClasses } from \"@dg/utils\";\nimport { ISelectOptionHandler } from \"../model/select-option-handler.types\";\nimport { ISelectDataPart } from \"../model/select-ds\";\nimport { PopupHandler } from \"../model/popup-handler\";\nimport { ISelectDropdownInteractor, SelectDropdownInteractor } from \"../../../../selectInteractor/selectDropdownInteractor\";\nimport { ISelectConfigAPI } from \"../model/select-configApi\";\nimport { AbstractController } from \"../../../../utility/abstract-controller\";\nimport { getSelectRootUtilityClass } from \"../select-root/select-root-classes\";\nimport { SELECT_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { ISelectInputAPI } from \"../model/select-api\";\nimport { registerClipboardGuards } from \"../../../../utility/clipboard\";\n\nconst useUtilityClasses = (ownerState : any) =>{\n    const {disabled, readonly} = ownerState;\n    const slots ={\n        root : {\n            slot : 'input-wrapper',\n            modifiers:[\n                disabled && 'disabled',\n                readonly &&'readonly',\n            ],\n        },\n\n    };\n    return composeClasses(slots, getSelectRootUtilityClass);\n}\n\nexport class SelectInputWrapperController extends AbstractController<SelectInputWrapperCompType>{\n\n    static DOM_KEY = '_DG_SELECT_INPUT_WRAPPER';\n\n    private domKey = `_DG_${Math.random().toString()}`;\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n    @AutoWired(\"SelectDataPart\") protected selectDataPart !: ISelectDataPart;\n    @AutoWired(BEAN_NAME.POPUP_HANDLER) protected popupHandler !: PopupHandler;\n    @AutoWired(\"SelectConfigAPI\")  selectConfigAPI !: ISelectConfigAPI;\n    @AutoWired(SELECT_BEAN_NAME.SELECT_API)  selectAPI !: ISelectInputAPI;\n    \n    private comp!: SelectInputWrapperCompType\n    private selectDropdownInteractor !: ISelectDropdownInteractor | null;\n    private clearAllComp !: HTMLElement | null;\n    parentComp :any;\n    private resizeObserver: ResizeObserver | null = null;\n\n    setComponent(component: SelectInputWrapperCompType): void {\n        this.comp = component;\n        this.selectInputHandler.registerSelectInputWrapper(this);\n        this.applyClasses();\n        this.setTabindex()\n        this.setAriaAttributes();\n        this.registerEvents();\n        this.registerKeyboardEvents();\n        this.registerParentComp();\n        this.optionHandler.setDomData(component.getGui(), SelectInputWrapperController.DOM_KEY, this.domKey);\n    }\n\n    private setTabindex():void{\n        if(!this.optionsHandler.isDisabled()){\n            const element = this.comp.getGui();\n            element?.setAttribute('tabindex','0')\n        }else{\n            const element = this.comp?.getGui();\n            element?.removeAttribute('tabindex')\n        }\n    }\n    registerParentComp():void{\n       this.parentComp= this.comp.getParentComponent();\n    }\n\n    setClearAllComp(clearAllComp: HTMLElement |null): void {\n        this.clearAllComp = clearAllComp;\n    }\n\n    getSelectDropdownInteractor(): ISelectDropdownInteractor |null {\n      return this.selectDropdownInteractor ? this.selectDropdownInteractor : null\n    }\n\n    private applyClasses() : void {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCssClass(classes.root);\n        this.comp.getGui().classList.add('dg-field__input-wrapper');\n    }\n\n    private getOwnerState() {\n        return {\n            disabled: this.optionHandler.isDisabled(),\n            readonly: this.optionHandler.isReadOnly(),\n            multiple: this.optionHandler.isMultiple()\n        }\n\t}\n\n    private setAriaAttributes() {\n        const selectInputWrapper = this.comp.getGui();\n        setAriaRole(selectInputWrapper, 'combobox');\n        setAriaExpanded(selectInputWrapper, true);\n        setAriaLabel(selectInputWrapper, \"Select input wrapper\");\n        setAriaDisabled(selectInputWrapper, this.optionHandler.isDisabled());\n        selectInputWrapper.setAttribute('aria-haspopup', 'listbox');\n\n    }\n    private registerEvents() {\n        const ownerState =  this.getOwnerState();\n        this.addListener(this.eventHandler,'UseEllipsis_Property_Changed',this.useEllipsisPropertyUpdated.bind(this));\n        this.addListener(this.eventHandler,'PROPERTY_CHANGED',this.setTabindex.bind(this))\n\n        this.optionHandler.isUseElipses() && this.enableResizeObserver();\n\n        registerClipboardGuards(\n            this.comp.getGui(),\n            () => this.optionHandler.getClipboard(),\n            (target, event, listener) => this.addListener(target, event, listener)\n        );\n\n        if(ownerState.readonly || ownerState.disabled){\n            return;\n        }\n        this.enableListener(); \n\n        this.addListener(this.comp.getGui(), 'focusout', (event : FocusEvent) => {\n            const elementWithFocus = event.relatedTarget as HTMLElement;\n\n            const focusInsideComponent = this.isElementFromParent(elementWithFocus);\n\n            const closeCallback = () => {\n                this.closeDropdown(false);\n                this.optionHandler.onBlur();\n            }\n\n            if(!focusInsideComponent) {\n                if(!this.isElementWithinCustomPopup(elementWithFocus)) {\n                    closeCallback();\n                    this.dispatchEvent({type :'SET_FOCUS_CLASS',value : false})\n                }\n            }\n        })\n\n        this.addListener(this.comp.getGui(), 'focusin', (event : FocusEvent) => {\n            const elementWithFocus = event.relatedTarget as HTMLElement;\n            if(!elementWithFocus || !this.isElementWithinCustomPopup(elementWithFocus)) {\n                this.optionHandler.onFocus();\n                this.dispatchEvent({type :'SET_FOCUS_CLASS',value : true})\n            }\n        })\n\n       \n    }\n\n    private isElementWithinCustomPopup(element: HTMLElement): boolean {\n        let pointer: HTMLElement | null = element;\n        \n        while (pointer) {\n            if (pointer.classList.contains('ZG-popup') || pointer.classList.contains('ZG-has-popup')) {\n                return true;\n            }\n            pointer = pointer.parentElement;\n        }\n\n        return false;\n    }\n\n    private isElementFromParent(element : HTMLElement) : boolean {\n        let pointer: HTMLElement | null = element;\n        while (pointer) {\n            const uniqueKey = this.optionsHandler.getDomData(pointer, SelectInputWrapperController.DOM_KEY);\n            if(!!uniqueKey) {\n                const eventFromThisParent = uniqueKey === this.domKey;\n                return eventFromThisParent;\n            }           \n            pointer = pointer.parentElement;\n        }\n        return false;\n    }\n    enableResizeObserver(): void {\n        if (this.optionHandler.isOptionAsChip() && this.optionHandler.isUseElipses() && this.optionHandler.isMultiple()) {\n           \n            if (!this.resizeObserver) {\n                this.resizeObserver = new ResizeObserver(() => {\n                    this.selectDataPart.deleteAllChipInstance();\n                    const selectedOptions =   this.selectDataPart.getSelectedOptions();\n                    selectedOptions && (selectedOptions.length > 0) &&this.selectInputHandler.getSelectInput().renderSelectedChip();\n                });\n            \n                this.resizeObserver.observe(this.comp.getGui());\n            }\n        }\n    }\n\n    disableResizeObserver(): void {\n        if (this.resizeObserver) {\n            // Stop observing and clear the instance\n            this.resizeObserver.disconnect();\n            this.resizeObserver = null;\n        }\n    }\n\n    useEllipsisPropertyUpdated():void{\n        if(this.optionHandler.isUseElipses()) {\n            this.enableResizeObserver();\n        }\n        else{\n            this.disableResizeObserver();\n            this.selectDataPart.deleteAllChipInstance();\n            this.selectInputHandler.getSelectInput().createSelectedChip();\n        }\n    }\n\n    \n    enableListener(): void{\n        const container = this.comp.getGui();\n        !(this.optionHandler.isPlusIconEnabled()) && this.addListener(container,`click`,this.toggleDropdown.bind(this));\n        this.addListener(this.eventHandler,\"destroyDropdown\", ()=>{this.destroyDropdown()});\n        this.addListener(this.eventHandler,'keydown', (event: KeyboardEvent)=>this.handleKeyEvent(event));\n        if(this.clearAllComp){\n            this.addListener(this.clearAllComp,'click',(event)=>{\n                event.stopPropagation();\n                this.clearAllOptions(); \n            });\n        }\n    }\n\n    disableListener(): void {\n        const container = this.comp.getGui();\n        !(this.optionHandler.isPlusIconEnabled()) && container.removeEventListener('click',this.toggleDropdown.bind(this));\n        this.eventHandler.removeEventListener('destroyDropdown', ()=>{this.destroyDropdown()});\n        this.eventHandler.removeEventListener('keydown', (event: KeyboardEvent)=>this.handleKeyEvent(event));\n        if(this.clearAllComp){\n            this.clearAllComp.removeEventListener('click',(event)=>{\n                    event.stopPropagation();\n                    this.clearAllOptions(); \n                });\n        }\n    }\n\n    clearAllOptions(initiator : 'api' | 'ui' = 'ui'):void{\n        \n        // To claer selected option in select input \n        this.dispatchEvent({\n            type : \"clearAll\",\n            initiator : initiator\n        });\n        //To clear all selected option from drop down\n       (!this.optionHandler.getDropdownRenderer())  && this.selectDropdownInteractor?.getInstance()?.api.clear();\n    }\n\n    private registerKeyboardEvents() {\n        const ownerState =  this.getOwnerState();\n        if(ownerState.readonly || ownerState.disabled){\n            return;\n        }\n         const container =  this.comp.getGui();\n         this.addListener(container, 'keydown', (event: KeyboardEvent) =>{\n            if(ownerState.readonly || ownerState.disabled){\n                return;\n            }\n            if(event.key === 'Enter' || event.key === ' '){\n               \n                event.preventDefault();\n                this.toggleDropdown();\n            }\n            this.optionHandler.onKeydown(event);\n         })\n    }\n    \n    private handleKeyEvent(_event : KeyboardEvent) : void{\n        const ownerState =  this.getOwnerState();\n        if(ownerState.readonly || ownerState.disabled){\n            return;\n        }\n        this.toggleDropdown();\n        this.selectDropdownInteractor?.focus();\n    }\n\n\n\n    openDropdown():void{\n        if(this.optionHandler.isDropdownOpenPrevented()) return;\n        if(this.selectDropdownInteractor) return ;\n        else{\n            this.optionHandler.onBeforeDropdownOpen();\n            this.selectDropdownInteractor =new SelectDropdownInteractor();\n            this.selectDropdownInteractor.setModel(this.selectConfigAPI);\n            this.selectDropdownInteractor.focus();\n            this.optionHandler.onAfterDropdownOpen();\n            this.optionHandler.isautoFocusSelectedOptionEnabled()  && this.selectDropdownInteractor.autoFocusSelectedOption();\n            this.dispatchEvent({type :'SET_FOCUS_CLASS',value : true})\n        }\n\n    }\n\n    isDropdownOpen():boolean{\n        return !!this.selectDropdownInteractor;\n    }\n\n    closeDropdown(focus : boolean = true):void{\n        const selectdropdownInteracter = this.selectDropdownInteractor;\n\n        this.selectDropdownInteractor = null;\n        if(!selectdropdownInteracter) return;\n        this.optionHandler.onBeforeDropdownClose();\n        focus && this.focus(true) ;\n        selectdropdownInteracter?.destroy();\n        focus && this.focus(true);\n        this.optionHandler.onAfterDropdownClose();\n        !focus && this.optionHandler.onBlur();\n        this.dispatchEvent({type :'SET_FOCUS_CLASS',value : false})\n\n\n    }\n\n    closeDropdownWithoutCellFocus():void{\n        this.selectDropdownInteractor?.destroy();\n        this.selectDropdownInteractor = null;\n\n    }\n\n\n\n    toggleDropdown(): void {\n        if (this.selectDropdownInteractor) {\n\n            // this.optionHandler.onBeforeDropdownClose();\n\n            this.selectAPI.closeDropdown();\n            this.dispatchEvent({\n                type : 'EVENT_SELECT_FOCUS'\n            })\n\n            // this.optionHandler.onAfterDropdownClose();\n            \n        } \n        else {\n            // this.optionHandler.onBeforeDropdownOpen();\n\n            this.selectAPI.openDropdown();\n\n            // this.optionHandler.onAfterDropdownOpen();\n        }\n    }\n\n    focusDropdown(){    \n        this.selectDropdownInteractor?.focus();\n    }\n\n\n    getProperty(): any{\n        return {\n            isDisabled : ()=>this.optionHandler.isDisabled(),\n            isReadOnly : ()=>this.optionHandler.isReadOnly(),\n            isClearable : ()=>this.optionHandler.isClearableButtonEnabled(),\n            getLabel : ()=>this.optionHandler.getLabel(),\n            isRequired : ()=>this.optionHandler.isRequired(),\n            isMultiple : ()=>this.optionHandler.isMultiple(),\n            showDropdownIcon : ()=>this.optionHandler.showDropdownIcon()\n\n        }\n    }\n\n    focus(preventScroll ?: boolean ){\n        this.comp.getGui().focus({\n            preventScroll \n        });\n    }\n\n    blur(){\n        this.comp.getGui().blur();\n        this.optionHandler.onBlur();\n    }\n\n\n    destroyDropdown(){\n        if (this.selectDropdownInteractor) {\n            this.selectDropdownInteractor.destroy();\n            this.selectDropdownInteractor = null;\n        } \n    }\n\n     destroy(): void {\n        this.comp.getGui().remove(); \n    }\n\n    open(){\n        this.toggleDropdown();\n    }\n\n    close(){\n        this.toggleDropdown();\n\n    }    \n\n    getElement():HTMLElement{\n        return this.comp.getGui();\n    }\n\n    enableOptions(optionIds : string[]) : void {\n        if(this.isDropdownOpen()) {\n            this.selectDropdownInteractor && this.selectDropdownInteractor.enableOptions(optionIds)\n        }\n    }\n\n    disableOptions(optionIds : string[]) : void {\n        if(this.isDropdownOpen()) {\n            this.selectDropdownInteractor && this.selectDropdownInteractor.disableOptions(optionIds)\n        }\n    }\n}","import {Component} from \"@dg/corecomponent/Component.js\";\nimport {PostConstruct} from \"@dg/corecomponent\"\nimport { SelectInputWrapperCompType } from \"./select-input-wrapper-types\";\nimport { SelectInputWrapperController } from \"./select-input-wrapper-controller\";\n\n \n\n\nfunction RootTemplate(props :any) {\n\tconst root = document.createElement('div');\n\n\tconst selectInput =  document.createElement('select-input');\n\troot.appendChild(selectInput);\n\t\n\t// const iconContainer = document.createElement('div');\n\t// iconContainer.className = 'dg-selectbox__icon-container';\n\tlet clearallComp = null;\n\n\tconst SelectboxIconComponent = document.createElement('select-icon');\n\n\tif(props.isClearable()){\n\t\t clearallComp = renderClearAll(SelectboxIconComponent);\n\t}\n\troot.appendChild(SelectboxIconComponent);\n\n\treturn {root,clearallComp};\n}\n\n\nfunction renderClearAll(container: HTMLElement): HTMLElement {\n    const div = document.createElement('div');\n    div.classList.add('dg-selectbox__clear-all-icon');\n\n    const svgNS = \"http://www.w3.org/2000/svg\";\n    const svg = document.createElementNS(svgNS, 'svg');\n    svg.setAttribute('fill', '#a5a1a1');\n    svg.setAttribute('width', '35px');\n    svg.setAttribute('height', '35px');\n    svg.setAttribute('viewBox', '-532.48 -532.48 2088.96 2088.96');\n    svg.setAttribute('transform', 'rotate(0)matrix(1, 0, 0, 1, 0, 0)');\n    svg.setAttribute('stroke', '#a5a1a1');\n    svg.setAttribute('stroke-width', '0.01024');\n\n    // First <g> element\n    const gBg = document.createElementNS(svgNS, 'g');\n    gBg.setAttribute('id', 'SVGRepo_bgCarrier');\n    gBg.setAttribute('stroke-width', '0');\n    svg.appendChild(gBg);\n\n    // Second <g> element\n    const gTracer = document.createElementNS(svgNS, 'g');\n    gTracer.setAttribute('id', 'SVGRepo_tracerCarrier');\n    gTracer.setAttribute('stroke-linecap', 'round');\n    gTracer.setAttribute('stroke-linejoin', 'round');\n    gTracer.setAttribute('stroke', '#CCCCCC');\n    gTracer.setAttribute('stroke-width', '22.528');\n    svg.appendChild(gTracer);\n\n    // Third <g> element with icon\n    const gIcon = document.createElementNS(svgNS, 'g');\n    gIcon.setAttribute('id', 'SVGRepo_iconCarrier');\n\n    const path = document.createElementNS(svgNS, 'path');\n    path.setAttribute('d', \"M512 896c212.079 0 384-171.921 384-384 0-212.077-171.921-384-384-384-212.077 0-384 171.923-384 384 0 212.079 171.923 384 384 384zm136.832-520.839c16.661 16.663 16.661 43.677 0 60.338l-76.497 76.497 76.497 76.501c16.661 16.661 16.661 43.678 0 60.339s-43.678 16.661-60.339 0l-76.497-76.497-76.497 76.493c-16.663 16.666-43.678 16.666-60.34 0-16.662-16.661-16.662-43.674 0-60.339l76.498-76.497-76.497-76.493c-16.662-16.663-16.662-43.678 0-60.341s43.677-16.662 60.339 0l76.497 76.495 76.497-76.496c16.661-16.662 43.678-16.662 60.339 0z\");\n    gIcon.appendChild(path);\n    svg.appendChild(gIcon);\n\n    div.appendChild(svg);\n    container.appendChild(div);\n    return div;\n}\n\n\nexport class SelectInputWrapperComponent extends Component{\n\n\tprivate appendTo: HTMLElement | null;\n\tconstructor(appendTo : HTMLElement){\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst controller  =  this.createManagedBean(new SelectInputWrapperController());\n\t\tconst props =  controller.getProperty();\n\t\tconst {root, clearallComp} = RootTemplate(props);\n\t\tthis.setTemplate(root);\n\t\tcontroller.setClearAllComp(clearallComp);\n\t\tcontroller.setComponent(this.getComponent());\n\t\tthis.appendElementIntoUserDom();\n\t}\n\n\tprivate getComponent() : SelectInputWrapperCompType{\n\t\treturn {\n\t\t\tgetGui : () => this.getGui(),\n            addOrRemoveCssClass : (className : string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className),\n\t\t\tgetParentComponent : () => this.getParentComponent(),\n\t\t\t// reRenderComponent : (selectInputWrapperController :SelectInputWrapperController, parentComp:any ) => this.reRenderComponent(selectInputWrapperController, parentComp),\n\n\t\t}\n\t}\n\tprivate addOrRemoveCSSClass(className : string ): void{\n\t\tconst element = this.getGui();\n\t\telement && (element.className =  className);\n\t}\n\n\tprivate appendElementIntoUserDom() :void{\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(()=>{\n\t\t\tthis.appendTo?.remove();\n\t\t\tthis.appendTo = null;\n\t\t})\n\t}\n\t\n\t protected destroy(): void {\n\t\tthis.getGui().remove();    \n\t}\n\n\t// reRenderComponent(selectInputWrapperController :SelectInputWrapperController, parentComp:any ):void{\n\t// \tselectInputWrapperController.destroy()\n\t// \tconst props = selectInputWrapperController.getProperty();\n\t// \tconst {root, clearallComp} = RootTemplate(props);\n\t// \tthis.setTemplate(root);\n\t// \tselectInputWrapperController.setClearAllComp(clearallComp);\n\t// \tselectInputWrapperController.setComponent(this.getComponent());\n\t// \tparentComp.appendChild(this.getGui());\n\t// }\n\n\n}","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { SelectInputCompType } from \"./select-input.types\";\nimport { AutoWired, BEAN_NAME, setAriaDisabled, setAriaExpanded, setAriaLabel, setAriaRole} from \"@dg/corecomponent\";\nimport { ISelectOptionHandler } from \"../model/select-option-handler.types\";\nimport { composeClasses } from \"@dg/utils\";\nimport { Chip } from \"../../../../chip/chip\";\nimport { PopupHandler } from \"../model/popup-handler\";\nimport { ISelectDataPart } from \"../model/select-ds\";\nimport { ISelectInputHandler } from \"../model/select-input-handler\";\nimport { ISelectConfigAPI } from \"../model/select-configApi\";\nimport { SELECT_BEAN_NAME } from \"../../constants/beanname-constant\";\nimport { ISelectInputAPI } from \"../model/select-api\";\nimport { getSelectRootUtilityClass } from \"../select-root/select-root-classes\";\nimport { ISelectConfiguration, SelectOptionElementModel } from \"../../select-configuration-types/select_configuration\";\nimport { IChipConfiguration } from \"../../../../chip/chip-configuration.types\";\nimport { SelectUserComponentHandlerTypes } from \"../model/select-user-component-handler.types\";\nimport { EllipsesComponent } from \"../ellipses/ellipses-view\";\n\n\nconst useUtilityClasses = (ownerState : any) =>{\n    const {disabled, readonly} = ownerState;\n    const slots = {\n        root : {\n            slot : 'inner',\n            modifiers:[\n                disabled && 'disabled',\n                readonly &&'readonly',\n            ],\n        },\n\n    };\n    return composeClasses(slots, getSelectRootUtilityClass);\n}\n\n\n\n\nexport class SelectInputController extends EventEmitter{\n    comp !: SelectInputCompType;\n    placeholder !: HTMLElement;\n    ellipsisIcon !:HTMLElement\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n    @AutoWired(BEAN_NAME.POPUP_HANDLER) protected popupHandler !: PopupHandler;\n    @AutoWired(\"SelectDataPart\") protected selectDataPart !: ISelectDataPart;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n    @AutoWired(\"SelectConfigAPI\")  selectConfigAPI !: ISelectConfigAPI;\n    @AutoWired(SELECT_BEAN_NAME.SELECT_API) selectAPI !: ISelectInputAPI;\n    @AutoWired(SELECT_BEAN_NAME.SELECT_CONFIGURATION) configuration!: ISelectConfiguration;\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: SelectUserComponentHandlerTypes;\n\n    private chipCache: WeakMap<HTMLElement, { width: number; height: number }> = new WeakMap();\n    private imageCache: Map<string, { image: HTMLImageElement; width: number; height: number }> = new Map();\n    private containerWidth: number = 0;    \n    private containerHeight: number = 0;\n    private totalUsedWidth: number = 0;\n    private totalUsedHeight: number = 0;\n    private ellipsesDom !: HTMLElement | null;\n    private ellipsesComp !: EllipsesComponent | null;\n\n\n\n\n    setComp(comp:SelectInputCompType){\n        this.comp = comp;\n        this.applyClasses();\n        this.setAriaAttributes();\n        this.registerEventHandler();\n        this.registerInput();\n        this.addDefaultSelectedOption(false);\n        this.updateEllipsisClassName();\n        this.addListener(this.eventHandler, 'EVENT_SELECT_FOCUS', this.focus.bind(this));\n\n        \n    }\n\n    updateEllipsisClassName() : void {\n        const element = this.comp.getElement();\n        if(element) {\n            element.classList.toggle('dg-selectbox__nowrap', this.optionHandler.isUseElipses());\n        }\n    }\n\n\n    registerInput(){\n        this.selectInputHandler.registerSelectInput(this);\n    }\n\n    setPlaceholder(placeholder :HTMLElement){\n        placeholder && (this.placeholder = placeholder);\n    }\n\n    private setAriaAttributes() {\n        const inputfield = this.comp.getElement();\n\n        setAriaRole(inputfield, 'listbox');\n        if (this.optionHandler.isMultiple()) {\n            setAriaLabel(inputfield, \"Multi Select Input Field\");\n            inputfield.setAttribute('aria-multiselectable', 'true');\n        } else {\n            setAriaLabel(inputfield, \"Single Select Input Field\");\n        }\n\n        setAriaExpanded(inputfield, true);\n        setAriaDisabled(inputfield, this.optionHandler.isDisabled());\n    }\n\n\n\n    private applyClasses() : void {\n        const ownerState = this.getOwnerState();\n        const classes = useUtilityClasses(ownerState);\n        this.comp.addOrRemoveCSSClass(classes.root);\n        // if(!this.optionHandler.isOptionAsChip()){\n        //     // this.comp.getElement().classList.add(\"dg-selectbox__text\")\n        // }\n    }\n\n\n    // private refresh() : void {\n    //     this.applyClasses();\n    //     this.setAriaAttributes();\n    // }\n\n    private getOwnerState() {\n        return {\n            disabled: this.optionHandler.isDisabled(),\n            readonly: this.optionHandler.isReadOnly(),\n            multiple: this.optionHandler.isMultiple()\n        }\n\t}\n\n\n\n    private registerEventHandler(){\n\n        this.addListener(this.eventHandler,'EnablePlusIcon_Property_Changed',this.updateEnablePlusIconProperty.bind(this));\n        this.addListener(this.eventHandler,'Tooltip_Property_Changed',this.updateTooltip.bind(this));\n\n        const ownerState =  this.getOwnerState();\n        if( ownerState.disabled){\n            return;\n        }\n        this.addListener(this.eventHandler,\"updateMultiSelectData\",(value:any)=>{ \n            this.updateMultiSelectData(value);\n            this.optionHandler.isCloseOnSelect() && this.selectAPI.closeDropdown();\n        });\n        this.addListener(this.eventHandler,\"updateSingleSelectData\",(value:any)=>{ \n            this.updateSingleSelectData(value);  \n            this.optionHandler.isCloseOnSelect() && this.selectAPI.closeDropdown();\n        });\n        this.addListener(this.eventHandler,\"clearSingleSelectData\",(value:any)=>{ \n            this.clearSingleSelectData(value.initator);  \n            this.optionHandler.isCloseOnSelect() && this.selectAPI.closeDropdown();\n        });\n        this.addListener(this.eventHandler,\"clearAll\",(params)=>this.clearAll(params.initiator));  \n        this.addListener(this.eventHandler, \"EVENT_PLACEHOLDER_CHANGED\", this.renderPlaceHolder.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_DATA_UPDATED', () => this.addDefaultSelectedOption(true));\n        this.addListener(this.eventHandler, 'PROPERTY_CHANGED', () => this.addDefaultSelectedOption(true));\n\n    }\n  \n    getProperty() : any{\n        return {\n            getAppendTo : ()=>this.optionHandler.getAppendTo(),\n            isMultiple : ()=>this.optionHandler.isMultiple(),\n            isSearchable : ()=>this.optionHandler.isSearchable(),\n            isDisabled : ()=>this.optionHandler.isDisabled(),\n            placeholder : ()=>this.optionHandler.getPlaceholder(),\n            placeHolderRenderer : ()=>this.optionHandler.getPlaceHolderRenderer(),\n            placeHolderRendererParams : ()=>this.optionHandler.getPlaceHolderRendererParams(),\n            getOption : ()=>this.optionHandler.getOptions(),\n            getParentComp : () => this.comp.getElement(),\n            isOptionAsChip : ()=>this.optionHandler.isOptionAsChip(),\n        }\n    }\n\n    addDefaultSelectedOption(trigger : boolean = true){\n        this.clearAll('api' , trigger);\n        const selectedOptionsData  = this.optionHandler.getSelectedData();\n        if(selectedOptionsData.length > 0 ){\n            if(this.optionHandler.isMultiple()){\n                for(let index=0;index<selectedOptionsData.length;index++){\n                    const selectedOption = selectedOptionsData[index];\n                    // this.selectConfigAPI.onAfterSelect(selectedOption);\n                    const params = {\n                        value : selectedOption,\n                        initiator :  \"API\",\n                        updateUI : index === selectedOptionsData.length - 1\n                    }\n                    selectedOption && this.dispatchEvent({\n                        type : \"updateMultiSelectData\",\n                        value : selectedOption,\n                        params,\n                        init: true\n                    });\n                }\n            }\n            else{\n                // this.selectConfigAPI.onAfterSelect(selectedOptions[0]);\n                const params = {\n                    value :  selectedOptionsData[0],\n                    initiator :  \"API\"\n                 }\n                selectedOptionsData[0] && this.dispatchEvent({\n                    type : \"updateSingleSelectData\",\n                    value : selectedOptionsData[0],\n                    params,\n                    init : true\n                });\n            }\n        }\n        this.handlePlusIconComp();\n    }\n\n    clearAll(initiator : 'api' | 'ui' = 'ui', trigger : boolean = true){\n        // const input =  this.comp.getElement();\n        if(this.optionHandler.isMultiple()){\n            this.selectDataPart.deleteAllOptions();\n            this.ellipsesDom && this.ellipsesDom.remove();\n        }\n        // else{\n            this.clearSingleSelectData(initiator, trigger);\n        // }\n       this.optionHandler.getPlaceholder() &&  this.renderPlaceHolder();\n    }\n\n    updateMultiSelectData(event:any){\n        const triggerChange = event.init ? false : true;\n\n        const params = event.params;\n        const updateUI = params.updateUI ?? true;\n        const option =  params.value;\n        (this.selectDataPart.getSelectedOptions().length <= 0)  &&  this.comp.getElement().replaceChildren();\n        option && ( (this.selectDataPart?.isOptionAdded(option)) ?  this.removeOption(option, updateUI) :  this.addOption(option, updateUI));\n        this.renderPlaceHolder();\n        this.handlePlusIconComp();\n        const hooksParams =  {\n            values            : this.selectDataPart.getSelectedOptions(),\n            initiator         : params.initiator,\n            selectAll         : params.selectAll,\n            selectAllTriggered: params.selectAllTriggered\n        }\n        triggerChange && this.optionHandler.onChange?.(hooksParams);\n    }\n\n    private handlePlusIconComp():void{\n        this.comp.destroyPlusIcon();\n        this.optionHandler.isPlusIconEnabled() && this.comp.renderPlusIcon({},this.comp.getParentComp());\n    }\n\n\n\n   private addOption(option:SelectOptionElementModel, updateUI : boolean = true){\n     if(this.optionHandler.isOptionAsChip() ){\n        this.selectDataPart.deleteAllChipInstance();\n        this.selectDataPart.addOption(option);\n        this.optionHandler.isUseElipses() ? (updateUI && this.renderSelectedChip()) :  (updateUI && this.createSelectedChip())\n        this.handlePlusIconComp();\n    }\n    else{\n        this.selectDataPart.addOption(option);\n        this.createCommmaSeparatedOptions();\n        this.handlePlusIconComp();\n    }\n   }\n\n   private removeOption(option:SelectOptionElementModel, updateUI : boolean = true){\n    if(this.optionHandler.isOptionAsChip() ){\n        this.selectDataPart.deleteAllChipInstance();\n        this.selectDataPart.deleteOption(option);\n        this.optionHandler.isUseElipses() ? (updateUI && this.renderSelectedChip()) :  this.createSelectedChip()\n    }\n    else{\n        this.selectDataPart.deleteOption(option);\n        this.createCommmaSeparatedOptions()\n    }\n    }\n\n    updateOption(option:SelectOptionElementModel){\n        this.selectAPI.closeDropdown();\n        this.selectDataPart.updateOption(option);\n        if(this.optionHandler.isOptionAsChip() ){\n            this.selectDataPart.deleteAllChipInstance();\n            this.optionHandler.isUseElipses() ?this.renderSelectedChip() :  this.createSelectedChip()\n            this.handlePlusIconComp();\n            this.renderPlaceHolder();\n        }\n        else{\n            this.createCommmaSeparatedOptions();\n            this.handlePlusIconComp();\n            this.renderPlaceHolder();\n        }\n\n    }\n\n    setOptionsDisabled(optionIds:string[], disabled : boolean) : void {\n        this.selectDataPart.setOptionsDisabled(optionIds, disabled);\n        const inputcontroller = this.selectInputHandler.getSelectInputWrapper();\n        if(disabled) {\n            inputcontroller.disableOptions(optionIds);\n        }else {\n            inputcontroller.enableOptions(optionIds);\n        }\n        if(this.optionHandler.isOptionAsChip() ){\n            this.selectDataPart.deleteAllChipInstance();\n            this.optionHandler.isUseElipses() ?this.renderSelectedChip() :  this.createSelectedChip()\n            this.handlePlusIconComp();\n            this.renderPlaceHolder();\n        }\n        else{\n            this.createCommmaSeparatedOptions();\n            this.handlePlusIconComp();\n            this.renderPlaceHolder();\n        }\n\n    }\n\n    private createCommmaSeparatedOptions(){\n        const input = this.comp.getElement();\n        input.replaceChildren();\n        const selectedOptions = this.selectDataPart.getSelectedOptions().map(option => option.label ?? option.value);\n        const commaSeparatedOptions = selectedOptions.join(\",\");\n        // const option = this.comp.createSelectSpan(commaSeparatedOptions);\n        input.classList.toggle(\"dg-selectbox__text\", this.selectDataPart.getSelectedOptions().length > 0);\n        input.textContent = commaSeparatedOptions;\n    }\n\n    updateSingleSelectData(event:any):void{\n        const triggerChange = event.init ? false : true;\n\n        const params = event.params;\n        const option:SelectOptionElementModel = params.value;\n        const input =  this.comp.getElement();\n        input.replaceChildren();\n        this.selectDataPart.resetOptions();\n        this.addOption(option);\n        this.optionHandler.getPlaceholder() &&   this.renderPlaceHolder();\n        const hookParams =  {\n            values : this.selectDataPart.getSelectedOptions(),\n            initiator : params.initiator,\n        }\n        triggerChange && this.optionHandler.onChange?.(hookParams);\n    }\n\n    clearSingleSelectData(initiator : 'api' | 'ui' = 'ui', trigger : boolean = true):void{\n        // const option:SelectOptionElementModel = event.value;\n        const input =  this.comp.getElement();\n        input.replaceChildren();\n        this.selectDataPart.resetOptions();\n        input.classList.toggle(\"dg-selectbox__text\", false);\n        \n        this.renderPlaceHolder();\n        const params = {\n            values : this.selectDataPart.getSelectedOptions(),\n            initiator : initiator\n        }\n        trigger && this.optionHandler.onChange?.(params);\n    }\n\n    \n\n    createChip(option:SelectOptionElementModel,appendTo?:HTMLElement |  null, wrapperClassname ?: string ) :any{\n        if(option.selectedValueRenderer){\n            const customOptionInstance =  new option.selectedValueRenderer;\n            customOptionInstance.init(this.createOptionsParams(option));\n            customOptionInstance.createElement();\n            appendTo?.appendChild(customOptionInstance.getElement())\n            return customOptionInstance;\n        }\n        else{\n            \n            let chipConfig: IChipConfiguration = {\n                                                    appendTo: appendTo ?? null,\n                                                    label: option.label ?? option.value,\n                                                    readOnly : true,\n                                                    wrapperClassname : wrapperClassname || '',\n                                                    chipColor : option.color,\n                                                    href : option.href,\n                                                    hrefTarget : option.hrefTarget,\n                                                }\n            option.id === 'ellipses' && (chipConfig.labelasDom =  true); // temp fix\n\n            if((this.optionHandler.shouldShowTooltip()) && (!wrapperClassname)){\n                chipConfig.tooltip = this.optionHandler.shouldShowTooltip();\n                chipConfig.tooltipAppendto = this.optionHandler.getTooltipAppendto();2\n                chipConfig.tooltipMessage =  option.value;\n                chipConfig.tooltipRegex = this.optionHandler.getTooltipRegex();\n                chipConfig.tooltipPosition = this.optionHandler.getTooltipPosition();\n                chipConfig.tooltipHideDelay = this.optionHandler.getTooltipHideDelay();\n            }\n             \n            \n            if((!this.optionHandler.isReadOnly()) && (this.optionHandler.isMultiple()) && (option.id !== 'ellipses')){\n                    chipConfig.onRemove = (_params:any) => {\n                        if(option.disabled) {\n                            return;\n                        }\n                        this.selectInputHandler.getSelectInputWrapper().focus();\n                        this.selectAPI.deselect(option.id,\"UI\");\n                    };\n                    chipConfig.removeIconId = \"#remove-icon\";\n            }\n\n            if (option.thumbnailRenderer) {\n                chipConfig.thumbnailRenderer = option.thumbnailRenderer;\n                chipConfig.userThumbnailRendererParams = option.userThumbnailRendererParams;\n            }\n            return new Chip(chipConfig);\n        }\n\n    }\n\n    createOptionsParams(option:SelectOptionElementModel):any{\n        return {\n            option : option,\n            readonly : this.optionHandler.isReadOnly()\n        };\n    }\n\n    renderPlaceHolder(){\n        if(this.selectDataPart.getSelectedOptions().length <= 0){\n            this.comp.getElement().replaceChildren();\n            this.comp.renderPlaceholder(this.getProperty());\n        }\n    }\n\n    // updateProperties(){\n    //     this.renderPlaceHolder();\n    //     this.addDefaultSelectedOption();\n    // }\n\n    updateEnablePlusIconProperty(){\n        if(this.optionHandler.isUseElipses()){\n            this.renderSelectedChip();\n        }\n        else{\n            this.selectDataPart.deleteAllChipInstance();\n            this.createSelectedChip();\n        }\n     \n    }\n    updateTooltip(){\n        if(this.optionsHandler.isOptionAsChip()){\n            const chipInstances = this.selectDataPart.getChipsInstances();\n            Object.values(chipInstances).forEach(chipInstance=>{\n\n                  const tooltipMessage =  this.optionHandler.getTooltipMessage();\n                  const tooltipRegex = this.optionHandler.getTooltipRegex();\n                  const tooltipPosition = this.optionHandler.getTooltipPosition();\n                  const tooltipHideDelay = this.optionHandler.getTooltipHideDelay();\n                  const tooltipAppendto = this.optionHandler.getTooltipAppendto();\n                  const tooltip = this.optionHandler.shouldShowTooltip();\n\n                const toolConfig = {\n                    tooltipMessage,\n                    tooltipRegex,\n                    tooltipPosition ,\n                    tooltipAppendto ,\n                    tooltipHideDelay,\n                    tooltip \n                }\n                \n                toolConfig && (chipInstance as any)?.api?.updateProperties(toolConfig);\n            });\n        }\n    }\n\n    getPlusIconDom(): HTMLElement | undefined{\n        return this.comp.getPlusIcon() ?? undefined;\n    }\n\n    focus(){\n        this.comp.getElement().focus();\n    }   \n\n\n    addOptions(options:SelectOptionElementModel[],selectOption: boolean = true){\n\n       if((!this.optionHandler.getDropdownRenderer()) && this.selectInputHandler.getDropdownInteractor() ){\n        this.selectInputHandler.getDropdownInteractor()?.addOptions(options);\n        return\n       }\n\n       for(let index = 0; index < options.length; index++){\n            if (!this.configuration.options) {\n                this.configuration.options = []; \n            }\n            this.configuration.options.push(options[index]);\n            selectOption && this.addOption(options[index]);\n        }\n    }\n\n    removeOptions(options:SelectOptionElementModel[]){\n        for(let index = 0; index < options.length; index++){\n            if (!this.configuration.options) {\n                this.configuration.options = []; \n            }\n            // this.configuration.options = this.configuration.options.filter((option:SelectOptionElementModel) => option.id!== options[index].id);\n\n          if (this.selectDataPart.isOptionAdded(options[index])){\n            this.selectDataPart.deleteChipInstance(options[index]);\n            this.selectDataPart.deleteOption(options[index]);\n          } \n        }\n\n        (!this.optionHandler.getDropdownRenderer()) && this.selectInputHandler.getDropdownInteractor()?.removeOptions(options);\n    }\n\n    getEllipsesIcon():HTMLElement{\n        return this.ellipsisIcon \n    }\n\n     createSelectedChip(){\n        // const appendTo =  this.comp.getElement();\n        // const selectedOptions =  this.selectDataPart.getSelectedOptions();\n        // for(let i = 0; i < selectedOptions.length; i++){\n        //     const chipInstance =  this.createChip(selectedOptions[i],appendTo);\n        //     this.selectDataPart.updateChipInstance(selectedOptions[i],chipInstance);\n        // }\n        const appendTo = this.comp.getElement();\n        const selectedOptions = this.selectDataPart.getSelectedOptions();\n        appendTo.textContent = \"\";\n        for (const option of selectedOptions) {\n           this.createChipDOM(option, appendTo, null, null);\n        }\n    }\n\n\n\n    //................resize handler started.....................//\n    \n    public renderSelectedChip() {\n        const appendTo        = this.comp.getElement();\n        const selectedOptions = this.selectDataPart.getSelectedOptions();\n        const rootController  = this.selectInputHandler.getSelectRoot();\n        let rootElement: HTMLElement | undefined;\n        if(rootController){\n            rootElement = rootController.getElement();\n        }\n        this.resetContainerDimensions();\n        rootElement &&rootElement.classList.remove(\"dg-selectbox__root--single-chip\");\n    \n        appendTo.textContent = \"\";\n    \n        // Add Plus Icon\n        const plusIcon = this.addPlusIcon(appendTo);\n    \n        // Add Ellipsis Chip if Necessary\n        const ellipsisChipComp : EllipsesComponent= this.addEllipsisChip(appendTo, selectedOptions.length, plusIcon);\n        this.ellipsisIcon = ellipsisChipComp?.getElement();\n    \n        let previousChipColor: string | undefined;\n        let chipCount = 0; \n\n        let totalRenderedChips = 0;\n    \n        for (const option of selectedOptions) {\n            this.ellipsesDom && this.getCachedDimensions(this.ellipsesDom)\n            const chipDOM = this.createChipDOM(option, appendTo, this.ellipsesDom, plusIcon);\n    \n            const { width, height } = this.getCachedDimensions(chipDOM);\n    \n            if (chipCount === 0) {\n                this.updateUsedHeightForFirstChip(height);\n            }\n            \n            const ignoreEllipses = this.isEllipsesNeeded(chipCount);\n    \n            if (!this.fitsWithinContainer(width, height, ignoreEllipses)) {\n                if(chipCount === 0 ){\n                    // ellipsisChip?.api.updateBgColor(option.color);\n                    this.optionHandler.updateEllipsesRendererParams(this.createEllipsesRendererParams(option.color || \"\",chipCount));\n                    ellipsisChipComp?.reRender();\n                    totalRenderedChips++;\n\n                    break;\n                }\n                this.selectDataPart.deleteChipInstance(option);\n                chipCount--;\n                this.optionHandler.updateEllipsesRendererParams(this.createEllipsesRendererParams(previousChipColor || \"\",chipCount));\n                // ellipsisChip?.api.updateBgColor(previousChipColor);\n                ellipsisChipComp?.reRender();\n                break;\n            }\n    \n            this.updateUsedDimensions(width, height);\n            previousChipColor = option.color;\n            chipCount++; \n            totalRenderedChips++;\n        }\n\n        if(totalRenderedChips === 1 && ellipsisChipComp){\n            rootElement && rootElement.classList.add(\"dg-selectbox__root--single-chip\");\n        }\n    \n        if (ellipsisChipComp && selectedOptions.length === chipCount) {\n            // ellipsisChip?.api.destroyComponent();\n            ellipsisChipComp?.destroy();\n            rootElement && rootElement.classList.remove(\"dg-selectbox__root--single-chip\");\n        }\n    }\n\n    private isEllipsesNeeded(chipCount : number):boolean{\n        return ((chipCount+1) === this.selectDataPart.getSelectedOptions().length);\n    }\n\n    private createEllipsesRendererParams(color: string, chipCount: number):any{\n        const selectedOptions =this.selectDataPart.getSelectedOptions();\n        const remainingSelectedOptions = selectedOptions?.slice(-chipCount);\n        return {\n            bgColor : color,\n            chipCount :(selectedOptions.length - chipCount)-1,\n            remainingSelectedOptions \n        }\n    }\n\n    private updateUsedHeightForFirstChip(height: number): void {\n        this.totalUsedHeight += height; \n    }\n    \n\n    private resetContainerDimensions() {\n        const selectInputWrapperDOM : HTMLElement= this.selectInputHandler.getSelectInputWrapper()?.getElement();\n        // const selectIconContainer   : HTMLElement= this.selectInputHandler.getSelectBoxIcon()?.getElement() as HTMLElement;\n        const selectInner : HTMLElement = this.selectInputHandler.getSelectInput()?.getElement() as HTMLElement;\n\n        if(!selectInputWrapperDOM){\n            return;\n        }\n        // const InputWrapperComputedStyle = window.getComputedStyle(selectInputWrapperDOM);\n        // const selectIconContainerComputedStyle =  window.getComputedStyle(selectIconContainer);\n\n        // this.containerWidth = selectInputWrapperDOM?.offsetWidth -\n        //                     (parseInt(InputWrapperComputedStyle.paddingLeft) + parseInt(InputWrapperComputedStyle.paddingRight) \n        //                                             -(  (selectIconContainer.offsetWidth) - (parseInt(InputWrapperComputedStyle?.paddingLeft) + parseInt(InputWrapperComputedStyle?.paddingRight));\n\n                                //  this.containerWidth = selectInputWrapperDOM?.offsetWidth \n                                //                     - (parseInt(InputWrapperComputedStyle.paddingLeft) \n                                //                     + parseInt(InputWrapperComputedStyle.paddingRight)) \n                                //                     - ((selectIconContainer.offsetWidth ?? 0) \n                                //                     - (parseInt(selectIconContainerComputedStyle.paddingLeft) \n                                //                     + parseInt(selectIconContainerComputedStyle.paddingRight)));\n        this.containerWidth =  selectInner.offsetWidth;\n                        \n        this.containerHeight = selectInputWrapperDOM?.offsetHeight;\n        this.totalUsedWidth = 0;\n        this.totalUsedHeight = 0;\n    }\n\n    private addPlusIcon(appendTo: HTMLElement): HTMLElement | null {\n        if (this.optionHandler.isPlusIconEnabled()) {\n            this.handlePlusIconComp();\n            const plusIcon = this.comp.getPlusIcon();\n            appendTo.appendChild(plusIcon);\n            this.totalUsedWidth += this.getCachedDimensions(plusIcon).width ;\n            return plusIcon;\n        }\n        return null;\n    }\n\n    private addEllipsisChip(appendTo: HTMLElement, optionsCount: number, plusIcon: HTMLElement | null): any | null {\n        if(optionsCount <= 1) {\n            this.ellipsesDom = null;\n            return null;\n        }\n        !this.ellipsesDom && (this.ellipsesComp = this.comp.createEllipses());\n        this.ellipsesDom =  this.ellipsesComp?.getElement() as HTMLElement;\n        if (this.optionHandler.isUseElipses() ) {\n            if(plusIcon){\n                this.ellipsesDom && appendTo.insertBefore(this.ellipsesDom,plusIcon)\n            }\n            else{\n                this.ellipsesDom &&  appendTo.appendChild(this.ellipsesDom);\n            }\n            this.totalUsedWidth += this.getCachedDimensions(this.ellipsesDom).width;\n            return this.ellipsesComp;\n        }\n        return null;\n    }\n\n    private createChipDOM(option: any, appendTo: HTMLElement, ellipsisChip: HTMLElement|null, plusIcon: HTMLElement | null): HTMLElement {\n        const chipInstance = this.createChip(option);\n        const chipDOM = option.selectedValueRenderer\n            ? chipInstance.getElement()\n            : chipInstance.api.getElement();\n\n        if (ellipsisChip) {\n            appendTo.insertBefore(chipDOM, ellipsisChip);\n        } else if (plusIcon) {\n            appendTo.insertBefore(chipDOM, plusIcon);\n        } else {\n            appendTo.appendChild(chipDOM);\n        }\n\n        this.selectDataPart.updateChipInstance(option, chipInstance);\n\n     \n        const imageElement = chipDOM.querySelector(\"img\") as HTMLImageElement;\n        if (imageElement) {\n            this.cacheImageDimensions(imageElement);\n        }\n\n        return chipDOM;\n    }\n\n    private getCachedDimensions(element: HTMLElement): { width: number; height: number } {\n        const isImageRenderer = this.optionHandler.isImageRenderer();\n        const imageElement    = isImageRenderer ? element.querySelector(\"img\") as HTMLImageElement : null;\n        let cachedDimensions;\n\n        if (!this.chipCache && !imageElement) {\n            this.chipCache = new WeakMap<HTMLElement, { width: number; height: number }>();\n        }\n\n        imageElement ?(cachedDimensions= this.imageCache.get(this.generateIdFromUrl(imageElement.src))):(cachedDimensions = this.chipCache.get(element));\n        \n        if (cachedDimensions) {\n            if (imageElement) {\n                const imageId = this.generateIdFromUrl(imageElement.src);\n                const imageCacheEntry = this.imageCache.get(imageId);\n                if (imageCacheEntry) {\n                    this.imageCache.set(imageId, { \n                        ...imageCacheEntry, \n                        image: imageElement \n                    });\n                }\n            }\n            if(cachedDimensions.width!==0){\n                return cachedDimensions; \n            }\n     \n        }\n    \n        const computedStyle = window.getComputedStyle(element);\n        const width = element.offsetWidth + \n                      parseInt(computedStyle.marginLeft.trim() || \"0\", 10) + \n                      parseInt(computedStyle.marginRight.trim() || \"0\", 10);\n\n        const height = element.offsetHeight + \n                       parseInt(computedStyle.marginTop.trim() || \"0\", 10) + \n                       parseInt(computedStyle.marginBottom.trim() || \"0\", 10);\n\n        const dimensions = { width, height };\n\n        if(imageElement) {\n            const imageId = this.generateIdFromUrl(imageElement.src);\n            this.imageCache.set(imageId, { \n                image: imageElement,\n                width : width,\n                height : height\n            });\n        }else{\n            this.chipCache.set(element, dimensions); \n        }\n\n        return dimensions;\n    }\n\n    private cacheImageDimensions(image: HTMLImageElement) {\n        const imageId = this.generateIdFromUrl(image.src);\n    \n        const setDimensions = () => {\n            if(image.offsetWidth > 0){\n                this.imageCache.set(imageId, {\n                    image: image,\n                    width: image.offsetWidth,\n                    height: image.offsetHeight\n                });\n            }\n        };\n        \n    \n        if (image.complete && image.naturalWidth !== 0) {\n             setDimensions();\n        } else {\n            image.onload = () => {\n                setDimensions();\n            };\n            // image.onerror = () => {\n            //     console.error(`Failed to load image with ID: ${id}`);\n            // };\n        }\n    }\n    \n\n    private generateIdFromUrl(url: string): string {\n        return btoa(url); \n    }\n    \n\n    private fitsWithinContainer(width: number, height: number, isEllipsesNeeded : boolean): boolean {\n        let ellipseswidth = this.chipCache.get(this.ellipsesDom as HTMLElement)?.width ?? 0;\n        ellipseswidth = isEllipsesNeeded ? ellipseswidth : 0;\n        if ((this.totalUsedWidth-ellipseswidth) + width <= this.containerWidth) {\n            return true;\n        }\n        if (this.totalUsedHeight + height <= this.containerHeight) {\n            return true;\n        }\n        return false;\n    }\n\n    private updateUsedDimensions(width: number, height: number) {\n        if (this.totalUsedWidth + width <= this.containerWidth) {\n            this.totalUsedWidth += width;\n        } else {\n            this.totalUsedWidth = width;\n            this.totalUsedHeight += height;\n        }\n    }\n    //................resize handler ended.....................//\n\n    getElement():HTMLElement{\n        return this.comp.getElement();\n    }\n\n\n\n}\n\n\n","import { PostConstruct  } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { SelectInputController } from \"./select-input-controller\";\nimport { SelectInputCompType } from \"./select-input.types\";\nimport { PlusIconComponent } from \"../plus-icon/plus-icon-view\";\nimport { EllipsesComponent } from \"../ellipses/ellipses-view\";\n\n\nconst selectInput = (props: any) => {\n    const selectInputElement = document.createElement('div');\n    if (props.placeholder()) {\n        placeholder(props, selectInputElement);\n    }\n    return selectInputElement ;\n};\n\nconst placeholder = (props : any , parentComp : HTMLElement)=>{\n    let placeholderDom;\n    \n    const placeHolderRenderer = props.placeHolderRenderer();\n    const placeHolderRendererParams = props.placeHolderRendererParams();\n    if (placeHolderRenderer) {\n        const rendererInstance = new placeHolderRenderer();\n        rendererInstance.init(placeHolderRendererParams || {});\n        placeholderDom = rendererInstance.getElement();\n        placeholderDom.classList.add('dg-selectbox__input-placeholder');\n    } else {\n        placeholderDom = selectSpan(props.placeholder());\n        placeholderDom.classList.add('dg-selectbox__input-placeholder');\n    }\n    \n    parentComp.appendChild(placeholderDom);\n}\n\n\nconst selectSpan = (value:string):HTMLElement=> {\n    const div = document.createElement('div');\n    div.className = `dg-selectbox__text`;\n    div.textContent = value;\n   return div;\n}\n\nexport class SelectInputComponent extends Component {\n\n    props : any;\n    plusIconComp !:PlusIconComponent;\n    ellipsesComp !:EllipsesComponent;\n\n    @PostConstruct()\n    init(){\n        const controller = this.createManagedBean(new SelectInputController());\n        const props = controller.getProperty();\n        this.props = props; \n         \n        this.setTemplate(selectInput(props));\n        controller.setComp(this.getComponent());\n    }       \n    \n    private getComponent():SelectInputCompType{\n        const updateSelectSpan = (value:string):HTMLElement=> selectSpan(value);\n        return{\n            getElement           : () => this.getGui(),\n            getParentComp        : ()=>this.getGui(),\n            addOrRemoveCSSClass  : (className: string) => this.addOrRemoveCSSClass(className),\n            createSelectSpan     : (value:string):HTMLElement=> updateSelectSpan(value),\n            destroy              : () => this.destroy(),\n            renderPlaceholder    : (props:any)=> this.renderPlaceholder(props),\n            renderPlusIcon       : (props:any, parentDOM : HTMLElement)=> this.renderPlusIcon(props, parentDOM),\n            destroyPlusIcon      : ()=> this.destroyPlusIcon(),\n            getPlusIcon          : ()=> this.getPlusIcon(),\n            createEllipses       : ()=> this.createEllipses(),  \n            destroyEllipses      : ()=> this.destroyEllipses(),\n        }\n    }\n\n    private addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    protected destroy(): void {\n\t\tthis.getGui().remove();    \n\t}\n\n    renderPlaceholder(props:any):void{\n        // Clear existing placeholder\n        const parentComp = this.props.getParentComp();\n        const existingPlaceholder = parentComp.querySelector('.dg-selectbox__input-placeholder');\n        if (existingPlaceholder) {\n            existingPlaceholder.remove();\n        }\n        \n        // Render new placeholder\n        placeholder(props, parentComp);\n    } \n\n    renderPlusIcon(_props:any,parentDOM : HTMLElement){\n        const comp =  new PlusIconComponent();\n        this.plusIconComp = this.createBean(comp);\n        parentDOM.appendChild(this.plusIconComp?.getElement()); \n    }\n\n    destroyPlusIcon():void{\n        this.plusIconComp?.destroy();\n    }\n\n    getPlusIcon():HTMLElement{\n        return this.plusIconComp?.getElement();\n    }\n\n    createEllipses() : EllipsesComponent{\n        this.ellipsesComp =  this.createManagedBean(new EllipsesComponent());\n        return this.ellipsesComp;\n        \n    }\n\n    destroyEllipses():void{\n        this.ellipsesComp?.destroy();\n    }\n\n\n}\n\n\n\n\n","import { generateUtilityClass } from \"@dg/utils\";\nimport {CSSRegistry} from \"../../modules/CSSRegistry\";\n\n// const globalNameSpace = CSSRegistry.getNameSpaces();\n\nexport function getSelectRootUtilityClass(slots: { slot: string, modifiers: string[] }): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('selectbox', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n","import {SelectRootCompType} from \"./select-root-types\"\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { ISelectInputHandler } from \"../model/select-input-handler\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\nimport { getSelectRootUtilityClass } from \"./select-root-classes\";\nimport { composeClasses } from \"@dg/utils\";\nimport { ISelectOptionHandler } from \"../model/select-option-handler.types\";\nimport { ISelectDataPart } from \"../model/select-ds\";\nimport { PopupHandler } from \"../model/popup-handler\";\n\nconst useUtilityClasses = () =>{\n    const slots ={\n        root : {\n            slot : 'root',\n            modifiers:[\n            ],\n        },\n\n    };\n    return composeClasses(slots, getSelectRootUtilityClass);\n}\n\nexport class SelectRootController extends EventEmitter{\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n    @AutoWired(\"SelectDataPart\") protected selectDataPart !: ISelectDataPart;\n    @AutoWired(BEAN_NAME.POPUP_HANDLER) protected popupHandler !: PopupHandler;\n    \n    private comp!: SelectRootCompType\n\n    setComponent(component: SelectRootCompType): void {\n        this.comp = component;\n        this.applyClasses();\n        this.selectInputHandler.registerSelectRoot(this);\n\n        this.addListener(this.eventHandler, \"EVENT_VALUE_UPDATE\", this.addErrorState.bind(this));\n        this.addListener(this.eventHandler,'SET_FOCUS_CLASS',this.applyFocusClass.bind(this))\n        this.addListener(this.eventHandler, \"PROPERTY_CHANGED\", () => {\n            this.addErrorState();\n            this.applyClasses();\n        })\n    }\n\n    private addErrorState() : void {\n        const isValid = this.optionHandler.isValid();\n\n        this.comp.getGui().classList.toggle('dg-input__status--error', isValid);\n    }\n\n    private applyClasses() : void {\n        const classes = useUtilityClasses();\n        this.comp.addOrRemoveCssClass(classes.root);\n        this.addErrorState();\n        this.comp.getGui().classList.add('dg-field__root');\n        this.optionHandler.isDisabled() && this.comp.getGui().classList.add('dg-input__status--disabled')\n        this.optionHandler.isMultiple() ? this.comp.getGui().classList.add('dg-multiselect__root') :this.comp.getGui().classList.add('dg-singleselect__root');\n        this.optionHandler.getClassName() && this.comp.getGui().classList.add(this.optionHandler.getClassName());\n    }\n\n     applyFocusClass(params : any):void{\n       if(params.value){\n        this.comp.getGui().classList.add('dg-input__status--focus');\n\n       }else{\n        this.comp.getGui().classList.remove('dg-input__status--focus');\n        \n       }\n\n    }\n\n    getProperty(): any{\n        return {\n            isDisabled : ()=>this.optionHandler.isDisabled(),\n            isReadOnly : ()=>this.optionHandler.isReadOnly(),\n            isClearable : ()=>this.optionHandler.isClearableButtonEnabled(),\n            getLabel : ()=>this.optionHandler.getLabel(),\n            isRequired : ()=>this.optionHandler.isRequired(),\n            getDescription : ()=>this.optionHandler.getDescription(),\n            canGenerateEmptyDom : ()=>this.optionHandler.canGenerateEmptyDom(),\n            showErrorState : () => this.optionHandler.showErrorState()\n\n        }\n    }\n\n    getParamsProperty(){\n        return {\n            label : {\n\t\t\t\tgetLabelClasses :()=> \"dg-selectbox__label\",\n\t\t\t\tgetLabelTitleClasses :()=> \"dg-selectbox__label-title\"\n\t\t\t},\n\n\t\t\tdescription : {\n\t\t\t\tgetValidationMessageClasses : ()=>  \"dg-selectbox__validation-message\",\n\t\t\t\tgetDescriptionClasses :()=> \"dg-selectbox__description\"\n\t\t\t}\n        };\n    }\n\n    getElement() : HTMLElement | undefined {\n        return this.comp?.getGui();\n    }\n\n    hide(subElements?: string[]): void {\n        const element = this.getElement();\n        if (!element) return;\n    \n        if (!subElements?.length) {\n            element.style.display = 'none';\n            return;\n        }\n    \n        const actions: Record<string, () => void> = {\n            label: this.hideLabel.bind(this),\n            description: this.hideDescription.bind(this),\n            prefix: this.hidePrefix.bind(this),\n            suffix: this.hideSuffix.bind(this),\n        };\n    \n        subElements.forEach(sub => actions[sub]?.());\n    }\n    \n    show(subElements?: string[]): void {\n        const element = this.getElement();\n        if (!element) return;\n    \n        if (!subElements?.length) {\n            element.style.display = 'flex';\n            return;\n        }\n    \n        const actions: Record<string, () => void> = {\n            label: this.showLabel.bind(this),\n            description: this.showDescription.bind(this),\n            prefix: this.showPrefix.bind(this),\n            suffix: this.showSuffix.bind(this),\n        };\n    \n        subElements.forEach(sub => actions[sub]?.());\n    }\n\n    hideLabel(){\n        const label = this.getElement()?.querySelector('.dg-field__label') as HTMLElement;\n        label && (label.style.display='none')\n    }\n    hideDescription(){\n        const description = this.getElement()?.querySelector('.dg-field__description') as HTMLElement;\n        description && (description.style.display = 'none');\n    }\n    hideSuffix(){\n        const suffixElement = this.getElement()?.querySelector('.dg-suffix-elem') as HTMLElement;\n        suffixElement && (suffixElement.style.display ='none')\n    }\n    hidePrefix(){\n        const prefixElement = this.getElement()?.querySelector('.dg-prefix-elem')  as HTMLElement;\n        prefixElement && (prefixElement.style.display = 'none');\n    }\n    showLabel(){\n        const label = this.getElement()?.querySelector('.dg-field__label') as HTMLElement;\n        label && (label.style.display='block')\n    }\n    showDescription(){\n        const description = this.getElement()?.querySelector('.dg-field__description') as HTMLElement;\n        description && (description.style.display = 'block')\n    }\n    showSuffix(){\n        const suffixElement = this.getElement()?.querySelector('.dg-suffix-elem') as HTMLElement;\n        suffixElement && (suffixElement.style.display ='block')\n    }\n    showPrefix(){\n        const prefixElement = this.getElement()?.querySelector('.dg-prefix-elem')  as HTMLElement;\n        prefixElement && (prefixElement.style.display = 'block');\n    }\n\n    destroy(){\n        this.optionHandler.isOptionAsChip() && this.selectDataPart.deleteAllChipInstance();\n        this.comp.destroy();\n    }\n\n    getSelectContainerElement():HTMLElement{\n        return this.comp.getSelectContainerElement()\n    }\n\n    \n}","import {Component} from \"@dg/corecomponent/Component.js\";\nimport {PostConstruct, queryAssignedNodes} from \"@dg/corecomponent\"\nimport { SelectRootController } from \"./select-root-controller\";\nimport { SelectRootCompType } from \"./select-root-types\";\n \n\nfunction rootTemplate(props :any){\n\n\tconst label = props.getLabel();\n\tconst description = props.getDescription();\n\tconst generateEmptyDom = props.canGenerateEmptyDom();\n\tconst error = props.showErrorState();\n\n\tconst fragment =  document.createElement(\"div\");\n\tif (label || generateEmptyDom) {\n\t\tconst labelEl = document.createElement('select-label');\n\t\tlabelEl.setAttribute('ref', 'label');\n\t\tfragment.appendChild(labelEl);\n\t}\n\n\tconst container = document.createElement('select-container');\n\tcontainer.setAttribute('ref','select-container')\n\tfragment.appendChild(container);\n\n\n\tif (description || generateEmptyDom) {\n\t\tconst helperText = document.createElement('select-helper-text');\n\t\thelperText.setAttribute('ref', 'description');\n\t\tfragment.appendChild(helperText);\n\t}\n\n\tif(generateEmptyDom || error ) {\n\t\tconst errorElement = document.createElement('select-error');\n\t\terrorElement.setAttribute('ref', 'error');\n\t\tfragment.appendChild(errorElement);\n\t}\n\n\n\n\treturn fragment;\n}\n\n\nexport class SelectRootComponent extends Component{\n\n\t@queryAssignedNodes('select-container') private selectContainer !: HTMLElement\n\n\tprivate appendTo: HTMLElement | null | undefined;\n\tconstructor(appendTo : HTMLElement | undefined){\n\t\tsuper();\n\t\tthis.appendTo = appendTo;\n\t}\n\n\t@PostConstruct()\n\tinit() : void {\n\t\tconst component :SelectRootCompType ={\n\t\t\tgetGui             : () =>this.getGui(),\n\t\t\taddOrRemoveCssClass: (className :string, _addOrRemove : boolean) => this.addOrRemoveCSSClass(className),\n\t\t\tdestroy            : ()=> this.destroy(),\n\t\t\tgetSelectContainerElement : ()=> this.getSelectContainerElement()\n\t\t}\n\n\t\tconst controller  =  this.createManagedBean(new SelectRootController());\n\t\tconst props =  controller.getProperty();\n\t\tconst root = rootTemplate(props);\n\t\tconst paramsProperty = controller.getParamsProperty();\n\t\tthis.setTemplate(root,{\n\t\t\tlabel      : paramsProperty.label,\n\t\t\tdescription: paramsProperty.description,\n\t\t\terror      : paramsProperty.description\n\t\t});\n\t\tcontroller.setComponent(component);\n\t\tthis.appendTo && this.appendElementIntoUserDom();\n\n\t}\n\n\tgetSelectContainerElement():HTMLElement{\n\t\treturn this.selectContainer\n\t}\n\n\tprivate addOrRemoveCSSClass(className : string ): void{\n\t\tconst element = this.getGui();\n\t\telement && (element.className =  className);\n\t}\n\n\tprivate appendElementIntoUserDom() :void{\n\t\tconst eGui = this.getGui();\n\t\tthis.appendTo && this.appendTo.appendChild(eGui);\n\t\tthis.addDestroyFunc(()=>{\n\t\t\tthis.appendTo?.remove();\n\t\t\tthis.appendTo = null;\n\t\t})\n\t}\n\n\tdestroy():void{\n\t\tthis.getGui().remove();  \n\t}\n}","\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n// import { composeClasses } from \"@dg/utils\";\n// import { getRadioUtilityClass } from \"../rating-utils/rating-classes\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { SelectUserComponentHandlerTypes } from \"../model/select-user-component-handler.types\";\nimport { ISelectOptionHandler } from \"../model/select-option-handler.types\";\nimport { SelectSVGComponentType } from \"./selectbox-icon.types\";\nimport { getSelectRootUtilityClass } from \"../select-root/select-root-classes\";\nimport { composeClasses } from \"@dg/utils\";\nimport { ISelectInputHandler } from \"../model/select-input-handler\";\n// import { IRatingUserComponentHandler } from \"../model/rating-user-component-handler.types\";\n\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\troot: {\n\t\t\tslot: 'icon-container',\n\t\t\tmodifiers: [\n\t\t\t\t\n\t\t\t],\n\t\t},\n\t};\n\n\treturn composeClasses(slots, getSelectRootUtilityClass);\n};\n\n\n\n\nexport class SelectBoxIconController extends EventEmitter {\n    private component !: SelectSVGComponentType\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) userComponentHandler !: SelectUserComponentHandlerTypes;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler !: ISelectOptionHandler;\n    @AutoWired(\"controllerHandler\") protected selectInputHandler !: ISelectInputHandler;\n\n    \n    setComponent(component : SelectSVGComponentType){\n        this.component = component;\n        this.applyClassNames();\n        this.setRendererDetails();\n        this.selectInputHandler.registerSelectBoxIcon(this);\n        this.registerEvents();\n    }\n\n    private registerEvents(){\n        this.addListener(this.eventHandler,'ShowDropdownIcon_Property_Changed',this.updateDropdownIcon.bind(this));\n    }\n\n    private applyClassNames(){\n        const selectboxIconClasses = useUtilityClasses();\n\t\tthis.component.getElement().classList.add(selectboxIconClasses.root)\n    }\n\n    setRendererDetails() : void {\n        const rendererWrapper = this.createIconRendererWrapper();\n        const params          = this.createRendererParams();\n        const  userDetails     = this.userComponentHandler.getIconRendererDetails(rendererWrapper, params) as IComponentDetails;\n        // this.isInValid = inValid;\n        this.component.setRendererDetails(userDetails,params);\n    }\n    private createIconRendererWrapper() {\n        return {\n\t\t\tgetRenderer          : () => this.optionHandler.getSelectBoxIconRenderer(),\n\t\t\tgetUserRendererParams: () => this.optionHandler.getSelectBoxIconRendererParams(),\n\t\t};\n    }\n    private createRendererParams() {\n        return {\n\t\t\tvalue: this.optionHandler.getSelectBoxIconRendererParams(),\n            showDropdownIcon  : this.optionHandler.showDropdownIcon(),\n\t\t};\n    }\n\n    reRenderIcon():void{\n        this.setRendererDetails();\n    }\n\n    updateDropdownIcon(){\n        // console.log(\"updateDropdownIcon called\");\n        !(this.optionHandler.showDropdownIcon()) && this.destroyChildElement();\n        this.reRenderIcon();\n    }\n\n     destroyChildElement(){\n        this.component.getElement().textContent = \"\";\n     }\n\n     getElement():HTMLElement{\n        return this.component.getElement();\n     }\n}","\n\n\nimport { PostConstruct, clearElement, removeFromParent } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent/Component.js\";\nimport { IComponentDetails } from \"../../../../utility/component-detail.types\";\nimport { SelectSVGComponentType } from \"./selectbox-icon.types\";\nimport { SelectBoxIconController } from \"./selectbox-icon-controller\";\n\n\nconst SelectBoxIconComponentTemplate = ()=>{\n    const span = document.createElement(\"div\");\n    return span\n}\n\nexport class SelectboxIconComponent extends Component {\n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    @PostConstruct()\n    init() {\n        const comp : SelectSVGComponentType = {\n            getElement : () => this.getGui(),\n            addOrRemoveCSSClass : (className: string) => this.addOrRemoveCSSClass(className),\n            setRendererDetails : (rendererDetails: IComponentDetails,params :any)=>this.setRendererDetails(rendererDetails,params),\n\t\t\tdestroy                     : () => this.destroy()\n        }\n\n        const controller = this.createBean(new SelectBoxIconController());\n        this.setTemplate(SelectBoxIconComponentTemplate())\n        controller.setComponent(comp);\n    }\n\n\n    private  addOrRemoveCSSClass(className: string) : void {\n        const element = this.getGui();\n        element && (element.className = className);\n    }\n\n    private setRendererDetails(rendererDetails: IComponentDetails,params:any): void {\n\t\tif (rendererDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = rendererDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\tparams.showDropdownIcon && this.insertValueWithoutCellRenderer()\n\t\t}\n\t}\n\n\t private destroyRenderer(): void {\n\t\tthis.renderer = this.context.destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n\tprivate insertValueWithoutCellRenderer(): void {\n\t\tconst parentElement = this.getGui();\n\t\tclearElement(parentElement);\n\t\n\t\tconst span = document.createElement(\"span\");\n\t\tspan.classList.add(\"dg-selectbox__dropdown-icon\");\n\t\n\t\tconst svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n\t\tsvg.setAttribute(\"width\", \"7px\");\n\t\tsvg.setAttribute(\"height\", \"7px\");\n\t\tsvg.setAttribute(\"viewBox\", \"0 0 8 8\");\n\t\n\t\tconst g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\t\tg.setAttribute(\"data-name\", \"Layer 2\");\n\t\n\t\tconst path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n\t\tpath.setAttribute(\"d\", \"M7.94.35L4.15 4.94a.22.22 0 0 1-.3 0L.06.35A.21.21 0 0 1 .22 0h7.56a.21.21 0 0 1 .16.35z\");\n\t\tpath.setAttribute(\"data-name\", \"Layer 8\");\n\t\n\t\tg.appendChild(path);\n\t\tsvg.appendChild(g);\n\t\tspan.appendChild(svg);\n\t\tparentElement.appendChild(span);\n\t}\n\t\n\n\tprivate afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\t\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\t}\n\n}\n","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","import { SelectDropdown } from \"../dropdown/dropdown\";\nimport { IDropdownConfiguration, DropdownOptionElementModel } from \"../dropdown/dropdown_configuration\";\nimport { PopupHandler } from \"../select/src/core/model/popup-handler\";\nimport { ISelectConfigAPI } from \"../select/src/core/model/select-configApi\";\nimport { PopupComponentPositionParams, Position } from \"../utility/PopupHandler/CorePopupHandler\";\n\nexport interface ISelectDropdownInteractor{\n\n    setModel(model: ISelectConfigAPI):void;\n    destroy():void;\n    focus():void;\n    blur():void;\n    getInstance():any;\n    addOptions(options : string[] |  DropdownOptionElementModel[]) : void;\n    removeOptions(options : string[] |  DropdownOptionElementModel[]) : void;\n    onSearch(value:string):void;\n    autoFocusSelectedOption():void;\n    enableOptions(optionIDs : string[]) : void;\n    disableOptions(optionIDs : string[]) : void;\n}\n\nexport interface ICustomRenderer{\n    init(params : any) : void;\n    getElement() : HTMLElement | null;\n    destroy() : void;\n}\n\n\n\n\nexport class SelectDropdownInteractor implements ISelectDropdownInteractor{\n\n    private model !:  ISelectConfigAPI;\n    private dropdown : any ;\n    private popupDestroy :any;\n    private popupHandler =  new PopupHandler();\n\n   public setModel(model: ISelectConfigAPI):void{\n        this.model = model;\n        this.createDropdown();\n    }\n\n\n   public  getInstance(){\n        return this.dropdown;\n    }\n\n    public destroy(): void{\n        // this.dropdown.api.destroy();\n        this.popupDestroy();\n    }\n\n    public focus():void{    \n        this.dropdown.api.focus();\n    }\n\n    public blur():void{\n        this.dropdown.api.blur();\n    }\n\n    public addOptions(options : string[] |  DropdownOptionElementModel[]) : void{\n        this.dropdown.api.addOptions(options);\n    }\n\n    public removeOptions(options : string[] |  DropdownOptionElementModel[]) : void{\n        this.dropdown.api.removeOptions(options);\n    }\n\n    public autoFocusSelectedOption():void{\n        this.dropdown.api.autoFocusSelectedOption();\n    }\n\n    public enableOptions(optionIDs : string[]) : void {\n        this.dropdown.api.enableOptions(optionIDs);\n    }\n\n    public disableOptions(optionIDs : string[]) : void {\n        this.dropdown.api.disableOptions(optionIDs);\n    }\n\n    onSearch(value: string): void {\n        this.dropdown.api.onSearch(value);\n    }\n\n\n    private addPosition(){\n        const dropdownElement = this.dropdown.api.getElement();\n        const dropdownPosition = this.model.getDropdownPosition() ?? Position.bottomLeft;\n\n        const positionParams: PopupComponentPositionParams = {\n            popUpElement    : dropdownElement,\n            sourceElement   : this.model.getSelectInputWrapper(),\n            position        : dropdownPosition, \n            keepWithinBounds : true,\n            gapX : this.model.getGapX(),\n            gapY : this.model.getGapY(),   \n            relativePosition : true  \n        };\n\n        const positionCallback = this.popupHandler.positionPopupByComponent.bind(this.popupHandler, positionParams, this.model.getDropdownAppendTo());\n\n\n        const addPopup = this.popupHandler.addPopup({\n                            childElement   : dropdownElement,\n                            anchorToElement: this.model.getAppendTo(),\n                            popupParentElement: this.model.getDropdownAppendTo(),\n                            positionCallback,\n                            ariaLabel : '',\n                        });\n        this.popupDestroy = addPopup.hideFunction;\n    }\n\n    private createDropdown(){\n\n        this.dropdown = new SelectDropdown(this.createDropdownConfig());\n        this.addPosition();\n        if(this.model.isVirtualList()){\n            this.dropdown.api.updateVirtualList();\n        } \n    }\n    \n    private createDropdownConfig():IDropdownConfiguration{\n\n        return {\n            options           : this.model.getOptions(),\n            multiple          : this.model.isMultiple(),\n            selectedData     : ()=>this.model.getSelectedData(),\n            selectionLimit    : this.model.getSelectionLimit(),\n            closeOnSelect     : this.model.isCloseOnSelect(),\n\n            dropdownAppendTo  : this.model.getDropdownAppendTo(),\n            searchable        : this.model.isSearchable(),\n            searchBoxPlaceholder : this.model.getSearchBoxPlaceholder(),\n            virtualList       : this.model.isVirtualList(),\n            sort              : this.model.isSortEnabled(),\n            sortOrder         : this.model.getSortOrder(),\n            groupBy           : this.model.isGroupByEnabled(),\n            selectAllButton   : this.model.isSelectAllButtonEnabled(),\n            clearable         : this.model.isClearableButtonEnabled(),\n            isOptionAsChip    : this.model.isOptionAsChip(),\n\n            enableCreateNewOption : this.model.isCreateNewOptionEnabled(),\n            enableNoneOption      : this.model.isNoneOptionEnabled(),\n            // enableAddCollaborator : this.model.isAddCollaboratorEnabled(),\n\n            dropdownRenderer               : this.model.getDropdownRenderer(),\n            dropdownRendererParams         : this.model.getDropdownRendererParams(),\n            dropdownFooterRenderer         : this.model.getDropdownFooterRenderer(),\n            dropdownFooterRendererParams   : this.model.getDropdownFooterRendererParams(),\n            dropdownHeaderRenderer         : this.model.getDropdownHeaderRenderer(),\n            dropdownHeaderRendererParams   : this.model.getDropdownHeaderRendererParams(),\n\n            createNewOptionRenderer        : this.model.getCreateNewOptionRenderer(),\n            createNewOptionRendererParams  : this.model.getCreateNewOptionRendererParams(),\n\n            noOptionRenderer          : this.model.getNoOptionRenderer(),\n            noOptionRendererParams    : this.model.getNoOptionRendererParams(),\n\n            readonly              : this.model.isReadOnly(),\n\n            classname             : this.model.getDropdownClassname(),\n\n            autoFocusSelectedOption : this.model.isautoFocusSelectedOptionEnabled(),\n\n            tooltipMessage               : this.model.getTooltipMessage(),\n            tooltipRegex                 : this.model.getTooltipRegex(),\n            tooltipPosition              : this.model.getTooltipPosition(),\n            tooltipAppendto              : this.model.getTooltipAppendto(),\n            tooltipHideDelay             : this.model.getTooltipHideDelay(),\n            tooltip                      : this.model.shouldShowTooltip(),\n\n            validation        : this.model.getValidation(),\n\n            onBeforeSelect       : (params:any) =>this.model.onBeforeSelect(params),\n            onAfterSelect        : (params:any) =>this.model.onAfterSelect(params),\n            onBeforeDeselect     : (params:any) =>this.model.onBeforeDeselect(params),\n            onAfterDeselect      : (params:any) =>this.model.onAfterDeselect(params),\n            onChange             : (params:any) =>this.model.onChange(params),\n            onBeforeDropdownOpen : () =>this.model.onBeforeDropdownOpen(),\n            onAfterDropdownOpen  : () =>this.model.onAfterDropdownOpen(),\n            onBeforeDropdownClose: (focus?:boolean) =>this.model.onBeforeDropdownClose(focus),\n            onAfterDropdownClose : () =>this.model.onAfterDropdownClose(),\n            onCreateOption       : (newOption:any) =>this.model.onCreateOption(newOption),\n            onBeforeCreateOption : (newOption:any)                                           : any =>this.model.onBeforeCreateOption(newOption),\n            onAfterCreateOption  : (newOption:any)                                           : any=>this.model.onAfterCreateOption(newOption),\n            onKeydown            : (event:KeyboardEvent)=>this.model.onKeydown(event),\n            model                : this.model.getModel(),\n            onSelectAll          : (params) => this.model.onSelectAll(params),\n            onBeforeSelectAll    : (params) => this.model.onBeforeSelectAll(params),\n            onAfterSelectAll     : (params) => this.model.onAfterSelectAll(params)\n\n        }\n        \n    }\n\n\n\n    \n}","export const KeyCodes = {\n    Any             : \"any\",\n    KeyA            : \"a\",\n    KeyS            : \"s\",\n    KeyD            : \"d\",\n    KeyF            : \"f\",\n    KeyH            : \"h\",\n    KeyG            : \"g\",\n    KeyZ            : \"z\",\n    KeyX            : \"x\",\n    KeyC            : \"c\",\n    KeyV            : \"v\",\n    IntlBackslash   : \"\\\\\",\n    KeyB            : \"b\",\n    KeyQ            : \"q\",\n    KeyW            : \"w\",\n    KeyE            : \"e\",\n    KeyR            : \"r\",\n    KeyY            : \"y\",\n    KeyT            : \"t\",\n    Digit1          : \"1\",\n    Digit2          : \"2\",\n    Digit3          : \"3\",\n    Digit4          : \"4\",\n    Digit6          : \"6\",\n    Digit5          : \"5\",\n    Equal           : \"=\",\n    Digit9          : \"9\",\n    Digit7          : \"7\",\n    Minus           : \"-\",\n    Digit8          : \"8\",\n    Digit0          : \"0\",\n    BracketRight    : \"]\",\n    KeyO            : \"o\",\n    KeyU            : \"u\",\n    BracketLeft     : \"[\",\n    KeyI            : \"i\",\n    KeyP            : \"p\",\n    Enter           : \"enter\",\n    KeyL            : \"l\",\n    KeyJ            : \"j\",\n    Quote           : \"'\",\n    KeyK            : \"k\",\n    Semicolon       : \";\",\n    Backslash       : \"\\\\\",\n    Comma           : \",\",\n    Slash           : \"/\",\n    KeyN            : \"n\",\n    KeyM            : \"m\",\n    Period          : \".\",\n\n    Tab             : \"tab\",\n    Space           : \"space\",\n    Backquote       : \"`\",\n    Backspace       : \"backspace\",\n    Escape          : \"escape\",\n    ShiftLeft       : \"shift\",\n    CapsLock        : \"capslock\",\n    AltLeft         : \"alt\",\n    ControlLeft     : \"ctrl\",\n    ShiftRight      : \"shift\",\n    AltRight        : \"alt\",\n    ControlRight    : \"ctrl\",\n    F17             : \"f17\",\n    NumpadDecimal   : \".\",\n    NumpadMultiply  : \"*\",\n    NumpadAdd       : \"+\",\n    NumLock         : \"numlock\",\n    NumpadDivide    : \"/\",\n    NumpadEnter     : \"enter\",\n    NumpadSubtract  : \"-\",\n    F18             : \"f18\",\n    F19             : \"f19\",\n    NumpadEqual     : \"=\",\n    Numpad0         : \"0\",\n    Numpad1         : \"1\",\n    Numpad2         : \"2\",\n    Numpad3         : \"3\",\n    Numpad4         : \"4\",\n    Numpad5         : \"5\",\n    Numpad6         : \"6\",\n    Numpad7         : \"7\",\n    F20             : \"f20\",\n    Numpad8         : \"8\",\n    Numpad9         : \"9\",\n    IntlYen         : \"¥\",\n    IntlRo          : \"ろ\",\n    NumpadComma     : \",\",\n    F5              : \"f5\",\n    F6              : \"f6\",\n    F7              : \"f7\",\n    F3              : \"f3\",\n    F8              : \"f8\",\n    F9              : \"f9\",\n    F11             : \"f11\",\n    F13             : \"f13\",\n    F16             : \"f16\",\n    F14             : \"f14\",\n    F10             : \"f10\",\n    ContextMenu     : \"contextmenu\",\n    F12             : \"f12\",\n    F15             : \"f15\",\n    Home            : \"home\",\n    PageUp          : \"pageup\",\n    Delete          : \"delete\",\n    F4              : \"f4\",\n    End             : \"end\",\n    F2              : \"f2\",\n    PageDown        : \"pagedown\",\n    F1              : \"f1\",\n    ArrowLeft       : \"arrowleft\",\n    ArrowRight      : \"arrowright\",\n    ArrowDown       : \"arrowdown\",\n    ArrowUp         : \"arrowup\",\n    MetaLeft        : \"ctrl\",\n    MetaRight       : \"ctrl\",\n}\n\nexport const eventKeys = {\n    ctrl     : 'ctrl',\n    any      : 'all',\n    hyper    : 'hyper',\n    super    : 'super',\n    meta     : 'meta',\n    control  : 'control',\n    shift    : 'shift',\n    alt      : 'alt',\n    altGraph : 'altgraph',\n    fn       : 'fn'\n}\nexport const isMacOS = navigator.platform === 'MacIntel';\n\nexport function isMetaKey(event : KeyboardEvent): boolean {\n    return isMacOS && event.key === 'Meta';\n}\n\nexport const ModifierKeys = [ eventKeys.hyper, eventKeys.super, eventKeys.ctrl, eventKeys.meta, eventKeys.control, eventKeys.shift, eventKeys.alt, eventKeys.altGraph, eventKeys.fn];","import { deBounce } from \"./Utility\";\nimport { ModifierKeys, KeyCodes, isMacOS, isMetaKey } from \"./Constants/KeyEventConstants\";\nimport { IEventtype, IExecutionParam, IEventPhaseMapping, IKeyEventHandler, IKeyEventConfiguration, IDefaultKeyEventConfiguration, IKeyEventMeta } from \"./Interface/IKeyEventManager\";\n\n\nconst capturingPhase    = Event[\"CAPTURING_PHASE\"];\nconst bubblePhase       = Event[\"BUBBLING_PHASE\"];\n\nfunction sortKeyCombo(keyCombo : string[]) : string[] {\n    return keyCombo.sort((a : any, b : any) => {\n        return ModifierKeys.indexOf(a) - ModifierKeys.indexOf(b)\n    });\n}\n\nfunction getCaptureKey(isCapture : boolean) : 'capture' | 'bubble' {\n    return isCapture ? 'capture' : 'bubble';\n}\n\nfunction sanitizeKeyCombo(keyCombo : string) : string {\n    const keyComboArr = keyCombo.split('+');\n    keyComboArr.forEach((val, index) => {\n        keyComboArr[index] = val.trim();\n    });\n    keyCombo = keyComboArr.join('+');\n    return keyCombo.toLowerCase();\n}\n\nclass KeyEventHandler implements IKeyEventHandler {\n    static DefaultConfiguration : IDefaultKeyEventConfiguration = {\n        description   : '',\n        capture       : false,\n        isKonami      : false,\n        eventType     : 'keydown',\n        repeat        : true\n    }\n\n    static konamiDelay = 500;\n\n    private listenerMapping     !: Record<IEventtype, IEventPhaseMapping>;\n    private defaultConfig       : IDefaultKeyEventConfiguration;\n    public  destroy             : () => void;\n    private isPaused            : boolean;\n    private activeKeys          : string[];\n    private konamiSequence      : string[];\n    private clearKonamiSequence : () => void;\n    private container           : HTMLElement;\n\n    constructor(container : HTMLElement = document.body, defaultConfig : IDefaultKeyEventConfiguration = {}) {\n        this.container           = container;\n        this.defaultConfig       = { ...{}, ...KeyEventHandler.DefaultConfiguration, ...defaultConfig };\n        this.activeKeys          = [];\n        this.konamiSequence      = [];\n        this.isPaused            = false;\n        this.destroy             = () => {};\n        this.clearKonamiSequence = () => {};\n        this.init();\n    }\n\n    resetListenerMapping() {\n        this.listenerMapping = { keydown: { capture: {}, bubble: {} }, keyup: { capture: {}, bubble: {} } };\n    }\n\n    private init() {\n        const triggerBubblingCallback  = (ev : KeyboardEvent)=>{\n            (ev.eventPhase != capturingPhase) && this.executeKeyCombo(ev, bubblePhase);\n        }\n        const triggerCapturingCallback = (ev : KeyboardEvent)=>{\n            (ev.eventPhase == capturingPhase) && this.executeKeyCombo(ev, capturingPhase)\n        };\n\n        //konami sequence\n        const addKonamiSequence = (ev : KeyboardEvent) => {\n            const keyCode = ev.code as (keyof typeof KeyCodes);\n            const key = KeyCodes[keyCode];\n            this.konamiSequence.push(key);\n            this.clearKonamiSequence();\n        };\n\n        this.clearKonamiSequence   = deBounce(() => this.konamiSequence = [], KeyEventHandler.konamiDelay);\n\n        //activeKeys maintaining\n        const addActiveKeys = (ev  : KeyboardEvent) => {\n            const code = ev.code as (keyof typeof KeyCodes);\n            const key = KeyCodes[code];\n            const isMetaHeld = ev.metaKey;\n            if(isMetaHeld && isMacOS){\n                this.activeKeys = [];\n            }\n            const isModifierKey = ModifierKeys.includes(key.toLowerCase());\n            !isModifierKey && !this.activeKeys.includes(key) && this.activeKeys.push(key);\n        };\n\n        const clearActiveKeys   = (ev : KeyboardEvent) =>{\n            const code = ev.code as keyof typeof KeyCodes;\n            if(isMetaKey(ev)){\n                this.activeKeys = [];\n            }\n            else if(code){\n                const key = KeyCodes[code];\n                const index = this.activeKeys.indexOf(key);\n                index != -1 && this.activeKeys.splice(index, 1);\n            } \n            else{\n                this.activeKeys = []\n            }\n        }; \n\n        const keydown = { capture : {}, bubble  : {} };\n        const keyup   = { capture : {}, bubble  : {} };\n\n        this.listenerMapping = { keydown, keyup };\n\n        const handleFocusChange = (ev: FocusEvent) => {\n            if (!this.container.contains(ev.target as Node)) {\n                this.activeKeys     = [];\n                this.konamiSequence = [];\n            }\n        };\n\n\n        const keyDownCapturingCallback = (ev : KeyboardEvent) => {\n            addActiveKeys(ev);\n            addKonamiSequence(ev);\n            triggerCapturingCallback(ev);\n        }\n\n        // const keyDownBubblingCallback = (ev : KeyboardEvent) => {\n        //     triggerBubblingCallback(ev);\n        // }\n\n        // const keyUpCapturingCallback = (ev : KeyboardEvent) => {\n        //     triggerCapturingCallback(ev);\n        // }\n\n \n\n        \n        this.destroy = () => {\n            this.resetListenerMapping();\n            // this.container.removeEventListener('keydown', addActiveKeys, true);\n            // this.container.removeEventListener('keydown', triggerBubblingCallback);\n            // this.container.removeEventListener('keydown', triggerCapturingCallback, true);\n            // this.container.removeEventListener('keyup', triggerBubblingCallback);\n            // this.container.removeEventListener('keyup', triggerCapturingCallback, true);\n            // this.container.removeEventListener('keydown', addKonamiSequence, true);\n            // window.removeEventListener('keyup', clearActiveKeys);\n            this.container.removeEventListener('keydown', keyDownCapturingCallback, true);\n            this.container.removeEventListener('keydown', triggerBubblingCallback);\n            this.container.removeEventListener('keyup', triggerBubblingCallback);\n            this.container.removeEventListener('keyup', triggerCapturingCallback, true);\n            window.removeEventListener('keyup', clearActiveKeys);\n\n            window.removeEventListener('focusin', handleFocusChange);\n            window.removeEventListener('focusout', handleFocusChange);\n\n        }\n\n        // this.container.addEventListener('keydown', addActiveKeys, true);\n        // this.container.addEventListener('keydown', triggerBubblingCallback);\n        // this.container.addEventListener('keydown', triggerCapturingCallback, true);\n        // this.container.addEventListener('keyup', triggerBubblingCallback);\n        // this.container.addEventListener('keyup', triggerCapturingCallback, true);\n        // this.container.addEventListener('keydown', addKonamiSequence, true);\n        // window.addEventListener('keyup', clearActiveKeys);\n\n        this.container.addEventListener('keydown', keyDownCapturingCallback, true);\n        this.container.addEventListener('keydown', triggerBubblingCallback);\n        this.container.addEventListener('keyup', triggerBubblingCallback);\n        this.container.addEventListener('keyup', triggerCapturingCallback, true);\n        window.addEventListener('keyup', clearActiveKeys);\n        \n        this.container.addEventListener('focusin', handleFocusChange);\n        this.container.addEventListener('focusout', handleFocusChange);\n\n        this.resetListenerMapping();\n    }\n\n    private getListenerMeta(eventConfiguration : IKeyEventConfiguration) : IKeyEventMeta {\n        const { keyCombo, priority }  = eventConfiguration;\n        const listenerConfig          = {...{}, ...this.defaultConfig, ...eventConfiguration} as IKeyEventMeta;\n        const comboListenerArr        = this.getListeners(listenerConfig.eventType, listenerConfig.capture, keyCombo);\n\n        listenerConfig.priority       = priority ?? comboListenerArr.length;\n\n        return listenerConfig;\n    }\n\n    private parseActiveKeys(ev : KeyboardEvent) : string[] {\n        const controlKey  = ev.ctrlKey ?( isMacOS ? KeyCodes.ControlLeft : KeyCodes.ControlLeft) : '';\n        const metaKey     = ev.metaKey ? KeyCodes.MetaLeft : '';\n        const shiftKey    = ev.shiftKey ? KeyCodes.ShiftLeft : '';\n        const altKey      = ev.altKey ? KeyCodes.AltLeft : '';\n        const keyComboArr = [metaKey, controlKey, shiftKey, altKey].filter((val)=>(val!==''));\n        sortKeyCombo(keyComboArr);\n        keyComboArr.push(...this.activeKeys);\n        return keyComboArr;\n    }\n\n    //constructing keyCombo from keyBoardEvent\n    private extractExecutionMeta(ev : KeyboardEvent, eventPhase : KeyboardEvent['eventPhase']) : Required<IExecutionParam> {\n        const eventType   = ev.type as IEventtype;\n        const capture     = eventPhase === ev.CAPTURING_PHASE;\n        // const controlKey  = ev.ctrlKey ?( isMacOS ? KeyCodes.ControlLeft : KeyCodes.ControlLeft) : '';\n        // const metaKey     = ev.metaKey ? KeyCodes.MetaLeft : '';\n        // const shiftKey    = ev.shiftKey ? KeyCodes.ShiftLeft : '';\n        // const altKey      = ev.altKey ? KeyCodes.AltLeft : '';\n        // const keyComboArr = [metaKey, controlKey, shiftKey, altKey].filter((val)=>(val!==''));\n        // sortKeyCombo(keyComboArr);\n        // keyComboArr.push(...this.activeKeys);\n        const keyComboArr = this.parseActiveKeys(ev);\n        return {\n            keyCombo  : keyComboArr.join('+'),\n            capture   : capture,\n            eventType : eventType\n        };\n    }\n\n    private executeListenerArr(listeners : IKeyEventMeta[], ev : KeyboardEvent | null = null, activeKeys : string[]) : void{\n        for(let index = 0; index < listeners.length; index++) {\n            const listenerMeta = {...listeners[index], event : ev, activeKeys};\n            let repeatingCheck = true;\n            if(ev) {\n                repeatingCheck = (listenerMeta.repeat == false) ? (ev.repeat == false) : true;\n            }\n            if(!listenerMeta.isKonami && repeatingCheck) {\n                const continueLoop = listenerMeta.callback(listenerMeta);\n                if(continueLoop === false) {\n                    break;\n                }\n            }\n        }\n    }\n\n    private executeKonamiSequence(listeners : IKeyEventMeta[], ev : KeyboardEvent | null = null) : void {\n        for(let index = 0; index < listeners.length; index++) {\n            const listenerMeta = {...listeners[index], event : ev, activeKeys : this.activeKeys}\n            let repeatingCheck = true;\n            if(ev) {\n                repeatingCheck = (listenerMeta.repeat == false) ? (ev.repeat == false) : true;\n            }\n            if(listenerMeta.isKonami && repeatingCheck) {\n                const continueLoop = listenerMeta.callback(ev, listenerMeta);\n                if(continueLoop === false) {\n                    break;\n                }\n            }\n        }\n    }\n\n    getListeners(eventType : IEventtype, isCapture : boolean, keyCombo : string ) : IKeyEventMeta[] {\n        const capture = getCaptureKey(isCapture);\n        return this.listenerMapping?.[eventType][capture]?.[keyCombo.toLowerCase()] || [];\n    }\n\n    addListener(eventConfiguration : IKeyEventConfiguration) : void {\n        const keyCombo                                   = sanitizeKeyCombo(eventConfiguration.keyCombo);\n        const listenerMeta                               = this.getListenerMeta(eventConfiguration);\n        const {eventType, capture : isCapture, priority} = listenerMeta;\n        const capture                                    = getCaptureKey(isCapture);\n\n        if(!this.listenerMapping[eventType][capture][keyCombo]) { \n            this.listenerMapping[eventType][capture][keyCombo] = [];\n        }\n        this.listenerMapping[eventType][capture][keyCombo].splice(priority, 0, listenerMeta);\n    }\n\n    executeKeyCombo(executionParam : KeyboardEvent | IExecutionParam, eventPhase ?:  KeyboardEvent['eventPhase']) {\n        if(!this.isPaused) {\n            let {keyCombo, capture, eventType} = (executionParam ?? {}) as IExecutionParam;\n            let event;\n            let activeKeys = this.activeKeys;\n            if(executionParam instanceof KeyboardEvent) {\n                event      = executionParam as KeyboardEvent;\n                eventPhase = event.eventPhase;\n                ({keyCombo, capture, eventType} = this.extractExecutionMeta(executionParam, eventPhase));\n                activeKeys = this.parseActiveKeys(event);\n            } \n            \n            const anyKeyCode     = KeyCodes.Any;\n            const konamiKeyCombo = this.konamiSequence.join('+');\n\n            const listeners       = this.getListeners(eventType, capture, keyCombo);\n            const keyDownListener = this.getListeners(eventType, capture, anyKeyCode);\n            const konamiListeners = this.getListeners(eventType, capture, konamiKeyCombo);\n\n            this.executeListenerArr(listeners, event, activeKeys);\n            this.executeListenerArr(keyDownListener, event, activeKeys);\n            this.executeKonamiSequence(konamiListeners, event);\n        }\n    }\n    \n    removeListener(executionParam : IExecutionParam, searchCallback : CallableFunction) {\n        const {keyCombo, capture, eventType} = executionParam;\n        const listeners = this.getListeners(eventType, capture, keyCombo);\n        let searchIndex = -1;\n        listeners.find(({callback}, index)=>{\n            if(callback === searchCallback){\n                searchIndex = index;\n                return;\n            }\n        });\n        (searchIndex !== -1) && listeners.splice(searchIndex, 1);\n    }\n\n    removeKeyCombo(executionParam : IExecutionParam) {\n        const {keyCombo, capture, eventType} = executionParam;\n        const captureKey                     = getCaptureKey(capture);\n\n        delete this.listenerMapping?.[eventType][captureKey][keyCombo];\n    }\n\n    importEvents(eventConfigs : IKeyEventConfiguration[]) {\n        eventConfigs.forEach((eventConfig) => {\n            this.addListener(eventConfig);\n        })\n    }\n\n    pauseExecution() {\n        this.isPaused = true;\n    }\n\n    unpauseExecution() {\n        this.isPaused = false;\n    }   \n}\n\nexport{\n    KeyEventHandler,\n    KeyCodes\n}","function deBounce<T extends (...args: any[]) => any>(fun: T, delay: number): (...args: Parameters<T>) => void {\n\tlet indeBounce: any;\n\treturn function(this: any, ...args: Parameters<T>) {\n\t\tconst context = this;\n\t\tclearTimeout(indeBounce);\n\t\tindeBounce = setTimeout(() => {\n\t\t\tfun.apply(context, args);\n\t\t}, delay);\n\t};\n}\n\n\nfunction findInsertIndex(array: number[], key: number): number {\n\tlet left = 0;\n\tlet right = array.length - 1;\n\n\twhile (left <= right) {\n\t\tlet mid = Math.floor((left + right) / 2);\n\n\t\tif (array[mid] === key) {\n\t\t\treturn mid;\n\t\t} else if (array[mid] < key) {\n\t\t\tleft = mid + 1;\n\t\t} else {\n\t\t\tright = mid - 1;\n\t\t}\n\t}\n\n\treturn left;\n}\n\nexport{\n    deBounce,\n\tfindInsertIndex\n}","import { getAbsoluteHeight, getAbsoluteWidth, getElementRectWithOffset, setAriaLabel, setAriaRole, IRect } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\nexport interface IPosition {\n\tx: number;\n\ty: number;\n\tposition : Position | null;\n\tsourceRect : any;\n\tparentRect : any;\n}\n\nexport enum DIRECTION {\n\tvertical,\n\thorizontal,\n}\n\ninterface CalculatedPosition {\n    top: number;\n    left: number;\n}\n\nexport interface PopupPositionParams {\n\tpopUpElement     : HTMLElement;\n\tgapX            ?: number;\n\tgapY            ?: number;\n\tposition        ?: Position;\n\talignSide       ?: 'left' | 'right';\n\tkeepWithinBounds?: boolean;\n\tupdatePosition  ?: () => IPosition;\n\trelativePosition ?:boolean;\n}\n\nexport const enum Position {\n\tunder       = 'under',\n\tabove       = 'above',\n\tover        = 'over',\n\tleft        = 'left',\n\tright       = 'right',\n\ttop         = 'top',\n\ttopLeft     = 'topLeft',\n\ttopRight    = 'topRight',\n\tbottom      = 'bottom',\n\tbottomLeft  = 'bottomLeft',\n\tbottomRight = 'bottomRight',\n\tleftTop     = 'leftTop',\n\tleftBottom  = 'leftBottom',\n\trightTop    = 'rightTop',\n\trightBottom = 'rightBottom',\n\tauto        = 'auto',\n\tcenter      = 'center',\n}\n\nexport interface AfterGuiAttachedParams {\n\thidePopup?: () => void;\n\tsuppressFocus?: boolean;\n}\n\nexport interface PopupComponentPositionParams extends PopupPositionParams {\n\tsourceElement: HTMLElement;\n}\n\nexport interface Popup {\n\telement: HTMLElement;\n\twrapper: HTMLElement;\n\thideFunction: () => void;\n\tinstanceId: number;\n\talignedToElement: HTMLElement | undefined;\n\trelativeObserver : ResizeObserver | null;\n}\n\nexport interface AddPopupParams {\n    childElement       : HTMLElement;\n\t\n    closedCallback    ?: (e?: MouseEvent | TouchEvent | KeyboardEvent) => void;\n    afterGuiAttached  ?: (params: AfterGuiAttachedParams) => void;\n    positionCallback  ?: () => void;\n    ariaLabel          : string;\n    anchorToElement   ?: HTMLElement;\n    popupParentElement?: HTMLElement;\n    documentElement   ?: Document;\n    rtl               ?: boolean;\n    popupClassName    ?: string;\n}\n\nexport interface AddPopupOutput {\n\thideFunction: () => void;\n}\n\nexport class CorePopupHandler extends EventEmitter {\n\tprotected popupList: Popup[] = [];\n\n\tprotected instanceId = 0;\n\n\tpositionPopupByComponent( params: PopupComponentPositionParams, popupParentElement: HTMLElement = document.body, documentElement: Document = document, fallBackPositions : Position[] | null = null,arrow : boolean = false): void {\n\t\tlet { popUpElement, gapX = 0, gapY = 0, keepWithinBounds, sourceElement, alignSide = 'left', position = 'over', relativePosition} = params;\n\n\t\t\n\n\t\tconst popupIndex = this.getPopupIndex(popUpElement);\n\t\t\n\t\t\n\n\t\tconst updatePosition = () => {\n\n\t\t\tconst sourceRect = sourceElement.getBoundingClientRect();\n\t\t\tconst parentRect = this.getParentRect( popupParentElement, documentElement, ) as DOMRect;\n\n\t\t\tposition = this.flipPositionForAlign(position as Position, alignSide);\n\n\t\t\tposition = this.calculateAllPopupPosition(popUpElement, sourceRect, parentRect, position as Position, gapX, gapY, fallBackPositions)\n\n\t\t\tconst calculatedPosition = (this.calculatePositionByPosition(position as Position, alignSide, gapX as number, gapY as number, sourceRect, parentRect, popUpElement, arrow ));\n\n\t\t\treturn { x : calculatedPosition.left, y : calculatedPosition.top , position : position as any, sourceRect, parentRect};\n\t\t};\n\n\t\t\n\t\tif (popupIndex !== -1) {\n\t\t\tconst popup = this.popupList[popupIndex];\n\t\t\tpopup.alignedToElement = sourceElement;\n\t\t\tif(relativePosition) {\n\t\t\t\tlet observer = new ResizeObserver(() => {\n\t\t\t\t\tthis.positionPopup( { popUpElement, gapX, gapY, keepWithinBounds, updatePosition, }, popupParentElement, documentElement, );\n\t\t\t\t})\n\t\t\t\tpopup.relativeObserver = observer;\n\t\n\t\t\t\tobserver.observe(sourceElement);\n\t\t\t\tobserver.observe(popUpElement);\n\n\t\t\t}\n\t\t}\n\n\t\tthis.positionPopup( { popUpElement, gapX, gapY, keepWithinBounds, updatePosition, }, popupParentElement, documentElement,arrow );\n\t}\n\n\tgetWrapperElement(element: HTMLElement): HTMLElement {\n\t\tconst popupIndex = this.getPopupIndex(element);\n\t\treturn this.popupList[popupIndex].wrapper;\n\t}\n\n\tprivate flipPositionForAlign( position: Position, alignSide: string ): Position {\n\t\tif (alignSide === 'right') {\n\t\t\tswitch (position) {\n\t\t\t\tcase Position.left:\n\t\t\t\t\treturn Position.right;\n\t\t\t\tcase Position.right:\n\t\t\t\t\treturn Position.left;\n\t\t\t\tcase Position.leftTop:\n\t\t\t\t\treturn Position.rightTop;\n\t\t\t\tcase Position.leftBottom:\n\t\t\t\t\treturn Position.rightBottom;\n\t\t\t\tcase Position.rightTop:\n\t\t\t\t\treturn Position.leftTop;\n\t\t\t\tcase Position.rightBottom:\n\t\t\t\t\treturn Position.leftBottom;\n\t\t\t\tdefault:\n\t\t\t\t\treturn position;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn position; \n\t}\n\n\tprivate updateArrow( tooltip: HTMLElement, position: Position, sourceRect: DOMRect, parentRect: DOMRect, finalLeft: number, finalTop: number ) {\n\t\ttooltip.style.setProperty(\"--popover-pointer-left\", \"unset\");\n\t\ttooltip.style.setProperty(\"--popover-pointer-right\", \"unset\");\n\t\ttooltip.style.setProperty(\"--popover-pointer-top\", \"unset\");\n\t\ttooltip.style.setProperty(\"--popover-pointer-bottom\", \"unset\");\n\n\t\tthis.setArrowStyles(tooltip, position);\n\n\t\tconst srcLeft = sourceRect.left - parentRect.left;\n\t\tconst srcTop  = sourceRect.top  - parentRect.top;\n\n\t\tconst srcRight  = srcLeft + sourceRect.width;\n\t\tconst srcBottom = srcTop  + sourceRect.height;\n\n\t\tconst padding = 10;\n\n\t\tlet arrowLeft: number = 0;\n\t\tlet arrowTop: number = 0;\n\n\t\tswitch (position) {\n\t\t\tcase Position.leftTop:\n\t\t\t\tarrowTop = srcTop - finalTop + padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-right\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.leftBottom:\n\t\t\t\tarrowTop = srcBottom - finalTop - 2 * padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-right\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.left:\n\t\t\t\tarrowTop = srcTop + sourceRect.height / 2 - finalTop;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-right\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.rightTop:\n\t\t\t\tarrowTop = srcTop - finalTop + padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.rightBottom:\n\t\t\t\tarrowTop = srcBottom - finalTop - 2 * padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.right:\n\t\t\t\tarrowTop = srcTop + sourceRect.height / 2 - finalTop;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", `${arrowTop}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.topLeft:\n\t\t\t\tarrowLeft = srcLeft - finalLeft + padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-bottom\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.topRight:\n\t\t\t\tarrowLeft = srcRight - finalLeft - 2 * padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-bottom\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.top:\n\t\t\t\tarrowLeft = srcLeft + sourceRect.width / 2 - finalLeft;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-bottom\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.bottomLeft:\n\t\t\t\tarrowLeft = srcLeft - finalLeft + padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.bottomRight:\n\t\t\t\tarrowLeft = srcRight - finalLeft - 2 * padding;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tcase Position.bottom:\n\t\t\tcase Position.under:\n\t\t\t\tarrowLeft = srcLeft + sourceRect.width / 2 - finalLeft;\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-top\", \"-5px\");\n\t\t\t\ttooltip.style.setProperty(\"--popover-pointer-left\", `${arrowLeft}px`);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\n\n\n\n\tpublic calculatePositionByPosition(position : Position, alignSide : 'right' | 'left', gapX : number, gapY : number, sourceRect : DOMRect, parentRect : DOMRect, toolTipElement : HTMLElement, arrow : boolean = false) : CalculatedPosition {\n\t\tlet top = 0;\n\t\tlet left = 0;\n\n\t\tswitch(position) {\n\t\t\tcase Position.left: \n\t\t\t\tleft = (sourceRect.left - parentRect.left) - toolTipElement.offsetWidth - gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top - (toolTipElement.offsetHeight / 2 )) + (sourceRect.height / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.leftTop: \n\t\t\t\tleft = (sourceRect.left - parentRect.left) - toolTipElement.offsetWidth - gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top);\n\t\t\t\tbreak;\n\t\t\tcase Position.leftBottom: \n\t\t\t\tleft = (sourceRect.left - parentRect.left) - toolTipElement.offsetWidth - gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top) - (toolTipElement.offsetHeight ) + (sourceRect.height);\n\t\t\t\tbreak;\n\t\t\tcase Position.right:\n\t\t\t\tleft = (sourceRect.left - parentRect.left) + sourceRect.width + gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top - (toolTipElement.offsetHeight / 2 )) + (sourceRect.height / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.rightTop:\n\t\t\t\tleft = (sourceRect.left - parentRect.left) + sourceRect.width + gapX;\n\t\t\t\ttop = sourceRect.top - parentRect.top;\n\t\t\t\tbreak;\n\t\t\tcase Position.rightBottom:\n\t\t\t\tleft = (sourceRect.left - parentRect.left) + sourceRect.width + gapX;\n\t\t\t\ttop = (sourceRect.top - parentRect.top) - (toolTipElement.offsetHeight ) + (sourceRect.height);\n\t\t\t\tbreak;\n\t\t\tcase Position.top:\n\t\t\t\ttop = (sourceRect.top - parentRect.top) - toolTipElement.offsetHeight - gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) - (toolTipElement.offsetWidth / 2)) + (sourceRect.width / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.topLeft:\n\t\t\tcase Position.above:\n\t\t\t\ttop = (sourceRect.top - parentRect.top) - toolTipElement.offsetHeight - gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left));\n\t\t\t\tbreak;\n\t\t\tcase Position.topRight:\n\t\t\t\ttop = sourceRect.top - parentRect.top - toolTipElement.offsetHeight - gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) + (sourceRect.width - toolTipElement.offsetWidth));\n\t\t\t\tbreak;\n\t\t\tcase Position.bottom:\n\t\t\t\ttop = (sourceRect.top - parentRect.top) + sourceRect.height + gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) - (toolTipElement.offsetWidth / 2)) + (sourceRect.width / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.bottomLeft:\n\t\t\tcase Position.under:\n\t\t\t\ttop = sourceRect.top - parentRect.top + sourceRect.height + gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left));\n\t\t\t\tbreak;\n\t\t\tcase Position.bottomRight:\n\t\t\t\ttop = sourceRect.top - parentRect.top + sourceRect.height + gapY;\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) + (sourceRect.width - toolTipElement.offsetWidth));\n\t\t\t\tbreak;\n\t\t\tcase Position.over:\n\t\t\t\ttop  = sourceRect.top - parentRect.top;\n\t\t\t\tleft = sourceRect.left - parentRect.left;\n\t\t\t\tif (alignSide === 'right') {\n\t\t\t\t\tleft -= toolTipElement.offsetWidth - sourceRect.width;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase Position.center:\n\t\t\t\tleft = ((sourceRect.left - parentRect.left) - (toolTipElement.offsetWidth / 2)) + (sourceRect.width / 2);\n\t\t\t\ttop = (sourceRect.top - parentRect.top - (toolTipElement.offsetHeight / 2 )) + (sourceRect.height / 2);\n\t\t\t\tbreak;\n\t\t\tcase Position.auto: {\n\t\t\t\tconst calculatedPosition = this.findAutoPosition(alignSide, gapX, gapY, sourceRect, parentRect, toolTipElement);\n\t\t\t\ttop = calculatedPosition.top;\n\t\t\t\tleft = calculatedPosition.left;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.setAlignedStyles(toolTipElement, position);\n\n\t\tconst ARROW_OFFSET = arrow ? 6 : 0;\n\n\t\tswitch (position) {\n\t\t\tcase Position.left:\n\t\t\tcase Position.leftTop:\n\t\t\tcase Position.leftBottom:\n\t\t\t\tleft -= ARROW_OFFSET;\n\t\t\t\tbreak;\n\n\t\t\tcase Position.right:\n\t\t\tcase Position.rightTop:\n\t\t\tcase Position.rightBottom:\n\t\t\t\tleft += ARROW_OFFSET;\n\t\t\t\tbreak;\n\n\t\t\tcase Position.top:\n\t\t\tcase Position.topLeft:\n\t\t\tcase Position.topRight:\n\t\t\t\ttop -= ARROW_OFFSET;\n\t\t\t\tbreak;\n\n\t\t\tcase Position.bottom:\n\t\t\tcase Position.bottomLeft:\n\t\t\tcase Position.bottomRight:\n\t\t\t\ttop += ARROW_OFFSET;\n\t\t\t\tbreak;\n\n\t\t\tcase Position.over:\n\t\t\t\tbreak;\n\n\t\t\tcase Position.center:\n\t\t\tcase Position.auto:\n\t\t\t\tbreak;\n\t\t}\n\n\n\t\treturn {\n\t\t\ttop,\n\t\t\tleft\n\t\t}\n\t}\n\n\tprivate findAutoPosition( alignSide : 'right' | 'left', gapX : number, gapY : number,  sourceRect: DOMRect, parentRect: DOMRect, toolTipElement: HTMLElement ): CalculatedPosition {\n\t\tconst positionsToTry: Position[] = [\n\t\t\t// Position.bottomLeft,\n\t\t\tPosition.bottom,\n\t\t\t// Position.bottomRight,\n\t\t\t// Position.topLeft,\n\t\t\tPosition.top,\n\t\t\t// Position.topRight,\n\t\t\t// Position.leftTop,\n\t\t\tPosition.left,\n\t\t\t// Position.leftBottom,\n\t\t\t// Position.rightTop,\n\t\t\tPosition.right,\n\t\t\t// Position.rightBottom\n\t\t];\n\n\t\tlet bestPosition: CalculatedPosition = { top: 0, left: 0, };\n\n\t\tfor (let i = 0 ;i< positionsToTry.length ;i++) {\n\t\t\tconst position = positionsToTry[i];\n\n\t\t\tconst calculatedPosition = this.calculatePositionByPosition( position, alignSide, gapX, gapY, sourceRect, parentRect, toolTipElement );\n\n\t\t\tconst fitsInParent = calculatedPosition.left >= 0 && calculatedPosition.left + toolTipElement.offsetWidth <= parentRect.width && calculatedPosition.top >= 0 && calculatedPosition.top + toolTipElement.offsetHeight <= parentRect.height;\n\n\t\t\tif (fitsInParent) {\n\t\t\t\tbestPosition = calculatedPosition;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn bestPosition;\n\t}\n\n\tpublic positionPopupUnderMouseEvent( params: PopupPositionParams & { mouseEvent: MouseEvent | Touch; }, popupParentElement: HTMLElement = document.body, documentElement: Document = document ): void {\n\t\tconst { popUpElement, gapX, gapY } = params;\n\n\n\t\tthis.positionPopup({ popUpElement, gapX, gapY, keepWithinBounds: true, updatePosition: () => this.calculatePointerAlign( params.mouseEvent, popupParentElement, documentElement)}, popupParentElement, documentElement);\n\t}\n\n\tprivate calculatePointerAlign( e: MouseEvent | Touch, popupParentElement: HTMLElement = document.body, documentElement: Document = document, ): { x: number; y: number;  position : any, sourceRect : any, parentRect : any} {\n\t\tconst parentRect = this.getParentRect( popupParentElement, documentElement, );\n\t\treturn {\n\t\t\tx: e.clientX - parentRect.left,\n\t\t\ty: e.clientY - parentRect.top,\n\t\t\tposition : null,\n\t\t\tsourceRect : null,\n\t\t\tparentRect : null\n\t\t};\n\t}\n\n\tpositionPopup( params: PopupPositionParams, popupParentElement: HTMLElement = document.body, documentElement: Document = document,arrow : boolean = false ): void {\n\t\tconst { popUpElement, keepWithinBounds,gapX = 0, gapY = 0, updatePosition } = params;\n\t\tconst lastSize = { width: 0, height: 0 };\n\n\t\tconst updatePopupPosition = () => {\n\t\t\tlet { x, y , position, sourceRect, parentRect} = updatePosition!();\n\n\t\t\tif ( popUpElement.clientWidth === lastSize.width && popUpElement.clientHeight === lastSize.height ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlastSize.width = popUpElement.clientWidth;\n\t\t\tlastSize.height = popUpElement.clientHeight;\n\n\t\t\tx += gapX;\n\n\t\t\ty += gapY\n\n\t\t\tif (keepWithinBounds) {\n\t\t\t\tx = this.ensureXYBoundaries( popUpElement, x, DIRECTION.horizontal, popupParentElement, documentElement, );\n\t\t\t\ty = this.ensureXYBoundaries( popUpElement, y, DIRECTION.vertical, popupParentElement, documentElement, );\n\t\t\t}\n\n\t\t\tarrow && position && this.updateArrow(popUpElement, position, sourceRect, parentRect, x, y);\n\t\t\tpopUpElement.style.left = `${x}px`;\n\t\t\tpopUpElement.style.top = `${y}px`;\n\t\t};\n\n\t\tupdatePopupPosition();\n\t}\n\n\taddPopup(params: AddPopupParams): AddPopupOutput {\n\t\tlet { childElement, ariaLabel, positionCallback, anchorToElement, afterGuiAttached, popupParentElement = document.body, documentElement = document, rtl, popupClassName } = params;\n\n\t\tif (!documentElement) {\n\t\t\treturn { hideFunction: () => {} };\n\t\t}\n\n\t\tconst popupIndex = this.getPopupIndex(childElement);\n\n\t\tif (popupIndex !== -1) {\n\t\t\tconst popup = this.popupList[popupIndex];\n\t\t\treturn { hideFunction: popup.hideFunction };\n\t\t}\n\n\t\t// this.initialisePopupPosition(childElement, popupParentElement);\n\n\t\tconst wrapperElement = this.createPopupWrapper(childElement, ariaLabel, popupClassName, rtl, popupParentElement);\n\t\tconst removePopup = () => {\n\t\t\tif (popupParentElement) {\n\t\t\t\tif (popupParentElement.contains(wrapperElement)) {\n\t\t\t\t\tpopupParentElement.removeChild(wrapperElement);\n\t\t\t\t}\n\t\t\t\tthis.removePopupFromPopupList(childElement);\n\t\t\t}\n\t\t};\n\n\t\tif (afterGuiAttached) {\n\t\t\tafterGuiAttached({\n\t\t\t\thidePopup: removePopup,\n\t\t\t});\n\t\t}\n\n\t\tthis.popupList.push({ element: childElement, wrapper: wrapperElement, hideFunction: removePopup, instanceId: this.instanceId++, alignedToElement: anchorToElement, relativeObserver : null });\n\n\t\tif (positionCallback) {\n\t\t\tpositionCallback();\n\t\t}\n\n\t\treturn {\n\t\t\thideFunction: removePopup,\n\t\t};\n\t}\n\n\tprotected setArrowStyles(popupElement: HTMLElement, positioned: Position | null) {\n\t\t// remove all pointer classes\n\t\tconst classes = [\n\t\t\t\"dg-popover__pointer--right-top\",\n\t\t\t\"dg-popover__pointer--right-middle\",\n\t\t\t\"dg-popover__pointer--right-bottom\",\n\t\t\t\"dg-popover__pointer--left-top\",\n\t\t\t\"dg-popover__pointer--left-middle\",\n\t\t\t\"dg-popover__pointer--left-bottom\",\n\t\t\t\"dg-popover__pointer--top-left\",\n\t\t\t\"dg-popover__pointer--top-center\",\n\t\t\t\"dg-popover__pointer--top-right\",\n\t\t\t\"dg-popover__pointer--bottom-left\",\n\t\t\t\"dg-popover__pointer--bottom-center\",\n\t\t\t\"dg-popover__pointer--bottom-right\",\n\t\t];\n\n\t\tclasses.forEach(cls => popupElement.classList.remove(cls));\n\n\t\tif (!positioned) return;\n\n\t\tswitch (positioned) {\n\n\t\t\t// RIGHT SIDE POINTERS\n\t\t\tcase Position.right:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--left-middle\");\n\t\t\t\tbreak;\n\t\t\tcase Position.rightTop:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--left-top\");\n\t\t\t\tbreak;\n\t\t\tcase Position.rightBottom:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--left-bottom\");\n\t\t\t\tbreak;\n\n\t\t\t// LEFT SIDE POINTERS\n\t\t\tcase Position.left:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--right-middle\");\n\t\t\t\tbreak;\n\t\t\tcase Position.leftTop:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--right-top\");\n\t\t\t\tbreak;\n\t\t\tcase Position.leftBottom:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--right-bottom\");\n\t\t\t\tbreak;\n\n\t\t\t// TOP SIDE POINTERS\n\t\t\tcase Position.top:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--bottom-center\");\n\t\t\t\tbreak;\n\t\t\tcase Position.topLeft:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--bottom-left\");\n\t\t\t\tbreak;\n\t\t\tcase Position.topRight:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--bottom-right\");\n\t\t\t\tbreak;\n\n\t\t\t// BOTTOM SIDE POINTERS\n\t\t\tcase Position.bottom:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--top-center\");\n\t\t\t\tbreak;\n\t\t\tcase Position.bottomLeft:\n\t\t\tcase Position.under:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--top-left\");\n\t\t\t\tbreak;\n\t\t\tcase Position.bottomRight:\n\t\t\t\tpopupElement.classList.add(\"dg-popover__pointer--top-right\");\n\t\t\t\tbreak;\n\n\t\t\t// No arrow\n\t\t\tcase Position.over:\n\t\t\tcase Position.above:\n\t\t\tcase Position.center:\n\t\t\tcase Position.auto:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\n\tprotected setAlignedStyles( popupElement: HTMLElement, positioned: Position | null, ) {\n\t\tconst popupIndex = this.getPopupIndex(popupElement);\n\n\t\tif (popupIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst popup = this.popupList[popupIndex];\n\n\t\tconst { alignedToElement } = popup;\n\n\t\tif (!alignedToElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst positions = [ Position.left, Position.leftTop, Position.leftBottom, Position.right, Position.rightTop, Position.rightBottom, Position.top, Position.topLeft, Position.topRight, Position.bottom, Position.bottomLeft, Position.bottomRight, Position.over, Position.above, Position.under];\n\n\t\tpositions.forEach((position) => {\n\t\t\talignedToElement.classList.remove('ZG-has-popup');\n\t\t\talignedToElement.classList.remove(\n\t\t\t\t`ZG-has-popup-positioned-${position}`,\n\t\t\t);\n\t\t\tpopupElement.classList.remove(`ZG-popup-positioned-${position}`);\n\t\t});\n\n\t\tif (!positioned) {\n\t\t\treturn;\n\t\t}\n\n\t\talignedToElement.classList.add('ZG-has-popup');\n\t\talignedToElement.classList.add(`ZG-has-popup-positioned-${positioned}`);\n\t\tpopupElement.classList.add(`ZG-popup-positioned-${positioned}`);\n\t}\n\n\tprotected getPopupIndex(element: HTMLElement): number {\n\t\treturn this.popupList.findIndex((popup) => popup.element === element);\n\t}\n\n\tprotected initialisePopupPosition(\n\t\telement: HTMLElement,\n\t\tpopupParentElement: HTMLElement = document.body,\n\t): void {\n\t\tconst popupParentElementRect =\n\t\t\tpopupParentElement.getBoundingClientRect();\n\n\t\tif (element) {\n\t\t\telement.style.top = `${popupParentElementRect.top * -1}px`;\n\t\t\telement.style.left = `${popupParentElementRect.left * -1}px`;\n\t\t}\n\t}\n\n\tprotected calculateAllPopupPosition( popupElement: HTMLElement, targetRect: DOMRect, parentRect: DOMRect, position: Position, gapX: number, gapY: number, userFallbacks : Position[] | null ): Position {\n\t\tconst spaceRightTarget = parentRect.right - targetRect.right;\n\t\tconst spaceLeftTarget  = targetRect.left - parentRect.left;\n\t\tconst spaceAboveTarget = targetRect.top - parentRect.top;\n\t\tconst spaceBelowTarget = parentRect.bottom - targetRect.bottom;\n\t\n\t\tconst spaceNeededHorizontal = popupElement.offsetWidth + gapX;\n\t\tconst spaceNeededVertical = popupElement.offsetHeight + gapY;\n\t\n\t\tconst isSpaceAvailableRight = spaceRightTarget > spaceNeededHorizontal;\n\t\tconst isSpaceAvailableLeft = spaceLeftTarget > spaceNeededHorizontal;\n\t\tconst isSpaceAvailableAbove = spaceAboveTarget > spaceNeededVertical;\n\t\tconst isSpaceAvailableBelow = spaceBelowTarget > spaceNeededVertical;\n\t\n\t\tconst fallbackMap: Record<Position, Position[]> = {\n\t\t\t[Position.bottomLeft] : [Position.topLeft, Position.right, Position.left],\n\t\t\t[Position.bottomRight]: [Position.topRight, Position.right, Position.left],\n\t\t\t[Position.topLeft]    : [Position.bottomLeft, Position.right, Position.left],\n\t\t\t[Position.topRight]   : [Position.bottomRight, Position.right, Position.left],\n\t\t\t[Position.leftTop]    : [Position.top, Position.right, Position.left],\n\t\t\t[Position.leftBottom] : [Position.leftTop, Position.rightBottom, Position.rightTop],\n\t\t\t[Position.rightTop]   : [Position.rightBottom, Position.leftTop, Position.leftBottom],\n\t\t\t[Position.rightBottom]: [Position.rightTop, Position.leftBottom, Position.leftTop],\n\t\t\t[Position.bottom]     : [Position.top, Position.left, Position.right],\n\t\t\t[Position.top]        : [Position.bottom, Position.right, Position.left],\n\t\t\t[Position.left]       : [Position.right, Position.top, Position.bottom],\n\t\t\t[Position.right]      : [Position.left, Position.top, Position.bottom],\n\t\t\t[Position.auto]       : [Position.bottom, Position.right, Position.left, Position.top],\n\t\t\t[Position.center]     : [Position.center],\n\t\t\t[Position.under]      : [],\n\t\t\t[Position.above]      : [],\n\t\t\t[Position.over]       : []\n\t\t};\n\t\n\t\tconst isPositionAvailable = (pos: Position): boolean => {\n\t\t\tswitch (pos) {\n\t\t\t\tcase Position.left:\n\t\t\t\t\treturn isSpaceAvailableLeft;\n\t\t\t\tcase Position.right:\n\t\t\t\t\treturn isSpaceAvailableRight;\n\t\t\t\tcase Position.top:\n\t\t\t\t\treturn isSpaceAvailableAbove;\n\t\t\t\tcase Position.bottom:\n\t\t\t\t\treturn isSpaceAvailableBelow;\n\t\t\t\tcase Position.topLeft:\n\t\t\t\t\treturn isSpaceAvailableAbove;\n\t\t\t\tcase Position.topRight:\n\t\t\t\t\treturn isSpaceAvailableAbove;\n\t\t\t\tcase Position.bottomLeft:\n\t\t\t\t\treturn isSpaceAvailableBelow;\n\t\t\t\tcase Position.bottomRight:\n\t\t\t\t\treturn isSpaceAvailableBelow;\n\t\t\t\tcase Position.leftTop:\n\t\t\t\t\treturn isSpaceAvailableLeft && isSpaceAvailableBelow;\n\t\t\t\tcase Position.leftBottom:\n\t\t\t\t\treturn isSpaceAvailableLeft && isSpaceAvailableAbove;\n\t\t\t\tcase Position.rightTop:\n\t\t\t\t\treturn isSpaceAvailableRight && isSpaceAvailableBelow;\n\t\t\t\tcase Position.rightBottom:\n\t\t\t\t\treturn isSpaceAvailableRight && isSpaceAvailableAbove;\n\t\t\t\tcase Position.center:\n\t\t\t\t\treturn true; // Center doesn't depend on space availability\n\t\t\t\tcase Position.auto:\n\t\t\t\t\treturn isSpaceAvailableRight || isSpaceAvailableLeft || isSpaceAvailableAbove || isSpaceAvailableBelow;\n\t\t\t\tdefault:\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t};\n\t\n\t\tif (isPositionAvailable(position)) {\n\t\t\treturn position;\n\t\t}\n\t\n\t\tconst fallbacks = userFallbacks ? userFallbacks :fallbackMap[position] || [];\n\t\tfor (const fallback of fallbacks) {\n\t\t\tif (isPositionAvailable(fallback)) {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t}\n\t\n\t\t// Default fallback to the best available position\n\t\tif (isSpaceAvailableRight) return Position.right;\n\t\tif (isSpaceAvailableLeft) return Position.left;\n\t\tif (isSpaceAvailableBelow) return Position.bottom;\n\t\tif (isSpaceAvailableAbove) return Position.top;\n\t\n\t\tconst spaces = {\n\t\t\t[Position.right]: spaceRightTarget,\n\t\t\t[Position.left]: spaceLeftTarget,\n\t\t\t[Position.top]: spaceAboveTarget,\n\t\t\t[Position.bottom]: spaceBelowTarget\n\t\t};\n\n\t\tconst directionWithMostSpace = Object.entries(spaces)\n\t\t\t.sort((a, b) => b[1] - a[1])[0][0]; \n\n\t\treturn directionWithMostSpace as Position;\n\t}\n\t\n\tprotected calculatePopupPosition( popupElement: HTMLElement, targetRect: DOMRect, parentRect: DOMRect, position: Position, gapY: number, ): Position {\n\t\tconst spaceBelowTarget = parentRect.bottom - targetRect.bottom;\n\t\tconst spaceAboveTarget = targetRect.top - parentRect.top;\n\t\tconst spaceNeeded = popupElement.offsetHeight + gapY;\n\t\tconst isSpaceAvailibleUnder = spaceBelowTarget > spaceNeeded;\n\t\tconst isSpaceAvailibleAbove =\n\t\t\tspaceAboveTarget > spaceNeeded ||\n\t\t\tspaceAboveTarget > spaceBelowTarget;\n\n\t\tif ( position === Position.top || position === Position.topLeft || position === Position.topRight ) {\n\t\t\tif (isSpaceAvailibleAbove) {\n\t\t\t\treturn Position.above;\n\t\t\t}\n\t\t}\n\t\tif (isSpaceAvailibleUnder) {\n\t\t\treturn Position.bottom;\n\t\t}\n\n\t\tif (isSpaceAvailibleAbove) {\n\t\t\treturn Position.top;\n\t\t}\n\n\t\treturn Position.bottom;\n\t}\n\n\tprotected calculateLeftOrRightPopupPosition( popupElement: HTMLElement, targetRect: DOMRect, parentRect: DOMRect, position: Position, gapX: number, ): Position {\n\t\tconst spaceRightTarget = parentRect.right - targetRect.right;\n\t\tconst spaceLeftTarget = targetRect.left - parentRect.left;\n\t\tconst spaceNeeded = popupElement.offsetWidth + gapX;\n\t\tconst isSpaceAvailibleRight = spaceRightTarget > spaceNeeded;\n\t\tconst isSpaceAvailibleLeft =\n\t\t\tspaceLeftTarget > spaceNeeded || spaceLeftTarget > spaceRightTarget;\n\n\t\tif (position === Position.left) {\n\t\t\tif (isSpaceAvailibleLeft) {\n\t\t\t\treturn Position.left;\n\t\t\t}\n\t\t}\n\n\t\tif (isSpaceAvailibleRight) {\n\t\t\treturn Position.right;\n\t\t}\n\n\t\tif (isSpaceAvailibleLeft) {\n\t\t\treturn Position.left;\n\t\t}\n\n\t\treturn Position.right;\n\t}\n\tprivate ensureXYBoundaries(\n\t\tpopUpElement: HTMLElement,\n\t\tposition: number,\n\t\tdirection: DIRECTION,\n\t\tpopupParentElement: HTMLElement = document.body,\n\t\tdocumentElement: Document = document,\n\t): number {\n\t\tconst isVertical = direction === DIRECTION.vertical;\n\t\tconst sizeProperty = isVertical ? 'clientHeight' : 'clientWidth';\n\t\tconst anchorProperty = isVertical ? 'top' : 'left';\n\t\tconst offsetProperty = isVertical ? 'offsetHeight' : 'offsetWidth';\n\t\tconst scrollPositionProperty = isVertical ? 'scrollTop' : 'scrollLeft';\n\n\t\tconst docElement = documentElement.documentElement;\n\t\tlet popupParent = popupParentElement;\n\t\tif(this.isPopUpElementIsStatic(popupParent)) {\n\t\t\tpopupParent.offsetParent && (popupParent = popupParent.offsetParent as HTMLElement);\n\t\t}\n\t\tconst parentRect = this.getParentRect(popupParentElement, documentElement);\n\t\tconst documentRect =\n\t\t\tdocumentElement.documentElement.getBoundingClientRect();\n\n\t\tconst isBody = popupParent === documentElement.body;\n\n\t\tconst offsetSize = popUpElement[offsetProperty];\n\t\tconst getSize = isVertical ? getAbsoluteHeight : getAbsoluteWidth;\n\n\t\tlet sizeOfParent = isBody\n\t\t\t? getSize(docElement) + docElement[scrollPositionProperty]\n\t\t\t: popupParent[sizeProperty];\n\n\t\tif (isBody) {\n\t\t\tsizeOfParent -= Math.abs(\n\t\t\t\tdocumentRect[anchorProperty] - parentRect[anchorProperty],\n\t\t\t);\n\t\t}\n\n\t\tconst max = sizeOfParent - offsetSize;\n\n\t\treturn Math.min(Math.max(position, 0), Math.abs(max));\n\t}\n\n\tprotected getParentRect(\n\t\tpopupParentElement: HTMLElement = document.body,\n\t\tdocumentElement: Document = document,\n\t): IRect {\n\t\tlet popupParent = popupParentElement;\n\n\t\tif (popupParent === documentElement.body) {\n\t\t\tpopupParent = documentElement.documentElement;\n\t\t} else if (this.isPopUpElementIsStatic(popupParent)) {\n\t\t\tpopupParent = popupParent.offsetParent as HTMLElement;\n\t\t}\n\n\t\treturn getElementRectWithOffset(popupParent);\n\t}\n\n\tprivate isPopUpElementIsStatic(element: HTMLElement): boolean {\n\t\treturn getComputedStyle(element).position === 'static';\n\t}\n\n\tprotected createPopupWrapper( element: HTMLElement, ariaLabel: string, popupClassName : string = '', rtl : boolean = false, popupParentElement: HTMLElement = document.body, ): HTMLElement {\n\t\tconst wrapperElement = document.createElement('div');\n        (popupClassName && popupClassName != '') && wrapperElement.classList.add(popupClassName);\n\t\twrapperElement.classList.add('ZG-popup');\n\t\telement.classList.add( rtl ? 'ZG-rtl' : 'ZG-ltr', 'ZG-popup-child', );\n\n\t\tif (!element.hasAttribute('role')) {\n\t\t\tsetAriaRole(element, 'dialog');\n\t\t}\n\n\t\tsetAriaLabel(element, ariaLabel);\n\n\t\twrapperElement.appendChild(element);\n\t\tpopupParentElement.appendChild(wrapperElement);\n\n\t\treturn wrapperElement;\n\t}\n\n\tprotected removePopupFromPopupList(element: HTMLElement): void {\n\t\tconst popupEntry = this.popupList.find((popup) => popup.element === element);\n\t\tif (popupEntry?.relativeObserver) {\n\t\t\tpopupEntry.relativeObserver.disconnect();\n\t\t}\n\t\tthis.setAlignedStyles(element, null);\n\t\tthis.popupList = this.popupList.filter(\n\t\t\t(popup) => popup.element !== element,\n\t\t);\n\t}\n}\n","import { EventEmitter } from \"@dg/corecomponent/EventEmitter.js\";\n\nexport class AbstractController<T> extends EventEmitter{\n    public component !: T | null ;\n    setComponent(component : T){\n        this.component = component;\n        this.init();\n    }\n    init(){      \n    }\n}","import { IComponentMeta, UserComponentHandler } from \"@dg/corecomponent/UserComponentHandler.js\";\nimport { ComponentItemType, IComponentDetails } from \"./component-detail.types\";\nimport { BEAN_NAME } from \"@dg/corecomponent\";\nimport { ComponentMetadata } from \"@dg/corecomponent/ComponentMetadataProvider\";\nimport { UserComponentRegistry } from \"@dg/corecomponent/UserComponentRegistry\";\n\nexport abstract class AbstractUserComponentHandler extends UserComponentHandler {\n    protected getComponentDetails<T, P>( item: ComponentItemType<T>, propertyName: string, params?: P, defautName?: string, ): | IComponentDetails| undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta<T,P>(item, propertyName, params);\n        const looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstance( BEAN_NAME.USER_COMPONENT_REGISTRY) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) { \n                jsComponent = !item.componentFrameWork ? item.component : undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork ? item.component : undefined; \n            }\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif ( jsComponent == null && frameworkComponent == null && defautName != null ) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n        const mergedParams = this.getMergeParams<T, P>(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams : mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () => this.newInstance<T,P>( componentClass, componentFramework, propertyName, mergedParams ),\n\t\t};\n\t}\n\n\tprotected getComponentMeta<T, P>( item: ComponentItemType<T>, propertyName: string, _params?: P, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: T | null= null;\n\t\tlet frameworkComponent: T | null = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: T | undefined) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent =\n\t\t\t\t\tthis.getFrameWorkOverrides().isFrameworkComponent( component, );\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass(\n\t\t\tthis.getComponent<T>(item, propertyName),\n\t\t);\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent<T>(_item: ComponentItemType<T>, _propertyName: string): T | undefined {\n        return undefined;\n\t}\n    protected newInstance<T, P>( component: { new (...args: any[]): any }, componentFrameWork: boolean, propertyName: string, params?: P, ) {\n\t\tlet instance: T;\n\t\tconst frameworkComponentWrapper = this.getBeanInstance( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstance( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta ? componentMeta?.mandatoryMethodList ?? [] : [],\n\t\t\t\tcomponentMeta ? componentMeta?.optionalMethodList ?? [] : [],\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise === undefined) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n        \n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | undefined {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n    protected getMergeParams<T, P>(item : ComponentItemType<T>, propertyName : string, params : any) : any {\n        return {...params, ...this.getUserParams<T, P>(item, propertyName, params)};\n    }\n\n    protected getUserParams<T, _P>(_item : ComponentItemType<T>, _propertyName : string, _params : any) : any {\n        \n\n    }\n\n    protected getUserRendererParams<T, P>(item : ComponentItemType<T>, params : P) : any {\n        const rendererParams = item.getRendererParams();\n\n        let rendererParamsResult : any = {};\n\n        if (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n        return rendererParamsResult;\n    }\n}","export interface IClipboard {\n\tcopy?: boolean;\n\tcut?: boolean;\n\tpaste?: boolean;\n}\n\nexport type ClipboardConfig = IClipboard | boolean | undefined;\n\nexport type ClipboardOperation = 'copy' | 'cut' | 'paste';\n\n\nexport function isClipboardOperationAllowed(clipboard: ClipboardConfig,operation: ClipboardOperation): boolean {\n\tif (clipboard === undefined || clipboard === true) {\n\t\treturn true;\n\t}\n\tif (clipboard === false) {\n\t\treturn false;\n\t}\n\treturn clipboard[operation] !== false;\n}\n\n\nexport function createClipboardGuard(getClipboard: () => ClipboardConfig): (event: ClipboardEvent) => void {\n\treturn (event: ClipboardEvent) => {\n\t\tconst operation = event.type as ClipboardOperation;\n\t\tif (!isClipboardOperationAllowed(getClipboard(), operation)) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t};\n}\n\n\n// export function registerClipboardGuards(element: HTMLElement | null | undefined,getClipboard: () => ClipboardConfig,addListener: (target: HTMLElement, event: string, listener: (event: ClipboardEvent) => void) => void): void {\n// \tif (!element) {\n// \t\treturn;\n// \t}\n// \tconst guard = createClipboardGuard(getClipboard);\n// \taddListener(element, 'copy', guard);\n// \taddListener(element, 'cut', guard);\n// \taddListener(element, 'paste', guard);\n// }\nexport type ClipboardConfigProvider = () => ClipboardConfig;\n\nexport type ClipboardEventListener = (event: ClipboardEvent) => void;\n\nexport type ClipboardListenerRegistrar = (\n\ttarget: HTMLElement,\n\tevent: ClipboardOperation,\n\tlistener: ClipboardEventListener\n) => void;\n\nexport function registerClipboardGuards(element: HTMLElement | null | undefined,getClipboard: ClipboardConfigProvider,addListener: ClipboardListenerRegistrar): void {\n\tif (!element) {\n\t\treturn;\n\t}\n\tconst guard = createClipboardGuard(getClipboard);\n\taddListener(element, 'cut', guard);\n\taddListener(element, 'copy', guard);\n\taddListener(element, 'paste', guard);\n}","export interface CreateSVGClassType{\n    icon : string,\n    svg : string\n}\n\n// export function createSVGTemplate(classes : CreateSVGClassType, iconID : string){\n//     return `<i class =\"dg-button__icon\">\n//     <svg class=${classes.svg} focusable=\"false\" ref=\"svg-element\">\n//                 <use xlink:href=${iconID}></use>\n//             </svg>\n//             <i>`\n// }\n\nexport function getSvgIcon(iconId: string,classes : CreateSVGClassType ): string {\n    const svgIcons: { [key: string]: string } = {\n        \"icon-plus\": \n            `<svg viewBox=\"0 0 24 24\"  class=${classes.svg}>\n                <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm5 11h-4v4h-2v-4H7v-2h4V7h2v4h4v2z\" />\n            </svg>`,\n        \"icon-minus\": \n           `<svg viewBox=\"0 0 24 24\" class=${classes.svg}>\n                <path d=\"M19 13H5v-2h14v2z\" />\n            </svg>`,\n        \"icon-up-arrow\":\n           `<svg width=\"24\" class=${classes.svg} height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n  <path d=\"M8 14L12 10L16 14\" stroke=\"#4A4A4A\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n</svg>`,\n        \"icon-down-arrow\": \n           `<svg width=\"24\" class=${classes.svg} height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path d=\"M8 10L12 14L16 10\" stroke=\"#4A4A4A\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n                </svg>`,\n        \"icon-share\":\n           `<svg viewBox=\"0 0 24 24\" class=${classes.svg}>\n                <path d=\"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.12-4.11c.54.5 1.24.82 2.02.82 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L7.96 9.81C7.42 9.31 6.72 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.72 0 1.42-.31 1.96-.77l7.12 4.11c-.05.23-.09.46-.09.7 0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3z\" />\n            </svg>`,\n        \"remove-icon\": \n            `<svg viewBox=\"0 0 24 24\" class=${classes.svg}>\n                <g id=\"Layer_1-2\" data-name=\"Layer 1\">\n                    <path d=\"M1 20a1 1 0 0 1-.71-1.7l18-18.01A1 1 0 1 1 19.7 1.7L1.71 19.71c-.2.2-.45.29-.71.29Z\" />\n                    <path d=\"M19 20c-.26 0-.51-.1-.71-.29l-18-18C-.1 1.32-.1.68.29.29s1.03-.39 1.42 0l18 18a1 1 0 0 1-.71 1.7Z\" />\n                </g>\n            </svg>`,\n        \"selected-icon\": \n           `<svg viewBox=\"0 0 24 24\" class=${classes.svg}>\n                <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 14.5l-5-5 1.41-1.41L11 13.67l7.59-7.59L20 7.5l-9 9z\" />\n            </svg>`,\n        \"dg__svg--backward\": `\n            <svg viewBox=\"0 0 12 12\" width=\"100%\" height=\"100%\" class=${classes.svg}>\n                <polygon points=\"6.6,10.3 2.9,6.5 6.6,2.7 7.4,3.4 4.3,6.5 7.4,9.6\"></polygon>\n            </svg>`,\n        \"dg__svg--fastbackward\": \n           `<svg viewBox=\"0 0 12 12\" width=\"100%\" height=\"100%\" class=${classes.svg}>\n                <polygon points=\"5.6,10.3 1.9,6.5 5.6,2.6 6.3,3.4 3.3,6.5 6.4,9.6\"></polygon>\n                <polygon points=\"9.6,10.3 5.9,6.5 9.6,2.6 10.3,3.4 7.3,6.5 10.4,9.6\"></polygon>\n            </svg>`,\n        \"dg__svg--fastforward\": \n           `<svg viewBox=\"1 0 12 12\" width=\"100%\" height=\"100%\" class=${classes.svg}>\n                <polygon points=\"7.4,10.3 6.7,9.6 9.7,6.5 6.6,3.4 7.4,2.7 11.1,6.5\"></polygon>\n                <polygon points=\"3.4,10.3 2.7,9.6 5.7,6.5 2.6,3.4 3.4,2.7 7.1,6.5\"></polygon>\n            </svg>`,\n        \"dg__svg--forward\":\n           `<svg viewBox=\"1 0 12 12\" width=\"100%\" height=\"100%\" class=${classes.svg}>\n                <polygon points=\"4.4,10.3 3.7,9.6 6.7,6.5 3.6,3.4 4.4,2.7 8.1,6.5\"></polygon>\n            </svg>`,\n        'dg__svg--time-picker' : \n        `<svg  viewBox=\"0 0 20 20\" id=\"dg__svg--time\"  class=${classes.svg}>\n  <path d=\"M13.01,11.76l-2.45-1.56v-3.23c0-.5-.41-.91-.91-.91s-.91.41-.91.91v3.73c0,.31.16.6.42.77l2.87,1.82c.15.1.32.14.49.14.3,0,.59-.15.77-.42.27-.42.14-.99-.28-1.26Z\"/>\n  <path d=\"M10,0C4.49,0,0,4.49,0,10s4.49,10,10,10,10-4.49,10-10S15.51,0,10,0ZM10,18.18c-4.51,0-8.18-3.67-8.18-8.18S5.49,1.82,10,1.82s8.18,3.67,8.18,8.18-3.67,8.18-8.18,8.18Z\"/>\n</svg>`\n    };\n\n    return svgIcons[iconId] || \"\";\n}\n\n\n\n","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../Grid/Core/Rows/RecordHandler.types\";\nimport { IColumnAutofitHandler } from \"./column-autofitHandler.types\";\nimport { FieldHandler } from \"../../Grid/Core/Columns/FieldHandler\";\nimport { IColumnNode, IGridAPI } from \"../../Grid/Main\";\nimport { columnPinPositions } from \"../../Grid/Core/Constants/GridConfigurationConstants\";\nimport { Events } from \"../../Grid/Core/Constants/Events\";\nimport { debounce } from \"../../Grid/Core/utils/GridUtilities\";\n\n\n@Bean(GRID_BEAN_NAME.COLUMN_AUTOFIT_HANDLER)\nexport class ColumnAutofitHandler extends EventEmitter implements IColumnAutofitHandler{\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler   : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.GRID_API) private gridApi             : IGridAPI;\n    \n    private isAutofitInProgress       : boolean = false;\n    private columnsInProgress         : Omit<Record<columnPinPositions, number[]>, 'rowHeader'>;\n    private columnWidthMapping        : Record<number,                  number> = {};\n    private succssCallback            : any;\n    private viewportStartRow          : number = null;\n    private viewportEndRow            : number = null;\n    private onRowsRenderComplete      : () => void;\n    private autoWidthInitPending      : boolean = false;\n    private pendingMeasurements       : Array<{element: HTMLElement, columnNode: IColumnNode, columnIndex: number}> = [];\n    private batchScheduled            : boolean = false;\n\n    @PostConstruct()\n    init() : void{\n        this.columnsInProgress = {\n            left   : [],\n            center : [],\n            right  : [],\n        }\n        this.columnWidthMapping  = {};\n\n        this.onRowsRenderComplete = debounce(()=>{\n            if(this.isAutofitInProgress){\n                this.applyMaxColumnAutoCap(this.columnWidthMapping);\n                this.succssCallback?.(this.columnWidthMapping);\n                this.onAfterAutofitProcess();\n            }\n        }, 50); \n\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_INIT, this.collectAutoWidthColumns.bind(this));\n    }\n\n    private collectAutoWidthColumns() : void {\n        const totalColumns = this.fieldHandler.getTotalCount();\n        const autoWidthColumns : number[] = [];\n\n        for (let i = 0; i < totalColumns; i++) {\n            const definition = this.fieldHandler.getColumnDefinition(i);\n            if (definition?.width === 'auto') {\n                autoWidthColumns.push(i);\n            }\n        }\n\n        if (autoWidthColumns.length > 0) {\n            this.autoWidthInitPending = true;\n            this.dispatchEvent({ type : Events.EVENT_AUTO_WIDTH_INIT_START });\n\n            const onSuccess = (autoFitMapping : Record<number, number>) => {\n                autoWidthColumns.forEach(columnIndex => {\n                    if (autoFitMapping[columnIndex] !== undefined) {\n                        this.fieldHandler.setColumnWidth(columnIndex, autoFitMapping[columnIndex]);\n                    }\n                });\n                this.dispatchEvent({ type : Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED });\n                this.dispatchEvent({ type : Events.EVENT_COLUMN_REFRESH });\n                this.dispatchEvent({ type : Events.EVENT_DISPLAYED_COLUMNS_RESIZE_CHANGED });\n            };\n\n            this.isAutofitInProgress = true;\n            this.columnWidthMapping  = {};\n            this.succssCallback      = onSuccess;\n\n            autoWidthColumns.forEach((column) => {\n                const columnNode = this.fieldHandler.getColumnNode(column);\n                const pinPosition = columnNode.getPinnedPosition();\n                this.columnsInProgress[pinPosition].push(column);\n            });\n        }\n    }\n\n    private onBeforeAutofitProcess(columns : number[], onSuccess : CallableFunction) : void{\n        this.isAutofitInProgress = true;\n        this.columnWidthMapping  = {};\n        this.succssCallback      = onSuccess;\n\n        const {startRow : startMeta, endRow : endMeta}          = this.gridApi.getViewPort();\n        this.viewportStartRow   = this.recordHandler.getIndexByMeta(startMeta.rowIndex, startMeta.pinPosition, startMeta.parentKeys);\n        this.viewportEndRow     = this.recordHandler.getIndexByMeta(endMeta.rowIndex, endMeta.pinPosition, endMeta.parentKeys);\n\n        columns.forEach((column) => {\n            const columnNode = this.fieldHandler.getColumnNode(column);\n            const pinPosition = columnNode.getPinnedPosition();\n            this.columnsInProgress[pinPosition].push(column);\n        });\n    }\n\n    private onAfterAutofitProcess() : void{\n        this.isAutofitInProgress = false;\n        this.succssCallback      = null;\n        this.columnsInProgress   = {\n            left   : [],\n            center : [],\n            right  : [],\n        };\n\n        this.viewportStartRow = null;\n        this.viewportEndRow   = null;\n\n        this.dispatchEvent({\n            type       : Events.EVENT_GRID_REFRESH,\n            recycleRows: true,\n            onlyBody   : false,\n        });\n\n        if (this.autoWidthInitPending) {\n            this.autoWidthInitPending = false;\n            this.dispatchEvent({ type : Events.EVENT_AUTO_WIDTH_INIT_COMPLETE });\n        }\n    }\n\n    isInViewport(rowIndex : number) : boolean {\n        if(this.viewportStartRow != null && this.viewportEndRow != null){\n            return this.viewportStartRow <= rowIndex && rowIndex <= this.viewportEndRow;\n        }\n        return false;\n    } \n\n    onAfterCellRenderComplete(cellComponent: any) : void {\n        const cellElement = cellComponent.getGui();\n        const columnNode  = cellComponent.column as IColumnNode;\n        if(columnNode) {\n            const columnIndex = this.fieldHandler.getIndexById(columnNode.getID());\n            if(this.isAutofitInProgress && cellElement && this.isColumnProcessing(columnIndex)){\n                this.pendingMeasurements.push({ element: cellElement, columnNode, columnIndex });\n\n                if (!this.batchScheduled) {\n                    this.batchScheduled = true;\n                    requestAnimationFrame(() => this.processBatchMeasurements());\n                }\n            }\n        }\n    }\n\n    private processBatchMeasurements() : void {\n        this.batchScheduled = false;\n        const batch = this.pendingMeasurements;\n        this.pendingMeasurements = [];\n\n        for (let i = 0; i < batch.length; i++) {\n            batch[i].element.style.width = 'max-content';\n        }\n\n        for (let i = 0; i < batch.length; i++) {\n            const { element, columnIndex } = batch[i];\n            const existing = this.columnWidthMapping[columnIndex] ?? 0;\n            const calculatedAutoWidth = Math.max(existing, element.offsetWidth);\n            const columnDefinition = this.fieldHandler.getColumnDefinition(columnIndex);\n            const maxColumnAuto = columnDefinition?.maxColumnAuto;\n            const shouldApplyAutoCap = typeof maxColumnAuto === 'number';\n\n            this.columnWidthMapping[columnIndex] = shouldApplyAutoCap\n                ? Math.min(calculatedAutoWidth, maxColumnAuto)\n                : calculatedAutoWidth;\n        }\n\n        for (let i = 0; i < batch.length; i++) {\n            batch[i].element.style.width = batch[i].columnNode.getWidth() + 'px';\n        }\n\n        this.onRowsRenderComplete();\n    }\n\n    private applyMaxColumnAutoCap(columnWidthMapping : Record<number, number>) : void {\n        const columnIndexes = Object.keys(columnWidthMapping);\n        for (let i = 0; i < columnIndexes.length; i++) {\n            const columnIndex = Number(columnIndexes[i]);\n            const maxColumnAuto = this.fieldHandler.getColumnDefinition(columnIndex)?.maxColumnAuto;\n            if (typeof maxColumnAuto === 'number') {\n                columnWidthMapping[columnIndex] = Math.min(columnWidthMapping[columnIndex], maxColumnAuto);\n            }\n        }\n    }\n\n    private isColumnProcessing(columnIndex : number) : boolean {\n        const left = this.columnsInProgress.left;\n        const center = this.columnsInProgress.center;\n        const right = this.columnsInProgress.right;\n\n        let leftIndex = left.indexOf(columnIndex);\n        const centerIndex = center.indexOf(columnIndex);\n        const rightIndex = right.indexOf(columnIndex);\n\n        return (leftIndex!=-1 || rightIndex!=-1 || centerIndex!=-1)\n    }\n\n    getAutofitProgressState() : boolean{\n        return this.isAutofitInProgress;\n    }\n\n    getColumnsToBeProcessed(params : any, pinPosition : columnPinPositions = 'center') : number[]{\n        const columns : number[]= this.columnsInProgress[pinPosition].slice();\n        const isInViewport = this.isInViewport(params.rowIndex);\n        if(isInViewport){\n            const {startColumnIndex, endColumnIndex} = params;\n            for(let columnIndex = startColumnIndex; columnIndex <= endColumnIndex; columnIndex++){\n                const node = this.fieldHandler.getColumnNode(columnIndex);\n                const isValid = !columns.includes(columnIndex) && node.getPinnedPosition() === pinPosition;\n                isValid && columns.push(columnIndex);\n            }\n        }\n        return  columns;\n    }\n\n    getColumnNodesToBeProcessed(params : any, pinPosition : columnPinPositions = 'center') : IColumnNode[] {\n        const columns = this.getColumnsToBeProcessed(params, pinPosition);\n        return columns.map((column) => this.fieldHandler.getColumnNode(column));\n    }\n\n    getMiddleRowsToBeProcessed() : number[]{\n        return this.recordHandler.getRowsInDataCache();\n    }\n    \n    autofitColumns(columns : number[], onSuccess : CallableFunction) : void {\n        this.onBeforeAutofitProcess(columns, onSuccess);\n        this.dispatchEvent({\n            type       : Events.EVENT_GRID_REFRESH,\n            recycleRows: false,\n            onlyBody   : false,\n        });\n    }\n}","import { rowPinPositions } from \"../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IDraftRowDefinition } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { IDraftPosition, IRowBlockHandler } from \"./rowblock-handler.types\";\n\nconst getIdByIndex = (index: number, toalRowCount: number, parentKeys: string[], rowPinPosition : rowPinPositions,topDraftRows: string[], bottomDraftRows: string[]) => {\n    const rowMeta = parseFromDraftIndex(index, toalRowCount, parentKeys, rowPinPosition, topDraftRows, bottomDraftRows);\n    const parsedIndex = rowMeta.rowIndex;\n    if(rowMeta.pinPosition == 'topDraftRow'){\n        return topDraftRows[parsedIndex];\n    }\n    else if(rowMeta.pinPosition == 'bottomDraftRow'){\n        return bottomDraftRows[parsedIndex];\n    }\n    return null;\n\n}\n\nconst parseFromDraftIndex = (index: number, toalRowCount: number, parentKeys: string[], rowPinPosition : rowPinPositions,topDraftRows: string[], bottomDraftRows: string[]) => {\n    let rowIndex, pinPosition;\n\n    if(rowPinPosition == 'top' || rowPinPosition == 'bottom'){\n        return {\n            parentKeys,\n            rowIndex    : index,\n            pinPosition : rowPinPosition\n        };\n    }\n    const topDraftRowsCount    = topDraftRows.length;\n    const bottomDraftRowsCount = bottomDraftRows.length;\n    const realRowCount         = toalRowCount - (topDraftRowsCount + bottomDraftRowsCount);\n\n    if (index < topDraftRowsCount ) {\n        pinPosition = 'topDraftRow';\n        rowIndex    = index;\n    }\n    else if (index < topDraftRowsCount + realRowCount) {\n        pinPosition = rowPinPosition;\n        rowIndex    = index - topDraftRowsCount;\n    }\n    else {\n        pinPosition = 'bottomDraftRow';\n        rowIndex    = index - (topDraftRowsCount + realRowCount);\n    }\n    return {\n        parentKeys  : parentKeys,\n        rowIndex    : rowIndex,\n        pinPosition : pinPosition\n    };\n}\n\nconst isDraftRow = (rowId: string, topDraftRows: string[], bottomDraftRows: string[]) => {\n    return topDraftRows.includes(rowId) || bottomDraftRows.includes(rowId);\n}\n\nconst parseToDraftIndex = (index: number, position : rowPinPositions, toalRowCount: number, topDraftRows: string[]) => {\n    if(position == 'topDraftRow'){\n        return index;\n    }\n    else if(position == 'middle'){\n        return topDraftRows.length + index;\n    }\n    else if(position == 'bottomDraftRow'){\n        return  topDraftRows.length + toalRowCount + index;\n    }\n    return index;\n}\n\nconst getIndexById = (id: string, realRowCount : number, topDraftRows: string[], bottomDraftRows: string[]) => {\n    const topDraftRowsCount = topDraftRows.length;\n    const topIndex = topDraftRows.indexOf(id);\n    if(topIndex !== -1){\n        return topIndex;\n    }\n    const bottomIndex = bottomDraftRows.indexOf(id);\n    if(bottomIndex !== -1){\n        return realRowCount + bottomIndex + topDraftRowsCount;\n    }\n    return null;\n}\n\nconst getInsertDraftRowMeta = (rowBlock : IRowBlockHandler, count: number, insertPosition: IDraftPosition, rowDefinitionFetcher : (rowIndex: number)=>IDraftRowDefinition) => {\n    const insertMetas = [];\n    let insertIndex = insertPosition === 'topDraftRow' ? 0 : rowBlock.getRowCount();\n    for(let loopIndex = 0; loopIndex < count; loopIndex++) {\n        const rowDefinition = rowDefinitionFetcher(insertIndex);\n        const rowData       = rowDefinition?.draftData ?? {};\n        const rowId         = rowBlock.generateRowId(insertIndex, rowDefinition);\n        const rowNode       = rowBlock.createRowNode(rowId, rowData, rowDefinition);\n        rowNode.setPinnedPosition(insertPosition);\n        const height = rowBlock.fetchHeight(loopIndex, rowNode);\n        insertMetas.push({\n            rowNode : rowNode,\n            height  : height,\n            index   : insertIndex,\n        });\n        insertIndex++;\n    }\n    return insertMetas;\n}\n\nexport const DraftRowUtility = {\n    getIdByIndex,\n    parseFromDraftIndex,\n    parseToDraftIndex,\n    isDraftRow,\n    getInsertDraftRowMeta,\n    getIndexById\n}","import { IRowDefinition } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { RowNode } from \"../Grid/Core/Rows/RowNode\";\nimport { IRowNode } from \"../Grid/Main\";\nimport { IGroupedRowNodeHelper } from \"./IGroupedRowNode\";\nimport { IGroupedRowNodeCore } from \"./group-rownode.types\";\nimport { IRowNodeCore } from \"./rownode.types\";\n\nfunction getAllChildren(node : IGroupedRowNodeCore | IRowNodeCore) {\n    const allChildren = [];\n    const rowNode = node as IGroupedRowNodeCore;\n    const directChildren = rowNode.getDirectChildren?.() ?? [];\n    if (directChildren?.length > 0) {\n        for (const childNode of directChildren) {\n            allChildren.push(childNode, ...getAllChildren(childNode));\n        }\n    }\n    return allChildren;\n}\n\nfunction countLeafNodes(node : IGroupedRowNodeCore) : number{\n    let nodeArray : IGroupedRowNodeCore[] = [];\n    const isGroupRow = node.isGroupRow?.() ?? false;\n    if(isGroupRow){\n        return 1\n    }\n    else{\n        const groupRowNode = node as IGroupedRowNodeCore\n        nodeArray = groupRowNode.getDirectChildren() as IGroupedRowNodeCore[];\n    }\n\n    if (!nodeArray|| nodeArray.length === 0) {\n        return 1;\n    } else {\n        let totalCount = 0;\n        for (const childNode of nodeArray) {\n            totalCount += countLeafNodes(childNode);\n        }\n        return totalCount;\n    }\n}\n\n\nclass GroupRowNode extends RowNode implements IGroupedRowNodeCore {\n    public  id                  : string;\n    private expanded            : boolean;\n    public  parentId            : string;\n    private grouped             : boolean;\n    private directChildren      : IGroupedRowNodeCore[] | IRowNodeCore[];\n    private rowNodeHelper       : IGroupedRowNodeHelper;\n    private groupMeta           : Record<string, string>[];\n    private initialIdsOrder     : string[] = null;\n    private directChildrenCount : number;\n    private selectedCount       : number = 0;\n    private selectAll           : boolean = false;\n    private leafGroupFlag       : boolean = false;\n    private childrenCollapsed   : boolean = true;\n    private topDraftRows        : string[] = [];\n    private bottomDraftRows     : string[] = [];\n\n    constructor(helper, id : string, parentId: string|null, data : any | null, rowDefinition : IRowDefinition|null) {\n        super(helper, id, rowDefinition);\n        this.id             = id;\n        this.directChildren = null;\n        this.parentId       = parentId;\n        this.expanded       = rowDefinition?.expand ?? false;\n        this.grouped        = true;\n        this.rowNodeHelper = helper;\n        this.rowData       = {...this.rowData, ...{data}};\n    }\n\n    setIsLeafGroup(isLeafGroup: boolean): void {\n        this.leafGroupFlag = isLeafGroup;\n    }\n\n    isLeafGroup(): boolean {\n        return this.leafGroupFlag;\n    }\n\n    getTopDraftRows(): string[] {\n        return this.topDraftRows;\n    }\n\n    getBottomDraftRows(): string[] {\n        return this.bottomDraftRows;\n    }\n\n    hasDraftRows(): boolean {\n        return this.topDraftRows.length > 0 || this.bottomDraftRows.length > 0;\n    }\n\n\n    getLastDraftRow(): string {\n        return this.bottomDraftRows[this.bottomDraftRows.length - 1];\n    }\n    \n    getFirstDraftRow(): string {\n        return this.topDraftRows[0];\n    }\n\n    addDraftRow(id: string, position: 'topDraftRow' | 'bottomDraftRow'): void {\n        const holder = position === 'topDraftRow' ? this.topDraftRows : this.bottomDraftRows;\n        holder.push(id);\n    }\n\n    removeDraftRow(id: string): boolean {\n        let idx = this.topDraftRows.indexOf(id);\n        if (idx !== -1) {\n            this.topDraftRows.splice(idx, 1);\n            return true;\n        }\n        idx = this.bottomDraftRows.indexOf(id);\n        if (idx !== -1) {\n            this.bottomDraftRows.splice(idx, 1);\n            return true;\n        }\n        return false;\n    }\n\n    isDraftRow(id: string): boolean {\n        return this.topDraftRows.includes(id) || this.bottomDraftRows.includes(id);\n    }\n\n    isExpandable(): boolean {\n        return true;\n    }\n\n    setInitialOrder(ids : string[] = null): void {\n        this.initialIdsOrder = ids;\n    }\n\n    getInitialIdsOrder(): string[] {\n        return this.initialIdsOrder;\n    }\n\n    getGroupValues(): string[] {\n        const groupMeta = this.getGroupMeta();\n        return groupMeta.map(meta => Object.values(meta)[0]);\n    }\n\n    setGroupMeta(groupMeta : Record<string, string>[]){\n        this.groupMeta = groupMeta;\n    }\n\n    getGroupMeta() : Record<string, string>[] {\n        return this.groupMeta ?? [];\n    }\n\n    getCurrentMeta() : Record<string, string> {\n        const level       = this.getLevel();\n        const currentMeta = this.getGroupMeta()[level - 1];\n        const entry       = Object.entries(currentMeta)[0];\n        return {\n            groupKey : entry[0],\n            groupValue : entry[1]\n        }\n    }\n\n    getOwnGroupValue() : string {\n        const index = this.getLevel() - 1;\n        return this.getGroupValues()[index];\n    }\n\n    setDirectChildrenCount(count: number): void {\n        this.directChildrenCount = Math.max(0, count);\n    }\n    \n    getChildCount(includeGroupRows : boolean = false) : number {\n        return includeGroupRows ? countLeafNodes(this) : this.directChildrenCount;\n    }\n\n    //by default direct children doesn't include draft rows\n    getDirectChildrenCount(includeDraftRows: boolean = true): number {\n        // return includeDraftRows ? this.directChildrenCount : this.directChildrenCount - this.getTotalDraftCount();\n        return includeDraftRows ? this.directChildrenCount+this.getTotalDraftCount() : this.directChildrenCount;\n    }\n\n    getTotalDraftCount(): number {\n        return this.topDraftRows.length + this.bottomDraftRows.length;\n    }\n\n    getFirstRowInGroup(): number {\n        const id = this.getId();\n        return this.rowNodeHelper.getFirstRowInGroup(id);\n    }\n\n    getLastRowInGroup(): number {\n        const id = this.getId();\n        return this.rowNodeHelper.getLastRowInGroup(id);\n    }\n\n    isCollapsed(): boolean {\n        const parentNode = this.getParentNode();\n        return Boolean(!this.expanded || parentNode?.isCollapsed());\n    } \n\n    getParentId(): string {\n        return this.parentId;\n    }\n\n    setParentId(parentId: string): void {\n        this.parentId = parentId;\n    }\n\n    setHasGrouped(grouped: boolean): void {\n        this.grouped = grouped;\n    }\n\n    setDirectChildren(directChildren : IGroupedRowNodeCore[] | IRowNode[]): void {\n        this.setDirectChildrenCount(directChildren.length);\n        this.directChildren = directChildren;\n    }\n\n    getDirectChildren(): IGroupedRowNodeCore[] | IRowNodeCore[] {\n        return this.directChildren;\n    }\n     \n    isGroupRow(): boolean {\n        return this.grouped;\n    }\n    \n    getLevel() : number {\n        return this.getGroupKeys().length;\n    }\n\n    getGroupKeys() : string[] {\n        const groupMeta = this.getGroupMeta();\n        return groupMeta.map(meta => Object.keys(meta)[0]);\n    }\n\n    getAllLeafChildren() {\n        return this.getAllChildren();\n    }\n\n    expand(params ?: {recursive ?: boolean}): void {\n        this.rowNodeHelper.expand(this, params);\n    }\n\n    collapse(recursive?: boolean) : void {\n        this.rowNodeHelper.collapse(this, recursive);\n    }\n\n    updateCollapseState(collapseState: boolean): void {\n        this.expanded = !collapseState;\n    }\n\n    isChildrenCollapsed(): boolean {\n        return this.childrenCollapsed;\n    }\n\n    setChildrenCollapsed(value: boolean): void {\n        this.childrenCollapsed = value;\n    }\n    getGroupHeaderRow(): IGroupedRowNodeCore {\n        const id         = this.getParentId();\n        const parentNode = this.rowNodeHelper.getRowNodeById(id);\n        return parentNode;\n    }\n\n    getData() {\n        let data = super.getData();\n        if(data == null){\n            data = {};\n            this.groupMeta.forEach(meta=>Object.assign(data, meta));\n            this.updateRowData(data);\n        }\n        return data;\n    }\n\n    getRowGroupFirstIndex() : number{\n        const parentNode  = this.getGroupHeaderRow();\n        if(parentNode){\n            const directChildren = parentNode.getDirectChildren();\n            return directChildren[0].getIndex();\n        }\n        else return 0;\n    }\n    getRowGroupLastIndex() : number{\n        const parentNode  = this.getGroupHeaderRow();\n        const directChildren =  parentNode.getDirectChildren();\n        const endIndex = directChildren?.length-1;\n        return directChildren[endIndex].getIndex();\n    }\n    \n    getAllChildren() {\n        return getAllChildren(this);\n    }\n\n    getGroupHeight(): number {\n        const id = this.getId();\n        return this.helper.getGroupHeight(id);\n        if(this.isCollapsed()) {\n            return this.getHeight();\n        }\n\n        const level = this.getLevel();\n\n        if(level === 1) {\n            return 13 * this.getHeight();\n        }else if(level === 2) {\n            return 4 * this.getHeight();\n        }\n\n        return this.getHeight();\n\n        \n    }\n\n    hasChildren(): boolean {\n        return this.getChildCount() > 0;\n    }\n\n    getParentNode() : IGroupedRowNodeCore{\n        const rootNode    = this.helper.getRootNode();\n        if(this.parentId == rootNode.getId()) {\n            return rootNode;\n        };\n        return this.rowNodeHelper.getRowNodeById(this.parentId);\n    }\n\n    getChildIndexById(childId: string): number {\n        const id = this.getId();\n        const rootNode = this.helper.getRootNode();\n        const rootNodeId  = rootNode.getId();\n        const parentNode     = id == rootNodeId ? rootNode : this.rowNodeHelper.getRowNodeById(id);\n        const directChildren = parentNode.getDirectChildren();\n        const index          = directChildren?.findIndex(node => node.getId() === childId);\n        return index < 0 ? null : index;\n        // return this.rowNodeHelper.getChildIndexById(id, childId);\n    }\n\n    getSelected(): \"all\" | \"intermediate\" | \"none\" {\n        const directChildrenCount = this.getDirectChildrenCount(false);\n        if (directChildrenCount === 0) {\n            return 'none';\n        }\n        return this.selectedCount === directChildrenCount ? 'all' : this.selectedCount === 0 ? 'none' : 'intermediate';\n    }\n\n    getSelectedCount(): number {\n        return this.selectedCount\n    }\n\n    setSelectedCount(count: number): void {\n        this.selectedCount =  Math.max(0, count);;\n        this.updateSelectionToParentNode();\n    }\n\n    updateSelectedCount(count: number, reset ?: boolean): void {\n        if(reset) {\n            this.selectedCount = 0;\n        }\n        this.selectedCount = Math.max(0, this.selectedCount + count);\n        this.updateSelectionToParentNode(reset);\n    }\n\n    private updateSelectionToParentNode(reset?: boolean): void {\n        const isAllSelected = this.selectedCount === this.directChildrenCount;\n\n        const parentNode = this.getParentNode();\n\n        if (this.selectAll !== isAllSelected) {\n            const delta = isAllSelected ? 1 : -1;\n    \n            parentNode && parentNode.updateSelectedCount(delta, reset);\n    \n            this.selectAll = isAllSelected;\n        }\n    }\n    \n    \n}\n\nexport{\n    GroupRowNode\n}","import { AutoWired, BEAN_NAME, PostConstruct } from \"@dg/corecomponent\";\nimport { rowPinPositions } from \"../../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IDraftRowDefinition, IRowDefinition, IRowDefinitionFetchParams, IRowDefinitions, IRowHeightFetcher } from \"../../Grid/Core/Interface/IRowDefinitions\";\nimport { IGroupKeys, IGroupModel } from \"../../Grid/Core/Interface/IRowGroupingConfigurations\";\nimport { ISortModel } from \"../../Grid/Core/Interface/ISortConfigurations\";\nimport { IJson, IRowNodeHelper, MovePosition } from \"../../Grid/Main\";\nimport { IFilterHandler } from \"./filter-handler.types\";\nimport { IRowGroupingHandler } from \"./rowgrouping-handler.types\";\nimport { ISortHandler } from \"./sort-handler.types\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { IRowAxisConstructor, IRowAxisCore } from \"../RowAxis/rowAxis.types\";\nimport { IRowNodeCore } from \"../rownode.types\";\nimport { IFilterModel } from \"../../Grid/Core/Interface/IFilterConfigurations\";\nimport { IClientBlockHandler } from \"./client-rowblock-handler.types\";\nimport { RowBlockCommon } from \"../RowBlockCommon\";\nimport { IGridBeanClassRegistry } from \"../../Grid/Core/grid-beanclass-registry.types\";\nimport { IRowBlockRowDeleteMeta, IRowBlockRowInsertMeta, IBlockInsertMeta } from \"../rowblock-handler.types\";\nimport { IGroupedRowNodeCore } from \"../group-rownode.types\";\nimport { IRowMeta } from \"../../Grid/API/CommonAPIInterface\";\nimport { GroupRowNode } from \"../GroupRowNode\";\nimport { DraftRowHandler, IDraftRowHandlerDependencies } from \"./DraftRowHandler\";\nimport { GanttController } from \"../../GanttModelClasses/Core/GanttComponent/GanttController\";\n\nclass ClientBlockHandler extends RowBlockCommon implements IClientBlockHandler {\n\tprivate heightFetcher     : IRowHeightFetcher;\n\tprivate definitionFetcher : IRowDefinitions;\n\tprivate idsOrder          : string[];\n\tprivate initialIdsOrder   : string[];\n\tprivate rowNodeHelper!    : IRowNodeHelper;\n\t\n\t@AutoWired(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY) classRegistry  !: IGridBeanClassRegistry;\n\tprivate    sortHandler       !                                  : ISortHandler;\n\tprivate    filterHandler     !                                  : IFilterHandler;\n\tprivate    rowGroupingHandler!                                  : IRowGroupingHandler;\n\n\tpublic rowAxis!       : IRowAxisCore;\n\tpublic rowPinPosition : rowPinPositions;\n\tpublic RowAxisClass   : IRowAxisConstructor;\n\n    staticIds          : string[];\n\n\tstatic ROOT_ID = `${'dataGrid-'.repeat(2)}root`;\n\tprivate rootNode: IGroupedRowNodeCore;\n\n\tprivate draftRowHandler      !: DraftRowHandler;\n\tprivate isFullStructuredModel : boolean;\n\n\tconstructor(rowPinPosition: rowPinPositions, heightFetcher: IRowHeightFetcher, definitionFetcher: IRowDefinitions, RowAxisClass : IRowAxisConstructor) {\n\t\tsuper();\n\t\tthis.rowPinPosition    = rowPinPosition;\n\t\tthis.heightFetcher     = heightFetcher;\n\t\tthis.definitionFetcher = definitionFetcher;\n\t\tthis.idsOrder          = [];\n\n\t\tthis.initialIdsOrder = null;\n\t\tthis.RowAxisClass    = RowAxisClass;\n\t}\n\n\tresetRoot(): void {\n\t\tconst directChildren = this.getIdsOrder().map(id => this.getRowNodeById(id));\n\t\tthis.rootNode.setDirectChildren(directChildren);\n\t\tthis.rootNode.setGroupMeta([]);\n\t}\n\tgetRootNode(): IGroupedRowNodeCore {\n\t\treturn this.rootNode;\n\t}\n\tgetRootId(): string {\n\t\treturn ClientBlockHandler.ROOT_ID;\n\t}\n\n\tgetChildCount(index: number, parentKeys: string[]): number {\n\t\tconst absoluteIndex = this.getAbsoluteIndex(index, parentKeys);\n\t\tconst rowNode       = this.getRowNode(absoluteIndex);\n\t\treturn rowNode ? rowNode.getChildCount() : 0;\n\t}\n\tgetRelativeRowMeta(absoluteIndex: number): IRowMeta {\n\t\tif(this.rowGroupingHandler && this.rowGroupingHandler.getRowGroupingModel()?.length > 0 || this.isFullStructuredModel) {\n\t\t\treturn this.rowGroupingHandler?.getRelativeRowMeta(absoluteIndex)\n\t\t}\n\t\tconst rowMeta = this.parseFromDraftIndex(absoluteIndex);\n\t\treturn {\n\t\t\trowIndex    : rowMeta.rowIndex,\n\t\t\tpinPosition : rowMeta.pinPosition,\n\t\t\tparentKeys  : []\n\t\t};\n\t}\n\t \n\t@PostConstruct()\n\tinit() {\n\t\tconst SortClass        = this.classRegistry.getSortHandler();\n\t\tconst FilterClass      = this.classRegistry.getFilterHandler();\n\t\tconst RowGroupingClass = this.classRegistry.getRowGroupingHandler();\n\n\t\tthis.rowAxis         = this.createManagedBean(new this.RowAxisClass());\n\n\t\tthis.createRowNodeHelper();\n\t\tthis.sortHandler        = SortClass ? this.createManagedBean(new SortClass(this)) : null;\n\t\tthis.filterHandler      = FilterClass ? this.createManagedBean(new FilterClass(this)) : null;\n\t\tthis.rowGroupingHandler = RowGroupingClass ? this.createManagedBean(new RowGroupingClass(this)) : null;\n\n\t\t// Initialize DraftRowHandler\n\t\tthis.draftRowHandler = new DraftRowHandler(this.getDraftRowDependencies());\n\t}\n\n\tprivate getDraftRowDependencies(): IDraftRowHandlerDependencies {\n\t\treturn {\n\t\t\trowAxis           : this.rowAxis,\n\t\t\tgetRowNodeHolder  : () => this.rowNodeHolder,\n\t\t\trowPinPosition    : this.rowPinPosition,\n\t\t\tgetRowCount       : () => this.getRowCount(),\n\t\t\tgenerateRowId     : (index: number, definition?: IRowDefinition) => this.generateRowId(index, definition),\n\t\t\tfetchHeight       : (rowIndex: number, rowNode: IRowNodeCore) => this.fetchHeight(rowIndex, rowNode),\n\t\t\tfetchRowDefinition: (index: number, groupkeys: IGroupKeys, data?: IJson, isRowLoading?: boolean, pinPosition?: rowPinPositions) =>\n\t\t\t\tthis.fetchRowDefinition(index, groupkeys, data, isRowLoading, pinPosition),\n\t\t\tcreateRowNode \t\t: (id: string, data: IJson, definition: IRowDefinition, isLoaded?: boolean, parentKeys?: IGroupKeys) =>\n\t\t\t\tthis.createRowNode(id, data, definition, isLoaded, parentKeys),\n\t\t}\n\t}\n\n\tconstructData(datas: IJson[]): void {\n\t\tthis.rootNode = new GroupRowNode(this.rowNodeHelper, ClientBlockHandler.ROOT_ID, null, [], {expand : true});\n\t\tthis.rootNode.setDirectChildren([]);\n\t\tconst isMiddlePinPosition        = this.rowPinPosition === 'middle';\n\t\t      this.isFullStructuredModel = this.optionsHandler.hasFullTreeStructureProvided() && isMiddlePinPosition;\n\t\tif(this.isFullStructuredModel){\n\t\t\tdatas.length > 0 && this.rowGroupingHandler.constructFullTree(datas)\n\t\t}\n\t\telse{\n\t\t\tfor (let rowIndex = 0; rowIndex < datas.length; rowIndex++) {\n\t\t\t\tconst parentKeys    = [] as IGroupKeys;\n\t\t\t\tconst data          = datas[rowIndex];\n\t\t\t\tconst rowDefinition = this.fetchRowDefinition(rowIndex, parentKeys, data);\n\t\t\t\tthis.insertRowsAtIndexes([{rowIndex, parentKeys, rowData : [data], rowDefinition: [rowDefinition]}]);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate createRowNodeHelper() : void {\n\t\tconst viewType              = this.optionsHandler.getViewType()\n\t\tlet isEndDatePrioritizedForMilestone = false;\n\t\tlet isFlexibleMilestone = false;\n\t\t\n\t\tif(viewType === 'gantt'){\n\t\t\tconst GanttContext = GanttController.getGanttBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\t\tisEndDatePrioritizedForMilestone = GanttContext?.isEndDatePrioritizedForMilestone() ?? false;\n\t\t\tisFlexibleMilestone = GanttContext?.isFlexibleMilestone() ?? false;\n\t\t}\n\n\t\t\n\t\tthis.rowNodeHelper = {\n\t\t\tdispatchRowHeightChange          : (_rowNodes: any) => {},\n\t\t\tgetHeight                        : (index: number) => this.getHeight(index),\n\t\t\tgetTop                           : (index: number) => this.getTop(index),\n\t\t\tgetIndexById                     : (id: string) \t=> this.getIndexById(id),\n\t\t\tisExtraRow                       : (_params: any) => false,\n\t\t\tgetUpcomingRowNodes              : (_index: number) => null,\n\t\t\tsetHeight                        : (index: number, height: number) => this.setHeight(index, height),\n\t\t\tgetLeft                          : (index: number) => this.getLeft(index),\n\t\t\tgetWidth                         : (index: number) => this.getWidth(index),\n\t\t\thide                             : (index: number) => this.hideRow(index),\n\t\t\tshow                             : (index: number) => this.showRow(index),\n\t\t\tgetRowNodeById                   : (id: string) => this.getRowNodeById(id) as any,\n\t\t\tgetRelativeRowMeta               : (absoluteIndex : number) => this.getRelativeRowMeta(absoluteIndex),\n\t\t\tgetRootNode                      : () => this.getRootNode(),\n\t\t\tonDataUpdate                     : (_rowNode : IRowNodeCore, _key : string, _oldValue : any) => {},\n\t\t\tisEndDatePrioritizedForMilestone : () => isEndDatePrioritizedForMilestone,\n\t\t\tisFlexibleMilestone             : () => isFlexibleMilestone,\n\t\t\tgetGroupHeight                   : (id: string) => this.getRowNodeById(id).getHeight()\n\t\t}\n\t}\n \n\n\tfetchRowDefinition(index: number, groupkeys: IGroupKeys, data : IJson = null, isRowLoading = false, pinPosition: rowPinPositions = this.rowPinPosition): IRowDefinition {\n\t\tconst rowDefinitionParams: IRowDefinitionFetchParams = {\n\t\t\trowIndex          : index,\n\t\t\trowPinnedPosition : pinPosition,\n\t\t\tparentKeys        : groupkeys,\n\t\t\tpageNumber        : 0,\n\t\t\tsortModel         : this.sortHandler.getSortModel() ?? null,\n\t\t\tfilterModel       : this.filterHandler.getFilterModel() ?? null,\n\t\t\trowGroupingModel  : this.rowGroupingHandler?.getRowGroupingModel() ?? null,\n\t\t\tdata,\n\t\t\tisRowLoading\n\t\t};\n\t\treturn this.definitionFetcher(rowDefinitionParams);\n\t}\n\n\t//axis related APIs\n\n\tshowRow(index: number): void {\n\t\treturn this.rowAxis.showRow(index);\n\t}\n\n\thideRow(index: number): void {\n\t\treturn this.rowAxis.hideRow(index);\n\t}\n\n\tisRowHidden(index: number): boolean {\n\t\treturn this.rowAxis.isRowHidden(index);\n\t}\n\n\tgetDisplayIndexByPosition(top: number, left?: number): number {\n        return this.rowAxis.getDisplayIndexByPosition(top, left);\n    }\n\n\tgetRowNodeHelper(): IRowNodeHelper {\n\t\treturn this.rowNodeHelper;\n\t}\n\n\tgetAllRowNodes(): IRowNodeCore[] {\n\t\treturn this.idsOrder.map(id => this.getRowNodeById(id));\n\t}\n\t\n\tmoveRows(sourceIndexMetas : IRowBlockRowDeleteMeta[], targetIndexMeta : IRowBlockRowDeleteMeta, movePosition : MovePosition ): void {\n\t\tlet   currentTargetIndex = this.getAbsoluteIndex(targetIndexMeta.rowIndex, targetIndexMeta.parentKeys);\n\t\tconst targetRowNode      = this.getRowNode(currentTargetIndex);\n\t\tlet   rowNodes           = [];\n\t\tlet   heights            = [];\n\n\t\tsourceIndexMetas.forEach(({rowIndex, parentKeys})=>{\t//calculating currentTargetIndex;\n\t\t\tconst absoluteIndex = this.getAbsoluteIndex(rowIndex, parentKeys);\n\t\t\tconst node   = this.getRowNode(absoluteIndex);\n\t\t\tconst height = node.getHeight();\n\t\t\tabsoluteIndex < currentTargetIndex && currentTargetIndex--;\n\t\t\trowNodes.unshift(node);\n\t\t\theights.unshift(height);\n\t\t});\n\t\tthis.removeRows(sourceIndexMetas);\n\t\tcurrentTargetIndex = Math.min(currentTargetIndex, this.getRowCount()-1);\n\t\t// sourceIndexex.forEach(index=>this.removeRows([{index}]));\n\n\t\tconst insertIndex = movePosition === 'after' ? currentTargetIndex + 1  : currentTargetIndex;\n\t\tthis.isRowGroupingApplied() && this.rowGroupingHandler?.moveRows(rowNodes, targetRowNode);\n\t\trowNodes.forEach((rowNode : IGroupedRowNodeCore, index) => {//inserting rowNodes\n\t\t\tconst height = heights[index];\n\t\t\tthis.addRowNodeEntry(insertIndex, rowNode, height, insertIndex);\n\t\t});\n\t}\n\n\tremoveRows(rowDelteMetas : IRowBlockRowDeleteMeta[]): void {\n\t\tconst absoluteRows = rowDelteMetas.map(({rowIndex, parentKeys})=>{\n\t\t\treturn this.getAbsoluteIndex(rowIndex, parentKeys);\n\t\t}).sort((a, b)=>a-b);\n\n\t\tconst lastIndex = absoluteRows.length-1;\n\t\tfor(let i = lastIndex; i >= 0; i--){\t//no need to maintain currentIndex since iterating reverse\n\t\t\tconst rowIndex = absoluteRows[i];\n\t\t\tthis.deleteAbsoluteRow(rowIndex);\n\t\t}\n\t}\n \n\tinsertRowsAtIndexes(rowInsertMetas: IRowBlockRowInsertMeta[], insertPosition ?: MovePosition): void {\n\t\tconst insertPositionAdder = insertPosition === 'after' ? 1 : 0;\n\t\tlet   relativeInsertCount = 0;\n\t\tconst absoluteInsertMetas = rowInsertMetas.map(meta => {\n            const { rowIndex, parentKeys } = meta;\n            return {\n\t\t\t\trowData      : meta.rowData,\n\t\t\t\tparentKeys   : meta.parentKeys,\n\t\t\t\trowDefinition: meta.rowDefinition,\n\t\t\t\tcount        : meta.count,\n\t\t\t\tabsoluteIndex: this.getAbsoluteIndex(rowIndex + insertPositionAdder, parentKeys),\n\t\t\t\trowIndex     : rowIndex + insertPositionAdder\n            };\n        })\n        .sort((a, b) => a.absoluteIndex - b.absoluteIndex);\n\n\t\tconst lastIndex = absoluteInsertMetas.length-1;\n\t\tfor(let i = 0; i <= lastIndex; i++){\t//no need to maintain currentIndex since iterating reverse\n\t\t\tconst currentMeta = absoluteInsertMetas[i];\n\t\t\tconst {rowIndex, parentKeys, rowData = [], rowDefinition = [], absoluteIndex} = currentMeta;\n\t\t\tconst count = currentMeta.count ?? 1;\n\n\t\t\tfor(let loopIndex = 0; loopIndex < count; loopIndex++){\n\t\t\t\tconst data                            = rowData?.[loopIndex] ?? {};\n\t\t\t\tconst insertRowDefinition             = rowDefinition?.[loopIndex] ?? this.fetchRowDefinition(rowIndex + relativeInsertCount, parentKeys, data) as any;\n\t\t\t\t      insertRowDefinition.pinPosition = this.rowPinPosition;\n\t\t\t\tconst id                              = this.generateRowId(absoluteIndex + loopIndex + relativeInsertCount, insertRowDefinition);\n\t\t\t\tconst rowNode                         = this.createRowNode(id, data, insertRowDefinition, true, parentKeys);\n\t\t\t\t\n\t\t\t\tthis.insertRowNode(rowIndex + relativeInsertCount, parentKeys, rowNode, rowIndex);\n\t\t\t\t// const parentId = this.rowGroupingHandler?.encode(parentKeys);\n\t\t\t\tconst parentId = parentKeys.length == 0 ? this.getRootId() : parentKeys[parentKeys.length - 1];\n\t\t\t\tif(this.isFullStructuredModel){\n\t\t\t\t\tconst parentNode = this.getRowNodeById(parentId) as IGroupedRowNodeCore;\n\t\t\t\t\tconst directChildren = parentNode.getDirectChildren();\n\t\t\t\t\tdirectChildren?.splice(rowIndex + relativeInsertCount, 0, rowNode);\n\t\t\t\t\tparentNode.setDirectChildrenCount(directChildren.length);\n\t\t\t\t\trowNode.setParentId(parentId);\n\t\t\t\t}\n\t\t\t\trelativeInsertCount++;\n\t\t\t}\n\t\t}\n\t}\n\n\tcreateRowNode(id: string, data : IJson, definition: IRowDefinition, isLoaded: boolean = true, parentKeys : string[] = []): any {\n\t\tconst RowNodeClass  = this.classRegistry.getRowNode();\n\t\tconst parentNode    = this.getParentNode(parentKeys);\n\t\tconst parentId      = parentNode ? parentNode.getId() : this.getRootId();\n\t\tconst rowDefinition = {\n\t\t\tpinPosition      : this.rowPinPosition,\n\t\t\t...definition\n\t\t}\n\t\tconst rowNode      = new RowNodeClass( this.rowNodeHelper, id, rowDefinition,  data );\n\t\trowNode.setParentId(parentId);\n\t\trowNode.updateLoaded(isLoaded);\n\t\treturn rowNode;\n\t}\n\n\tinsertRowNode( index: number, groupkeys: IGroupKeys, rowNode: IRowNodeCore, relativeRowIndex : number): void {\n\t\tlet absoluteIndex;\n\t\tconst parentId                  = groupkeys.length == 0 ? this.getRootId() : groupkeys[groupkeys.length - 1];\n\t\tconst parentNode                = parentId         == this.getRootId() ? this.getRootNode() : this.getRowNodeById(parentId) as IGroupedRowNodeCore;\n\t\tconst parentDirectChildrenCount = parentNode.getDirectChildrenCount();\n\t\tif(parentDirectChildrenCount <= index && parentDirectChildrenCount > 0){\n\t\t\tabsoluteIndex = parentNode.getAllChildren()[parentNode.getAllChildren().length - 1].getIndex() + 1;\n\t\t}\n\t\telse{\n\t\t\tabsoluteIndex = this.getAbsoluteIndex(index, groupkeys);\n\t\t}\n\t\tconst height        = this.fetchHeight(index, rowNode);\n\n\t\tthis.addRowNodeEntry(absoluteIndex, rowNode, height, relativeRowIndex);\n\t}\n\n\taddRowNodeEntry(absoluteIndex : number, rowNode: IRowNodeCore, height : number, relativeIndex : number): void {\n\t\tconst id = rowNode.getId();\n\t\tthis.idsOrder.splice(absoluteIndex, 0, id);\n\t\tthis.rowNodeHolder.set(id, rowNode);\n\t\tthis.rowAxis.insertRow(absoluteIndex, height);\n\t\tif (this.initialIdsOrder){\n\t\t\tthis.initialIdsOrder.push(rowNode.getId());\n\t\t\trowNode.setTempHeight(height);\n\t\t}\n\n\t\tif(this.isGroupingApplied()){\n\t\t\tconst parentNode     = rowNode.getParentNode();\n\t\t\tconst directChildren = parentNode.getDirectChildren();\n\t\t\tdirectChildren?.splice(relativeIndex, 0, rowNode);\n\t\t\tparentNode.setDirectChildrenCount(directChildren.length);\n\t\t}\n\t}\n\n\tfetchHeight(rowIndex : number, rowNode : IRowNodeCore): number {\n\t\tconst heightFetchParam = {\n\t\t\trowIndex,\n\t\t\trowPinPosition : rowNode.getPinnedPosition(),\n\t\t\tparentKeys     : rowNode.getGroupKeys?.() ?? [],\n\t\t};\n\t\treturn this.heightFetcher(heightFetchParam);\n\t}\n\n\t// getAbsoluteIndex(index: number, groupkeys: IGroupKeys): number {\n\t// \treturn this.isGroupingApplied() || this.isFullStructuredModel ? this.rowGroupingHandler?.getAbsoluteIndex(index, groupkeys) : index;\n\t// }\n\n\tspliceRange(absoluteIndex : number, count: number, rowNodeArr: IRowNodeCore[]): void {\n\t\tconst isGroupingApplied = this.isGroupingApplied();\n\t\tif(isGroupingApplied){\n\t\t\tthis.rowGroupingHandler?.spliceRange(absoluteIndex, count, rowNodeArr);\n\t\t}\n\t\telse{\n\t\t\tthis.idsOrder.splice(absoluteIndex, count);\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tthis.rowAxis.deleteRow(absoluteIndex);\n\t\t\t}\n\t\t\t\n\t\t\tconst ids = [];\n\t\t\tfor(let i = 0; i < rowNodeArr.length; i++){\n\t\t\t\tconst rowNode = rowNodeArr[i];\n\t\t\t\tconst id = rowNode.getId();\n\t\t\t\tids.push(id);\n\t\t\t\tthis.rowAxis.insertRow(absoluteIndex, rowNode.getTempHeight());\n\t\t\t}\n\t\t\tthis.idsOrder.splice(absoluteIndex, 0, ...ids);\n\t\t}\n\t}\n\n\t//Deletion\n\tdeleteAbsoluteRow(index: number): void {\n\t\tconst id = this.getIdByIndex(index);\n\n\t\tif(!this.isGroupingApplied() || !this.isFullStructuredModel){\n\t\t\t// const rowNode        = this.getRowNodeById(id);\n\t\t\t// const parentNode     = rowNode.getParentNode();\n\t\t\t// const directChildren = parentNode.getDirectChildren();\n\t\t\t// directChildren?.splice(index, 1);\n\t\t\tthis.rowGroupingHandler?.deleteRowById(id);\n\t\t}\n\n\t\tthis.rowGroupingHandler?.deleteRowById(id);\n\t\tthis.rowAxis.deleteRow(index);\n\t\tthis.rowNodeHolder.delete(id);\n\t\tthis.idsOrder.splice(index, 1);\n\n\t\tif(this.initialIdsOrder){\n\t\t\tconst filteredIdIndex = this.initialIdsOrder.indexOf(id);\n\t\t\t(filteredIdIndex > -1) && this.initialIdsOrder.splice(filteredIdIndex, 1);\n\t\t}\n\t}\n\n\t//IdsOrder Related APIs\n\tgetIdByIndex(index: number): string {\n\t\tconst findId = (index)=>this.idsOrder[index];\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\t\treturn hasDraftRows ? this.draftRowHandler.getIdByIndex(index, findId) : findId(index);\n\t}\n\n\tgetIdByVisibleIndex(visibleIndex: number): string {\n\t\tconst findId = (index)=>this.idsOrder[index];\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\t\treturn hasDraftRows ? this.draftRowHandler.getIdByVisibleIndex(visibleIndex, findId) : findId(visibleIndex);\n\t} \n\n\tgetIndexById(id: string): number {\n\t\tconst findIndex = (id : string)=>this.idsOrder.indexOf(id);\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\t\treturn hasDraftRows ? this.draftRowHandler.getIndexById(id, findIndex) : findIndex(id);\n\t}\n\n\tsetIdsOrder(idsOrder: string[]): void {\n\t\tthis.idsOrder = idsOrder.slice();\n\t}\n\n\tgetIdsOrder(): string[] {\n\t\treturn this.idsOrder;\n\t}\n\n\t//RowNode Handler Related APIs\n\tgetRowNodeHandler(): any {\n\t\treturn this.rowNodeHolder;\n\t}\n\n\tgetRowNodeByVisibleIndex(index: number): any {\n\t\tif (index > -1) {\n\t\t\tconst id = this.getIdByVisibleIndex(index);\n\t\t\treturn this.rowNodeHolder.get(id);\n\t\t}\n\t}\n\n\t//Getter Setter for Initial Order\n\tsetInitialIdsOrder(idsOrder: string[]): void {\n\t\tif(idsOrder == null){\n\t\t\tconst isSortApplied     = this.isSortApplied();\n\t\t\tconst isFilterApplied   = this.isFilterApplied();\n\t\t\tconst isGroupingApplied = this.isGroupingApplied();\n\t\t\tif(!(isSortApplied || isFilterApplied || isGroupingApplied)){\n\t\t\t\tthis.initialIdsOrder = null\n\t\t\t}\n\t\t} \n\t\telse if(this.initialIdsOrder == null){\n\t\t\tthis.initialIdsOrder = idsOrder.slice();\n\t\t}\n\t}\n\n\tgetInitialIdsOrder(): string[] {\n\t\treturn this.initialIdsOrder;\n\t}\n \n\t//sort\n\tapplySort(sortModel: ISortModel[]): void {\n\t\tif(this.sortHandler){\n\t\t\tthis.sortHandler?.setSortModel(sortModel);\n\t\t\tif(this.isGroupingApplied()){\n\t\t\t\tthis.rowGroupingHandler?.applySort(sortModel);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tthis.setInitialIdsOrder(this.idsOrder);\n\t\t\t\tconst firstIndex = this.getFirstRow();\n\t\t\t\tconst endIndex   = this.getLastRow();\n\t\t\t\tthis.sortHandler?.applySortRange(firstIndex, endIndex, sortModel);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetSortHandler(): ISortHandler {\n\t\treturn this.sortHandler;\n\t}\n\n\tisSortApplied(): boolean {\n\t\treturn this.sortHandler?.isSortApplied();\n\t}\n\n\tresetSort(): void {\n\t\tif(this.sortHandler){\n\t\t\tconst isSortApplied = this.isSortApplied();\n\t\t\tif(isSortApplied){\n\t\t\t\tif(this.isGroupingApplied()){\n\t\t\t\t\tthis.rowGroupingHandler?.resetSort();\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tconst firstIndex = this.getFirstRow();\n\t\t\t\t\tconst endIndex   = this.getLastRow();\n\t\t\t\t\tthis.sortHandler.reset(firstIndex, endIndex, this.initialIdsOrder);\n\t\t\t\t}\n\t\t\t\tthis.sortHandler.setSortModel(null);\n\t\t\t\tthis.setInitialIdsOrder(null);\n\t\t\t}\n\t\t}\n\t}\n\n\t//filter\n\tapplyFilter(filterModel: IFilterModel): void {\n\t\tif(this.filterHandler){\n\t\t\tthis.filterHandler.setFilterModel(filterModel);\n\t\t\tif(this.isGroupingApplied()){\n\t\t\t\tthis.rowGroupingHandler?.applyFilter(filterModel);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tthis.setInitialIdsOrder(this.idsOrder);\n\t\t\t\tconst firstIndex = this.getFirstRow();\n\t\t\t\tconst endIndex   = this.getLastRow();\n\t\t\t\tthis.filterHandler.applyFilterRange(firstIndex, endIndex, filterModel);\n\t\t\t}\n\t\t}\n\t}\n\n\tisFilterApplied(): boolean {\n\t\treturn this.filterHandler?.isFilterApplied();\n\t}\n\n\tresetFilter(): void {\n\t\tif(this.filterHandler){\n\t\t\tconst isFilterApplied = this.isFilterApplied();\n\t\t\tif(isFilterApplied){\n\t\t\t\tif(this.isGroupingApplied()){\n\t\t\t\t\tthis.rowGroupingHandler?.resetFilter();\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tconst firstIndex = this.getFirstRow();\n\t\t\t\t\tconst endIndex   = this.getLastRow();\n\t\t\t\t\tthis.filterHandler.reset(firstIndex, endIndex, this.initialIdsOrder);\n\t\t\t\t}\n\t\t\t\tthis.filterHandler.setFilterModel(null);\n\t\t\t\tthis.setInitialIdsOrder(null);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetFilterHandler(): IFilterHandler {\n\t\treturn this.filterHandler;\n\t}\n\n\t//RowGrouping\n\tapplyGroupBy(groupKeysWithOrder: IGroupModel[]): void {\n\t\tif(this.rowGroupingHandler){\n\t\t\tconst sortModel   = this.sortHandler?.getSortModel();\n\t\t\tconst filterModel = this.filterHandler?.getFilterModel();\n\t\t\tthis.resetSort();\n\t\t\tthis.resetFilter();\n\t\t\tthis.setInitialIdsOrder(this.idsOrder);\n\t\t\tthis.rowGroupingHandler?.applyGroupBy(groupKeysWithOrder);\n\t\t\tsortModel && this.applySort(sortModel);\n\t\t\tfilterModel && this.applyFilter(filterModel);\n\t\t}\n\t}\n\n\tisGroupingApplied(): boolean {\n\t\treturn this.getGroupModel().length > 0;\n\t}\n\n\tgetGroupModel(): IGroupModel[] {\n\t\treturn this.rowGroupingHandler?.getGroupModel() ?? [];\n\t}\n\n\tgetRowGroupingHandler(): IRowGroupingHandler {\n\t\treturn this.rowGroupingHandler;\n\t}\n\n\tresetRowGrouping(): void {\n\t\tthis.rowGroupingHandler?.resetRowGrouping();\n\t}\n\n\tgetParentNode(parentKeys) : IGroupedRowNodeCore {\n\t\tif(this.isGroupingApplied()){\n\t\t\treturn this.rowGroupingHandler?.getParentNode(parentKeys);\n\t\t}\n\t\treturn null;\n\t} \n\n\tgetAncestorNode(parentKeys) : IGroupedRowNodeCore[] {\n\t\tif(this.isGroupingApplied()){\n\t\t\treturn this.rowGroupingHandler?.getAncestorNode(parentKeys);\n\t\t}\n\t\treturn null;\n\t}\n\n\tisInStaticCache(index: number): boolean {\n\t\tconst hasIdInCahe = ()=>{\n\t\t\tconst id = this.getIdByIndex(index);\n\t\t\treturn this.staticIds.includes(id);\n\t\t}\n\t\treturn super.isInStaticCache(index) || hasIdInCahe();\n\t}\n\n\taddStaticRowById(id: string): void {\n\t\tthis.staticIds.push(id);\n\t}\n\n\tremoveStaticRowById(id: string): void {\n\t\tconst index = this.staticIds.indexOf(id);\n\t\tif (index != -1) {\n\t\t\tthis.staticIds.splice(index, 1);\n\t\t}\n\t}\n\n\tgetStaticCacheIndexes(ignoreHidden?: boolean): number[] {\n\t\tconst staticIndexes = super.getStaticCacheIndexes();\n\t\treturn ignoreHidden ? staticIndexes.filter(index=> !this.isRowHidden(index)) : staticIndexes;\n\t}\n\n\tgetRowsInDataCache(): number[] {\n\t\treturn Array.from({length: this.getRowCount()}, (_, i) => i);\n\t}\n\n\t//Draft Row Related APIs\n\n\tisDraftRow(rowId: string): boolean {\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\t\treturn hasDraftRows ? this.draftRowHandler.isDraftRow(rowId) : false;\n\t}\n\n    parseFromDraftIndex(draftIndex: number): IRowMeta {\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\t\treturn hasDraftRows ? this.draftRowHandler.parseFromDraftIndex(draftIndex) : null;\n    }\n\n    parseToDraftIndex(index: number, pinPosition: rowPinPositions = this.rowPinPosition): number {\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\t\treturn hasDraftRows ? this.draftRowHandler.parseToDraftIndex(index, pinPosition) : index;\n    }\n\n    insertDraftRows(): void {\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\t\tif (hasDraftRows) {\n\t\t\tthis.draftRowHandler.insertDraftRows('topDraftRow', this.optionsHandler.getTopDraftRowCount());\n\t\t\tthis.draftRowHandler.insertDraftRows('bottomDraftRow', this.optionsHandler.getBottomDraftRowCount());\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype: 'RECORD_INSERT',\n\t\t\t\trecycleRows: true\n\t\t\t});\n\t\t}\n    }\n\n\tinsertRowsAtBlock(rowInsertMeta : IBlockInsertMeta, rowIndex : number, parentKeys : IGroupKeys, insertPosition : MovePosition) : void {\n\t\tif(this.isGroupingApplied() || this.isFullStructuredModel){\n\t\t\tthis.rowGroupingHandler?.insertRowsAtBlock(rowInsertMeta, rowIndex, parentKeys, insertPosition);\n\t\t}\n\t}\n\n    removeDraftRows(rowIDs: string[]): void {\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\t\tif (hasDraftRows) {\n\t\t\tthis.draftRowHandler.removeDraftRows(rowIDs);\n\t\t}\n    }\n\n\tgetAbsoluteIndex(index: number, parentKeys?: IGroupKeys, pinPosition ?: rowPinPositions): number {\n        if(pinPosition == 'topDraftRow' || pinPosition == 'bottomDraftRow'){\n            return this.parseToDraftIndex(index, pinPosition);\n        }\n\t\treturn this.isGroupingApplied() || this.isFullStructuredModel ? this.rowGroupingHandler?.getAbsoluteIndex(index, parentKeys) : index;\n    }\n\n\tgetLastRow(_parentId?: string, includeDraftRows?: boolean): number {\n\t\tconst lastRow = this.getRowCount() - 1;\n\t\tif(!includeDraftRows){\n\t\t\tconst bottomDraftRows = this.draftRowHandler.getBottomDraftRows();\n\t\t\treturn lastRow - bottomDraftRows.length;\n\t\t}\n\t\treturn lastRow;\n\t}\n\n\tgetFirstRow(includeDraftRows?: boolean): number {\n\t\tif(!includeDraftRows){\n\t\t\tconst topDraftRows = this.draftRowHandler.getTopDraftRows();\n\t\t\treturn topDraftRows.length;\n\t\t}\n\t\treturn 0;\n\t}\n\n\trefreshDraftRows() : void {\n\t\tconst draftRowIds = [...this.draftRowHandler.getTopDraftRows(), ...this.draftRowHandler.getBottomDraftRows()];\n\n        draftRowIds.forEach(rowId=>{\n\t\t\tconst rowNode    = this.rowNodeHolder.get(rowId);\n\t\t\tconst rowMeta    = rowNode.getRowMeta();\n\t\t\tconst definition = this.fetchRowDefinition(rowMeta.rowIndex, rowMeta.parentKeys, {}, false, rowMeta.pinPosition) as IDraftRowDefinition;\n\t\t\tconst draftData  = definition?.draftData ?? {};\n            rowNode.updateDefinition(definition);\n            rowNode.updateRowData(draftData);\n        });\n    }\n}\n\nexport {\n    ClientBlockHandler,\n}","import { rowPinPositions } from \"../../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IRowDefinition } from \"../../Grid/Core/Interface/IRowDefinitions\";\nimport { IRowMeta } from \"../../Grid/API/CommonAPIInterface\";\nimport { IDraftPosition } from \"../rowblock-handler.types\";\nimport { IRowAxisCore } from \"../RowAxis/rowAxis.types\";\nimport { IRowNodeCore } from \"../rownode.types\";\nimport { IRowNodeHolder } from \"../rowNodeHolder.types\";\nimport { DraftRowUtility } from \"../DraftRowUtility\";\nimport { IJson } from \"../../Grid/Main\";\nimport { GRID_CLASS_NAMES } from \"../../Grid/Core/Constants/CSSClassNameContants\";\n\nexport interface IDraftRowHandlerDependencies {\n    rowAxis            : IRowAxisCore;\n    getRowNodeHolder   : ()=>IRowNodeHolder;\n    rowPinPosition     : rowPinPositions;\n    getRowCount        : () => number;\n    fetchRowDefinition : (index: number, groupkeys: string[], data?: IJson, isRowLoading?: boolean, pinPosition?: rowPinPositions) => IRowDefinition;\n    generateRowId      : (index: number, definition?: IRowDefinition) => string;\n    createRowNode      : (id: string, data: IJson, definition: IRowDefinition, isLoaded?: boolean, parentKeys?: string[]) => IRowNodeCore;\n    fetchHeight        : (rowIndex: number, rowNode: IRowNodeCore) => number;\n}\n\nexport class DraftRowHandler {\n    private topDraftRows: string[] = [];\n    private bottomDraftRows: string[] = [];\n    private dependencies: IDraftRowHandlerDependencies;\n\n    constructor(dependencies: IDraftRowHandlerDependencies) {\n        this.dependencies = dependencies;\n    }\n\n    getTopDraftRows(): string[] {\n        return this.topDraftRows;\n    }\n\n    getBottomDraftRows(): string[] {\n        return this.bottomDraftRows;\n    }\n\n    isDraftRow(rowId: string): boolean {\n        return DraftRowUtility.isDraftRow(rowId, this.topDraftRows, this.bottomDraftRows);\n    }\n\n    parseFromDraftIndex(draftIndex: number, pinPosition ?: rowPinPositions): IRowMeta {\n        const parentKeys: string[] = [];\n        const rowPinPosition = pinPosition ?? this.dependencies.rowPinPosition;\n        return DraftRowUtility.parseFromDraftIndex(\n            draftIndex,\n            this.dependencies.getRowCount(),\n            parentKeys,\n            rowPinPosition,\n            this.topDraftRows,\n            this.bottomDraftRows\n        );\n    }\n\n    parseToDraftIndex(index: number, pinPosition: rowPinPositions = this.dependencies.rowPinPosition): number {\n        if(index == null) return null;\n        const realRowCount = this.dependencies.getRowCount() - (this.topDraftRows.length + this.bottomDraftRows.length);\n        return DraftRowUtility.parseToDraftIndex(index, pinPosition, realRowCount, this.topDraftRows);\n    }\n\n    insertDraftRows(insertPosition: IDraftPosition, count: number): void {\n        const rowNodeHolder = this.dependencies.getRowNodeHolder();\n        const isTopDraftRow = insertPosition === 'topDraftRow';\n        const draftRowHolder = isTopDraftRow ? this.topDraftRows : this.bottomDraftRows;\n        const rowDefinitionFetcher = (index: number) => {\n            const parentKeys: string[]  = [];\n            const data: IJson           = {};\n            const isRowLoading          = false;\n            const definition            = this.dependencies.fetchRowDefinition(index, parentKeys, data, isRowLoading, insertPosition);\n                  definition.cssClasses = GRID_CLASS_NAMES.GRID_DRAFT_ROW;\n            return definition;\n        };\n\n        const rowBlockHandler = {\n            generateRowId : this.dependencies.generateRowId,\n            createRowNode : this.dependencies.createRowNode,\n            fetchHeight   : this.dependencies.fetchHeight,\n            getRowCount   : this.dependencies.getRowCount\n        };\n\n        const insertMetas = DraftRowUtility.getInsertDraftRowMeta(rowBlockHandler as any, count, insertPosition, rowDefinitionFetcher);\n\n        insertMetas.forEach(({ rowNode, index, height }) => {\n            const parentNode = rowNode.getParentNode();\n            this.dependencies.rowAxis.insertRow(index, height);\n            rowNodeHolder.set(rowNode.getId(), rowNode);\n            parentNode.addDraftRow(rowNode.getId(), insertPosition);\n            draftRowHolder.push(rowNode.getId());\n        });\n\n    }\n\n    /** Clears draft row bookkeeping and holder entries. Safe after rowAxis.resetRows() (no axis deletes). */\n    resetDraftRows(): void {\n        const rowNodeHolder = this.dependencies.getRowNodeHolder();\n        this.topDraftRows.forEach((id) => {\n            rowNodeHolder.delete(id);\n        });\n        this.bottomDraftRows.forEach((id) => {\n            rowNodeHolder.delete(id);\n        });\n        this.topDraftRows.length = 0;\n        this.bottomDraftRows.length = 0;\n    }\n\n    removeDraftRows(rowIDs: string[]): void {\n        const rowNodeHolder = this.dependencies.getRowNodeHolder();\n        rowIDs.forEach((id) => {\n            const rowNode = rowNodeHolder.get(id);\n            if (rowNode) {\n                const parentNode = rowNode.getParentNode();\n                const index = rowNode.getIndex();\n                rowNodeHolder.delete(id);\n                parentNode.removeDraftRow(id);\n                this.dependencies.rowAxis.deleteRow(index);\n\n                // Remove from draft arrays\n                const topIndex = this.topDraftRows.indexOf(id);\n                if (topIndex !== -1) {\n                    this.topDraftRows.splice(topIndex, 1);\n                }\n\n                const bottomIndex = this.bottomDraftRows.indexOf(id);\n                if (bottomIndex !== -1) {\n                    this.bottomDraftRows.splice(bottomIndex, 1);\n                }\n            }\n        });\n    }\n\n    getIdByIndex(index: number, findIdCallback: (index: number) => string): string {\n        const topDraftRowsCount = this.topDraftRows.length;\n        const parentKeys: string[] = [];\n        const id = DraftRowUtility.getIdByIndex(\n            index,\n            this.dependencies.getRowCount(),\n            parentKeys,\n            this.dependencies.rowPinPosition,\n            this.topDraftRows,\n            this.bottomDraftRows\n        );\n        return id ?? findIdCallback(index - topDraftRowsCount);\n    }\n\n    getIdByVisibleIndex(visibleIndex: number, findIdCallback: (index: number) => string): string {\n        const topDraftRowsCount = this.topDraftRows.length;\n        const parentKeys: string[] = [];\n        const id = DraftRowUtility.getIdByIndex(\n            visibleIndex,\n            this.dependencies.getRowCount(),\n            parentKeys,\n            this.dependencies.rowPinPosition,\n            this.topDraftRows,\n            this.bottomDraftRows\n        );\n        return id ?? findIdCallback(visibleIndex - topDraftRowsCount);\n    }\n\n    getIndexById(id: string, findIndexCallback: (id: string) => number): number {\n        const realRowCount = this.dependencies.getRowCount() - (this.topDraftRows.length + this.bottomDraftRows.length);\n        if (id === 'root') return 0;\n        else {\n            const indexInDraftPosition = DraftRowUtility.getIndexById(id, realRowCount, this.topDraftRows, this.bottomDraftRows);\n            if (indexInDraftPosition != null) {\n                return indexInDraftPosition;\n            } else {\n                const index = findIndexCallback(id);\n                return this.parseToDraftIndex(index, this.dependencies.rowPinPosition);\n            }\n        }\n    }\n}\n\n","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { filter } from \"../../../Sub_Components/src/DataProcessor/Filter/Filter\";\nimport { IFilterCondition, IFilterObjectExecutioner } from \"../../../Sub_Components/src/DataProcessor/Filter/interface/IFilterObject\";\nimport { IFilterHandler, IFilterHelper } from \"./filter-handler.types\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { IRowNodeCore } from \"../rownode.types\";\nimport { IFilterModel, IFilterCondition as IFilterModelCondition } from \"../../Grid/Core/Interface/IFilterConfigurations\";\nimport { IClientBlockHandler } from \"./client-rowblock-handler.types\";\n\nclass FilterHandler implements IFilterHandler {\n    private handlerHelper   : IFilterHelper;\n    private filterModel     : IFilterModel | null;\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName;\n\n    constructor(handler : IClientBlockHandler) {\n        this.createHelper(handler);\n        this.filterModel = null;\n    }\n\n    private createHelper(handler : IClientBlockHandler) : void {\n        this.handlerHelper = {\n\t\t\tgetIdsOrder        : () => handler.getIdsOrder(),\n\t\t\tsetIdsOrder        : (idsOrder: string[]) => handler.setIdsOrder(idsOrder),\n\t\t\tsetInitialIdsOrder : (idsOrder: string[]) => handler.setInitialIdsOrder(idsOrder),\n\t\t\tgetInitialIdsOrder : () => handler.getInitialIdsOrder(),\n\t\t\tspliceRange        : (absoluteIndex, count, rowNodeArr) => handler.spliceRange(absoluteIndex, count, rowNodeArr),\n\t\t\tgetRowNode         : (index: number) => handler.getRowNode(index),\n\t\t\tgetRowNodeById     : (id: string) => handler.getRowNodeById(id),\n\t\t\tgetHeight          : (absoluteIndex, ignoreRowHeight) => handler.getHeight(absoluteIndex, ignoreRowHeight),\n        }\n    }\n\n    private getConditionFromFilterModel({columnId, condition, value} : IFilterModelCondition): IFilterCondition {\n        const columnHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        const columnNode = columnHandler.getColumnNodeByID(columnId);\n        let [filter, filterTo] = [null, null];\n\n        if (typeof value === 'string') {\n            filter = value\n        }\n        else if (Array.isArray(value)) {\n            [filter, filterTo] = value\n        }\n        else {\n            filter = value.from;\n            filterTo = value.to\n        }\n        return {\n            key       : columnNode.getColumnKey(),\n            condition : condition,\n            filter,\n            filterTo,\n            ignoreNull   : true,\n            ignoreCase   : true,\n            ignoreAccent : true,\n        };\n    }\n\n    private parseFilterModel({filterGroup, defaultOperator : globalOperator, operator} : IFilterModel): IFilterObjectExecutioner {\n        const conditions : IFilterCondition[] = [];\n        if (Array.isArray(filterGroup)) {\n            filterGroup.forEach((filterCondition) => {\n                conditions.push(this.getConditionFromFilterModel(filterCondition));\n            })\n        }\n        else {\n            conditions.push(this.getConditionFromFilterModel(filterGroup as IFilterModelCondition));\n        }\n\n        return { globalOperator, operator, conditions };\n    }\n\n    applyFilterRange(startIndex : number, endIndex : number, filterModel: IFilterModel): IRowNodeCore[] {\n        const rowNodes = [];\n        for(let i = startIndex; i <= endIndex; i++){ //setting tempHeight\n            const node = this.handlerHelper.getRowNode(i);\n            const height = node.getHeight();\n            node.setTempHeight(height);\n            rowNodes.push(node);\n        }\n        \n        const filterObject = this.parseFilterModel(filterModel);\n        const filteredRownodes = filter(filterObject, rowNodes);\n        \n        this.handlerHelper.spliceRange(startIndex, (endIndex - startIndex) + 1, filteredRownodes);\n        return filteredRownodes;\n    }\n\n    setFilterModel( filterModel : IFilterModel = null): void {\n        this.filterModel = filterModel;\n    }\n    isFilterApplied(): boolean {\n        return this.filterModel != null;\n    }\n\n    reset(startIndex : number, endIndex : number, initialIdsOrder: string[]) : void {\n        const rowNodes = initialIdsOrder.map(id => this.handlerHelper.getRowNodeById(id));\n\n        this.handlerHelper.spliceRange(startIndex, (endIndex - startIndex) + 1, rowNodes);\n    }\n\n    getFilterModel(): any {\n        return this.filterModel;\n    }\n}\n\nexport {\n    FilterHandler\n}","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { IRowDefinition } from \"../../Grid/Core/Interface/IRowDefinitions\";\nimport { IGroupKeys, IGroupModel } from \"../../Grid/Core/Interface/IRowGroupingConfigurations\";\nimport { IJson, IRowNode, MovePosition } from \"../../Grid/Main\";\nimport { IRowGroupingHandler, IRowGroupingHelper } from \"./rowgrouping-handler.types\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { IGroupedRowNodeCore } from \"../group-rownode.types\";\nimport { IGroupedRowAxis } from \"../RowAxis/grouped-rowAxis.types\";\nimport { IRowNodeCore } from \"../rownode.types\";\nimport { ISortModel } from \"../../Grid/Core/Interface/ISortConfigurations\";\nimport { groupBy } from \"../../../Sub_Components/src/DataProcessor/GroupBy/GroupBy\";\nimport { IGroupedRowNodeHelper } from \"../IGroupedRowNode\";\nimport { IFilterModel } from \"../../Grid/Core/Interface/IFilterConfigurations\";\nimport { IClientBlockHandler } from \"./client-rowblock-handler.types\";\nimport { Events } from \"../../Grid/Core/Constants/Events\";\nimport { IGridBeanClassRegistry } from \"../../Grid/Core/grid-beanclass-registry.types\";\nimport { IRowMeta } from \"../../Grid/API/CommonAPIInterface\";\nimport { rowPinPositions } from \"../../Grid/Core/Constants/GridConfigurationConstants\";\nimport { v1 as uuid1 } from \"uuid\";\nimport { IBlockInsertMeta } from \"DataStore/rowblock-handler.types\";\n\nclass RowGroupingHandler implements IRowGroupingHandler {\n    private handlerHelper : IRowGroupingHelper;\n    private groupModel    : IGroupModel[];\n    private rowNodeHelper : IGroupedRowNodeHelper;\n\n\n    static delimiter = \"_-DELIM-123-_\".repeat(3);\n    // static rootId = \"root\";\n\n    @AutoWired(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY) private classRegistry : IGridBeanClassRegistry;\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName;\n\n    constructor(handler : IClientBlockHandler) {\n        this.createHelper(handler);\n        this.groupModel = [];\n    }\n\n    setUpFullTreeRowNodes(datas: IJson[], parentNode: IGroupedRowNodeCore, insertIndex: number = 0) : IRowNodeCore[]{\n        let rowNodes = [];\n        datas.forEach((data, loopIndex) => {\n            const parentKeys    = parentNode.getGroupValues();\n            const rowNodeHolder = this.handlerHelper.getRowNodeHolder();\n            const isLeaf = !data.children;\n            const rowDefinition = this.handlerHelper.getRowDefinition(loopIndex, parentKeys, data);\n            const height        = this.handlerHelper.fetchHeight(loopIndex, parentNode);\n            // let rowId         = (isLeaf && rowDefinition.rowId) ? rowDefinition.rowId : this.encode([...parentKeys, data.taskName]);\n            const randomId = `Row ${uuid1()}`;\n            let   rowId    = rowDefinition.rowId ?? randomId;\n            if(!isLeaf){\n                rowDefinition.expand = data.expanded;\n            }\n            const rowNode       = isLeaf ? this.handlerHelper.createRow(rowId, data, rowDefinition) : this.createRowNode(rowId, parentNode.getId(), data, rowDefinition);\n            rowNode.setTempHeight(height);\n            const groupMeta = parentNode.getGroupMeta().slice();\n            // groupMeta.push({[data.taskName] : data.taskName});\n            groupMeta.push({ branchKey : rowId});\n            rowNode.setGroupMeta(groupMeta);\n            rowNode.setParentId(parentNode.getId());\n            rowNode.updateLevel(parentNode.getLevel() + 1);\n            rowNodeHolder.set(rowId, rowNode);\n            rowNodes.push(rowNode);\n\n            const directChildren = parentNode.getDirectChildren() ?? [];\n            directChildren.splice(insertIndex + loopIndex, 0, rowNode);\n            parentNode.setDirectChildren(directChildren);\n            if(!isLeaf){\n                this.setUpFullTreeRowNodes(data.children, rowNode);\n            }\n        });\n        return rowNodes;\n    }\n\n    insertRowsAtBlock(rowInsertMeta : IBlockInsertMeta, rowIndex : number, parentKeys : IGroupKeys, insertPosition : MovePosition) : void {\n        const {fullTreeStructure} = rowInsertMeta;\n        const insertIndex = insertPosition === 'after' ? rowIndex + 1 : rowIndex;\n        const parentId = parentKeys.length == 0 ? this.handlerHelper.getRootId() : parentKeys[parentKeys.length - 1];\n        const parentNode = parentId == this.handlerHelper.getRootId() ? this.getRoot() : this.handlerHelper.getRowNodeById(parentId) as IGroupedRowNodeCore;\n        let absoluteIndex;\n        if(insertIndex >= parentNode.getDirectChildrenCount()){\n            const allChildren = parentNode.getAllChildren();\n            absoluteIndex = allChildren[allChildren.length - 1].getIndex() + 1;\n        }\n        else{\n            absoluteIndex = this.getAbsoluteIndex(rowIndex, parentKeys);\n        }\n        const rowNodes = this.setUpFullTreeRowNodes(fullTreeStructure, parentNode, insertIndex);\n        const allRowNodes = [];\n        rowNodes.forEach((rowNode) => {\n            const internalRowNodes = rowNode.getAllChildren();\n            allRowNodes.push(rowNode, ...internalRowNodes);\n        });\n        this.spliceRange(absoluteIndex, 0, allRowNodes);\n    }\n\n    constructFullTree(datas: IJson[]): void {\n        const rootNode = this.getRoot();\n        this.setUpFullTreeRowNodes(datas, rootNode);\n        this.spliceRange(0, 0, rootNode.getAllChildren());\n    }\n\n    private constructBlockAxis(groupRowNode : IGroupedRowNodeCore){\n        if(groupRowNode.isGroupRow?.()){\n            const childrens     = groupRowNode.getDirectChildren();\n            const firstSubChild = childrens[0] as IGroupedRowNodeCore;\n            const rowAxis       = this.handlerHelper.getRowAxis();\n            const isNested      = firstSubChild ? firstSubChild.isGroupRow?.() : false;\n            if(isNested){\n                childrens.forEach((child)=>{\n                    const count = 1;\n                    const blockAxis = rowAxis.createBlock({count, minHeight : 50, minWidth : innerWidth, maxWidth : innerWidth});\n                    rowAxis.appendBlock(blockAxis);\n                    this.constructBlockAxis(child as IGroupedRowNodeCore);\n                })\n            }\n            else{\n                const count = childrens.length;\n                const blockAxis = rowAxis.createBlock({count});\n                rowAxis.appendBlock(blockAxis);\n            } \n        }\n    }\n\n    private createHelper(handler : IClientBlockHandler) : void {\n        this.handlerHelper = {\n            getRowAxis         : ()=> handler.getRowAxis() as IGroupedRowAxis,\n            getRowNodeHelper   : () => handler.getRowNodeHelper(),\n            getRowNodeHolder  : () => handler.getRowNodeHolder(),\n            getIdsOrder        : () => handler.getIdsOrder(),\n            deleteAbsoluteRow  : (index: number) => handler.deleteAbsoluteRow(index),\n            getRowNode         : (index: number) => handler.getRowNode(index),\n            getSortHandler     : () => handler.getSortHandler(),\n            getFilterHandler   : () => handler.getFilterHandler(),\n            getRowDefinition   : (index: number, groupkeys : IGroupKeys, data ?: IJson, isRowLoading ?: boolean) => handler.fetchRowDefinition(index, groupkeys, data, isRowLoading),\n            fetchHeight        : (index: number, rowNode: IRowNodeCore) => handler.fetchHeight(index, rowNode),\n            insertRowNode      : (index, groupkeys, rownode) => handler.insertRowNode(index, groupkeys, rownode),\n            getInitialIdsOrder : () => handler.getInitialIdsOrder(),\n            setInitialIdsOrder : (idsOrder: string[]) => handler.setInitialIdsOrder(idsOrder),\n            setIdsOrder        : (idsOrder: string[]) => handler.setIdsOrder(idsOrder),\n            getRowNodeById     : (id: string) => handler.getRowNodeById(id),\n            createRow          : (id : string, data, definition, isLoaded) => handler.createRowNode(id, data, definition, isLoaded),\n\t\t\tgetHeight \t\t   : (absoluteIndex, ignoreRowHeight) => handler.getHeight(absoluteIndex, ignoreRowHeight),\n            getRootId          : () => handler.getRootId(),\n            getRootNode        : () => handler.getRootNode(),\n            resetRoot          : () => handler.resetRoot(),\n        }\n\n        this.rowNodeHelper = {\n            getRowNodeById     : (id: string) => handler.getRowNodeById(id),\n            getAllRowNodes     : () => handler.getAllRowNodes(),\n            getGroupModel      : () => this.getGroupModel(),\n            show               : (index : number)=>handler.showRow(index),\n            expand             : (groupRowNode : IGroupedRowNodeCore, params ?: {recursive ?: boolean}) => this.expand(groupRowNode, params),\n            collapse           : (groupRowNode : IGroupedRowNodeCore, recursive ?: boolean) => this.collapse(groupRowNode, recursive),\n            getFirstRowInGroup : (id : string) => this.getFirstRowInGroup(id),\n            getLastRowInGroup  : (id : string) => this.getLastRowInGroup(id),\n            getChildIndexById  : (parentId, id: string) => this.getChildIndexById(parentId, id),\n            ...handler.getRowNodeHelper(),\n            getGroupHeight     : (id: string) => this.getGroupHeight(id)\n        }\n    }\n\n    getGroupHeight(id: string): number {\n        const node = this.rowNodeHelper.getRowNodeById(id) as IGroupedRowNodeCore;\n        const allChildren = node.getAllChildren();\n\n        if(allChildren.length === 0) {\n            return node.getHeight();\n        }\n        const endRow  = allChildren.length - 1;\n        const endNode = allChildren[endRow];\n        const startY  = node.getTop();\n        const endY    = endNode.getTop() + endNode.getHeight();\n        return endY - startY;\n    }\n    \n    getFirstRowInGroup(id: string): number {\n        const index = this.rowNodeHelper.getIndexById(id);\n        return index + 1;\n    }\n\n    getLastRowInGroup(id: string): number {\n        let node = this.rowNodeHelper.getRowNodeById(id) as IGroupedRowNodeCore;\n        while( node.isGroupRow?.()){\n            const directChildCount = node.getDirectChildren().length;\n            const lastNode = node.getDirectChildren()[directChildCount-1] as IGroupedRowNodeCore;\n            if(lastNode){\n                node = lastNode;\n            }\n            else{\n                return node.getIndex();\n            }\n\n        }\n        return node.getIndex();\n    }\n\n    insertRowNode(_index: number, _groupKeys: IGroupKeys, _rowNode: IRowNodeCore): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    deleteRowById(id: string): void {   //to remove direct children\n        const node           = this.rowNodeHelper.getRowNodeById(id);\n        const parentId       = node.getParentId();\n        const parentNode     = parentId == 'root' ? this.getRoot() : this.rowNodeHelper.getRowNodeById(parentId) as IGroupedRowNodeCore;\n        const directChildren = node?.getAllChildren() ?? [];\n        const siblings       = parentNode?.getDirectChildren() ?? [];\n\n        const nodeIndex = siblings?.indexOf(node);\n        if(nodeIndex != -1){\n            siblings?.splice(nodeIndex, 1);\n            parentNode?.setDirectChildrenCount(siblings?.length);\n        } \n\n        directChildren.forEach((child) => this.deleteRowById(child.getId()));\n    }\n\n    deleteGroup(level : number): void {\n        const parentNodes = this.getAllParentNodesAtLevel(level);\n        parentNodes.forEach((parentNode) => {\n            const directChildren = parentNode.getDirectChildren();\n            const nextLevelGroupNodes = [];\n            for (let groupIndex = 0; groupIndex < directChildren?.length; groupIndex++) {\n                const node = directChildren[groupIndex];\n                const nodeId = node.getId();\n                const nodeIndex = this.rowNodeHelper.getIndexById(nodeId);\n                const lastLevelChildren = []\n                node.getAllChildren(node).forEach((rownode) => {\n                    const isGroupRow = rownode.isGroupRow?.() ?? false;\n                    !isGroupRow && lastLevelChildren.push(rownode);\n                })\n                nextLevelGroupNodes.push(...lastLevelChildren);\n                this.handlerHelper.deleteAbsoluteRow(nodeIndex);\n            }\n            parentNode.directChildren = nextLevelGroupNodes;\n        })\n    }\n\n    getAllParentNodesAtLevel(level: number) {\n        const parentNodes = [];\n        for (let i = 0; i <= level; i++) {\n            if (i == 0) {\n                parentNodes.push(this.getRoot());\n            }\n            else {\n                let deleteLastLevel = 0;\n                const nodeLevelLength = parentNodes.length\n                for (let parentNodeIndex = 0; parentNodeIndex < nodeLevelLength; parentNodeIndex++) {\n                    const parentNode = parentNodes[parentNodeIndex];\n                    const directChildren = parentNode.getDirectChildren();\n                    deleteLastLevel++;\n                    for (let groupIndex = 0; groupIndex < directChildren?.length; groupIndex++) {\n                        parentNodes.push(directChildren[groupIndex]);\n                    }\n                }\n                parentNodes.splice(0, deleteLastLevel);\n            }\n        }\n        return parentNodes;\n    }\n\n    groupByKeys(data : IJson, keys, parentGroupKey = \"\") {\n        if (keys.length === 0) {\n            return data;\n        }\n\n        const currentKey = keys[0];\n        const remainingKeys = keys.slice(1);\n        const directChildren = data.reduce((result, item) => {\n            const groupValue = `${parentGroupKey}${parentGroupKey ? \", \" : \"\"}${currentKey}: ${item.rowData.data[currentKey]}`;\n            if (!result[groupValue]) {\n                result[groupValue] = [];\n            }\n            result[groupValue].push(item);\n            return result;\n        }, {});\n\n        for (const groupKey in directChildren) {\n            directChildren[groupKey] = this.groupByKeys(directChildren[groupKey], remainingKeys, groupKey);\n        }\n        return directChildren;\n    }\n\n\n    createGroupRowNodes(groupedData: any, _parentId: string, level: number = 1, groupKeysWithOrder): IRowNodeCore[] {\n        const result = [];\n        let groupLevelIndex = 0;\n        for (const groupKeyData in groupedData) {\n            if (groupedData.hasOwnProperty(groupKeyData)) {\n                const children = groupedData[groupKeyData];\n                const nodeData = groupKeyData.split(\", \")[level - 1] as unknown as IJson;\n                const groupKeyValue: string[] = groupKeyData.split(\", \").map(pair => pair.split(':')[1].trim());\n                groupKeyValue.pop();\n                const rowNodeHolder = this.handlerHelper.getRowNodeHolder();\n                const groupNodeId = this.addGroupRowNode(groupLevelIndex, groupKeyValue, nodeData);\n                const groupNode = rowNodeHolder.get(groupNodeId);\n                groupLevelIndex++;\n                groupNode.level = level;\n                if (Array.isArray(children)) {\n                    groupNode.directChildren = children;\n                    children.forEach((rownode) => { \n                        rownode.setParentId(groupNode.getId()); \n                        rownode.updateLevel(groupNode.getLevel() + 1);\n                    });\n                } else {\n                    groupNode.directChildren = this.createGroupRowNodes(children, groupNode.id, level + 1, groupKeysWithOrder);\n                }\n                result.push(groupNode);\n            }\n        }\n        return result;\n    }\n\n    collectAllParentData(parentId : string): string[] {\n        const rootId = this.handlerHelper.getRootId();\n        if (parentId == rootId) {\n            return [];\n        }\n        const node = this.handlerHelper.getRowNodeHolder().get(parentId);\n        return [node.getGroupColumLabel() + \": \" + node.getData(), ...this.collectAllParentData(node.getParentId())];\n    }\n\n    createRowNode(id : string, parentId : string, data : IJson, definition : IRowDefinition, isLoaded : boolean = true): IGroupedRowNodeCore {\n        const GroupRowNodeClass = this.classRegistry.getGroupRowNode();\n        const groupRowNode = GroupRowNodeClass ?  new GroupRowNodeClass(this.rowNodeHelper, id, parentId, data, definition) : null;\n        groupRowNode.updateLoaded(isLoaded);\n        return groupRowNode;\n    }\n\n    setGroupModel(groupModel: IGroupModel[]): void {\n        this.groupModel = groupModel;\n    }\n\n    getGroupModel(): IGroupModel[] {\n        return this.groupModel;\n    }\n \n    deleteRowNodeByIndex(rowIndex : number): void {\n        const rownode = this.handlerHelper.getRowNode(rowIndex);\n        if (this.groupModel.length > 0) {\n            const [, childrenids] = this.getAllChildren(rownode);\n            // const rowNodeHandler = this.handlerHelper.getRowNodeHolder();\n            // const parentId = rownode.getParentId();\n            childrenids.forEach((id) => {\n                const index = this.rowNodeHelper.getIndexById(id);\n                this.handlerHelper.deleteAbsoluteRow(index);\n            });\n            let parentNode = rownode.getParentNode();\n            // if (parentId == RowGroupingHandler.rootId) {\n            //     parentNode = this.getRoot();\n            // }\n            // else {\n            //     parentNode = rowNodeHandler.get(parentId);\n            // }\n            const index = parentNode.directChildren?.indexOf(rownode);\n            parentNode.directChildren?.splice(index, 1);\n        }\n        this.handlerHelper.deleteAbsoluteRow(rowIndex);\n    }\n\n    getAllChildren(node) : [any[], string[]] {\n        const allChildren = [];\n        const allChildrenIds = [];\n        if (node.directChildren?.length > 0) {\n            for (const childNode of node.directChildren) {\n                allChildren.push(childNode, ...this.getAllChildren(childNode)[0]);\n                allChildrenIds.push(childNode.getId(), ...this.getAllChildren(childNode)[1]);\n            }\n        }\n        return [allChildren, allChildrenIds];\n    }\n\n    getRowGroupingModel(): IGroupModel[] {\n        return this.groupModel;\n    }\n\n    addGroupRowNode(index: number, groupkeys : IGroupKeys, data : IJson) : string {\n        const parentId = this.findParentIdFromGroupKeys(groupkeys);\n        const rowDefinition = this.handlerHelper.getRowDefinition(index, groupkeys, data);\n        const rowNodeHolder = this.handlerHelper.getRowNodeHolder();\n         \n        const encodedKey   = this.encode(groupkeys);\n        const id           = this.generateId(encodedKey);\n        const groupRowNode = this.createRowNode(id, parentId, data, rowDefinition);\n        rowNodeHolder.set(id, groupRowNode);\n\n        const parentNode = (groupkeys.length == 0 ) ? this.getRoot() : rowNodeHolder.get(parentId);\n        parentNode.directChildren?.splice(index, 0, rowNodeHolder.get(id));\n        this.handlerHelper.insertRowNode(index, groupkeys, this.handlerHelper.getRowNodeById(id));\n        return id;\n    }\n\n    findParentIdFromGroupKeys(groupkeys: IGroupKeys): string {\n        if (groupkeys.length <= 0){\n            return this.handlerHelper.getRootId();\n        } \n        else {\n            let currentGroupNode = this.getRoot();\n            if (currentGroupNode) {\n                for (let i = 0; i < groupkeys.length; i++) {\n                    currentGroupNode = this.findGroupNodeByKey(currentGroupNode.directChildren, groupkeys[i]);\n                }\n                return currentGroupNode.getId();\n            }\n            return null;\n        }\n    }\n\n    findGroupNodeByKey(groupData: IGroupedRowNodeCore[], GroupkeyData): IGroupedRowNodeCore {\n        let currentNode: IGroupedRowNodeCore;\n        for (let i = 0; i < groupData.length; i++) {\n            if (groupData[i].getOwnGroupValue() === GroupkeyData) {\n                currentNode = groupData[i];\n                break;\n            }\n        }\n        return currentNode;\n    }\n\n    getRoot(): any {\n        return this.handlerHelper.getRootNode();\n    }\n\n    resetRowGrouping(): void { \n        if(this.groupModel.length != 0){\n            const rowAxis         = this.handlerHelper.getRowAxis();\n            const idsOrderClone   = this.handlerHelper.getIdsOrder().slice();\n            const initialIdsOrder = this.handlerHelper.getInitialIdsOrder();\n            const heights         = [];\n\n            for (let i = 0; i < idsOrderClone.length; i++) {\n                const id      = idsOrderClone[i];\n                const rownode = this.handlerHelper.getRowNodeHolder().get(id);\n                rownode.setParentId(null);\n                rownode.updateLevel(0);\n                const index             = this.rowNodeHelper.getIndexById(id);\n                const isGroupingRowNode = rownode.isGroupRow?.();\n                if(isGroupingRowNode) {\n                    this.handlerHelper.deleteAbsoluteRow(index);\n                }\n                else{\n                    heights.push(rownode.getTempHeight());\n                }\n            }\n            rowAxis.clearAllBlocks();\n            heights.forEach(height=>rowAxis.insertRow(0, height));\n    \n\n            // this.root = null;\n            this.handlerHelper.resetRoot();\n            this.setGroupModel([]);\n            initialIdsOrder.length > 0 && this.handlerHelper.setIdsOrder(initialIdsOrder);\n        }\n    }\n\n    findTopIndex(parentId : string, grouplevelIndex : number): number {\n        let parentNode, absoluteIndex;\n        const rootId = this.handlerHelper.getRootId();\n\n        if (parentId == rootId) {\n            parentNode    = this.getRoot();\n            absoluteIndex = 0;\n        }\n        else {\n            parentNode    = this.rowNodeHelper.getRowNodeById(parentId);\n            absoluteIndex = parentNode.getIndex() + 1;\n        }\n        for (let i = 0; i < grouplevelIndex; i++) {\n            absoluteIndex += parentNode.directChildren[i].getAllChildrenCount() + 1;\n        }\n        return absoluteIndex;\n    }\n\n    getAbsoluteIndex(index : number, groupkeys : IGroupKeys): number {\n        // const parentId       = groupkeys.length == 0 ? RowGroupingHandler.rootId : this.encode(groupkeys);\n        // const parentId       = this.encode(groupkeys);\n        const parentId       = groupkeys?.length ? groupkeys[groupkeys.length - 1] : undefined;\n        const parentNode     = !groupkeys?.length ? this.getRoot() : this.rowNodeHelper.getRowNodeById(parentId);\n        if (!parentNode) {\n            return null;\n        }\n        const directChildren = parentNode.getDirectChildren();\n        const rowNode        = directChildren[index];\n        return rowNode?.getIndex() ?? null;\n    }\n\n    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n    getRelativeRowMeta(absoluteIndex: number): IRowMeta {\n        let parentKeys =[];\n        let pinPosition = 'middle' as rowPinPositions;\n        let rowIndex = 0;\n\n        const rowNode    = this.handlerHelper.getRowNode(absoluteIndex) as IRowNode;\n\n        if(rowNode){\n            const id         = rowNode.getId();\n            const parentNode = rowNode.getParentNode() ?? null;\n            const level      = rowNode.getLevel();\n    \n            parentKeys  = parentNode?.getGroupValues() ?? [];\n            pinPosition = rowNode.getPinnedPosition() ?? 'middle';\n            rowIndex    = level == 1 ? ( parentNode?.getChildIndexById(id) ?? absoluteIndex ) : (absoluteIndex -  (parentNode.getIndex() + 1));\n            // rowIndex    = parentNode == null ? ( this.root?.getChildIndexById(id) ?? absoluteIndex ) : (absoluteIndex -  (parentNode.getIndex() + 1));\n        }\n        \n        return { parentKeys, pinPosition, rowIndex }\n    }\n    \n    generateId(groupKey : string) : string {\n        return groupKey;\n    }\n\n    applySort(sortModel: ISortModel[]): void {\n        const level         = this.groupModel.length;                        //first level grouping\n        const leafGroupRows = this.getChildrenNodes(this.getRoot(), level);\n        const rowAxis       = this.handlerHelper.getRowAxis();\n        leafGroupRows.forEach((leafGroupRow) => {\n            const directChildrens = leafGroupRow.getDirectChildren();\n            const firstIndex      = directChildrens[0].getIndex();\n            const lastIndex       = directChildrens[directChildrens.length - 1].getIndex();\n            const sortHandler     = this.handlerHelper.getSortHandler();\n            const reOrderedRows   = sortHandler.applySortRange(firstIndex, lastIndex, sortModel);\n            leafGroupRow.isCollapsed() ? rowAxis.hideBlock(firstIndex) : rowAxis.showBlock(firstIndex);\n            leafGroupRow.setDirectChildren(reOrderedRows);\n        })\n    }\n\n    resetSort(): void {\n        const level = this.groupModel.length;\n        const leafGroupRows = this.getChildrenNodes(this.getRoot(), level);\n        const rowAxis       = this.handlerHelper.getRowAxis();\n        leafGroupRows.forEach((leafGroupRow) => {\n            const initialOrder    = leafGroupRow.getInitialIdsOrder();\n            const directChildrens = leafGroupRow.getDirectChildren();\n            const firstIndex      = directChildrens[0]?.getIndex() ?? 0;\n            const lastIndex       = directChildrens[directChildrens.length - 1]?.getIndex() ?? 0;\n            const sortHandler     = this.handlerHelper.getSortHandler();\n            const reOrderedRows   = sortHandler.reset(firstIndex, lastIndex, initialOrder);\n            leafGroupRow.isCollapsed() ? rowAxis.hideBlock(firstIndex) : rowAxis.showBlock(firstIndex);\n            leafGroupRow.setDirectChildren(reOrderedRows);\n        })\n    } \n\n\n    applyFilter(filterModel: IFilterModel): void {\n        const level         = this.groupModel.length;\n        const leafGroupRows = this.getChildrenNodes(this.getRoot(), level);\n        // const rowAxis       = this.handlerHelper.getRowAxis();\n        const removeEmptyGroup = false;\n        leafGroupRows.forEach((leafGroupRow) => {\n            const isCollapsed     = leafGroupRow.isCollapsed();\n            leafGroupRow.expand();\n            const directChildrens = leafGroupRow.getDirectChildren();\n            const firstIndex      = directChildrens[0].getIndex();\n            const lastIndex       = directChildrens[directChildrens.length - 1].getIndex();\n            const filterHandler   = this.handlerHelper.getFilterHandler();\n            const reOrderedRows   = filterHandler.applyFilterRange(firstIndex, lastIndex, filterModel);\n\n            if(reOrderedRows.length == 0 && removeEmptyGroup){\n                let groupRowNode = leafGroupRow;\n                while(groupRowNode != null){\n                    this.handlerHelper.deleteAbsoluteRow(groupRowNode.getIndex());\n                    const parentId = groupRowNode.getParentId();\n                    groupRowNode = this.rowNodeHelper.getRowNodeById(parentId) ?? null;\n                    if((groupRowNode == null) || (groupRowNode.getChildCount() != 0)) {\n                        break\n                    }\n                }\n            }\n            else{\n                leafGroupRow.setDirectChildren(reOrderedRows);\n            }\n            isCollapsed ? leafGroupRow.collapse() : leafGroupRow.expand();\n        })\n    }\n\n    resetFilter(): void {\n        const level = this.groupModel.length;\n        const leafGroupRows = this.getChildrenNodes(this.getRoot(), level);\n        const rowAxis       = this.handlerHelper.getRowAxis();\n        leafGroupRows.forEach((leafGroupRow) => {\n            const parentIndex     = leafGroupRow.getIndex();\n            const initialOrder    = leafGroupRow.getInitialIdsOrder();\n            const directChildrens = leafGroupRow.getDirectChildren();\n            const initialChildren = initialOrder.map(id => this.rowNodeHelper.getRowNodeById(id));\n            const firstIndex      = directChildrens[0]?.getIndex() ?? parentIndex + 1;\n            const lastIndex       = directChildrens[directChildrens.length - 1]?.getIndex() ?? parentIndex;\n            const filterHandler   = this.handlerHelper.getFilterHandler();\n            filterHandler.reset(firstIndex, lastIndex, initialOrder);\n            leafGroupRow.setDirectChildren(initialChildren);\n            leafGroupRow.isCollapsed() ? rowAxis.hideBlock(firstIndex) : rowAxis.showBlock(firstIndex);\n        })\n    } \n\n    getStructureGroupData(parentNode : IGroupedRowNodeCore, groupModel: IGroupModel[]) {\n        const leafRowNodes = parentNode.getDirectChildren();\n\t\tconst columnHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        const columnKeys = groupModel.map(({columnId}) => {\n            const columnNode = columnHandler.getColumnNodeByID(columnId);\n            return columnNode.getColumnKey();\n        })\n        const config = {\n            data : leafRowNodes,\n            comparer : (rowNode)=>{\n                const data = rowNode.getRowData();\n                const values = columnKeys.map(key => data[key]);\n                return values.map((_val, index)=>{\n                    return this.encode(values, index);\n                })\n            }\n        }\n        return groupBy(config);\n    }\n\n    encode(values : string[], depth : number = (values.length-1)) : string {\n        let encoded = \"\";\n        for(let i = 0; i <= depth; i++){\n            const val = values[i];\n            const isLast = i == depth;\n            encoded += isLast ? val : `${val}${RowGroupingHandler.delimiter}`;\n        }\n        return encoded;\n    }\n\n    decode(encodedString : string) : string[] {\n        return encodedString.split(RowGroupingHandler.delimiter);\n    }\n\n    private getChildrenNodes(parentNode: IGroupedRowNodeCore, level: number) : IGroupedRowNodeCore[] {\n        const isGroupingApplied = this.isGroupingApplied();\n        if(!isGroupingApplied) {\n            return [this.getRoot()]\n        }\n        const leafLevel   = this.groupModel.length + 1;\n        const allChildren = parentNode.getAllChildren() as IGroupedRowNodeCore[];\n        return allChildren.filter(node => (node?.getLevel?.() ?? leafLevel) == level);\n    }\n\n    constructGroupRowNodes(parentNode: IGroupedRowNodeCore, structureGroupData: any, groupModel: IGroupModel[] = []): IGroupedRowNodeCore[] {\n        const values         = Object.values(structureGroupData) as IRowNodeCore[][];\n        const columnIds      = groupModel.map(({columnId}) => columnId);\n        const keys           = Object.keys(structureGroupData);\n        const isLeaf         = Array.isArray(values[0]);\n        const rowNodeHandler = this.handlerHelper.getRowNodeHolder();\n        const sortHandler    = this.handlerHelper.getSortHandler();\n\n        if(isLeaf){\n            values.forEach(nodeArr=>{\n                nodeArr.forEach(node=>{\n                    const index = node.getIndex();\n                    const height = this.handlerHelper.getHeight(index, true);\n                    node.setTempHeight(height)\n                });\n            });\n        }\n        const groupRowNodes = [];\n        keys.forEach((key, index)=>{\n            const value      = structureGroupData[key];\n            const parentKeys  = this.decode(key);\n            const level      = parentKeys.length-1;\n            const definition = this.handlerHelper.getRowDefinition(index, parentKeys, null);\n\n            const id        = this.generateId(key);\n            const rowNode   = this.createRowNode(id, parentNode.getId(), null, definition);\n            const groupMeta = parentNode.getGroupMeta().slice();\n            groupMeta.push({[columnIds[level]] : parentKeys[level]});\n            rowNode.setGroupMeta(groupMeta);\n\n            if(isLeaf){\n                value.forEach(node=>{\n                    node.setParentId(id);\n                    node.updateLevel(rowNode.getLevel() + 1);\n                });\n                const ids = value.map(node=>node.getId());\n                rowNode.setInitialOrder(ids);\n            }\n\n            const directChildrens  = isLeaf ? value : this.constructGroupRowNodes(rowNode, value, groupModel);\n            const sortedChildNodes = sortHandler.getSortedRowNodes(directChildrens, groupModel);\n            rowNode.setDirectChildren(sortedChildNodes);\n\n            const height = this.handlerHelper.fetchHeight(index, rowNode);\n            rowNode.setTempHeight(height);\n            \n            rowNodeHandler.set(id, rowNode);\n            groupRowNodes.push(rowNode);\n        });\n        return sortHandler.getSortedRowNodes(groupRowNodes, groupModel) as IGroupedRowNodeCore[];\n        return groupRowNodes;\n    }\n\n    createSubGroup(parentNode : IGroupedRowNodeCore, groupModel : IGroupModel[]): void {\n        const index       = parentNode.getId() == this.handlerHelper.getRootId() ? 0 : parentNode.getIndex();\n        const count       = parentNode.getChildCount();           //will be leafNode;\n\n        const structureGroupData = this.getStructureGroupData(parentNode, groupModel);\n        const childrens          = this.constructGroupRowNodes(parentNode, structureGroupData, groupModel);\n        // parentNode.setDirectChildren(childrens);\n        parentNode.setDirectChildren(childrens);\n\n        const allChildren = parentNode.getAllChildren() as IGroupedRowNodeCore[];\n        this.spliceRange(index, count, allChildren);\n    }\n\n    addGroup(groupModel : IGroupModel[]): void {\n        const level = 1;    //first level grouping\n        const leafGroupRows = this.getChildrenNodes(this.getRoot(), level);\n        leafGroupRows.forEach((leafGroupRow)=>{\n            this.createSubGroup(leafGroupRow, groupModel);\n        });\n        this.groupModel.push(...groupModel);\n    }\n\n    applyGroupBy(groupModel: IGroupModel[]): void {\n        const allRowNodes = this.rowNodeHelper.getAllRowNodes();\n        const groupMeta = [];\n        // this.root = this.createRowNode(RowGroupingHandler.rootId, null, groupMeta, null);\n        const rootNode = this.getRoot();\n        rootNode.setDirectChildren(allRowNodes);\n        rootNode.setGroupMeta(groupMeta);\n        this.addGroup(groupModel);\n    }\n\n    isGroupingApplied(): boolean {\n        return this.getGroupModel().length > 0;\n    }\n\n    spliceRange(absoluteIndex : number, count: number, rowNodeArr: IGroupedRowNodeCore[]): void { \n        const idsOrder = this.handlerHelper.getIdsOrder();\n        const rowAxis = this.handlerHelper.getRowAxis();\n        const optionalHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\n        idsOrder.splice(absoluteIndex, count);\n        for (let i = 0; i < count; i++) {\n            rowAxis.deleteRow(absoluteIndex); // if everything deleted delete block also\n        }\n            \n        const ids = [];\n        let blockAxis = rowAxis.createBlock({});\n        let isNewBlock = true;\n        let priviousParentId = null;\n        for(let i = 0; i < rowNodeArr.length; i++){\n            const rowNode = rowNodeArr[i];\n            const parentNode = rowNode.getParentNode();\n            const parentNodeId = parentNode.getId();\n            const id = rowNode.getId();\n            ids.push(id);\n            if(rowNode.isGroupRow?.()){\n                blockAxis = rowAxis.createBlock({});\n                isNewBlock = true;\n                const groupConfig = optionalHandler.getViewConfig(true);\n                groupConfig.isVisible = !parentNode.isCollapsed();\n                const block = rowAxis.createBlock(groupConfig);\n                rowAxis.insertBlock(block, null, absoluteIndex+i);\n                block.appendRow(rowNode.getTempHeight());\n            }\n            else{\n                if(priviousParentId != parentNodeId){\n                    isNewBlock  = true;\n                    blockAxis = rowAxis.createBlock({});\n                }\n                (isNewBlock) && rowAxis.insertBlock(blockAxis, null, absoluteIndex+i);\n                isNewBlock = false;\n                blockAxis.insertRow(absoluteIndex+i, rowNode.getTempHeight());\n            }\n            priviousParentId = parentNodeId;\n        }\n        rowAxis.updateRelativeValues();\n        idsOrder.splice(absoluteIndex, 0, ...ids);\n    }\n\n    collapse(groupRowNode : IGroupedRowNodeCore,recursive?: boolean) : void { \n        if(groupRowNode.isCollapsed()){\n            return;\n        }\n        const childCount = groupRowNode.getChildCount();\n        if(childCount <= 0){\n            return groupRowNode.updateCollapseState(true);\n        }\n        const events = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n        const axis = this.handlerHelper.getRowAxis();\n        const firstIndex = groupRowNode.getFirstRowInGroup();\n        const lastIndex  = groupRowNode.getLastRowInGroup();\n\n        axis.hideBlock(firstIndex, lastIndex);\n \n        if(recursive){\n            for(let i=0; i < this.groupModel.length; i++){\n                const subGroups = this.getChildrenNodes(groupRowNode, i);\n                subGroups.forEach(node=>{\n                    node.updateCollapseState(true);\n                });\n            }\n        }\n        groupRowNode.updateCollapseState(true);\n        events.dispatchEvent({\n            type : Events.EVENT_ROW_COLLAPSED,\n            node : groupRowNode\n        })\n        events.dispatchEvent({\n            type : Events.EVENT_ROW_DATA_LOADED\n        })\n    }\n\n    expand(groupRowNode : IGroupedRowNodeCore, params : {recursive ?: boolean} = {}) : void { \n        const {recursive = false} = params;\n        if(!groupRowNode.isCollapsed()){\n            return;\n        }\n        const childCount = groupRowNode.getChildCount();\n        if(childCount <= 0){\n            return groupRowNode.updateCollapseState(false);\n        } \n        const events = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n        if(recursive){\n            const axis       = this.handlerHelper.getRowAxis();\n            const firstIndex = groupRowNode.getFirstRowInGroup();\n            const lastIndex  = groupRowNode.getLastRowInGroup();\n            axis.hideBlock(firstIndex, lastIndex);\n            for(let i=0; i < this.groupModel.length; i++){\n                const subGroups = this.getChildrenNodes(groupRowNode, i);\n                subGroups.forEach(node=>{\n                    node.updateCollapseState(true);\n                });\n            }\n        }\n        else{\n            this.expandDirectChildren(groupRowNode);\n        }\n        groupRowNode.updateCollapseState(false);\n        events.dispatchEvent({\n            type : Events.EVENT_ROW_EXPANDED,\n            node : groupRowNode\n        })\n        events.dispatchEvent({\n            type : Events.EVENT_ROW_DATA_LOADED\n        })\n    }\n\n    private expandDirectChildren(groupRowNode : IGroupedRowNodeCore) : void{\n        const axis             = this.handlerHelper.getRowAxis();\n        const directChildren   = groupRowNode.getDirectChildren() as IGroupedRowNodeCore[];\n        const firstChild       = directChildren[0] as IGroupedRowNodeCore;\n        const hasChildSubGroup = firstChild.isGroupRow?.();\n\n        if(hasChildSubGroup){\n            directChildren?.forEach(node=>{\n                axis.showBlock(node.getIndex());\n                (node.isGroupRow() && !node.isCollapsed()) && this.expandDirectChildren(node);\n            })\n        }\n        else{\n            axis.showBlock(firstChild.getIndex());\n        }\n    }\n\n    moveRows(sourceRowNodes : IGroupedRowNodeCore[], targetRowNode : IGroupedRowNodeCore): void {\n        const parentId        = targetRowNode.getParentId();\n        const targetLevel     = targetRowNode.getLevel();\n        const parentNode      = targetRowNode.getParentNode();\n        const parentGroupMeta = parentNode.getGroupMeta();\n\n        sourceRowNodes.forEach(rowNode => {\n            const {groupKey, groupValue} = rowNode.getCurrentMeta();\n\n            rowNode.setParentId(parentId);\n            rowNode.setGroupMeta([...parentGroupMeta, {[groupKey] : groupValue}]);\n            rowNode.updateLevel(targetLevel);\n        });\n    }\n\n    getChildIndexById(parentId: string, id: string) : number {\n        const parentNode     = parentId == this.handlerHelper.getRootId() ? this.getRoot() : this.rowNodeHelper.getRowNodeById(parentId);\n        const directChildren = parentNode.getDirectChildren();\n        const index          = directChildren?.findIndex(node => node.getId() === id);\n        return index < 0 ? null : index;\n    }\n\n    getParentNode(parentKeys: any): IGroupedRowNodeCore {\n        const id = this.encode(parentKeys);\n        return this.rowNodeHelper.getRowNodeById(id) as IGroupedRowNodeCore;\n    }\n\n    getAncestorNode(parentKeys: any): IGroupedRowNodeCore[] {\n        const id = this.encode(parentKeys);\n        const node = this.rowNodeHelper.getRowNodeById(id) as IGroupedRowNodeCore;\n        const ancesstors = node.getAncestors();\n        ancesstors.push(node);\n        return ancesstors;\n    }\n}\n\nexport {\n    RowGroupingHandler\n}   ","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { ISortModel } from \"../../Grid/Core/Interface/ISortConfigurations\";\nimport { ISortObject, sort } from \"../../../Sub_Components/src/DataProcessor/sort/Sort\";\nimport { IRowNodeCore } from \"../rownode.types\";\nimport { ISortHandler, ISortHelper } from \"./sort-handler.types\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { IClientBlockHandler } from \"./client-rowblock-handler.types\";\n\nclass SortHandler implements ISortHandler{\n\tprivate handlerHelper  : ISortHelper;\n\tprivate sortModel      : ISortModel[];\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName;\n\n\tconstructor(handler : IClientBlockHandler) {\n\t\tthis.sortModel = null;\n\t\tthis.createHelper(handler);\n\t}\n\n  \tprivate createHelper(handler : IClientBlockHandler) : void {\n\t\tthis.handlerHelper = {\n\t\t\tgetInitialIdsOrder : ()=>handler.getInitialIdsOrder(),\n\t\t\tsetInitialIdsOrder : (idsOrder:string[]) => handler.setInitialIdsOrder(idsOrder),\n\t\t\tgetRowNode         : (index:number)=>handler.getRowNode(index),\n\t\t\tgetRowNodeById     : (id:string)=>handler.getRowNodeById(id),\n\t\t\tspliceRange        : (absoluteIndex, count, rowNodeArr)=>handler.spliceRange(absoluteIndex, count, rowNodeArr),\n\t\t\tgetHeight \t\t   : (absoluteIndex, ignoreRowHeight) => handler.getHeight(absoluteIndex, ignoreRowHeight),\n\t\t}\n\t}\n\n\n\tprivate getSortConfigurations(sortModel : ISortModel[] = null) : ISortObject[]{\n\t\tconst columnHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n\t\tconst initialOrder = this.handlerHelper.getInitialIdsOrder();\n\t\tconst configurations = [];\n\t\tconst nullRank = true;\n\n\n\t\tif(sortModel == null){\n\t\t\tconfigurations.push({\n\t\t\t\tby        : (rowNode : IRowNodeCore)=> {\n\t\t\t\t\tconst rowIndex = rowNode.getIndex();\n\t\t\t\t\treturn initialOrder[rowIndex];\n\t\t\t\t},\n\t\t\t\torder     : \"asc\",\n\t\t\t\tnullRank,\n\t\t\t\tcomparer  : 'number',\n\t\t\t})\n\t\t}\n\t\telse{\n\t\t\tsortModel.forEach(({columnId, order, comparer})=>{\n\t\t\t\tconst columNode = columnHandler.getColumnNodeByID(columnId);\n\t\t\t\tconst columnKey = columNode.getColumnKey();\n\t\t\t\tconfigurations.push({\n\t\t\t\t\tby        : (rowNode : IRowNodeCore)=> rowNode.getDataByKey(columnKey),\n\t\t\t\t\torder     : order == \"descending\" ? \"desc\" : \"asc\",\n\t\t\t\t\tnullRank,\n\t\t\t\t\tcomparer  : comparer ?? columNode.getDataType(),\n\t\t\t\t}); \n\t\t\t});\n\t\t}\n\n\n\t\treturn configurations;\n\t}\n\n\tisSortApplied(): boolean {\n\t\treturn this.sortModel != null;\n\t}\n\n    getSortedRowNodes(rowNodesArray : IRowNodeCore[] , sortKeys : ISortModel[]) : IRowNodeCore[]{\n\t\tconst configurations = this.getSortConfigurations(sortKeys);\n\t\treturn sort(rowNodesArray, configurations);\n\t}\n\n\tapplySortRange(startIndex : number, endIndex : number, sortModel : ISortModel[]) : IRowNodeCore[]{\n\t\tconst rowNodes = [];\n\t\tfor(let row = startIndex; row <= endIndex; row++){\n\t\t\tconst node = this.handlerHelper.getRowNode(row);\n\t\t\trowNodes.push(node);\n\t\t}\n\t\tconst sortedRowNodes = this.getSortedRowNodes(rowNodes, sortModel);\n\t\tsortedRowNodes.forEach(node=>{\n\t\t\tconst index  = node.getIndex();\n\t\t\tconst height = this.handlerHelper.getHeight(index, true);\n\t\t\tnode.setTempHeight(height);\n\t\t}); // settingTempHeight;\n\t\tthis.handlerHelper.spliceRange(startIndex, (endIndex - startIndex)+1, sortedRowNodes);\n\t\treturn sortedRowNodes;\n\t}\n\n\n\treset(startIndex : number, endIndex : number, initialIdsOrder : string[] = []) : IRowNodeCore[] {\n\t\tconst rowNodes = initialIdsOrder.map(id => this.handlerHelper.getRowNodeById(id));\n\t\tconst sortConfigurations = [{\n\t\t\tby : (rowNode : IRowNodeCore)=> {\n\t\t\t\tconst rowIndex = rowNode.getIndex();\n\t\t\t\treturn initialIdsOrder[rowIndex];\n\t\t\t},\n\t\t\tcomparer  : 'number',\n\t\t}]\n\t\tconst sortedRowNodes = sort(rowNodes, sortConfigurations);\n\t\tthis.handlerHelper.spliceRange(startIndex, (endIndex - startIndex)+1, sortedRowNodes);\n\t\treturn rowNodes;\n\t}\n\n\tgetSortModel():ISortModel[]{\n\t\treturn this.sortModel;\n\t}\n\n\tsetSortModel(sortModel:ISortModel[]):void{\n\t\tthis.sortModel = sortModel;\n\t}\n}\n\n\nexport{\n    SortHandler\n}","import { CacheBlockHandler } from \"../../../Sub_Components/src/CacheBlockHandler/CacheBlockHandler\";\nimport { IRemoteCacheBlock } from \"./IRemoteCacheBlock.types\";\n\nexport class RemoteCacheBlock extends CacheBlockHandler implements IRemoteCacheBlock {\n    private relativeIndex: number;\n    groupLevel: number;\n    setRelativeIndex(index: number): void {\n        this.relativeIndex = index;\n    }\n\n    getRelativeIndex(): number {\n        return this.relativeIndex;\n    }\n}","import { IInsertRowMeta, IViewport, IBlockConfigs } from \"../../../Sub_Components/src/CacheBlockHandler/Interface\";\nimport { IDraftRowDefinition, IRowDefinition, IRowDefinitions, IRowHeightFetcher, IRowHeightParam } from \"../../Grid/Core/Interface/IRowDefinitions\";\nimport { IGroupKeys } from \"../../Grid/Core/Interface/IRowGroupingConfigurations\";\nimport { IRowNodeHelper, MovePosition, IJson } from \"../../Grid/Main\";\nimport { IRowNodeCore } from \"../rownode.types\";\nimport { IRemoteBlockHandler } from \"./remote-rowblock-handler.types\";\nimport { RowBlockCommon } from \"../RowBlockCommon\";\nimport { AutoWired, BEAN_NAME, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { IRowAxisConstructor, IRowAxisCore } from \"../RowAxis/rowAxis.types\";\nimport { ICacheBlockHandler } from '../../../Sub_Components/src/CacheBlockHandler/ICacheBlockHandler';\nimport { CacheBlockHandler } from '../../../Sub_Components/src/CacheBlockHandler/CacheBlockHandler';\nimport { rowPinPositions } from \"../../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IGridBeanClassRegistry } from \"../../Grid/Core/grid-beanclass-registry.types\";\nimport { IRowBlockRowDeleteMeta, IRowBlockRowInsertMeta } from \"../rowblock-handler.types\";\nimport { IRowMeta } from \"../../Grid/API/CommonAPIInterface\";\nimport { GroupRowNode } from \"../GroupRowNode\";\nimport { IGroupedRowNodeCore } from \"../group-rownode.types\";\nimport type { GridOptioHandler } from \"Grid/Core/GridOptionHandler\";\nimport { DraftRowHandler, IDraftRowHandlerDependencies } from \"../Local/DraftRowHandler\";\nimport { GanttController } from \"../../GanttModelClasses/Core/GanttComponent/GanttController\";\n\n\n\nexport class RemoteDataBlock extends RowBlockCommon implements IRemoteBlockHandler {\n    static staticHeight = 50;\n\t@AutoWired(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY) classRegistry !: IGridBeanClassRegistry;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler : GridOptioHandler;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName;\n\n\n    public  rowAxis            !: IRowAxisCore;\n    private cacheBlockHandler  !: ICacheBlockHandler;\n    private rowNodeHelper       : IRowNodeHelper;\n    private definitionFetcher   : IRowDefinitions;\n    private heightFetcher       : IRowHeightFetcher;\n    private RowAxisClass        : IRowAxisConstructor;\n\n\tstatic ROOT_ID = `${'dataGrid-'.repeat(3)}root}`;\n    private rootNode : IGroupedRowNodeCore;\n\n    private draftRowHandler!: DraftRowHandler;\n\n    constructor(rowPinPosition: rowPinPositions, heightFetcher: IRowHeightFetcher, definitionFetcher: IRowDefinitions, cacheBlockConfig: Partial<IBlockConfigs>, RowAxisClass : IRowAxisConstructor) {\n\t\tsuper();\n        this.rowPinPosition    = rowPinPosition;\n        this.heightFetcher     = heightFetcher;\n        this.definitionFetcher = definitionFetcher;\n\n        const config = this.constructBlockConfig(cacheBlockConfig);\n\n        this.cacheBlockHandler = new CacheBlockHandler(rowPinPosition, config);\n        this.RowAxisClass      = RowAxisClass;\n\n        config.staticCaches && config.staticCaches.forEach(index=>this.addStaticIndex(index));\n    }\n    getLastRowNode(): IRowNodeCore {\n        return null;\n    }\n    getFirstRowNode(): IRowNodeCore {\n        return null;\n    }\n\n    getRootNode() {\n        return this.rootNode;\n    }\n     \n    getChildCount(_index: number, _parentKeys: string[]): number {\n        return 0;\n    }\n\n    getRelativeRowMeta(absoluteIndex: number, pinPosition ?: rowPinPositions): IRowMeta {\n        const rowMeta = this.parseFromDraftIndex(absoluteIndex, pinPosition ?? this.rowPinPosition);\n        return {\n            rowIndex    : rowMeta.rowIndex,\n            pinPosition : rowMeta.pinPosition,\n            parentKeys  : []\n        }\n    }\n\n    constructData(count : number = this.cacheBlockHandler.getRowCount()): void {\n        this.rootNode = new GroupRowNode(this.rowNodeHelper, RemoteDataBlock.ROOT_ID, null, [], null);\n        const heights = [];\n        for(let index = 0; index < count; index++){\n            // this.rowAxis.appendRow(RemoteDataBlock.staticHeight);\n            const rowHeight = this.optionHandler.getRowHeights({\n                rowIndex : index,\n                loaded : false\n            })\n            heights.push(rowHeight);\n        }\n        (count > 0) && this.rowAxis.appendMultipleRows(heights);\n        this.rootNode.setDirectChildrenCount(this.getRowCount());\n    }\n    \n    @PostConstruct()\n    init(){\n\t\tthis.rowAxis = this.createManagedBean(new this.RowAxisClass());\n        this.createRowNodeHelper();\n        \n        // Initialize DraftRowHandler\n        this.draftRowHandler = new DraftRowHandler(this.getDraftRowDependencies());\n    }\n\n    private getDraftRowDependencies(): IDraftRowHandlerDependencies {\n        return {\n            rowAxis            : this.rowAxis,\n            getRowNodeHolder   : () => this.rowNodeHolder,\n            rowPinPosition     : this.rowPinPosition,\n            getRowCount        : () => this.getRowCount(),\n            fetchRowDefinition : (index: number, groupkeys: string[], data?: IJson, isRowLoading?: boolean, pinPosition?: rowPinPositions) =>\n                this.fetchRowDefinition(index, groupkeys, data, isRowLoading, pinPosition),\n            generateRowId: (index: number, definition?: IRowDefinition) => this.generateRowId(index, definition),\n            createRowNode: (id: string, data: IJson, definition: IRowDefinition, isLoaded?: boolean, _parentKeys?: string[]) =>\n                this.createRowNode(id, data, definition, isLoaded),\n            fetchHeight: (rowIndex: number, rowNode: IRowNodeCore) => this.fetchHeight(rowIndex, rowNode),\n        };\n    }\n\n    private constructBlockConfig(cacheBlockConfig: Partial<IBlockConfigs>) : IBlockConfigs {\n        const deleteBlock = (ids)=>ids.forEach(id=>this.rowNodeHolder.delete(id));\n        cacheBlockConfig.fetchParam = {...cacheBlockConfig.fetchParam, ...{\n            get parentKeys(){ \n                return [];\n            }\n        }};\n        return {...{\n            getId : ({index}) => this.generateRowId(index),\n            onBeforeBlockAdd : (hookArgs)=>{\n                const newIds                                     = [];\n                let   {prevIds, ids, data, isLoaded, startIndex} = hookArgs;\n                prevIds && deleteBlock(prevIds);\n                ids.forEach((id, index)=>{\n                    const currentRowIndex = index + startIndex;\n                    const rowData         = data[index];\n                    let   rowDefinition   = this.fetchRowDefinition(currentRowIndex, null, rowData, !isLoaded);\n                    const height = this.heightFetcher({\n                        rowIndex      : currentRowIndex,\n                        rowPinPosition: this.getPinPosition(),\n                        parentKeys    : null,\n                        loaded        : isLoaded\n                    });\n                    const parsedIndex = this.parseToDraftIndex(currentRowIndex, this.rowPinPosition);\n                    this.rowAxis.updateRow(parsedIndex, height);\n                    if(isLoaded){\n                        id = rowDefinition?.rowId ?? id;\n                    }\n                    const rowNode = this.createRowNode(id, rowData, rowDefinition, isLoaded);\n                    this.rowNodeHolder.set(id, rowNode);\n                    newIds.push(id);\n                });\n                // this.dispatchEvent({\n                //     type       : Events.EVENT_ROW_DATA_LOADED,\n                //     recycleRows: true,\n                //     onlyBody   : true,\n                //     floating   : true\n                // });\n\n                return {...hookArgs, ids: newIds};\n            },\n            onAfterBlockDelete : ({ids}) => deleteBlock(ids),\n\n        }, ...cacheBlockConfig} as IBlockConfigs;\n    }\n    \n    // generateId(index: number, definition ?: IRowDefinition): string {\n    //     let id = definition?.rowId;\n    //     if(id == undefined){\n    //         id = `Row${index}_${uuid1()}`.slice(0, 10);\n    //         while(this.rowNodeHolder[id]){\n    //             id = `Row${index}_${uuid1()}`.slice(0, 10);\n    //         }\n    //     }\n    //     return id;\n    // }\n\n    private createRowNodeHelper() {\n        const viewType = this.optionHandler.getViewType();\n\n        let isEndDatePrioritizedForMilestone = false;\n        let isFlexibleMilestone = false;\n        if(viewType === 'gantt'){\n            const GanttContext = GanttController.getGanttBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n            isEndDatePrioritizedForMilestone = GanttContext?.isEndDatePrioritizedForMilestone() ?? false;\n            isFlexibleMilestone = GanttContext?.isFlexibleMilestone() ?? false;\n        }\n\n        this.rowNodeHelper = {\n            dispatchRowHeightChange : (_rowNodes: any) => {},\n            isExtraRow              : (_params: any) => false,\n            getUpcomingRowNodes     : (_index: number) => null,\n            show                    : (index : number)=>this.showRow(index),\n            hide                    : (index : number)=>this.hideRow(index),\n            getIndexById            : (id : string)=>this.getIndexById(id),\n            getTop                  : (index : number)=>this.getTop(index),\n            getLeft                 : (index : number)=>this.getLeft(index),\n            getWidth                : (index : number)=>this.getWidth(index),\n            getHeight               : (index : number)=>this.getHeight(index),\n            setHeight               : (index : number, height : number)=>this.setHeight(index, height),\n            getRowNodeById          : (id : string)=>this.getRowNodeById(id) as any,\n            getRelativeRowMeta      : (absoluteIndex) => this.getRelativeRowMeta(absoluteIndex),\n            getRootNode             : () => this.getRootNode(),\n            onDataUpdate            : (_rowNode: IRowNodeCore, _key: string, _value: any) => {},\n            isEndDatePrioritizedForMilestone : () => isEndDatePrioritizedForMilestone,\n            isFlexibleMilestone             : () => isFlexibleMilestone,\n            getGroupHeight                : (id: string) => this.getRowNodeById(id).getHeight()\n        }\n    }\n\n    removeStaticIndex(index: number): void {\n        super.removeStaticIndex(index);\n        this.cacheBlockHandler.removeFromStaticCache(index);\n    }\n\n    addStaticIndex(index: number): void {\n        super.addStaticIndex(index);\n        this.cacheBlockHandler.insertToStaticCache(index);\n    }\n\n    addStaticRowById(id: string): void {\n        super.addStaticRowById(id);\n        this.cacheBlockHandler.addStaticId(id);\n    }\n\n    removeStaticRowById(id: string): void {\n        super.removeStaticRowById(id);\n        this.cacheBlockHandler.removeStaticId(id);\n    }\n    \n    updateViewPort(viewport: IViewport): void {\n        this.cacheBlockHandler.updateViewPort(viewport);\n    }\n     \n    getRowNodeHelper(): IRowNodeHelper {\n        return this.rowNodeHelper;\n    }\n\n    fetchRowDefinition(rowIndex : number, groupkeys: IGroupKeys, data : IJson = null, isRowLoading = true, pinPosition : rowPinPositions = this.rowPinPosition) : IRowDefinition {\n        const rowDefinitionParams = {\n\t\t\trowIndex,\n\t\t\trowPinnedPosition : pinPosition,\n\t\t\tparentKeys        : groupkeys,\n\t\t\tpageNumber        : 0,\n\t\t\tsortModel         : this.getSortModel(),\n\t\t\tfilterModel       : this.getFilterModel(),\n\t\t\trowGroupingModel  : this.getGroupModel(),\n\t\t\tdata,\n            isRowLoading\n\t\t};\n\t\treturn this.definitionFetcher(rowDefinitionParams);\n    }\n\n    getHeightFetchParam( rowIndex: number, rowNode: IRowNodeCore ): IRowHeightParam {\n\t\treturn {\n\t\t\trowIndex,\n\t\t\trowPinPosition : rowNode.getPinnedPosition(),\n\t\t\tparentKeys      : rowNode.getGroupKeys?.() ?? [],\n\t\t};\n\t}\n    \n    fetchHeight(index : number, rowNode : IRowNodeCore): number {\n\t\tconst heightFetchParam = this.getHeightFetchParam(index, rowNode);\n\t\treturn this.heightFetcher(heightFetchParam);\n\t}\n    getAllRowNodes(): IRowNodeCore[] {\n        return Object.values(this.rowNodeHolder.getAllRows());\n    }\n    getStaticCacheIndexes(ignoreHidden : boolean = false): number[] {\n        const staticIndexes = super.getStaticCacheIndexes(ignoreHidden);\n        // const staticIndexes = this.cacheBlockHandler.getStaticCacheIndexes();\n        return ignoreHidden ? staticIndexes.filter(index=> !this.isRowHidden(index)) : staticIndexes;\n    }\n    isInStaticCache(index: number): boolean {\n        return this.cacheBlockHandler.isInStaticCache(index);\n    }\n    getIndexById(id: string): number {\n        const findIndex    = (id : string)=>this.cacheBlockHandler.getIndexById(id);\n        const hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\n        return hasDraftRows ? this.draftRowHandler.getIndexById(id, findIndex) : findIndex(id);\n    }\n    getIdByIndex(index: number): string {\n        const findId       = (index : number) => this.cacheBlockHandler.getIdByIndex(index);\n        const hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n\n        return hasDraftRows ? this.draftRowHandler.getIdByIndex(index, findId) : findId(index);\n    }\n   \n    moveRows(sourceIndexMetas: IRowBlockRowDeleteMeta[], targetIndexMeta: IRowBlockRowDeleteMeta, movePosition: MovePosition): void {\n        let currentTargetIndex = targetIndexMeta.rowIndex;\n        let heights            = [];\n        let insertIds          = [];\n        let sourceIndexes      = [];\n\n        const floatingHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER);\n        const floatingRowNode = floatingHandler.getFloatingRowNode();\n\n        const initialIds = sourceIndexMetas.map(({rowIndex, pinPosition = this.rowPinPosition})=>{\n            if(pinPosition == 'FloatingRecord'){\n                return floatingRowNode.getId();\n            }\n            return this.getIdByIndex(rowIndex);\n        });\n\n        sourceIndexMetas.sort((a, b)=>{\n            const aIndex = a.pinPosition != 'FloatingRecord' ? a.rowIndex : floatingRowNode.getIndex();\n            const bIndex = b.pinPosition != 'FloatingRecord' ? b.rowIndex : floatingRowNode.getIndex();\n            return bIndex-aIndex;\n    \n        }); //since no group\n\n\t\tsourceIndexMetas.forEach(({rowIndex, pinPosition = this.rowPinPosition})=>{\t\n            const currentIndex = pinPosition != 'FloatingRecord' ? rowIndex : floatingRowNode.getIndex();\n            const height = this.getHeight(currentIndex);\n            const id     = this.getIdByIndex(currentIndex);\n\t\t\tcurrentIndex < currentTargetIndex && currentTargetIndex--;\n\t\t\theights.unshift(height);\n            insertIds.unshift(id);\n            sourceIndexes.unshift(currentIndex);\n            this.rowAxis.deleteRow(currentIndex);\n\t\t});\n\n\t\tcurrentTargetIndex = movePosition === 'after' ? currentTargetIndex + 1  : currentTargetIndex;\n\n        this.cacheBlockHandler.deleteRowsAtIndexes(sourceIndexes);\n        let newInsertHeights = [];\n        initialIds.forEach((_id, index)=>{\n            //reorder the insertIds based on the initialIds\n            const initialId = initialIds[index];\n            const initialIndex = initialIds.indexOf(initialId);\n            newInsertHeights.push(heights[initialIndex]);\n        });\n\n\n        this.cacheBlockHandler.insertRowsAtIndexes([{index :currentTargetIndex, insertIds : initialIds}]);\n        heights.forEach(rowHeight=>this.rowAxis.insertRow(currentTargetIndex, rowHeight));\n    }\n    \n    insertRowsAtIndexes(rowInsertMetas: IRowBlockRowInsertMeta[], insertPosition: MovePosition): void {\n\t\trowInsertMetas.sort((a, b)=>a.rowIndex-b.rowIndex);\n        const lastIndex = rowInsertMetas.length-1;\n        const cacheBlockInsertMeta : IInsertRowMeta= [];\n\n        let relativeInsertCount = 0;\n        for(let i = 0; i <= lastIndex; i++){\t//no need to maintain currentIndex since iterating reverse\n            // const {rowDefinition = [], rowData = [], count = 1} = rowInsertMetas[i];\n            const currentInsertMeta = rowInsertMetas[i];\n            const rowData           = currentInsertMeta.rowData ?? [];\n            const count             = currentInsertMeta.count ?? 1;\n            const rowDefinition     = currentInsertMeta.rowDefinition ?? [];\n\n\n            const insertPositionAdder = insertPosition === 'after' ? 1 : 0;\n            const rowIndex            = currentInsertMeta.rowIndex + insertPositionAdder;\n            const insertIds           = [];\n\n            for(let loopIndex = 0; loopIndex < count; loopIndex++){\n                const data        = rowData[loopIndex];\n                const isLoaded    = !!data;\n                const insertIndex = rowIndex + relativeInsertCount;\n                let   height      = this.optionHandler.getRowHeights({ rowIndex : rowIndex, loaded : false });\n                relativeInsertCount++;\n                if(data){\n                    const insertRowDefinition             = rowDefinition[loopIndex] ?? this.fetchRowDefinition(insertIndex, [], data, !isLoaded);\n                    let id                              = this.generateRowId(rowIndex, insertRowDefinition);\n                    while(insertIds.includes(id)){\n                        id = this.generateRowId(rowIndex, insertRowDefinition);\n                    }\n                    const rowNode                         = this.createRowNode(id, data, insertRowDefinition);\n                          height                          = this.fetchHeight(rowIndex, rowNode);\n                    this.rowNodeHolder.set(id, rowNode);\n                    insertIds.push(id);\n                }\n                else{\n                    insertIds.push(null);\n                }\n                this.rowAxis.insertRow(insertIndex, height);\n            }\n            cacheBlockInsertMeta.push({ index : rowIndex, insertIds});\n        }\n        this.cacheBlockHandler.insertRowsAtIndexes(cacheBlockInsertMeta);\n        const rowCount = this.getRowCount();\n        this.rootNode.setDirectChildrenCount(rowCount);\n    }\n    removeRows(rowDeleteMetas : IRowBlockRowDeleteMeta[]): void {\n        const indexes = rowDeleteMetas.map(({rowIndex})=>rowIndex).sort((a, b)=>a-b);\n        const lastIndex = indexes.length-1;\n        for(let i = lastIndex; i >= 0; i--){\t//no need to maintain currentIndex since iterating reverse\n            const index = indexes[i];\n            this.deleteAbsoluteRow(index);\n        }\n        this.cacheBlockHandler.deleteRowsAtIndexes(indexes);\n\n        this.rootNode.setDirectChildrenCount(this.getRowCount());\n    }\n    deleteAbsoluteRow(index: number): void {\n        const id = this.getIdByIndex(index);\n        this.rowAxis.deleteRow(index);\n        this.rowNodeHolder.delete(id);\n    }\n    createRowNode(id: string, data: IJson, definition: IRowDefinition, isLoaded: boolean = true): IRowNodeCore {\n        const RowNodeClass = this.classRegistry.getRowNode();\n\t\tconst rowNode = new RowNodeClass( this.rowNodeHelper, id, {...definition, pinPosition : this.rowPinPosition}, data );\n        rowNode.updateLoaded(isLoaded);\n\t\treturn rowNode;\n    }\n    insertRowNode(_index: number, _groupkeys: IGroupKeys, _rownode: any): void {\n        \n    }\n    hideRow(index: number): void {\n        this.rowAxis.hideRow(index);\n    }\n    showRow(index: number): void {\n        this.rowAxis.showRow(index);\n    }\n    isRowHidden(index: number): boolean {\n        return this.rowAxis.isRowHidden(index);\n    } \n    getDisplayIndexByPosition(top: number, left?: number) : number {\n        return this.rowAxis.getDisplayIndexByPosition(top, left);\n    }\n\n    getRowNodeByVisibleIndex(index: number): any {\n\t\tif (index > -1) {\n\t\t\tconst id = this.getIdByVisibleIndex(index);\n\t\t\treturn this.rowNodeHolder.get(id);\n\t\t}\n\t}\n\n    getIdByVisibleIndex(visibleIndex: number): string {\n\t\tif (visibleIndex > -1) {\n\t\t\tconst actualIndex = this.rowAxis.convertToActualIndex(visibleIndex);\n\t\t\treturn this.getIdByIndex(actualIndex); \n\t\t}\n\t\treturn null;\n\t} \n\n\n    resetSort(): void {\n        \n    }\n    applySort(_sortKeys: any): void {\n        \n    }\n    resetFilter(): void {\n        \n    }\n    applyFilter(_filterKeys: any): void {\n        \n    }\n    resetRowGrouping(): void {\n        \n    }\n    applyGroupBy(_groupModel: any): void {\n        \n    }\n\n    resetRowCaches(rowCount ?: number): void {\n        this.cacheBlockHandler.destroy(rowCount);\n        this.rowAxis.resetRows();\n        this.draftRowHandler?.resetDraftRows();\n        this.constructData(rowCount);\n    }\n\n\n    getParentNode(_parentKeys: any): IGroupedRowNodeCore {\n        return null;\n    }\n\n    getAncestorNode(_parentKeys: any): IGroupedRowNodeCore[] {\n        return null;\n    }\n\n    getRowsInDataCache(): number[] {\n        return this.cacheBlockHandler.getAllCachedRows();\n    }\n\n    parseFromDraftIndex(draftIndex: number, pinPosition ?: rowPinPositions): IRowMeta {\n\t\tconst hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n        return hasDraftRows ? this.draftRowHandler.parseFromDraftIndex(draftIndex, pinPosition) : null;\n    }\n\n    parseToDraftIndex(index : number, pinPosition : rowPinPositions = this.rowPinPosition) : number {\n        const hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n        return hasDraftRows ? this.draftRowHandler.parseToDraftIndex(index, pinPosition) : index;\n    }\n\n    insertDraftRows(): void {\n        const hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n        if (hasDraftRows) {\n            this.draftRowHandler.insertDraftRows('topDraftRow', this.optionsHandler.getTopDraftRowCount());\n            this.draftRowHandler.insertDraftRows('bottomDraftRow', this.optionsHandler.getBottomDraftRowCount());\n        }\n        this.dispatchEvent({\n            type       : 'RECORD_INSERT',\n            recycleRows : true\n        });\n    }\n\n    removeDraftRows(rowIDs : string[]): void {\n        const hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n        if (hasDraftRows) {\n            this.draftRowHandler.removeDraftRows(rowIDs);\n        }\n    }\n\n    isDraftRow(rowId: string): boolean {\n        const hasDraftRows = this.draftRowHandler !== undefined && this.draftRowHandler !== null;\n        return hasDraftRows ? this.draftRowHandler.isDraftRow(rowId) : false;\n    }\n\n    getAbsoluteIndex(index: number, _parentKeys?: IGroupKeys, pinPosition ?: rowPinPositions): number {\n        if(pinPosition == 'topDraftRow' || pinPosition == 'bottomDraftRow'){\n            return this.parseToDraftIndex(index, pinPosition);\n        }\n        const rootNode = this.getRootNode();\n        const includeDraftRows = false;\n        const lastIndex = includeDraftRows ? this.getRowCount() - 1 : this.getRowCount() - rootNode.getTotalDraftCount() - 1;\n        if(index > lastIndex){\n            return null;\n        }\n        return super.getAbsoluteIndex(index, _parentKeys);\n    }\n\n    getLastRow(_parentId?: string, includeDraftRows?: boolean): number {\n        const lastRow = this.getRowCount() - 1;\n        if(!includeDraftRows){\n            const bottomDraftRows = this.draftRowHandler.getBottomDraftRows();\n            return lastRow - bottomDraftRows.length;\n        }\n        return lastRow;\n    }\n\n    getFirstRow(includeDraftRows?: boolean): number {\n        if(!includeDraftRows){\n            const topDraftRows = this.draftRowHandler.getTopDraftRows();\n            return topDraftRows.length;\n        }\n        return 0;\n    }\n\n    refreshDraftRows() : void {\n        const draftRowIds = [...this.draftRowHandler.getTopDraftRows(), ...this.draftRowHandler.getBottomDraftRows()];\n\n        draftRowIds.forEach(rowId=>{\n            const rowNode = this.rowNodeHolder.get(rowId);\n            const rowMeta = rowNode.getRowMeta();\n            const definition = this.fetchRowDefinition(rowMeta.rowIndex, rowMeta.parentKeys, {}, false, rowMeta.pinPosition) as IDraftRowDefinition;\n            const draftData = definition?.draftData ?? {};\n            rowNode.updateDefinition(definition);\n            rowNode.updateRowData(draftData);\n        });\n    }\n}","import { AutoWired, BEAN_NAME, PostConstruct } from '@dg/corecomponent';\nimport { IBlockConfigs, IViewport } from '../../../Sub_Components/src/CacheBlockHandler/Interface';\nimport { IDraftRowDefinition, IRowDefinition, IRowDefinitions, IRowHeightFetcher } from '../../Grid/Core/Interface/IRowDefinitions';\nimport { IGroupKeys, IGroupModel } from '../../Grid/Core/Interface/IRowGroupingConfigurations';\nimport { ITreeStructureData } from '../../Grid/Core/Interface/IGridConfiguration';\nimport { IJson, MovePosition, IRowNodeHelper } from '../../Grid/Main';\nimport { IGroupedRowNodeConstructor, IGroupedRowNodeCore } from '../group-rownode.types';\nimport { IGroupedRowNodeHelper } from '../IGroupedRowNode';\nimport { RowBlockCommon } from '../RowBlockCommon';\nimport { IRowNodeCore } from '../rownode.types';\nimport { IRemoteBlockHandler } from './remote-rowblock-handler.types';\nimport { rowPinPositions } from '../../Grid/Core/Constants/GridConfigurationConstants';\nimport { Events } from '../../Grid/Core/Constants/Events';\nimport { GRID_BEAN_NAME } from '../../Grid/Core/Constants/BeanName';\nimport { IGridBeanClassRegistry } from '../../Grid/Core/grid-beanclass-registry.types';\nimport { RemoteCacheBlock } from './RemoteCacheBlock';\nimport { IRemoteCacheBlock } from './IRemoteCacheBlock.types';\nimport { IRowAxisConstructor } from '../RowAxis/rowAxis.types';\nimport { IGroupedRowAxis } from '../RowAxis/grouped-rowAxis.types';\nimport { IBlockInsertMeta, IDraftPosition, IRowBlockRowDeleteMeta, IRowBlockRowInsertMeta } from '../rowblock-handler.types';\nimport { IRowMeta } from '../../Grid/API/CommonAPIInterface';\nimport { GanttController } from '../../GanttModelClasses/Core/GanttComponent/GanttController';\nimport { GRID_CLASS_NAMES } from '../../Grid/Core/Constants/CSSClassNameContants';\n\nconst cacheIdSpliter = '__';\n\n\nexport class TreeGridRemoteDataBlock extends RowBlockCommon implements IRemoteBlockHandler {\n\tstatic ROOT_ID = `${'dataGrid-'.repeat(2)}root`;\n\n    \n    private cacheBlockHolder   : Record<string, IRemoteCacheBlock>;\n    private rowNodeHelper      : IRowNodeHelper;\n    private groupRowNodeHelper : IGroupedRowNodeHelper;\n    \n\t@AutoWired(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY) classRegistry !: IGridBeanClassRegistry;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionalHandler;\n    @AutoWired(GRID_BEAN_NAME.GRID_EVENTS) private gridEvents;\n\n    private heightFetcher     : IRowHeightFetcher;\n    private definitionFetcher : IRowDefinitions;\n    private cacheBlockOrder   : string[];\n    private RowAxisClass      : IRowAxisConstructor;\n    public  rowAxis           : IGroupedRowAxis;\n    public  defaultConfig     : any;\n    private rootNode          : IGroupedRowNodeCore;\n    rootBlock: RemoteCacheBlock;\n\n    private draftRowMap: Record<string, IGroupedRowNodeCore> = {};\n\n    constructor(rowPinPosition: rowPinPositions, heightFetcher: IRowHeightFetcher, definitionFetcher: IRowDefinitions, cacheBlockConfig: Partial<IBlockConfigs>, RowAxisClass : IRowAxisConstructor ) {\n\t\tsuper();\n        this.rowPinPosition    = rowPinPosition;\n        this.heightFetcher     = heightFetcher;\n        this.definitionFetcher = definitionFetcher;\n\n        this.cacheBlockHolder = {};\n        this.cacheBlockOrder  = [];\n        this.RowAxisClass     = RowAxisClass;\n        this.defaultConfig    = cacheBlockConfig;\n\n    }\n    \n    getChildCount(index: number, parentKeys: string[]): number {\n        const absoluteIndex = this.getAbsoluteIndex(index, parentKeys);\n        const rowNode       = this.getRowNode(absoluteIndex);\n        return this.getChildrenNodes(rowNode, this.groupModel.length).length;\n    }\n    \n    @PostConstruct()\n    init() {\n        this.createRowNodeHelper();\n\n        // Initialize row axis\n        this.rowAxis = this.createManagedBean(new this.RowAxisClass()) as IGroupedRowAxis;\n    } \n\n    constructData() {\n        const totalRows     = this.defaultConfig.rowCount;\n        const rootId        = TreeGridRemoteDataBlock.ROOT_ID;\n        const isLeafGroup   = totalRows === 0;\n\n        this.rootNode = this.createGroupRowNode(rootId, null, null, {expand : true, childrenCount : totalRows}, isLeafGroup);\n        this.rootNode.setGroupMeta([]);\n        this.rowNodeHolder.set(rootId, this.rootNode);\n\n        const hasFullTreeStructure = this.optionalHandler.hasFullTreeStructureProvided();\n        \n        if (hasFullTreeStructure) {\n            this.initWithFullTreeStructure();\n        } else {\n            this.initWithRowCount();\n        }\n    }\n\n    private initWithRowCount(): void {\n        const rootId            = TreeGridRemoteDataBlock.ROOT_ID;\n        const config            = this.getBlockConfigs(rootId);\n              this.rootBlock    = new RemoteCacheBlock(rootId, config);\n        this.rootBlock.setRelativeIndex(0);\n        this.cacheBlockHolder[rootId] = this.rootBlock;\n\n        const totalRows      = this.defaultConfig.rowCount;\n        const rowPinPosition = this.getPinPosition();\n        const parentKeys     = null;\n\n        for (let rowIndex = 0; rowIndex < totalRows; rowIndex++) {\n            const blockAxis = this.rowAxis.createBlock(this.defaultConfig);\n            this.rowAxis.insertBlock(blockAxis, null, rowIndex);\n            blockAxis.appendRow(this.heightFetcher({rowIndex, rowPinPosition, parentKeys}));\n        }\n        this.rowAxis.updateRelativeValues();\n\n        const metaArr = [];\n        for (let i = 0; i < this.rootBlock.getRowCount(); i++) {\n            const meta = this.encodeCacheBlockId(rootId, i);\n            metaArr.push(meta);\n        }\n        this.cacheBlockOrder.splice(this.rootBlock.getRelativeIndex(), 0, ...metaArr);\n    }\n\n    private initWithFullTreeStructure(): void {\n        const treeStructureData = this.optionalHandler.getTreeStructureData() as ITreeStructureData[];\n        \n        if (!treeStructureData || !Array.isArray(treeStructureData) || treeStructureData.length === 0) {\n            console.warn('TreeGridRemoteDataBlock: treeStructureData not provided, falling back to rowCount');\n            this.initWithRowCount();\n            return;\n        }\n\n        const rootId            = TreeGridRemoteDataBlock.ROOT_ID;\n        const config            = {\n            ...this.getBlockConfigs(rootId),\n            blockCount : Infinity,\n            blockSize  : 50,\n            fetchCallback : ({onSuccess, startRowIndex, endRowIndex})=>{\n                onSuccess({\n                    data: treeStructureData.slice(startRowIndex, endRowIndex + 1)\n                });\n            }\n        };\n        this.rootBlock    = new RemoteCacheBlock(rootId, config);\n        this.rootBlock.setRelativeIndex(0);\n        this.cacheBlockHolder[rootId] = this.rootBlock;\n        \n        // Track absolute index for row axis insertion\n        let absoluteIndex = -1;\n        const expandableRows = [];\n     \n        const processTreeNodes = ( nodes: ITreeStructureData[], parentId : string,  parentBlockId: string, parentKeys: string[], hasParentCollapsed: boolean): void => {\n            const isRootId = parentId == rootId;\n            nodes.forEach((node, localIndex) => {\n                absoluteIndex++;\n                // const nodeKey     = node.key;  //temporary for tables\n                const children    = node.children;\n                const hasChildren = children && children.length > 0;\n                const rowCount    = node.rowCount;\n                \n                const height = this.heightFetcher({\n                    rowIndex       : localIndex,\n                    rowPinPosition : this.getPinPosition(),\n                    parentKeys     : parentKeys\n                });\n                if(isRootId){\n                    const blockAxis = this.rowAxis.createBlock(this.defaultConfig);\n                    this.rowAxis.insertBlock(blockAxis, null, absoluteIndex);\n                    blockAxis.appendRow(height);\n                }\n\n                const parentBlock = this.cacheBlockHolder[parentBlockId];\n                const meta = this.encodeCacheBlockId(parentBlockId, localIndex);\n                isRootId &&  this.cacheBlockOrder.push(meta);\n\n                const isLastLevel = !hasChildren;\n                const hasRowCount = rowCount != undefined;\n                if(hasChildren || hasRowCount){\n                    const nodeId           = parentBlock.getIdByIndex(localIndex);\n                    const childConfig      = this.getBlockConfigs(nodeId);\n                    \n                    childConfig.rowCount   = isLastLevel ? rowCount : node.children.length;\n                    if(!isLastLevel){\n                        childConfig.blockCount = Infinity;\n                        childConfig.blockSize  = 50;\n                        childConfig.fetchCallback = ({onSuccess, startRowIndex, endRowIndex})=>{\n                            onSuccess({\n                                data: node.children.slice(startRowIndex, endRowIndex + 1)\n                            });\n                        }\n                    }\n                    else{\n                        const rowNode = this.getRowNodeById(nodeId) as IGroupedRowNodeCore;\n                        rowNode.setIsLeafGroup(true);\n                    }\n\n                    const childBlock = new RemoteCacheBlock(nodeId, childConfig);\n                    childBlock.setRelativeIndex(absoluteIndex);\n                    !isLastLevel && childBlock.updateViewPort({startRow: 0, endRow: childBlock.getRowCount() - 1});\n                    this.cacheBlockHolder[nodeId] = childBlock;\n\n                    const hasCollapsed = hasParentCollapsed || !node.expanded;\n                    if(hasCollapsed){\n                        const groupRow = this.getRowNodeById(nodeId) as IGroupedRowNodeCore;\n                        groupRow.setChildrenCollapsed(true);\n                    } else {\n                        expandableRows.push(nodeId);\n                    }\n\n                    // Recurse into children\n                    const nodeKey = nodeId;\n                    const childParentKeys = [...parentKeys, nodeKey];\n                    !isLastLevel && processTreeNodes(node.children, nodeId, nodeId, childParentKeys, hasCollapsed);\n                }\n            });\n        };\n\n        this.rootBlock.updateViewPort({startRow: 0, endRow: treeStructureData.length - 1});\n\n        // Process the tree starting from root level\n        const hasParentCollapsed = false;\n        const rootNode = this.getRowNodeById(rootId) as IGroupedRowNodeCore;\n        rootNode.setChildrenCollapsed(false);\n        processTreeNodes(treeStructureData, rootId, rootId, [], hasParentCollapsed);\n\n        // Finalize row axis calculations\n        this.rowAxis.updateRelativeValues();\n\n        // Update root node with direct children count\n        this.rootNode.setDirectChildrenCount(treeStructureData.length);\n\n        expandableRows.forEach((rowId) => {\n            const rowNode = this.getRowNodeById(rowId) as IGroupedRowNodeCore;\n            rowNode.updateCollapseState(true);\n            rowNode?.expand();\n        })\n\n\n        this.nullifyAllMargins();\n        this.addGroupTopBottomMargins(rootId);\n        this.rowAxis.updateRelativeValues();\n    }\n\n    addMarginBasedOnLevel(absoluteIndex : number) : void {\n        const iterateTillNotLastElement = (index : number) => {\n\n            const {blockId, index : localIndex} = this.decodeCacheBlockId(this.cacheBlockOrder[index]);\n            const block = this.cacheBlockHolder[blockId];\n            const parentRowNode = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n            const isLastInParent = localIndex === block.getRowCount() - 1;\n            if(!isLastInParent){\n                return;\n            }\n            margin += this.optionalHandler.getTreeLevelBottomMargins(parentRowNode.getLevel());\n            const parentIndex = this.getIndexById(blockId);\n            if(blockId == TreeGridRemoteDataBlock.ROOT_ID){\n                return;\n            }\n            iterateTillNotLastElement(parentIndex);\n        }\n\n        const rowNode = this.getRowNode(absoluteIndex);\n        let   margin  = rowNode?.isGroupRow?.() ? this.optionalHandler.getTreeLevelBottomMargins(rowNode.getLevel()) : 0;\n\n        iterateTillNotLastElement(absoluteIndex);\n        \n        const axisBlock = this.rowAxis.getBlockByIndex(absoluteIndex);\n        axisBlock.updateBottomMargin(margin);\n    }\n\n    private addGroupTopBottomMargins(blockId: string, existingMargin : number = 0): void {\n        const block = this.cacheBlockHolder[blockId];\n        const rowNode = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n        const subtreeNotMounted = rowNode.isCollapsed() || rowNode.isChildrenCollapsed();\n        if(blockId != TreeGridRemoteDataBlock.ROOT_ID){\n            let firstRowIndex, lastRowIndex;\n            const level = rowNode.getLevel();\n            if(subtreeNotMounted){\n                firstRowIndex = rowNode.getIndex();\n                lastRowIndex = firstRowIndex;\n            }\n            else{\n                const includeDraftRows =  true;\n                firstRowIndex = rowNode.getIndex();\n                if(rowNode.getChildCount(includeDraftRows) == 0){\n                    lastRowIndex = firstRowIndex;\n                }\n                else{\n                    const includeDraftRows =  true;\n                    lastRowIndex = this.getLastRowInGroup(blockId, includeDraftRows);\n                }\n            }\n            const firstAxisBlock = this.rowAxis.getBlockByIndex(firstRowIndex);\n            const topMargin = this.optionalHandler.getTreeLevelTopMargins(level);\n            firstAxisBlock.updateTopMargin(topMargin);\n\n            if(lastRowIndex === -1){\n                return;\n            }\n            const lastAxisBlock = this.rowAxis.getBlockByIndex(lastRowIndex);\n            const bottomMargin = this.optionalHandler.getTreeLevelBottomMargins(level);\n            existingMargin += bottomMargin;\n            lastAxisBlock.updateBottomMargin(existingMargin);\n        }\n        !subtreeNotMounted && !rowNode.isLeafGroup() && block.forEach((id, localIndex)=>{\n            const isLastIndex = localIndex === block.getRowCount() - 1;\n            isLastIndex ? this.addGroupTopBottomMargins(id, existingMargin) : this.addGroupTopBottomMargins(id, 0);\n        })\n    }\n\n    private nullifyAllMargins(): void {\n        this.rowAxis.nullifyAllMargins();\n    } \n\n    private encodeCacheBlockId(blockId : string, index : number) : string{\n        return `${index}${cacheIdSpliter}${blockId}`;\n    }\n\n    private decodeCacheBlockId(id : string) : {blockId : string, index : number, pinPosition: rowPinPositions} {\n        const isDraftRow = this.isDraftRow(id);\n        if(isDraftRow){\n            const { index, parentNode, pinPosition } = this.decodeDraftRowId(id);\n            return {\n                index      : index,\n                blockId    : parentNode.getId(),\n                pinPosition: pinPosition\n            }\n        }\n        const indexOf = id.indexOf(cacheIdSpliter);\n        return {\n            index      : Number(id.slice(0, indexOf)),\n            blockId    : id.slice(indexOf + cacheIdSpliter.length),\n            pinPosition: this.getPinPosition()\n        }\n    }\n    \n\n    private getBlockConfigs(parentId : string) : IBlockConfigs {\n        const rootRowCountFetcher = this.optionalHandler.getRootRowCount();\n        const rowNodeHelper       = this.rowNodeHelper;\n        const parentNode          = rowNodeHelper.getRowNodeById(parentId);\n        const deleteBlock         = (ids)=>ids.forEach(id=>{\n            const block = this.cacheBlockHolder[id];\n            if(block) {\n                block.destroy();\n            }\n            this.rowNodeHolder.delete(id) \n        });\n        const defaultConfig       = {...{}, ...this.defaultConfig}\n        defaultConfig.fetchParam = {...defaultConfig.fetchParam, ...{\n            get parentKeys(){ \n                const parentNode = rowNodeHelper.getRowNodeById(parentId);\n                return parentNode?.getGroupValues() ?? [];\n            }\n        }};\n\n        const self = this;\n        \n        // For full tree structure, rowCount will be overridden after this call\n        // So use 0 as fallback when parentNode doesn't exist yet\n        const getRowCount = () => {\n            if (parentId === TreeGridRemoteDataBlock.ROOT_ID) {\n                return rootRowCountFetcher();\n            }\n            return parentNode?.getDirectChildrenCount() ?? 0;\n        };\n\n        return {\n            ...(defaultConfig),\n            getId : ({index}) => this.generateRowId(index),\n            rowCount : getRowCount(),\n            onBeforeBlockAdd : (hookArgs)=>{\n                const hasFullTreeStructure = this.optionalHandler.hasFullTreeStructureProvided();\n                const newIds = [];\n                let {prevIds, ids, data, isLoaded, startIndex} = hookArgs\n                const parentNode      = this.rowNodeHelper.getRowNodeById(parentId);\n                const parentGroupMeta = parentNode?.getGroupValues();\n\n                prevIds && deleteBlock(prevIds);\n                ids.forEach((id, index)=>{\n                    const rowData          = data[index] ?? {};\n                    const rowDefinition    = this.fetchRowDefinition((index + startIndex), parentGroupMeta, rowData, !isLoaded);\n                    id               = this.generateRowId(index, rowDefinition);\n                    if(hasFullTreeStructure){\n                        let prioritizeChildrenKey = true;\n                        const children = rowData.children;\n                        const rowCount = rowData.rowCount;\n\n                        \n                        if(!(children && children.length > 0)){    //rowCount prioritized when children length is zero for tables first cut as karthee bro instructed even though its wrong\n                            prioritizeChildrenKey = false;\n                        } \n                        rowDefinition.expandableRow = prioritizeChildrenKey ? children !== undefined : rowCount !== undefined; \n                        // rowDefinition.expandableRowKey = rowData.key;    //commented temporarily for tables\n                        rowDefinition.expandableRowKey = id;\n                        rowDefinition.childrenCount    = prioritizeChildrenKey ? children?.length : rowCount;\n                        rowDefinition.expand           = rowData?.expanded;\n                    }\n                    const isExpandable     = rowDefinition?.expandableRow;\n                    const expandableRowKey = rowDefinition?.expandableRowKey;\n                    newIds.push(id);\n                    let rowNode;\n                    if(isExpandable) {\n                        const groupMeta = parentNode.getGroupMeta().slice();\n                        groupMeta.push({branchKey : expandableRowKey});\n                        rowNode = this.createGroupRowNode(id, parentId, rowData, rowDefinition);\n                        rowNode.setGroupMeta(groupMeta);\n                    }\n                    else{\n                        rowNode = this.createRowNode(id, rowData, rowDefinition);\n                    }\n                    rowNode.setParentId(parentId);\n                    rowNode.updateLevel(parentNode.getLevel() + 1);\n                    rowNode.updateLoaded(isLoaded);\n                    this.rowNodeHolder.set(id, rowNode);\n                });\n                this.dispatchEvent({\n                    type       : Events.EVENT_ROW_DATA_LOADED,\n                    recycleRows: true,\n                    onlyBody   : true,\n                    floating   : true\n                });\n                return {...hookArgs, ids: newIds};\n            },\n            onAfterBlockAdd(param) {\n                const hasFullTreeStructure = self.optionalHandler.hasFullTreeStructureProvided();   //full tree structure is provided expansion state will be handled in constructData\n                if(!hasFullTreeStructure){\n                    param.ids.forEach((id) => {\n                        const rowNode = self.getRowNodeById(id) as IGroupedRowNodeCore;\n                        if(rowNode.isExpandable() && !rowNode.isCollapsed()) {\n                            rowNode.expand({recursive : true});\n                        }\n                    })\n                }\n            },\n            onAfterBlockDelete : ({ids}) => deleteBlock(ids)\n        } as IBlockConfigs;\n    }\n\n    private createRowNodeHelper() : void {\n        const viewType = this.optionalHandler.getViewType();\n        let isEndDatePrioritizedForMilestone = false;\n        let isFlexibleMilestone = false;\n        if(viewType === 'gantt'){\n\t\t\tconst GanttContext = GanttController.getGanttBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\t\t isEndDatePrioritizedForMilestone = GanttContext?.isEndDatePrioritizedForMilestone() ?? false;\n\t\t\t isFlexibleMilestone = GanttContext?.isFlexibleMilestone() ?? false;\n\t\t}\n\n        this.rowNodeHelper = {\n            isExtraRow              : () => false,\n            getTop                  : (index: number) => this.getTop(index),\n            getHeight               : (index: number) => this.getHeight(index),\n            getIndexById            : (id: string) \t=> this.getIndexById(id),\n            setHeight               : (index: number, height: number) => this.setHeight(index, height),\n            getLeft                 : (index: number) => this.getLeft(index),\n            getWidth                : (index: number) => this.getWidth(index),\n            hide                    : (index: number) => this.hideRow(index),\n            show                    : (index: number) => this.showRow(index),\n            getRowNodeById          : (id: string) => this.getRowNodeById(id) as any,\n            dispatchRowHeightChange : (_rowNodes: any) => null,\n            getUpcomingRowNodes     : (_index: number) => null,\n            getRootNode             : () => this.getRootNode(),\n            getRelativeRowMeta      : (absoluteIndex)=>this.getRelativeRowMeta(absoluteIndex),\n            onDataUpdate            : ()=>{},\n            isEndDatePrioritizedForMilestone : () => isEndDatePrioritizedForMilestone,\n            isFlexibleMilestone             : () => isFlexibleMilestone,\n            getGroupHeight                : (id: string) => this.getGroupHeight(id),\n        }\n        this.groupRowNodeHelper = {\n            getGroupModel      : () =>this.groupModel,\n            expand             : (groupRowNode : IGroupedRowNodeCore, params )  =>this.expand(groupRowNode, params),\n            collapse           : (groupRowNode : IGroupedRowNodeCore, recursive ?: boolean) =>this.collapse(groupRowNode, recursive),\n            getAllRowNodes     : () =>this.getAllRowNodes(),\n            getFirstRowInGroup : (id : string) => this.getFirstRowInGroup(id),\n            getLastRowInGroup  : (id : string) => this.getLastRowInGroup(id),\n            getChildIndexById  : (parentId: string, id: string) => this.getChildIndexById(parentId, id),\n\n            ...this.rowNodeHelper\n        }\n    }\n\n    getDirectFirstChild(groupRowId : string) : number {\n        const blockMeta = this.encodeCacheBlockId(groupRowId, 0);\n        return this.cacheBlockOrder.indexOf(blockMeta);\n    }\n\n    getDirectLastChild(groupRowId : string) : number {\n        const block = this.cacheBlockHolder[groupRowId];\n        const blockMeta = this.encodeCacheBlockId(groupRowId, block.getRowCount() - 1);\n        return this.cacheBlockOrder.indexOf(blockMeta);\n    }\n\n    getGroupHeight(id: string): number {\n        const includeDraftRows = true;\n        const firstRow = this.getRowNodeById(id);\n        const groupRow = firstRow as IGroupedRowNodeCore;\n        const subtreeNotMounted = firstRow.isCollapsed() || (groupRow?.isGroupRow?.() && groupRow.isChildrenCollapsed());\n        if (subtreeNotMounted) {\n            return firstRow.getHeight();\n        }\n        const lastRowIndex = this.getLastRowInGroup(id, includeDraftRows);\n        if (lastRowIndex === -1) {\n            return firstRow.getHeight();\n        }\n        const {blockId : lastRowBlockId} = this.decodeCacheBlockId(this.cacheBlockOrder[lastRowIndex]);\n        const lastRowParentNode = this.getRowNodeById(lastRowBlockId) as IGroupedRowNodeCore;\n        const marginLastLoopLevel = lastRowParentNode.isLeafGroup() ? lastRowParentNode.getLevel() : lastRowParentNode.getLevel() + 1;\n        const firstRowTop   = firstRow.getTop();\n        const lastRowTop    = this.getTop(lastRowIndex);\n        const lastRowHeight = this.getHeight(lastRowIndex);\n        let bottomMargin = 0;\n        for(let i = firstRow.getLevel() + 1; i <= marginLastLoopLevel; i++){\n            bottomMargin += this.optionalHandler.getTreeLevelBottomMargins(i);\n        }\n        return lastRowTop - firstRowTop + lastRowHeight + bottomMargin;\n    }\n    \n    getLastRowInGroup(id: string, includeDraftRows : boolean = false): number {\n        if(id === TreeGridRemoteDataBlock.ROOT_ID){\n            if (includeDraftRows) {\n                return this.cacheBlockOrder.length - 1;\n            }\n            for (let index = this.cacheBlockOrder.length - 1; index >= 0; index--) {\n                const { pinPosition } = this.decodeCacheBlockId(this.cacheBlockOrder[index]);\n                const isDraftRow = pinPosition === 'topDraftRow' || pinPosition === 'bottomDraftRow';\n                if (!isDraftRow) {\n                    return index;\n                }\n            }\n            return -1;\n        }\n        const index           = this.getIndexById(id);\n        if(index == -1){\n            return -1;\n        }\n        if(index >= this.cacheBlockOrder.length -1){\n            return -1;\n        }\n        const currentBlockMeta = this.cacheBlockOrder[index];\n        const {blockId : currentBlockId, index : currentLocalIndex} = this.decodeCacheBlockId(currentBlockMeta);\n\n        const nextSiblingBlockMeta = this.encodeCacheBlockId(currentBlockId, currentLocalIndex + 1);\n        const nextSiblingIndex = this.cacheBlockOrder.indexOf(nextSiblingBlockMeta);\n\n        if(nextSiblingIndex - 1 == index){\n            return -1;\n        }\n        else if(nextSiblingIndex !== -1){\n            return nextSiblingIndex - 1;\n        }\n        \n        const NextgroupIdMeta = this.cacheBlockOrder[index+1];\n        const {blockId}       = this.decodeCacheBlockId(NextgroupIdMeta);\n        if(blockId === id){ //parent is expanded\n            const rowNode = this.getRowNodeById(id) as IGroupedRowNodeCore;\n            const block = this.cacheBlockHolder[id];\n            if(rowNode.isLeafGroup()){\n                if(rowNode.hasDraftRows() && includeDraftRows){\n                    const lastDraftRow = rowNode.getLastDraftRow();\n                    return this.getIndexById(lastDraftRow);\n                }\n                return rowNode.getIndex() + block.getRowCount();\n            }\n            const lastRowIndex = block.getRowCount() - 1;\n            const lastRowId = block.getIdByIndex(lastRowIndex);\n            const lastRow = this.getLastRowInGroup(lastRowId, includeDraftRows);\n            return lastRow === -1 ? this.getIndexById(lastRowId) : lastRow;\n        }\n        return this.getIndexById(id);\n    }\n\n    getFirstRowInGroup(id: string): number {\n        const index = this.getIndexById(id);\n        const NextgroupIdMeta = this.cacheBlockOrder[index+1];\n        const {blockId} = this.decodeCacheBlockId(NextgroupIdMeta);\n        if(blockId === id){\n            return null\n        }\n        return index + 1;\n    }\n\n    private hasCacheBlock(id: string) : boolean {\n        return this.cacheBlockHolder[id] !== undefined;\n    }\n\n    private deleteCacheBlock(id: string) : void {\n        delete this.cacheBlockHolder[id];\n    }\n\n    getChildrenNodes(parentNode: IGroupedRowNodeCore, level: number) : IGroupedRowNodeCore[] {\n        const isGroupingApplied = this.isRowGroupingApplied();\n        if(!isGroupingApplied) {\n            return [null];\n        }\n        const leafLevel   = this.groupModel.length + 1;\n        const allChildren = parentNode.getAllChildren() as IGroupedRowNodeCore[];\n        return allChildren.filter(node => (node?.getLevel?.() ?? leafLevel) == level);\n    }\n\n    getLeafChildrenExcludingCollapsed(startRowMeta : IRowMeta, endRowMeta : IRowMeta) : IRowMeta[] {\n        // const startParentKeys = startRowMeta.parentKeys;\n        // const endParentKeys = endRowMeta.parentKeys;\n        // const startBlockId = startParentKeys.length == 0 ? TreeGridRemoteDataBlock.ROOT_ID : startParentKeys[startParentKeys.length - 1];\n        // const endBlockId = endParentKeys.length == 0 ? TreeGridRemoteDataBlock.ROOT_ID : endParentKeys[endParentKeys.length - 1];\n        // const startBlockMeta = this.encodeCacheBlockId(startBlockId, startRowMeta.rowIndex);\n        // const endBlockMeta = this.encodeCacheBlockId(endBlockId, endRowMeta.rowIndex);        \n\n        // const draftPinPositions = ['topDraftRow', 'bottomDraftRow'];\n        let startBlockIndex = this.getAbsoluteIndex(startRowMeta.rowIndex, startRowMeta.parentKeys, startRowMeta.pinPosition);\n        let endBlockIndex = this.getAbsoluteIndex(endRowMeta.rowIndex, endRowMeta.parentKeys, endRowMeta.pinPosition);\n\n        let leafChildren = [];\n        for(let i = startBlockIndex; i <= endBlockIndex; i++){\n            const blockMeta = this.cacheBlockOrder[i];\n            const isDraftRow = this.isDraftRow(blockMeta);\n            let draftMeta = isDraftRow ? this.decodeDraftRowId(blockMeta) : null;\n            const pinPosition = isDraftRow ? draftMeta.pinPosition : this.rowPinPosition;\n            const {blockId, index} = isDraftRow ? {blockId: draftMeta.parentNode.getId() , index : draftMeta.index} : this.decodeCacheBlockId(blockMeta);\n            const rowNode = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n            if(rowNode.isLeafGroup()){\n                leafChildren.push({\n                    rowIndex   : index,\n                    parentKeys : rowNode.getGroupValues() ?? [],\n                    pinPosition: pinPosition\n                });\n            }\n        }\n        return leafChildren;\n    }\n\n\n    getLeafChildCountExcludingCollapsed(startRowMeta : IRowMeta, endRowMeta : IRowMeta) : number {\n        const leafChildren = this.getLeafChildrenExcludingCollapsed(startRowMeta, endRowMeta);\n        return leafChildren.length;\n    }\n\n\n    getLeafChildrenIncludingCollapsed(startRowMeta : IRowMeta, endRowMeta : IRowMeta) : IRowMeta[] {\n        const findLeafGroupRow = (blockId: string): IGroupedRowNodeCore => {\n            const rowNode = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n            if (rowNode.isLeafGroup()) {\n                return rowNode;\n            }\n            const block = this.cacheBlockHolder[blockId];\n            if (!block) return rowNode;\n            const firstChildId = block.getIdByIndex(0);\n            return findLeafGroupRow(firstChildId);\n        };\n\n        const findNextBlockId = (rowNode: IGroupedRowNodeCore): string | null => {\n            const parentBlockId = rowNode.getParentId();\n            if (!parentBlockId) {\n                return null;\n            }\n            const parentBlock = this.cacheBlockHolder[parentBlockId];\n            if (!parentBlock) return null;\n\n            const blockIndex = parentBlock.getIndexById(rowNode.getId());\n            const hasNextSibling = blockIndex < parentBlock.getRowCount() - 1;\n\n            if (hasNextSibling) {\n                return parentBlock.getIdByIndex(blockIndex + 1);\n            } else if (parentBlockId === TreeGridRemoteDataBlock.ROOT_ID) {\n                return null;\n            } else {\n                const parentRowNode = this.getRowNodeById(parentBlockId) as IGroupedRowNodeCore;\n                return findNextBlockId(parentRowNode);\n            }\n        };\n\n        let rowMetas = [];\n        const startParentKeys = startRowMeta.parentKeys;\n        const endParentKeys = endRowMeta.parentKeys;\n        let startBlockId = startParentKeys.length == 0 ? TreeGridRemoteDataBlock.ROOT_ID : startParentKeys[startParentKeys.length - 1];\n        startBlockId = findLeafGroupRow(startBlockId).getId();\n        let endBlockId = endParentKeys.length == 0 ? TreeGridRemoteDataBlock.ROOT_ID : endParentKeys[endParentKeys.length - 1];\n        endBlockId = findLeafGroupRow(endBlockId).getId();\n\n        if (startBlockId === endBlockId) {\n            const leafRowNode = this.getRowNodeById(startBlockId) as IGroupedRowNodeCore;\n            for(let i = startRowMeta.rowIndex; i <= endRowMeta.rowIndex; i++){\n                rowMetas.push({\n                    rowIndex: i,\n                    pinPosition: this.rowPinPosition,\n                    parentKeys: leafRowNode.getGroupValues()\n                });\n            }\n            return rowMetas;\n        }\n\n        let currentBlockId: string | null = startBlockId;\n        let isFirstBlock = true;\n\n        while (currentBlockId) {\n            if (currentBlockId === endBlockId) {\n                const leafRowNode = this.getRowNodeById(endBlockId) as IGroupedRowNodeCore;\n                for(let i = startRowMeta.rowIndex; i <= endRowMeta.rowIndex; i++){\n                    rowMetas.push({\n                        rowIndex: i,\n                        pinPosition: this.rowPinPosition,\n                        parentKeys: leafRowNode.getGroupValues()\n                    });\n                }\n                break;\n            }\n\n            const leafGroupRow = findLeafGroupRow(currentBlockId);\n            const loopStartIndex = isFirstBlock ? startRowMeta.rowIndex : 0;\n            if (isFirstBlock) {\n                isFirstBlock = false;\n            }\n\n            for(let i = loopStartIndex; i < leafGroupRow.getChildCount(); i++){\n                rowMetas.push({\n                    rowIndex: i,\n                    pinPosition: this.rowPinPosition,\n                    parentKeys: leafGroupRow.getGroupValues()\n                });\n            }\n\n            currentBlockId = findNextBlockId(leafGroupRow);\n        }\n\n        return rowMetas;\n    }\n\n    getLeafChildCountIncludingCollapsed(startRowMeta: IRowMeta, endRowMeta: IRowMeta): number {\n        const leafChildren = this.getLeafChildrenIncludingCollapsed(startRowMeta, endRowMeta);\n        return leafChildren.length;\n    }\n\n\n    private updateCacheBlockOrder(blockId: string) : void {\n        let existCount = 0;\n        this.cacheBlockOrder.forEach((meta, loopIndex) => {\n            if(meta.endsWith(blockId)){\n                const newMeta = this.encodeCacheBlockId(blockId, existCount);\n                this.cacheBlockOrder[loopIndex] = newMeta;\n                existCount++;\n            }\n        })\n    }\n\n    private insertBlocksInAxis(id : string) {\n        const block   = this.cacheBlockHolder[id];\n        const rowNode = this.getRowNodeById(id);\n\n        if(rowNode){\n            // const totalGroupLevel = this.groupModel?.length ?? 0;\n            const isGroupBlock   = true\n            const relativeIndex  = block.getRelativeIndex();\n            const rowPinPosition = this.getPinPosition();\n            const parentKeys     = rowNode.getGroupValues();\n            const childLevel     = rowNode.getLevel() + 1;\n            const isLeafGroup    = (rowNode as IGroupedRowNodeCore).isLeafGroup?.() ?? false;\n    \n            const constructAxisBlock = (loopIndex : number) => {\n                const height = this.heightFetcher({rowIndex : loopIndex, rowPinPosition, parentKeys});\n                const topMargin = isLeafGroup ? 0 : this.optionalHandler.getTreeLevelTopMargins(childLevel);\n                // const bottomMargin = isLeafGroup ? 0 : this.optionalHandler.getTreeLevelBottomMargins(childLevel);\n                const axisBlock = this.rowAxis.createBlock({...this.defaultConfig, ...{\n                    marginTop   : topMargin,\n                    // marginBottom: bottomMargin\n                }});\n                axisBlock.appendRow(height);\n                this.rowAxis.insertBlock(axisBlock, null, relativeIndex + loopIndex);\n            }\n\n            if(isGroupBlock){\n                for(let loopIndex = 0; loopIndex < block.getRowCount(); loopIndex++){\n                    constructAxisBlock(loopIndex);\n                }\n                this.rowAxis.updateRelativeValues();\n            }\n            else{\n                constructAxisBlock(0);\n            }\n        }\n    }\n    \n    applyGrouping(_groupModel: IGroupModel[]) {\n    }\n\n    \n    getGroupModel(): IGroupModel[] {\n        return this.groupModel;\n    }\n\n    getDirectChildren(groupRowNode: IGroupedRowNodeCore): IRowNodeCore[] {\n        const blockId = groupRowNode.getId();\n        const cacheBlock = this.cacheBlockHolder[blockId];\n        let children = [];\n        if(cacheBlock){\n            cacheBlock.forEach((id : string)=>{\n                const rowNode = this.getRowNodeById(id) as IRowNodeCore;\n                children.push(rowNode);\n            });\n        }\n        return children;\n    }\n\n    //insert or remove draft rows for a groupNode based on the isLeafGroup state\n    private syncDraftRowsForLeafState(groupRowNode: IGroupedRowNodeCore, isLeafGroup: boolean): void {\n        const topDraftRowIds = groupRowNode.getTopDraftRows?.() ?? [];\n        const bottomDraftRowIds = groupRowNode.getBottomDraftRows?.() ?? [];\n        const allDraftRowIds = [...topDraftRowIds, ...bottomDraftRowIds];\n\n        if (!isLeafGroup) {\n            allDraftRowIds.length > 0 && this.removeDraftRows(allDraftRowIds);\n            return;\n        }\n\n        const topDraftRowCount    = this.optionsHandler.getTopDraftRowCount();\n        const bottomDraftRowCount = this.optionsHandler.getBottomDraftRowCount();\n        const canInsertDraftRows  = (topDraftRowCount > 0 || bottomDraftRowCount > 0) && !groupRowNode.isCollapsed() && !groupRowNode.isChildrenCollapsed();\n        if (!canInsertDraftRows) {\n            return;\n        }\n\n        if (topDraftRowCount > 0) {\n            this.insertDraftRowsForBlock(groupRowNode.getId(), 'topDraftRow', topDraftRowCount);\n        }\n        if (bottomDraftRowCount > 0) {\n            this.insertDraftRowsForBlock(groupRowNode.getId(), 'bottomDraftRow', bottomDraftRowCount);\n        }\n    }\n\n    //verify and update the groupNode if its a leafGroup\n    private recomputeLeafGroupState(groupRowNode: IGroupedRowNodeCore): void {\n        const blockId             = groupRowNode.getId();\n        const cacheBlock          = this.cacheBlockHolder[blockId];\n        const directChildrenCount = cacheBlock?.getRowCount() ?? 0;\n        groupRowNode.setDirectChildrenCount(directChildrenCount);\n\n        const directChildren = this.getDirectChildren(groupRowNode);\n        const isLeafGroup    = directChildren.length === 0 || directChildren.every((child) => !child?.isGroupRow?.());\n        groupRowNode.setIsLeafGroup(isLeafGroup);\n        this.syncDraftRowsForLeafState(groupRowNode, isLeafGroup);\n    }\n\n    collapse(groupRowNode: IGroupedRowNodeCore, _recursive: boolean): void {\n        const isCollapsed = groupRowNode.isCollapsed();\n\n        if(isCollapsed){\n            return;\n        }\n\n        const parentId = groupRowNode.getParentId() ?? TreeGridRemoteDataBlock.ROOT_ID;\n        const cacheBlock = this.cacheBlockHolder[parentId];\n        const hasFullTreeStructure = this.optionalHandler.hasFullTreeStructureProvided();\n        groupRowNode.updateCollapseState(true);\n        groupRowNode.setChildrenCollapsed(true);\n        const hasChildren = groupRowNode.getChildCount() > 0;\n        if (groupRowNode.isLeafGroup?.()) {\n            this.removeDraftRowsForBlock(groupRowNode.getId());\n        }\n        if(!hasChildren){\n            this.gridEvents.dispatchEvent({\n                type : Events.EVENT_ROW_COLLAPSED,\n                node : groupRowNode\n            })\n            this.gridEvents.dispatchEvent({\n                type : Events.EVENT_ROW_DATA_LOADED\n            })\n            return;\n        }\n        if(cacheBlock){\n            // Remove draft rows for leaf groups before collapsing so they disappear with the group\n            const id         = groupRowNode.getId();\n            const localIndex = cacheBlock.getIndexById(id);\n            const startId    = this.encodeCacheBlockId(parentId, localIndex);\n            // const endId      = this.encodeCacheBlockId(parentId, localIndex + 1);\n            const startIndex = this.cacheBlockOrder.indexOf(startId) + 1;\n            // let endIndex   = this.cacheBlockOrder.indexOf(endId);\n            const includeDraftRows = true;\n            let endIndex   = this.getLastRowInGroup(id, includeDraftRows) + 1;\n\n            if(endIndex < 0) {\n                let conditionMet = false;\n                let currentBlock = this.cacheBlockHolder[id];\n                while(!conditionMet){\n                    if(!currentBlock){\n                        conditionMet = true;\n                    }\n                    else{\n                        if(currentBlock.getRowCount() == 0){\n                            conditionMet = true;\n                            const endRowNode = this.getRowNodeById(currentBlock.getInstanceId());\n                            endIndex = endRowNode.getIndex() + 1;\n                            break;\n                        }\n                        const blockEndIndex = currentBlock.getRowCount() - 1;       //if rowCount is 0 result will be -1\n                        const blockEndId =  currentBlock.getIdByIndex(blockEndIndex);\n                        const nextBlock = this.cacheBlockHolder[blockEndId];\n                        if(!nextBlock){\n                            conditionMet = true;\n                            const endBlockMeta = this.encodeCacheBlockId(id, blockEndIndex);\n                            endIndex     = this.cacheBlockOrder.indexOf(endBlockMeta) + 1;\n                        }\n                        currentBlock = nextBlock;\n                    }\n                }\n            }\n\n            \n            const cacheBlockIDArr = new Set<string>();\n            for(let i = startIndex; i < endIndex; i++){\n                const cacheBlockIdMeta = this.cacheBlockOrder[i];\n                const {blockId} = this.decodeCacheBlockId(cacheBlockIdMeta);\n                cacheBlockIDArr.add(blockId);\n            }\n            cacheBlockIDArr.delete(parentId);\n\n             \n            cacheBlockIDArr.forEach(blockNodeId => {\n                const rowNode = this.getRowNodeById(blockNodeId) as IGroupedRowNodeCore;\n                if (rowNode?.isGroupRow?.()) {\n                    rowNode.setChildrenCollapsed(true);\n                }\n                const canRemoveCacheBlock = !hasFullTreeStructure || (hasFullTreeStructure && rowNode?.isLeafGroup());\n                const block = this.cacheBlockHolder[blockNodeId];\n                canRemoveCacheBlock && block.destroy();                          //delete RowNodes\n                !hasFullTreeStructure && this.deleteCacheBlock(blockNodeId);           //delete from cacheBlockMapping\n            })\n\n            for(let i = startIndex; i < endIndex; i++){     //delete from Axis\n                this.rowAxis.deleteRow(startIndex);\n            }\n\n            this.cacheBlockOrder.splice(startIndex, endIndex - startIndex); //delete from cacheBlockOrder\n\n\n            this.addMarginBasedOnLevel(groupRowNode.getIndex());\n            this.rowAxis.updateRelativeValues();\n            this.gridEvents.dispatchEvent({\n                type : Events.EVENT_ROW_COLLAPSED,\n                node : groupRowNode\n            })\n            this.gridEvents.dispatchEvent({\n                type : Events.EVENT_ROW_DATA_LOADED\n            })\n        }\n    }\n    expand(groupRowNode: IGroupedRowNodeCore, params : {recursive ?: boolean} = {recursive : false}): void {\n        const {recursive = false} = params;\n        const isExpanded = !groupRowNode.isCollapsed();\n        groupRowNode.updateCollapseState(false);\n        const id = groupRowNode.getId();\n        const parentNode = groupRowNode.getParentNode() as IGroupedRowNodeCore;\n        const isParentCollapsed = parentNode?.isCollapsed();\n\n        if(isParentCollapsed || (isExpanded && !groupRowNode.isChildrenCollapsed())){\n            return;\n        }\n\n        const hasChildren = groupRowNode.getChildCount() > 0;\n        if(!hasChildren){\n            groupRowNode.setChildrenCollapsed(false);\n\n            // For empty leaf groups, draft rows should still appear on expand when enabled.\n            if (groupRowNode.isLeafGroup?.()) {\n                const topDraftRowCount = this.optionsHandler.getTopDraftRowCount();\n                const bottomDraftRowCount = this.optionsHandler.getBottomDraftRowCount();\n                if (topDraftRowCount > 0) {\n                    this.insertDraftRowsForBlock(id, 'topDraftRow', topDraftRowCount);\n                }\n                if (bottomDraftRowCount > 0) {\n                    this.insertDraftRowsForBlock(id, 'bottomDraftRow', bottomDraftRowCount);\n                }\n\n                this.nullifyAllMargins();\n                this.addGroupTopBottomMargins(this.getRootId());\n                this.rowAxis.updateRelativeValues();\n            }\n\n            this.gridEvents.dispatchEvent({\n                type : Events.EVENT_ROW_EXPANDED,\n                node : groupRowNode\n            })\n            this.gridEvents.dispatchEvent({\n                type : Events.EVENT_ROW_DATA_LOADED\n                })\n            return;\n        }\n        const hasBlock = this.hasCacheBlock(id);\n        const firstMetaInCacheBlockOrder = this.encodeCacheBlockId(id, 0);\n        const hasEntryInCacheBlockOrder = this.cacheBlockOrder.includes(firstMetaInCacheBlockOrder);\n\n        \n\n        if(!hasBlock){\n            const config     = this.getBlockConfigs(id);\n            const cacheBlock = new RemoteCacheBlock(id, config);\n            this.cacheBlockHolder[id] = cacheBlock;\n        }\n        const cacheBlock = this.cacheBlockHolder[id];\n        cacheBlock.setRelativeIndex(groupRowNode.getIndex() + 1);\n        if(!hasEntryInCacheBlockOrder){\n            this.insertBlocksInAxis(id);\n            const metaArr    = [];\n            for(let i = 0; i < cacheBlock.getRowCount(); i++){\n                const meta = this.encodeCacheBlockId(id, i);\n                metaArr.push(meta);\n            }\n            this.cacheBlockOrder.splice(cacheBlock.getRelativeIndex(), 0, ...metaArr);\n        }\n\n        // Reinsert draft rows for expanded leaf groups so they reappear\n        if (groupRowNode.isLeafGroup?.()) {\n            const topDraftRowCount = this.optionsHandler.getTopDraftRowCount();\n            const bottomDraftRowCount = this.optionsHandler.getBottomDraftRowCount();\n            if (topDraftRowCount > 0) {\n                this.insertDraftRowsForBlock(id, 'topDraftRow', topDraftRowCount);\n            }\n            if (bottomDraftRowCount > 0) {\n                this.insertDraftRowsForBlock(id, 'bottomDraftRow', bottomDraftRowCount);\n            }\n\n            this.nullifyAllMargins();\n            this.addGroupTopBottomMargins(this.getRootId());\n            this.rowAxis.updateRelativeValues();\n        }\n\n        groupRowNode.setChildrenCollapsed(false);\n\n        const currentRowIndex = groupRowNode.getIndex();\n        const blockAxis = this.rowAxis.getBlockByIndex(currentRowIndex);\n        blockAxis?.updateBottomMargin(0);\n        const includeDraftRows = true;\n        const lastRowIndex = this.getLastRowInGroup(id, includeDraftRows);\n        if(lastRowIndex !== -1){\n            this.addMarginBasedOnLevel(lastRowIndex);\n        }\n        this.rowAxis.updateRelativeValues();\n\n        const isFullTreeStructure = this.optionalHandler.hasFullTreeStructureProvided();\n        if(isFullTreeStructure && !groupRowNode.isLeafGroup()){\n            const children = this.getDirectChildren(groupRowNode) as IGroupedRowNodeCore[];\n            children.forEach(child => {\n                const shouldExpandChild = recursive ? true : (!child.isCollapsed() && child.isChildrenCollapsed());\n                if(shouldExpandChild){\n                    child.updateCollapseState(true);\n                    this.expand(child, {recursive });\n                }\n            })\n        }\n\n        this.gridEvents.dispatchEvent({\n            type : Events.EVENT_ROW_EXPANDED,\n            node : groupRowNode\n        })\n        this.gridEvents.dispatchEvent({\n            type : Events.EVENT_ROW_DATA_LOADED\n        })\n    }\n    updateViewPort({startRow, endRow}: IViewport): void {\n        const viewportBlockIds = new Set(this.cacheBlockOrder.slice(startRow, endRow + 1).map(meta => this.decodeCacheBlockId(meta).blockId));\n\n        viewportBlockIds.forEach(id => {\n            const rowNode = this.getRowNodeById(id) as IGroupedRowNodeCore;\n            if(rowNode.isDraftRow(id)){\n                return;\n            }\n            const block = this.cacheBlockHolder[id];\n            const blockRelativeIndex = id == TreeGridRemoteDataBlock.ROOT_ID ? 0 : this.getIndexById(id);\n            const viweport = {\n                startRow : Math.max(0, startRow - blockRelativeIndex),\n                endRow   : Math.min(block.getRowCount() - 1, endRow - blockRelativeIndex)\n            }\n            block.updateViewPort(viweport);\n        })\n    }\n    getRowNodeByVisibleIndex(currentRow: number) {\n        if (currentRow > -1) {\n\t\t\tconst id = this.getIdByIndex(currentRow);\n\t\t\treturn this.rowNodeHolder.get(id);\n\t\t}\n    }\n    fetchRowDefinition(index: number, groupkeys: IGroupKeys, data : IJson = null, isRowLoading = true, pinPosition: rowPinPositions = this.rowPinPosition): IRowDefinition {\n        const rowDefinitionParams = {\n\t\t\trowIndex          : index,\n\t\t\trowPinnedPosition : pinPosition,\n\t\t\tparentKeys        : groupkeys,\n\t\t\tpageNumber        : 0,\n\t\t\tsortModel         : this.getSortModel(),\n\t\t\tfilterModel       : this.getFilterModel(),\n\t\t\trowGroupingModel  : this.getGroupModel(),\n\t\t\tdata,\n            isRowLoading\n\t\t};\n\t\treturn this.definitionFetcher(rowDefinitionParams);\n    }\n\n    fetchHeight(index: number, rowNode: IRowNodeCore): number {\n        const pinPosition = rowNode.getPinnedPosition();\n        const parentKeys = rowNode.getGroupKeys?.() ?? [];\n        return this.heightFetcher({\n            rowIndex       : index,\n            rowPinPosition : pinPosition,\n            parentKeys     : parentKeys\n        });\n    }\n\n    getAllRowNodes(): IRowNodeCore[] {\n\t\treturn Object.values(this.rowNodeHolder.getAllRows());\n    }\n\n    getIndexById(id: string): number | null {\n        if(this.isDraftRow(id)){\n            return this.cacheBlockOrder.indexOf(id);\n        }\n        const rowNode  = this.getRowNodeById(id);\n        const parentId = rowNode?.getParentId() ?? TreeGridRemoteDataBlock.ROOT_ID;\n        const block    = this.cacheBlockHolder[parentId];\n        if(block){\n            const localIndex = block.getIndexById(id);\n            const meta       = this.encodeCacheBlockId(parentId, localIndex);\n            return this.cacheBlockOrder.indexOf(meta);\n        }\n        return null;\n    }\n\n    getIdByIndex(index: number): string {\n        const blockMeta = this.cacheBlockOrder[index];\n        if(!blockMeta) {\n            return null;\n        }\n        const {blockId, index : localIndex, } = this.decodeCacheBlockId(blockMeta);\n        if(this.isDraftRow(blockMeta)){\n            return blockMeta; //for draftROw blockMeta is the id\n        }\n        if(blockId) { \n            const block = this.cacheBlockHolder[blockId];\n            return block.getIdByIndex(localIndex);\n        }\n        return null;\n    }\n\n    moveRows(sourceIndexMetas: IRowBlockRowDeleteMeta[], targetIndexMeta: IRowBlockRowDeleteMeta, movePosition: MovePosition): void {\n        const cacheBlockMapping = {} as Record<string, (IRowBlockRowDeleteMeta & {insertIds : string[]})[]>;\n        const targetParentKeys  = targetIndexMeta.parentKeys;\n        const parentKeysArr     = [TreeGridRemoteDataBlock.ROOT_ID, ...targetParentKeys];\n        const targetBlockId     = parentKeysArr.join(cacheIdSpliter);\n        const parentNode        = this.getRowNodeById(targetBlockId);\n        const parentGroupMeta   = parentNode.getGroupMeta();\n        const targetLevel       = parentNode.getLevel() + 1;\n\n        let targetIndex = targetIndexMeta.rowIndex;\n        targetIndex = movePosition === 'after' ? targetIndex + 1  : targetIndex;\n\n        const targetBlock       = this.cacheBlockHolder[targetBlockId];\n        const targetInsertIds   = [];\n        const heights           = [];\n\n        sourceIndexMetas.forEach(({rowIndex, parentKeys})=>{\n            const parentKeysArr = [TreeGridRemoteDataBlock.ROOT_ID, ...parentKeys];\n            const blockId       = parentKeysArr.join(cacheIdSpliter);\n            const block         = this.cacheBlockHolder[blockId];\n            const blockOrderId  = this.encodeCacheBlockId(blockId, rowIndex);\n            const absoluteIndex = this.cacheBlockOrder.indexOf(blockOrderId);\n            const rowId         = block.getIdByIndex(rowIndex);\n            const height        = this.getHeight(absoluteIndex);\n            heights.push({absoluteIndex, height});\n            cacheBlockMapping[blockId] = cacheBlockMapping[blockId] || [];\n            cacheBlockMapping[blockId].push({rowIndex, insertIds : [rowId]});\n        })\n\n        Object.keys(cacheBlockMapping).forEach(blockId=>{\n            const block = this.cacheBlockHolder[blockId];\n            const indexes = cacheBlockMapping[blockId].map(({rowIndex, insertIds})=>{\n                if(blockId == targetBlockId && rowIndex < targetIndex){\n                    targetIndex--;\n                }\n                targetInsertIds.push(...insertIds);\n                return rowIndex;\n            }); \n            block.deleteRowsAtIndexes(indexes);\n        });\n\n        heights.sort((a, b)=>b.absoluteIndex - a.absoluteIndex);\n        heights.forEach(({absoluteIndex})=>{\n            this.rowAxis.deleteRow(absoluteIndex);\n            this.cacheBlockOrder.splice(absoluteIndex, 1);\n        })\n\n        targetBlock.insertRowsAtIndexes([{index : targetIndex, insertIds : targetInsertIds}]);\n\n        const absoluteTargetIndex = this.getAbsoluteIndex(targetIndex, targetParentKeys);\n        heights.forEach(({height})=>{\n            this.rowAxis.insertRow(absoluteTargetIndex, height);\n            this.cacheBlockOrder.splice(absoluteTargetIndex, 0, this.encodeCacheBlockId(targetBlockId, targetIndex));\n        })\n\n        targetInsertIds.forEach(id=>{\n            const node = this.rowNodeHolder.get(id);\n            const {groupKey, groupValue} = node.getCurrentMeta?.() ?? {};\n            node.setParentId?.(targetBlockId);\n            node.updateLevel?.(targetLevel);\n            node.setGroupMeta?.([...parentGroupMeta, {[groupKey] : groupValue}]);\n        })\n\n        const blockIds = [...Object.keys(cacheBlockMapping), targetBlockId];\n        blockIds.forEach(blockId=>{\n            this.updateCacheBlockOrder(blockId);\n        })\n    }\n\n    getAbsoluteIndex(index: number, parentKeys: IGroupKeys, pinPosition: rowPinPositions = 'middle') {\n        const isTopDraftRow = pinPosition == 'topDraftRow';\n        const isBottomDraftRow = pinPosition == 'bottomDraftRow';\n        const parentId = parentKeys.length > 0 ? parentKeys[parentKeys.length - 1] : TreeGridRemoteDataBlock.ROOT_ID;\n        const parentNode = this.getRowNodeById(parentId) as IGroupedRowNodeCore;\n        if(!parentNode){\n            return null;\n        }\n        if(isTopDraftRow || isBottomDraftRow){\n            const draftNodeId = this.generateDraftRowId(index, parentNode, pinPosition);\n            return this.getIndexById(draftNodeId);\n        }\n\n        const hasFullTreeStructure = this.optionalHandler.hasFullTreeStructureProvided();\n        if(hasFullTreeStructure){\n            const parentKeyLastItem = parentKeys.length > 0 ? parentKeys[parentKeys.length - 1] : TreeGridRemoteDataBlock.ROOT_ID;            //for tables id's are same as block id\n            const meta = this.encodeCacheBlockId(parentKeyLastItem, index);\n            return this.cacheBlockOrder.indexOf(meta);\n        }\n        const parentKeysArr   = [TreeGridRemoteDataBlock.ROOT_ID, ...parentKeys];\n        const blockId         = parentKeysArr.join(cacheIdSpliter);\n        const absoluteIndexId = this.encodeCacheBlockId(blockId, index);\n        return this.cacheBlockOrder.indexOf(absoluteIndexId);\n    }\n\n    getRelativeRowMeta(absoluteIndex : number) : IRowMeta{\n        const blockIdMeta                 = this.cacheBlockOrder[absoluteIndex];\n        if(!blockIdMeta) {\n            return {\n                pinPosition : this.getPinPosition(),\n                rowIndex    : absoluteIndex,\n                parentKeys  : []\n            }\n        }\n        const {blockId, index : rowIndex, pinPosition} = this.decodeCacheBlockId(blockIdMeta);\n        const parentNode                  = this.getRowNodeById(blockId);\n        const parentKeys                  = parentNode?.getGroupValues() ?? [];\n        return {\n            pinPosition : pinPosition,\n            rowIndex,\n            parentKeys\n        }\n    }\n\n\n    insertRowsAtBlock(rowInsertMeta : IBlockInsertMeta, rowIndex : number, parentKeys : IGroupKeys, insertPosition : MovePosition) {\n        const {fullTreeStructure, rowData, rowDefinition, count} = rowInsertMeta;\n        const insertIndex = insertPosition === 'after' ? rowIndex + 1 : rowIndex;\n        const parentBlockId = parentKeys.length == 0 ? TreeGridRemoteDataBlock.ROOT_ID : parentKeys[parentKeys.length - 1];\n        const parentNode = this.getRowNodeById(parentBlockId) as IGroupedRowNodeCore;\n        const parentBlock = this.cacheBlockHolder[parentBlockId];\n        const insertBlockMeta = this.encodeCacheBlockId(parentBlockId, insertIndex);\n        let insertBlockIndex = this.cacheBlockOrder.indexOf(insertBlockMeta);\n        const hasChildren = parentNode.getChildCount() > 0;\n        const includeDraftRows = true;\n        insertBlockIndex = insertBlockIndex == -1 ? (hasChildren ? this.getLastRowInGroup(parentBlockId, includeDraftRows) + 1 : parentNode.getIndex() + 1) : insertBlockIndex;\n        const parentLevelIds = [];\n\n        if(fullTreeStructure){\n            const expandableRows = [];\n            let absoluteIndexOffset = 0;\n\n            const processTreeNodes = (nodes: ITreeStructureData[], currentParentBlockId: string, currentParentKeys: string[], isInsertLevel: boolean, hasParentCollapsed: boolean, realtiveInsertIndex : number): void => {\n                const currentParentBlock = this.cacheBlockHolder[currentParentBlockId];\n                const parentBlock = this.cacheBlockHolder[currentParentBlockId];\n                nodes.forEach((node, localIndex) => {\n                    const children    = node.children;\n                    const hasChildren = children && children.length > 0;\n                    const rowCount    = node.rowCount;\n                    const isLastLevel = !hasChildren;\n                    const hasRowCount = rowCount != undefined;\n\n                    // Insert into cacheBlockOrder and rowAxis only for insert level\n                    if(isInsertLevel){\n                        const height = this.heightFetcher({\n                            rowIndex: realtiveInsertIndex + localIndex,\n                            rowPinPosition: this.rowPinPosition,\n                            parentKeys: currentParentKeys\n                        });\n                        const blockMeta = this.encodeCacheBlockId(currentParentBlockId, realtiveInsertIndex + localIndex);\n                        this.cacheBlockOrder.splice(insertBlockIndex + absoluteIndexOffset, 0, blockMeta);\n                        const blockAxis = this.rowAxis.createBlock(this.defaultConfig);\n                        this.rowAxis.insertBlock(blockAxis, null, insertBlockIndex + absoluteIndexOffset);\n                        blockAxis.appendRow(height);\n                        // this.rowAxis.insertRow(insertBlockIndex + absoluteIndexOffset, height);\n                        absoluteIndexOffset++;\n                    }\n\n                    // Create child block for expandable nodes\n                    if(hasChildren || hasRowCount){\n                        const nodeId      = parentBlock.getIdByIndex(realtiveInsertIndex + localIndex);\n                        const childConfig = this.getBlockConfigs(nodeId);\n\n                        childConfig.rowCount = isLastLevel ? rowCount : children.length;\n                        if(!isLastLevel){\n                            childConfig.blockCount = Infinity;\n                            childConfig.blockSize  = 50;\n                            childConfig.fetchCallback = ({onSuccess, startRowIndex, endRowIndex}) => {\n                                onSuccess({ data: children.slice(startRowIndex, endRowIndex + 1) });\n                            };\n                        } else {\n                            const rowNode = this.getRowNodeById(nodeId) as IGroupedRowNodeCore;\n                            rowNode?.setIsLeafGroup(true);\n                        }\n\n                        const childBlock = new RemoteCacheBlock(nodeId, childConfig);\n                        childBlock.setRelativeIndex(insertBlockIndex + absoluteIndexOffset - 1);\n                        !isLastLevel && childBlock.updateViewPort({startRow: 0, endRow: childBlock.getRowCount() - 1});\n                        this.cacheBlockHolder[nodeId] = childBlock;\n\n                        const hasCollapsed = hasParentCollapsed || !node.expanded;\n                        if(hasCollapsed){\n                            const groupRow = this.getRowNodeById(nodeId) as IGroupedRowNodeCore;\n                            groupRow.setChildrenCollapsed(true);\n                        } else {\n                            expandableRows.push(nodeId);\n                        }\n\n                        // Recurse into children (not insert level - won't add to cacheBlockOrder/rowAxis)\n                        if(!isLastLevel && hasChildren){\n                            const childParentKeys = [...currentParentKeys, nodeId];\n                            processTreeNodes(children, nodeId, childParentKeys, false, hasCollapsed, 0);\n                        }\n                    }\n\n                    // Track parent level ids for insert level\n                    if(isInsertLevel){\n                        const nodeId = currentParentBlock.getIdByIndex(insertIndex + localIndex);\n                        parentLevelIds.push(nodeId);\n                    }\n                });\n            };\n\n            const initLevelIds = [];\n            fullTreeStructure.forEach((data, localIndex)=>{\n                const children    = data.children;\n                const hasChildren = children && children.length > 0;\n                const rowCount    = data.rowCount;\n                const isLastLevel = !hasChildren;\n\n                const rowDefinition = this.fetchRowDefinition(insertIndex + localIndex, parentKeys, data, false);\n                const id = this.generateRowId(insertIndex + localIndex, rowDefinition);\n                rowDefinition.childrenCount = hasChildren ? children.length : (rowCount ?? 0);\n\n                const blockConfig = this.getBlockConfigs(id);\n                blockConfig.rowCount = isLastLevel ? rowCount : (children?.length ?? 0);\n                if(!isLastLevel && hasChildren){\n                    blockConfig.blockCount = Infinity;\n                    blockConfig.blockSize = 50;\n                    blockConfig.fetchCallback = ({onSuccess, startRowIndex, endRowIndex}) => {\n                        onSuccess({ data: children.slice(startRowIndex, endRowIndex + 1) });\n                    };\n                }\n\n                const block = new RemoteCacheBlock(id, blockConfig);\n                const rowNode = this.createGroupRowNode(id, parentBlockId, data, rowDefinition, isLastLevel);\n                const groupMeta = parentNode.getGroupMeta().slice();\n                groupMeta.push({branchKey : rowNode.getId()});\n                rowNode.setGroupMeta(groupMeta);\n                rowNode.setParentId(parentBlockId);\n                rowNode.updateLevel(parentNode.getLevel() + 1);\n                rowNode.updateLoaded(true);\n                this.rowNodeHolder.set(id, rowNode);\n\n                block.setRelativeIndex(insertBlockIndex + localIndex);\n                !isLastLevel && block.updateViewPort({startRow: 0, endRow: block.getRowCount() - 1});\n                this.cacheBlockHolder[id] = block;\n                initLevelIds.push(id);\n            });\n\n            parentBlock.insertRowsAtIndexes([{index : insertIndex, insertIds : initLevelIds}]);\n            parentNode.setDirectChildrenCount(parentBlock.getRowCount());\n\n            // Process starting from insert level\n            processTreeNodes(fullTreeStructure, parentBlockId, parentKeys, true, false, insertIndex);\n\n            this.updateCacheBlockOrder(parentBlockId);\n            this.rowAxis.updateRelativeValues();\n\n            // Expand rows after all are inserted\n            expandableRows.forEach((rowId) => {\n                const rowNode = this.getRowNodeById(rowId) as IGroupedRowNodeCore;\n                rowNode.updateCollapseState(true);\n                rowNode?.expand();\n            });\n\n            // Insert draft rows for newly created leaf groups if configured\n            const topDraftRowCount = this.optionsHandler.getTopDraftRowCount();\n            const bottomDraftRowCount = this.optionsHandler.getBottomDraftRowCount();\n            if (topDraftRowCount > 0 || bottomDraftRowCount > 0) {\n                initLevelIds.forEach(id => {\n                    const rowNode = this.getRowNodeById(id) as IGroupedRowNodeCore;\n                    if (rowNode?.isLeafGroup?.() && !rowNode.isCollapsed?.()) {\n                        if (topDraftRowCount > 0) {\n                            this.insertDraftRowsForBlock(id, 'topDraftRow', topDraftRowCount);\n                        }\n                        if (bottomDraftRowCount > 0) {\n                            this.insertDraftRowsForBlock(id, 'bottomDraftRow', bottomDraftRowCount);\n                        }\n                    }\n                });\n                this.nullifyAllMargins();\n                this.addGroupTopBottomMargins(this.getRootId());\n                this.rowAxis.updateRelativeValues();\n            }\n\n        }else{\n            const loopCount = rowData ? rowData.length : count;\n            for(let loopIndex = 0; loopIndex < loopCount; loopIndex++){\n                const data = rowData ? rowData[loopIndex] : null;\n                let id = null;\n                if(data){\n                    const definition = rowDefinition[loopIndex] ?? this.fetchRowDefinition(loopIndex, parentKeys, data, false);\n                    id         = this.generateRowId(loopIndex, definition);\n                    const rowNode = this.createRowNode(id, data, definition);\n                    rowNode.setParentId(parentBlockId);\n                    rowNode.updateLevel(parentNode.getLevel() + 1);\n                    rowNode.updateLoaded(true);\n                    this.rowNodeHolder.set(id, rowNode);\n                }\n                parentLevelIds.push(id);\n                const blockMeta = this.encodeCacheBlockId(parentBlockId, insertIndex + loopIndex);\n                this.cacheBlockOrder.splice(insertBlockIndex + loopIndex, 0, blockMeta);\n\n                const height     = this.heightFetcher({rowIndex : loopIndex, rowPinPosition: this.rowPinPosition, parentKeys});\n                const blockAxis = this.rowAxis.createBlock(this.defaultConfig);\n                this.rowAxis.insertBlock(blockAxis, null, insertBlockIndex + loopIndex);\n                blockAxis.appendRow(height);\n                // this.rowAxis.insertRow(insertBlockIndex + loopIndex, height);\n            }\n            parentBlock.insertRowsAtIndexes([{index : insertIndex, insertIds : parentLevelIds}]);\n            parentNode.setDirectChildrenCount(parentBlock.getRowCount());\n        }\n\n        const parentGroupNode = this.getRowNodeById(parentBlockId) as IGroupedRowNodeCore;\n        this.recomputeLeafGroupState(parentGroupNode);\n        this.updateCacheBlockOrder(parentBlockId);\n        this.nullifyAllMargins();\n        this.rowAxis.updateRelativeValues();\n        this.addGroupTopBottomMargins(this.getRootId());\n        this.rowAxis.updateRelativeValues();\n    }\n    \n    insertRowsAtIndexes(rowInsertMetas: IRowBlockRowInsertMeta[], insertPosition ?: MovePosition): void {\n        const absoluteInsertMetas = [];\n        const affectedParentGroupIds = new Set<string>();\n        \n        const cacheBlockMapping    = {};\n        const cacheBlockInsertMeta = {};\n        const expandCallback = [];\n        rowInsertMetas.forEach(({rowIndex, parentKeys, count, rowDefinition, rowData}, loopIndex)=>{\n            \n            const parentKeysArr   = [TreeGridRemoteDataBlock.ROOT_ID, ...parentKeys];\n            let blockId = null;\n            if(this.optionalHandler.hasFullTreeStructureProvided()){\n                blockId = parentKeys.length > 0 ? parentKeys[parentKeys.length - 1] : TreeGridRemoteDataBlock.ROOT_ID;\n            }else{\n                blockId = parentKeysArr.join(cacheIdSpliter);\n            }\n            const parentNode = this.getRowNodeById(blockId);\n            const groupParent = parentNode?.isGroupRow?.() ? (parentNode as IGroupedRowNodeCore) : null;\n            if(parentNode?.isCollapsed?.() || (groupParent && groupParent.isChildrenCollapsed())){\n                const insertCount = count ?? rowDefinition.length ?? rowData.length;\n                const block = this.cacheBlockHolder[blockId];\n                const blockConfigs = block.getBlockConfigs();\n                const rowCount = blockConfigs.rowCount + insertCount;\n                block.updateCacheConfigs({...blockConfigs, rowCount});\n                affectedParentGroupIds.add(blockId);\n                return;\n            }\n\n\n\n            const absoluteIndexId = this.encodeCacheBlockId(blockId, rowIndex);\n            let absoluteIndex   = this.cacheBlockOrder.indexOf(absoluteIndexId);\n            // if(absoluteIndex < 0) {\n            //     this.cacheBlockOrder.splice(this.rootBlock.getRelativeIndex(), 0, absoluteIndexId);\n            //     absoluteIndex   = this.cacheBlockOrder.indexOf(absoluteIndexId);\n            // }\n            cacheBlockMapping[blockId] = cacheBlockMapping[blockId] || [];\n            cacheBlockMapping[blockId].push(rowIndex);\n            absoluteInsertMetas[loopIndex] = {...rowInsertMetas[loopIndex], absoluteIndex, rowIndex};\n        });\n\n        absoluteInsertMetas.sort((a, b)=>a-b);\n\n        let relativeInsertCount = 0;\n        for(let i = 0; i < absoluteInsertMetas.length; i++){\n            const {parentKeys, rowDefinition, rowData, count} = absoluteInsertMetas[i];\n            let {absoluteIndex, rowIndex} = absoluteInsertMetas[i];\n            let localInsertPosition = insertPosition;\n\n            const givenBlockId = parentKeys.length > 0 ? parentKeys[parentKeys.length - 1] : TreeGridRemoteDataBlock.ROOT_ID;\n            const givenBlock = this.cacheBlockHolder[givenBlockId];\n            let blockId;\n\n            if(givenBlock.getRowCount() == 0){\n                absoluteIndex = this.getIndexById(givenBlockId);\n                localInsertPosition = 'after';\n                blockId = givenBlockId;\n                rowIndex = 0;\n            }\n            else{\n                if(absoluteIndex >= 0) {\n                    const cacheBlockId = this.cacheBlockOrder[absoluteIndex];\n                    const {blockId : id} = this.decodeCacheBlockId(cacheBlockId);\n                    blockId = id;\n                }else {\n                    blockId = this.getRootNode().getId();\n                }\n            }\n\n            let insertPositionAdder = localInsertPosition === 'after' ? 1 : 0;\n            const parentNode = this.getRowNodeById(blockId);\n            const parentIndexBound = parentNode.getIndex() + 1;\n            cacheBlockInsertMeta[blockId] = cacheBlockInsertMeta[blockId] || {};\n            const insertIds = cacheBlockInsertMeta[blockId][rowIndex] || [];\n            const sourceIndexHeight = this.getHeight(absoluteIndex);\n\n            for(let loopIndex = 0; loopIndex < count; loopIndex++){\n                const data       = rowData[loopIndex];\n                const isLoaded   = !!data;\n                const insertIndex = Math.max(parentIndexBound, (absoluteIndex + relativeInsertCount + insertPositionAdder));\n                let height       = sourceIndexHeight;\n                relativeInsertCount++;\n                if(data){\n                    const definition = rowDefinition[loopIndex] ?? this.fetchRowDefinition(rowIndex, parentKeys, data, !isLoaded);\n                          height     = this.heightFetcher({rowIndex, rowPinPosition: this.rowPinPosition, parentKeys})\n                    const id         = this.generateRowId(absoluteIndex + insertPositionAdder, definition);\n\n                    let rowNode;\n                    if(definition.expandableRow) {\n                        const groupMeta = parentNode.getGroupMeta().slice();\n                        groupMeta.push({branchKey : definition.expandableRowKey});\n                        rowNode = this.createGroupRowNode(id, parentNode.getId(), data, definition) as IGroupedRowNodeCore;\n                        rowNode.setGroupMeta(groupMeta);\n                    }else {\n                        rowNode = this.createRowNode(id, data, definition) ;\n                    }\n\n                    \n                    rowNode.setParentId(blockId);\n                    rowNode.updateLevel(parentNode.getLevel() + 1);\n                    parentNode.setDirectChildrenCount(parentNode.getDirectChildrenCount() + 1);\n                    data && rowNode.updateLoaded(true);\n                    this.rowNodeHolder.set(id, rowNode);\n                    insertIds.push(id);\n                    affectedParentGroupIds.add(blockId);\n                    definition.expand && expandCallback.push( () => this.expand(rowNode, {recursive : false}));\n                }\n                else{\n                    insertIds.push(null);\n                }\n                \n                const blockAxis = this.rowAxis.createBlock(this.defaultConfig);\n                this.rowAxis.insertBlock(blockAxis, null, insertIndex);\n                blockAxis.appendRow(height);\n\n                const absoluteValue = this.getAbsoluteIndex(rowIndex, parentKeys);\n                const rowNode = this.getRowNode(absoluteValue) as IGroupedRowNodeCore;\n                const spliceCount = localInsertPosition === 'before' ? 0 : 1;\n                const count = rowNode ? absoluteValue+rowNode.getChildCount() + spliceCount: insertIndex;\n                this.cacheBlockOrder.splice(Math.max(parentIndexBound, count), 0, this.encodeCacheBlockId(blockId, rowIndex + insertPositionAdder));\n            }\n            cacheBlockInsertMeta[blockId][rowIndex + insertPositionAdder] = insertIds;\n        }\n\n        Object.keys(cacheBlockMapping).forEach(blockId=>{\n            const block       = this.cacheBlockHolder[blockId];\n            const blockInsertMeta = cacheBlockInsertMeta[blockId];\n            affectedParentGroupIds.add(blockId);\n            Object.keys(blockInsertMeta).forEach(index=>{\n                const insertIds = blockInsertMeta[index];\n                block.insertRowsAtIndexes([{index : Number(index), insertIds}]);\n            })\n            this.updateCacheBlockOrder(blockId);\n        });\n\n        const rootBlock = this.getRootBlock();\n        const rootNode  = this.getRootNode();\n        rootNode.setDirectChildrenCount(rootBlock.getRowCount());\n        affectedParentGroupIds.add(TreeGridRemoteDataBlock.ROOT_ID);\n\n        affectedParentGroupIds.forEach((parentId) => {\n            const parentGroupNode = this.getRowNodeById(parentId) as IGroupedRowNodeCore;\n            this.recomputeLeafGroupState(parentGroupNode);\n        });\n\n        this.nullifyAllMargins();\n        this.rowAxis.updateRelativeValues();\n        this.addGroupTopBottomMargins(TreeGridRemoteDataBlock.ROOT_ID);\n        this.rowAxis.updateRelativeValues();\n        expandCallback.forEach((callback) => {\n            callback();\n        })\n\n        // Attach draft rows to any newly created leaf groups that are expanded\n        const topDraftRowCount = this.optionsHandler.getTopDraftRowCount();\n        const bottomDraftRowCount = this.optionsHandler.getBottomDraftRowCount();\n        if (topDraftRowCount > 0 || bottomDraftRowCount > 0) {\n            Object.keys(cacheBlockInsertMeta).forEach(blockId => {\n                const blockMeta = cacheBlockInsertMeta[blockId];\n                Object.keys(blockMeta).forEach(indexStr => {\n                    const insertIds = blockMeta[indexStr] as string[];\n                    insertIds.forEach(id => {\n                        const rowNode = this.getRowNodeById(id) as IGroupedRowNodeCore;\n                        if (rowNode?.isLeafGroup?.() && !rowNode.isCollapsed?.()) {\n                            if (topDraftRowCount > 0) {\n                                this.insertDraftRowsForBlock(id, 'topDraftRow', topDraftRowCount);\n                            }\n                            if (bottomDraftRowCount > 0) {\n                                this.insertDraftRowsForBlock(id, 'bottomDraftRow', bottomDraftRowCount);\n                            }\n                        }\n                    });\n                });\n            });\n            this.nullifyAllMargins();\n            this.addGroupTopBottomMargins(TreeGridRemoteDataBlock.ROOT_ID);\n            this.rowAxis.updateRelativeValues();\n        }\n\n    }\n\n    getRootNode() {\n        return this.rootNode;\n    }\n\n\n    getRootId() {\n        return TreeGridRemoteDataBlock.ROOT_ID;\n    }\n\n    getRootBlock() {\n        return this.rootBlock;\n    }\n\n    removeRows(rowDeleteMetas : IRowBlockRowDeleteMeta[]): void {\n        const metaArr = [];\n        const affectedParentGroupIds = new Set<string>();\n\n\n        const addDeleteMeta = (rowIndex, parentKeys)=>{\n            const blockId   = parentKeys.length == 0 ? TreeGridRemoteDataBlock.ROOT_ID : parentKeys[parentKeys.length - 1];\n            const blockMeta = this.encodeCacheBlockId(blockId, rowIndex);\n            const block     = this.cacheBlockHolder[blockId];\n            const rowId     = block.getIdByIndex(rowIndex);\n            const rowNode   = this.getRowNodeById(rowId);\n\n            metaArr.push({blockMeta, rowId, blockId});\n            if(rowNode?.isGroupRow?.()){\n                // Ensure any draft rows attached to this group are removed as part of deletion\n                if ((rowNode as IGroupedRowNodeCore).isLeafGroup?.()) {\n                    this.removeDraftRowsForBlock(rowId);\n                }\n                for(let i = 0; i < rowNode.getChildCount(); i++){\n                    addDeleteMeta(i, rowNode.getGroupValues());\n                }\n            }\n        }\n\n        rowDeleteMetas.forEach(({rowIndex, parentKeys})=>{\n            addDeleteMeta(rowIndex, parentKeys);\n        });\n\n        // console.log(metaArr);\n\n        const removedBlockIds = new Set();\n\n        metaArr.forEach(({blockMeta, rowId, blockId})=>{\n            this.rowNodeHolder.delete(rowId);\n            const absoluteIndex = this.cacheBlockOrder.indexOf(blockMeta);\n            const rowExistsInVisibleOrder = absoluteIndex != -1;\n            rowExistsInVisibleOrder && this.rowAxis.deleteRow(absoluteIndex);\n            rowExistsInVisibleOrder && this.cacheBlockOrder.splice(absoluteIndex, 1);\n\n            delete this.cacheBlockHolder[rowId];\n\n            const block = this.cacheBlockHolder[blockId];\n            if(block){\n                removedBlockIds.add(blockId);\n                const {index : rowIndex} = this.decodeCacheBlockId(blockMeta);\n                block.deleteRowsAtIndexes([rowIndex]);\n                affectedParentGroupIds.add(blockId);\n            }\n\n\n            const parentNode = this.getRowNodeById(blockId);\n            if(parentNode){\n                parentNode.setDirectChildrenCount(parentNode.getDirectChildrenCount() - 1);\n            }\n        });\n\n        this.updateCacheBlockOrder(TreeGridRemoteDataBlock.ROOT_ID);\n        removedBlockIds.forEach((id : string)=>{\n            this.updateCacheBlockOrder(id);\n        })\n        affectedParentGroupIds.forEach((parentId) => {\n            const parentGroupNode = this.getRowNodeById(parentId) as IGroupedRowNodeCore;\n            parentGroupNode && this.recomputeLeafGroupState(parentGroupNode);\n        });\n\n        this.nullifyAllMargins();\n        this.rowAxis.updateRelativeValues();\n        this.addGroupTopBottomMargins(TreeGridRemoteDataBlock.ROOT_ID);\n        this.rowAxis.updateRelativeValues();\n    }\n    \n    // removeRows(rowDeleteMetas : IRowBlockRowDeleteMeta[]): void {\n        //need to find absolute index\n        // const absoluteIndexArr  = [];\n        // const cacheBlockMapping = {};\n        // const hasFullTreeStructure = this.optionalHandler.hasFullTreeStructureProvided();\n        // rowDeleteMetas.forEach(({rowIndex, parentKeys})=>{\n        //     let blockId;\n        //     if(hasFullTreeStructure){\n        //         blockId = parentKeys[parentKeys.length - 1];\n        //     }else{\n        //         const parentKeysArr = [TreeGridRemoteDataBlock.ROOT_ID, ...parentKeys];\n        //         blockId = parentKeysArr.join(cacheIdSpliter);\n        //     }\n        //     const absoluteId = this.encodeCacheBlockId(blockId, rowIndex);\n        //     const absoluteIndex = this.cacheBlockOrder.indexOf(absoluteId);\n        //     cacheBlockMapping[blockId] = cacheBlockMapping[blockId] || [];\n        //     cacheBlockMapping[blockId].push(rowIndex);\n        //     absoluteIndexArr.push(absoluteIndex);\n        // });\n\n        // absoluteIndexArr.sort((a, b)=>a-b);\n\n        // for(let i = absoluteIndexArr.length - 1; i >= 0; i--){\n        //     const index = absoluteIndexArr[i];\n        //     this.deleteAbsoluteRow(index);\n        // }\n\n\n        // Object.keys(cacheBlockMapping).forEach(blockId=>{\n        //     const indexes = cacheBlockMapping[blockId];\n        //     const block = this.cacheBlockHolder[blockId];\n        //     block.deleteRowsAtIndexes(indexes);\n        //     this.updateCacheBlockOrder(blockId);\n        // });\n\n        // const rootBlock = this.getRootBlock();\n        // const rootNode  = this.getRootNode();\n        // rootNode.setDirectChildrenCount(rootBlock.getRowCount());\n    // } \n    deleteAbsoluteRow(index: number): void {\n        const id            = this.getIdByIndex(index);\n        const rowNode       = this.getRowNodeById(id) as IGroupedRowNodeCore;\n        const parentId      = rowNode?.getParentId?.() ?? TreeGridRemoteDataBlock.ROOT_ID;\n        const parentNode    = this.getRowNodeById(parentId) as IGroupedRowNodeCore;\n        const parentBlock   = this.cacheBlockHolder[parentId];\n        const localIndex    = parentBlock?.getIndexById?.(id);\n        const childrenCount = parentNode?.getChildCount?.() ?? 0;\n        if(rowNode?.isGroupRow?.() && rowNode.isLeafGroup?.()){\n            this.removeDraftRowsForBlock(id);\n        }\n        if(parentNode){\n            parentNode.setDirectChildrenCount(childrenCount - 1);\n        }\n        if(Number.isInteger(localIndex) && localIndex >= 0){\n            parentBlock.deleteRowsAtIndexes([localIndex]);\n            this.updateCacheBlockOrder(parentId);\n        }\n        this.rowNodeHolder.delete(id);\n        delete this.cacheBlockHolder[id];\n        this.rowAxis.deleteRow(index);\n        this.cacheBlockOrder.splice(index, 1);\n        parentNode && this.recomputeLeafGroupState(parentNode);\n    }\n    createRowNode(id: string, data: IJson, definition: IRowDefinition, isLoaded: boolean = true) : IRowNodeCore{\n\t\tconst RowNodeClass = this.classRegistry.getRowNode();\n\t\tconst rowNode      = new RowNodeClass( this.rowNodeHelper, id, {...definition, pinPosition: this.rowPinPosition}, data );\n        rowNode.updateLoaded(isLoaded);\n\t\treturn rowNode;\n    }\n\n    createGroupRowNode(id: string, parentId: string, rowData: IJson, rowDefinition: IRowDefinition = {}, isLeafGroup: boolean = false) : IGroupedRowNodeCore{\n        const RowNodeClass = this.classRegistry.getGroupRowNode() as IGroupedRowNodeConstructor;\n\t\tconst rowNode = new RowNodeClass(this.groupRowNodeHelper, id, parentId, rowData, rowDefinition);\n        const childrenCount = rowDefinition?.childrenCount;\n        rowNode.setDirectChildrenCount(childrenCount ?? 0);\n        rowNode.setIsLeafGroup(isLeafGroup);\n\t\treturn rowNode;\n    }\n\n\n    getFirstLeafRowMeta(includeDraftRows: boolean = true): IRowMeta {\n        for(let i = 0; i < this.cacheBlockOrder.length; i++){\n            const blockMeta = this.cacheBlockOrder[i];\n            const {blockId} = this.decodeCacheBlockId(blockMeta);\n            const rowNode   = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n            if(rowNode.isLeafGroup()){\n                const topDraftRows = rowNode.getTopDraftRows?.() ?? [];\n                const bottomDraftRows = rowNode.getBottomDraftRows?.() ?? [];\n                const childCount = rowNode.getChildCount();\n                let pinPosition: rowPinPositions = this.rowPinPosition;\n                if(includeDraftRows){\n                    if(topDraftRows.length > 0){\n                        pinPosition = 'topDraftRow';\n                    }\n                    else if(childCount === 0 && bottomDraftRows.length > 0){\n                        pinPosition = 'bottomDraftRow';\n                    }\n                }\n                return {\n                    rowIndex    : 0,\n                    pinPosition,\n                    parentKeys  : rowNode.getGroupValues()\n                }\n            }\n        }\n        return null;\n    }\n\n\n    getLastLeafRowMeta(includeDraftRows: boolean = true): IRowMeta {\n        for(let i = this.cacheBlockOrder.length - 1; i >= 0; i--){\n            const blockMeta = this.cacheBlockOrder[i];\n            const {blockId} = this.decodeCacheBlockId(blockMeta);\n            const rowNode = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n            if(rowNode.isLeafGroup()){\n                const bottomDraftRows     = rowNode.getBottomDraftRows?.() ?? [];\n                const bottomDraftRowCount = bottomDraftRows.length;\n                let   pinPosition         = this.rowPinPosition;\n                let   rowIndex            = rowNode.getChildCount() - 1;\n                const topDraftRows = rowNode.getTopDraftRows?.() ?? [];\n                const topDraftRowCount = topDraftRows.length;\n                if(includeDraftRows){\n                    if(bottomDraftRowCount > 0){\n                        pinPosition = 'bottomDraftRow';\n                        rowIndex    = bottomDraftRowCount - 1;\n                    }\n                    else if(rowNode.getChildCount() === 0 && topDraftRows.length > 0){\n                        pinPosition = 'topDraftRow';\n                        rowIndex    = topDraftRowCount - 1;\n                    }\n                }\n                if(rowIndex < 0){\n                    continue;\n                }\n                return {\n                    rowIndex    : rowIndex,\n                    pinPosition : pinPosition,\n                    parentKeys  : rowNode.getGroupValues()\n                }\n            }\n        }\n        return null;\n    }\n    insertRowNode(_index: number, _groupkeys: IGroupKeys, _rownode: any): void {\n        throw new Error('Method not implemented.');\n    }\n    hideRow(index: number): void {\n        this.rowAxis.hideRow(index);\n    }\n    showRow(index: number): void {\n        return this.rowAxis.showRow(index);\n    }\n    isRowHidden(index: number): boolean {\n        return this.rowAxis.isRowHidden(index);\n    }\n    getRowNodeHelper(): any {\n        return this.rowNodeHelper;\n    }\n    getDisplayIndexByPosition(top: number, left?: number): number {\n        return this.rowAxis.getDisplayIndexByPosition(top, left);\n    }\n\n    resetSort(): void {\n        \n    }\n    applySort(_sortKeys: any): void {\n        \n    }\n    resetFilter(): void {\n        \n    }\n    applyFilter(_filterKeys: any): void {\n        \n    }\n    resetRowGrouping(): void {\n        \n    }\n    applyGroupBy(_groupModel: any): void {\n        \n    }\n\n    getChildIndexById(parentId: string, id: string): number {\n        const block = this.cacheBlockHolder[parentId];\n        return block.getIndexById(id) ?? null;\n    }\n\n    getParentNode(parentKeys: string[]): IGroupedRowNodeCore {\n        parentKeys.unshift(TreeGridRemoteDataBlock.ROOT_ID);\n        const id = parentKeys.join(cacheIdSpliter);\n        return this.rowNodeHelper.getRowNodeById(id) as any;\n    }\n\n    getAncestorNode(parentKeys: string[]): IGroupedRowNodeCore[] {\n        parentKeys.unshift(TreeGridRemoteDataBlock.ROOT_ID);\n        const id         = parentKeys.join(cacheIdSpliter);\n        const node       = this.rowNodeHelper.getRowNodeById(id) as any;\n        const ancesstors = node.getAncestors();\n        ancesstors.push(node);\n        return ancesstors;\n    }\n\n    getRowsInDataCache(): number[] {\n        return [];//need to implement\n    }\n\n    private removeDraftRowsForBlock(blockId: string): void {\n        const parentNode = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n        if (!parentNode || !parentNode.isLeafGroup?.()) {\n            return;\n        }\n\n        const allDraftIds: string[] = [];\n        const topDraftRows = parentNode.getTopDraftRows?.() ?? [];\n        const bottomDraftRows = parentNode.getBottomDraftRows?.() ?? [];\n        allDraftIds.push(...topDraftRows, ...bottomDraftRows);\n\n        this.removeDraftRows(allDraftIds);\n    }\n\n    private insertDraftRowsForBlock(blockId: string, insertPosition: IDraftPosition, count: number): void {\n        const parentNode = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n        if (!parentNode || !parentNode.isLeafGroup()) return;\n\n        // Check if draft rows already exist for this position to avoid duplicates\n        const existingDrafts = insertPosition === 'topDraftRow' ? parentNode.getTopDraftRows?.() : parentNode.getBottomDraftRows?.();\n        if (!parentNode.isChildrenCollapsed() && existingDrafts && existingDrafts.length > 0) {\n            return;\n        }\n\n        const parentKeys     = parentNode.getGroupValues() ?? [];\n        const block          = this.cacheBlockHolder[blockId];\n        const blockRowCount  = block ? block.getRowCount() : 0;\n        const rowPinPosition = insertPosition;\n        const isTop          = insertPosition === 'topDraftRow';\n\n        let insertAbsoluteIndex: number;\n        if (isTop) {\n            insertAbsoluteIndex = this.getIndexById(blockId) + 1;\n        } else {\n            // For bottom draft rows, find position after last child\n            if (blockRowCount > 0) {\n                const lastChildMeta = this.encodeCacheBlockId(blockId, blockRowCount - 1);\n                const lastChildIndex = this.cacheBlockOrder.indexOf(lastChildMeta);\n                if (lastChildIndex !== -1) {\n                    insertAbsoluteIndex = lastChildIndex + 1;\n                } else {\n                    // Children not in cacheBlockOrder yet, fall back to after parent\n                    insertAbsoluteIndex = this.getIndexById(blockId) + 1;\n                }\n            } else {\n                // No children, insert after parent\n                insertAbsoluteIndex = this.getIndexById(blockId) + 1;\n            }\n        }\n\n        for (let localIndex = 0; localIndex < count; localIndex++) {\n            const absoluteIndex         = insertAbsoluteIndex + localIndex;\n            const definition            = this.fetchRowDefinition(localIndex, parentKeys, {}, false, rowPinPosition) as IDraftRowDefinition;\n                  definition.cssClasses = GRID_CLASS_NAMES.GRID_DRAFT_ROW;\n            const id                    = this.generateDraftRowId(localIndex, parentNode, rowPinPosition);\n            const draftData             = definition?.draftData ?? {};\n            const rowNode               = this.createRowNode(id, draftData, definition, true);\n\n            rowNode.setParentId(blockId);\n            rowNode.updateLevel(parentNode.getLevel() + 1);\n            rowNode.setPinnedPosition(insertPosition);\n\n            const height = this.heightFetcher({ rowIndex: localIndex, rowPinPosition, parentKeys });\n\n            const blockAxis = this.rowAxis.createBlock(this.defaultConfig);\n            this.rowAxis.insertBlock(blockAxis, null, absoluteIndex);\n            blockAxis.appendRow(height);\n\n            const meta = rowNode.getId();\n            this.cacheBlockOrder.splice(absoluteIndex, 0, meta);\n\n            this.rowNodeHolder.set(id, rowNode);\n            parentNode.addDraftRow(id, insertPosition);\n            this.draftRowMap[id] = rowNode as IGroupedRowNodeCore;\n        }\n\n        this.rowAxis.updateRelativeValues();\n    }\n\n    isDraftRow(rowId: string): boolean {\n        return this.draftRowMap[rowId] !== undefined;\n    }\n\n    insertDraftRows(): void {\n        const topDraftRowCount = this.optionsHandler.getTopDraftRowCount();\n        const bottomDraftRowCount = this.optionsHandler.getBottomDraftRowCount();\n        if (topDraftRowCount <= 0 && bottomDraftRowCount <= 0) return;\n        for (const blockId of Object.keys(this.cacheBlockHolder)) {\n            const rowNode = this.getRowNodeById(blockId) as IGroupedRowNodeCore;\n            if (rowNode?.isLeafGroup() && !rowNode.isCollapsed()) {\n                this.insertDraftRowsForBlock(blockId, 'topDraftRow', topDraftRowCount);\n                this.insertDraftRowsForBlock(blockId, 'bottomDraftRow', bottomDraftRowCount);\n            }\n        }\n        this.nullifyAllMargins();\n        this.addGroupTopBottomMargins(this.getRootId());\n        this.rowAxis.updateRelativeValues();\n    }\n\n    removeDraftRows(rowIDs: string[]): void {\n        if (!rowIDs || rowIDs.length === 0) {\n            return;\n        }\n\n        rowIDs.forEach(id => {\n            if (!this.isDraftRow(id)) {\n                return;\n            }\n            const { parentNode } = this.decodeDraftRowId(id);\n            if (!parentNode) {\n                return;\n            }\n\n            const absoluteIndex = this.cacheBlockOrder.indexOf(id);\n            if (absoluteIndex !== -1) {\n                this.rowAxis.deleteRow(absoluteIndex);\n                this.cacheBlockOrder.splice(absoluteIndex, 1);\n            }\n\n            this.rowNodeHolder.delete(id);\n            delete this.draftRowMap[id];\n            parentNode.removeDraftRow?.(id);\n        });\n\n        this.rowAxis.updateRelativeValues();\n        this.nullifyAllMargins();\n        this.addGroupTopBottomMargins(this.getRootId());\n        this.rowAxis.updateRelativeValues();\n    }\n    parseFromDraftIndex(draftIndex: number): IRowMeta {\n        return {\n            parentKeys : [],\n            rowIndex   : draftIndex,\n            pinPosition : this.rowPinPosition\n        };\n    }\n    parseToDraftIndex(index: number): number {\n        return index;\n    }\n    getLastRowNode(): IRowNodeCore {\n        throw new Error('Method not implemented.');\n    }\n    getFirstRowNode(): IRowNodeCore {\n        throw new Error('Method not implemented.');\n    }\n\n    setAllHeightTo(height: number): void { //only for leaf\n        const includeDraftRows = true;\n        const startRowMeta = this.getFirstRowMeta(includeDraftRows);\n        const endRowMeta   = this.getLastRowMeta(includeDraftRows);\n        const leafRows     = this.getLeafChildrenExcludingCollapsed(startRowMeta, endRowMeta);\n        leafRows.forEach(rowMeta=>{\n            const index = this.getAbsoluteIndex(rowMeta.rowIndex, rowMeta.parentKeys, rowMeta.pinPosition);\n            this.setHeight(index, height);\n        })\n    }\n\n   isValidRow(index: number, parentKeys?: IGroupKeys): boolean {\n        const hasFullTreeStructure = this.optionalHandler.hasFullTreeStructureProvided();\n        if(hasFullTreeStructure){\n            const blockId = parentKeys.length > 0 ? parentKeys[parentKeys.length - 1] : TreeGridRemoteDataBlock.ROOT_ID;            //for tables id's are same as block id\n            return this.cacheBlockHolder[blockId] !== undefined;\n        }\n        return super.isValidRow(index, parentKeys);\n   }\n\n    getLastRow(parentId : string = TreeGridRemoteDataBlock.ROOT_ID, includeDraftRows : boolean = false): number {\n        return this.getLastRowInGroup(parentId, includeDraftRows);\n    }\n\n    refreshDraftRows() : void {\n        const draftRows = Object.values(this.draftRowMap);\n        draftRows.forEach(rowNode=>{\n            const rowMeta    = rowNode.getRowMeta();\n            const definition = this.fetchRowDefinition(rowMeta.rowIndex, rowMeta.parentKeys, {}, false, rowMeta.pinPosition) as IDraftRowDefinition;\n            const draftData  = definition?.draftData ?? {};\n            rowNode.updateDefinition(definition);\n            rowNode.updateRowData(draftData);\n        });\n    }\n}\n","// import { IAxis } from \"./IAxis.types\";\n\nimport { IAxis } from \"./IAxis.types\";\nimport { GridAxis } from \"./newAxis\";\n\n// function binarySearch(arr, position) {\n//     let low = 0;\n//     let high = arr.length - 1;\n\n//     if(arr[high] == 0) {\n//         for(let i = high; i >= 0; i--) {\n//             if(arr[i] != 0) {\n//                 high = i;\n//                 break;\n//             }\n//         }\n//     }\n\n//     while (low <= high) {\n//         const mid = Math.floor((low + high) / 2);\n\n//         if (arr[mid] <= position && (arr[mid+1] == undefined || position < arr[mid+1]) ) {\n//             return mid; // position element found\n//         } else if (arr[mid] < position ) {\n//             low = mid + 1; // Search the right half\n//         } else {\n//             high = mid - 1; // Search the left half\n//         }\n//     }\n\n//     return -1; // Target element not found\n// }\n\n// class PositionArray extends Array{\n//     // private size : number;\n//     private relativePosition : number;\n//     private lastIndexSize : number;\n//     constructor(size : number) {\n//         super(size);\n//         this.relativePosition = 0;\n//         this.lastIndexSize = 0;\n//         // this.size = size;\n//         this.fill(0);\n//     } \n\n//     setLastIndexSize(size : number) : void {\n//         this.lastIndexSize = size;\n//     }\n\n//     getLastIndexSize() : number {\n//         return this.lastIndexSize;\n//     }\n\n//     getTotalSize() : number {\n//         return this[this.length-1] + this.lastIndexSize;\n//     }\n\n//     getRelativePosition() : number { \n//         return this.relativePosition;\n//     }\n\n//     setRelativePosition(position : number) : void { \n//         this.relativePosition = position;\n//     }\n// }\n\n// class Axis implements IAxis{\n//     private positions  : PositionArray[];\n//     private totalCount : number;\n//     private packSize   : number;\n\n//     constructor() {\n//         this.positions    = [];\n//         this.packSize     = 16;\n//         this.totalCount   = 0;\n//     }\n\n//     resetAxis() : void{\n//         this.positions    = [];\n//         this.packSize     = 16;\n//         this.totalCount   = 0;\n//     }\n    \n//     resizeAll(height: number): void {\n//         const lastVerticalIndex = this.positions.length - 1;\n//         for(let i = 0; i <= lastVerticalIndex; i++){\n//             const array = this.positions[i];\n//             if(lastVerticalIndex != i){\n//                 array.fill(height);\n//                 array.setLastIndexSize(height);\n//             }\n//             else{\n//                 for(let j = i*this.packSize; j < this.totalCount; j++){\n//                     array[j] = height;\n//                     (j == this.totalCount - 1) && array.setLastIndexSize(height);\n//                 }\n//             }\n//         }\n//     }\n\n//     getIndexValues(index) : number[]{\n//         return [Math.floor(index/this.packSize), index%this.packSize];\n//     } \n\n//     updateRelativePosition(verticalIndex){\n//         const lastVerticalIndex = this.getIndexValues(this.totalCount)[0] + 1;\n//         for(let i = lastVerticalIndex; i < this.positions.length; i++){     //remove unnecessary vertical index array\n//             this.positions.splice(lastVerticalIndex, 1);\n//         }\n//         for(let i = verticalIndex; i < this.positions.length; i++){\n//             const prevRelativePosition = this.positions[i-1] ? this.positions[i-1].getRelativePosition() : 0;\n//             const totalSize = this.positions[i-1] ? this.positions[i-1].getTotalSize() : 0;\n//             const relativePosition = prevRelativePosition + totalSize;\n//             this.positions[i].setRelativePosition(relativePosition);\n//         }\n//     }\n\n//     insertAtIndex(index : number, size : number){\n//         this.totalCount++;\n//         const [verticalIndex] = this.getIndexValues(index);\n//         for(let i = this.totalCount; i > index && i > 0; i--){\n//             const [verticalIndex, horizontalIndex] = this.getIndexValues(i);\n//             if(!this.positions[verticalIndex]){\n//                 this.positions[verticalIndex] = new PositionArray(this.packSize);\n//             }\n            \n//             const array = this.positions[verticalIndex];\n//             if(horizontalIndex == this.packSize-1){\n//                 array.setLastIndexSize(size);\n//             }\n//             if(horizontalIndex != 0){\n//                 const array = this.positions[verticalIndex];\n//                 array[horizontalIndex] = (array[horizontalIndex-1] ?? 0) + size;\n//             }\n//             else{\n//                 const prevArray = this.positions[verticalIndex-1];\n//                 prevArray && prevArray.setLastIndexSize(size);\n//             }\n//         }\n//         this.updateRelativePosition(verticalIndex);\n//     }\n\n//     removeIndex(index : number){\n//         let [verticalIndex, horizontalIndex] = this.getIndexValues(index);\n//         const size = this.getSize(index);\n//         for(let i = index; i < this.totalCount; i++){      //position updating\n//             const [verticalIndex, horizontalIndex] = this.getIndexValues(i);\n//             if(!this.positions[verticalIndex]){\n//                 this.positions[verticalIndex] = new PositionArray(this.packSize);\n//             }\n//             const array = this.positions[verticalIndex];\n//             if(horizontalIndex == this.packSize-1){\n//                 const nextPos = this.getPosition(i+1);\n//                 const lastIndexSize = Math.max(0, nextPos - array[horizontalIndex]);\n//                 array[horizontalIndex] = nextPos - array.getRelativePosition() - size;\n//                 array.setLastIndexSize(lastIndexSize);\n//             }\n//             else if(horizontalIndex != 0){\n//                 array[horizontalIndex] = (array[horizontalIndex+1] ?? 0) - size;\n//             }\n//         }\n//         [verticalIndex, horizontalIndex] = this.getIndexValues(this.totalCount);\n//         const array = this.positions[verticalIndex];\n//         if(array){\n//             array[horizontalIndex] = 0;\n//             if(horizontalIndex == 1) {\n//                 this.positions.splice(verticalIndex, 1);\n//             }\n//         }\n//         this.totalCount--;\n//         this.updateRelativePosition(verticalIndex);\n//     }\n \n//     getSize(index : number) : number{\n//         const [verticalIndex, horizontalIndex] = this.getIndexValues(index);\n//         const array = this.positions[verticalIndex];\n\n//         if(index == (this.totalCount - 1)){\n//             return this.getTotalSize()-(array.getRelativePosition() + array[horizontalIndex]);\n//         }\n//         return this.getPosition(index+1) - this.getPosition(index);\n//     }\n\n//     getPosition(index: number): number {\n//         if(this.totalCount <= index){\n//             return this.getTotalSize();\n//         }\n//         const [verticalIndex, horizontalIndex] = this.getIndexValues(index);\n//         const array = this.positions[verticalIndex];\n//         return array[horizontalIndex] + array.getRelativePosition();\n//     }\n\n//     getVerticalPosition(position : number) : number {\n//         const totalSize = this.getTotalSize();\n//         if(position<=0){\n//             return 0;\n//         }\n//         else if(position >= totalSize){\n//             return this.positions.length-1;\n//         }\n        \n//         let low = 0;\n//         let high = this.positions.length - 1;\n    \n//         while (low <= high) {\n//             const mid = Math.floor((low + high) / 2);\n    \n//             if (this.positions[mid].getRelativePosition() <= position && (this.positions[mid+1]?.getRelativePosition() == undefined || position < this.positions[mid+1].getRelativePosition()) ) {\n//                 return mid; // position element found\n//             } else if (this.positions[mid].getRelativePosition() < position) {\n//                 low = mid + 1; // Search the right half\n//             } else {\n//                 high = mid - 1; // Search the left half\n//             }\n//         }\n    \n//         return -1; // Target element not found\n//     }\n\n//     getIndexByPosition(position : number) : number {\n//         const verticalIndex = this.getVerticalPosition(position);\n        \n//         if(position <= 0) {\n//             return 0;\n//         }\n//         else if(position >= this.getTotalSize()){\n//             return this.totalCount-1;\n//         }\n        \n//         const array = this.positions[verticalIndex];\n//         const subArrayPosition = position - array.getRelativePosition();\n//         const horizontalIndex = binarySearch(array, subArrayPosition);\n\n//         return (verticalIndex * this.packSize) + horizontalIndex;\n//     }\n\n//     resize(index : number, size : number) : void{\n//         const [verticalIndex, horizontalIndex] = this.getIndexValues(index);\n//         const [lastVerticalIndex] = this.getIndexValues(this.totalCount-1);\n//         const isLastVericalIndex = verticalIndex == lastVerticalIndex;\n\n//         const array = this.positions[verticalIndex];\n//         const diff = size - this.getSize(index);\n        \n//         const length = isLastVericalIndex ? (this.totalCount % this.packSize) : this.packSize-1;\n//         if(horizontalIndex == this.packSize-1){\n//             array.setLastIndexSize(size);\n//         }\n//         for(let loopIndex = horizontalIndex+1; loopIndex <= length; loopIndex++){\n//             array[loopIndex] += diff;\n//         }\n//         this.updateRelativePosition(verticalIndex);\n//     }\n\n//     getTotalSize() : number{\n//         const [verticalIndex, horizontalIndex] = this.getIndexValues(this.totalCount);\n//         if(this.totalCount != 0 && horizontalIndex == 0){\n//             const lastBeforeIndex = this.totalCount - 1;\n//             const [verticalIndex] = this.getIndexValues(lastBeforeIndex);\n//             const array           = this.positions[verticalIndex];\n//             return this.getPosition(lastBeforeIndex) + array.getLastIndexSize();\n//         }\n//         const array = this.positions[verticalIndex];\n//         return array ? array.getRelativePosition() + array[horizontalIndex] : 0;\n//     }\n\n//     getTotalCount() : number { \n//         return this.totalCount\n//     }\n// }\n\n// export {\n//     Axis\n// }\n\n\n\nexport class Axis implements IAxis {\n    private gridAxis: GridAxis;\n    private packSize: number;\n    constructor(packsize = 16) {\n        this.packSize = packsize;\n        this.resetAxis();\n    }\n    resizeAll(height: number): void {\n        for(let i = 0; i < this.gridAxis.getTotalCount(); i++){\n            this.resize(i, height);\n        }\n    }\n    resetAxis(): void {\n        this.gridAxis = new GridAxis(this.packSize);\n    }\n    getPosition(index: number): number {\n        return this.gridAxis.findPositionByIndex(index);\n    }\n    getIndexByPosition(position: number): number {\n        return this.gridAxis.findIndexByPos(position);\n    }\n    getTotalSize(): number {\n        return this.gridAxis.getTotalWidth();\n    }\n    insertAtIndex(index: number, size: number): void {\n        return this.gridAxis.insertAtIndex(index, size);\n    }\n    removeIndex(index: number): void {\n        return this.gridAxis.deleteIndex(index);\n    }\n    getSize(index: number): number {\n        return this.gridAxis.findWidthByIndex(index);\n    }\n    resize(index: number, size: number, _callback?: CallableFunction): void {\n        this.gridAxis.resize(index, size);\n    }\n    getTotalCount(): number {\n        return this.gridAxis.getTotalCount();\n    }\n}","import { IAxisConfig, IRowAxisCore } from \"./rowAxis.types\";\nimport { Axis } from \"./Axis\";\nimport { IAxis } from \"./IAxis.types\";\n\nexport class DynamicRowAxis implements IRowAxisCore {\n    private marginTop    : number;\n    private marginBottom : number;\n    public  totalMargin  : number;\n    private axis         : IAxis;\n    private hiddenRows   : Map<number, number>;\n    \n    constructor(config : IAxisConfig = {}) {\n        const {marginTop, marginBottom} = config;\n        this.hiddenRows = new Map();\n        this.updateMargin(marginTop, marginBottom);\n    }\n    updateBottomMargin(marginBottom: number = 0): void {\n        this.marginBottom = marginBottom;\n        this.totalMargin  = this.marginTop + this.marginBottom;\n    }\n    updateTopMargin(marginTop: number = 0): void {\n        this.marginTop    = marginTop;\n        this.totalMargin  = this.marginTop + this.marginBottom;\n    }\n    getBottomMargin(): number {\n        return this.marginBottom;\n    }\n    getTopMargin(): number {\n        return this.marginTop;\n    }\n    resetRows(): void {\n        this.axis.resetAxis();\n    }\n    updateAllHeight(height: number): void {\n        this.axis.resizeAll(height);\n    }\n    getMargin(): number {\n        return this.totalMargin;\n    }\n    getVerticalIndex(index: number, count?: number): number {\n        return index + count;\n    }\n    \n    private updateMargin(marginTop : number = 0, marginBottom: number = 0): void {\n        this.marginTop    = marginTop;\n        this.marginBottom = marginBottom;\n        this.totalMargin  = this.marginTop + this.marginBottom;\n        this.axis         = new Axis();\n    }\n\n    getVisibleIndexesByPosition(localTop: number, localBottom: number, _left: number): number[] {\n        if (this.axis.getTotalCount() === 0) {\n            return [];\n        }\n        const totalSize = this.axis.getTotalSize();\n        let top = localTop;\n        const visibleIndexes: number[] = [];\n        while (top < localBottom) {\n            // GridAxis.findIndexByPos returns -1 when position is past content (leftVal > totalWidth),\n            // when count is 0, or from SubAxis.binarySearch edge cases (e.g. coords before first row).\n            if (top >= totalSize) {\n                break;\n            }\n            const index = this.axis.getIndexByPosition(top);\n            if (index < 0) {\n                break;\n            }\n            if (!this.hiddenRows.has(index)) {\n                visibleIndexes.push(index);\n            }\n            const height = this.axis.getSize(index);\n            if (height <= 0) {\n                top += 1;\n                continue;\n            }\n            // top += height;  miscalculation of top position missing rowheight\n            const rowStart = this.axis.getPosition(index);\n            top = rowStart + height;\n        }\n        return visibleIndexes;\n    }\n\n    convertToActualIndex(visibleIndex: number): number {\n        return visibleIndex;\n    }\n    insertRow(index: number, height: number): void {\n        this.axis.insertAtIndex(index, height);\n    }\n    updateRow(index: number, height: number): void {\n        this.axis.resize(index, height);\n    }\n    appendRow(height: number): void {\n        this.axis.insertAtIndex(this.axis.getTotalCount(), height);\n    }\n    appendMultipleRows(heights: number[]): void {\n        for(let i = 0; i < heights.length; i++){\n            this.appendRow(heights[i]);\n        }\n    }\n    deleteRow(index: number): void {\n       this.axis.removeIndex(index);\n    }\n    getTotalHeight(ignoreHideValidation?: boolean): number {\n        if (ignoreHideValidation) {\n            return this.axis.getTotalSize();\n        }\n        \n        let totalHeight = 0;\n        for (let i = 0; i < this.axis.getTotalCount(); i++) {\n            if (!this.hiddenRows.has(i)) {\n                totalHeight += this.axis.getSize(i);\n            }\n        }\n        return totalHeight;\n    }\n    \n    getTotalCount(): number {\n        return this.axis.getTotalCount();\n    }\n    \n    getVisibleCount(): number {\n        return this.axis.getTotalCount() - this.hiddenRows.size;\n    }\n    getTop(index: number, ignoreHideValidation?: boolean): number {\n        if (ignoreHideValidation) {\n            return this.axis.getPosition(index);\n        }\n        \n        let position = 0;\n        for (let i = 0; i < index; i++) {\n            if (!this.hiddenRows.has(i)) {\n                position += this.axis.getSize(i);\n            }\n        }\n        return position;\n    }\n    getHeight(index: number, ignoreHideValidation?: boolean): number {\n        if (!ignoreHideValidation && this.hiddenRows.has(index)) {\n            return 0; \n        }\n        return this.axis.getSize(index);\n    }\n    getLeft(_index: number, _ignoreHideValidation?: boolean): number {\n        return null;\n    }\n    getWidth(_index: number, _ignoreHideValidation?: boolean): number {\n        return null;\n    }\n    getIndexByPosition(top: number, _left?: number, ignoreHideValidation?: boolean): number {\n        if (ignoreHideValidation) {\n            return this.axis.getIndexByPosition(top);\n        }\n        \n        let currentPosition = 0;\n        for (let i = 0; i < this.axis.getTotalCount(); i++) {\n            if (!this.hiddenRows.has(i)) {\n                const rowHeight = this.axis.getSize(i);\n                if (top >= currentPosition && top < currentPosition + rowHeight) {\n                    return i;\n                }\n                currentPosition += rowHeight;\n            }\n        }\n        \n        return this.axis.getTotalCount() - 1;\n    }\n    hideRow(index: number): void {\n        if (this.hiddenRows.has(index)) {\n            return;\n        }\n        \n        const originalHeight = this.axis.getSize(index);\n        this.hiddenRows.set(index, originalHeight);\n        this.axis.resize(index, 0);\n    }\n    \n    showRow(index: number): void {\n        if (!this.hiddenRows.has(index)) {\n            return; // Not hidden\n        }\n        \n        const originalHeight = this.hiddenRows.get(index)!;\n        this.axis.resize(index, originalHeight);\n        \n        this.hiddenRows.delete(index);\n    }\n    \n    isRowHidden(index: number): boolean {\n        return this.hiddenRows.has(index);\n    }\n    getDisplayIndexByPosition(top: number, left?: number): number {\n        return this.getIndexByPosition(top, left, false); \n    }\n    \n    getHiddenRowIndices(): number[] {\n        return Array.from(this.hiddenRows.keys()).sort((a, b) => a - b);\n    }\n    \n    clearHiddenRows(): void {\n        for (const [index, height] of this.hiddenRows.entries()) {\n            this.axis.resize(index, height);\n        }\n        this.hiddenRows.clear();\n    }\n}","\n\n//atlast api as to calculation from localIndex\n\nimport { IBlockRowAxisCore } from \"./grouped-rowAxis.types\";\nimport { IRowAxisCore } from \"./rowAxis.types\";\n\nexport class RowBlockAxisCore implements IBlockRowAxisCore{\n    protected relativeCount  : number;\n    protected relativeTop    : number;\n    protected axis           : IRowAxisCore;\n    protected isBlockVisible : boolean;\n\n    constructor(){\n        this.relativeCount = 0;\n        this.relativeTop   = 0;\n        this.isBlockVisible = true;\n    }\n\n    updateBottomMargin(marginBottom: number = 0): void {\n        this.axis.updateBottomMargin(marginBottom);\n    }\n\n    updateTopMargin(marginTop: number = 0): void {\n        this.axis.updateTopMargin(marginTop);\n    }\n\n    getBottomMargin(): number {\n        return this.axis.getBottomMargin();\n    }\n\n    getTopMargin(): number {\n        return this.axis.getTopMargin();\n    }\n\n    resetRows(): void {\n        this.axis.resetRows();\n    }\n\n    updateAllHeight(height: number): void {\n        this.axis.updateAllHeight(height);\n    }\n\n    getMargin(): number {\n        return this.axis.getMargin();\n    }\n\n    getVerticalIndex(index: number, count?: number): number {\n        return this.axis.getVerticalIndex(index, count);\n    }\n\n    getVisibleIndexesByPosition(globalTop: number, globalBottom: number, left: number): number[] {\n        let visibleIndexes = [];\n        if(this.isBlockVisible){\n            const localTop = this.convertGlobalToLocalTop(globalTop);\n            const localBottom = this.convertGlobalToLocalTop(globalBottom);\n            visibleIndexes = this.axis.getVisibleIndexesByPosition(localTop, localBottom, left);\n        }\n        return visibleIndexes.map((index) => this.convertLocalToGlobalIndex(index));\n    }\n\n    isVisible(): boolean {\n        return this.isBlockVisible;\n    }\n\n    updateVisibleState(visible: boolean): void {\n        this.isBlockVisible = visible;\n    }\n\n    convertToActualIndex(visibleIndex: number): number {\n        return this.axis.convertToActualIndex(visibleIndex);\n    }\n\n    getTotalCount(): number {\n        return this.axis.getTotalCount();\n    }\n\n    getTotalHeight(ignoreHideValidation: boolean = false): number {\n        if(!ignoreHideValidation){\n            return this.isBlockVisible ? this.axis.getTotalHeight() : 0;\n        }\n        return this.axis.getTotalHeight();\n    }\n\n    updateRow(globalIndex: number, height: number): void {\n        const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n        return this.axis.updateRow(localIndex, height);\n    } \n    hideRow(globalIndex: number): void {\n        const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n        return this.axis.hideRow(localIndex);\n    }\n    showRow(globalIndex: number): void {\n        const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n        return this.axis.showRow(localIndex);\n    }\n    isRowHidden(globalIndex: number): boolean {\n        if(!this.isBlockVisible){\n            return !this.isBlockVisible;\n        }\n        const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n        return this.axis.isRowHidden(localIndex);\n    }\n\n    getRelativeCount(): number {\n        return this.relativeCount;\n    }\n\n    getRelativeTop(): number {\n        return this.relativeTop;\n    }\n\n    getLeft(globalIndex: number): number {\n        const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n        return this.axis.getLeft(localIndex);\n    }\n\n    convertLocalToGlobalIndex(localIndex : number) : number{\n        return this.relativeCount + localIndex;\n    }\n\n    convertGlobalToLocalIndex(globalIndex : number) : number{\n        return Math.max(0, globalIndex - this.relativeCount);\n    }\n\n    convertLocalToGlobalTop(localTop : number) : number{\n        return this.relativeTop + localTop;\n    }\n\n    convertGlobalToLocalTop(globalTop : number) : number {\n        return Math.max(0, globalTop - this.relativeTop);\n    }\n\n    appendRow(height : number): void {\n        return this.axis.appendRow(height);\n    }\n\n    appendMultipleRows(heights : number[]): void {\n        return this.axis.appendMultipleRows(heights);\n    }\n\n    deleteRow(index: number): void {\n        const localIndex = this.convertGlobalToLocalIndex(index);\n        return this.axis.deleteRow(localIndex);\n    }\n     \n    insertRow(index: number, height: number): void {\n        const localIndex = this.convertGlobalToLocalIndex(index);\n        return this.axis.insertRow(localIndex, height);\n    }\n\n    getTop(globalIndex : number, ignoreHideValidation: boolean = false) : number{\n        if(!ignoreHideValidation && !this.isBlockVisible){\n            return this.relativeTop;\n        }\n        const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n        return this.getGlobalTop(localIndex);\n    }\n\n    getWidth(index: number, ignoreHideValidation: boolean = false): number {\n        if(!ignoreHideValidation && !this.isBlockVisible){\n            return 0;\n        }\n        const localIndex = this.convertGlobalToLocalIndex(index);\n        return this.axis.getWidth(localIndex);\n    }\n\n    getHeight(index: number, ignoreHideValidation: boolean = false): number {\n        if(!ignoreHideValidation && !this.isBlockVisible){\n            return 0;\n        }\n        const localIndex = this.convertGlobalToLocalIndex(index);\n        return this.axis.getHeight(localIndex);\n    }\n\n    getIndexByPosition(globalTop : number, left : number, ignoreHideValidation: boolean = false) : number{\n        if(!ignoreHideValidation && !this.isBlockVisible){\n            return this.relativeCount;\n        }\n        const localTop = this.convertGlobalToLocalTop(globalTop);\n        return this.getGlobalIndex(localTop, left);\n    }\n\n    getGlobalTop(localIndex : number) : number {\n        const top = this.axis.getTop(localIndex);\n        return this.convertLocalToGlobalTop(top);\n    }\n\n    getGlobalIndex(localTop : number, localLeft : number) : number {\n        const index = this.axis.getIndexByPosition(localTop, localLeft);\n        return this.convertLocalToGlobalIndex(index);\n    }\n\n    setRelativeCount(index : number) : void {\n        this.relativeCount = index;\n    }\n    \n    setRelativeTop(top : number) : void {\n        this.relativeTop = top;\n    }\n\n    getDisplayIndexByPosition(_top: number, _left?: number): number {\n        return 0;\n    }\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { IBlockRowAxisCore, IGroupedRowAxis } from \"./grouped-rowAxis.types\";\n\nexport class groupedRowAxisCore extends EventEmitter implements IGroupedRowAxis {\n    protected totalCount            : number;\n    protected groupOrder            : IBlockRowAxisCore[];\n\n    constructor(){\n        super();\n        this.totalCount           = 0;\n        this.groupOrder           = [];\n    }\n\n    nullifyAllMargins(): void {\n        this.groupOrder.forEach(blockAxis => {\n            blockAxis.updateTopMargin(0);\n            blockAxis.updateBottomMargin(0);\n        });\n    }\n\n    resetRows(): void {\n        this.totalCount = 0;\n        this.groupOrder = [];\n    }\n\n    updateAllHeight(height: number): void {\n        this.groupOrder.forEach(blockAxis => blockAxis.updateAllHeight(height));\n        this.updateRelativeValues();\n    }\n\n    getMargin(): number {\n        const block = this.getBlockByIndex(0);\n        return block?.getMargin() ?? 0;\n    }\n    getTopMargin(): number {\n        const block = this.getBlockByIndex(0);\n        return block?.getTopMargin() ?? 0;\n    }\n    getBottomMargin(): number {\n        const block = this.getBlockByIndex(0);\n        return block?.getBottomMargin() ?? 0;\n    }\n    updateBottomMargin(_marginBottom: number = 0): void {\n        \n    }\n    updateTopMargin(_marginTop: number = 0): void {\n    }\n\n    protected findBlockIndexByIndex(index : number) : number | null{\n        let start                 = 0;\n        let end                   = this.groupOrder.length-1;\n        let loopCount             = 0;\n        while(start <= end){\n            const midIndex        = Math.floor((start + end) / 2);\n            const midAxis         = this.groupOrder[midIndex];\n            const relativeCount   = midAxis.getRelativeCount();\n            loopCount ++;\n            if(loopCount > 10){\n                // debugger;\n            }\n            if(relativeCount <= index && index < relativeCount + midAxis.getTotalCount()){\n                return midIndex;\n            }\n            else if(index < relativeCount){\n                end               = midIndex-1;\n            }\n            else {\n                start             = midIndex+1;\n            }\n        }\n        return null;\n    }\n\n    protected findBlockIndexByTop(globalTop: number) : number | null {\n        let start                 = 0;\n        let end                   = this.groupOrder.length-1;\n        let loopCount             = 0;\n        if(this.getTotalHeight() <= globalTop){\n            return end\n        }\n        while(start <= end){\n            const midIndex        = Math.floor((start + end) / 2);\n            const midAxis         = this.groupOrder[midIndex];\n            const relativeTop     = midAxis.getRelativeTop();\n            loopCount ++;\n            if(loopCount > 10){\n                // debugger;\n            }\n            if(relativeTop <= globalTop && globalTop < relativeTop + midAxis.getTotalHeight()){\n                return midIndex;\n            }\n            else if(globalTop < relativeTop){\n                end               = midIndex-1;\n            }\n            else {\n                start             = midIndex+1;\n            }\n        }\n        return null;\n    }\n\n    private updateBlockState(state : boolean, startIndex : number, endIndex : number = startIndex) : void {\n        for(let index = startIndex; index <= endIndex; index++){\n            const blockIndex          = this.findBlockIndexByIndex(index);\n            if(blockIndex != null){\n                const block = this.groupOrder[blockIndex];\n                block.updateVisibleState(state);\n                index += block.getTotalCount() - 1;\n            }\n        }\n        this.updateRelativeValues();\n    }\n\n    protected getNewBlock(): IBlockRowAxisCore {\n        return null;\n    }\n\n    getVerticalIndex(index : number, count : number = 1) : number {\n        let   top   = this.getTop(index);\n        const block = this.getBlockByIndex(index);\n        if(block){\n            const left = block.getLeft(index);\n            for(let i = 0; i < Math.abs(count); i++){\n                const height     = block.getHeight(index) + block.getMargin();\n                const direction  = count > 0 ? 1 : -1;\n                      top       += height * direction;\n            }\n            return this.getIndexByPosition(top, left);\n        }\n        return index;\n    }\n\n    updateRelativeValues(): void {\n        let top = 0;\n        let count = 0;\n        this.groupOrder.forEach(blockAxis => {\n            blockAxis.setRelativeTop(top);\n            blockAxis.setRelativeCount(count);\n            top   += blockAxis.getTotalHeight();\n            count += blockAxis.getTotalCount();\n        })\n        this.totalCount = count;\n    }\n\n    appendBlock(blockAxis: IBlockRowAxisCore): void {\n        this.insertBlock(blockAxis);\n    } \n\n    clearAllBlocks(): void {\n        this.groupOrder = [];\n        this.totalCount = 0;\n    }\n\n    convertToActualIndex(visibleIndex: number): number {\n        return visibleIndex;\n    }\n\n    hideRow(index: number): void {\n        const blockIndex = this.findBlockIndexByIndex(index) ?? (this.groupOrder.length-1);\n        if((blockIndex != null && 0 <= blockIndex)){\n            const block = this.groupOrder[blockIndex];\n            block.hideRow(index);\n            this.updateRelativeValues();\n        }\n    }\n    showRow(index: number): void {\n        const blockIndex = this.findBlockIndexByIndex(index) ?? (this.groupOrder.length-1);\n        if((blockIndex != null && 0 <= blockIndex)){\n            const block = this.groupOrder[blockIndex];\n            block.showRow(index);\n            this.updateRelativeValues();\n        }\n    }\n    isRowHidden(index: number): boolean {\n        const blockIndex = this.findBlockIndexByIndex(index) ?? (this.groupOrder.length-1);\n        if((blockIndex != null && 0 <= blockIndex)){\n            const block = this.groupOrder[blockIndex];\n            return block.isRowHidden(index);\n        }\n        return false;\n    }\n\n    insertRow(index: number, height: number): void {\n        const blockIndex = this.findBlockIndexByIndex(index) ?? (this.groupOrder.length-1);\n        const block      = (blockIndex != null && 0 <= blockIndex) ? this.groupOrder[blockIndex] : this.getNewBlock();\n        block.insertRow(index, height);\n        this.updateRelativeValues();\n    }\n\n    updateRow(index: number, height: number): void {\n        let blockIndex = this.findBlockIndexByIndex(index);\n        if (blockIndex == null) {\n            for (let i = 0; i < this.groupOrder.length; i++) {\n                const block = this.groupOrder[i];\n                const rc = block.getRelativeCount();\n                const tc = block.getTotalCount();\n                if (rc <= index && index < rc + tc) {\n                    blockIndex = i;\n                    break;\n                }\n            }\n        }\n        if (blockIndex != null) {\n            const block = this.groupOrder[blockIndex];\n            block.updateRow(index, height);\n            this.updateRelativeValues();\n        }\n    }\n\n    deleteRow(index: number): void {\n        const blockIndex = this.findBlockIndexByIndex(index);\n        const block      = blockIndex != null ? this.groupOrder[blockIndex] : this.getNewBlock();\n        block.deleteRow(index);\n        const isEmpty = block.getTotalCount() == 0;\n        if(isEmpty){\n            const index = this.groupOrder.indexOf(block);\n            this.groupOrder.splice(index, 1);\n        }\n        this.updateRelativeValues();\n    }\n\n    appendRow(height: number): void {\n        const len        = this.groupOrder.length;\n        const blockIndex = len == 0 ? null : len - 1;\n        const block      = blockIndex != null ? this.groupOrder[blockIndex] : this.getNewBlock();\n        block.appendRow(height);\n        this.updateRelativeValues();\n    }\n\n    appendMultipleRows(heights : number[]): void {\n        const len        = this.groupOrder.length;\n        const blockIndex = len == 0 ? null : len - 1;\n        const block      = blockIndex != null ? this.groupOrder[blockIndex] : this.getNewBlock();\n        block.appendMultipleRows(heights);\n        this.updateRelativeValues();\n    }\n\n\n    //dimension \n\n    getTotalHeight() : number{\n        const length    = this.groupOrder.length;\n        const lastBlock = this.groupOrder[length-1];\n        if(lastBlock){\n            return lastBlock.getRelativeTop() + lastBlock.getTotalHeight();\n        }\n        return 0;\n    }\n\n    getTotalCount() : number{\n        return this.totalCount;\n    }\n\n    createBlock(_config ?: any) : IBlockRowAxisCore{\n        return null;\n    }\n\n    insertBlock(galleryBlockAxis : IBlockRowAxisCore, relativeTop ?: number, relativeCount ?: number) : void{\n        galleryBlockAxis.setRelativeCount(relativeCount ?? this.totalCount);\n        const relativeIndex = galleryBlockAxis.getRelativeCount();\n        const top           = this.getTop(relativeIndex);\n        const blockIndex    = this.findBlockIndexByIndex(relativeIndex-1);\n        galleryBlockAxis.setRelativeTop(relativeTop ?? top);\n        this.totalCount           += galleryBlockAxis.getTotalCount();\n        \n        if(relativeIndex == 0){\n            this.groupOrder.unshift(galleryBlockAxis);\n        }\n        else if(blockIndex != null){\n            this.groupOrder.splice(blockIndex+1, 0, galleryBlockAxis);\n        }\n        else{\n            this.groupOrder.push(galleryBlockAxis);\n        }\n        this.updateRelativeValues();\n    }\n\n    getWidth(globalIndex : number) : number {\n        const blockIndex          = this.findBlockIndexByIndex(globalIndex);\n        if(blockIndex != null){\n            const blockAxis       = this.groupOrder[blockIndex];\n            return blockAxis.getWidth(globalIndex);\n        }\n        return 0;\n    }\n\n    getHeight(globalIndex : number, ignoreHideValidation ?: boolean) : number {\n        const blockIndex          = this.findBlockIndexByIndex(globalIndex);\n        if(blockIndex != null){\n            const blockAxis       = this.groupOrder[blockIndex];\n            return blockAxis.getHeight(globalIndex, ignoreHideValidation);\n        }\n        return 0;\n    }\n\n    getTop(globalIndex : number) : number {\n        if(globalIndex<0){\n            return 0;\n        }\n        else if(globalIndex >= this.totalCount){\n            return this.getTotalHeight();\n        }\n        const blockIndex          = this.findBlockIndexByIndex(globalIndex);\n        if(blockIndex != null){\n            const blockAxis       = this.groupOrder[blockIndex];\n            return blockAxis.getTop(globalIndex);\n        }\n        return 0;\n    }\n\n    getLeft(globalIndex : number) : number | null{\n        const blockIndex          = this.findBlockIndexByIndex(globalIndex);\n        if(blockIndex != null){\n            const blockAxis       = this.groupOrder[blockIndex];\n            return blockAxis.getLeft(globalIndex);\n        }\n        return null;\n    }\n\n    getIndexByPosition(globalTop : number, left : number = 0) : number | null {\n        if(globalTop <= 0){\n            return 0;\n        }\n        const totalHeight = this.getTotalHeight();\n        if(globalTop >= totalHeight){\n            return this.totalCount;\n        }\n        const blockIndex          = this.findBlockIndexByTop(globalTop);\n        if(blockIndex != null){\n            const blockAxis       = this.groupOrder[blockIndex];\n            return blockAxis.getIndexByPosition(globalTop, left);\n        }\n        return null;\n    }\n\n    getVisibleIndexesByPosition(globalTop : number, globalBottom : number = globalTop, left : number = 0) : number[]{\n        globalTop = Math.max(0, globalTop);\n        globalBottom = Math.min(this.getTotalHeight(), globalBottom);\n\n        const visibleIndexes  = [];\n        const firstBlockIndex = this.findBlockIndexByTop(globalTop);\n        const lastBlockIndex  = this.findBlockIndexByTop(globalBottom);\n\n        for(let index = firstBlockIndex; index <= lastBlockIndex; index++){\n            const block = this.groupOrder[index];\n            if(block && block.isVisible()){\n                const indexes = block.getVisibleIndexesByPosition(globalTop, globalBottom, left);\n                visibleIndexes.push(...indexes);\n            }\n        }\n        return visibleIndexes; \n    }\n\n    getDisplayIndexByPosition(top: number, left?: number): number {\n        const idx = this.getIndexByPosition(top, left);\n        return idx == null ? 0 : idx;\n    }\n\n    getBlockByIndex(index : number) : IBlockRowAxisCore{\n        const blockIndex          = this.findBlockIndexByIndex(index);\n        if(blockIndex != null){\n            return this.groupOrder[blockIndex];\n        }\n        return null;\n    }\n\n    hideBlock(startIndex : number, endIndex : number = startIndex) : void {\n        this.updateBlockState(false, startIndex, endIndex);\n    }\n\n    showBlock(startIndex : number, endIndex : number = startIndex) : void {\n        this.updateBlockState(true, startIndex, endIndex);\n    }\n}\n","interface ISubAxis {\n    lefts : Uint32Array | Uint16Array;\n    IDs : Array<any>;\n    relativeLeft : number;\n\n    setValue(sub : number, left : number, id : number) : void;\n    binarySearch(start : number, end : number, leftValue : number) : number;\n    resize(diff : number, start : number, end : number) : void;\n    setrelativeLeft(val : number) : void; \n    getrelativeLeft() : number;\n}\n\nconst div : number = Math.log2(16);\nfunction findIndex(index : number) : [number, number] {\n    return [index >>> div, index & 15];\n}\n\nfunction findWidth(width : number[], length : number) : number {\n    let sum = 0;\n    for( let i = 0; i < length; i++) {\n        sum += width[i];\n    }\n    return sum;\n}\n\n\nconst a = {\n    LEFT: 0,\n    ID: 1\n};\n\nclass SubAxis implements ISubAxis{\n\n    lefts : Uint32Array | Uint16Array;\n    IDs : Array<any>;\n    relativeLeft : number;\n\n    constructor(packsize : number, type : string) {\n        this.relativeLeft = 0;\n        if(type === 'row') {\n            this.lefts = new Uint32Array(packsize);\n            this.IDs = new Array(packsize);\n        }\n        else if(type === 'column') {\n            this.lefts = new Uint16Array(packsize);\n            this.IDs = new Array(packsize);\n        }\n    }\n\n    setValue(sub : number, left : number, id : number) : void {\n        this.lefts[sub] = left;\n        this.IDs[sub] = id;\n    }\n\n    binarySearch(start : number, end : number, leftValue : number) : number {\n        if (start > end) {\n            return end;\n        } else if (start == end) {\n            if (this.lefts[start] > leftValue) {\n                return --start;\n            }\n            return start;\n        }\n        const mid = start + Math.floor((end - start) / 2);\n        if (this.lefts[mid] == leftValue) {\n            return this.binarySearch(mid + 1, end, leftValue);\n        } else if (this.lefts[mid] > leftValue) {\n            return this.binarySearch(start, mid - 1, leftValue);\n        } else {\n            return this.binarySearch(mid + 1, end, leftValue);\n        }\n    }\n\n    resize(diff : number, start : number, end : number) : void {\n        for (let i = start; i <= end; i++) {\n            this.lefts[i] = this.lefts[i] + diff;\n        }\n    }\n\n    setrelativeLeft(val : number) : void {\n        this.relativeLeft = val;\n    }\n\n    getrelativeLeft() : number {\n        return this.relativeLeft;\n    }\n\n}\n\nexport class GridAxis {\n\n    packsize : number;\n    count : number;\n    totalWidth : number;\n    head : ISubAxis[];\n\n    constructor(packsize : number) {\n        this.packsize = packsize;\n        this.count = 0;\n        this.totalWidth = 0;\n        this.head = [];\n\n    }\n\n    getTotalCount() : number {\n        return this.count;\n    }\n\n\n    insertAtIndex(start : number, givenWidth : number) : void {\n        const width                     = [givenWidth];\n        // const fieldID                   = [start];\n        const fieldID                   = [Math.floor(Math.random() * 1000000)];\n        const noOfIns : number          = width.length;\n        const index : number            = start;\n        const sIndex : [number, number] = findIndex(index);\n        const eIndex : [number, number] = findIndex(index + noOfIns - 1);\n        const lIndex : [number, number] = findIndex(this.count - 1 + noOfIns);\n        const totWidth : number         = findWidth(width, width.length);\n        \n\n        for(let i = lIndex[0]; i >= sIndex[0]; i--) {\n            let flag = 0;\n            let newHead = 0;\n            if(this.head[i] == undefined) {\n                this.head[i] = new SubAxis(this.packsize, \"column\");\n                if((i * this.packsize) == index) {\n                    this.head[i].setrelativeLeft(this.totalWidth);\n                }\n                else {\n                    if (((i * this.packsize) - noOfIns) < index) {\n                        this.head[i].setrelativeLeft(this.findrelativeLeft((i * this.packsize), index, width));\n                    } else {\n                        this.head[i].setrelativeLeft(this.getVal((i * this.packsize) - noOfIns)[a.LEFT] + totWidth);\n                    }\n                }\n                newHead = this.head[i].getrelativeLeft();\n            }\n            else {\n                newHead = this.head[i].getrelativeLeft();\n                if (i > eIndex[0]) { //cases - delete - dead heads\n                    newHead = (this.getVal((i * this.packsize) - noOfIns)[a.LEFT]) + totWidth;\n                    flag=1;\n                }\n            }\n            if (i >= eIndex[0]) {\n                const sj = (i == lIndex[0] ? lIndex[1] : 15);\n                const ej = (i == eIndex[0] ? (eIndex[1] + 1) : 0);\n                if (start != (this.count + 1)) {\n                    for (let j = sj; j >= ej; j--) {\n                        this.head[i].setValue(j, (this.getVal(((i * this.packsize) + j) - noOfIns)[0]) + totWidth - newHead, this.getVal(((i * this.packsize) + j) - noOfIns)[1]);\n                    }\n                }\n                if (flag != 0) {\n                    this.head[i].setrelativeLeft(newHead);\n                }\n            }\n        }\n        let z = 0;\n        for(let i = sIndex[0]; i <= eIndex[0]; i++) {\n            const sj = (i == sIndex[0] ? (sIndex[1]) : 0);\n            const ej = (i == eIndex[0] ? eIndex[1] : 15);\n            let w : number;\n            for (let j = sj; j <= ej; j++) {\n                if ((width.length == 1 || index == (i * this.packsize) + j) && (((i * this.packsize) + j) != 0)) {\n                    w = this.findWidthById(this.getVal((i * this.packsize) + j - 1)[a.ID]);\n                } else {\n                    w = width[z - 1];\n                }\n                if (j == 0) {\n                    this.head[i].setValue(j, this.head[i].relativeLeft - this.head[i].relativeLeft, fieldID[z]);\n                } else {\n                    this.head[i].setValue(j, this.getVal((i * this.packsize) + j - 1)[a.LEFT] + w - this.head[i].relativeLeft, fieldID[z]);\n                }\n                z++;\n            }\n        }\n        this.totalWidth += totWidth;\n        this.count += noOfIns;\n        \n\n    }\n    getVal(index : number) : [number, number] {\n        const cindex : [number, number] = findIndex(index);\n        if(index < 0 || !(this.head[cindex[0]])) {\n            return undefined; // Need to change\n        }\n        return [this.head[cindex[0]].relativeLeft + this.head[cindex[0]].lefts[cindex[1]], this.head[cindex[0]].IDs[cindex[1]]];\n    }\n\n    getTotalWidth() : number {\n        return this.totalWidth;\n    }\n\n    findrelativeLeft(index : number, sIndex : number, width : number[]) : number {\n        const val = this.getVal(sIndex);\n        const res = val[a.LEFT] + findWidth(width, index - sIndex);\n        return res;\n    }\n\n    findIndexByPos(leftVal : number) : number {\n        if(this.count == 0) {\n            return -1;\n        }\n        if (leftVal <= this.totalWidth) {\n            const mend : number = (this.count - 1) >>> div;\n            const mIndex = this.binarySearch(0, mend, leftVal);\n            let end = 0;\n            if (mIndex < mend) {\n                end = 15;\n            } else {\n                end = (this.count - 1) % this.packsize;\n            }\n            const sIndex : number = this.head[mIndex].binarySearch(0, end, leftVal - this.head[mIndex].relativeLeft);\n\n            return (mIndex * this.packsize) + sIndex;\n        } else {\n            return -1;\n        }\n    }\n\n    findIndexById(id : number) : number {\n        const mend : number = (this.count - 1) >>> div;\n        for (let i = 0; i <= mend; i++) {\n            const end : number = (i < mend ? 15 : (this.count - 1) % this.packsize);\n            for (let j = 0; j <= end; j++) {\n                if (this.head[i].IDs[j] == id) {\n                    return (i * this.packsize) + j;\n                }\n            }\n        }\n        return undefined; // Need to change\n    }\n    findWidthById(id : number) : number {\n        const index : number = this.findIndexById(id);\n        const left : number = this.getVal(index)[a.LEFT];\n        if ((this.count - 1) == index) {\n            return this.totalWidth - left;\n        } else {\n            return this.getVal(index + 1)[a.LEFT] - this.getVal(index)[a.LEFT];\n        }\n    }\n\n    findWidthByIndex(index : number) : number {\n        // const s = performance.now();\n        // console.log(performance.now()-s);\n        const left : number = this.getVal(index)[a.LEFT];\n        if ((this.count - 1) == index) {\n            return this.totalWidth - left;\n        } else {\n            return this.getVal(index + 1)[a.LEFT] - this.getVal(index)[a.LEFT];\n        }\n    }\n\n    findPositionByIndex(index : number) : number {\n        return this.getVal(index)[a.LEFT];\n    }\n    \n    resize(index : number, newW : number) : void {\n        const diff : number = newW - this.findWidthByIndex(index);\n        index++;\n        let mIndex : number = index >>> div;\n        let end    = 15;\n        if (mIndex == (this.count - 1) >>> div) {\n            end = (this.count - 1) % this.packsize;\n        }\n        if (index % this.packsize != 0) {\n            this.head[mIndex].resize(diff, index % this.packsize, end);\n            mIndex++;\n        }\n        for (let i = mIndex; i <= (this.count - 1) >>> div; i++) {\n            this.head[i].relativeLeft = this.head[i].relativeLeft + diff;\n        }\n        this.totalWidth += diff;\n    }\n\n    hide(id : number) : void {\n        this.resize(id, 0);\n    }\n\n    deleteIndex(start : number) : void {\n        if(this.count <= 1){\n            if(start == 0) {\n                this.clear();\n            }\n            return;\n        }\n        const widthAtStart : number = this.findWidthByIndex(start);\n        let i = start >>> div;\n        const end : number = (this.count - 2) >>> div;\n        let s : number = start % this.packsize;\n        let e : number;\n        let newHead = this.head[i].relativeLeft;\n        for (; i <= end; i++) {\n            e = (i == end ? (this.count - 2) % this.packsize : 14); //count - 2 reason : count - 1 - onefordeltd\n            let j : number;\n            for (j = s; j <= e; j++) {\n                const values = this.getVal((i * this.packsize) + j + 1);\n                this.head[i].setValue(j, values[a.LEFT] - widthAtStart - newHead, values[a.ID]);\n            }\n            if (j == 15) {\n                if ((i * this.packsize) + j < this.count - 1) {\n                    const values = this.getVal((i + 1) * this.packsize);\n                    this.head[i].setValue(j, values[a.LEFT] - widthAtStart - newHead, values[a.ID]);\n                }\n            }\n            s = 0;\n            this.head[i].setrelativeLeft(newHead);\n            if (i != end) {\n                if (((i + 1) * this.packsize + 1) <= this.count - 1) {\n                    newHead = this.getVal((i + 1) * this.packsize + 1)[a.LEFT] - widthAtStart;\n                }\n            }\n        }\n        this.totalWidth -= widthAtStart;\n        this.count--;\n    }\n\n    nextHidden(index : number) : number {\n        if(index < 0) {\n            return 0;\n        }\n        for (let i = index + 1; i <= this.count - 1; i++) {\n            if (this.findWidthById(this.getVal(i)[a.ID]) == 0) {\n                return i;\n            }\n        }\n        return index+1;\n    }\n\n    nextNonHidden(index : number) : number {\n        if(index < 0) {\n            return 0;\n        }\n        for (let i = index + 1; i <= this.count - 1; i++) {\n            if (this.findWidthById(this.getVal(i)[a.ID]) != 0) {\n                return i; \n            }\n        }\n        return index + 1;\n    }\n    prevHidden(index : number) : number {\n        if(index < 0) {\n            return 0;\n        }\n        for (let i = index - 1; i >= 0; i--) {\n            if (this.findWidthById(this.getVal(i)[a.ID]) == 0) {\n                return i; \n            }\n        }\n        return index - 1;\n    }\n\n    prevNonHidden(index : number) : number {\n        if(index < 0) {\n            return 0;\n        }\n        for (let i = index - 1; i >= 0; i--) {\n            if (this.findWidthById(this.getVal(i)[a.ID]) != 0) {\n                return i;\n            }\n        }\n        return index-1;\n    }\n    binarySearch(start : number, end : number, leftValue : number ) : number {\n        if (start > end) {\n            return end;\n        } else if (start == end) {\n            if (this.head[start].relativeLeft > leftValue) {\n                return --start;\n            }\n            return start;\n        }\n        const mid = start + Math.floor((end - start) / 2);\n        if (this.head[mid].relativeLeft == leftValue) {\n            return this.binarySearch(mid + 1, end, leftValue);\n        } else if (this.head[mid].relativeLeft > leftValue) {\n            return this.binarySearch(start, mid - 1, leftValue);\n        } else {\n            return this.binarySearch(mid + 1, end, leftValue);\n        }\n    }\n    clear() : void {\n        this.count = 0;\n        this.totalWidth = 0;\n        this.head = [];\n    }\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { IRowAxisCore } from \"./RowAxis/rowAxis.types\";\nimport { IRowBlockCommon } from \"./rowblock-handler.types\";\nimport { rowPinPositions } from \"../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IRowNodeHolder } from \"./rowNodeHolder.types\";\nimport { ISortModel } from \"../Grid/Core/Interface/ISortConfigurations\";\nimport { IFilterModel } from \"../Grid/Core/Interface/IFilterConfigurations\";\nimport { IGroupKeys, IGroupModel } from \"../Grid/Core/Interface/IRowGroupingConfigurations\";\nimport { IRowDefinition } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { v1 as uuid1 } from \"uuid\";\nimport { IRowMeta } from \"Grid/API/CommonAPIInterface\";\nimport { IRowNodeCore } from \"./rownode.types\";\nimport { IGroupedRowNodeCore } from \"./group-rownode.types\";\n\nconst draftRowSpliter = '\\u2063'; // Unicode INVISIBLE SEPARATOR, good as a non-typable splitter\n\nexport class RowBlockCommon extends EventEmitter implements IRowBlockCommon {\n    rowAxis            : IRowAxisCore;\n    rowPinPosition     : rowPinPositions;\n    rowNodeHolder      : IRowNodeHolder;\n    staticCacheIndexes : number[];\n    staticIds          : string[];\n    groupModel         : IGroupModel[];\n    sortModel          : ISortModel[];\n    filterModel        : IFilterModel;\n\n    constructor(){\n        super();\n        this.staticCacheIndexes = [];\n        this.staticIds = [];\n    }\n\n    getTotalDraftRowCount(): number {\n        return this.optionsHandler.getTopDraftRowCount() + this.optionsHandler.getBottomDraftRowCount();\n    }\n\n    generateRowId( index : number, definition ?: IRowDefinition ): string {\n        let id = definition?.rowId;\n        if(id == undefined){\n            id = `Row${index}_${uuid1()}`;\n            while(this.rowNodeHolder.has(id)){\n                id = `Row${index}_${uuid1()}`;\n            }\n        }\n        return id;\n    }\n\n    generateDraftRowId(index: number, parentNode: IGroupedRowNodeCore, pinPosition: rowPinPositions): string {\n        return `DraftRow${draftRowSpliter}${parentNode.getId()}${draftRowSpliter}${pinPosition}${draftRowSpliter}${index}`;\n    }\n\n    decodeDraftRowId(id: string): { index: number, parentNode: IGroupedRowNodeCore, pinPosition: rowPinPositions } {\n        const [ _, parentNodeId, pinPosition, index] = id.split(draftRowSpliter);\n        return { \n            index      : parseInt(index),\n            parentNode : this.getRowNodeById(parentNodeId) as IGroupedRowNodeCore,\n            pinPosition: pinPosition as rowPinPositions\n        };\n    }\n\n    getRowNodeById(id: string): IRowNodeCore {\n\t\treturn this.rowNodeHolder.get(id);\n\t}\n\n\tgetRowNode(index: number): any {\n        if(index == null){\n            return null;\n        }\n\t\tconst rowId = this.getIdByIndex(index);\n\t\treturn this.getRowNodeById(rowId);\n\t}\n\n    getRowNodeByRowMeta(rowMeta: IRowMeta): any {\n        const index = this.getAbsoluteIndex(rowMeta.rowIndex, rowMeta.parentKeys, rowMeta.pinPosition);\n        return this.getRowNode(index);\n    }\n\n    getIdByIndex(_index: number): string {\n\t\treturn null;\n\t}\n\n    getLastRowMeta(includeDraftRows : boolean = false): IRowMeta {\n        let parentId;\n\t\tconst lastRow = this.getLastRow(parentId, includeDraftRows);\n\t\treturn this.getRelativeRowMeta(lastRow);\n\t}\n\n\tgetFirstRowMeta(includeDraftRows : boolean = false): IRowMeta {\n        const firstRow = this.getFirstRow(includeDraftRows);\n\t\treturn this.getRelativeRowMeta(firstRow);\n\t}  \n    \n    getRelativeRowMeta(absoluteIndex: number): IRowMeta {\n\t\treturn {\n\t\t\trowIndex    : absoluteIndex,\n\t\t\tpinPosition : this.rowPinPosition,\n\t\t\tparentKeys  : []\n\t\t};\n\t}\n    \n    setGroupModel(groupModel: IGroupModel[]): void {\n        this.groupModel = groupModel;\n    }\n\n    resetRowCaches(): void {\n    }\n\n    findUpcomingVerticalIndex(index: number, count ?: number): number {\n        return this.rowAxis.getVerticalIndex(index, count);\n    }\n    \n    getAbsoluteIndex(index: number, _parentKeys ?: IGroupKeys, _pinPosition ?: rowPinPositions): number {\n        return index;\n    }\n\n    getVisibleIndexesByPosition(firstPixel: number, lastPixel: number, lastPixelLeft: number): number[] {\n        return this.rowAxis.getVisibleIndexesByPosition(firstPixel, lastPixel, lastPixelLeft);\n    }\n\n    setRowNodeHolder(rowNodeHolder : IRowNodeHolder) : void{\n\t\tthis.rowNodeHolder = rowNodeHolder;\n\t}\n\n\tgetRowNodeHolder() : IRowNodeHolder {\n\t\treturn this.rowNodeHolder;\n\t}\n    \n    getFirstRow(_includeDraftRows : boolean = false): number {\n        return this.getRowCount() > 0 ? 0 : undefined;\n    }\n    getLastRow(_parentId ?: string, _includeDraftRows : boolean = false): number {\n        return this.getRowCount() - 1;\n    }\n    getRowByPosition(top: number, left?: number): number {\n        return this.rowAxis.getIndexByPosition(top, left);\n    }\n    getRowCount(): number {\n        return this.rowAxis.getTotalCount();\n    }\n    getTotalHeight(): number {\n        return this.rowAxis.getTotalHeight(true);\n    }\n    getRowAxis(): IRowAxisCore {\n        return this.rowAxis;\n    }\n    getTop(index: number): number {\n        return this.rowAxis.getTop(index);\n    }\n    getHeight(index: number, ignoreHideValidation ?: boolean): number {\n        return this.rowAxis.getHeight(index, ignoreHideValidation);\n    }\n    getLeft(index: number): number {\n        return this.rowAxis.getLeft(index);\n    }\n    getWidth(index: number): number {\n        return this.rowAxis.getWidth(index);\n    }\n    setHeight(index: number, height: number): void {\n        this.rowAxis.updateRow(index, height);\n    }\n    getPinPosition(): rowPinPositions {\n\t\treturn this.rowPinPosition;\n\t}\n\n\tsetPinPosition(rowPinPosition: rowPinPositions): void {\n\t\tthis.rowPinPosition = rowPinPosition;\n\t}\n\n    removeStaticIndex(index: number): void {\n        const val = this.staticCacheIndexes.indexOf(index);\n        if(val > -1) {\n            this.staticCacheIndexes.splice(index, 1);\n        }\n\t}\n\taddStaticIndex(index: number): void {\n        this.staticCacheIndexes.push(index);\n\t}\n\n    isInStaticCache(index: number): boolean {\n\t\treturn this.staticCacheIndexes.includes(index) ;\n\t}\n\n    addStaticRowById(id: string): void {\n        this.staticIds.push(id);\n    }\n\n    removeStaticRowById(id: string): void {\n        const index = this.staticIds.indexOf(id);\n        if (index != -1) {\n            this.staticIds.splice(index, 1);\n        }\n    }\n\n\tisInSameBlock(_indexex: number[]): boolean {\n\t\treturn false;\n\t}\n\n\tgetStaticCacheIndexes(_ignoreHidden : boolean = false): number[] {\n\t\treturn this.staticCacheIndexes;\n\t}\n\n    isSortApplied(): boolean {\n        return this.sortModel ? this.sortModel.length > 0 : false;\n    }\n\n    isFilterApplied(): boolean {\n        return this.filterModel != null;\n    }\n\n    isRowGroupingApplied(): boolean {\n        return this.groupModel ? this.groupModel.length > 0 : false;\n    }\n\n    getSortModel(): ISortModel[] {\n        return this.sortModel;\n    }\n\n    getFilterModel(): IFilterModel {\n        return this.filterModel;\n    }\n\n    getGroupModel(): IGroupModel[] {\n        return this.groupModel;\n    }\n\n    setSortModel(sortModel: ISortModel[]): void {\n        this.sortModel = sortModel;\n    }\n\n    setFilterModel(filterModel: IFilterModel): void {\n       this.filterModel = filterModel; \n    }\n\n    setModel(groupModel: IGroupModel[]): void {\n        this.groupModel = groupModel;\n    }\n\n    setAllHeightTo(height: number): void {\n\t\tthis.rowAxis.updateAllHeight(height);\n\t}\n\n    isValidRow(index: number, parentKeys : IGroupKeys = [], pinPosition ?: rowPinPositions): boolean {\n\t\tconst absoluteIndex = this.getAbsoluteIndex(index, parentKeys, pinPosition);\n\t\treturn absoluteIndex != null && (0 <= absoluteIndex && absoluteIndex < this.getRowCount());\n\t}\n}","import { DGEvent, EventHandler } from \"@dg/corecomponent\";\nimport { IRowDefinition } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { IRowInteracter, IRowNodeCore, RowHighlightPosition } from \"./rownode.types\";\nimport { ROW_NODE_EVENTS } from \"../Grid/Core/Constants/Events\";\nimport { rowPinPositions } from \"../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IRowMeta } from \"../Grid/API/CommonAPIInterface\";\n\nclass RowNodeCore implements IRowNodeCore{\n    protected helper          : IRowInteracter;\n    public    id              : string;\n    public    rowData         : { id: string; data: any; definition: IRowDefinition; loadedState: boolean; hidden : boolean, isExpandable : boolean };\n    public    tempHeight      : number;\n    private   sticky          : boolean;\n    private   stickyTop       : number;\n    protected eventHandler  ! : EventHandler;\n    private   highlighted     : RowHighlightPosition | null = null;\n    private   isFloating      : boolean = false;\n    private   floatingRecordHeight : number = 0;\n    \n    constructor(interacter : IRowInteracter, id : string, definition : any, data ?: any ){\n        this.helper  = interacter;\n        this.id      = id;\n        this.rowData = this.constructNode(id, definition, data);\n    }\n    setPinnedPosition(_insertPosition: string): void {\n        \n    }\n    getSelected(): \"all\" | \"intermediate\" | \"none\" {\n        throw new Error(\"Method not implemented.\");\n    }\n    setSelectedCount(_count: number): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    getSelectedCount(): number {\n        throw new Error(\"Method not implemented.\");\n    }\n    updateSelectedCount(_count: number): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    getRowMeta(): IRowMeta {\n        throw new Error(\"Method not implemented.\");\n    }\n    updateLevel(_level: number)                        : void {}\n    setDirectChildrenCount(_count: number)             : void {}\n    setInitialOrder(_ids: string[])                    : void {}\n    expand(_params ?: {recursive ?: boolean})                       : void {}\n    collapse(_recursive?: boolean)                     : void {}\n    updateCollapseState(_expanded: boolean)            : void {}\n    setParentId(_parentId: string)                     : void {}\n    setDirectChildren(_directChildren: any[])          : void {}\n    setGroupMeta(_groupMeta: Record<string, string>[]) : void {}\n    isRendered(): boolean {\n        return false;\n    }\n\n    isRecordFloating(): boolean {\n        return this.isFloating;\n    }\n\n    setRecordFloating(isFloating: boolean): void {\n        this.isFloating = isFloating;\n    }\n\n    getAncestors(): any[] {\n        return [];\n    }\n\n    getDirectChildrenCount(): number {\n        return 0;\n    }\n    getInitialIdsOrder(): string[] {\n        return [];\n    }\n    getOwnGroupValue(): string {\n        return '';\n    }\n    getGroupValues(): string[] {\n        return [];\n    }\n    isGroupRow(): boolean {\n        return false;\n    }\n    getGroupKeys(): string[] {\n        return null;\n    }\n    isCollapsed(): boolean {\n        return false;\n    }\n    getParentId(): string {\n        return '';\n    }\n    getLevel(): number {\n        return null;\n    }\n    getChildCount(_includeGroupRows?: boolean): number {\n        return 0;\n    }\n    getAllChildren(): any[] {\n        return [];\n    }\n    getDirectChildren(): any[] {\n        return [];\n    }\n    getFirstRowInGroup(): number {\n        return null;\n    }\n    getLastRowInGroup(): number {\n        return null;\n    }\n    getGroupMeta(): Record<string, string>[] {\n        return [];\n    }\n    getCurrentMeta(): Record<string, string> {\n        return null;\n    }\n    hasChildren(): boolean {\n        return false;\n    }\n    getParentNode() {\n        const parentId    = this.getParentId();\n        let   parentNode  = this.helper.getRowNodeById(parentId);\n        const groupValues = parentNode?.getGroupValues() ?? [];\n        if(groupValues.length == 0) {\n            return this.helper.getRootNode();\n        }\n        if(parentId){\n            return parentNode;\n        }\n        return null;\n    }\n\n    getPinnedPosition(): rowPinPositions {\n        return 'middle'\n    }\n\n    private constructNode(id : string,sourceData ?: IRowDefinition, data ?: any) {\n        return {\n            id,\n            data,\n            definition  : sourceData,\n            loadedState : false,\n            hidden      : sourceData?.hidden ?? false,\n            isExpandable : sourceData?.expandableRow ?? false\n        }\n    }\n\n    isExpandable(): boolean {\n        return this.rowData.isExpandable;\n    }\n\n    getId(): string {\n        return this.id;\n    }\n\n    getTop(): number {\n        const index = this.getIndex();\n        return this.helper.getTop(index);\n    }\n    getDataByKey(key: string) {\n        return this.rowData.data[key];\n    }\n    isLoaded(): boolean {\n        return this.rowData.loadedState;\n    }\n\n    getIndex(): number {\n        return this.helper.getIndexById(this.id);\n    }\n\n    getLeft(): number {\n        return null;\n    }\n    getWidth(): number {\n        return null;\n    }\n    getHeight(): number {\n        const index = this.getIndex();\n        if((index == null || index == -1) && this.isFloating) {\n            return this.floatingRecordHeight ?? 0;\n        }\n        const height = this.helper.getHeight(index);\n        (this.isFloating) && (this.floatingRecordHeight = height);\n        return height;\n    }\n    getRowData() {\n        return this.rowData.data ?? {};\n    }\n    getDefinition() {\n        return this.rowData.definition\n    }\n    updateHeight(height: number): void {\n        const index = this.getIndex();\n        this.helper.setHeight(index, height);\n    }\n    updateRowData(data: any): void {\n        this.rowData.data = data;\n    }\n    updateDefinition(definition: IRowDefinition): void {\n        this.rowData.data.definition = definition;\n    }\n    updateDataByKey(key: string, value: any): void {\n        if(this.rowData.data){\n            const oldValue = this.rowData.data[key];\n            this.rowData.data[key] = value;\n            this.helper.onDataUpdate(this, key, oldValue);\n        }\n    }\n    updateLoaded(loaded: boolean): void {\n        this.rowData.loadedState = loaded;\n    }\n    isFullWidthRow(): boolean {\n        return true;\n    }\n\n    isExist(): boolean {\n        return this.helper.getRowNodeById(this.getId()) !== null;\n    }\n\n    isHidden(): boolean {\n        return this.rowData.hidden;\n    }\n\n    hide(): void {\n        const index = this.getIndex();\n        this.helper.hide(index);\n        this.rowData.hidden = true;\n    }\n\n    show(): void {\n        const index = this.getIndex();\n        this.helper.show(index);\n        this.rowData.hidden = false;\n    }\n\n    setTempHeight(height: number): void {\n        this.tempHeight = height;\n    }\n\n    getTempHeight(): number {\n        return this.tempHeight;\n    }\n\n    updateStickyState(sticky: boolean): void {\n        this.sticky = sticky;\n    }\n\n    isSticky(): boolean {\n        return this.sticky ?? false;\n    }\n\n    getStickyRowTop(): number {\n        return this.stickyTop ?? 0;\n    }\n\n    setStickyRowTop(top: number): void {\n        this.stickyTop = top;\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENt_STICKY_TOP_CHANGE\n        })\n    }\n\n    // highlight\n\n    setHighlighted(position : RowHighlightPosition | null) : void {\n        this.highlighted = position;\n\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENT_ROW_HIGHLIGHT_CHANGE\n        })\n    }\n\n    getHighlight() : RowHighlightPosition  {\n        return this.highlighted;\n    }\n\n\n    // event\n\n    addEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.addEventListener(eventType, listener, async);\n    }\n    removeEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if (!this.eventHandler) {\n            return;\n        }\n\n        this.eventHandler.removeEventListener(eventType, listener, async);\n    }\n    onMouseEnter() {\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENT_MOUSE_ENTER\n        })\n    }\n    onMouseLeave() {\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENT_MOUSE_LEAVE\n        })\n    }\n\n    dispatchEvent(event : DGEvent) {\n        if (this.eventHandler) {\n            this.eventHandler.dispatchEvent(event);\n        }\n    }\n\n    getChildIndexById(_id: string): number {\n        return null;\n    }\n    \n}\n\nexport{\n    RowNodeCore\n}","import { IRowDefinition } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { IRowNode } from \"../Grid/Main\";\nimport { IRowNodeHolder } from './rowNodeHolder.types';\n\ninterface IhandlerHelper{\n    createRow(id: string, data: any, definition: IRowDefinition) : any\n}\n\nexport class RowNodeHolder implements IRowNodeHolder {\n    \n    rowNodeMapping : Record<string, IRowNode>;\n    handlerHelper :  IhandlerHelper;\n\n    constructor(){\n        this.rowNodeMapping   = {};\n    }\n    clear(): void {\n        this.rowNodeMapping = {};\n    }\n\n    set(id : string, rowNode : IRowNode) :  void {\n        this.rowNodeMapping[id] = rowNode;\n    }\n\n    delete(id : string) :  void {\n        delete this.rowNodeMapping[id];\n    }\n\n    get(id : string) :  IRowNode{\n        return this.rowNodeMapping[id] ?? null;\n    }\n\n    has(id : string) : boolean {\n        return this.rowNodeMapping[id] != null;\n    }\n\n    getAllRows() {\n        return this.rowNodeMapping;\n    }\n}\n\n","import { AutoWired, Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { DraggingEvent, HorizontalDirection, IDragAndDropHandler, IDragSourceConfig, IDragSourceList, IDropTarget, VerticalDirection } from \"./dragAndDrop-handler.types\";\nimport { IDragEventParams, IDragHandler, IDragSource } from \"../drag-handler/drag-core-handler.types\";\nimport { flattenArray } from \"../Grid/Core/utils/Generic\";\n\n@Bean('dragAndDropHandler')\nexport class DragAndDropHandler<T> extends EventEmitter implements IDragAndDropHandler {\n    @AutoWired('dragHandler') private dragHandler: IDragHandler;\n\n    private dragSourceList: IDragSourceList<T>[] = [];\n    private dragging      : boolean = false;\n    private dragSource    : IDragSourceConfig<T>;\n    private lastMouseEvent: MouseEvent;\n    private dragItem      : T;\n    private ghostElement  : HTMLElement;\n    private lastDropTarget: IDropTarget<T> | null = null;\n    private dropTargets   : IDropTarget<T>[] = [];\n\n    private deltaX : number = 0;\n    private deltaY : number = 0;\n\n\n\n\n    public addDragSource(source: IDragSourceConfig<T>, allowTouch = false): IDragSource {\n        const params: IDragSource = {\n            container                   : source.container,\n            onDragStart                 : (e: IDragEventParams) => this.onDragStart(source, e.event as MouseEvent),\n            onDragStop                  : (e : IDragEventParams) => this.onDragStop(e.event as MouseEvent),\n            onDragging                  : (e: IDragEventParams) => this.onDragging(e.event as MouseEvent),\n            onDragCancel                : (_e : IDragEventParams) => this.onDragCancel(),\n            includeTouch                : allowTouch,\n            bypassMouseEvent            : source.bypassMouseEvent,\n            getRootNode                 : source.getRootNode,\n            preventTouchEventPropagation: source.preventTouchEventPropagation,\n            shouldPreventMouseEvent     : source.shouldPreventMouseEvent,\n            triggerTimeout              : source.triggerTimeout\n        };\n\n        this.dragSourceList.push({ dragSource: params, source });\n        this.dragHandler.addDragSource(params);\n        return params;\n    }\n\n    public removeDragSource(dragSource: IDragSourceConfig<T>): void {\n        const index = this.dragSourceList.findIndex(item => \n            item.source === dragSource\n        );\n\n        if (index !== -1) {\n            const { dragSource: params } = this.dragSourceList[index];\n\n            this.dragHandler.removeDragSource(params);\n            this.dragSourceList.splice(index, 1);\n        }\n    }\n\n    private onDragStart(dragSource: IDragSourceConfig<T>, mouseEvent: MouseEvent): void {\n        this.dragging = true;\n        this.dragSource = dragSource;\n        this.lastMouseEvent = mouseEvent;\n        this.dragItem = this.dragSource.getDragItem();\n\n        this.dragSource.onDragStarted?.(mouseEvent);\n        this.createGhost();\n    }\n\n    private onDragging(mouseEvent: MouseEvent): void {\n        const horizontalDirection = this.getHorizontalDirection(mouseEvent);\n        const verticalDirection = this.getVerticalDirection(mouseEvent);\n\n        this.lastMouseEvent = mouseEvent;\n        this.updateGhostPosition();\n\n        const validDropTargets = this.dropTargets.filter(target => this.isMouseOnDropTarget(mouseEvent, target));\n        const dropTarget = this.findCurrentDropTarget(mouseEvent, validDropTargets);\n\n        if (dropTarget !== this.lastDropTarget) {\n            this.dispatchDragLeaveForLastTarget(mouseEvent, horizontalDirection, verticalDirection);\n\n            if (this.lastDropTarget && !dropTarget) {\n                this.dragSource.onContainerExit?.(this.dragItem);\n            }\n\n            if (!this.lastDropTarget && dropTarget) {\n                this.dragSource.onContainerEnter?.(this.dragItem);\n            }\n\n            this.dispatchDragEnterForLastTarget(dropTarget, mouseEvent, horizontalDirection, verticalDirection);\n            this.lastDropTarget = dropTarget;\n        } else if (dropTarget?.onDragging) {\n            dropTarget.onDragging(this.createDropTargetEvent(dropTarget, mouseEvent, horizontalDirection, verticalDirection));\n        }\n        this.dragSource.onDragging?.(mouseEvent);\n    }\n\n    private dispatchDragLeaveForLastTarget(mouseEvent: MouseEvent, horizontalDirection: HorizontalDirection | null, verticalDirection: VerticalDirection | null): void {\n        if (this.lastDropTarget?.onDragLeave) {\n            this.lastDropTarget.onDragLeave(this.createDropTargetEvent(this.lastDropTarget, mouseEvent, horizontalDirection, verticalDirection));\n        }\n    }\n\n    private dispatchDragEnterForLastTarget(dropTarget: IDropTarget<T> | null, mouseEvent: MouseEvent, horizontalDirection: HorizontalDirection | null, verticalDirection: VerticalDirection | null): void {\n        if (dropTarget?.onDragEnter) {\n            dropTarget.onDragEnter(this.createDropTargetEvent(dropTarget, mouseEvent, horizontalDirection, verticalDirection));\n        }\n    }\n\n    private onDragStop(mouseEvent: MouseEvent): void {\n        this.dragSource.onDragStopped?.(mouseEvent);\n\n        if (this.lastDropTarget?.onDragStop) {\n            this.lastDropTarget.onDragStop(this.createDropTargetEvent(this.lastDropTarget, mouseEvent, null, null));\n        }\n\n        this.resetState();\n    }\n\n    private onDragCancel() : void {\n        this.dragSource.onDragCancelled?.();\n\n        if(this.lastDropTarget?.onDragCancel){\n            this.lastDropTarget.onDragCancel(this.createDropTargetEvent(this.lastDropTarget, this.lastMouseEvent!, null, null));\n        }\n        this.resetState();\n    }\n\n    private resetState(): void {\n        this.lastMouseEvent = null;\n        this.dragging       = false;\n        this.lastDropTarget = null;\n        this.dragItem       = null;\n        this.deltaX         = 0;\n        this.deltaY         = 0;\n        this.removeGhost();\n    }\n\n    private createGhost(): void {\n        if (!this.ghostElement) {\n            this.ghostElement = document.createElement('div');\n            this.ghostElement.classList.add('dg-dnd-ghost');\n            this.ghostElement.style.width = '';\n            this.ghostElement.style.position = 'absolute';\n            // this.ghostElement.style.zIndex = \"1\";\n            const ghostElement = this.dragSource?.getGhostElement?.()\n            ghostElement && this.ghostElement.appendChild(ghostElement);\n            document.body.appendChild(this.ghostElement);\n            this.updateGhostPosition(true);\n        }else {\n            this.updateGhostPosition();\n        }\n    }\n\n    private removeGhost(): void {\n        if (this.ghostElement) {\n            document.body.removeChild(this.ghostElement);\n            this.ghostElement = null;\n        }\n    }\n\n    private updateGhostPosition(forFirstTime = false): void {\n        if (!this.ghostElement || !this.lastMouseEvent) return;\n    \n        const { clientX, clientY } = this.lastMouseEvent;\n\n        const {container, useGrabOffset} = this.dragSource;\n    \n        if(forFirstTime && container && useGrabOffset) {\n            const element     = container.getBoundingClientRect();\n                  this.deltaY = clientY - element.top;\n                  this.deltaX = clientX - element.left;\n        }\n        \n\n        const ghostRect = this.ghostElement.getBoundingClientRect();\n        const ghostWidth = ghostRect.width;\n        const ghostHeight = ghostRect.height;\n    \n        const scrollX = window.pageXOffset || document.documentElement.scrollLeft;\n        const scrollY = window.pageYOffset || document.documentElement.scrollTop;\n    \n        let top = 0;\n        let left = 0;\n        if(!useGrabOffset) {\n            top = clientY - ghostHeight / 2;\n            left = clientX - ghostWidth / 2;\n        }else {\n            top  = clientY - this.deltaY + scrollY;\n            left = clientX - this.deltaX + scrollX;\n        }\n\n    \n        const browserWidth = document.documentElement.clientWidth;\n        const browserHeight = document.documentElement.clientHeight;\n    \n        if (left + ghostWidth > browserWidth + scrollX) {\n            left = browserWidth + scrollX - ghostWidth;\n        }\n        if (left < scrollX) {\n            left = scrollX;\n        }\n    \n        if (top + ghostHeight > browserHeight + scrollY) {\n            top = browserHeight + scrollY - ghostHeight;\n        }\n        if (top < scrollY) {\n            top = scrollY;\n        }\n    \n        this.ghostElement.style.position = 'absolute';\n        if (!this.dragSource.disableXaxis || forFirstTime) {\n            this.ghostElement.style.left = `${left}px`;\n        }\n        if (!this.dragSource.disableYaxis || forFirstTime) {\n            this.ghostElement.style.top = `${top}px`;\n        }\n    }\n    \n\n    private createDropTargetEvent(dropTarget: IDropTarget<T>, event: MouseEvent, horizontalDirection: HorizontalDirection | null, verticalDirection: VerticalDirection | null): DraggingEvent<T> {\n        const dropZoneTarget = dropTarget.getContainer();\n        const rect = dropZoneTarget.getBoundingClientRect();\n        const { dragItem, dragSource } = this;\n        const x = event.clientX - rect.left;\n        const y = event.clientY - rect.top;\n        return { event, x, y, verticalDirection, horizontalDirection, dragSource, dragItem: dragItem as T, dropZoneTarget };\n    }\n\n    public getHorizontalDirection(event: MouseEvent): HorizontalDirection | null {\n        const clientX = this.lastMouseEvent?.clientX;\n        const currentClientX = event.clientX;\n\n        return clientX === currentClientX ? null : (clientX! > currentClientX ? 'left' :'right');\n    }\n\n    public getVerticalDirection(event: MouseEvent): VerticalDirection | null {\n        const clientY = this.lastMouseEvent?.clientY;\n        const currentClientY = event.clientY;\n\n        return clientY === currentClientY ? null : (clientY! > currentClientY ? 'up' : 'down');\n    }\n\n    private isMouseOnDropTarget(mouseEvent: MouseEvent, target: IDropTarget<T>): boolean {\n        const containers = this.getAllContainersFromDropTarget(target);\n        if (!containers) return false;\n\n        const containerArray = Array.isArray(containers) ? containers : [containers];\n        return containerArray.some(container => this.isContainerIntersect(mouseEvent, container)) &&\n            target.isInterestedIn(this.dragSource.type, this.dragSource.container);\n    }\n\n\n    private isContainerIntersect(mouseEvent: MouseEvent, containers: HTMLElement[]) {\n        for (let i = 0; i < containers.length; i++) {\n            const container = containers[i];\n            const rect = container.getBoundingClientRect();\n    \n            if (rect.width === 0 || rect.height === 0) {\n                return false;\n            }\n    \n            const horizontal = mouseEvent.clientX >= rect.left && mouseEvent.clientX < rect.right;\n            const vertical   = mouseEvent.clientY >= rect.top && mouseEvent.clientY < rect.bottom;\n    \n            if (!horizontal || !vertical) {\n                return false;\n            }\n        }\n        return true;\n    }\n    \n\n    private findCurrentDropTarget(mouseEvent: MouseEvent, validDropTargets: IDropTarget<T>[]): IDropTarget<T> | null {\n        const len = validDropTargets.length;\n    \n        if (len === 0) return null;\n        if (len === 1) return validDropTargets[0];\n    \n    \n        const elementStack = document.elementsFromPoint(mouseEvent.clientX, mouseEvent.clientY) as HTMLElement[];\n    \n        for (const el of elementStack) {\n            for (const dropTarget of validDropTargets) {\n                const containers = flattenArray(this.getAllContainersFromDropTarget(dropTarget)) as  HTMLElement[];\n    \n                if (containers.indexOf(el)) {\n                    return dropTarget;  \n                }\n            }\n        }\n        return null;\n    }\n\n    public isDragging(): boolean {\n        return this.dragging;\n    }\n\n    public addDropTarget(dropTarget: IDropTarget<T>) {\n        this.dropTargets.push(dropTarget);\n    }\n\n    public removeDropTarget(dropTarget:  IDropTarget<T>) {\n        this.dropTargets = this.dropTargets.filter(target => target.getContainer() !== dropTarget.getContainer());\n    }\n\n    public hasExternalDropZones(): boolean {\n        return this.dropTargets.some(zones => zones.outside);\n    }\n\n    private getAllContainersFromDropTarget(dropTarget: IDropTarget<T>): HTMLElement[][] {\n        const secondaryContainers = dropTarget.getSupportingContainers ? dropTarget.getSupportingContainers() : [];\n        const containers: HTMLElement[][] = [[dropTarget.getContainer()]];\n\n        return containers.concat(secondaryContainers);\n    }\n\n}\n","import { Component, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { FillSeriesType } from \"./fill-series.types\";\nimport { IDragEventParams, IDragHandler } from \"../drag-handler/drag-core-handler.types\";\nimport { CellController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { CellRangeType, IRangeSelectionHandler } from \"../rangeselection/range-selection-handler.types\";\nimport { CellPositionType, RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { ICellNavigationHandler } from \"../Grid/Core/Navigation/cell-navigation-handler.types\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { getControllerFromTargetElement, isVisible } from \"../Grid/Core/utils/Dom\";\nimport { DraggingEvent } from \"../DragAndDrop-handler/dragAndDrop-handler.types\";\nimport { IControllerHandler } from \"../Grid/Core/Interface/IControllerHandler\";\nimport type { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { areArraysEqual } from \"../Grid/Core/utils/Object\";\nimport { RowRenderController } from \"../Grid/Core/Rows/RowRenderController\";\nimport { ICellAPIManager, IColumnNode } from \"../Grid/Main\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { computeLeastSquaresLine } from \"../Grid/Core/utils/GridUtilities\";\nimport { IHookManager } from \"../Grid/Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../Grid/Core/Hooks/Constants/HookEventsName\";\n\nfunction getTemplate() : HTMLElement {\n    const div = document.createElement('div');\n    return div;\n}\n\ninterface FillValues {\n    position: CellPositionType;\n    value: any;\n}\n\ninterface ValueContext {\n    value: any;\n    column: IColumnNode;\n    rowNode: IRowNodeCore;\n}\n\ntype FillDirection = 'x' | 'y';\n\nexport class FillSeries extends Component implements FillSeriesType {\n    private dragService          : IDragHandler;\n    private rangeSelectionHandler: IRangeSelectionHandler;\n    private cellNavigationHandler: ICellNavigationHandler;\n    private recordHandler        : IRecordHandler;\n    private controllerHandler    : IControllerHandler;\n    private fieldHandler         : FieldHandler;\n    private rowRendererController: RowRenderController;\n    private cellAPI              : ICellAPIManager;\n    private hookManager          : IHookManager;\n\n    private dragAxis                  : FillDirection;\n    private isUp                      : boolean = false;\n    private isLeft                    : boolean = false;\n    private isReduce                  : boolean = false;\n    private lastCellMarked            : CellPositionType;\n    private cellValues                : FillValues[][] = [];\n    private filledCells               : CellController[] = [];\n    private initialPosition           : CellPositionType;\n    private lastCellHovered           : CellPositionType | null;\n    private rangeStartRow             : RowPositionType;\n    private rangeEndRow               : RowPositionType;\n    private cellRange                 : CellRangeType;\n    private shouldDestroyOnEndDragging: boolean = false;\n    private dragging                  : boolean = false;\n    private initialXY                 : { x: number; y: number } | null;\n    private cellCtrl                  : CellController;\n\n    private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    constructor(getBeanInstanceByBeanName : getBeanInstanceByBeanName) {\n        super();\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n        this.init();\n    }\n\n    init() : void {\n        this.dragService           = this.getBeanInstanceByBeanName('dragHandler');\n        this.rangeSelectionHandler = this.getBeanInstanceByBeanName('rangeSelectionHandler');\n        this.cellNavigationHandler = this.getBeanInstanceByBeanName('CellNavigationHandler');\n        this.recordHandler         = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        this.controllerHandler     = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER);\n        this.fieldHandler          = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        this.rowRendererController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        this.cellAPI               = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CELL_API);\n        this.hookManager           = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER);\n\n        this.setTemplate(getTemplate());\n        this.dragService.addDragSource({\n            container  : this.getGui(),\n            onDragStart: (params : IDragEventParams) => {\n                this.updateValuesOnMove(params.event as MouseEvent);\n            },\n            onDragStop :  (params : IDragEventParams) => {\n                this.updateValuesOnMove(params.event as MouseEvent);\n                this.dragging = false;\n                this.onDragEnd(params.event as MouseEvent);\n\n                if (this.shouldDestroyOnEndDragging) {\n                    this.destroy();\n                }\n            },\n            onDragging :  (params : IDragEventParams) => {\n                this.updateValuesOnMove(params.event as MouseEvent);\n                 if (!this.initialPosition) {\n                    const cellCtrl = this.cellCtrl;\n                    if (!cellCtrl) {\n                        return;\n                    }\n\n                    this.initialPosition = cellCtrl.getCellPosition();\n                }\n\n                const lastCellHovered = this.getLastCellHovered();\n\n                if (lastCellHovered) {\n                    this.updateSelectionPath(this.initialPosition, lastCellHovered);\n                }\n            },\n            onDragCancel           : this.onDragCancel.bind(this),\n            shouldPreventMouseEvent: () => true,\n            getRootNode            : () => window,\n            includeTouch           : false\n        });\n\n        this.addOrRemoveCssClass('ZG-fillseries__handle', true);\n    }\n\n    private getLastCellHovered(): CellPositionType | null | undefined {\n        return this.lastCellHovered;\n    }\n\n    private onDragEnd(e: MouseEvent) {\n        this.initialXY = null;\n        if (!this.filledCells.length) {\n            return;\n        }\n\n\n        const isHorizontal                                           = this.dragAxis === 'x';\n        const { cellRange: initialRange, rangeStartRow, rangeEndRow} = this;\n        const columnLength                                           = initialRange.columnIds.length;\n\n        let finalRange: CellRangeType | undefined;\n\n\n        if (!this.isUp && !this.isLeft) {\n            finalRange = this.rangeSelectionHandler!.createCellRangeFromCellRangeParams({\n                rowStartIndex    : rangeStartRow.rowIndex,\n                rowStartPinned   : rangeStartRow.pinPosition,\n                rowStartParamKeys: rangeStartRow.parentKeys,\n                columnStart      : initialRange.columnIds[0],\n                rowEndIndex      : isHorizontal ? rangeEndRow.rowIndex         : this.lastCellMarked!.rowIndex,\n                rowEndPinned     : isHorizontal ? rangeEndRow.pinPosition      : this.lastCellMarked!.pinPosition,\n                rowEndParamKeys  : isHorizontal ? rangeEndRow.parentKeys       : this.lastCellMarked.parentKeys,\n                columnEnd        : isHorizontal ? this.lastCellMarked!.columnID: initialRange.columnIds[columnLength - 1]\n            });\n        } else {\n            const startRow = isHorizontal ? rangeStartRow : this.lastCellMarked;\n\n            finalRange = this.rangeSelectionHandler!.createCellRangeFromCellRangeParams({\n                rowStartIndex    : startRow!.rowIndex,\n                rowStartPinned   : startRow!.pinPosition,\n                rowStartParamKeys: startRow.parentKeys,\n                columnStart      : isHorizontal ? this.lastCellMarked!.columnID: initialRange.columnIds[0],\n                rowEndIndex      : rangeEndRow.rowIndex,\n                rowEndPinned     : rangeEndRow.pinPosition,\n                rowEndParamKeys  : rangeEndRow.parentKeys,\n                columnEnd        : initialRange.columnIds[columnLength - 1]\n            });\n        }\n\n        if (finalRange) {\n            const callBack = () => {\n                this.handleValueChanged(initialRange, finalRange, e);\n                this.rangeSelectionHandler!.setCellRange({\n                    rowStartIndex    : finalRange.startRow.rowIndex,\n                    rowStartPinned   : finalRange.startRow.pinPosition,\n                    rowStartParamKeys: finalRange.startRow.parentKeys,\n                    rowEndIndex      : finalRange.endRow.rowIndex,\n                    rowEndParamKeys  : finalRange.endRow.parentKeys,\n                    rowEndPinned     : finalRange.endRow.pinPosition,\n                    columnIds        : finalRange.columnIds,\n                    columnStart      : finalRange.startColumnId,\n                    columnEnd        : finalRange.endColumnId\n                });\n            }\n\n            this.hookManager.executeHook(HookEventsName.onBeforeFillSeries, HookEventsName.onAfterFillSeries, callBack, {\n                range       : finalRange,\n                initialRange: this.cellRange\n            })\n        }\n\n        this.clearSelectionPath();\n\n    }\n\n    private handleValueChanged(initialRange: CellRangeType, finalRange: CellRangeType, e: MouseEvent) {\n        const initialRangeEndRow             = this.rangeSelectionHandler!.getRangeEndRow(initialRange);\n        const initialRangeStartRow           = this.rangeSelectionHandler!.getRangeStartRow(initialRange);\n        const finalRangeEndRow               = this.rangeSelectionHandler!.getRangeEndRow(finalRange);\n        const finalRangeStartRow             = this.rangeSelectionHandler!.getRangeStartRow(finalRange);\n        const isVertical                     = this.dragAxis === 'y';\n        const isSuppressClearOnFillReduction = this.optionsHandler.isSuppressClearOnFillReduction();\n\n        if (this.isReduce && !isSuppressClearOnFillReduction) {\n            const columns  = (isVertical ? initialRange.columnIds : initialRange.columnIds.filter((col) => finalRange.columnIds.indexOf(col) < 0)) as string[];\n            const startRow = isVertical ? this.cellNavigationHandler.getRowBelow(finalRangeEndRow) : finalRangeStartRow;\n\n            if (startRow) {\n                this.clearCellsInRange(startRow, initialRangeEndRow, columns);\n            }\n            return;\n        }\n\n        const values: ValueContext[]            = [];\n        const initialValues: any[]              = [];\n        const initialNonAggregatedValues: any[] = [];\n        const initialFormattedValues: any[]     = [];\n\n        let withinInitialRange = true;\n        let index              = 0;\n\n        const resetValues = () => {\n            values.length                     = 0;\n            initialValues.length              = 0;\n            initialNonAggregatedValues.length = 0;\n            initialFormattedValues.length     = 0;\n            index                             = 0;\n        };\n\n        const traverseCellRange = (column?: IColumnNode, columns?: IColumnNode[]) => {\n            let currentRow: RowPositionType | undefined | null = this.isUp ? initialRangeEndRow : initialRangeStartRow;\n            let finished                                       = false;\n\n            if (isVertical) {\n                withinInitialRange = true;\n                resetValues();\n            }\n\n            while (!finished && currentRow) {\n                const rowNodes = this.recordHandler.getSequenceRowNodes(currentRow, currentRow);\n                if (rowNodes.length === 0) {\n                    break;\n                }\n\n                let rowNode = rowNodes[0];\n\n                if (isVertical && column) {\n                    fillSelectionWithValues( values, column, rowNode, () => !this.isSameRow(currentRow!, this.isUp ? initialRangeStartRow : initialRangeEndRow) );\n                } else if (columns) {\n                    withinInitialRange = true;\n                    resetValues();\n                    columns.forEach((col) => fillSelectionWithValues( values, col, rowNode, () => col.getID() !== (this.isLeft ? initialRange.columnIds[0] : initialRange.columnIds[initialRange.columnIds.length - 1]) ) );\n                }\n\n                finished   = this.isSameRow(currentRow, this.isUp ? finalRangeStartRow : finalRangeEndRow);\n                currentRow = this.isUp ? this.cellNavigationHandler.getRowAbove(currentRow) : this.cellNavigationHandler.getRowBelow(currentRow);\n            }\n        };\n\n        const fillSelectionWithValues = ( currentValues: ValueContext[], col: IColumnNode, rowNode: IRowNodeCore, updateInitialSet: () => boolean ) => {\n            let currentValue: any;\n            let skipValue   : boolean = false;\n\n            if (withinInitialRange) {\n                currentValue = rowNode.getDataByKey(col.getColumnKey());\n                initialValues.push(currentValue);\n                initialNonAggregatedValues.push(rowNode.getDataByKey(col.getColumnKey()));\n                withinInitialRange = updateInitialSet();\n            } else {\n                const { value } = this.processValues({ event: e, values: currentValues, initialValues, index: index++ });\n\n                currentValue = value;\n                if (col.isEditable(rowNode)) {\n                    const cellValue = rowNode.getDataByKey(col.getColumnKey());\n                    if (cellValue !== currentValue) {\n                        this.cellAPI.setDataById(rowNode.getId(), col.getID(), currentValue, {}, { eventOrigin : 'fillCue' })\n                    } else {\n                        skipValue = true;\n                    }\n                }\n            }\n\n            if (!skipValue) {\n                currentValues.push({\n                    value : currentValue,\n                    column: col,\n                    rowNode,\n                });\n            }\n        };\n\n        if (isVertical) {\n            initialRange.columnIds.forEach((col: string) => {\n                traverseCellRange(this.fieldHandler.getColumnNodeByID(col));\n            });\n        } else {\n            const columns = (this.isLeft ? [...finalRange.columnIds].reverse() : finalRange.columnIds) ;\n            const columnsMap = columns.map((col) => this.fieldHandler.getColumnNodeByID(col));\n            traverseCellRange(undefined, columnsMap);\n        }\n\n    }\n\n    private processValues(params: { event: MouseEvent; values: ValueContext[]; initialValues: any[]; index: number; }): { value: any} {\n        const { event, values, initialValues, index } = params;\n\n        const allNumbers = !values.some(({ value }) => {\n            const floatValue = parseFloat(value);\n            return isNaN(floatValue) || floatValue.toString() !== value.toString();\n        });\n\n        if (event.altKey || !allNumbers) {\n            if (allNumbers && initialValues.length === 1) {\n                const multiplier = this.isUp || this.isLeft ? -1 : 1;\n                return { value: parseFloat(values[values.length - 1].value) + 1 * multiplier};\n            }\n            const { value } = values[index % values.length];\n            return { value};\n        }\n\n        const numberValues = computeLeastSquaresLine(values.map(({ value }) => Number(value)))\n\n        return {\n            value: numberValues[numberValues.length - 1]\n        };\n    }\n\n\n    private clearCellsInRange(startRow: RowPositionType, endRow: RowPositionType, columns: string[]) {\n        const cellRange: CellRangeType = {\n            startRow,\n            endRow,\n            columnIds    : columns,\n            startColumnId: columns[0],\n            endColumnId  : columns[columns.length - 1]\n        };\n        this.rangeSelectionHandler!.clearCellRangeCellValues([cellRange], 'fillCue');\n    }\n\n    private onDragCancel(): void {\n        this.initialXY = null;\n        if (!this.filledCells.length) {\n            return;\n        }\n\n        this.clearSelectionPath();\n    }\n\n    private updateValuesOnMove(e: MouseEvent) {\n\n        const cellCtrl = getControllerFromTargetElement<CellController>(this.optionsHandler, e.target, CellController.DOM_KEY_CELL_CTRL);\n        const cell     = cellCtrl?.getCellPosition();\n\n        if ( !cell || (this.lastCellHovered && this.cellEquals(cell, this.lastCellHovered)) ) {\n            return;\n        }\n\n        this.lastCellHovered = cell;\n\n        if (!this.initialXY) {\n            this.initialXY = this.getNormalisedPosition(e);\n        }\n\n        const { x, y }             = this.initialXY;\n        const { x: newX, y: newY } = this.getNormalisedPosition(e);\n        const diffX                = Math.abs(x - newX);\n        const diffY                = Math.abs(y - newY);\n        const allowedDirection     = this.getFillHandleDirection();\n        let direction: FillDirection;\n\n        if (allowedDirection === 'xy') {\n            direction = diffX > diffY ? 'x' : 'y';\n        } else {\n            direction = allowedDirection;\n        }\n\n        if (direction !== this.dragAxis) {\n            this.dragAxis = direction;\n        }\n\n    }\n\n    private cellEquals(previousCellPosition : CellPositionType , cellPosition : CellPositionType) : boolean {\n            const colsMatch       = cellPosition.columnID    === previousCellPosition.columnID;\n            const floatingMatch   = cellPosition.pinPosition === previousCellPosition.pinPosition;\n            const indexMatch      = cellPosition.rowIndex    === previousCellPosition.rowIndex;\n            const parentKeysMatch = areArraysEqual(cellPosition.parentKeys, previousCellPosition.parentKeys);\n            return colsMatch && floatingMatch && indexMatch && parentKeysMatch;\n        }\n\n    private getFillHandleDirection(): 'x' | 'y' | 'xy' {\n        const direction = this.optionsHandler.getFillSeriesDirection();\n\n        if (!direction) {\n            return 'xy';\n        }\n\n        if (direction !== 'x' && direction !== 'y' && direction !== 'xy') {\n            return 'xy';\n        }\n\n        return direction;\n    }\n\n     private getNormalisedPosition(event: MouseEvent | DraggingEvent<any>): { x: number; y: number } {\n            const e = event as MouseEvent;\n            const x = e.clientX ?? e.x;\n            const y = e.clientY ?? e.y;\n    \n            const gridBodyController = this.controllerHandler.getBodyController();\n            const scrollHandler      = gridBodyController.getScrollHandler();\n            const verticalPosition   = scrollHandler.getVScrollPosition().top;\n            const horizontalPosition = scrollHandler.getHScrollPosition().left;\n    \n            return { x: x + horizontalPosition, y: y + verticalPosition };\n        }\n\n     public refresh(cellCtrl: CellController) : void {\n        const oldCellComp = this.cellCtrl;\n        const element     = this.getGui();\n\n        const cellRanges = this.rangeSelectionHandler.getCellRanges();\n        const cellRange  = cellRanges[cellRanges.length - 1];\n\n        const start = cellRange.startRow;\n        const end   = cellRange.endRow;\n\n        if (start && end) {\n            const isBefore = this.isRowBefore(end, start);\n\n            if (isBefore) {\n                this.rangeStartRow = end;\n                this.rangeEndRow   = start;\n            } else {\n                this.rangeStartRow = start;\n                this.rangeEndRow   = end;\n            }\n        }\n\n        if (oldCellComp !== cellCtrl || !isVisible(element)) {\n                  this.cellCtrl = cellCtrl;\n            const parentElement = cellCtrl.component.getElement();\n            if (parentElement) {\n                parentElement.appendChild(element);\n            }\n        }\n\n        this.cellRange = cellRange;\n    }\n\n    public override destroy() {\n        if (!this.shouldDestroyOnEndDragging && this.dragging) {\n            this.shouldDestroyOnEndDragging = true;\n            return;\n        }\n\n        this.shouldDestroyOnEndDragging = false;\n        this.dragService                = null as any;\n        this.rangeSelectionHandler      = null as any;\n        this.cellNavigationHandler      = null as any;\n        this.recordHandler              = null as any;\n        this.controllerHandler          = null as any;\n        this.fieldHandler               = null as any;\n        this.rowRendererController      = null as any;\n        this.cellAPI                    = null as any;\n        this.hookManager                = null as any;\n        this.getBeanInstanceByBeanName  = null as any;\n\n        super.destroy();\n\n        const eGui = this.getGui();\n\n        eGui.parentElement?.removeChild(eGui);\n    }\n\n    private updateSelectionPath(initialPosition: CellPositionType, currentPosition: CellPositionType) {\n        this.clearSelectionPath();\n        this.clearDraggedCellValues();\n\n        if (this.dragAxis === 'y') {\n            const isSameRow = initialPosition.rowIndex === currentPosition.rowIndex &&initialPosition.pinPosition === currentPosition.pinPosition;\n            if (isSameRow) {\n                return;\n            }\n\n            const isBefore = this.isRowBefore(currentPosition, initialPosition);\n            const { rangeStartRow, rangeEndRow } = this;\n\n            if ( isBefore && ((currentPosition.pinPosition == rangeStartRow.pinPosition && currentPosition.rowIndex >= rangeStartRow.rowIndex) || (rangeStartRow.pinPosition != rangeEndRow.pinPosition && currentPosition.pinPosition == rangeEndRow.pinPosition && currentPosition.rowIndex <= rangeEndRow.rowIndex)) ) {\n                this.shrinkVerticalSelection(initialPosition, currentPosition);\n                this.isReduce = true;\n            } else {\n                this.expandVerticalSelection(initialPosition, currentPosition, isBefore);\n                this.isReduce = false;\n            }\n        } else {\n            const initialColumn = initialPosition.columnID;\n            const currentColumn = currentPosition.columnID;\n\n            if (initialColumn === currentColumn) {\n                return;\n            }\n            const initialIndex = this.fieldHandler.getIndexById(initialColumn);\n            const currentIndex = this.fieldHandler.getIndexById(currentColumn);\n\n            if ( currentIndex <= initialIndex && currentIndex >= this.fieldHandler.getIndexById(this.cellRange.columnIds[0]) ) {\n                this.shrinkHorizontalSelection(initialPosition, currentPosition);\n                this.isReduce = true;\n            } else {\n                this.expandHorizontalSelection(initialPosition, currentPosition, currentIndex < initialIndex);\n                this.isReduce = false;\n            }\n        }\n        this.lastCellMarked = currentPosition;\n    }\n\n    private clearSelectionPath() {\n        this.filledCells.forEach((cell) => {\n            if (!cell.isAlive()) {\n                return;\n            }\n            const { component } = cell;\n            component.addOrRemoveCssClass('ZG-fillseries', false);\n            component.addOrRemoveCssClass('ZG-fillseries__selection--top', false);\n            component.addOrRemoveCssClass('ZG-fillseries__selection--right', false);\n            component.addOrRemoveCssClass('ZG-fillseries__selection--bottom', false);\n            component.addOrRemoveCssClass('ZG-fillseries__selection--left', false);\n        });\n\n        this.filledCells.length = 0;\n        this.isUp               = false;\n        this.isLeft             = false;\n        this.isReduce           = false;\n    }\n\n    private expandVerticalSelection(initialPosition: CellPositionType, endPosition: CellPositionType, isMovingUp?: boolean) {\n\n        let row: RowPositionType | null = initialPosition;\n\n        do {\n            const cellRange = this.cellRange;\n            const columnLength = cellRange.columnIds.length;\n\n            for (let i = 0; i < columnLength; i++) {\n                const column                          = cellRange.columnIds[i];\n                const rowPosition                     = { rowIndex: row.rowIndex, pinPosition: row.pinPosition, parentKeys : row.parentKeys };\n                const cellPosition : CellPositionType = { ...rowPosition, columnID : column };\n                const cellInRange                     = this.rangeSelectionHandler!.isCellInSpecificRange(cellPosition, cellRange);\n                const isInitialRow                    = this.isSameRow(row, initialPosition);\n\n                if (isMovingUp) {\n                    this.isUp = true;\n                }\n\n                if (!isInitialRow) {\n                    const cell = this.getCellByPosition(cellPosition);\n\n                    if (cell) {\n                        this.filledCells.push(cell);\n                        const cellComp = cell.component;\n\n                        cellComp.addOrRemoveCssClass('ZG-fillseries', true)\n\n                        if (!cellInRange) {\n                            cellComp.addOrRemoveCssClass('ZG-fillseries__selection--left', i === 0);\n                            cellComp.addOrRemoveCssClass('ZG-fillseries__selection--right', i === columnLength - 1);\n                        }\n\n                        cellComp.addOrRemoveCssClass( isMovingUp ? 'ZG-fillseries__selection--top' : 'ZG-fillseries__selection--bottom', this.isSameRow(row, endPosition) );\n                    }\n                }\n            }\n\n            if (this.isSameRow(row, endPosition)) {\n                break;\n            }\n        } while ( (row = isMovingUp ? this.cellNavigationHandler.getRowAbove(row) : this.cellNavigationHandler.getRowBelow(row)) );\n    }\n\n    private isSameRow(rowA : RowPositionType, rowB : RowPositionType) : boolean {\n        return rowA.rowIndex === rowB.rowIndex && rowA.pinPosition === rowB.pinPosition && areArraysEqual(rowA.parentKeys, rowB.parentKeys);\n    }\n\n    private getCellByPosition(cellPosition : CellPositionType) : CellController {\n        const rowController = this.rowRendererController.getRowByPosition(cellPosition);\n        return rowController.getCellController(cellPosition.columnID);\n    }\n\n    private shrinkVerticalSelection(initialPosition: CellPositionType, endPosition: CellPositionType) {\n        let row: RowPositionType | null = initialPosition;\n\n        do {\n            const cellRange    = this.cellRange;\n            const columnLength = cellRange.columnIds.length;\n            const isLastRow    = this.isSameRow(row, endPosition);\n\n            for (let i = 0; i < columnLength; i++) {\n                const rowPosition = { rowIndex: row.rowIndex, pinPosition: row.pinPosition, parentKeys : row.parentKeys };\n                const cellPosition = { ...rowPosition, columnID: cellRange.columnIds[i] };\n                const cell   = this.getCellByPosition(cellPosition);\n\n                if (cell) {\n                    this.filledCells.push(cell);\n                    cell.component.addOrRemoveCssClass('ZG-fillseries', true);\n                    cell.component.addOrRemoveCssClass('ZG-fillseries__selection--bottom', this.isSameRow(row, endPosition));\n                }\n            }\n            if (isLastRow) {\n                break;\n            }\n        } while ((row = this.cellNavigationHandler.getRowAbove(row)));\n    }\n\n    private expandHorizontalSelection(initialPosition: CellPositionType, endPosition: CellPositionType, isMovingLeft?: boolean) {\n        const startColumn = this.fieldHandler.getIndexById((isMovingLeft ? endPosition.columnID : initialPosition.columnID));\n        const endColumn   = this.fieldHandler.getIndexById((isMovingLeft ? this.cellRange.columnIds[0] : endPosition.columnID));\n\n        const { rangeStartRow, rangeEndRow } = this;\n\n        for(let column = startColumn; column <= endColumn ; column++) {\n            let row: RowPositionType = rangeStartRow;\n            let isLastRow = false;\n\n            do {\n                isLastRow = this.isSameRow(row, rangeEndRow);\n                const cell = this.getCellByPosition({\n                    rowIndex   : row.rowIndex,\n                    pinPosition: row.pinPosition,\n                    parentKeys : row.parentKeys,\n                    columnID   : this.fieldHandler.getIdByIndex(column),\n                });\n\n                if (cell) {\n                    this.filledCells.push(cell);\n                    const cellComp = cell.component;\n                    cell.component.addOrRemoveCssClass('ZG-fillseries', true);\n                    cellComp.addOrRemoveCssClass('ZG-fillseries__selection--top', this.isSameRow(row, rangeStartRow));\n                    cellComp.addOrRemoveCssClass('ZG-fillseries__selection--bottom', this.isSameRow(row, rangeEndRow));\n                    if (isMovingLeft) {\n                        this.isLeft = true;\n                        cellComp.addOrRemoveCssClass('ZG-fillseries__selection--left', column === startColumn);\n                    } else {\n                        cellComp.addOrRemoveCssClass('ZG-fillseries__selection--right', column === endColumn);\n                    }\n                }\n\n                row = this.cellNavigationHandler.getRowBelow(row)!;\n            } while (!isLastRow);\n        }\n    }\n\n    private shrinkHorizontalSelection(initialPosition: CellPositionType, endPosition: CellPositionType) {\n        const startCol = this.fieldHandler.getIndexById(endPosition.columnID);\n        const endCol = this.fieldHandler.getIndexById(initialPosition.columnID);\n\n        const { rangeStartRow, rangeEndRow } = this;\n\n        for(let column = startCol ; column <= endCol ; column++) {\n            let row: RowPositionType = rangeStartRow;\n            let isLastRow: boolean = false;\n\n            do {\n                isLastRow = this.isSameRow(row, rangeEndRow);\n                const cell = this.getCellByPosition({\n                    rowIndex   : row.rowIndex,\n                    pinPosition: row.pinPosition,\n                    parentKeys : row.parentKeys,\n                    columnID   : this.fieldHandler.getIdByIndex(column),\n                });\n\n                if (cell) {\n                    this.filledCells.push(cell);\n                    cell.component.addOrRemoveCssClass('ZG-fillseries__selection--right', column === startCol);\n                }\n\n                row = this.cellNavigationHandler.getRowBelow(row)!;\n            } while (!isLastRow);\n        }\n    }\n\n    private clearDraggedCellValues() {\n        this.cellValues.length = 0;\n    }\n\n\n    public isRowBefore(previousRowPosition: RowPositionType, currentPinPosition: RowPositionType): boolean {\n        const previousRowIndex = this.recordHandler.getIndexByMeta(previousRowPosition.rowIndex, previousRowPosition.pinPosition, previousRowPosition.parentKeys);\n        const currentRowIndex  = this.recordHandler.getIndexByMeta(currentPinPosition.rowIndex, currentPinPosition.pinPosition, currentPinPosition.parentKeys);\n\n        switch (previousRowPosition.pinPosition) {\n            case 'top':\n                if (currentPinPosition.pinPosition !== 'top') { \n                    return true; \n                }\n                break;\n            case 'bottom':\n                if (currentPinPosition.pinPosition !== 'bottom') { \n                    return false; \n                }\n                break;\n            default:\n                if(currentPinPosition.pinPosition !== 'middle') {\n                    return currentPinPosition.pinPosition !== 'top';\n                }\n                break;\n        }\n        return previousRowIndex < currentRowIndex;\n    }\n}","import { Context } from \"@dg/corecomponent\";\nimport { IUserParams } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text-core-component\";\nimport { IColumnAPIManager, IExperimentalAPI, IGridAPI, IReorderableAPI, IRowAPIManager } from \"../Grid/Main\";\nimport { IGalleryConfiguration } from \"./gallery-configuration.types\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { GridCoreComponent } from \"../Grid/Core/GridCoreComponent\";\nimport { ModuleRegistry } from \"../Grid/Core/ModuleRegistry\";\nimport { GalleryModule } from \"./gallery-module\";\nimport { ISortApiManager } from \"../Grid/API/SortAPI/Interface/ISortApiManager.types\";\nimport { IFilterApiManager } from \"../Grid/API/FilterAPI/Interface/IFilterApiManager.types\";\nimport { IRowGroupingApiManager } from \"../Grid/API/RowGroupingAPI/Interface/IRowGroupingApiManager.types\";\nimport { IRowSelectionAPI } from \"../Grid/API/selection/selection-api.types\";\n\nModuleRegistry.registerModules([GalleryModule]);\n\nexport class Gallery {\n\tpublic api              : IGridAPI;\n\tpublic experimentalAPI : IExperimentalAPI;\n\tpublic rowAPI           : IRowAPIManager;\n\tpublic selectionAPI     : IRowSelectionAPI;\n\tpublic reorderableAPI   : IReorderableAPI;\n\tpublic columnAPI        : IColumnAPIManager;\n\tpublic sortAPI          : ISortApiManager;\n\tpublic filterAPI        : IFilterApiManager;\n\tpublic rowGroupingAPI   : IRowGroupingApiManager;\n\tconstructor(gridContainer : HTMLElement, gridOptions : IGalleryConfiguration, params : IUserParams) {\n\t\tconst setContextAPI = (context : Context) => {\n\t\t\tthis.api              = context.getBean(GRID_BEAN_NAME.GRID_API);\n\t\t\tthis.experimentalAPI = context.getBean(GRID_BEAN_NAME.GRID_EXPERIMENTAL_API);\n\t\t\tthis.rowAPI           = context.getBean(GRID_BEAN_NAME.ROW_API);\n\t\t\tthis.columnAPI        = context.getBean(GRID_BEAN_NAME.COLUMN_API);\n\t\t\tthis.selectionAPI     = context.getBean('rowSelectionAPI');\n\t\t\tthis.reorderableAPI   = context.getBean(GRID_BEAN_NAME.REORDERABLE_API);\n\t\t\tthis.sortAPI          = context.getBean(GRID_BEAN_NAME.SORT_API);\n\t\t\tthis.filterAPI        = context.getBean(GRID_BEAN_NAME.FILTER_API);\n\t\t\tthis.rowGroupingAPI   = context.getBean(GRID_BEAN_NAME.ROW_GROUPING_API);\n\t\t};\n\t\tnew GridCoreComponent().initializeGrid(gridContainer, gridOptions, 'gallery', setContextAPI, params);\n\t}\n}\n","import { findInsertIndex } from \"../../../Sub_Components/src/Utilities/Utility\";\nimport { IGalleryAxis, IGalleryConfig } from \"./Interface/rowAxis-gallery.types\";\n\nfunction findSequenceCount(array: number[], index : number): number {\n    for(let i = index; i < array.length -1; i++){\n        if(array[i] + 1 != array[i+1]){\n            return index - i;\n        }\n    }\n    return array.length - index;\n}\n\nclass GalleryAxisHandler implements IGalleryAxis{\n    private xAxis       : GalleryAxisBase;\n    private yAxis       : GalleryAxisBase;\n    private totalCount  : number;\n    private hiddenRows  : any[];\n    constructor(config : IGalleryConfig) {\n        const {minWidth, minHeight}   = config;\n        const maxHeight               = config.maxHeight ?? minHeight;\n        const maxWidth                = config.maxWidth ?? minWidth;\n        const horizontalGap           = config.horizontalGap ?? 0;\n        const verticalGap             = config.verticalGap ?? 0;\n        const availableWidth          = config.availableWidth;\n        const availableHeight         = config.availableHeight;\n\n\n        this.xAxis        = new GalleryAxisBase(availableWidth, minWidth, maxWidth, horizontalGap);\n        this.yAxis        = new GalleryAxisBase(availableHeight, minHeight, maxHeight, verticalGap);\n        this.totalCount   = config.count ?? 0;\n        this.hiddenRows = [];\n    }\n    updateBottomMargin(_marginBottom: number = 0): void {\n    }\n    updateTopMargin(_marginTop: number = 0): void {\n    }\n    getBottomMargin(): number {\n        return this.yAxis.getGapSize();\n    }\n    getTopMargin(): number {\n        return this.yAxis.getGapSize();\n    }\n    resetRows(): void {\n        this.totalCount = 0;\n        this.hiddenRows = [];\n    }\n    updateAllHeight(_height: number): void {\n    }\n    getVerticalIndex(index: number, count?: number): number {\n        const adaptableCardXCount = this.xAxis.getAdoptableCardsCount();\n        \n        let   yIndex = Math.floor(index / adaptableCardXCount) + count;\n        const xIndex = index % adaptableCardXCount;\n        index        = Math.min(this.totalCount, (yIndex * adaptableCardXCount + xIndex));\n\n        return Math.max(0, index);\n    }\n\n    getMargin(): number {\n        return this.yAxis.getGapSize();\n    }\n\n    private getRowBeforeHiddenCount(index : number): number {\n        return findInsertIndex(this.hiddenRows, index);\n    }\n\n    convertToActualIndex(visibleIndex: number): number {\n        return visibleIndex;\n    }\n\n    getVisibleIndexesByPosition(localTop: number, localBottom: number, left: number): number[] {\n        let top = localTop;\n        const visibleIndexes = [];\n        const startIndex = this.getIndexByPosition(top, 0);\n        const endIndex = this.getIndexByPosition(localBottom, left);\n\n        for(let i = startIndex; i <= endIndex && !this.isRowHidden(i); i++){\n            visibleIndexes.push(i);\n        }\n        return visibleIndexes;\n    }\n\n    updateRow(_index: number, _height: number): void {\n\n    } \n    hideRow(index: number): void {\n        const isExist = this.hiddenRows.includes(index);\n        if(!isExist){\n            this.hiddenRows.push(index);\n            this.hiddenRows = this.hiddenRows.sort((a, b) => a - b);\n        }\n    }\n    showRow(index: number): void {\n        const indexIndex = this.hiddenRows.indexOf(index);\n        if(indexIndex != -1){\n            this.hiddenRows.splice(indexIndex, 1);\n        }\n    }\n    isRowHidden(index: number): boolean {\n        return this.hiddenRows.indexOf(index) != -1;\n    }\n\n    private isValid(index : number) : boolean {\n        return index >= 0 && index < this.totalCount;\n    }\n\n    getTotalCount(): number {\n        return this.totalCount;\n    }\n    getTotalHeight(): number {\n        const verticalGap = this.yAxis.getGapSize();\n        const adaptableCardXCount   = this.xAxis.getAdoptableCardsCount();\n        const cardHeight = this.getHeight(0) + verticalGap;\n        const hiddenCount = this.hiddenRows.length;\n        const yCount = Math.ceil((this.totalCount - hiddenCount) / adaptableCardXCount);\n        return cardHeight * yCount;\n    }\n    \n    getIndexByPosition(top : number, left : number) : number{\n        const xCount              = this.xAxis.getIndexByPosition(left);\n        const yCount              = this.yAxis.getIndexByPosition(top);\n        const adaptableCardXCount = this.xAxis.getAdoptableCardsCount();\n        const rowIndex            = (yCount * adaptableCardXCount) + xCount;\n        const prevHiddenCount     = this.getRowBeforeHiddenCount(rowIndex);\n        const sequenceCount       = this.isRowHidden(prevHiddenCount) ? findSequenceCount(this.hiddenRows, prevHiddenCount) : 0;\n        const lastIndex           = this.getLastIndex();\n        return Math.min(lastIndex, (rowIndex + prevHiddenCount + sequenceCount));\n    }\n\n    getLastIndex(): number {\n        return this.totalCount - 1;\n    }\n\n    getWidth(index: number): number {\n        return this.isRowHidden(index) ? 0 : this.xAxis.getSize();\n    }\n\n    getHeight(index: number): number {\n        return this.isRowHidden(index) ? 0 : this.yAxis.getSize();\n    }\n\n    getLeft(index : number) : number{\n        const adoptableCards = this.xAxis.getAdoptableCardsCount();\n        index = Math.min(this.totalCount, (index % adoptableCards));\n        return this.xAxis.getStartPosition(index);\n    }\n\n    getTop(index : number) : number {\n        const adoptableCards = this.xAxis.getAdoptableCardsCount();\n        const prevHiddenCount = this.getRowBeforeHiddenCount(index);\n        index = Math.min(this.totalCount, index - prevHiddenCount);\n        index = Math.floor(index / adoptableCards) ;\n        return this.yAxis.getStartPosition(index);\n    }\n\n    insertRow(_localIndex: number): void {\n        this.totalCount++;\n    }\n    deleteRow(localIndex: number): void {\n        this.isValid(localIndex) && this.totalCount--;\n    }\n    appendRow() : void{\n        this.totalCount++;\n    }\n\n    appendMultipleRows(heights : number[]) : void{\n        this.totalCount += heights.length;\n    }\n\n    updateAvailableWidth(availableWidth : number) : void{\n        this.xAxis.updateAvailableSize(availableWidth);\n    }\n\n    updateAvailableHeight(availableWidth : number) : void{\n        this.yAxis.updateAvailableSize(availableWidth);\n    }\n\n    getCardsPerRow() : number {\n        return this.xAxis.getAdoptableCardsCount();\n    }\n\n    getDisplayIndexByPosition(top: number, left?: number): number {\n        return this.getIndexByPosition(top, left);\n    }\n}\n\nclass GalleryAxisBase {\n    private availableSize : number;\n    private minSize : number;\n    private maxSize : number;\n    private cardSize !: number;\n    private gapSize: number;\n    constructor(availableSize: number, minSize: number, maxSize: number, gap : number) {\n        this.availableSize  = availableSize;\n        this.minSize        = minSize;\n        this.maxSize        = maxSize;\n        this.gapSize        = gap * 2;\n        this.updateCardSize();\n    }\n\n    getGapSize() : number{\n        return this.gapSize;\n    }\n\n    private updateCardSize() : void{\n        const minSize         = this.minSize + this.gapSize;\n        if(minSize == Infinity){\n            this.cardSize = this.availableSize;\n            return;\n        }\n        const maxSize         = this.maxSize + this.gapSize;\n        const adoptableCards  = Math.floor(this.availableSize / minSize);\n        const remainingWidth  = this.availableSize - (adoptableCards * minSize);\n        const cardSize        = minSize + (remainingWidth / adoptableCards);\n        this.cardSize         = Math.floor(Math.min(maxSize, cardSize));\n    }\n\n    updateAvailableSize(availableSize : number) : void{\n        this.availableSize = availableSize;\n        this.updateCardSize();\n    }\n\n    getAdoptableCardsCount() : number{\n        const cardCount = Math.floor(this.availableSize / this.cardSize);\n        return Math.max(1, cardCount);\n    }\n\n    getStartPosition(index : number) : number{\n        return (index * this.cardSize) + (this.gapSize / 2);\n    }\n\n    getSize() : number {\n        return this.cardSize - this.gapSize;\n    }\n\n    getIndexByPosition(position : number) : number {\n        return Math.floor(position / this.cardSize);\n    }\n}\n\nexport{\n    GalleryAxisHandler as GalleryAxis\n}","import { RowBlockAxisCore } from '../../DataStore/RowAxis/RowBlockAxisCore';\nimport { GalleryAxis } from './GalleryAxis';\nimport { IGallayBlockAxis, IGalleryAxis, IGalleryConfig } from './Interface/rowAxis-gallery.types';\n\n\n//atlast api as to calculation from localIndex\n\n// class GalleryBlockAxis implements IGallayBlockAxis{\n//     private relativeCount: number;\n//     private relativeTop  : number;\n//     private axis         : GalleryAxis;\n//     constructor(config : IGalleryConfig){\n//         this.axis          = new GalleryAxis(config);\n//         this.relativeCount = 0;\n//         this.relativeTop   = 0;\n//     }\n//     convertToActualIndex(visibleIndex: number): number {\n//         return this.axis.convertToActualIndex(visibleIndex);\n//     }\n\n//     getTotalCount(): number {\n//         return this.axis.getTotalCount();\n//     }\n\n//     getTotalHeight(): number {\n//         return this.axis.getTotalHeight();\n//     }\n\n//     updateAvailableWidth(availableWidth: number): void {\n//         this.axis.updateAvailableWidth(availableWidth);\n//     }\n\n//     updateAvailableHeight(availableHeight: number): void {\n//         this.axis.updateAvailableHeight(availableHeight);\n//     }\n\n//     updateRow(globalIndex: number, height: number): void {\n//         const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n//         return this.axis.updateRow(localIndex, height);\n//     } \n//     hideRow(globalIndex: number): void {\n//         const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n//         return this.axis.hideRow(localIndex);\n//     }\n//     showRow(globalIndex: number): void {\n//         const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n//         return this.axis.showRow(localIndex);\n//     }\n//     isRowHidden(globalIndex: number): boolean {\n//         const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n//         return this.axis.isRowHidden(localIndex);\n//     }\n\n//     getRelativeCount(): number {\n//         return this.relativeCount;\n//     }\n\n//     getRelativeTop(): number {\n//         return this.relativeTop;\n//     }\n\n//     getLeft(globalIndex: number): number {\n//         const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n//         return this.axis.getLeft(localIndex);\n//     }\n\n//     convertLocalToGlobalIndex(localIndex : number) : number{\n//         return this.relativeCount + localIndex;\n//     }\n\n//     convertGlobalToLocalIndex(globalIndex : number) : number{\n//         return globalIndex - this.relativeCount;\n//     }\n\n//     convertLocalToGlobalTop(localTop : number) : number{\n//         return this.relativeTop + localTop;\n//     }\n\n//     convertGlobalToLocalTop(globalTop : number) : number {\n//         return globalTop - this.relativeTop;\n//     }\n\n//     appendRow(): void {\n//         return this.axis.appendRow();\n//     }\n\n//     deleteRow(index: number): void {\n//         const localIndex = this.convertGlobalToLocalIndex(index);\n//         return this.axis.deleteRow(localIndex);\n//     }\n     \n//     insertRow(index: number): void {\n//         const localIndex = this.convertGlobalToLocalIndex(index);\n//         return this.axis.insertRow(localIndex);\n//     }\n\n//     getTop(globalIndex : number) : number{\n//         const localIndex = this.convertGlobalToLocalIndex(globalIndex);\n//         return this.getGlobalTop(localIndex);\n//     }\n\n//     getWidth(index: number): number {\n//         const localIndex = this.convertGlobalToLocalIndex(index);\n//         return this.axis.getWidth(localIndex);\n//     }\n\n//     getHeight(index: number): number {\n//         const localIndex = this.convertGlobalToLocalIndex(index);\n//         return this.axis.getHeight(localIndex);\n//     }\n\n//     getIndexByPosition(globalTop : number, left : number) : number{\n//         const localTop = this.convertGlobalToLocalTop(globalTop);\n//         return this.getGlobalIndex(localTop, left);\n//     }\n\n//     getGlobalTop(localIndex : number) : number {\n//         const top = this.axis.getTop(localIndex);\n//         return this.convertLocalToGlobalTop(top);\n//     }\n\n//     getGlobalIndex(localTop : number, localLeft : number) : number {\n//         const index = this.axis.getIndexByPosition(localTop, localLeft);\n//         return this.convertLocalToGlobalIndex(index);\n//     }\n\n//     setRelativeCount(index : number) : void {\n//         this.relativeCount = index;\n//     }\n    \n//     setRelativeTop(top : number) : void {\n//         this.relativeTop = top;\n//     }\n\n//     getDisplayIndexByPosition(_top: number, _left?: number): number {\n//         return 0;\n//     }\n// }\n\n\nexport class GalleryBlockAxis extends RowBlockAxisCore implements IGallayBlockAxis{\n    axis: IGalleryAxis;\n    \n    constructor(config : IGalleryConfig){\n        super();\n        this.axis           = new GalleryAxis(config);\n        this.isBlockVisible = config.isVisible ?? true;\n    }\n\n    updateAvailableWidth(availableWidth: number): void {\n        this.axis.updateAvailableWidth(availableWidth);\n    }\n\n    updateAvailableHeight(availableHeight: number): void {\n        this.axis.updateAvailableHeight(availableHeight);\n    }\n\n    getCardsPerRow(): number {\n        return this.axis.getCardsPerRow();\n    }\n}","import { IGalleryConfig } from \"./Interface/rowAxis-gallery.types\";\n\nexport const defaultGalleryConfiguration : IGalleryConfig = {\n    minWidth        : 100,\n    minHeight       : 100,\n    count           : 0,\n    availableWidth  : innerWidth,\n    availableHeight : innerWidth,\n    maxWidth        : 100,\n    maxHeight       : 100,\n    horizontalGap   : 5,\n    verticalGap     : 5\n}\n","import { AutoWired, BEAN_NAME, PostConstruct } from \"@dg/corecomponent\";\nimport { GalleryBlockAxis } from \"./GalleryBlockAxis\";\nimport { IGallayBlockAxis, IGalleryConfig } from \"./Interface/rowAxis-gallery.types\";\nimport { groupedRowAxisCore } from \"../../DataStore/RowAxis/groupedRowAxisCore\";\nimport { defaultGalleryConfiguration } from \"./GalleryConstants\";\n\nexport class GalleryGroupAxis extends groupedRowAxisCore{\n    private   config    : IGalleryConfig;\n    protected groupOrder: IGallayBlockAxis[];\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionalHandler;\n\n    @PostConstruct()\n    init(){\n        this.config = {...{}, ...defaultGalleryConfiguration, ...this.optionalHandler.getViewConfig()};\n        this.addListener(this.eventHandler, \"gridResize\", (params) => {\n            this.updateAvailableWidth(params.width);\n        })\n    }\n\n    createBlock(config ?: IGalleryConfig) : IGallayBlockAxis{\n        const configurations      = {...{}, ...this.config, ...config};\n        return new GalleryBlockAxis(configurations);\n    }\n\n    getNewBlock(): IGallayBlockAxis {\n        const blockAxis = new GalleryBlockAxis(this.config);\n        this.insertBlock(blockAxis);\n        return blockAxis;\n    }\n\n    updateAvailableWidth(width : number) : void{\n        let relativeTop           = 0\n        this.groupOrder.forEach(blockAxis=>{\n            blockAxis.updateAvailableWidth(width);\n            blockAxis.setRelativeTop(relativeTop);\n            relativeTop += blockAxis.getTotalHeight();\n        });\n    }\n\n    getCardsPerRow() : number | undefined {\n        if (this.groupOrder.length === 0) return undefined;\n        const block = this.getBlockByIndex(0);\n        return (block as IGallayBlockAxis).getCardsPerRow?.();\n    }\n}\n","import { Bean } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IRowNodeCoreConstructor } from \"../DataStore/rownode.types\";\nimport { IGroupedRowNodeConstructor } from \"../DataStore/group-rownode.types\";\nimport { IRowAxisConstructor } from \"../DataStore/RowAxis/rowAxis.types\";\nimport { ISortHandlerConstructor } from \"../DataStore/Local/sort-handler.types\";\nimport { IFilterHandlerConstructor } from \"../DataStore/Local/filter-handler.types\";\nimport { IRowGroupingHandlerConstructor } from \"../DataStore/Local/rowgrouping-handler.types\";\nimport { SortHandler } from \"../DataStore/Local/SortHandler\";\nimport { FilterHandler } from \"../DataStore/Local/FilterHandler\";\nimport { RowGroupingHandler } from \"../DataStore/Local/RowGroupingHandler\";\nimport { IGalleryBeanClassRegistry } from \"./gallery-beanclass-registry.types\";\nimport { GalleryRowNode } from \"./GalleryRowNode\";\nimport { GalleryGroupRowNode } from \"./GalleryGroupRowNode\";\nimport { GalleryGroupAxis } from \"./GalleryAxis/GalleryGroupAxis\";\n\n@Bean(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY)\nexport class GalleryBeanClassRegistry implements IGalleryBeanClassRegistry {\n    registerClasses: Map<string, any>;\n    constructor() {\n        this.registerClasses = new Map();\n    }\n\n    getRowNode(): IRowNodeCoreConstructor {\n        return GalleryRowNode;\n    }\n    getGroupRowNode(): IGroupedRowNodeConstructor {\n        return GalleryGroupRowNode;\n    }\n    getStaticRowAxis(): IRowAxisConstructor {\n        return GalleryGroupAxis;\n    }\n    getDynamicRowAxis() : IRowAxisConstructor {\n        return GalleryGroupAxis;\n    }\n    getSortHandler(): ISortHandlerConstructor {\n        return SortHandler;\n    }\n    getFilterHandler(): IFilterHandlerConstructor {\n        return FilterHandler;\n    }\n    getRowGroupingHandler(): IRowGroupingHandlerConstructor {\n        return RowGroupingHandler;\n    }\n}\n","import { GroupRowNode } from \"../DataStore/GroupRowNode\";\n\nexport class GalleryGroupRowNode extends GroupRowNode {\n    getLeft(): number {\n        const index = this.getIndex();\n        return this.helper.getLeft(index);\n    }\n\n    getWidth(): number {\n        const index = this.getIndex();\n        return this.helper.getWidth(index);\n    }\n}\n","import { IFullWidthType, IRowDefinition } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { RowNode } from \"../Grid/Core/Rows/RowNode\";\nimport { IRowNodeHelper } from \"../Grid/Main\";\n\nexport class GalleryRowNode extends RowNode {\n    constructor(helper : IRowNodeHelper, id : string, definition ?: IRowDefinition, data ?: any){\n        super(helper, id, definition, data);\n    }\n\n    isFullWidthRow(): boolean {\n        return true;\n    }\n\n    getLeft(): number {\n        const index = this.getIndex();\n        return this.helper.getLeft(index);\n    }\n\n    getWidth(): number {\n        const index = this.getIndex();\n        return this.helper.getWidth(index);\n    }\n\n    getFullWidthType(): IFullWidthType {\n        return 'sticky'\n    }\n}\n","import { ViewportRangeRegistry } from \"../Grid/Core/ViewportRangeModule\";\nimport { IModule } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\nimport { RowSelectionAPI } from \"../Grid/API/selection/row-selection-api\";\nimport { LocalRowModelModule, RemoteRowModelModule } from \"../Grid/grid-module\";\nimport { NavigationModule } from \"../Navigation/navigation-module\";\nimport { GalleryOptioHandler } from \"./gallery-option-handler\";\nimport { GalleryBeanClassRegistry } from \"./GalleryBeanClassRegistry\";\n\nexport const GalleryModule: IModule = {\n\tmoduleName: 'gallery',\n\tversion: '1.0.0',\n\tbeans: [GalleryBeanClassRegistry, GalleryOptioHandler, RowSelectionAPI, ViewportRangeRegistry],\n    modelType : 'gallery',\n\tdependantModules : [NavigationModule,LocalRowModelModule, RemoteRowModelModule]\n};","import { AutoWired, Bean, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { defaultCacheBlockCount, defaultCacheBlockSize, defaultFetchTriggerPoint, defaultRowHeight, minCacheBlockSize } from \"../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IBaseComponent, IColumnDefinition, IColumnNode, IGridEventHandlers, IKeyBoardShortcutsParams, IRowModel, SuppressCallback } from \"../Grid/Main\";\nimport { IFetchParam, IRowDefinition, IRowDefinitionFetchParams, IRowHeightParam } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { IGalleryConfiguration } from \"./gallery-configuration.types\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { IActionRenderer } from \"GanttModelClasses/IGanttConfiguration\";\nimport { ITreeStructureData } from \"../Grid/Core/Interface/IGridConfiguration\";\n\nexport const configuration = {\n    popUpParent : 'popupParent'\n}\n\nfunction getCallbackForEvent(eventName: string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\nfunction getHookCallbackForEvent(eventName: string, Hookname : string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${Hookname}${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nclass GalleryOptioHandler extends EventEmitter {\n\n\tprivate domKey = `_DG_${Math.random().toString()}`;\n\n\t@AutoWired(GRID_BEAN_NAME.GRID_OPTIONS) private configuration !      : IGalleryConfiguration;\n\t@AutoWired(GRID_BEAN_NAME.GRID_DIV_ELEMENT) private \tgridDivElement !: HTMLElement;\n\t\n\t@PostConstruct()\n\tinit() {\n\t\tthis.setRowData(this.configuration.rowData);\n\t\tthis.eventHandler.addGlobalListener(\n\t\t\tthis.globalEventHandler.bind(this),\n\t\t\tfalse,\n\t\t);\n\t}\n\n\tprivate globalEventHandler(eventName: string, event?: any) {\n\t\tconst callbackMethodName = getCallbackForEvent(eventName);\n\t\tif (typeof this.configuration[callbackMethodName] === 'function') {\n\t\t\tthis.configuration[callbackMethodName](event);\n\t\t}\n\t\tthis.on(eventName, event);\n\t}\n\n\tonBefore(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'Before');\n\n\t\tif(typeof this.configuration['events']?.[callbackMethodName] === 'function') {\n\t\t\treturn this.configuration['events'][callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ton(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, '');\n\n\t\tif(typeof this.configuration['events']?.[callbackMethodName] === 'function') {\n\t\t\treturn this.configuration['events'][callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tonAfter(eventName : string, event?: any) : void {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'After');\n\n\t\tif(typeof this.configuration['events']?.[callbackMethodName] === 'function') {\n\t\t\tthis.configuration['events'][callbackMethodName](event);\n\t\t}\n\t}\n\n\t\n\n\tgetDomKey(): string {\n\t\treturn this.domKey;\n\t}\n\n\tgetDomData(element: Node | null, key: string): any {\n\t\tconst domData = element[this.getDomKey()];\n\t\treturn domData ? domData[key] : undefined;\n\t}\n\n\tsetDomData(element: Element, key: string, value: any): any {\n\t\tconst domKey = this.getDomKey();\n\t\tlet domData = element[domKey];\n\n\t\tif (!domData) {\n\t\t\tdomData = {};\n\t\t\t(element as any)[domKey] = domData;\n\t\t}\n\n\t\tdomData[key] = value;\n\t}\n\n\tgetDefaultRowHeight(): number {\n\t\treturn defaultRowHeight;\n\t}\n\n\tgetCacheBlockCount(): number {\n\t\treturn this.configuration.cacheBlockCount ?? defaultCacheBlockCount;\n\t}\n\n\tgetCacheBlockSize(): number {\n\t\tconst size = this.configuration.cacheBlockSize ?? defaultCacheBlockSize;\n\t\treturn Math.max(minCacheBlockSize, size);\n\t}\n\n\tgetStaticCacheIndexes(): number[] {\n\t\treturn this.configuration.staticCacheRowIndices ?? [];\n\t}\n\n\tgetFetchTriggerPoint(): number {\n\t\treturn this.configuration.fetchTriggerPoint ?? defaultFetchTriggerPoint;\n\t}\n\n\tgetColumnDef(): IColumnDefinition[] {\n\t\treturn this.configuration?.columnDefinitions ?? [];\n\t}\n\n\tgetRowDefinitions(rowMeta : IRowDefinitionFetchParams) : IRowDefinition {\n\t\treturn this.configuration?.rowDefinitions ? this.configuration?.rowDefinitions(rowMeta) ?? {} :{};\n\t}\n\n\tgetRowData() {\n\t\treturn this.configuration.rowData;\n\t}\n\n\tisRTL(): boolean {\n\t\treturn this.configuration?.rtl ?? false;\n\t}\n\n\tgetAnimateRow() : boolean {\n\t\treturn this.configuration?.animateRow ?? true;\n\t}\n\n\n\tgetScrollbarWidth(): number {\n\t\treturn 10;\n\t}\n\n\n\tisRowHoverHighlighter(): boolean {\n\t\treturn this.configuration?.rowHighlighter ?? false;\n\t}\n\n\tgetBufferSize(): number {\n\t\tconst buffer = (this.configuration as any)?.buffer ?? 10;\n\t\treturn Math.max(0, buffer);\n\t}\n\n\tisSuppressHorizontalScroll() {\n\t\treturn false;\n\t}\n\tgetShouldPreventGridMousedown() : boolean {\n\t\treturn this.configuration?.shouldPreventGridMousedown ?? false;\n\t}\n\n\tisSuppressVerticalScroll() {\n\t\treturn false;\n\t}\n\n\tgetPopupParent(): HTMLElement {\n        return this.configuration[configuration.popUpParent];\n\t}\n\n    getDocument(): Document {\n        let result: Document | null = null;\n        if (this.gridDivElement) {\n\t\t\tresult = this.gridDivElement.ownerDocument;\n\t\t}\n\n        if (result) {\n            return result;\n        }\n\n        return document;\n    }\n\n\tgetGridContainer(): HTMLElement {\n\t\treturn this.gridDivElement ?? null;\n\t}\n\n\tgetHookEvents() : IGridEventHandlers {\n\t\treturn this.configuration?.events || {};\n\t}\n\n\tgetEvents(){\n\t\treturn this.configuration?.events || {};\n\t}\n\n\tgetSuppressMouseDownEvent() : SuppressCallback {\n\t\treturn this.configuration?.suppressMouseDownEvent;\n\t}\n\n\tgetSuppressKeyDownEvent() : SuppressCallback {\n\t\treturn this.configuration?.suppressKeyDownEvent;\n\t}\n\n\n\tgetRowReoderRenderer() : any {\n\t\treturn this.configuration?.rowReorderRenderer;\n\t}\n\n\tgetRowReorderRendererParams() : any {\n\t\treturn this.configuration?.rowReorderRendererParam;\n\t}\n\n\tgetRowDropZones() : any[] {\n\t\treturn this.configuration?.rowDropZones ?? [];\n\t}\n\n\n\n\tgetRowHeights(meta : IRowHeightParam) : number {\n\t\tconst rowHeights = this.configuration?.rowHeights;\n\t\tif(rowHeights) {\n\t\t\tif(typeof rowHeights === 'function') {\n\t\t\t\treturn rowHeights(meta);\n\t\t\t}\n\n\t\t\telse if(typeof rowHeights === 'string' || typeof rowHeights === 'number') {\n\t\t\t\treturn Number(rowHeights) ?? defaultRowHeight;\n\t\t\t}\n\t\t}\n\t\treturn defaultRowHeight;\n\t}\n\n\n\n\tsetRowData(rowData: Record<string, any>[] | ((param: IFetchParam) => void)) {\n        this.configuration.rowData = rowData;\n    }\n\n\n\n\tgetFullWidthCellRenderer() : any {\n\t\treturn this.configuration?.fullWidthCellRenderer;\n\t}\n\n\tgetFullWidthGroupCellRenderer() : any {\n\t\treturn this.configuration?.groupRowRenderer;\n\t}\n\n\tisGroupUseFullWidthRow(): boolean {\n        return true;\n    }\n\n    getViewConfig(isGrouped : boolean = false) : any {\n\t\treturn this.generateViewConfig(isGrouped);\n    }\n\n\tgetCardMinimumWidth(): number {\n\t\treturn this.configuration.minCardWidth ?? 150;\n\t}\n\n\tgetCardMinimumHeight(): number {\n\t\treturn this.configuration.minCardHeight ?? 300;\n\t}\n\n\tgetCardMaximumWidth(): number {\n\t\treturn this.configuration.maxCardWidth ?? 300;\n\t}\n\n\tgetCardMaximumHeight(): number {\n\t\treturn this.configuration.maxCardHeight ?? 300;\n\t}\n\n\tgetVerticalOffset(): number {\n\t\treturn this.configuration.verticalOffset ?? 5;\n\t}\n\n\tgetHorizontalOffset(): number {\n\t\treturn this.configuration.horizontalOffset ?? 5\n\t}\n\n\tgetGroupHeaderHeight(): number {\n\t\treturn this.configuration.groupHeaderHeight ?? 30;\n\t}\n\n    isColumnHeader() : boolean {\n        return false;\n    }\n\n    getIsExtraRow() : boolean {\n        return false;\n    }\n\n    isRelativeFloatingRecord() : boolean {\n        return true;\n    }\n\n    getRowHeader() {\n        return []\n    }\n\n    getDefaultColumnDefinitions() {\n        return {};\n    }\n\n    isFullRowHoverOnEdit() {\n        return false;\n    }\n\n    getRowModelType() : IRowModel {\n\t\treturn this.configuration?.rowModelType ?? 'local';\n\t}\n\n    getRowCount() : number {\n\t\treturn this.configuration?.rowCount  ?? this.getRowData().length;\n\t}\n\n    getFetchDelay(): number {\n\t\treturn this.configuration.fetchDelay ?? 0;\n\t}\n\n    getFullWidthLoadingRenderer() : any {\n\t\treturn this.configuration.fullWidthLoadingRenderer ?? 'dgFullWidthLoadingRenderer';\n\t}\n\n\tprivate generateViewConfig(isGrouped : Boolean) {\n        return {\n            minWidth     : isGrouped ? Infinity : this.getCardMinimumWidth(),\n            maxWidth     : isGrouped ? Infinity : this.getCardMaximumWidth(),\n            minHeight    : isGrouped ? this.getGroupHeaderHeight() : this.getCardMinimumHeight(),\n            maxHeight    : isGrouped ? this.getGroupHeaderHeight() :this.getCardMaximumHeight(),\n            verticalGap  : this.getVerticalOffset(),\n            horizontalGap: this.getHorizontalOffset()\n        }\n    }\n\n\thasStaticRowHeight() : boolean {\n\t\treturn true;\n\t}\n\n\tgetRootRowCount() : ()=>number {\n\t\treturn  ()=>this.getRowCount();\n\t}\n\n\tisWrapNavigationToNextRow() : boolean {\n\t\treturn this.configuration.wrapNavigationToNextRow ?? false;\n\t}\n\n\tisRowSuppressNavigation(params : {node : IRowNodeCore, column : IColumnNode}) : boolean {\n\t\tif(typeof this.configuration.suppressRowNavigation === 'function') {\n\t\t\tconst useFunction = this.configuration.suppressRowNavigation;\n\n\t\t\treturn useFunction(params);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tisRangeSelectionEnabled() : boolean {\n\t\treturn this.configuration.enableRangeSelection ?? false;\n\t\t// return false;\n\t}\n\n\tsuppressMultiRangeSelection() : boolean {\n\t\treturn true;\n\t}\n\n\tisRowTransform() : boolean {\n\t\treturn true;\n\t}\n\n\tsuppressGroupRowsSticky() : boolean {\n\t\treturn this.configuration.suppressGroupRowsSticky;\n\t}\n\n\tgetColumnHeaderHeight(_meta : any) : number {\n\t\treturn 0;\n\t}\n\n\tgetKeyBoardShortCuts() : IKeyBoardShortcutsParams[] {\n\t\treturn this.configuration.keyBoardShortcuts ?? [];\n\t}\n\n\tisEnterNavigatesVerticallyAfterEdit() : boolean {\n\t\treturn  false;\n\t}\n\n\tisEnterNavigatesVertically() : boolean {\n\t\treturn  false;\n\t}\n\n\tisCellEditingOnBackspace() : boolean {\n\t\treturn  false;\n\t}\n\n\tsuppressCsvExport() : boolean {\n\t\treturn this.configuration.suppressCsvExport ?? false;\n\t}\n\n\tclearSelectionOnMouseDown() : boolean {\n\t\treturn this.configuration.clearSelectionOnMouseDown ?? true\n\t}\n\n\tgetIncludeKeyboardShortcuts() : string[] {\n\t\treturn this.configuration.includeKeyboardShortcuts ?? [];\n\t}\n\n\tgetExcludeKeyboardShortcuts() : string[] {\n\t\treturn this.configuration.excludeKeyboardShortcuts ?? [];\n\t}\n\n\tgetRowSelection() : 'single' | 'multiple' | 'none' {\n\t\treturn this.configuration.rowSelection ?? 'none';\n\t}\n\n\tisAllowMultipleTypeSelection() : boolean {\n\t\treturn false;\n\t}\n\n\tgetFullWidthRendererParams() : any {\n\t\treturn this.configuration.fullWidthCellRendererParams\n\t}\n\n\tgetFullWidtLoadinghRendererParams() : any {\n\t\treturn this.configuration.fullWidthLoadingRendererParams\n\t}\n\n\tgetGroupingFullWidthRendererParams() : any {\n\t\treturn this.configuration.groupRowRendererParams;\n\t}\n\n\tisStopEditingWhenCellsLoseFocus() : boolean {\n\t\treturn  false\n\t}\n\n\tisClearSelectionOnCellRightClick() : boolean {\n\t\treturn false;\n\t} \n\n\tisCellFocusonSelection() : boolean {\n\t\treturn false;\n\t}\n\n\tetShouldPreventGridMousedown() : boolean {\n\t\treturn this.configuration.shouldPreventGridMousedown ?? true;\n\t}\n\n\tisCellFocusScrollOnColumnSelection() : boolean {\n\t\treturn false;\n\t}\n\n\tgetMinSpareRows() : number {\n\t\treturn 0;\n\t}\n\n\tgetMinSpareColumns() : number {\n\t\treturn  0;\n\t}\n\n\tgetInitialMinSpareRows() : number {\n\t\treturn 0;\n\t}\n\n\tgetInitialMinSpareColumns() : number {\n\t\treturn 0;\n\t}\n\t\n\tisAutoFillRows() : boolean {\n\t\treturn  false;\n\t}\n\n\tisRowDraggable() : boolean {\n\t\treturn this.configuration.rowDraggable ?? false;\n\t}\n\n\tgetActionRenderer() : (new() => IActionRenderer) {\n\t\treturn this.configuration.actionRenderer;\n\t}\n\n\tgetActionRendererParams() : Object | null {\n\t\treturn this.configuration.actionRendererParams ?? null;\n\t}\n\n\tgetNoRecordRenderer() : new () => IBaseComponent<any> {\n\t\treturn this.configuration.noRecordRenderer;\n\t}\n\n\tsuppressGroupHeaderCellFocus() : boolean {\n\t\treturn this.configuration.suppressGroupHeaderCellFocus ?? false\n\t}\n\n\tgetTreeLevelLeftMargins(level: number = 1): number {\n\t\tconst margins = this.configuration.treeLevelLeftMargins;\n\t\tif (!margins) return 0;\n\n\t\tlet total = 0;\n\t\tfor (let i = 0; i < level; i++) {\n\t\t\ttotal += margins[i] ?? 0;\n\t\t}\n\t\treturn total;\n\t}\n\n\tgetTreeLevelRightMargins(level: number = 1): number {\n\t\tconst margins = this.configuration.treeLevelRightMargins;\n\t\tif (!margins) return 0;\n\n\t\tlet total = 0;\n\t\tfor (let i = 0; i < level; i++) {\n\t\t\ttotal += margins[i] ?? 0;\n\t\t}\n\t\treturn total;\n\t}\n\n\tsuppressGroupToGroupRangeSelection() : boolean {\n\t\treturn  false;\n\t}\n\n\tisAutoUnpinnedColumns() : boolean {\n\t\treturn false;\n\t}\n\n\tgetViewType() : string {\n\t\treturn 'gallery';\n\t}\n\n\tgetViewportRowPageSize() : number {\n\t\treturn  100;\n\t}\n\n\tgetViewportColumnPageSize() : number {\n\t\treturn  50;\n\t}\n\n\tgetViewportRowBufferSize() : number {\n\t\treturn 20;\n\t}\n\n\tgetViewportColumnBufferSize() : number {\n\t\treturn  5;\n\t}\n\n\texcludeScrollbarForPinning() {\n\t\treturn true;\n\t}\n\n\thasFullTreeStructureProvided() : boolean {\n\t\treturn this.configuration.hasTreeFullStructureProvided ?? false;\n\t}\n\n\tgetTreeStructureData() : ITreeStructureData[] | null {\n\t\treturn this.configuration.treeStructureData ?? null;\n\t}\n\n\tgetTopDraftRowCount() : number {\n\t\treturn 0;\n\t}\n\n\tgetBottomDraftRowCount() : number {\n\t\treturn 0;\n\t}\n\n\tsuppressCellFocusOnSelection() : boolean {\n\t\treturn false;\n\t}\n}\n\nexport { GalleryOptioHandler };\n","import { AutoWired, Bean, BEAN_NAME, Context, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GANTT_BEAN_NAME } from \"../Constant/GanttBeanNameConstant\";\nimport { IGanttApi } from \"./IGanttApi\";\nimport { ViewsCommunicationHandler } from \"GanttModelClasses/Core/OptionsHandler/viewsCommunicationHandler\";\nimport { IRowDefinition } from \"../../Grid/Core/Interface/IRowDefinitions\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { IDateUtils } from \"../../Utils/IDateUtils\";\nimport { IDateTimeBreakdown, IGanttConfiguration, IRenderer } from \"../../GanttModelClasses/IGanttConfiguration\";\n\n\n@Bean(GANTT_BEAN_NAME.API)\nclass GanttApi extends EventEmitter implements IGanttApi {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    @AutoWired(GANTT_BEAN_NAME.VIEWS_COMMUNICATION_HANDLER) private viewsCommunicationHandler!: ViewsCommunicationHandler;\n    @AutoWired(GANTT_BEAN_NAME.DATE_UTILS) dateUtils :IDateUtils;\n    @AutoWired(GANTT_BEAN_NAME.CONFIGURATION) configuration :IGanttConfiguration;\n\n\n    destroyGantt() {\n        const controllerHandler = this.getBeanInstanceByBeanName(GANTT_BEAN_NAME.CONTROLLER_HANDLER);\n        const ganttController = controllerHandler.getController();\n\n        this.dispatchEvent({\n            type : 'preDestroyed'\n        })\n\n        ganttController && ganttController.destroyComponent();\n\n        this.optionsHandler.on('gridDestroy');\n        const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT) as Context;\n        context.destroy();\n    }\n\n    goToTask(taskId: string): void {\n        this.viewsCommunicationHandler.goToTask(taskId);\n    }\n\n    scrollTo(x : number, y : number) : void {\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        const infoPanelInstance = this.viewsCommunicationHandler.getInfoPanelInstance();\n        if(ganttPanelInstance){\n            ganttPanelInstance.navigationAPI.scrollTo(x, y);\n        }\n        if(infoPanelInstance){\n            infoPanelInstance.navigationAPI?.scrollTo(x, y);\n        }\n    }\n\n    updateRowDefinition(rowId: string, rowDefinition: IRowDefinition, force = false): void {\n        const ganttPanelRowRenderController = this.viewsCommunicationHandler.getGanttPanelBeanFromBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        const infoPanelRowRenderController  = this.viewsCommunicationHandler.getInfoPanelBeanFromBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        const infoPanelInstance  = this.viewsCommunicationHandler.getInfoPanelInstance();\n\n        const cssClasses         = this.optionsHandler.getGridLines() == 'vertical' ? 'dg-hide-row-border' : '';\n        if(rowDefinition.cssClasses != undefined){\n            rowDefinition.cssClasses += ` ${cssClasses}`;\n        }\n        if(ganttPanelInstance){\n            const rowNode = ganttPanelInstance.rowAPI.getRowNodeById(rowId);\n            if(rowNode){\n                rowNode.updateDefinition(rowDefinition, force);\n            }\n            ganttPanelRowRenderController.refreshRow([rowId]);\n        }\n        if(infoPanelInstance){\n            const rowNode = infoPanelInstance.rowAPI.getRowNodeById(rowId);\n            if(rowNode){\n                rowNode.updateDefinition(rowDefinition, force);\n            }\n            infoPanelRowRenderController.refreshRow([rowId]);\n        }\n\n        //temp solution to refresh the row\n        ganttPanelRowRenderController.refreshAfterModelUpdate();\n        infoPanelRowRenderController.refreshAfterModelUpdate();\n    }\n\n    convertToTimezoneObject(date: string | Date | number, timezone?: string | null):IDateTimeBreakdown { \n        return this.dateUtils.convertToTimezoneObject(date, timezone);\n\n    } \n\n\n    getTaskbarRenderer(taskId: string): IRenderer  | null{\n\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n\n        if(ganttPanelInstance){\n            const rowIndexParams = ganttPanelInstance.rowAPI.getIndexById(taskId);\n\n            if(!rowIndexParams) {\n                return null;\n            }\n\n             const rowController = ganttPanelInstance.api.getRowControllerInstance(rowIndexParams.rowIndex);\n             if(!rowController){\n                return null;\n             }\n             const fullWidthCellRenderer = rowController.getFullWidthCellRenderer();\n             if(fullWidthCellRenderer){\n                return fullWidthCellRenderer.getRenderer();\n             }\n        }\n\n        return null\n\n\n    }\n\n    getColumnHeaderRenderer(columnId: string): IRenderer  | null{\n        const infoPanelInstance = this.viewsCommunicationHandler.getInfoPanelInstance();\n        if(infoPanelInstance){\n            return infoPanelInstance.api.getColumnHeaderCellRendererInstance(columnId);\n        }\n        return null;\n    }\n\n    isDependencyLineMarked(sourceTaskId: string, targetTaskId: string): boolean{\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        if(ganttPanelInstance){\n            const sourceTaskRowNode = ganttPanelInstance.rowAPI.getRowNodeById(sourceTaskId);\n            if(!sourceTaskRowNode){\n                return false;\n            }\n            if(!sourceTaskRowNode.isTaskRendered()){\n                return false;\n            }\n           const dependencies = sourceTaskRowNode.getDependencies();\n           if(dependencies){\n            const hasDependency = dependencies.some(dependency => dependency.taskID == targetTaskId);\n            if(hasDependency){\n                const targetTaskRowNode = ganttPanelInstance.rowAPI.getRowNodeById(targetTaskId);\n                if(!targetTaskRowNode){\n                    return false;\n                }\n                if(!targetTaskRowNode.isTaskRendered()){\n                    return false;\n                }\n                return true;\n            }\n           }\n            \n        }\n        return false;\n    }\n\n    toggleFillAllDayMode(force:boolean): void{\n        const oldEnableAllDayFillMode = this.configuration.enableAllDayFillMode;\n        if(oldEnableAllDayFillMode == force){\n            return;\n        }\n        this.configuration.enableAllDayFillMode = force;\n        \n        const ganttPanelRowRenderController = this.viewsCommunicationHandler.getGanttPanelBeanFromBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        const infoPanelRowRenderController  = this.viewsCommunicationHandler.getInfoPanelBeanFromBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        ganttPanelRowRenderController.refreshAfterModelUpdate();\n        infoPanelRowRenderController.refreshAfterModelUpdate();\n    }\n\n    getTotalTaskCount() : number {\n        const infoPanelInstance  = this.viewsCommunicationHandler.getInfoPanelInstance();\n        return infoPanelInstance.rowAPI.getRowCount();\n    }\n\n}\n\n\nexport{\n    GanttApi\n}","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IGanttPaginationApi } from \"./IGanttPaginationApi\";\nimport { GANTT_BEAN_NAME } from \"../Constant/GanttBeanNameConstant\";\nimport { IGanttPaginationController, IPaginationChangeParams } from \"../Core/Pagination/IPaginationController\";\nimport { IGanttConfiguration, ITimelineSettings, IUnit, timestamp } from \"../IGanttConfiguration\";\n\n\n\n\n@Bean(GANTT_BEAN_NAME.PAGINATION_API)\nexport class GanttPaginationApi extends EventEmitter implements IGanttPaginationApi {\n\n    @AutoWired(GANTT_BEAN_NAME.PAGINATION_CONTROLLER) paginationController : IGanttPaginationController\n    @AutoWired(GANTT_BEAN_NAME.CONFIGURATION) configuration : IGanttConfiguration\n\n    \n    @PostConstruct()\n    init() {\n\n    }\n\n    nextPage(params?: IPaginationChangeParams) : void{\n        this.paginationController.nextPage(params)\n    }\n\n    previousPage(params?: IPaginationChangeParams) : void{\n        this.paginationController.previousPage(params)\n\n    }\n\n    viewChange(timelineSettings?: Partial<ITimelineSettings>, initialDate?: Date | string | number, ): void {\n        // Ensure timelineSettings exists\n        if (!this.configuration.timelineSettings) {\n            this.configuration.timelineSettings = {} as ITimelineSettings;\n        }\n        \n        // Update full timelineSettings if provided\n        if (timelineSettings !== undefined) {\n            this.configuration.timelineSettings = {\n                \n                ...this.configuration.timelineSettings,\n                ...timelineSettings\n            };\n        }\n\n        if (initialDate !== undefined) {\n            this.configuration.initialDate = initialDate;\n        }\n\n        this.paginationController.updateBuffer(timelineSettings?.buffer);\n        this.paginationController.changeView(timelineSettings?.timelineViewMode, initialDate);\n    }\n\n    goToDate(date: Date | string | number, bufferPixels ?: number, centerInViewport ?: boolean): void {\n        this.paginationController.goToDate(date, bufferPixels, centerInViewport);\n    }\n\n    isInCurrentProjectRange(date: Date | string | number) : boolean {\n        return this.paginationController.isInCurrentProjectRange(date);\n    }\n\n    getCurrentViewPortDate():timestamp{\n        return this.paginationController.getCurrentViewPortDate();\n    }\n\n    getCurrentTimelineView():IUnit{\n        return this.paginationController.getCurrentTimelineView();\n    }\n\n    scrollToNext():void{\n        this.paginationController.scrollToNext();\n    }\n\n    scrollToPrevious():void{\n        this.paginationController.scrollToPrevious();\n    }\n\n\n}","import { IGanttHookMeta, IRowDefinition, ITaskData } from \"../IGanttConfiguration\";\nimport { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IGanttTaskApi, IInsertTask } from \"./IGanttTaskApi\";\nimport { GANTT_BEAN_NAME } from \"../Constant/GanttBeanNameConstant\";\nimport { ViewsCommunicationHandler } from \"../Core/OptionsHandler/viewsCommunicationHandler\";\nimport { IIdRowDataChangeMeta, MovePosition } from \"../../Grid/Main\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { ITaskBarInteractionState } from \"../Core/TaskBarComponent/TaskBarInteractionState\";\n\n\nconst apiHookMeta : IGanttHookMeta = {\n    eventOrigin : 'api',\n    event       : null\n}\n\n@Bean(GANTT_BEAN_NAME.TASK_API)\nexport class GanttTaskApi extends EventEmitter implements IGanttTaskApi {\n    private interactor: GanttTaskInteractor;\n    \n    @PostConstruct()\n    init() {\n        this.interactor = this.createManagedBean(new GanttTaskInteractor());\n    }\n    \n    getTaskDataById(id: string): ITaskData | null {\n        return this.interactor.getTaskDataById(id);\n    }\n    setTaskDataById(id: string, data: ITaskData, hookMeta : IGanttHookMeta = apiHookMeta): void {\n        this.setTasksData([{rowId : id, data}], hookMeta);\n    }\n    updateTaskDataById(id: string, data: ITaskData, hookMeta : IGanttHookMeta = apiHookMeta): void {\n        this.updateTasksData([{rowId : id, data}], hookMeta);\n    }\n    removeTaskById(id: string, hookMeta : IGanttHookMeta = apiHookMeta): void {\n        this.interactor.removeTaskById(id, hookMeta);\n    }\n    insertTaskById(id : string, insertPosition ?: MovePosition, taskData ?: ITaskData, rowDefinition ?: IRowDefinition, hookMeta : IGanttHookMeta = apiHookMeta) : void {\n        this.interactor.insertTaskById(id, insertPosition, taskData, rowDefinition, hookMeta);\n    }\n    setTasksData(dataObject : IIdRowDataChangeMeta[], hookMeta : IGanttHookMeta = apiHookMeta): void {\n        this.interactor.setTasksDataById(dataObject, hookMeta);\n    }\n    updateTasksData(dataObject : IIdRowDataChangeMeta[], hookMeta : IGanttHookMeta = apiHookMeta): void {\n        this.interactor.updateTasksDataById(dataObject, hookMeta);\n    }\n\n    insertTasksById(taskMeta : IInsertTask[], insertPosition?: MovePosition,  hookMeta : IGanttHookMeta = apiHookMeta) : void {\n        this.interactor.insertTaskskById(taskMeta, insertPosition, hookMeta);\n    }\n\n    removeTasksById(taskIds : string[], hookMeta : IGanttHookMeta = apiHookMeta) : void {\n        this.interactor.removeTasksById(taskIds,hookMeta);\n    }\n}\n\nclass GanttTaskInteractor extends EventEmitter {\n    @AutoWired(GANTT_BEAN_NAME.VIEWS_COMMUNICATION_HANDLER) private viewsCommunicationHandler!: ViewsCommunicationHandler;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\n    getTaskDataById(id: string): ITaskData | null {\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        return ganttPanelInstance.rowAPI.getDataById(id);\n    }\n\n    setTasksDataById(dataObject : IIdRowDataChangeMeta[], hookMeta : IGanttHookMeta = apiHookMeta): void {\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        const infoPanelInstance  = this.viewsCommunicationHandler.getInfoPanelInstance();\n\n        const ganttPanelRowRenderController = this.viewsCommunicationHandler.getGanttPanelBeanFromBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        const infoPanelRowRenderController  = this.viewsCommunicationHandler.getInfoPanelBeanFromBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n\n        this.normalizeMilestoneData(dataObject, ganttPanelInstance, false);\n\n        infoPanelInstance.rowAPI.setRowsDataById(dataObject, {}, hookMeta);\n        ganttPanelInstance.rowAPI.setRowsDataById(dataObject, {}, hookMeta);\n\n        //temp solution to refresh the row\n        ganttPanelRowRenderController.refreshAfterModelUpdate();\n        infoPanelRowRenderController.refreshAfterModelUpdate();\n    }\n \n\n    updateTasksDataById(dataObject : IIdRowDataChangeMeta[], hookMeta : IGanttHookMeta = apiHookMeta): void {\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        const infoPanelInstance  = this.viewsCommunicationHandler.getInfoPanelInstance();\n        const ganttPanelRowRenderController = this.viewsCommunicationHandler.getGanttPanelBeanFromBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        const infoPanelRowRenderController  = this.viewsCommunicationHandler.getInfoPanelBeanFromBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n\n        this.normalizeMilestoneData(dataObject, ganttPanelInstance, true);\n\n        infoPanelInstance.rowAPI.updateRowsDataById(dataObject, {}, hookMeta);\n        ganttPanelInstance.rowAPI.updateRowsDataById(dataObject, {}, hookMeta);\n\n\n        //temp solution to refresh the row\n            const gridContext = this.viewsCommunicationHandler.getGanttPanelContext();\n            const interactionState = gridContext.getBean(GANTT_BEAN_NAME.TASK_BAR_INTERACTION_STATE) as ITaskBarInteractionState;\n        \n        ganttPanelRowRenderController.refreshAfterModelUpdate({recycleRows : interactionState.isDragActive(),refreshCells : interactionState.isDragActive()});\n        infoPanelRowRenderController.refreshAfterModelUpdate();\n    }\n \n\n    removeTaskById(id: string, hookMeta : IGanttHookMeta = apiHookMeta): void {  \n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        const infoPanelInstance  = this.viewsCommunicationHandler.getInfoPanelInstance();\n        infoPanelInstance.rowAPI.removeRowById(id);\n        ganttPanelInstance.rowAPI.removeRowById(id, {}, hookMeta);\n    }\n    insertTaskById(id : string, insertPosition ?: MovePosition, taskData ?: ITaskData, rowDefinition ?: IRowDefinition, hookMeta : IGanttHookMeta = apiHookMeta) : void {\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        const infoPanelInstance  = this.viewsCommunicationHandler.getInfoPanelInstance();\n        infoPanelInstance.rowAPI.insertRowById(id, insertPosition, taskData, rowDefinition);\n        ganttPanelInstance.rowAPI.insertRowById(id, insertPosition, taskData, rowDefinition, {}, hookMeta);\n    }\n\n     insertTaskskById(taskMeta : IInsertTask[], insertPosition: MovePosition,  hookMeta : IGanttHookMeta = apiHookMeta) : void {\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        const infoPanelInstance  = this.viewsCommunicationHandler.getInfoPanelInstance();\n        infoPanelInstance.rowAPI.insertRowsById(taskMeta, insertPosition);\n        ganttPanelInstance.rowAPI.insertRowsById(taskMeta, insertPosition, {}, hookMeta);\n    }\n\n    removeTasksById(taskIds : string[], hookMeta : IGanttHookMeta = apiHookMeta) : void {\n        const ganttPanelInstance = this.viewsCommunicationHandler.getGanttPanelInstance();\n        const infoPanelInstance  = this.viewsCommunicationHandler.getInfoPanelInstance();\n        infoPanelInstance.rowAPI.removeRowsById(taskIds);\n        ganttPanelInstance.rowAPI.removeRowsById(taskIds, {}, hookMeta);\n    }\n\n    /**\n     * In default milestone mode, startDate and endDate must be identical (duration = 0).\n     * Which date takes priority is controlled by isEndDatePrioritizedForMilestone.\n     * In flexible milestone mode, dates are left untouched so the original duration is preserved.\n     *\n     * @param mergeWithExisting - true for partial-update flows so that missing dates are\n     *   resolved from the existing row data; false for full-replace flows.\n     */\n    private normalizeMilestoneData(\n        dataObject: IIdRowDataChangeMeta[],\n        ganttPanelInstance: any,\n        mergeWithExisting: boolean\n    ): void {\n        const optionsHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as any;\n        if (optionsHandler?.isFlexibleMilestone()) return;\n\n        const isEndDatePrioritized: boolean = optionsHandler?.isEndDatePrioritizedForMilestone() ?? false;\n\n        dataObject.forEach(({ rowId, data }) => {\n            if (!data || data.milestone !== true) return;\n\n            let startDate = data.startDate;\n            let endDate   = data.endDate;\n\n            if (mergeWithExisting && rowId) {\n                const existingData = ganttPanelInstance?.rowAPI?.getDataById(rowId);\n                if (startDate == null) startDate = existingData?.startDate;\n                if (endDate == null)   endDate   = existingData?.endDate;\n            }\n\n            if (isEndDatePrioritized) {\n                const prioritizedDate = endDate ?? startDate;\n                if (prioritizedDate != null) {\n                    data.startDate = prioritizedDate;\n                    data.endDate   = prioritizedDate;\n                }\n            } else {\n                const prioritizedDate = startDate ?? endDate;\n                if (prioritizedDate != null) {\n                    data.startDate = prioritizedDate;\n                    data.endDate   = prioritizedDate;\n                }\n            }\n        });\n    }\n}\n"," \nexport const GANTT_BEAN_NAME = {\n    API           : 'gantt_api',\n    TASK_API      : 'task_api',\n    PAGINATION_API: 'pagination_api',\n    CONFIGURATION                : 'configuration',\n    CONTROLLER_HANDLER           : 'controller',\n    VIEWS_COMMUNICATION_HANDLER  : 'viewsCommunicationHandler',\n    DATE_UTILS                   : 'date_utils',\n    PAGINATION_CONTROLLER        : 'pagination_controller',\n    TIMELINE_DATA_PROVIDER       : 'timeLineDataProvider',\n    GANTT_DATE_COMPUTATION_ENGINE: 'gantt_date_computation_engine',\n    TASK_BAR_INTERACTION_STATE   : 'task_bar_interaction_state',\n    CORE_STATE_HANDLER          : 'coreStateHandler'\n}","import { clearElement, Component, PostConstruct, removeFromParent } from \"@dg/corecomponent\";\nimport { IActionComponent, IActionComponentWrapper } from \"./IActionComponent\";\nimport { ActionController } from \"./ActionController\";\nimport { UserComponentDetails } from \"../UserComponentHandler/UserComponentHandler\";\n\nexport class ActionComponent extends Component implements IActionComponent {\n    private renderer : any;\n    private rendererElement : HTMLElement;\n    @PostConstruct()\n    init() : void {\n        const component : IActionComponentWrapper = {\n            getElement : () => this.getGui(),\n            setRenderDetails : (component : UserComponentDetails) => this.setRenderDetails(component),\n        }\n        this.setTemplate(document.createElement('div'));\n        const controller = this.createManagedBean(new ActionController());\n        controller.setComponent(component);\n    }\n\n    private setRenderDetails(componentDetails : UserComponentDetails) : void {\n        this.destroyRenderer();\n        if(componentDetails) {\n            const callBack = this.afterRenderer.bind(this);\n            const componentInstance = componentDetails?.newInstance();\n            if (componentInstance) {\n                componentInstance.then(callBack);\n            }\n        }\n    }\n\n    private afterRenderer( renderer: any) {\n\t\tif (!this.isAlive()) {\n\t\t\treturn;\n\t\t}\n\n        this.renderer = renderer;\n        this.rendererElement = renderer.getElement?.() ?? null;\n        if (this.rendererElement) {\n            const parentElement = this.getGui();\n            clearElement(parentElement);\n            parentElement.appendChild(this.rendererElement);\t\t\t\t\n        }\n\t}\n\n    private destroyRenderer(): void {\n        this.renderer = this.context.destroyBean(this.renderer);\n        removeFromParent(this.rendererElement);\n        this.rendererElement = null;\n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { IActionComponentWrapper, IActionController } from \"./IActionComponent\";\nimport type { GanttUserComponentHandler } from \"../UserComponentHandler/UserComponentHandler\";\n\nexport class ActionController extends EventEmitter implements IActionController {\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) private userComponentHandler : GanttUserComponentHandler;\n    private component : IActionComponentWrapper;\n    setComponent(component: IActionComponentWrapper): void {\n        this.component = component;\n        this.addClassName();\n        this.setRendererDetails();\n\n        this.addListener(this.eventHandler, 'preDestroyed', () => {\n            this.component.setRenderDetails(undefined);\n        })\n    }\n\n    private addClassName() : void {\n        const element = this.component.getElement();\n        if(element) {\n            element.classList.add('dg-gantt-action_bar')\n        }\n    }\n\n    private setRendererDetails() : void {\n        const componentDetails = this.userComponentHandler.getActionRendererDetails(this.getRendererDetails(), {});\n        this.component.setRenderDetails(componentDetails);\n    }\n\n    private getRendererDetails() {\n        return {\n            renderer : this.optionsHandler.getActionRenderer(),\n            rendererParams : this.optionsHandler. getActionRendererParams()\n        }\n    }\n\n    \n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { GANTT_BEAN_NAME } from \"../../Constant/GanttBeanNameConstant\";\nimport { IControllerHandler } from \"./IGanttControllerHandler\";\nimport { GanttTimelineHolderController } from \"Grid/GridComponent/Gantt/GanttTimelineHolder/GanttTimelineHolderController\";\n\n\n\n\n\n\n@Bean(GANTT_BEAN_NAME.CONTROLLER_HANDLER)\nclass ControllerHandler extends EventEmitter implements IControllerHandler{\n    private controller :any\n    private ganttTimelineHolderController : GanttTimelineHolderController;\n    private ready : boolean = false;\n    private readyCallbacks: ((param: any) => void)[] = [];\n\n    setGanttTimelineHolderController(controller: GanttTimelineHolderController): void {\n        this.ganttTimelineHolderController = controller;\n    }\n\n    getGanttTimelineHolderController(): GanttTimelineHolderController {\n        return this.ganttTimelineHolderController;\n    }\n\n    registerController(controller:any): void {\n        this.controller = controller;\n        this.checkPaneIsReady();\n    }\n\n    getController(): any {\n        return this.controller;\n    }\n\n    onAfterReady(callback: (param:any) => void): void {\n        if (this.ready) {\n            callback(this.createPaneController());\n\n        } else {\n            this.readyCallbacks.push(callback);\n        }\n    }\n\n    private checkPaneIsReady(): void {\n       this.ready = this.controller != null;\n\n        if (this.ready) {\n            const param = this.createPaneController();\n            this.readyCallbacks.forEach(callback => callback(param));\n            this.readyCallbacks.length = 0;\n        }\n    }\n\n    private createPaneController(){\n        return {\n            controller: this.controller\n        };\n    }\n    \n\n\n}\n\nexport {\n    ControllerHandler\n}","import { Component, PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { GanttController } from \"./GanttController\";\n\n\nexport class GanttComponent extends Component {\n    static  template     : HTMLElement;\n    static  getTemplate  : () => HTMLElement;\n    private controller   : GanttController;\n    private container    : HTMLElement;\n\n    @queryAssignedNodes('ganttInfoPanel') private viewGui   : HTMLElement;\n    @queryAssignedNodes('ganttViewPanel') private ganttGui  : HTMLElement;\n    // @queryAssignedNodes('ganttScroller') private scroller   : HTMLElement;\n\n    constructor(container: HTMLElement) {\n        super();\n        this.container = container;\n\n        // this.viewGui = this.getGui().querySelector('.dg-gantt-view-left') as HTMLElement;\n        // this.ganttGui = this.getGui().querySelector('.dg-gantt-view-right') as HTMLElement;\n    }\n\n\n    @PostConstruct()\n    init() {\n        const template = GanttComponent.getTemplate();\n        this.setTemplate(template);\n        this.controller = this.createManagedBean(new GanttController());\n\n        \n\n        this.controller.setComponent(this);\n        this.appendGridIntoUserDom();\n    }\n\n\n    // init() {        \n    //     const getViewContext = () => this.viewContext;\n    //     const getGanttContext = () => this.ganttContext;\n\n    //     this.controller = new GanttController();\n    //     this.controller.setComponent(this , getViewContext, getGanttContext);\n    // }\n\n    getViewGui() : HTMLElement {\n        return this.viewGui;\n    }\n\n    getGanttGui() : HTMLElement {\n        return this.ganttGui;\n    }\n\n    // getScroller() : HTMLElement {\n    //     return this.scroller;\n    // }\n\n    appendGridIntoUserDom() {\n        const eGui = this.getGui();\n        this.container && this.container.appendChild(eGui);\n        this.addDestroyFunc(() => {\n            this.container && this.container.removeChild(this.getGui());\n            this.container = null;\n        })\n    }\n\n    destroy() {\n        super.destroy();\n    }\n}","import { IFetchParam } from \"../../../Grid/Core/Interface/IRowDefinitions\";\n\nimport { IFullWidthType, IGanttConfiguration, IRowDefinition, IRowDefinitionFetchParams, ITaskData } from \"../../../GanttModelClasses/IGanttConfiguration\";\nimport { IGridConfiguration } from \"../../../Grid/Main\";\nimport { VIEW_TYPE } from \"../../../GanttModelClasses/GanttCoreComponent\";\nimport { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { GanttOptionsHandler } from \"../OptionsHandler/GanttOptionsHandler\";\nimport { TaskBarHolderComponent } from \"../TaskBarComponent/TaskBarHolderComponent/TaskBarHolderComponent\";\nimport { DateUtils } from \"../../../Utils/DateUtils\";\nimport { IDateUtils } from \"../../../Utils/IDateUtils\";\nimport { TimelineHeaderComponent } from \"../TimelineHeaderComponent/TimelineHeaderComponent/TimelineHeaderComponent\";\nimport { GANTT_BEAN_NAME } from \"../../Constant/GanttBeanNameConstant\";\nimport { IGanttPaginationController } from \"../Pagination/IPaginationController\";\nimport { ITimelineData, ITimelineDataProvider } from \"../TimelineHeaderComponent/TimelineDataProvider/ITimelineDataProvider\";\nimport { IListConfiguration } from \"ListModelClasses/list-configuration.types\";\n\nclass defaultNoRecordRenderer {\n    init(){\n\n    }\n\n    getElement(){\n        \n    }\n\n    destroy(){\n\n    }\n}\n\nconst defaultMileStoneWidth = 40;\n\n\n\nexport class GanttConfigParser extends EventEmitter{\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionHandler : GanttOptionsHandler;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    @AutoWired(GANTT_BEAN_NAME.PAGINATION_CONTROLLER) private paginationController : IGanttPaginationController;\n    @AutoWired(GANTT_BEAN_NAME.TIMELINE_DATA_PROVIDER) private timelineDataProvider : ITimelineDataProvider;\n\n    static responseCacheClearDelay = 500;\n    \n    private responseDataCache  : Record<string, {data: ITaskData[]}> = {};\n    private rowDefinitionCache : Record<string, IRowDefinition> = {};\n    private configuration      : IGanttConfiguration;\n    private dateUtils          : IDateUtils;\n    private timeLineWidth      : number ;\n\n\n    @PostConstruct()\n    init() {\n        this.configuration = this.optionHandler.getConfiguration() as IGanttConfiguration;\n        this.dateUtils = new DateUtils(); // need to change;\n        const timezone = this.optionHandler.getTimezone();\n        if (timezone) {\n            this.dateUtils.setTimezone(timezone);\n        }\n        this.timeLineWidth = this.optionHandler.getTimeLineWidth();\n    }\n\n    private getGantColumnDefinition(){\n        const columnDefinition = [];\n\n\t\t\tconst timeLineViewType = this.configuration.timelineSettings.timelineViewMode;\n            let timelineDatas : ITimelineData[];\n\n\n\t\t\tif(timeLineViewType === VIEW_TYPE.WEEK){\n                timelineDatas = this.timelineDataProvider.getWeekViewData()\n\t\t\t\t// this.timeLineWidth = 70 \n\n\t\t\t}else if(timeLineViewType === VIEW_TYPE.MONTH){\n                 timelineDatas = this.timelineDataProvider.getMonthViewData();\n\t\t\t\t// this.timeLineWidth = 40\n\t\t\t}\n\t\t\telse if(timeLineViewType === VIEW_TYPE.YEAR){\n                timelineDatas = this.timelineDataProvider.getYearViewData()\n\t\t\t\t// this.timeLineWidth = 60\n\t\t\t}\n            else if(timeLineViewType === VIEW_TYPE.DAY){\n                timelineDatas = this.timelineDataProvider.getDayViewData()\n\t\t\t\t// this.timeLineWidth = 40\n\t\t\t}\n            \n            else if(timeLineViewType === VIEW_TYPE.QUARTER){\n                timelineDatas = this.timelineDataProvider.getQuaterViewData()\n\t\t\t\t// this.timeLineWidth = 80\n\n            }\n\n            const getBeanInstanceByBeanName = this.getBeanInstanceByBeanName.bind(this);\n            const destroyBean = (...args: any[])=>{\n                const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n                return context.destroyBean(...args);\n            }\n\n\t\t\tfor (let index = 0; index < timelineDatas.length; index++) {\n\n                const timelineData = timelineDatas[index];\n\t\t\t\tconst definition = {\n                    columnId : this.dateUtils.formatDate(timelineData.date,'MM/dd/yyyy'),\n\t\t\t\t\theaderCellRenderer : TimelineHeaderComponent,\n\n                    headerCellRendererParams : {\n\t\t\t\t\t\ttimeLineViewType,\n                        bottomTierCount          : timelineData.bottomTierCount,\n                        date                     : timelineData.date,\n                        dateUtilInstance         : this.dateUtils,\n                        bottomTierData           : timelineData.bottomTierData,\n                        topTierData              : timelineData.topTierData,\n                        getBeanInstanceByBeanName: getBeanInstanceByBeanName,\n                        destroyBean              : destroyBean,\n\n\t\t\t\t\t},\n\t\t\t\t\twidth : this.timeLineWidth * timelineData.bottomTierCount\n\t\t\t\t} \n\t\t\t\t\tcolumnDefinition.push(definition);\n\n\t\t\t}\n\n            return columnDefinition\n\n    }\n\n    parseGanttConfiguration() :{ infoPanelConfiguration: IGridConfiguration | IListConfiguration, ganttViewPanelConfiguration: IGridConfiguration } {\n        const infoPanelConfiguration = this.buildInfoPanelConfiguration();\n        const ganttViewPanelConfiguration = this.buildGanttViewPanelConfiguration();\n        return { infoPanelConfiguration, ganttViewPanelConfiguration };\n    }\n\n    private buildGanttViewPanelConfiguration(): IGridConfiguration {\n        const configuration = this.configuration;\n        const rowData  = configuration.taskData;\n        const ganttRowData = Array.isArray(rowData) ? rowData : (param: IFetchParam) => this.getRowData(param);\n        const ganttInternalViewRowDefinition = (param: IRowDefinitionFetchParams) => this.getRowDefinition(param);\n        const cssClasses = configuration.gridLines == 'vertical' ? 'dg-hide-row-border' : '';\n        const ganttRowDefinition = (params)=>({...ganttInternalViewRowDefinition(params), ...{fullWidth : 'embeded' as IFullWidthType, cssClasses}});\n        const {\n                rowHeights,\n                model,\n            } = configuration;\n\n        const currentStartDateRange = this.paginationController.getCurrentProjectDateRange();\n        const timelineViewMode = configuration.timelineSettings.timelineViewMode\n\n        const getBeanInstanceByBeanName = this.getBeanInstanceByBeanName.bind(this);\n        const destroyBean = (...args: any[])=>{\n            const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n            return context.destroyBean(...args);\n        }\n\n        const milestoneWidth = configuration.milestoneWidth ?? defaultMileStoneWidth;\n        const ganttViewPanelConfiguration : IGridConfiguration = {\n            rowModelType  : model,\n            rowData       : ganttRowData,\n            shouldPreventGridMousedown : false,\n            rowDefinitions: ganttRowDefinition,\n            rowHeights,\n            viewType        : 'gantt',\n            timelineSettings: configuration.timelineSettings,\n            projectStartDate: currentStartDateRange.from,\n            projectEndDate  : currentStartDateRange.to,\n            timeLineViewType: timelineViewMode,\n            columnDefinitions : this.getGantColumnDefinition(),\n            fullWidthCellRenderer : TaskBarHolderComponent as any,\n            fullWidthCellRendererParams : {\n                projestStartDate         : currentStartDateRange.from,\n                viewType                 : configuration.timelineSettings.timelineViewMode,\n                timezone                 : configuration.timelineSettings.timezone,\n                columnWidth              : this.timeLineWidth,\n                dateUtilsInstance        : this.dateUtils,\n                renderer                 : configuration.taskBarRenderer,\n                rendererParams           : configuration.taskBarRendererParams,\n                getBeanInstanceByBeanName: getBeanInstanceByBeanName,\n                destroyBean              : destroyBean,\n                milestoneWidth            : milestoneWidth,\n                allowStartDateResize       : configuration.allowStartDateResize ?? true,\n                allowEndDateResize       : configuration.allowEndDateResize ?? true,\n                allowTaskDragAndDrop     : configuration.allowTaskDragAndDrop ?? true,\n                allowDependencyMarking   : configuration.allowDependencyMarking ?? true,\n                allowDragToScheduleTask   : configuration.allowDragToScheduleTask ?? true,\n                readonly                 : configuration.readonly,\n            },\n            groupRowRenderer : configuration.groupRowRenderer ?? TaskBarHolderComponent as any,\n            groupDisplayType : configuration.groupDisplayType,\n            groupRowRendererParams : {\n                projestStartDate         :  currentStartDateRange.from,\n                viewType                 : configuration.timelineSettings.timelineViewMode,\n                columnWidth              : this.timeLineWidth,\n                timezone                 : configuration.timelineSettings.timezone,\n                dateUtilsInstance        : this.dateUtils,\n                renderer                 : configuration.taskBarRenderer,\n                rendererParams           : configuration.taskBarRendererParams,\n                getBeanInstanceByBeanName: getBeanInstanceByBeanName,\n                destroyBean              : destroyBean,\n                milestoneWidth            : milestoneWidth,\n                allowStartDateResize       : configuration.allowStartDateResize,\n                allowEndDateResize       : configuration.allowEndDateResize,\n                allowTaskDragAndDrop     : configuration.allowTaskDragAndDrop,\n                allowDependencyMarking   : configuration.allowDependencyMarking,\n                allowDragToScheduleTask   : configuration.allowDragToScheduleTask,\n                readonly                 : configuration.readonly,\n            },\n            hasTreeFullStructureProvided : configuration.hasTreeFullStructureProvided,\n            columnHeaderHeights          : configuration.columnHeaderHeights,\n            rowHighlighter               : configuration.rowHighlighter,\n            actionRenderer               : configuration.actionRenderer,\n            actionRendererParams         : configuration.actionRendererParams,\n            noRecordRenderer             : (configuration.noRecordRenderer ?? defaultNoRecordRenderer) as IGridConfiguration['noRecordRenderer'],\n            rowTransform                 : false,\n            suppressCellFocusOnSelection : true,\n            endBufferHeight : configuration.endBufferHeight\n\n        }\n\n        return ganttViewPanelConfiguration;\n    }\n\n    private buildInfoPanelConfiguration(): IGridConfiguration | IListConfiguration {\n        const configuration = this.configuration;\n        const rowData  = configuration.taskData;\n        const ganttRowData = Array.isArray(rowData) ? rowData : (param: IFetchParam) => this.getRowData(param);\n        const cssClasses = configuration.gridLines == 'vertical' ? 'dg-hide-row-border' : '';\n        const ganttInternalViewRowDefinition = (param: IRowDefinitionFetchParams) => ({...this.getRowDefinition(param), ...{cssClasses}});\n        const {\n                rowHeights,\n                model,\n                viewType,\n                viewConfiguration,\n            } = configuration;\n\n        const currentStartDate = this.paginationController.getCurrentProjectStartDate();\n\n        const infoPanelConfiguration = {\n            viewType      : viewType as \"grid\" | \"list\",\n            ...viewConfiguration,\n            rowModelType  : model,\n            rowData       : ganttRowData as IGridConfiguration['rowData'],\n            rowDefinitions: ganttInternalViewRowDefinition,\n            rowHeights,\n            projectStartDate             : currentStartDate,\n            columnHeaderHeights          : configuration.columnHeaderHeights,\n            hasTreeFullStructureProvided : configuration.hasTreeFullStructureProvided,\n            rowHighlighter               : configuration.rowHighlighter,\n            suppressCellFocusOnSelection : true,\n            endBufferHeight : configuration.endBufferHeight,\n\n        } as IGridConfiguration | IListConfiguration;\n        return infoPanelConfiguration;\n    }\n\n    private getRowData(param: IFetchParam) : void {\n        const { onSuccess }  = param;\n        const ganttOnSuccess = (res : {data: ITaskData[]}) => {\n            const parentKeys = param.parentKeys ?? [];\n            const key = `${param.startRowIndex}-${param.endRowIndex}-${parentKeys.join('-')}`;\n            if(this.responseDataCache[key]){\n                onSuccess(this.responseDataCache[key]);\n                return;\n            }\n\n            this.responseDataCache[key] = res;\n            setTimeout(() => {\n                delete this.responseDataCache[key];\n            }, GanttConfigParser.responseCacheClearDelay);\n            onSuccess(res);\n        }\n        if (typeof this.configuration.taskData === 'function') {\n            this.configuration.taskData({...param, ...{onSuccess: ganttOnSuccess}});\n        }\n    }\n\n    private getRowDefinition(param: IRowDefinitionFetchParams) : IRowDefinition {\n        const parentKeys = param.parentKeys ?? [];\n        const key = `${param.rowIndex}-${parentKeys.join('-')}`;\n        if(this.rowDefinitionCache[key]){\n            return this.rowDefinitionCache[key];\n        }\n        const rowDefinition = this.configuration.rowDefinitions?.(param);\n        this.rowDefinitionCache[key] = rowDefinition;\n        setTimeout(() => {\n            delete this.rowDefinitionCache[key];\n        }, GanttConfigParser.responseCacheClearDelay);\n        return rowDefinition;\n    }\n}","import { AutoWired, BEAN_NAME, Context, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GanttComponent } from \"./GanttComponent\";\n// import { GRID_BEAN_NAME } from \"../../../Grid/Core/Constants/BeanName\";\n// import { IControllerHandler } from \"../../../Grid/Core/Interface/IControllerHandler\";\nimport { GanttConfigParser } from \"./GanttConfigParser\";\nimport { GridMain, LayoutModule } from \"../../../Grid/Main\";\nimport { List } from \"../../../ListModelClasses/List\";\nimport { ViewsCommunicationHandler } from \"../OptionsHandler/viewsCommunicationHandler\";\nimport { GANTT_BEAN_NAME } from \"../../Constant/GanttBeanNameConstant\";\nimport { GanttPaginationController } from \"../Pagination/PaginationController\";\nimport { Events } from \"../../../Grid/Core/Constants/Events\";\n\nexport class GanttController extends EventEmitter {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    \n    static getGanttBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    component!      : GanttComponent;\n    private viewPanelContext  : Context;\n    private ganttPanelContext : Context;\n    configParser    : GanttConfigParser;\n    \n    setComponent(component: GanttComponent) {\n        this.registerController();\n\n        this.component       = component;\n        this.configParser    = this.createManagedBean(new GanttConfigParser());\n        this.constructPanels();\n\n        this.addResizeListener();\n        this.addScrollListener();\n\n        const eventHandlers: Array<{ event: string; className: string; action: 'add' | 'remove' }> = [\n            { event: Events.EVENT_TASK_BAR_GRAB_STARTED, className: 'dg-gantt__task-bar-grab--active', action: 'add' },\n            { event: Events.EVENT_TASK_BAR_GRAB_ENDED, className: 'dg-gantt__task-bar-grab--active', action: 'remove' },\n            { event: Events.EVENT_TASK_BAR_RESIZE_STARTED, className: 'dg-gantt__task-bar-resize--active', action: 'add' },\n            { event: Events.EVENT_TASK_BAR_RESIZE_ENDED, className: 'dg-gantt__task-bar-resize--active', action: 'remove' },\n            { event: Events.EVENT_TASK_BAR_GRAB_CANCELLED, className: 'dg-gantt__task-bar-grab--active', action: 'remove' },\n            { event: Events.EVENT_TASK_BAR_RESIZE_CANCELLED, className: 'dg-gantt__task-bar-resize--active', action: 'remove' },\n            { event: Events.EVENT_TASK_BAR_POINTER_DRAG_STARTED, className: 'dg-gantt__bar-pt--dragging-active', action: 'add' },\n            { event: Events.EVENT_TASK_BAR_POINTER_DRAG_ENDED, className: 'dg-gantt__bar-pt--dragging-active', action: 'remove' },\n            { event: Events.EVENT_TASK_BAR_POINTER_DRAG_CANCELLED, className: 'dg-gantt__bar-pt--dragging-active', action: 'remove' },\n            { event: Events.EVENT_TASK_BAR_SCHEDULE_STARTED, className: 'dg-gantt__task-bar-schedule--active', action: 'add' },\n            { event: Events.EVENT_TASK_BAR_SCHEDULE_ENDED, className: 'dg-gantt__task-bar-schedule--active', action: 'remove' },\n            { event: Events.EVENT_TASK_BAR_SCHEDULE_CANCELLED, className: 'dg-gantt__task-bar-schedule--active', action: 'remove' }\n        ];\n\n        eventHandlers.forEach(({ event, className, action }) => {\n            this.addListener(\n                this.eventHandler,\n                event,\n                this.createTaskBarEventHandler(className, action).bind(this)\n            );\n        });\n    }\n\n    private createTaskBarEventHandler(className: string, action: 'add' | 'remove') {\n        return () => {\n            const element = this.component.getGui();\n            if (element) {\n                element.classList[action](className);\n            }\n        };\n    }\n    private registerController() : void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GANTT_BEAN_NAME.CONTROLLER_HANDLER);\n        controllerHandler.registerController(this);\n    }\n\n    private constructPanels() : void {\n        const { infoPanelConfiguration, ganttViewPanelConfiguration } = this.configParser.parseGanttConfiguration();\n        \n        const ganttPanelGui   = this.component.getGanttGui();\n        const viewPanelGui    = this.component.getViewGui();\n        const getViewContext  = (context : Context) => this.viewPanelContext = context;\n        const getGanttContext = (context : Context) => this.ganttPanelContext = context;\n       \n        GanttController.getGanttBeanInstanceByBeanName = this.getBeanInstanceByBeanName.bind(this);\n        \n        const infoPanel  = infoPanelConfiguration.viewType == 'grid' ? new GridMain(viewPanelGui, infoPanelConfiguration as any, {modules:[LayoutModule]}, getViewContext) : new List(viewPanelGui, infoPanelConfiguration as any, {modules:[LayoutModule]}, getViewContext);\n        const ganttPanel = new GridMain(ganttPanelGui, ganttViewPanelConfiguration, {modules:[LayoutModule]}, getGanttContext);\n        this.context.createBean(new ViewsCommunicationHandler());\n        const viewsCommunicationHandler = this.getBeanInstanceByBeanName(GANTT_BEAN_NAME.VIEWS_COMMUNICATION_HANDLER) as ViewsCommunicationHandler;\n        viewsCommunicationHandler.setContext(this.viewPanelContext, this.ganttPanelContext);\n        viewsCommunicationHandler.setPanelInstance(infoPanel, ganttPanel);\n\n        // Pass ganttPanel instance to PaginationController\n        const paginationController = this.getBeanInstanceByBeanName(GANTT_BEAN_NAME.PAGINATION_CONTROLLER) as GanttPaginationController;\n        if (paginationController && typeof paginationController.setGanttPanel === 'function') {\n            paginationController.setGanttPanel(ganttPanel, ganttPanelGui, this.configParser, viewsCommunicationHandler, getGanttContext);\n        }\n    }\n\n    getViewContext() : Context {\n        return this.viewPanelContext;\n    }\n\n    getGanttContext() : Context {\n        return this.ganttPanelContext;\n    }\n\n    private addResizeListener() : void {\n        // const gridViewContext = this.getViewContext();\n        // const ganttContext    = this.getGanttContext();\n\n        // const ganttViewCommonScroller = this.component.getScroller();\n        // const ganttViewRootContainer  = this.component.getGui();\n        // const viewGui                 = this.component.getViewGui();\n        // const ganttGui                = this.component.getGanttGui();\n\n        // const ganttControllerHandler  = ganttContext.getBean(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        // const viewControllerHandler   = gridViewContext.getBean(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n        // const viewGridComponent  = viewControllerHandler.getGridController();\n        // const ganttGridComponent = ganttControllerHandler.getGridController();\n        // const viewScroller       = viewGridComponent.getScrollHolder().firstElementChild as HTMLElement;\n        // const ganttScroller      = ganttGridComponent.getScrollHolder().firstElementChild as HTMLElement;\n\n        // const viewScrollerResizeObserver = new ResizeObserver(() => {\n        //     ganttViewCommonScroller.style.height = `${viewScroller.offsetHeight}px`;\n        // });\n        // const ganttScrollerResizeObserver = new ResizeObserver(() => {\n        //     ganttViewCommonScroller.style.height = `${ganttScroller.offsetHeight}px`;\n        // });\n\n        // const ganttRootContainerResizeObserver = new ResizeObserver(() => {\n        //     ganttGui.style.height = `${ganttViewRootContainer.offsetHeight}px`;\n        //     viewGui.style.height  = `${ganttViewRootContainer.offsetHeight}px`;\n        // });\n\n\n        // viewScrollerResizeObserver.observe(viewScroller);\n        // ganttScrollerResizeObserver.observe(ganttScroller);\n        // ganttRootContainerResizeObserver.observe(ganttViewRootContainer);\n\n        // ganttViewCommonScroller.style.height = `${ganttScroller.offsetHeight}px`;\n        // ganttGui.style.height                = `${ganttViewRootContainer.offsetHeight}px`;\n        // viewGui.style.height                 = `${ganttViewRootContainer.offsetHeight}px`;\n    }\n\n\n    private addScrollListener() : void {\n        // const gridViewContext = this.getViewContext();\n        // const ganttContext    = this.getGanttContext();\n\n        // const ganttViewContainer     = this.component.getGui();\n        // const ganttControllerHandler = ganttContext.getBean(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        // const viewControllerHandler  = gridViewContext.getBean(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n    \n\t\t// const viewGridComponent  = viewControllerHandler.getGridController();\n\t\t// const ganttGridComponent = ganttControllerHandler.getGridController();\n\t\t// const viewScrollHolder   = viewGridComponent.getScrollHolder();\n\t\t// const ganttScrollHolder  = ganttGridComponent.getScrollHolder();\n\n        // viewScrollHolder.addEventListener('scroll', () => {\n        //     ganttViewContainer.scrollTop = viewScrollHolder.scrollTop;\n        //     ganttScrollHolder.scrollTop = viewScrollHolder.scrollTop;\n        // });\n\n        // ganttScrollHolder.addEventListener('scroll', () => {\n        //     ganttViewContainer.scrollTop = ganttScrollHolder.scrollTop;\n        //     viewScrollHolder.scrollTop = ganttScrollHolder.scrollTop;\n        // });\n\n        // ganttViewContainer.addEventListener('scroll', () => {\n        //     ganttScrollHolder.scrollTop = ganttViewContainer.scrollTop;\n        //     viewScrollHolder.scrollTop = ganttViewContainer.scrollTop;\n        // });\n    }\n\n    destroyComponent() {\n        this.component && this.component.destroy();\n        this.component = null;\n    }\n}","export function getGanttViewTemplate()  {\n    return function getTemplate() : HTMLElement {\n        const template = `\n            <div class=\"dg-gantt-view-root\" ref='ganttViewRoot'>\n                <div class=\"dg-gantt-view-left\" ref='ganttInfoPanel'></div>\n                <div class=\"dg-gantt-view-right\" ref='ganttViewPanel'></div>\n            </div>\n        `;\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstElementChild as HTMLElement;\n    }\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IGanttDateComputationEngine } from \"./IGanttDateComputationEngine\";\nimport { GANTT_BEAN_NAME } from \"../../Constant/GanttBeanNameConstant\";\nimport { IDateUtils } from \"../../../Utils/IDateUtils\";\nimport { IGanttPaginationController } from \"../Pagination/IPaginationController\";\nimport { IUnit, timestamp } from \"../../IGanttConfiguration\";\nimport { IGanttOptionsHandler } from \"../OptionsHandler/IGanttOptionsHandler\";\n\n\n\n\n\n@Bean(GANTT_BEAN_NAME.GANTT_DATE_COMPUTATION_ENGINE)\nexport class GanttDateComputationEngine  extends EventEmitter implements IGanttDateComputationEngine {\n\n\n    @AutoWired(GANTT_BEAN_NAME.DATE_UTILS) \n    private dateUtils: IDateUtils;\n\n\n    @AutoWired(GANTT_BEAN_NAME.PAGINATION_CONTROLLER)\n    private paginationController: IGanttPaginationController;\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER)\n    protected optionsHandler: IGanttOptionsHandler;\n\n\n    private currentProjectStartDate: timestamp;\n    // private currentProjectEndDate  : timestamp;\n\n    private timelineView: IUnit;\n    private timelineWidth : number;\n\n\n\n    @PostConstruct()\n    init(): void {\n        this.currentProjectStartDate = this.paginationController.getCurrentProjectStartDate();\n        // this.currentProjectEndDate = this.paginationController.getCurrentProjectEndDate();\n\n        this.timelineView = this.optionsHandler.getTimelineViewMode();\n        this.timelineWidth = this.optionsHandler.getTimeLineWidth();\n\n    }\n\n    //  Helper: Get timezone-aware date components from timestamp \n\n    protected getTimezoneAwareComponents(ts: timestamp): { year: number; month: number; day: number; hour: number; minute: number; second: number; millisecond: number } | null {\n        if (!this.dateUtils) {\n            return null;\n        }\n        try {\n            const breakdown = this.dateUtils.convertToTimezoneObject(ts);\n            return {\n                year: breakdown.year,\n                month: breakdown.month,\n                day: breakdown.day,\n                hour: breakdown.hour,\n                minute: breakdown.minute,\n                second: breakdown.second,\n                millisecond: breakdown.millisecond || 0\n            };\n        } catch {\n            return null;\n        }\n    }\n\n    // Helper: Get start of quarter timestamp from a given timestamp (timezone-aware)\n    \n    protected getStartOfQuarterTimestamp(ts: timestamp): timestamp {\n        const components = this.getTimezoneAwareComponents(ts);\n        if (!components) {\n            // Fallback to UTC if dateUtils not available\n            const date = new Date(ts);\n            const quarterStartMonth = Math.floor(date.getUTCMonth() / 3) * 3;\n            return Date.UTC(date.getUTCFullYear(), quarterStartMonth, 1);\n        }\n        // components.month is already 0-indexed (0-11) from convertToTimezoneObject\n        const quarterStartMonth = Math.floor(components.month / 3) * 3;\n        // Convert back to timestamp - need to use dateUtils for proper timezone conversion\n        // Date.UTC expects 0-indexed month, so use components.month directly\n        const quarterStartDate = this.dateUtils.parseDate(new Date(Date.UTC(components.year, quarterStartMonth, 1)));\n        return quarterStartDate.toMillis();\n    }\n\n    \n    //  Helper: Get days in month for a given timestamp (timezone-aware)\n     \n    protected getDaysInMonth(ts: timestamp): number {\n        const components = this.getTimezoneAwareComponents(ts);\n        if (!components) {\n            // Fallback to UTC if dateUtils not available\n            const date = new Date(ts);\n            return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 0)).getUTCDate();\n        }\n        // Use dateUtils to get days in month for the specific month/year in the configured timezone\n        if (!this.dateUtils) {\n            return 30; // Fallback\n        }\n        try {\n            // components.month is already 0-indexed (0-11) from convertToTimezoneObject\n            // Date.UTC expects 0-indexed month, so use components.month directly\n            const monthStart = this.dateUtils.parseDate(new Date(Date.UTC(components.year, components.month, 1)));\n            return this.dateUtils.getDaysInMonth(monthStart);\n        } catch {\n            return 30; // Fallback\n        }\n    }\n\n\n\n    getExactLeftPositionByDate(date: timestamp): number {\n        if (!this.timelineWidth || !this.currentProjectStartDate) {\n            return 0;\n        }\n\n        // Direct timestamp arithmetic for better performance\n        const timeDiff = date - this.currentProjectStartDate;\n        const viewType = this.timelineView;\n        let left = 0;\n\n        // Constants for timestamp calculations\n        const MS_PER_HOUR = 3600000;\n        const MS_PER_DAY = 86400000;\n\n        switch (viewType) {\n            case 'day': {\n                // DAY View: timelineWidth is width per hour\n                // Calculate hours difference directly from timestamp (including fractional hours)\n                const hoursDiff = timeDiff / MS_PER_HOUR;\n                left = hoursDiff * this.timelineWidth;\n                break;\n            }\n            case 'week':\n            case 'month': {\n                // WEEK/MONTH View: timelineWidth is width per day\n                // Calculate days difference directly from timestamp (including fractional days)\n                const daysDiff = timeDiff / MS_PER_DAY;\n                left = daysDiff * this.timelineWidth;\n                break;\n            }\n            case 'year': {\n                // YEAR View: timelineWidth is width per month\n                // Use timezone-aware date components for accurate calculations\n                const projectStartComponents = this.getTimezoneAwareComponents(this.currentProjectStartDate);\n                const targetComponents = this.getTimezoneAwareComponents(date);\n                \n                if (!projectStartComponents || !targetComponents) {\n                    // Fallback to UTC if dateUtils not available\n                    const projectStartDate = new Date(this.currentProjectStartDate);\n                    const targetDate = new Date(date);\n                    const yearsDiff = targetDate.getUTCFullYear() - projectStartDate.getUTCFullYear();\n                    const monthIndex = targetDate.getUTCMonth();\n                    const dayOfMonth = targetDate.getUTCDate();\n                    const daysInMonth = this.getDaysInMonth(date);\n                    const hour = targetDate.getUTCHours();\n                    const minute = targetDate.getUTCMinutes();\n                    const second = targetDate.getUTCSeconds();\n                    const millisecond = targetDate.getUTCMilliseconds();\n                    const dayFraction = dayOfMonth + (hour / 24) + (minute / 1440) + (second / 86400) + (millisecond / 86400000);\n                    const monthFraction = dayFraction / daysInMonth;\n                    left = (yearsDiff * 12 * this.timelineWidth) + (monthIndex * this.timelineWidth) + (monthFraction * this.timelineWidth);\n                    break;\n                }\n                \n                // Calculate whole years difference (timezone-aware)\n                const yearsDiff = targetComponents.year - projectStartComponents.year;\n                \n                // Calculate months within the target year (0-11, convertToTimezoneObject returns 0-indexed)\n                const monthIndex = targetComponents.month;\n                \n                // Get day of month and time components (timezone-aware)\n                const dayOfMonth = targetComponents.day;\n                const daysInMonth = this.getDaysInMonth(date);\n                const hour = targetComponents.hour;\n                const minute = targetComponents.minute;\n                const second = targetComponents.second;\n                const millisecond = targetComponents.millisecond;\n                \n                // Calculate fractional month: (dayOfMonth + hour/24 + minute/1440 + second/86400 + ms/86400000) / daysInMonth\n                const dayFraction = dayOfMonth + (hour / 24) + (minute / 1440) + (second / 86400) + (millisecond / 86400000);\n                const monthFraction = dayFraction / daysInMonth;\n                \n                // Calculate left: (yearsDiff * 12 * timelineWidth) + (monthIndex * timelineWidth) + (monthFraction * timelineWidth)\n                left = (yearsDiff * 12 * this.timelineWidth) + (monthIndex * this.timelineWidth) + (monthFraction * this.timelineWidth);\n                break;\n            }\n            case 'quarter': {\n                // QUARTER View: timelineWidth is width per month\n                // Use timezone-aware date components for accurate calculations\n                const projectStartComponents = this.getTimezoneAwareComponents(this.currentProjectStartDate);\n                const targetComponents = this.getTimezoneAwareComponents(date);\n                \n                if (!projectStartComponents || !targetComponents) {\n                    // Fallback to UTC if dateUtils not available\n                    const targetDate = new Date(date);\n                    const anchorStartQuarter = this.getStartOfQuarterTimestamp(this.currentProjectStartDate);\n                    const targetStartQuarter = this.getStartOfQuarterTimestamp(date);\n                    const anchorStartQuarterDate = new Date(anchorStartQuarter);\n                    const targetStartQuarterDate = new Date(targetStartQuarter);\n                    const anchorQuarter = Math.floor(anchorStartQuarterDate.getUTCMonth() / 3);\n                    const targetQuarter = Math.floor(targetStartQuarterDate.getUTCMonth() / 3);\n                    const quartersDiff = (targetStartQuarterDate.getUTCFullYear() - anchorStartQuarterDate.getUTCFullYear()) * 4 + (targetQuarter - anchorQuarter);\n                    const monthIndexInQuarter = targetDate.getUTCMonth() - targetStartQuarterDate.getUTCMonth();\n                    const dayOfMonth = targetDate.getUTCDate();\n                    const daysInMonth = this.getDaysInMonth(date);\n                    const hour = targetDate.getUTCHours();\n                    const minute = targetDate.getUTCMinutes();\n                    const second = targetDate.getUTCSeconds();\n                    const millisecond = targetDate.getUTCMilliseconds();\n                    const dayFraction = dayOfMonth + (hour / 24) + (minute / 1440) + (second / 86400) + (millisecond / 86400000);\n                    const monthFraction = dayFraction / daysInMonth;\n                    left = (quartersDiff * 3 * this.timelineWidth) + (monthIndexInQuarter * this.timelineWidth) + (monthFraction * this.timelineWidth);\n                    break;\n                }\n                \n                // Calculate quarter start month for target (timezone-aware, convertToTimezoneObject returns 0-indexed months)\n                const targetQuarterStartMonth = Math.floor(targetComponents.month / 3) * 3;\n                \n                // Calculate quarters difference\n                const anchorQuarter = Math.floor(projectStartComponents.month / 3);\n                const targetQuarter = Math.floor(targetComponents.month / 3);\n                const quartersDiff = (targetComponents.year - projectStartComponents.year) * 4 + (targetQuarter - anchorQuarter);\n                \n                // Calculate month index within quarter (0-2)\n                const monthIndexInQuarter = targetComponents.month - targetQuarterStartMonth;\n                \n                // Get day of month and time components (timezone-aware)\n                const dayOfMonth = targetComponents.day;\n                const daysInMonth = this.getDaysInMonth(date);\n                const hour = targetComponents.hour;\n                const minute = targetComponents.minute;\n                const second = targetComponents.second;\n                const millisecond = targetComponents.millisecond;\n                \n                // Calculate fractional month\n                const dayFraction = dayOfMonth + (hour / 24) + (minute / 1440) + (second / 86400) + (millisecond / 86400000);\n                const monthFraction = dayFraction / daysInMonth;\n                \n                // Calculate left: (quartersDiff * 3 * timelineWidth) + (monthIndexInQuarter * timelineWidth) + (monthFraction * timelineWidth)\n                left = (quartersDiff * 3 * this.timelineWidth) + (monthIndexInQuarter * this.timelineWidth) + (monthFraction * this.timelineWidth);\n                break;\n            }\n            default: {\n                // Fallback: use days difference directly from timestamp\n                const daysDiff = timeDiff / MS_PER_DAY;\n                left = daysDiff * this.timelineWidth;\n                break;\n            }\n        }\n\n        // Adjust left position based on timezone offset\n        return this.adjustLeftForTimezone(left, date);\n    }\n\n    /**\n     * Adjust left position based on timezone offset using Luxon\n     * @param left - Calculated left position\n     * @param date - Timestamp to get timezone offset for\n     * @returns Adjusted left position\n     */\n    private adjustLeftForTimezone(left: number, date: timestamp): number {\n        if (!this.dateUtils || !this.optionsHandler) {\n            return left;\n        }\n\n        try {\n            // Get timezone from optionsHandler (configured timezone or system timezone)\n            const timezone = this.optionsHandler.getTimezone();\n            \n            // Parse timestamp to DateTime - parseDate already applies timezone if configured\n            const dateTimeParsed = this.dateUtils.parseDate(date);\n            if (!dateTimeParsed?.isValid) {\n                return left;\n            }\n\n            // Get DateTime in UTC for comparison\n            const dateTimeUTC = dateTimeParsed.setZone('utc');\n            \n            // Get offset in minutes for UTC (should be 0)\n            const utcOffsetMinutes = dateTimeUTC.offset;\n            \n            // Get offset in minutes for configured/system timezone\n            // If timezone is null or 'system', use system timezone (already applied by parseDate)\n            // Otherwise, explicitly set the timezone\n            const targetTimezone = timezone === 'system' || timezone === null ? null : timezone;\n            const dateTimeInTimezone = targetTimezone \n                ? dateTimeUTC.setZone(targetTimezone)\n                : dateTimeParsed; // System timezone (already applied by parseDate)\n            \n            const timezoneOffsetMinutes = dateTimeInTimezone.offset;\n            \n            // Calculate offset difference in minutes\n            // Positive offset means timezone is ahead of UTC, negative means behind UTC\n            const offsetDiffMinutes = timezoneOffsetMinutes - utcOffsetMinutes;\n            \n            // Convert offset difference to hours (can be fractional)\n            const offsetDiffHours = offsetDiffMinutes / 60;\n            \n            // Adjust left position based on view type and offset\n            const viewType = this.timelineView;\n            let adjustment = 0;\n            \n            switch (viewType) {\n                case 'day': {\n                    // DAY View: timelineWidth is width per hour\n                    // Adjust by offset hours directly\n                    // Positive offset means timezone is ahead, so we need to shift left (subtract)\n                    // Negative offset means timezone is behind, so we need to shift right (add)\n                    adjustment = offsetDiffHours * this.timelineWidth;\n                    break;\n                }\n                case 'week':\n                case 'month': {\n                    // WEEK/MONTH View: timelineWidth is width per day\n                    // Convert offset hours to days (including fractional days)\n                    const offsetDiffDays = offsetDiffHours / 24;\n                    adjustment = offsetDiffDays * this.timelineWidth;\n                    break;\n                }\n                case 'year': {\n                    // YEAR View: timelineWidth is width per month\n                    // Convert offset hours to days, then to months using actual days in month\n                    const offsetDiffDays = offsetDiffHours / 24;\n                    const daysInMonth = this.getDaysInMonth(date);\n                    // Calculate fractional month: days / daysInMonth\n                    const offsetDiffMonths = offsetDiffDays / Math.max(daysInMonth, 1);\n                    adjustment = offsetDiffMonths * this.timelineWidth;\n                    break;\n                }\n                case 'quarter': {\n                    // QUARTER View: timelineWidth is width per month\n                    // Convert offset hours to days, then to months using actual days in month\n                    const offsetDiffDays = offsetDiffHours / 24;\n                    const daysInMonth = this.getDaysInMonth(date);\n                    // Calculate fractional month: days / daysInMonth\n                    const offsetDiffMonths = offsetDiffDays / Math.max(daysInMonth, 1);\n                    adjustment = offsetDiffMonths * this.timelineWidth;\n                    break;\n                }\n                default: {\n                    // Fallback: convert to days\n                    const offsetDiffDays = offsetDiffHours / 24;\n                    adjustment = offsetDiffDays * this.timelineWidth;\n                    break;\n                }\n            }\n            \n            return left + adjustment;\n        } catch {\n            // If timezone adjustment fails, return original left position\n            return left;\n        }\n    }\n\n    getExactRightPositionByDate(date: timestamp): number {\n        if (!this.timelineWidth || !this.currentProjectStartDate) {\n            return 0;\n        }\n\n        const viewType = this.timelineView;\n        const left = this.getExactLeftPositionByDate(date);\n        let right = 0;\n\n        switch (viewType) {\n            case 'day': {\n                // DAY View: timelineWidth is width per hour\n                // Right position = left position + 1 hour width\n                right = left + this.timelineWidth;\n                break;\n            }\n            case 'week':\n            case 'month': {\n                // WEEK/MONTH View: timelineWidth is width per day\n                // Right position = left position + 1 day width\n                right = left + this.timelineWidth;\n                break;\n            }\n            case 'year':\n            case 'quarter': {\n                // YEAR/QUARTER View: timelineWidth is width per month\n                // Right position = left position + (1 month width / daysInMonth)\n                // Use native Date for better performance\n                const daysInMonth = this.getDaysInMonth(date);\n                const widthPerDay = this.timelineWidth / Math.max(daysInMonth, 1);\n                right = left + widthPerDay;\n                break;\n            }\n            default: {\n                // Fallback: use days difference + 1 day width\n                right = left + this.timelineWidth;\n                break;\n            }\n        }\n\n        return right;\n    }\n\n\n\n    /**\n     * Get left position by date, handling all-day mode if enabled\n     * In all-day mode, uses start of day (00:00:00) for the given date\n     * @param date - Timestamp to calculate position for\n     * @returns Left position in pixels\n     */\n    getLeftPositionByDate(date: timestamp, forceAllDayMode: boolean = false): number {\n        const isAllDayFillMode = this.optionsHandler.isAllDayFillMode();\n        const useAllDayMode = forceAllDayMode || isAllDayFillMode;\n        \n        if (!useAllDayMode) {\n            // Not in all-day mode, use exact position\n            return this.getExactLeftPositionByDate(date);\n        }\n\n        // All-day mode: use start of day (00:00:00) in configured timezone\n        if (!this.dateUtils) {\n            // Fallback: use UTC start of day if dateUtils not available\n            const dateObj = new Date(date);\n            const startOfDayUTC = Date.UTC(\n                dateObj.getUTCFullYear(),\n                dateObj.getUTCMonth(),\n                dateObj.getUTCDate(),\n                0, 0, 0, 0\n            );\n            return this.getExactLeftPositionByDate(startOfDayUTC);\n        }\n\n        // Parse timestamp to DateTime with timezone support\n        const dateTime = this.dateUtils.parseDate(date);\n        if (!dateTime?.isValid) {\n            // Invalid date, fallback to exact position\n            return this.getExactLeftPositionByDate(date);\n        }\n\n        // Get start of day (00:00:00) in configured timezone\n        const startOfDay = this.dateUtils.startOfDay(dateTime);\n        const startOfDayTimestamp = this.dateUtils.getTimestamp(startOfDay);\n\n        // Calculate position using start of day timestamp\n        return this.getExactLeftPositionByDate(startOfDayTimestamp);\n    }\n\n    /**\n     * Get right position by date, handling all-day mode if enabled\n     * In all-day mode, uses start of day left position + unit width based on view type\n     * @param date - Timestamp to calculate position for\n     * @returns Right position in pixels\n     */\n    getRightPositionByDate(date: timestamp, forceAllDayMode: boolean = false): number {\n        if (!this.timelineWidth || !this.currentProjectStartDate) {\n            return 0;\n        }\n\n        const isAllDayFillMode = this.optionsHandler.isAllDayFillMode();\n        const useAllDayMode = forceAllDayMode || isAllDayFillMode;\n        \n        // If all-day mode, get end of day timestamp and calculate its position\n        if (useAllDayMode) {\n            if (!this.dateUtils) {\n                // Fallback: use UTC end of day\n                const dateObj = new Date(date);\n                const endOfDayUTC = Date.UTC(\n                    dateObj.getUTCFullYear(),\n                    dateObj.getUTCMonth(),\n                    dateObj.getUTCDate(),\n                    23, 59, 59, 999\n                );\n                return this.getExactLeftPositionByDate(endOfDayUTC);\n            }\n\n            // Parse timestamp to DateTime with timezone support\n            const dateTime = this.dateUtils.parseDate(date);\n            if (!dateTime?.isValid) {\n                // Invalid date, fallback to regular calculation\n                const left = this.getLeftPositionByDate(date, forceAllDayMode);\n                return this.calculateRightFromLeft(left, date);\n            }\n\n            // Get end of day (23:59:59.999) in configured timezone\n            const endOfDay = this.dateUtils.endOfDay(dateTime);\n            const endOfDayTimestamp = this.dateUtils.getTimestamp(endOfDay);\n\n            // Calculate position using end of day timestamp\n            return this.getExactLeftPositionByDate(endOfDayTimestamp);\n        }\n\n        // Not in all-day mode: get left position and add unit width based on view type\n        const left = this.getLeftPositionByDate(date, false);\n        // return this.calculateRightFromLeft(left, date);\n        return left\n    }\n\n    /**\n     * Calculate right position from left position based on view type\n     * @param left - Left position\n     * @param date - Timestamp for context (needed for year/quarter views)\n     * @returns Right position\n     */\n    private calculateRightFromLeft(left: number, date: timestamp): number {\n        const viewType = this.timelineView;\n        let right = 0;\n\n        switch (viewType) {\n            case 'day': {\n                // DAY View: timelineWidth is width per hour\n                // Right position = end of day position (23:59:59.999)\n                if (!this.dateUtils) {\n                    // Fallback: use UTC end of day\n                    const dateObj = new Date(date);\n                    const endOfDayUTC = Date.UTC(\n                        dateObj.getUTCFullYear(),\n                        dateObj.getUTCMonth(),\n                        dateObj.getUTCDate(),\n                        23, 59, 59, 999\n                    );\n                    right = this.getExactLeftPositionByDate(endOfDayUTC);\n                } else {\n                    // Use timezone-aware end of day\n                    const dateTime = this.dateUtils.parseDate(date);\n                    if (dateTime?.isValid) {\n                        const endOfDay = this.dateUtils.endOfDay(dateTime);\n                        const endOfDayTimestamp = this.dateUtils.getTimestamp(endOfDay);\n                        right = this.getExactLeftPositionByDate(endOfDayTimestamp);\n                    } else {\n                        // Fallback if parsing fails\n                        right = left + this.timelineWidth;\n                    }\n                }\n                break;\n            }\n            case 'week':\n            case 'month': {\n                // WEEK/MONTH View: timelineWidth is width per day\n                // Right position = left position + 1 day width\n                right = left + this.timelineWidth;\n                break;\n            }\n            case 'year':\n            case 'quarter': {\n                // YEAR/QUARTER View: timelineWidth is width per month\n                // Right position = left position + (1 month width / daysInMonth) = 1 day width\n                const daysInMonth = this.getDaysInMonth(date);\n                const widthPerDay = this.timelineWidth / Math.max(daysInMonth, 1);\n                right = left + widthPerDay;\n                break;\n            }\n            default: {\n                // Fallback: use 1 day width\n                right = left + this.timelineWidth;\n                break;\n            }\n        }\n\n        return right;\n    }\n\n\n    /**\n     * Calculate width between two timestamps based on view type and all-day mode\n     * Optimized: Direct timestamp difference calculation for better performance\n     * @param startDate - Start timestamp\n     * @param endDate - End timestamp\n     * @returns Width in pixels\n     */\n    getWidthByDate(startDate: timestamp, endDate: timestamp): number {\n        if (!this.timelineWidth || !this.currentProjectStartDate) {\n            return 0;\n        }\n\n        let startTs = startDate;\n        let endTs = endDate;\n\n        const isAllDayFillMode = this.optionsHandler.isAllDayFillMode();\n        // Handle all-day mode: use start of day for start, end of day for end\n        if (isAllDayFillMode) {\n            if (!this.dateUtils) {\n                // Fallback: use UTC start/end of day\n                const startDateObj = new Date(startDate);\n                const endDateObj = new Date(endDate);\n                startTs = Date.UTC(\n                    startDateObj.getUTCFullYear(),\n                    startDateObj.getUTCMonth(),\n                    startDateObj.getUTCDate(),\n                    0, 0, 0, 0\n                );\n                endTs = Date.UTC(\n                    endDateObj.getUTCFullYear(),\n                    endDateObj.getUTCMonth(),\n                    endDateObj.getUTCDate(),\n                    23, 59, 59, 999\n                );\n            } else {\n                // Use timezone-aware start/end of day\n                const startDateTime = this.dateUtils.parseDate(startDate);\n                const endDateTime = this.dateUtils.parseDate(endDate);\n                \n                if (startDateTime?.isValid && endDateTime?.isValid) {\n                    const startOfDay = this.dateUtils.startOfDay(startDateTime);\n                    const endOfDay = this.dateUtils.endOfDay(endDateTime);\n                    startTs = this.dateUtils.getTimestamp(startOfDay);\n                    endTs = this.dateUtils.getTimestamp(endOfDay);\n                }\n            }\n        }\n\n        // Direct timestamp difference calculation\n        const timeDiff = endTs - startTs;\n        const viewType = this.timelineView;\n        let width = 0;\n\n        // Constants for timestamp calculations\n        const MS_PER_HOUR = 3600000;\n        const MS_PER_DAY = 86400000;\n\n        switch (viewType) {\n            case 'day': {\n                // DAY View: timelineWidth is width per hour\n                const hoursDiff = timeDiff / MS_PER_HOUR;\n                width = hoursDiff * this.timelineWidth;\n                break;\n            }\n            case 'week':\n            case 'month': {\n                // WEEK/MONTH View: timelineWidth is width per day\n                const daysDiff = timeDiff / MS_PER_DAY;\n                width = daysDiff * this.timelineWidth;\n                break;\n            }\n            case 'year': {\n                // YEAR View: timelineWidth is width per month\n                // Use timezone-aware calculation for accurate month differences\n                const startComponents = this.getTimezoneAwareComponents(startTs);\n                const endComponents = this.getTimezoneAwareComponents(endTs);\n                \n                if (!startComponents || !endComponents) {\n                    // Fallback: use days difference converted to months\n                    const daysDiff = timeDiff / MS_PER_DAY;\n                    width = (daysDiff / 30) * this.timelineWidth;\n                    break;\n                }\n\n                // Calculate years and months difference\n                const yearsDiff = endComponents.year - startComponents.year;\n                const monthsDiff = (yearsDiff * 12) + (endComponents.month - startComponents.month);\n                \n                // Calculate fractional month for start date\n                const startDaysInMonth = this.getDaysInMonth(startTs);\n                const startDayFraction = startComponents.day + (startComponents.hour / 24) + \n                    (startComponents.minute / 1440) + (startComponents.second / 86400) + \n                    (startComponents.millisecond / 86400000);\n                const startMonthFraction = startDayFraction / startDaysInMonth;\n                \n                // Calculate fractional month for end date\n                const endDaysInMonth = this.getDaysInMonth(endTs);\n                const endDayFraction = endComponents.day + (endComponents.hour / 24) + \n                    (endComponents.minute / 1440) + (endComponents.second / 86400) + \n                    (endComponents.millisecond / 86400000);\n                const endMonthFraction = endDayFraction / endDaysInMonth;\n                \n                // Total months difference\n                const totalMonthsDiff = monthsDiff - startMonthFraction + endMonthFraction;\n                width = totalMonthsDiff * this.timelineWidth;\n                break;\n            }\n            case 'quarter': {\n                // QUARTER View: timelineWidth is width per month\n                // Use timezone-aware calculation\n                const startComponents = this.getTimezoneAwareComponents(startTs);\n                const endComponents = this.getTimezoneAwareComponents(endTs);\n                \n                if (!startComponents || !endComponents) {\n                    // Fallback: use days difference converted to months\n                    const daysDiff = timeDiff / MS_PER_DAY;\n                    width = (daysDiff / 30) * this.timelineWidth;\n                    break;\n                }\n\n                // Calculate quarters difference\n                const startQuarter = Math.floor(startComponents.month / 3);\n                const endQuarter = Math.floor(endComponents.month / 3);\n                const quartersDiff = (endComponents.year - startComponents.year) * 4 + (endQuarter - startQuarter);\n                \n                // Calculate fractional month for start date\n                const startDaysInMonth = this.getDaysInMonth(startTs);\n                const startDayFraction = startComponents.day + (startComponents.hour / 24) + \n                    (startComponents.minute / 1440) + (startComponents.second / 86400) + \n                    (startComponents.millisecond / 86400000);\n                const startMonthFraction = startDayFraction / startDaysInMonth;\n                \n                // Calculate fractional month for end date\n                const endDaysInMonth = this.getDaysInMonth(endTs);\n                const endDayFraction = endComponents.day + (endComponents.hour / 24) + \n                    (endComponents.minute / 1440) + (endComponents.second / 86400) + \n                    (endComponents.millisecond / 86400000);\n                const endMonthFraction = endDayFraction / endDaysInMonth;\n                \n                // Calculate months within quarters\n                const startMonthInQuarter = startComponents.month - (startQuarter * 3);\n                const endMonthInQuarter = endComponents.month - (endQuarter * 3);\n                \n                // Total months difference\n                const totalMonthsDiff = (quartersDiff * 3) + endMonthInQuarter - startMonthInQuarter - startMonthFraction + endMonthFraction;\n                width = totalMonthsDiff * this.timelineWidth;\n                break;\n            }\n            default: {\n                // Fallback: use days difference\n                const daysDiff = timeDiff / MS_PER_DAY;\n                width = daysDiff * this.timelineWidth;\n                break;\n            }\n        }\n\n        return Math.max(0, width);\n    }\n\n\n\n    // Update methods for updating the date computation engine\n\n    updateTimelineView(view: IUnit): void {\n        this.timelineView = view;\n    }\n\n    updateTimelineWidth(width: number): void {\n        this.timelineWidth = width;\n    }\n    \n\n    updateCurrentProjectStartDate(startDate: timestamp): void {\n        this.currentProjectStartDate = startDate;\n    }\n\n    // updateCurrentProjectEndDate(endDate: timestamp): void {\n    //     this.currentProjectEndDate = endDate;\n    // }\n}","\nimport { RowController } from '../../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController'\nimport { AutoWired, Bean, EventEmitter } from '@dg/corecomponent';\nimport { GANTT_BEAN_NAME } from '../Constant/GanttBeanNameConstant';\nimport { ITaskBarInteractionState } from './TaskBarComponent/TaskBarInteractionState';\nimport { IFocusHandler } from '../../Grid/Core/Navigation/focus-handler.types';\nimport { IRecordHandler } from '../../Grid/Core/Rows/RecordHandler.types';\nimport { GRID_BEAN_NAME } from '../../Grid/Core/Constants/BeanName';\n\nexport interface IGanttStateHandler {\n   keepRowVirtualised(index: number, rowController: RowController): boolean\n}\n\n@Bean(GANTT_BEAN_NAME.CORE_STATE_HANDLER)\nexport class GanttStateHandler extends EventEmitter implements IGanttStateHandler {\n\n    @AutoWired(GANTT_BEAN_NAME.TASK_BAR_INTERACTION_STATE) private interactionState!: ITaskBarInteractionState;\n    @AutoWired('focusHandler') private focusHandler!: IFocusHandler;\n\t@AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler! : IRecordHandler;\n    \n\n    keepRowVirtualised(_index: number, rowController: RowController): boolean {\n        const rowMeta = rowController.getRowMeta();\n        const rowId   = rowMeta?.rowID;\n\n        return this.interactionState.isRowDragActive(rowId) || this.isRowFocused(rowController);\n    }\n\n    private isRowFocused(rowController: RowController): boolean {\n        const rowHasFocus = this.focusHandler.isRowFocused(rowController.getRowFocusedPosition());\n\n\t\tif(!rowHasFocus) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst rownode = this.recordHandler.getRowNodeById(rowController.getRowNode().getId());\n\t\treturn rownode ? true : false;\n\n    }\n}\n","import { AutoWired, Bean, BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { IGanttOptionsHandler } from \"./IGanttOptionsHandler\";\nimport { GANTT_BEAN_NAME } from \"../../Constant/GanttBeanNameConstant\";\nimport { IActionRenderer, IGanttConfiguration, IRenderer, ITooltipFormatters, ITooltipFormatterResult, ITooltipDragFormatterResult, timestamp } from \"../../IGanttConfiguration\";\nimport { IGridEventHandlers } from \"../../../Grid/Core/Interface/IGridConfiguration\";\n\n\nfunction getHookCallbackForEvent(eventName: string, Hookname : string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${Hookname}${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class GanttOptionsHandler extends EventEmitter implements IGanttOptionsHandler {\n    @AutoWired(GANTT_BEAN_NAME.CONFIGURATION) configuration : IGanttConfiguration\n\n    getConfiguration(){\n        return this.configuration\n    }\n    // data / rows\n\n    getModelType(): any {\n        return this.configuration?.model ?? 'local';\n    }\n\n    getTaskData(): any {\n        return this.configuration?.taskData;\n    }\n\n    on(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, '');\n\n\t\tif(typeof this.configuration?.events?.[callbackMethodName] === 'function') {\n\t\t\treturn this.configuration?.events?.[callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n    getRowHeights(meta?: any): number {\n        const rowHeights = this.configuration?.rowHeights;\n        if (typeof rowHeights === 'function') return (rowHeights as any)(meta);\n        if (typeof rowHeights === 'number') return rowHeights;\n        if (typeof rowHeights === 'string') return Number(rowHeights) || 50;\n        return 50;\n    }\n\n    hasStaticRowHeight(): boolean {\n        return typeof this.configuration?.rowHeights === 'function' ? false : true;\n    }\n\n    // headers / columns\n    // getColumnHeaderHeight(meta?: any): number {\n    //     const columnHeaderHeights = this.configuration?.columnHeaderHeights as any;\n    //     if (typeof columnHeaderHeights === 'function') return columnHeaderHeights(meta);\n    //     if (typeof columnHeaderHeights === 'number') return columnHeaderHeights;\n    //     if (typeof columnHeaderHeights === 'string') return Number(columnHeaderHeights) || 50;\n    //     return 50;\n    // }\n\n    // grid visuals / behavior\n    getGridLines(): 'vertical' | 'horizontal' | 'both' {\n        return this.configuration?.gridLines ?? 'both';\n    }\n\n    // isHighlightWeekends(): boolean {\n    //     return this.configuration?.highlightWeekends ?? false;\n    // }\n\n    // getEditSettings(): any {\n    //     return this.configuration?.editSettings;\n    // }\n\n    getEvents(): Record<string, CallableFunction> {\n        return this.configuration?.events ?? {};\n    }\n\n    // view\n    getViewType(): 'grid' | 'list' {\n        return this.configuration?.viewType ?? 'grid';\n    }\n\n    getViewConfig(): any {\n        return this.configuration?.viewConfiguration ?? { viewType: this.getViewType() };\n    }\n\n    // project timeline\n    getInitialDate(): Date | string | number {\n        return this.configuration?.initialDate ?? new Date();\n    }\n\n    getBuffer(): number{\n        return this.configuration?.timelineSettings?.buffer ?? 4;\n    }\n\n    // timeline settings\n    private getTimelineSettings() {\n        return this.configuration?.timelineSettings ?? ({} as any);\n    }\n\n    getTimelineUnitSize(): number {\n        const ts = this.getTimelineSettings();\n        return ts?.timelineUnitSize ?? 50;\n    }\n\n    getWeekStartDay(): number {\n        const ts = this.getTimelineSettings();\n        return ts?.weekStartDay ?? 0;\n    }\n\n    isShowWeekend(): boolean {\n        const ts = this.getTimelineSettings();\n        return ts?.showWeekend ?? true;\n    }\n\n    getTimelineViewMode(): any {\n        const ts = this.getTimelineSettings();\n        return ts?.timelineViewMode ?? 'week';\n    }\n\n    getTimezone(): string | null {\n        const ts = this.getTimelineSettings();\n        const timezone = ts?.timezone;\n        if (timezone === 'system' || timezone === undefined || timezone === null) {\n            return null; // null means use system timezone\n        }\n        return timezone;\n    }\n\n    // timeline tiers\n    getTopTier(): any {\n        const ts = this.getTimelineSettings();\n        return ts?.topTier ?? {};\n    }\n\n    getBottomTier(): any {\n        const ts = this.getTimelineSettings();\n        return ts?.bottomTier ?? {};\n    }\n\n    getActionRenderer() : (new() => IActionRenderer) {\n        return this.configuration.actionRenderer;\n    }\n\n    getActionRendererParams() : Object | null {\n        return this.configuration.actionRendererParams ?? null;\n    }\n\n    getHookEvents() : IGridEventHandlers {\n        return this.configuration?.events ?? {};\n    }\n\n    getCurrentTimeIndicatorRenderer() : new () => IRenderer | null {\n        return this.configuration?.currentTimeIndicatorRenderer ?? null;\n    }\n\n    isEndDatePrioritizedForMilestone(): boolean {\n        return this.configuration?.isEndDatePrioritizedForMilestone ?? false;\n    }\n\n    isFlexibleMilestone(): boolean {\n        return this.configuration?.enableFlexibleMilestone ?? false;\n    }\n    \n    getTimeLineWidth(): number {\n        const ts = this.getTimelineSettings();\n        return ts?.timeLineWidth ?? 40;\n    }\n\n    getMilestoneWidth(): number {\n        return this.configuration?.milestoneWidth ?? 40;\n    }\n\n    isAllDayFillMode(): boolean {\n        return this.configuration?.enableAllDayFillMode ?? false;\n    }\n\n    // tooltip formatters\n    getTooltipFormatters(): ITooltipFormatters | null {\n        return this.configuration?.tooltipFormatters ?? null;\n    }\n\n    getFormatterForStartDateResize(): ((formatter: (timestamp: number, format: string) => string, startTimestamp: timestamp, endTimestamp: timestamp) => ITooltipFormatterResult) | null {\n        return this.configuration?.tooltipFormatters?.formatterForStartDateResize ?? null;\n    }\n\n    getFormatterForEndDateResize(): ((formatter: (timestamp: number, format: string) => string, startTimestamp: timestamp, endTimestamp: timestamp) => ITooltipFormatterResult) | null {\n        return this.configuration?.tooltipFormatters?.formatterForEndDateResize ?? null;\n    }\n\n    getFormatterForDragAndDrop(): ((formatter: (timestamp: number, format: string) => string, startTimestamp: timestamp, endTimestamp: timestamp) => ITooltipDragFormatterResult) | null {\n        return this.configuration?.tooltipFormatters?.formatterForDragAndDrop ?? null;\n    }\n\n    getFormatterForDragToSchedule(): ((formatter: (timestamp: number, format: string) => string, startTimestamp: timestamp, endTimestamp: timestamp) => ITooltipDragFormatterResult) | null {\n        return this.configuration?.tooltipFormatters?.formatterForDragToSchedule ?? null;\n    }\n\n    \n}","import { AutoWired, Bean, BEAN_NAME, Context, EventEmitter, EventHandler } from \"@dg/corecomponent\";\nimport { GANTT_BEAN_NAME } from \"../../Constant/GanttBeanNameConstant\";\nimport { Events } from \"../../../Grid/Core/Constants/Events\";\nimport { GRID_BEAN_NAME } from \"../../../Grid/Core/Constants/BeanName\";\nimport { IDataUpdateHookParams } from \"../../../Grid/API/CellAPI/Interface/ICellHookAction\";\nimport { IGanttPaginationApi } from \"../../Api/IGanttPaginationApi\";\nimport { IDateUtils } from \"../../../Utils/IDateUtils\";\nimport { GanttController } from \"../GanttComponent/GanttController\";\n// import { IDataUpdateHookParams } from \"../../../Grid/API/CellAPI/Interface/ICellHookAction\";\n\n@Bean(GANTT_BEAN_NAME.VIEWS_COMMUNICATION_HANDLER)\nexport class ViewsCommunicationHandler extends EventEmitter {\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) private ganttViewHookManager;\n    @AutoWired(GANTT_BEAN_NAME.PAGINATION_API) private paginationApi: IGanttPaginationApi;\n    @AutoWired(GANTT_BEAN_NAME.DATE_UTILS) private dateUtils: IDateUtils;\n\n    private infoPanelContext   : Context;\n    private ganttPanelContext  : Context;\n    private infoPanelInstance  : any;\n    private ganttPanelInstance : any;\n    onInfoPanelListenersDestroy: () => void;\n    onGanttPanelListenersDestroy: () => void;\n\n    setContext(infoPanelContext: Context, ganttPanelContext: Context) {\n        this.infoPanelContext = infoPanelContext;\n        this.ganttPanelContext = ganttPanelContext;\n\n        this.addGanttPanelListeners();\n        this.addInfoPanelListeners();\n    }\n\n    setPanelInstance(infoPanelInstance: any, ganttPanelInstance: any) {\n        this.infoPanelInstance = infoPanelInstance;\n        this.ganttPanelInstance = ganttPanelInstance;\n    }\n\n    private addGanttPanelListeners() : void {\n        const ganttPanelEventHandler = this.ganttPanelContext.getBean(BEAN_NAME.EVENT_HANDLER);\n        const ganttPanelMeta = {\n            eventHandler   : ganttPanelEventHandler,\n            currentContext : this.ganttPanelContext,\n            otherContext   : this.infoPanelContext,\n            apiHandler     : this.ganttPanelContext.getBean(GRID_BEAN_NAME.API_HANDLER),\n            hookManager    : this.ganttPanelContext.getBean(GRID_BEAN_NAME.HOOK_MANAGER)\n        };\n\n        const ganttapiHandler = GanttController.getGanttBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER);\n\n        const onDestroyGanttPanelListeners = this.addCommonListenersToEventHandler(ganttPanelMeta.eventHandler, ganttPanelMeta.currentContext, () => this.infoPanelContext);\n\n        const onBeforeDataUpdateListener = (params: IDataUpdateHookParams) => {\n            this.onBeforeDataUpdate({...params, ...ganttPanelMeta},ganttapiHandler);\n        }\n\n        const onAfterRowDeleteListener = (params: IDataUpdateHookParams) => {\n            this.onAfterRowDelete({...params, ...ganttPanelMeta});\n        }\n\n        const onAfterRowInsertListener = (params: IDataUpdateHookParams) => {\n            this.onAfterRowInsert({...params, ...ganttPanelMeta});\n        }\n\n        ganttPanelMeta.hookManager.addHook('onBeforeDataUpdate', onBeforeDataUpdateListener, true);\n        ganttPanelMeta.hookManager.addHook('onAfterRowRemove', onAfterRowDeleteListener, true);\n        ganttPanelMeta.hookManager.addHook('onAfterRowInsert', onAfterRowInsertListener, true);\n        ganttPanelMeta.eventHandler.addEventListener('onGridScrollReady', (params)=>{\n            this.ganttViewHookManager.executeAfterHook('onGridScrollReady', params)\n        }, true);\n\n\n        this.onGanttPanelListenersDestroy = () => {\n            onDestroyGanttPanelListeners();\n            ganttPanelMeta.hookManager.removeHooks(['onBeforeDataUpdate', 'onAfterRowRemove', 'onAfterRowInsert']);\n        }\n    }\n\n    private addInfoPanelListeners() : void {\n        const infoPanelEventHandler = this.infoPanelContext.getBean(BEAN_NAME.EVENT_HANDLER);\n\n        const infoPanelMeta = {\n            eventHandler   : infoPanelEventHandler,\n            currentContext : this.infoPanelContext,\n            otherContext   : this.ganttPanelContext,\n            apiHandler     : this.infoPanelContext.getBean(GRID_BEAN_NAME.API_HANDLER),\n            hookManager    : this.infoPanelContext.getBean(GRID_BEAN_NAME.HOOK_MANAGER)\n        };\n\n        const onDestroyInfoPanelListeners = this.addCommonListenersToEventHandler(infoPanelMeta.eventHandler, infoPanelMeta.currentContext, () => this.ganttPanelContext);\n   \n        this.onInfoPanelListenersDestroy = () => {\n            onDestroyInfoPanelListeners();\n        }\n\n    }\n\n    refreshGanttPanelListeners() {\n        this.onGanttPanelListenersDestroy && this.onGanttPanelListenersDestroy();\n        this.addGanttPanelListeners();\n    }\n\n    refreshInfoPanelListeners() {\n        this.onInfoPanelListenersDestroy && this.onInfoPanelListenersDestroy();\n        this.addInfoPanelListeners();\n    }\n\n    private addCommonListenersToEventHandler(eventHandler: EventHandler, currentContext: Context, getOtherContext: () => Context) {\n        const otherContext         = getOtherContext();\n        const currentScrollHandler = currentContext.getBean(GRID_BEAN_NAME.CONTROLLER_HANDLER).getBodyScrollHandler();\n        const otherScrollHandler   = otherContext.getBean(GRID_BEAN_NAME.CONTROLLER_HANDLER).getBodyScrollHandler();\n\n\n        const rowExpandListener = (param: any) => {\n            this.onRowExpanded({...param, currentContext, otherContext : getOtherContext()});\n        }\n        const rowCollapsedListener = (param: any) => {\n            this.onRowCollapsed({...param, currentContext, otherContext : getOtherContext()});\n        }\n        const rowEnterListener = (param: any) => {\n            this.onRowEnter({...param, currentContext, otherContext : getOtherContext()});\n        }\n        const rowLeaveListener = (param: any) => {\n            this.onRowLeave({...param, currentContext, otherContext : getOtherContext()});\n        }\n        const verticalScrollListener = (param: any) => {\n            this.onVerticalScroll({...param, currentContext, otherContext, currentScrollHandler, otherScrollHandler});\n        }\n        const taskBarGrabStartedListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_GRAB_STARTED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarGrabEndedListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_GRAB_ENDED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarResizeStartedListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_RESIZE_STARTED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarResizeEndedListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_RESIZE_ENDED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarGrabCancelledListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_GRAB_CANCELLED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarResizeCancelledListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_RESIZE_CANCELLED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarPointerDragStartedListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_POINTER_DRAG_STARTED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarPointerDragEndedListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_POINTER_DRAG_ENDED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarPointerDragCancelledListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_POINTER_DRAG_CANCELLED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarScheduleStartedListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_SCHEDULE_STARTED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarScheduleEndedListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_SCHEDULE_ENDED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const taskBarScheduleCancelledListener = (param: any) => {\n            this.dispatchTaskBarEvent(Events.EVENT_TASK_BAR_SCHEDULE_CANCELLED, {...param, currentContext, otherContext : getOtherContext()});\n        }\n        const onDestroyListener = () => {\n            eventHandler.removeEventListener(Events.EVENT_ROW_EXPANDED, rowExpandListener, true);\n            eventHandler.removeEventListener(Events.EVENT_ROW_COLLAPSED, rowCollapsedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_ROW_ENTER, rowEnterListener, false);\n            eventHandler.removeEventListener(Events.EVENT_ROW_LEAVE, rowLeaveListener, false);\n            eventHandler.removeEventListener(Events.EVENT_VERTICAL_SCROLL, verticalScrollListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_GRAB_STARTED, taskBarGrabStartedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_GRAB_ENDED, taskBarGrabEndedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_RESIZE_STARTED, taskBarResizeStartedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_RESIZE_ENDED, taskBarResizeEndedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_GRAB_CANCELLED, taskBarGrabCancelledListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_RESIZE_CANCELLED, taskBarResizeCancelledListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_POINTER_DRAG_STARTED, taskBarPointerDragStartedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_POINTER_DRAG_ENDED, taskBarPointerDragEndedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_POINTER_DRAG_CANCELLED, taskBarPointerDragCancelledListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_SCHEDULE_STARTED, taskBarScheduleStartedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_SCHEDULE_ENDED, taskBarScheduleEndedListener, true);\n            eventHandler.removeEventListener(Events.EVENT_TASK_BAR_SCHEDULE_CANCELLED, taskBarScheduleCancelledListener, true);\n        }\n\n\n        eventHandler.addEventListener(Events.EVENT_ROW_EXPANDED, rowExpandListener, true);\n        eventHandler.addEventListener(Events.EVENT_ROW_COLLAPSED, rowCollapsedListener, true);\n        eventHandler.addEventListener(Events.EVENT_ROW_ENTER, rowEnterListener, false);\n        eventHandler.addEventListener(Events.EVENT_ROW_LEAVE, rowLeaveListener, false);\n        eventHandler.addEventListener(Events.EVENT_VERTICAL_SCROLL, verticalScrollListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_GRAB_STARTED, taskBarGrabStartedListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_GRAB_ENDED, taskBarGrabEndedListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_RESIZE_STARTED, taskBarResizeStartedListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_RESIZE_ENDED, taskBarResizeEndedListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_GRAB_CANCELLED, taskBarGrabCancelledListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_RESIZE_CANCELLED, taskBarResizeCancelledListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_POINTER_DRAG_STARTED, taskBarPointerDragStartedListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_POINTER_DRAG_ENDED, taskBarPointerDragEndedListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_POINTER_DRAG_CANCELLED, taskBarPointerDragCancelledListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_SCHEDULE_STARTED, taskBarScheduleStartedListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_SCHEDULE_ENDED, taskBarScheduleEndedListener, true);\n        eventHandler.addEventListener(Events.EVENT_TASK_BAR_SCHEDULE_CANCELLED, taskBarScheduleCancelledListener, true);    \n\n\n\n        return onDestroyListener;\n    }\n    private dispatchTaskBarEvent(eventType: string, param: any) {\n        this.dispatchEvent({\n            type: eventType,\n            param: param\n        });\n    }\n\n    private onVerticalScroll(param: any) {\n        const {scrollTop, currentScrollHandler, otherScrollHandler} = param;\n\n        // currentScrollHandler.setScrollTop(scrollTop);\n        otherScrollHandler.setVerticalScrollPosition(currentScrollHandler.getScrollTop());\n        otherScrollHandler.onVScroll(scrollTop);\n    }\n\n    private onBeforeDataUpdate(params: any, ganttapiHandler: any) : void{\n        const rowApi = params.apiHandler.getRowAPI();\n        const changedKeys = {};\n\n        //loop for finding changed keys\n        params.values.forEach(val=>{\n\n            const datas = val.data[0];\n            const rowIds =  Object.keys(datas);\n            rowIds.forEach(id=>{\n                const oldData = rowApi.getRowNodeById(id)?.getRowData();\n                const newData = datas[id];\n                \n                //compare taskName, startDate, endDate, progress\n                ['taskName', 'startDate', 'endDate', 'progress'].forEach(key=>{\n                    if(oldData[key] !== newData[key]){\n                        changedKeys[key] = changedKeys[key] || [];\n                        changedKeys[key].push({\n                            rowId    : id,\n                            oldValue : oldData[key],\n                            newValue : newData[key]\n                        });\n                    }\n                })\n\n                //comapare dependencies since dependencies is an array of objects need to tell only which dependency is changed\n                const oldDependencies = oldData.dependencies ?? [];\n                const newDependencies = newData.dependencies ?? [];\n                const loopCount = Math.max(oldDependencies.length, newDependencies.length);\n                for(let i = 0; i < loopCount; i++){\n                    const oldDependency = oldDependencies[i];\n                    const newDependency = newDependencies[i];\n                    if( !oldDependency || !newDependency || oldDependency.taskID !== newDependency.taskID || oldDependency.connectionType !== newDependency.connectionType || oldDependency.type !== newDependency.type){\n                        if(!changedKeys['dependencies']){\n                            changedKeys['dependencies']= [];\n                        }\n                        changedKeys['dependencies'].push({\n                            rowId         : id,\n                            oldDependency : oldDependency ? oldDependency : null,\n                            newDependency : newDependency\n                        });\n                    }\n                }\n            })\n        })\n\n        //now dispatch the event\n        const keys = Object.keys(changedKeys);\n        keys.forEach(key=>{\n            const metas = changedKeys[key];\n            switch(key){\n                case 'taskName':\n                    this.ganttViewHookManager.executeAfterHook('onBeforeTaskNameChange', {metas, event : params.event, eventOrigin : params.eventOrigin, apiHandler: ganttapiHandler });\n                    break;\n                case 'startDate':\n                    this.ganttViewHookManager.executeAfterHook('onBeforeStartDateChange', {metas, event : params.event, eventOrigin : params.eventOrigin , apiHandler: ganttapiHandler});\n                    break;\n                case 'endDate':\n                    this.ganttViewHookManager.executeAfterHook('onBeforeEndDateChange', {metas, event : params.event, eventOrigin : params.eventOrigin , apiHandler: ganttapiHandler});\n                    break;\n                case 'progress':\n                    this.ganttViewHookManager.executeAfterHook('onBeforeProgressChange', {metas, event : params.event, eventOrigin : params.eventOrigin , apiHandler: ganttapiHandler});\n                    break;\n                case 'dependencies':\n                    this.ganttViewHookManager.executeAfterHook('onBeforeDependenciesChange', {metas, event : params.event, eventOrigin : params.eventOrigin , apiHandler: ganttapiHandler});\n                    break;\n            }\n        })\n    }\n\n    private onAfterRowDelete(params: any) : void{\n        this.ganttViewHookManager.executeAfterHook('onAfterRowRemove', params);\n    }\n\n    private onAfterRowInsert(params: any) : void{\n        this.ganttViewHookManager.executeAfterHook('onAfterRowInsert', params);\n    }\n\n    private onRowEnter(param: any) {\n        const {controller, otherContext} = param;\n        const rowIndex = controller.rowNode.getIndex();\n        const rowController = otherContext.getBean(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER).getRowControllerByIndex(rowIndex);\n        if (rowController) {\n            rowController.onRowEnter();\n        }\n    }\n\n    private onRowLeave(param: any) {\n        const {controller, otherContext} = param;\n        const rowIndex = controller.rowNode.getIndex();\n        const rowController = otherContext.getBean(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER).getRowControllerByIndex(rowIndex);\n        if (rowController) {\n            rowController.onRowLeave();\n        }\n    }\n\n\n    private onRowExpanded(param: any) {\n        const {node} = param;\n        const recordHandler = param.otherContext.getBean(GRID_BEAN_NAME.RECORD_HANDLER);\n        const rowNode = recordHandler.getRowNodeById(node.id);\n        if (rowNode) {\n            rowNode.expand();\n        }\n        this.dispatchEvent({\n            type: Events.EVENT_ROW_EXPANDED,\n            node: rowNode\n        });\n    }\n\n    private onRowCollapsed(param: any) {\n        const {node} = param;\n        const recordHandler = param.otherContext.getBean(GRID_BEAN_NAME.RECORD_HANDLER);\n        const rowNode = recordHandler.getRowNodeById(node.id);\n        if (rowNode) {\n            rowNode.collapse();\n        }\n        this.dispatchEvent({\n            type: Events.EVENT_ROW_COLLAPSED,\n            node: rowNode\n        });\n    }\n\n    getInfoPanelContext() {\n        return this.infoPanelContext;\n    }\n\n    getGanttPanelContext() {\n        return this.ganttPanelContext;\n    }\n\n    getInfoPanelInstance() {\n        return this.infoPanelInstance;\n    }\n\n    getGanttPanelInstance() {\n        return this.ganttPanelInstance;\n    }\n\n    getGanttPanelBeanFromBeanName(beanName: string) {\n        return this.ganttPanelContext.getBean(beanName);\n    }\n\n    getInfoPanelBeanFromBeanName(beanName: string) {\n        return this.infoPanelContext.getBean(beanName);\n    }\n\n    updateGanttPanelInstance(newGanttPanelInstance: any) {\n        this.ganttPanelInstance = newGanttPanelInstance;\n        // Update the gantt panel context reference\n        if (newGanttPanelInstance && this.ganttPanelContext) {\n            // The context is already set via the getGanttContext callback\n            // We just need to update the instance reference\n        }\n    }\n\n    updateGanttPanelMeta(ganttPanelContext ?: Context, ganttPanelInstance ?: any) {\n        this.ganttPanelContext  = ganttPanelContext;\n        this.ganttPanelInstance = ganttPanelInstance;\n        this.refreshInfoPanelListeners();\n        this.refreshGanttPanelListeners();\n    }\n\n    updateInfoPanelMeta(infoPanelContext ?: Context, infoPanelInstance ?: any) {\n        this.infoPanelContext  = infoPanelContext;\n        this.infoPanelInstance = infoPanelInstance;\n        this.refreshInfoPanelListeners();\n        this.refreshGanttPanelListeners();\n    }\n\n    goToTask(taskId:string ): void {\n        const rowNode   = this.infoPanelInstance.rowAPI.getRowNodeById(taskId);\n        const taskData  = rowNode.getRowData();\n        const isMilestone = rowNode.isMilestone();\n        let startDate;\n\n        if(isMilestone && this.optionsHandler.isEndDatePrioritizedForMilestone()){\n            startDate = rowNode.getEndDate();\n            if(this.optionsHandler.isAllDayFillMode()){\n                startDate = this.dateUtils.getEndOfDayForUTCTimestampAsTimestamp(startDate);\n            }\n\n        }else{\n            startDate = rowNode.getStartDate();\n        }\n\n\n        if(startDate){\n            if(isMilestone){\n                const milestoneWidth = this.optionsHandler.getMilestoneWidth();\n                this.paginationApi.goToDate(startDate, -milestoneWidth);\n            }else{\n                this.paginationApi.goToDate(startDate, -10);\n            }\n        }\n        \n        \n\n        // Navigate to task in info panel\n        if (this.infoPanelInstance && this.infoPanelInstance.rowAPI && this.infoPanelInstance.listNavigationAPI) {\n            // Using type assertion since getIndexById exists in implementation but not in interface\n            const rowMeta = (this.infoPanelInstance.rowAPI as any).getIndexById(taskData.taskID);\n            if (rowMeta && rowMeta.rowIndex !== null && rowMeta.rowIndex !== undefined) {\n                if (rowMeta.pinPosition === 'middle' || !rowMeta.pinPosition) {\n                    this.infoPanelInstance.listNavigationAPI.ensureIndexVisible(rowMeta.rowIndex);\n                }\n            }\n        }\n\n        // Navigate to task in gantt panel\n        if (this.ganttPanelInstance && this.ganttPanelInstance.rowAPI && this.ganttPanelInstance.navigationAPI) {\n            // Using type assertion since getIndexById exists in implementation but not in interface\n            const rowMeta = (this.ganttPanelInstance.rowAPI as any).getIndexById(taskData.taskID);\n            if (rowMeta && rowMeta.rowIndex !== null && rowMeta.rowIndex !== undefined) {\n                if (rowMeta.pinPosition === 'middle' || !rowMeta.pinPosition) {\n                    this.ganttPanelInstance.navigationAPI.ensureIndexVisible(rowMeta.rowIndex);\n                }\n            }\n        }\n\n    }\n\n\n\n}","import {  AutoWired, Bean, BEAN_NAME, PostConstruct } from \"@dg/corecomponent\";\nimport { IDateRange, IGanttPaginationController, IPaginationChangeParams } from \"./IPaginationController\";\nimport { GANTT_BEAN_NAME } from \"../../Constant/GanttBeanNameConstant\";\nimport { GanttOptionsHandler } from \"../OptionsHandler/GanttOptionsHandler\";\nimport { ITaskData, IUnit, timestamp } from \"../../IGanttConfiguration\";\nimport { IDateUtils } from \"Utils/IDateUtils\";\nimport { GridMain } from \"../../../Grid/Main\";\nimport { GRID_BEAN_NAME } from \"../../../Grid/Core/Constants/BeanName\";\nimport { IControllerHandler } from \"../../../Grid/Core/Interface/IControllerHandler\";\nimport { GanttConfigParser } from \"../GanttComponent/GanttConfigParser\";\nimport { ViewsCommunicationHandler } from \"../OptionsHandler/viewsCommunicationHandler\";\nimport { Context } from \"@dg/corecomponent\";\nimport { IGanttDateComputationEngine } from \"../GanttDateComputationEngine/IGanttDateComputationEngine\";\nimport { DateUtils } from \"../../../Utils/DateUtils\";\nexport const VIEW_TYPE = {\n\tDAY    : 'day',\n\tMONTH  : 'month',\n\tWEEK   : 'week',\n\tYEAR   : 'year',\n\tQUARTER: 'quarter'\n}\n\n@Bean(GANTT_BEAN_NAME.PAGINATION_CONTROLLER)\nexport class GanttPaginationController implements IGanttPaginationController{\n\t\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionHandler : GanttOptionsHandler;\n    @AutoWired(GANTT_BEAN_NAME.DATE_UTILS) dateUtils :IDateUtils\n\t@AutoWired(GANTT_BEAN_NAME.GANTT_DATE_COMPUTATION_ENGINE) dateComputationEngine : IGanttDateComputationEngine;\n   \n    private buffer : number;\n    private initialDate : number; // GMT timestamp\n    private timelineView : IUnit\n\n    private currentStartDate: number; // GMT timestamp\n    private currentEndDate  : number; // GMT timestamp\n\n    private dateRange :IDateRange\n\n\tprivate ganttPanel: GridMain | null = null;\n\tprivate ganttPanelGui: HTMLElement | null = null;\n\tprivate configParser: GanttConfigParser | null = null;\n\tprivate viewsCommunicationHandler: ViewsCommunicationHandler | null = null;\n\tprivate getGanttContextCallback: ((context: Context) => void) | null = null;\n\tprivate changeViewTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\tprivate goToDateTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\tprivate paginationScrollTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n\n\tprivate currentProjectStartDate: number; // GMT timestamp\n\tprivate currentProjectEndDate  : number; // GMT timestamp\n\n\tprivate currentProjectDateRange : IDateRange\n\n\tprivate dateUtilsInstance : IDateUtils;\n\n\tprivate get pageSize(): number {\n\t\t// this.buffer is (getBuffer() ?? 0) - 1; total visible units = buffer + 1\n\t\treturn (this.buffer ?? 0) + 1;\n\t}\n\n\tprivate timelineWidth :  number ;\n\n\tgetCurrentTimelineView():IUnit{\n\t\treturn this.timelineView;\n\t}\n\n\t// Constants for timestamp calculations\n\tprivate readonly MS_PER_DAY = 24 * 60 * 60 * 1000;\n\tprivate readonly MS_PER_HOUR = 60 * 60 * 1000;\n\n\t// Helper functions for GMT timestamp calculations\n\tprivate getUTCTimestamp(date: Date | string | number): number {\n\t\tif (typeof date === 'number') {\n\t\t\treturn date; // Already a timestamp\n\t\t}\n\t\t// Convert to GMT timestamp\n\t\tconst dateObj = typeof date === 'string' ? new Date(date) : date;\n\t\treturn dateObj.getTime(); // getTime() returns UTC timestamp\n\t}\n\n\t/**\n\t * Convert UTC timestamp to timezone-aware timestamp\n\t * Interprets the UTC timestamp as if it were a local time in the given timezone,\n\t * then converts it back to UTC timestamp for calculations\n\t * @param utcTimestamp - UTC timestamp to convert\n\t * @param timezone - IANA timezone string or null for system timezone\n\t * @returns Timestamp representing the UTC timestamp interpreted as local time in the given timezone\n\t */\n\t// private convertUTCToTimezoneTimestamp(utcTimestamp: number, timezone: string | null): number {\n\t// \t// Parse the UTC timestamp to get date components\n\t// \tconst utcDate = new Date(utcTimestamp);\n\t// \tconst year = utcDate.getUTCFullYear();\n\t// \tconst month = utcDate.getUTCMonth() + 1; // Luxon uses 1-12 for months\n\t// \tconst day = utcDate.getUTCDate();\n\t// \tconst hour = utcDate.getUTCHours();\n\t// \tconst minute = utcDate.getUTCMinutes();\n\t// \tconst second = utcDate.getUTCSeconds();\n\t// \tconst millisecond = utcDate.getUTCMilliseconds();\n\t\t\n\t// \t// Create a DateTime in the target timezone with the same date/time components\n\t// \t// This interprets the UTC timestamp components as if they were in the target timezone\n\t// \tlet timezoneDateTime: DateTime;\n\t// \tif (timezone && timezone !== 'system') {\n\t// \t\t// Create DateTime in the specified timezone\n\t// \t\ttimezoneDateTime = DateTime.fromObject(\n\t// \t\t\t{ year, month, day, hour, minute, second, millisecond },\n\t// \t\t\t{ zone: timezone }\n\t// \t\t);\n\t// \t} else {\n\t// \t\t// Use system timezone (local)\n\t// \t\ttimezoneDateTime = DateTime.fromObject(\n\t// \t\t\t{ year, month, day, hour, minute, second, millisecond },\n\t// \t\t\t{ zone: 'local' }\n\t// \t\t);\n\t// \t}\n\t\t\n\t// \t// Return the UTC timestamp representing this moment in time\n\t// \treturn timezoneDateTime.toMillis();\n\t// }\n\n\tprivate getStartOfMonthGMT(timestamp: number): number {\n\t\tconst date = new Date(timestamp);\n\t\treturn Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1, 0, 0, 0, 0);\n\t}\n\n\tprivate getEndOfMonthGMT(timestamp: number): number {\n\t\tconst date = new Date(timestamp);\n\t\tconst year = date.getUTCFullYear();\n\t\tconst month = date.getUTCMonth();\n\t\tconst lastDay = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n\t\treturn Date.UTC(year, month, lastDay, 23, 59, 59, 999);\n\t}\n\n\tprivate getStartOfDayGMT(timestamp: number): number {\n\t\tconst date = new Date(timestamp);\n\t\treturn Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 0, 0, 0, 0);\n\t}\n\n\tprivate getEndOfDayGMT(timestamp: number): number {\n\t\tconst date = new Date(timestamp);\n\t\treturn Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), 23, 59, 59, 999);\n\t}\n\n\t/**\n\t * Returns the start of the calendar day (00:00:00) as a timestamp,\n\t * based on the given timestamp's timezone context (local timezone).\n\t * Uses timestamp-based calculations instead of native Date objects.\n\t * @param timestamp - The timestamp to get the start of day for\n\t * @returns The timestamp representing 00:00:00 in the local timezone\n\t */\n\t getStartOfDayLocal(timestamp: number): number {\n\t\t// Get timezone offset in milliseconds (getTimezoneOffset returns minutes, positive means behind UTC)\n\t\tconst timezoneOffsetMs = new Date(timestamp).getTimezoneOffset() * 60 * 1000;\n\t\t\n\t\t// Convert UTC timestamp to local time timestamp\n\t\tconst localTimestamp = timestamp - timezoneOffsetMs;\n\t\t\n\t\t// Calculate milliseconds since midnight in local timezone\n\t\t// Use modulo to get remainder after dividing by MS_PER_DAY\n\t\tconst msSinceMidnight = ((localTimestamp % this.MS_PER_DAY) + this.MS_PER_DAY) % this.MS_PER_DAY;\n\t\t\n\t\t// Subtract milliseconds since midnight to get start of day in local timezone\n\t\t// Then convert back to UTC timestamp\n\t\treturn timestamp - msSinceMidnight;\n\t}\n\n\tprivate getStartOfWeekGMT(timestamp: number, weekStartDay: 'monday' | 'sunday'): number {\n\t\tconst date = new Date(timestamp);\n\t\tconst dayOfWeek = date.getUTCDay(); // 0 = Sunday, 1 = Monday, ..., 6 = Saturday\n\t\t\n\t\tlet daysToSubtract: number;\n\t\tif (weekStartDay === 'monday') {\n\t\t\tdaysToSubtract = dayOfWeek === 0 ? 6 : dayOfWeek - 1; // Monday is start\n\t\t} else {\n\t\t\tdaysToSubtract = dayOfWeek; // Sunday is start\n\t\t}\n\n\t\tconst startTimestamp = timestamp - (daysToSubtract * this.MS_PER_DAY);\n\t\treturn this.getStartOfDayGMT(startTimestamp);\n\t}\n\n\tprivate getEndOfWeekGMT(timestamp: number, weekStartDay: 'monday' | 'sunday'): number {\n\t\tconst startOfWeek = this.getStartOfWeekGMT(timestamp, weekStartDay);\n\t\treturn startOfWeek + (6 * this.MS_PER_DAY) + (this.MS_PER_DAY - 1); // End of Saturday or Sunday\n\t}\n\n\tprivate getStartOfYearGMT(timestamp: number): number {\n\t\tconst date = new Date(timestamp);\n\t\treturn Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0);\n\t}\n\n\tprivate getEndOfYearGMT(timestamp: number): number {\n\t\tconst date = new Date(timestamp);\n\t\treturn Date.UTC(date.getUTCFullYear(), 11, 31, 23, 59, 59, 999);\n\t}\n\n\tprivate getQuarterStartGMT(timestamp: number): number {\n\t\tconst date = new Date(timestamp);\n\t\tconst month = date.getUTCMonth();\n\t\tconst quarterStartMonth = Math.floor(month / 3) * 3;\n\t\treturn Date.UTC(date.getUTCFullYear(), quarterStartMonth, 1, 0, 0, 0, 0);\n\t}\n\n\tprivate addDaysGMT(timestamp: number, days: number): number {\n\t\treturn timestamp + (days * this.MS_PER_DAY);\n\t}\n\n\tprivate addWeeksGMT(timestamp: number, weeks: number): number {\n\t\treturn timestamp + (weeks * 7 * this.MS_PER_DAY);\n\t}\n\n\tprivate addMonthsGMT(timestamp: number, months: number): number {\n\t\tconst date = new Date(timestamp);\n\t\tconst newMonth = date.getUTCMonth() + months;\n\t\tconst newYear = date.getUTCFullYear() + Math.floor(newMonth / 12);\n\t\tconst finalMonth = ((newMonth % 12) + 12) % 12;\n\t\t// Handle day overflow (e.g., Jan 31 + 1 month = Feb 28/29)\n\t\tconst daysInMonth = new Date(Date.UTC(newYear, finalMonth + 1, 0)).getUTCDate();\n\t\tconst day = Math.min(date.getUTCDate(), daysInMonth);\n\t\treturn Date.UTC(newYear, finalMonth, day, date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());\n\t}\n\n\tprivate addYearsGMT(timestamp: number, years: number): number {\n\t\treturn this.addMonthsGMT(timestamp, years * 12);\n\t}\n\n\tprivate subtractDaysGMT(timestamp: number, days: number): number {\n\t\treturn timestamp - (days * this.MS_PER_DAY);\n\t}\n\n\tprivate subtractWeeksGMT(timestamp: number, weeks: number): number {\n\t\treturn timestamp - (weeks * 7 * this.MS_PER_DAY);\n\t}\n\n\tprivate subtractMonthsGMT(timestamp: number, months: number): number {\n\t\tconst date = new Date(timestamp);\n\t\tconst newMonth = date.getUTCMonth() - months;\n\t\tconst newYear = date.getUTCFullYear() + Math.floor(newMonth / 12);\n\t\tconst finalMonth = ((newMonth % 12) + 12) % 12;\n\t\t// Handle day overflow (e.g., Mar 31 - 1 month = Feb 28/29)\n\t\tconst daysInMonth = new Date(Date.UTC(newYear, finalMonth + 1, 0)).getUTCDate();\n\t\tconst day = Math.min(date.getUTCDate(), daysInMonth);\n\t\treturn Date.UTC(newYear, finalMonth, day, date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());\n\t}\n\n\tprivate subtractYearsGMT(timestamp: number, years: number): number {\n\t\treturn this.subtractMonthsGMT(timestamp, years * 12);\n\t}\n\n\tprivate daysBetweenGMT(startTimestamp: number, endTimestamp: number): number {\n\t\treturn Math.floor((endTimestamp - startTimestamp) / this.MS_PER_DAY);\n\t}\n\n\tprivate hoursBetweenGMT(startTimestamp: number, endTimestamp: number): number {\n\t\treturn Math.floor((endTimestamp - startTimestamp) / this.MS_PER_HOUR);\n\t}\n\n\tprivate monthsBetweenGMT(startTimestamp: number, endTimestamp: number): number {\n\t\tconst startDate = new Date(startTimestamp);\n\t\tconst endDate = new Date(endTimestamp);\n\t\tconst yearDiff = endDate.getUTCFullYear() - startDate.getUTCFullYear();\n\t\tconst monthDiff = endDate.getUTCMonth() - startDate.getUTCMonth();\n\t\treturn yearDiff * 12 + monthDiff;\n\t}\n\n\tprivate getDaysInMonthGMT(timestamp: number): number {\n\t\tconst date = new Date(timestamp);\n\t\treturn new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 0)).getUTCDate();\n\t}\n\n\tprivate isInRangeGMT(timestamp: number, startTimestamp: number, endTimestamp: number): boolean {\n\t\treturn timestamp >= startTimestamp && timestamp <= endTimestamp;\n\t}\n\n    @PostConstruct()\n    init(){\n\t\tthis.buffer = (this.optionHandler.getBuffer() ?? 0) -1;\n\t\tthis.dateUtilsInstance = new DateUtils();\n        // Convert initial date from UTC to configured timezone, then to GMT timestamp\n        const initialDateValue = this.optionHandler.getInitialDate() as number;\n\t\tconst timezone = this.optionHandler.getTimezone();\n\t\tconst convertedDateTime = this.dateUtilsInstance.convertUTCTimestampToTimezoneDateTime(initialDateValue, timezone);\n\t\tconst offset = convertedDateTime.offset;\n\t\tthis.initialDate = convertedDateTime.toMillis() + (offset * 60 * 1000);\n\n        this.timelineView = this.optionHandler.getTimelineViewMode();\n\t\tthis.timelineWidth = this.optionHandler.getTimeLineWidth();\n        this.setInitialRangeDates()\n    }\n\n    setInitialRangeDates(){\n\n\t\tif(this.timelineView === VIEW_TYPE.MONTH){\n\t\t\tthis.dateRange =  this.getRangeForMonthView();\n\t\t}else if(this.timelineView === VIEW_TYPE.WEEK){\n\t\t\tthis.dateRange = this.getRangeForWeekView();\n\t\t}else if(this.timelineView === VIEW_TYPE.DAY){\n\t\t\tthis.dateRange = this.getRangeForDayView();\n\t\t}else if(this.timelineView === VIEW_TYPE.YEAR){\n\t\t\tthis.dateRange = this.getRangeForYearView();\n\t\t}else if(this.timelineView === VIEW_TYPE.QUARTER){\n\t\t\tthis.dateRange = this.getRangeForQuarterView();\n\t\t}\n\n        // Store timestamps directly\n        this.currentStartDate = this.dateRange.from;\n        this.currentEndDate = this.dateRange.to;\n\t\t\n\t\tthis.updateProjectDateRange();\n\t\tthis.dateComputationEngine.updateCurrentProjectStartDate(this.currentProjectStartDate);\n\t\tthis.dateComputationEngine.updateTimelineWidth(this.timelineWidth);\n\t\tthis.dateComputationEngine.updateTimelineView(this.timelineView);\n    }\n    getDateRange(): IDateRange {\n        return this.dateRange\n        \n    }\n\n    getCurrentStartDate(): number {\n        return this.currentProjectStartDate;\n    }\n\tgetCurrentEndDate(): number {\n        return this.currentProjectEndDate;\n    }\n\n\tgetCurrentProjectStartDate():number{\n\t\treturn this.currentProjectStartDate;\n\t}\n\tgetCurrentProjectEndDate():number{\n\t\treturn this.currentProjectEndDate;\n\t}\n\n\tgetCurrentProjectDateRange():IDateRange{\n\t\treturn this.currentProjectDateRange\n\t}\n\n    getRangeForMonthView():IDateRange{\n\t\tconst startDate = this.getStartOfMonthGMT(this.initialDate);\n\t\tconst endDate = this.addMonthsGMT(startDate, this.buffer);\n        return {\n            from : startDate,\n            to : endDate\n        };\n    }\n\n\tgetRangeForWeekView(): IDateRange{\n\t\tconst weekStartPref = this.optionHandler.getWeekStartDay() === 1 ? 'monday' : 'sunday';\n\t\tconst startDate = this.getStartOfWeekGMT(this.initialDate, weekStartPref);\n\t\tconst endDate = this.addWeeksGMT(startDate, this.buffer);\n\t\treturn { from: startDate, to: endDate };\n\t}\n\n\tgetRangeForDayView(): IDateRange{\n\t\tconst startDate = this.getStartOfDayGMT(this.initialDate);\n\t\tconst endDate = this.addDaysGMT(startDate, this.buffer);\n\t\treturn { from: startDate, to: endDate };\n\t}\n\n\tgetRangeForYearView(): IDateRange{\n\t\tconst startDate = this.getStartOfYearGMT(this.initialDate);\n\t\tconst endDate = this.addYearsGMT(startDate, this.buffer);\n\t\treturn { from: startDate, to: endDate };\n\t}\n\n\tgetRangeForQuarterView(): IDateRange{\n\t\tconst quarterStart = this.getQuarterStartGMT(this.initialDate);\n\t\tconst visibleUnits = Math.max(this.pageSize - 1, 0);\n\t\tconst monthsToAdd = visibleUnits * 3;\n\t\tconst quarterEnd = this.addMonthsGMT(quarterStart, monthsToAdd);\n\t\treturn { from: quarterStart, to: quarterEnd };\n\t}\n\n\t// Helper methods that accept anchor date for view changes\n\tprivate getRangeForMonthViewWithAnchor(anchorTimestamp: number): IDateRange {\n\t\tconst startDate = this.getStartOfMonthGMT(anchorTimestamp);\n\t\tconst endDate = this.addMonthsGMT(startDate, this.buffer);\n\t\treturn { from: startDate, to: endDate };\n\t}\n\n\tprivate getRangeForWeekViewWithAnchor(anchorTimestamp: number): IDateRange {\n\t\tconst weekStartPref = this.optionHandler.getWeekStartDay() === 1 ? 'monday' : 'sunday';\n\t\tconst startDate = this.getStartOfWeekGMT(anchorTimestamp, weekStartPref);\n\t\tconst endDate = this.addWeeksGMT(startDate, this.buffer);\n\t\treturn { from: startDate, to: endDate };\n\t}\n\n\tprivate getRangeForDayViewWithAnchor(anchorTimestamp: number): IDateRange {\n\t\tconst startDate = this.getStartOfDayGMT(anchorTimestamp);\n\t\tconst endDate = this.addDaysGMT(startDate, this.buffer);\n\t\treturn { from: startDate, to: endDate };\n\t}\n\n\tprivate getRangeForYearViewWithAnchor(anchorTimestamp: number): IDateRange {\n\t\tconst startDate = this.getStartOfYearGMT(anchorTimestamp);\n\t\tconst endDate = this.addYearsGMT(startDate, this.buffer);\n\t\treturn { from: startDate, to: endDate };\n\t}\n\n\tprivate getRangeForQuarterViewWithAnchor(anchorTimestamp: number): IDateRange {\n\t\tconst quarterStart = this.getQuarterStartGMT(anchorTimestamp);\n\t\tconst visibleUnits = Math.max(this.pageSize - 1, 0);\n\t\tconst monthsToAdd = visibleUnits * 3;\n\t\tconst quarterEnd = this.addMonthsGMT(quarterStart, monthsToAdd);\n\t\treturn { from: quarterStart, to: quarterEnd };\n\t}\n\n    getFullRange(){\n\n        let dateRange: IDateRange ;\n        if(this.timelineView === VIEW_TYPE.MONTH){\n            dateRange =  this.getRangeForMonthView();\n        }\n\n        return dateRange\n    }\n\n    getArrayOfRange():number []{\n\t\tif(this.timelineView === VIEW_TYPE.MONTH){\n\t\t\tconst anchors: number[] = [];\n\t\t\tlet cursor = this.getStartOfMonthGMT(this.dateRange.from);\n\t\t\tconst endTimestamp = this.dateRange.to;\n\n\t\t\twhile(cursor <= endTimestamp){\n\t\t\t\tanchors.push(cursor);\n\t\t\t\tcursor = this.addMonthsGMT(cursor, 1);\n\t\t\t}\n\t\t\treturn anchors;\n\t\t}\n\t\tif(this.timelineView === VIEW_TYPE.WEEK){\n\t\t\tconst weekStartPref = this.optionHandler.getWeekStartDay() === 1 ? 'monday' : 'sunday';\n\t\t\tconst anchors: number[] = [];\n\t\t\tlet cursor = this.getStartOfWeekGMT(this.dateRange.from, weekStartPref);\n\t\t\tconst endTimestamp = this.dateRange.to;\n\n\t\t\twhile(cursor <= endTimestamp){\n\t\t\t\tanchors.push(cursor);\n\t\t\t\tcursor = this.addWeeksGMT(cursor, 1);\n\t\t\t}\n\t\t\treturn anchors;\n\t\t}\n\t\tif(this.timelineView === VIEW_TYPE.DAY){\n\t\t\tconst anchors: number[] = [];\n\t\t\tlet cursor = this.getStartOfDayGMT(this.dateRange.from);\n\t\t\tconst endTimestamp = this.dateRange.to;\n\n\t\t\twhile(cursor <= endTimestamp){\n\t\t\t\tanchors.push(cursor);\n\t\t\t\tcursor = this.addDaysGMT(cursor, 1);\n\t\t\t}\n\t\t\treturn anchors;\n\t\t}\n\t\tif(this.timelineView === VIEW_TYPE.YEAR){\n\t\t\tconst anchors: number[] = [];\n\t\t\tlet cursor = this.getStartOfYearGMT(this.dateRange.from);\n\t\t\tconst endTimestamp = this.dateRange.to;\n\n\t\t\twhile(cursor <= endTimestamp){\n\t\t\t\tanchors.push(cursor);\n\t\t\t\tcursor = this.addYearsGMT(cursor, 1);\n\t\t\t}\n\t\t\treturn anchors;\n\t\t}\n\t\tif(this.timelineView === VIEW_TYPE.QUARTER){\n\t\t\tconst anchors: number[] = [];\n\t\t\tlet cursor = this.getQuarterStartGMT(this.dateRange.from);\n\t\t\tconst endTimestamp = this.dateRange.to;\n\n\t\t\twhile(cursor <= endTimestamp){\n\t\t\t\tanchors.push(cursor);\n\t\t\t\tcursor = this.addMonthsGMT(cursor, 3);\n\t\t\t}\n\t\t\treturn anchors;\n\t\t}\n\t\treturn []\n\n    }\n\n\tsetGanttPanel(ganttPanel: GridMain, ganttPanelGui: HTMLElement, configParser: GanttConfigParser, viewsCommunicationHandler: ViewsCommunicationHandler, getGanttContextCallback: (context: Context) => void): void {\n\t\tthis.ganttPanel = ganttPanel;\n\t\tthis.ganttPanelGui = ganttPanelGui;\n\t\tthis.configParser = configParser;\n\t\tthis.viewsCommunicationHandler = viewsCommunicationHandler;\n\t\tthis.getGanttContextCallback = getGanttContextCallback;\n\t}\n\n\tprivate recreateGanttPanel(): void {\n\t\tif (!this.ganttPanel || !this.ganttPanelGui || !this.configParser || !this.viewsCommunicationHandler || !this.getGanttContextCallback) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst updatedRowNodes = this.ganttPanel.api.getAllRowNodes();\n\n\t\tconst updatedData = updatedRowNodes.map(rowNode => rowNode.getData() as ITaskData);\n\n\t\t\n\n\n\n\n\t\t// Destroy the existing grid\n\t\tif (this.ganttPanel.api && typeof (this.ganttPanel.api as any).destroyGrid === 'function') {\n\t\t\t(this.ganttPanel.api as any).destroyGrid();\n\t\t}\n\n\t\t// Get new configuration with updated date range\n\t\tconst { ganttViewPanelConfiguration } = this.configParser.parseGanttConfiguration();\n\t\tganttViewPanelConfiguration.rowData = updatedData;\n\n\t\t\n\t\t// Create new gantt panel with new date range\n\t\tlet ganttPanelContext = null;\n\n\t\tconst newGanttPanel = new GridMain(this.ganttPanelGui, ganttViewPanelConfiguration, {}, (context: Context) => ganttPanelContext = context);\n\t\t\n\t\t// Update references\n\t\tthis.ganttPanel = newGanttPanel;\n\n\t\t\n\t\t// Update ViewsCommunicationHandler with new panel instance\n\t\tthis.viewsCommunicationHandler.updateGanttPanelMeta(ganttPanelContext, newGanttPanel);\n\t}\n\n\tnextPage(params?: IPaginationChangeParams): IDateRange{\n\t\tlet newStart: number;\n\t\tlet newEnd: number;\n\t\tlet unitsToShift: number;\n\n\t\t// Determine units to shift based on params or default pageSize\n\t\tif (params?.buffer !== undefined && params.buffer !== null) {\n\t\t\tunitsToShift = params.buffer;\n\t\t} else {\n\t\t\tunitsToShift = this.pageSize;\n\t\t}\n\n\t\t// Determine which dates to use as anchor points\n\t\tlet currentStartDate: number;\n\t\tlet currentEndDate: number;\n\t\t\n\t\tif (params?.useViewportDate) {\n\t\t\t// Use current viewport date and calculate end date from it\n\t\t\tconst viewportDate = this.getCurrentViewPortDate();\n\t\t\tconst dateSpan = this.currentEndDate - this.currentStartDate;\n\t\t\tcurrentStartDate = viewportDate;\n\t\t\tcurrentEndDate = viewportDate + dateSpan;\n\t\t} else {\n\t\t\t// Use stored current start and end dates\n\t\t\tcurrentStartDate = this.currentStartDate;\n\t\t\tcurrentEndDate = this.currentEndDate;\n\t\t}\n\n\t\tconst effectiveUnit = params?.unit ?? this.timelineView;\n\n\t\tif (effectiveUnit === VIEW_TYPE.YEAR) {\n\t\t\tnewStart = this.addYearsGMT(currentStartDate, unitsToShift);\n\t\t\tnewEnd = this.addYearsGMT(currentEndDate, unitsToShift);\n\t\t} else if (effectiveUnit === VIEW_TYPE.MONTH) {\n\t\t\tnewStart = this.addMonthsGMT(currentStartDate, unitsToShift);\n\t\t\tnewEnd = this.addMonthsGMT(currentEndDate, unitsToShift);\n\t\t} else if (effectiveUnit === VIEW_TYPE.WEEK) {\n\t\t\tnewStart = this.addWeeksGMT(currentStartDate, unitsToShift);\n\t\t\tnewEnd = this.addWeeksGMT(currentEndDate, unitsToShift);\n\t\t} else if (effectiveUnit === VIEW_TYPE.DAY) {\n\t\t\tnewStart = this.addDaysGMT(currentStartDate, unitsToShift);\n\t\t\tnewEnd = this.addDaysGMT(currentEndDate, unitsToShift);\n\t\t} else if (effectiveUnit === VIEW_TYPE.QUARTER) {\n\t\t\tconst monthsToShift = unitsToShift * 3;\n\t\t\tnewStart = this.addMonthsGMT(currentStartDate, monthsToShift);\n\t\t\tnewEnd = this.addMonthsGMT(currentEndDate, monthsToShift);\n\t\t} else {\n\t\t\tnewStart = currentStartDate;\n\t\t\tnewEnd = currentEndDate;\n\t\t}\n\n\t\tthis.currentStartDate = newStart;\n\t\tthis.currentEndDate = newEnd;\n\t\tthis.dateRange = { from: newStart, to: newEnd };\n\n\t\tthis.updateProjectDateRange();\n\t\tthis.dateComputationEngine.updateCurrentProjectStartDate(this.currentProjectStartDate);\n\t\tthis.dateComputationEngine.updateTimelineWidth(this.timelineWidth);\n\n\t\t// Recreate gantt panel with new date range\n\t\tconst scrollPosition : { top : number, left : number } = this.ganttPanel.navigationAPI.getScrollPosition();\n\t\tthis.recreateGanttPanel();\n\n\t\tif (this.paginationScrollTimeoutId !== null) {\n\t\t\tclearTimeout(this.paginationScrollTimeoutId);\n\t\t\tthis.paginationScrollTimeoutId = null;\n\t\t}\n\n\t\tthis.paginationScrollTimeoutId = setTimeout(() => {\n\t\t\tthis.ganttPanel.navigationAPI.scrollBy(undefined, scrollPosition.top);\n\n\t\t\tif (params?.bufferPixels !== undefined && params.bufferPixels !== null && this.ganttPanel?.navigationAPI) {\n\t\t\t\tthis.ganttPanel.navigationAPI.scrollBy(params.bufferPixels, 0);\n\t\t\t}\n\n\t\t\tthis.paginationScrollTimeoutId = null;\n\t\t}, 1);\n\n\t\treturn this.dateRange;\n\t}\n\n\tpreviousPage(params?: IPaginationChangeParams): IDateRange{\n\t\tlet newStart: number;\n\t\tlet newEnd: number;\n\t\tlet unitsToShift: number;\n\n\t\t// Determine units to shift based on params or default pageSize\n\t\tif (params?.buffer !== undefined && params.buffer !== null) {\n\t\t\tunitsToShift = params.buffer;\n\t\t} else {\n\t\t\tunitsToShift = this.pageSize;\n\t\t}\n\n\t\t// Determine which dates to use as anchor points\n\t\tlet currentStartDate: number;\n\t\tlet currentEndDate: number;\n\t\t\n\t\tif (params?.useViewportDate) {\n\t\t\t// Use current viewport date and calculate end date from it\n\t\t\tconst viewportDate = this.getCurrentViewPortDate();\n\t\t\tconst dateSpan = this.currentEndDate - this.currentStartDate;\n\t\t\tcurrentStartDate = viewportDate;\n\t\t\tcurrentEndDate = viewportDate + dateSpan;\n\t\t} else {\n\t\t\t// Use stored current start and end dates\n\t\t\tcurrentStartDate = this.currentStartDate;\n\t\t\tcurrentEndDate = this.currentEndDate;\n\t\t}\n\n\t\tconst effectiveUnit = params?.unit ?? this.timelineView;\n\n\t\tif (effectiveUnit === VIEW_TYPE.YEAR) {\n\t\t\tnewStart = this.addYearsGMT(currentStartDate, -unitsToShift);\n\t\t\tnewEnd = this.addYearsGMT(currentEndDate, -unitsToShift);\n\t\t} else if (effectiveUnit === VIEW_TYPE.MONTH) {\n\t\t\tnewStart = this.addMonthsGMT(currentStartDate, -unitsToShift);\n\t\t\tnewEnd = this.addMonthsGMT(currentEndDate, -unitsToShift);\n\t\t} else if (effectiveUnit === VIEW_TYPE.WEEK) {\n\t\t\tnewStart = this.addWeeksGMT(currentStartDate, -unitsToShift);\n\t\t\tnewEnd = this.addWeeksGMT(currentEndDate, -unitsToShift);\n\t\t} else if (effectiveUnit === VIEW_TYPE.DAY) {\n\t\t\tnewStart = this.addDaysGMT(currentStartDate, -unitsToShift);\n\t\t\tnewEnd = this.addDaysGMT(currentEndDate, -unitsToShift);\n\t\t} else if (effectiveUnit === VIEW_TYPE.QUARTER) {\n\t\t\tconst monthsToShift = unitsToShift * 3;\n\t\t\tnewStart = this.addMonthsGMT(currentStartDate, -monthsToShift);\n\t\t\tnewEnd = this.addMonthsGMT(currentEndDate, -monthsToShift);\n\t\t} else {\n\t\t\tnewStart = currentStartDate;\n\t\t\tnewEnd = currentEndDate;\n\t\t}\n\n\t\tthis.currentStartDate = newStart;\n\t\tthis.currentEndDate = newEnd;\n\t\tthis.dateRange = { from: newStart, to: newEnd };\n\n\t\tthis.updateProjectDateRange();\n\t\tthis.dateComputationEngine.updateCurrentProjectStartDate(this.currentProjectStartDate);\n\t\tthis.dateComputationEngine.updateTimelineWidth(this.timelineWidth);\n\n\t\t// Recreate gantt panel with new date range\n\t\tconst scrollPosition : { top : number, left : number } = this.ganttPanel.navigationAPI.getScrollPosition();\n\t\tthis.recreateGanttPanel();\n\n\t\tif (this.paginationScrollTimeoutId !== null) {\n\t\t\tclearTimeout(this.paginationScrollTimeoutId);\n\t\t\tthis.paginationScrollTimeoutId = null;\n\t\t}\n\n\t\tthis.paginationScrollTimeoutId = setTimeout(() => {\n\t\t\tthis.ganttPanel.navigationAPI.scrollBy(undefined, scrollPosition.top);\n\n\t\t\tif (params?.bufferPixels !== undefined && params.bufferPixels !== null && this.ganttPanel?.navigationAPI) {\n\t\t\t\tthis.ganttPanel.navigationAPI.scrollBy(params.bufferPixels, 0);\n\t\t\t}\n\n\t\t\tthis.paginationScrollTimeoutId = null;\n\t\t}, 1);\n\n\t\treturn this.dateRange;\n\t}\n\n\tprivate updateProjectDateRange(): void {\n\t\tif (!this.dateRange) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Use timestamps directly for GMT calculations\n\t\tconst fromTimestamp = this.dateRange.from;\n\t\tconst toTimestamp = this.dateRange.to;\n\n\t\tif(this.timelineView === VIEW_TYPE.MONTH){\n\t\t\tthis.currentProjectStartDate = this.getStartOfMonthGMT(fromTimestamp);\n\t\t\tthis.currentProjectEndDate = this.getEndOfMonthGMT(toTimestamp);\n\t\t}else if(this.timelineView === VIEW_TYPE.WEEK){\n\t\t\tconst weekStartPref = this.optionHandler.getWeekStartDay() === 1 ? 'monday' : 'sunday';\n\t\t\tthis.currentProjectStartDate = this.getStartOfWeekGMT(fromTimestamp, weekStartPref);\n\t\t\tthis.currentProjectEndDate = this.getEndOfWeekGMT(toTimestamp, weekStartPref);\n\t\t}else if(this.timelineView === VIEW_TYPE.DAY){\n\t\t\tthis.currentProjectStartDate = this.getStartOfDayGMT(fromTimestamp);\n\t\t\tthis.currentProjectEndDate = this.getEndOfDayGMT(toTimestamp);\n\t\t}else if(this.timelineView === VIEW_TYPE.YEAR){\n\t\t\tthis.currentProjectStartDate = this.getStartOfYearGMT(fromTimestamp);\n\t\t\tthis.currentProjectEndDate = this.getEndOfYearGMT(toTimestamp);\n\t\t}else if(this.timelineView === VIEW_TYPE.QUARTER){\n\t\t\tconst firstQuarterStart = this.getQuarterStartGMT(fromTimestamp);\n\t\t\tconst lastQuarterStart = this.getQuarterStartGMT(toTimestamp);\n\t\t\tconst lastQuarterFinalMonthStart = this.addMonthsGMT(lastQuarterStart, 2);\n\t\t\tthis.currentProjectStartDate = firstQuarterStart;\n\t\t\tthis.currentProjectEndDate = this.getEndOfMonthGMT(lastQuarterFinalMonthStart);\n\t\t}else{\n\t\t\tthis.currentProjectStartDate = fromTimestamp;\n\t\t\tthis.currentProjectEndDate = toTimestamp;\n\t\t}\n\n\t\tthis.currentProjectDateRange = {\n\t\t\tfrom: this.currentProjectStartDate,\n\t\t\tto  : this.currentProjectEndDate\n\t\t};\n\t}\n\n\tchangeView(viewType: IUnit): IDateRange {\n\t\tif (this.changeViewTimeoutId !== null) {\n\t\t\tclearTimeout(this.changeViewTimeoutId);\n\t\t\tthis.changeViewTimeoutId = null;\n\t\t}\n\n\t\t// Validate view type\n\t\tif (!Object.values(VIEW_TYPE).includes(viewType)) {\n\t\t\tthrow new Error(`Invalid view type: ${viewType}. Must be one of: day, week, month, quarter, year`);\n\t\t}\n\n\t\t// Capture before any range or view-type mutation so scroll target stays valid for the new range\n\t\tconst targetDateBeforeViewSwitch = this.getCurrentViewPortDate();\n\n\t\t// Split buffer in half (before and after current date)\n\t\tconst halfBuffer = Math.floor(this.buffer / 2);\n\t\t\n\t\t// Calculate initialDate by subtracting half buffer from current date\n\t\t// This will be the anchor point for the range calculation\n\t\tlet anchorDate: number;\n\t\t\n\t\t// Update timeline view first to use correct calculations\n\t\tthis.timelineView = viewType as IUnit;\n\t\t\n\t\t// Subtract half buffer based on the new view type\n\t\tif (viewType === VIEW_TYPE.MONTH) {\n\t\t\tanchorDate = this.subtractMonthsGMT(targetDateBeforeViewSwitch, halfBuffer);\n\t\t\t// Round to start of month\n\t\t\tanchorDate = this.getStartOfMonthGMT(anchorDate);\n\t\t} else if (viewType === VIEW_TYPE.WEEK) {\n\t\t\tanchorDate = this.subtractWeeksGMT(targetDateBeforeViewSwitch, halfBuffer);\n\t\t} else if (viewType === VIEW_TYPE.DAY) {\n\t\t\tanchorDate = this.subtractDaysGMT(targetDateBeforeViewSwitch, halfBuffer);\n\t\t\t// Round to start of day\n\t\t\tanchorDate = this.getStartOfDayGMT(anchorDate);\n\t\t} else if (viewType === VIEW_TYPE.YEAR) {\n\t\t\tanchorDate = this.subtractYearsGMT(targetDateBeforeViewSwitch, halfBuffer);\n\t\t} else if (viewType === VIEW_TYPE.QUARTER) {\n\t\t\t// For quarter, subtract months (halfBuffer * 3 months per quarter)\n\t\t\tconst monthsToSubtract = halfBuffer * 3;\n\t\t\tanchorDate = this.subtractMonthsGMT(targetDateBeforeViewSwitch, monthsToSubtract);\n\t\t} else {\n\t\t\tanchorDate = targetDateBeforeViewSwitch;\n\t\t}\n\t\t\n\t\t// Set initialDate to the calculated anchor date\n\t\tthis.initialDate = anchorDate;\n\n\t\t// Calculate new date range based on the new view type using anchor date\n\t\tif (viewType === VIEW_TYPE.MONTH) {\n\t\t\tthis.dateRange = this.getRangeForMonthViewWithAnchor(anchorDate);\n\t\t} else if (viewType === VIEW_TYPE.WEEK) {\n\t\t\tthis.dateRange = this.getRangeForWeekViewWithAnchor(anchorDate);\n\t\t} else if (viewType === VIEW_TYPE.DAY) {\n\t\t\tthis.dateRange = this.getRangeForDayViewWithAnchor(anchorDate);\n\t\t} else if (viewType === VIEW_TYPE.YEAR) {\n\t\t\tthis.dateRange = this.getRangeForYearViewWithAnchor(anchorDate);\n\t\t} else if (viewType === VIEW_TYPE.QUARTER) {\n\t\t\tthis.dateRange = this.getRangeForQuarterViewWithAnchor(anchorDate);\n\t\t}\n\n\t\t// Store timestamps directly\n\t\tthis.currentStartDate = this.dateRange.from;\n\t\tthis.currentEndDate = this.dateRange.to;\n\n\t\t// Update project date range\n\t\tthis.updateProjectDateRange();\n\t\tthis.dateComputationEngine.updateCurrentProjectStartDate(this.currentProjectStartDate);\n\t\tthis.dateComputationEngine.updateTimelineView(viewType);\n\n\t\t// Recreate gantt panel with new view configuration\n\t\tconst scrollPosition : { top : number, left : number } = this.ganttPanel.navigationAPI.getScrollPosition();\n\t\tthis.recreateGanttPanel();\n\n\t\tthis.changeViewTimeoutId = setTimeout(() => {\n\t\t\t// Range was built around targetDateBeforeViewSwitch — scroll directly; goToDate() would rebuild and recreate again\n\t\t\tthis.scrollToDate(targetDateBeforeViewSwitch);\n\t\t\tthis.ganttPanel.navigationAPI.scrollBy(undefined, scrollPosition.top);\n\n\t\t\tthis.changeViewTimeoutId = null;\n\t\t}, 1);\n\t\t\n\t\treturn this.dateRange;\n\t}\n\n\tgoToDate(date: Date | string | number, bufferPixels : number = 0, centerInViewport : boolean = false): void{\n\t\tif (!this.ganttPanel || !this.dateRange) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert to GMT timestamp\n\t\tconst targetTimestamp = this.getUTCTimestamp(date);\n\t\t\n\t\t// Check if the date is within the current pagination range\n\t\tif (!this.isInRangeGMT(targetTimestamp, this.currentProjectStartDate, this.currentProjectEndDate)) {\n\t\t\t// Date is outside range - create new pagination with given date as start date\n\t\t\t// Update initialDate to the given date (GMT timestamp)\n\t\t\tthis.initialDate = targetTimestamp;\n\t\t\t\n\t\t\t// Calculate new date range based on the current view type using the parsed date as anchor\n\t\t\tif (this.timelineView === VIEW_TYPE.MONTH) {\n\t\t\t\tthis.dateRange = this.getRangeForMonthViewWithAnchor(targetTimestamp);\n\t\t\t} else if (this.timelineView === VIEW_TYPE.WEEK) {\n\t\t\t\tthis.dateRange = this.getRangeForWeekViewWithAnchor(targetTimestamp);\n\t\t\t} else if (this.timelineView === VIEW_TYPE.DAY) {\n\t\t\t\tthis.dateRange = this.getRangeForDayViewWithAnchor(targetTimestamp);\n\t\t\t} else if (this.timelineView === VIEW_TYPE.YEAR) {\n\t\t\t\tthis.dateRange = this.getRangeForYearViewWithAnchor(targetTimestamp);\n\t\t\t} else if (this.timelineView === VIEW_TYPE.QUARTER) {\n\t\t\t\tthis.dateRange = this.getRangeForQuarterViewWithAnchor(targetTimestamp);\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t// Store timestamps directly\n\t\t\tthis.currentStartDate = this.dateRange.from;\n\t\t\tthis.currentEndDate = this.dateRange.to;\n\t\t\t\n\t\t\t// Update project date range\n\t\t\tthis.updateProjectDateRange();\n\t\t\tthis.dateComputationEngine.updateCurrentProjectStartDate(this.currentProjectStartDate);\n\t\t\tthis.dateComputationEngine.updateTimelineWidth(this.timelineWidth);\n\t\t\t// Recreate gantt panel with new date range\n\t\t\tconst scrollPosition : { top : number, left : number } = this.ganttPanel.navigationAPI.getScrollPosition();\n\t\t\tthis.recreateGanttPanel();\n\t\t\tthis.ganttPanel.navigationAPI.scrollBy(undefined, scrollPosition.top);\n\n\t\t}\n\n\t\tif (this.goToDateTimeoutId !== null) {\n\t\t\tclearTimeout(this.goToDateTimeoutId);\n\t\t\tthis.goToDateTimeoutId = null;\n\t\t}\n\t\t\n\t\t// Set timeout to scroll to current date after panel recreation\n\t\tthis.goToDateTimeoutId = setTimeout(() => {\n\t\t\tthis.scrollToDate(targetTimestamp, bufferPixels, centerInViewport);\n\t\t\tthis.goToDateTimeoutId = null;\n\t\t}, 1);\n\t\t// Date is within range - calculate scroll position and scroll\n\t\t\n\t}\n\n\t/**\n\t * Maps a GMT timestamp to horizontal offset (px) along the virtual timeline from {@link currentProjectStartDate},\n\t * using the same math as {@link getCurrentViewPortDate} in reverse. Zoom/virtualization only changes\n\t * {@link timelineWidth}; this stays consistent with existing pagination.\n\t */\n\tprivate computeTimelineLeftPxForTimestamp(targetTimestamp: number): number {\n\t\tconst timelineWidth = this.getTimelineWidth();\n\t\tconst paginationStartTimestamp = this.currentProjectStartDate;\n\t\tlet scrollX = 0;\n\n\t\tif (this.timelineView === VIEW_TYPE.MONTH || this.timelineView === VIEW_TYPE.WEEK) {\n\t\t\tconst daysDiff = this.daysBetweenGMT(paginationStartTimestamp, targetTimestamp);\n\t\t\tscrollX = daysDiff * timelineWidth;\n\t\t} else if (this.timelineView === VIEW_TYPE.DAY) {\n\t\t\tconst hoursDiff = this.hoursBetweenGMT(paginationStartTimestamp, targetTimestamp);\n\t\t\tscrollX = hoursDiff * timelineWidth;\n\t\t} else if (this.timelineView === VIEW_TYPE.YEAR) {\n\t\t\tconst monthsDiff = this.monthsBetweenGMT(paginationStartTimestamp, targetTimestamp);\n\t\t\tconst monthStart = this.getStartOfMonthGMT(targetTimestamp);\n\t\t\tconst daysInMonth = this.getDaysInMonthGMT(targetTimestamp);\n\t\t\tconst daysDiff = this.daysBetweenGMT(monthStart, targetTimestamp);\n\t\t\tconst widthPerDay = timelineWidth / Math.max(daysInMonth, 1);\n\t\t\tscrollX = (monthsDiff * timelineWidth) + (daysDiff * widthPerDay);\n\t\t} else if (this.timelineView === VIEW_TYPE.QUARTER) {\n\t\t\tconst monthsDiff = this.monthsBetweenGMT(paginationStartTimestamp, targetTimestamp);\n\t\t\tconst monthStart = this.getStartOfMonthGMT(targetTimestamp);\n\t\t\tconst daysInMonth = this.getDaysInMonthGMT(targetTimestamp);\n\t\t\tconst daysDiff = this.daysBetweenGMT(monthStart, targetTimestamp);\n\t\t\tconst widthPerDay = timelineWidth / Math.max(daysInMonth, 1);\n\t\t\tscrollX = (monthsDiff * timelineWidth) + (daysDiff * widthPerDay);\n\t\t}\n\n\t\treturn scrollX;\n\t}\n\n\t/**\n\t * Horizontal pixel offset for {@link targetTimestamp} using fractional time — inverse of {@link getCurrentViewPortDate}\n\t * (same mapping as scrollLeft → date, but without flooring to cell starts). Used only when centering so the\n\t * exact instant sits at viewport middle at any zoom.\n\t */\n\tprivate computeTimelineInstantPxForTimestamp(targetTimestamp: number): number {\n\t\tconst timelineWidth = this.getTimelineWidth();\n\t\tconst paginationStartTimestamp = this.currentProjectStartDate;\n\n\t\tif (this.timelineView === VIEW_TYPE.MONTH || this.timelineView === VIEW_TYPE.WEEK) {\n\t\t\tconst dayFraction = (targetTimestamp - paginationStartTimestamp) / this.MS_PER_DAY;\n\t\t\treturn dayFraction * timelineWidth;\n\t\t}\n\t\tif (this.timelineView === VIEW_TYPE.DAY) {\n\t\t\tconst hourFraction = (targetTimestamp - paginationStartTimestamp) / this.MS_PER_HOUR;\n\t\t\treturn hourFraction * timelineWidth;\n\t\t}\n\t\tif (this.timelineView === VIEW_TYPE.YEAR || this.timelineView === VIEW_TYPE.QUARTER) {\n\t\t\tconst monthsDiff = this.monthsBetweenGMT(paginationStartTimestamp, targetTimestamp);\n\t\t\tconst monthStart = this.getStartOfMonthGMT(targetTimestamp);\n\t\t\tconst daysInMonth = this.getDaysInMonthGMT(targetTimestamp);\n\t\t\tconst widthPerDay = timelineWidth / Math.max(daysInMonth, 1);\n\t\t\tconst dayFractionInMonth = (targetTimestamp - monthStart) / this.MS_PER_DAY;\n\t\t\treturn monthsDiff * timelineWidth + dayFractionInMonth * widthPerDay;\n\t\t}\n\n\t\treturn this.computeTimelineLeftPxForTimestamp(targetTimestamp);\n\t}\n\n\t/**\n\t * Visible width of the center (timeline) viewport — matches {@link RowContainerController#getCenterWidth} /\n\t * horizontal scroll sync used elsewhere in the grid.\n\t */\n\tprivate getTimelineViewportWidthPx(): number {\n\t\tif (!this.viewsCommunicationHandler) {\n\t\t\treturn 0;\n\t\t}\n\t\ttry {\n\t\t\tconst controllerHandler = this.viewsCommunicationHandler.getGanttPanelBeanFromBeanName(\n\t\t\t\tGRID_BEAN_NAME.CONTROLLER_HANDLER\n\t\t\t) as IControllerHandler;\n\t\t\treturn controllerHandler.getCenterRowContainerController().getCenterWidth();\n\t\t} catch {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tprivate scrollToDate(targetTimestamp: number, bufferPixels: number = 0, centerInViewport: boolean = false): void {\n\t\tif (!this.ganttPanel || !this.ganttPanel.navigationAPI) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst gridAlignedLeftPx = this.computeTimelineLeftPxForTimestamp(targetTimestamp);\n\t\tconst currentScrollLeft = this.ganttPanel.navigationAPI.getScrollPosition().left;\n\n\t\t// scroll offset strategy: navigationAPI.scrollBy is relative on X only (vertical unchanged).\n\t\tlet scrollDelta: number;\n\t\tlet comparisonLeft: number;\n\n\t\tif (centerInViewport) {\n\t\t\tconst viewportWidth = this.getTimelineViewportWidthPx();\n\t\t\tif (viewportWidth > 0) {\n\t\t\t\t// Put the exact date on the horizontal midpoint of the visible timeline: timelinePx - scrollLeft = viewportWidth/2.\n\t\t\t\tconst timelinePx = this.computeTimelineInstantPxForTimestamp(targetTimestamp);\n\t\t\t\tconst desiredScrollLeft = timelinePx - viewportWidth / 2 - bufferPixels;\n\t\t\t\tscrollDelta = desiredScrollLeft - currentScrollLeft;\n\t\t\t\tcomparisonLeft = desiredScrollLeft;\n\t\t\t} else {\n\t\t\t\t// No measurable viewport yet — fall back to legacy cell-start alignment.\n\t\t\t\tscrollDelta = gridAlignedLeftPx - currentScrollLeft + bufferPixels;\n\t\t\t\tcomparisonLeft = gridAlignedLeftPx;\n\t\t\t}\n\t\t} else {\n\t\t\t// Backward compatibility: floored cell-start X + buffer inside scrollBy delta (unchanged).\n\t\t\tscrollDelta = gridAlignedLeftPx - currentScrollLeft + bufferPixels;\n\t\t\tcomparisonLeft = gridAlignedLeftPx;\n\t\t}\n\n\t\tif (Math.abs(comparisonLeft - currentScrollLeft) > 0.1) {\n\t\t\tthis.ganttPanel.navigationAPI.scrollBy(scrollDelta, 0);\n\t\t}\n\t}\n\n\tprivate getTimelineWidth(): number {\n\t\treturn this.timelineWidth;\n\t}\n\tisInCurrentProjectRange(date: Date | string | number): boolean {\n\t\tif (!this.currentProjectStartDate || !this.currentProjectEndDate) {\n\t\t\treturn false;\n\t\t}\n\t\t// Convert to GMT timestamp and check range\n\t\tconst targetTimestamp = this.getUTCTimestamp(date);\n\t\treturn this.isInRangeGMT(targetTimestamp, this.currentProjectStartDate, this.currentProjectEndDate);\n\t}\n\n\tgetCurrentViewPortDate():timestamp{\n\t\tif (!this.ganttPanel || !this.ganttPanel.navigationAPI) {\n\t\t\treturn this.currentProjectStartDate;\n\t\t}\n\n\t\tconst scrollPosition = this.ganttPanel.navigationAPI.getScrollPosition();\n\t\tconst scrollLeft = scrollPosition.left;\n\t\tconst timelineWidth = this.getTimelineWidth();\n\t\tconst paginationStartTimestamp = this.currentProjectStartDate;\n\t\tlet currentViewPortDate: number;\n\n\t\tif (this.timelineView === VIEW_TYPE.MONTH || this.timelineView === VIEW_TYPE.WEEK) {\n\t\t\t// For month and week views: scroll position represents days\n\t\t\tconst daysScrolled = scrollLeft / timelineWidth;\n\t\t\tcurrentViewPortDate = this.addDaysGMT(paginationStartTimestamp, daysScrolled);\n\t\t} else if (this.timelineView === VIEW_TYPE.DAY) {\n\t\t\t// For day view: scroll position represents hours\n\t\t\tconst hoursScrolled = scrollLeft / timelineWidth;\n\t\t\tcurrentViewPortDate = paginationStartTimestamp + (hoursScrolled * this.MS_PER_HOUR);\n\t\t} else if (this.timelineView === VIEW_TYPE.YEAR) {\n\t\t\t// For year view: scroll position represents months + fractional days within month\n\t\t\tconst monthsScrolled = Math.floor(scrollLeft / timelineWidth);\n\t\t\tconst remainingScroll = scrollLeft % timelineWidth;\n\t\t\tconst monthStartTimestamp = this.addMonthsGMT(paginationStartTimestamp, monthsScrolled);\n\t\t\tconst daysInMonth = this.getDaysInMonthGMT(monthStartTimestamp);\n\t\t\tconst widthPerDay = timelineWidth / Math.max(daysInMonth, 1);\n\t\t\tconst daysScrolled = remainingScroll / widthPerDay;\n\t\t\tcurrentViewPortDate = this.addDaysGMT(monthStartTimestamp, daysScrolled);\n\t\t} else if (this.timelineView === VIEW_TYPE.QUARTER) {\n\t\t\t// For quarter view: similar to year - months + fractional days within month\n\t\t\tconst monthsScrolled = Math.floor(scrollLeft / timelineWidth);\n\t\t\tconst remainingScroll = scrollLeft % timelineWidth;\n\t\t\tconst monthStartTimestamp = this.addMonthsGMT(paginationStartTimestamp, monthsScrolled);\n\t\t\tconst daysInMonth = this.getDaysInMonthGMT(monthStartTimestamp);\n\t\t\tconst widthPerDay = timelineWidth / Math.max(daysInMonth, 1);\n\t\t\tconst daysScrolled = remainingScroll / widthPerDay;\n\t\t\tcurrentViewPortDate = this.addDaysGMT(monthStartTimestamp, daysScrolled);\n\t\t} else {\n\t\t\t// Fallback: treat as days\n\t\t\tconst daysScrolled = scrollLeft / timelineWidth;\n\t\t\tcurrentViewPortDate = this.addDaysGMT(paginationStartTimestamp, daysScrolled);\n\t\t}\n\n\t\treturn currentViewPortDate;\n\t}\n\n\tscrollToNext():void{\n\t\tconst currentViewPortDate = this.getCurrentViewPortDate();\n\t\tlet nextViewPortDate: number;\n\n\t\tif (this.timelineView === VIEW_TYPE.DAY) {\n\t\t\tnextViewPortDate = this.addDaysGMT(currentViewPortDate, 1);\n\t\t\tnextViewPortDate = this.getStartOfDayGMT(nextViewPortDate);\n\t\t} else if (this.timelineView === VIEW_TYPE.WEEK) {\n\t\t\tnextViewPortDate = this.addWeeksGMT(currentViewPortDate, 1);\n\t\t\tconst weekStartPref = this.optionHandler.getWeekStartDay() === 1 ? 'monday' : 'sunday';\n\t\t\tnextViewPortDate = this.getStartOfWeekGMT(nextViewPortDate, weekStartPref);\n\t\t} else if (this.timelineView === VIEW_TYPE.MONTH) {\n\t\t\tnextViewPortDate = this.addMonthsGMT(currentViewPortDate, 1);\n\t\t\tnextViewPortDate = this.getStartOfMonthGMT(nextViewPortDate);\n\t\t} else if (this.timelineView === VIEW_TYPE.QUARTER) {\n\t\t\tnextViewPortDate = this.addMonthsGMT(currentViewPortDate, 3);\n\t\t\tnextViewPortDate = this.getQuarterStartGMT(nextViewPortDate);\n\t\t} else if (this.timelineView === VIEW_TYPE.YEAR) {\n\t\t\tnextViewPortDate = this.addYearsGMT(currentViewPortDate, 1);\n\t\t\tnextViewPortDate = this.getStartOfYearGMT(nextViewPortDate);\n\t\t} else {\n\t\t\t// Fallback to days\n\t\t\tnextViewPortDate = this.addDaysGMT(currentViewPortDate, 1);\n\t\t\tnextViewPortDate = this.getStartOfDayGMT(nextViewPortDate);\n\t\t}\n\n\t\tthis.goToDate(nextViewPortDate);\n\t}\n\n\tscrollToPrevious():void{\n\t\tconst currentViewPortDate = this.getCurrentViewPortDate();\n\t\tlet previousViewPortDate: number;\n\n\t\tif (this.timelineView === VIEW_TYPE.DAY) {\n\t\t\tpreviousViewPortDate = this.subtractDaysGMT(currentViewPortDate, 1);\n\t\t\tpreviousViewPortDate = this.getStartOfDayGMT(previousViewPortDate);\n\t\t} else if (this.timelineView === VIEW_TYPE.WEEK) {\n\t\t\tpreviousViewPortDate = this.subtractWeeksGMT(currentViewPortDate, 1);\n\t\t\tconst weekStartPref = this.optionHandler.getWeekStartDay() === 1 ? 'monday' : 'sunday';\n\t\t\tpreviousViewPortDate = this.getStartOfWeekGMT(previousViewPortDate, weekStartPref);\n\t\t} else if (this.timelineView === VIEW_TYPE.MONTH) {\n\t\t\tpreviousViewPortDate = this.subtractMonthsGMT(currentViewPortDate, 1);\n\t\t\tpreviousViewPortDate = this.getStartOfMonthGMT(previousViewPortDate);\n\t\t} else if (this.timelineView === VIEW_TYPE.QUARTER) {\n\t\t\tpreviousViewPortDate = this.subtractMonthsGMT(currentViewPortDate, 3);\n\t\t\tpreviousViewPortDate = this.getQuarterStartGMT(previousViewPortDate);\n\t\t} else if (this.timelineView === VIEW_TYPE.YEAR) {\n\t\t\tpreviousViewPortDate = this.subtractYearsGMT(currentViewPortDate, 1);\n\t\t\tpreviousViewPortDate = this.getStartOfYearGMT(previousViewPortDate);\n\t\t} else {\n\t\t\t// Fallback to days\n\t\t\tpreviousViewPortDate = this.subtractDaysGMT(currentViewPortDate, 1);\n\t\t\tpreviousViewPortDate = this.getStartOfDayGMT(previousViewPortDate);\n\t\t}\n\n\t\tthis.goToDate(previousViewPortDate);\n\t}\n\n\n\tupdateBuffer(buffer: number): void{\n\t\tthis.buffer = (buffer ?? 0) - 1;\n\t}\n\n\n\t// goToTask(rowId: string): void{\n\t// \tif (!this.ganttPanel || !this.ganttPanel.rowAPI || !this.ganttPanel.navigationAPI) {\n\t// \t\treturn;\n\t// \t}\n\n\t// \t// Get the row index metadata for the given task ID\n\t// \t// Using type assertion since getIndexById exists in implementation but not in interface\n\t// \tconst rowMeta = (this.ganttPanel.rowAPI as any).getIndexById(rowId);\n\t\t\n\t// \tif (!rowMeta || rowMeta.rowIndex === null || rowMeta.rowIndex === undefined) {\n\t// \t\treturn;\n\t// \t}\n\n\t// \t// Ensure the row is visible using navigation API\n\t// \t// Only scroll if the row is in the middle pane (not pinned)\n\t// \tif (rowMeta.pinPosition === 'middle' || !rowMeta.pinPosition) {\n\t// \t\tthis.ganttPanel.navigationAPI.ensureIndexVisible(rowMeta.rowIndex);\n\t// \t}\n\t// }\n\n}\n\n\n","import { CorePopupHandler, Position } from \"../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/PopupHandler/CorePopupHandler\";\n\n/**\n * CSS class names used for tooltip elements\n */\nconst TOOLTIP_CLASS_NAME = {\n    ZCC_TOOLTIP                     : 'ZCC-tooltip',\n    POPOVER_POINTER                 : 'dg-popover__pointer',\n    POPOVER_POINTER_BOTTOM_CENTER   : 'dg-popover__pointer--bottom-center',\n    POPOVER_POINTER_BOTTOM_LEFT     : 'dg-popover__pointer--bottom-left',\n    POPOVER_POINTER_BOTTOM_RIGHT    : 'dg-popover__pointer--bottom-right',\n    POPOVER_POINTER_TOP_LEFT        : 'dg-popover__pointer--top-left',\n    POPOVER_POINTER_TOP_RIGHT       : 'dg-popover__pointer--top-right',\n    POPOVER_POINTER_TOP_CENTER      : 'dg-popover__pointer--top-center',\n    ZG_LTR                          : 'ZG-ltr',\n    GANTT_TASK_DRAG_AND_DROP_TOOLTIP: 'dg-gantt__task-drag-and-drop-tooltip',\n    TOOLTIP_TEXT                    : 'dg-tooltip-text',\n    TOOLTIP_TEXT_LEFT               : 'dg-tooltip-text-left',\n    TOOLTIP_TEXT_CENTER             : 'dg-tooltip-text-center',\n    TOOLTIP_TEXT_RIGHT              : 'dg-tooltip-text-right'\n} ;\n\n/**\n * Interface for tooltip content data\n */\nexport interface ITooltipContent {\n    startDate: string;\n    endDate: string;\n    duration?: string;\n}\n\n/**\n * Interface for tooltip position configuration\n */\nexport interface ITooltipPositionConfig {\n    sourceElement: HTMLElement;\n    containerElement: HTMLElement;\n    position?: Position;\n    fallbackPositions?: Position[];\n    alignSide?: 'left' | 'right';\n    gapX?: number;\n    gapY?: number;\n    keepWithinBounds?: boolean;\n    resizeDirection?: 'left' | 'right';\n    followCursor?: boolean;\n    cursorX?: number;\n    cursorY?: number;\n    tooltipType?: 'drag-and-drop' | 'dragtoschedule';\n}\n\n/**\n * Common tooltip handler for drag and resize operations\n * Manages tooltip DOM structure, content updates, and positioning\n */\nexport class DragResizeTooltipHandler {\n    private tooltipElement: HTMLElement | null = null;\n    private contentContainer: HTMLElement | null = null;\n    private startDateValue: HTMLElement | null = null;\n    private endDateValue: HTMLElement | null = null;\n    private durationLabel: HTMLElement | null = null;\n    private durationColon: HTMLElement | null = null;\n    private durationValue: HTMLElement | null = null;\n\n    constructor(_popupHandler: CorePopupHandler) {\n    }\n\n    /**\n     * Initialize the tooltip element with the required DOM structure\n     */\n    public initialize(): void {\n        if (this.tooltipElement) {\n            this.cleanup();\n        }\n\n        // Create main tooltip container\n        this.tooltipElement = document.createElement('div');\n        this.tooltipElement.classList.add(TOOLTIP_CLASS_NAME.ZCC_TOOLTIP);\n        this.tooltipElement.classList.add(TOOLTIP_CLASS_NAME.POPOVER_POINTER);\n        this.tooltipElement.classList.add(TOOLTIP_CLASS_NAME.POPOVER_POINTER_BOTTOM_CENTER);\n        this.tooltipElement.classList.add(TOOLTIP_CLASS_NAME.ZG_LTR);\n        this.tooltipElement.classList.add(TOOLTIP_CLASS_NAME.GANTT_TASK_DRAG_AND_DROP_TOOLTIP);\n\n        // Create content container with the specified structure\n        this.contentContainer = document.createElement('span');\n        this.contentContainer.classList.add(TOOLTIP_CLASS_NAME.TOOLTIP_TEXT);\n\n        // Create Start Date row\n        const startDateRow = this.createDataRow('Start Date', '');\n        this.startDateValue = startDateRow.value;\n        this.contentContainer.appendChild(startDateRow.label);\n        this.contentContainer.appendChild(startDateRow.colon);\n        this.contentContainer.appendChild(startDateRow.value);\n\n        // Create End Date row\n        const endDateRow = this.createDataRow('End Date', '');\n        this.endDateValue = endDateRow.value;\n        this.contentContainer.appendChild(endDateRow.label);\n        this.contentContainer.appendChild(endDateRow.colon);\n        this.contentContainer.appendChild(endDateRow.value);\n\n        // Create Duration row (will be shown/hidden based on content)\n        const durationRow = this.createDataRow('Duration', '');\n        this.durationLabel = durationRow.label;\n        this.durationColon = durationRow.colon;\n        this.durationValue = durationRow.value;\n        this.contentContainer.appendChild(durationRow.label);\n        this.contentContainer.appendChild(durationRow.colon);\n        this.contentContainer.appendChild(durationRow.value);\n\n        // Append content container to tooltip\n        this.tooltipElement.appendChild(this.contentContainer);\n\n        // Append to document body\n        document.body.appendChild(this.tooltipElement);\n    }\n\n    /**\n     * Create a data row with label, colon separator, and value\n     */\n    private createDataRow(labelText: string, valueText: string): {\n        label: HTMLElement;\n        colon: HTMLElement;\n        value: HTMLElement;\n    } {\n        const label = document.createElement('span');\n        label.classList.add(TOOLTIP_CLASS_NAME.TOOLTIP_TEXT_LEFT);\n        label.textContent = labelText;\n\n        const colon = document.createElement('span');\n        colon.classList.add(TOOLTIP_CLASS_NAME.TOOLTIP_TEXT_CENTER);\n        colon.textContent = ':';\n\n        const value = document.createElement('span');\n        value.classList.add(TOOLTIP_CLASS_NAME.TOOLTIP_TEXT_RIGHT);\n        value.textContent = valueText;\n\n        return { label, colon, value };\n    }\n\n    /**\n     * Update tooltip content with new data\n     */\n    public updateContent(content: ITooltipContent): void {\n        if (!this.tooltipElement || !this.startDateValue || !this.endDateValue) {\n            return;\n        }\n\n        // Update Start Date\n        if (this.startDateValue) {\n            this.startDateValue.textContent = content.startDate;\n        }\n\n        // Update End Date\n        if (this.endDateValue) {\n            this.endDateValue.textContent = content.endDate;\n        }\n\n        // Update Duration (show/hide based on whether duration is provided)\n        if (this.durationLabel && this.durationValue && this.durationColon) {\n            if (content.duration !== undefined && content.duration !== null) {\n                this.durationValue.textContent = content.duration;\n                this.durationLabel.style.display = '';\n                this.durationColon.style.display = '';\n                this.durationValue.style.display = '';\n            } else {\n                this.durationLabel.style.display = 'none';\n                this.durationColon.style.display = 'none';\n                this.durationValue.style.display = 'none';\n            }\n        }\n    }\n\n    /**\n     * Update tooltip position based on configuration.\n     *\n     * The tooltip uses `position: fixed`, so we compute its viewport\n     * coordinates directly from `getBoundingClientRect()` of the source\n     * element instead of delegating to `positionPopupByComponent` and\n     * reading back container-relative values.  This avoids coordinate\n     * mismatches caused by static-positioned containers being resolved\n     * to their offsetParent inside the popup handler.\n     */\n    public updatePosition(config: ITooltipPositionConfig): void {\n        if (!this.tooltipElement || !config.sourceElement || !config.containerElement) {\n            return;\n        }\n\n        this.tooltipElement.style.position = 'fixed';\n\n        const sourceRect = config.sourceElement.getBoundingClientRect();\n        const containerRect = config.containerElement.getBoundingClientRect();\n\n        // Guard: if source element is detached or has zero dimensions (e.g.\n        // virtualized row unmounted, fast resize race) keep the current\n        // position rather than jumping to the container origin.\n        if (sourceRect.width === 0 && sourceRect.height === 0) {\n            return;\n        }\n\n        const tooltipWidth  = this.tooltipElement.offsetWidth;\n        const tooltipHeight = this.tooltipElement.offsetHeight;\n        const gapY = config.gapY ?? 10;\n        const resizeDirection = config.resizeDirection;\n\n        // --- Vertical position: prefer below, fall back to above ----------\n        const spaceBelow = containerRect.bottom - sourceRect.bottom;\n        const spaceAbove = sourceRect.top - containerRect.top;\n\n        let viewportTop: number;\n        let isTooltipAbove: boolean;\n\n        if (spaceBelow >= tooltipHeight + gapY) {\n            viewportTop    = sourceRect.bottom + gapY;\n            isTooltipAbove = false;\n        } else if (spaceAbove >= tooltipHeight + gapY) {\n            viewportTop    = sourceRect.top - tooltipHeight - gapY;\n            isTooltipAbove = true;\n        } else {\n            viewportTop    = sourceRect.bottom + gapY;\n            isTooltipAbove = false;\n        }\n\n        // Clamp vertically within the container\n        if (viewportTop < containerRect.top) {\n            viewportTop = containerRect.top;\n        } else if (viewportTop + tooltipHeight > containerRect.bottom) {\n            viewportTop = containerRect.bottom - tooltipHeight;\n        }\n\n        // --- Horizontal position ------------------------------------------\n        let viewportLeft: number;\n\n        if (resizeDirection === 'left') {\n            viewportLeft = sourceRect.left;\n        } else if (resizeDirection === 'right') {\n            viewportLeft = sourceRect.right - tooltipWidth;\n        } else {\n            const sourceCenterX = sourceRect.left + sourceRect.width / 2;\n            viewportLeft = sourceCenterX - tooltipWidth / 2;\n\n            if (config.followCursor && config.cursorX !== undefined) {\n                const isCursorInBounds =\n                    config.cursorX >= containerRect.left &&\n                    config.cursorX <= containerRect.right;\n                if (isCursorInBounds) {\n                    viewportLeft = config.cursorX - tooltipWidth / 2;\n                }\n            }\n        }\n\n        // Clamp horizontally within the container\n        if (viewportLeft < containerRect.left) {\n            viewportLeft = containerRect.left + 10;\n        } else if (viewportLeft + tooltipWidth > containerRect.right) {\n            viewportLeft = containerRect.right - tooltipWidth - 10;\n        }\n\n        // Apply the computed viewport coordinates\n        this.tooltipElement.style.left = `${viewportLeft}px`;\n        this.tooltipElement.style.top  = `${viewportTop}px`;\n\n        this.updatePointerClassName(config.resizeDirection, isTooltipAbove);\n    }\n\n    /**\n     * Update the pointer className based on tooltip type and position.\n     *\n     * Left  resizer – below: top-left,     above: bottom-left\n     * Right resizer – below: top-right,    above: bottom-right\n     * Drag-and-drop – below: top-center,   above: bottom-center\n     */\n    private updatePointerClassName(\n        resizeDirection: 'left' | 'right' | undefined,\n        isTooltipAbove: boolean\n    ): void {\n        if (!this.tooltipElement) {\n            return;\n        }\n\n        let pointerClassName: string;\n\n        if (resizeDirection === 'left') {\n            pointerClassName = isTooltipAbove\n                ? TOOLTIP_CLASS_NAME.POPOVER_POINTER_BOTTOM_LEFT\n                : TOOLTIP_CLASS_NAME.POPOVER_POINTER_TOP_LEFT;\n        } else if (resizeDirection === 'right') {\n            pointerClassName = isTooltipAbove\n                ? TOOLTIP_CLASS_NAME.POPOVER_POINTER_BOTTOM_RIGHT\n                : TOOLTIP_CLASS_NAME.POPOVER_POINTER_TOP_RIGHT;\n        } else {\n            pointerClassName = isTooltipAbove\n                ? TOOLTIP_CLASS_NAME.POPOVER_POINTER_BOTTOM_CENTER\n                : TOOLTIP_CLASS_NAME.POPOVER_POINTER_TOP_CENTER;\n        }\n\n        const classList = this.tooltipElement.classList;\n\n        if (classList.contains(pointerClassName)) {\n            return;\n        }\n\n        // Remove any existing pointer position class\n        classList.remove(\n            TOOLTIP_CLASS_NAME.POPOVER_POINTER_TOP_LEFT,\n            TOOLTIP_CLASS_NAME.POPOVER_POINTER_TOP_CENTER,\n            TOOLTIP_CLASS_NAME.POPOVER_POINTER_TOP_RIGHT,\n            TOOLTIP_CLASS_NAME.POPOVER_POINTER_BOTTOM_LEFT,\n            TOOLTIP_CLASS_NAME.POPOVER_POINTER_BOTTOM_CENTER,\n            TOOLTIP_CLASS_NAME.POPOVER_POINTER_BOTTOM_RIGHT,\n        );\n\n        classList.add(pointerClassName);\n    }\n\n    /**\n     * Get the tooltip element (for external access if needed)\n     */\n    public getTooltipElement(): HTMLElement | null {\n        return this.tooltipElement;\n    }\n\n    /**\n     * Check if tooltip is initialized\n     */\n    public isInitialized(): boolean {\n        return this.tooltipElement !== null;\n    }\n\n    /**\n     * Clean up and remove tooltip from DOM\n     */\n    public cleanup(): void {\n        if (this.tooltipElement) {\n            if (this.tooltipElement.parentElement) {\n                this.tooltipElement.parentElement.removeChild(this.tooltipElement);\n            }\n            this.tooltipElement = null;\n        }\n        this.contentContainer = null;\n        this.startDateValue = null;\n        this.endDateValue = null;\n        this.durationLabel = null;\n        this.durationColon = null;\n        this.durationValue = null;\n    }\n}\n","\nimport { BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { TaskBarHolderComponent } from \"../TaskBarHolderComponent\";\nimport { IDragSourceConfig, IDropTarget } from \"../../../../../DragAndDrop-handler/dragAndDrop-handler.types\";\nimport { GANTT_BEAN_NAME } from \"../../../../Constant/GanttBeanNameConstant\";\nimport { IGanttTaskApi } from \"../../../../Api/IGanttTaskApi\";\nimport { IGanttPaginationController } from \"GanttModelClasses/Core/Pagination/IPaginationController\";\nimport { GANTT_CLASS_NAMES } from \"../../../../../Grid/Core/Constants/CSSClassNameContants\";\nimport { AutoScrollHandler } from \"../../../../../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler\";\nimport { IAutoScrollOptions } from \"../../../../../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler.types\";\nimport { GridBodyScrollHandler } from \"../../../../../Grid/Core/GridBodyScrollHandler\";\nimport { Tooltip } from \"../../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Tooltip\";\nimport { ITooltipConfiguration } from \"../../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Interface/ITooltipConfiguration\";\nimport { TooltipTriggerStates } from \"../../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Constants/DefaultTooltipValues\";\nimport { ToolTipComponent } from \"../ToolTipComponent/ToolTipComponent\";\nimport { CorePopupHandler, Position } from \"../../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/PopupHandler/CorePopupHandler\";\nimport { DragResizeTooltipHandler, ITooltipContent, ITooltipPositionConfig } from \"../DragResizeTooltipHandler\";\nimport { IGanttHookMeta } from \"../../../../IGanttConfiguration\";\nimport { GRID_BEAN_NAME } from \"../../../../../Grid/Core/Constants/BeanName\";\nimport { IDateUtils } from \"../../../../../Utils/IDateUtils\";\nimport { IGanttOptionsHandler } from \"GanttModelClasses/Core/OptionsHandler/IGanttOptionsHandler\";\nimport { Events } from \"../../../../../Grid/Core/Constants/Events\";\n\nconst VIEW_TYPE = {\n    DAY    : 'day',\n    MONTH  : 'month',\n    WEEK   : 'week',\n    YEAR   : 'year',\n    QUARTER: 'quarter'\n}\n\n// Constants for drag thresholds and minimum values\nconst DRAG_THRESHOLD_PX = 3; // Minimum pixels to move before considering it a drag\nconst DEFAULT_DRAG_WIDTH_PX = 1; // Default width of drag element in pixels\n// Minimum horizontal padding (px) the tooltip pointer must keep from either tooltip edge\nconst TOOLTIP_POINTER_EDGE_PADDING_PX = 12;\n\n/**\n * Interface for controller parameters\n */\ninterface IEmtyBarControllerParams {\n    parentElement: HTMLElement;\n    allowDragToScheduleTask: boolean;\n    readonly: boolean;\n    data: any;\n    columnWidth: number;\n    viewType: string;\n    dateUtilsInstance: any;\n    scrollHolder?: HTMLElement;\n    gridContainer?: HTMLElement;\n    controllerHandler?: {\n        onAfterGridReady: (callback: (params: any) => void) => void;\n    };\n    getBeanInstanceByBeanName: (beanName: string) => any;\n}\n\nexport class EmtyBarHolderController extends EventEmitter {\n    private component                : TaskBarHolderComponent;\n    private params                   : IEmtyBarControllerParams;\n    private dragElement              : HTMLElement | null = null;\n    private resizerElement              : HTMLElement | null = null;\n    private dragSourceConfig         : IDragSourceConfig<any> | null = null;\n    private dropTarget               : IDropTarget<any> | null = null;\n    private taskApi                  : IGanttTaskApi;\n    private paginationController     : IGanttPaginationController;\n    private lastClientX              : number = 0;\n    private parentElement            : HTMLElement;\n    private gridContainer            : HTMLElement;\n    private dragStartX               : number = 0;                            // Click point in parentElement-local-x (timeline content coords)\n    // private dragStartDate            : number | null = null;                  // Store the calculated start date as timestamp\n    private dragStartClientX         : number = 0;                            // Store the initial clientX to detect actual drag movement\n    private hasDragged               : boolean = false;                       // Track if user actually dragged (not just clicked)\n    private dragFixedDateTimestamp   : number | null = null;                  // Date at the click point - the fixed boundary date captured ONCE at drag start\n    private dragDirection            : 'right' | 'left' | null = null;        // Direction of the active (cursor) edge: 'right' = end is active, 'left' = start is active\n    private autoScrollHandler        : AutoScrollHandler | null = null;\n    private scrollContainer          : HTMLElement | null = null;\n    private horizontalScrollContainer: HTMLElement | null = null;\n    private scrollHandler            : GridBodyScrollHandler | null = null;\n    private tooltipComponent         : Tooltip | null = null;\n    private dragTooltipComponent     : Tooltip | null = null;\n    // private tooltipElement           :  HTMLElement | null = null;\n    private dragTooltipHandler       : DragResizeTooltipHandler | null = null;\n    private dragStartAnimationFrameId: number | null = null;                  // Track pending animation frame for cleanup\n    private dateUtilsInstance : IDateUtils;\n    private isAllDayFillMode: boolean = false;\n    private popupHandler             : CorePopupHandler;\n\n    constructor() {\n        super();\n        this.popupHandler = new CorePopupHandler();\n    }\n\n    public setUpComponent( component: TaskBarHolderComponent, params : IEmtyBarControllerParams): void {\n        this.component = component;\n        this.params = params;\n        this.parentElement = this.params.parentElement as HTMLElement;\n        this.gridContainer = this.params.gridContainer as HTMLElement;\n        this.taskApi = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.TASK_API);\n        this.paginationController = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.PAGINATION_CONTROLLER);\n        \n        // Initialize autoscroll handler (will set up when grid is ready)\n        const controllerHandler = this.params.controllerHandler;\n        if (controllerHandler) {\n            controllerHandler.onAfterGridReady((controllerParams: any) => {\n                this.initializeAutoScrollHandler(controllerParams);\n            });\n        } else {\n            // Fallback: try to initialize immediately\n            this.initializeAutoScrollHandler();\n        }\n        this.createDragElement(0, 0, this.parentElement);\n        this.registerDragToScheduleTask();\n        // Prefer the timezone-configured DATE_UTILS bean. params.dateUtilsInstance is a raw\n        // `new DateUtils()` from GanttConfigParser and often has no timezone set, which makes\n        // tooltip/drop formatting use the browser's local zone (e.g. Asia/Kolkata) instead of\n        // timelineSettings.timezone (e.g. America/Chicago) and shifts day boundaries.\n        const beanDateUtils = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.DATE_UTILS) as IDateUtils | undefined;\n        this.dateUtilsInstance = beanDateUtils ?? this.params.dateUtilsInstance;\n\n        // Initialize isAllDayFillMode\n        const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n        if (optionHandler) {\n            this.isAllDayFillMode = optionHandler.isAllDayFillMode();\n            const timezone = optionHandler.getTimezone();\n            if (timezone && this.dateUtilsInstance?.setTimezone) {\n                this.dateUtilsInstance.setTimezone(timezone);\n            }\n        }\n\n        this.registerEvents();\n        this.initializeHoverTooltip();\n    }\n\n    private registerEvents(){\n        if(!this.params.allowDragToScheduleTask || this.params.readonly){\n            return;\n        }\n        const element = this.component.getElement();\n\n        element.addEventListener('mousedown',this.handleMouseDown.bind(this));\n    }\n\n    private initializeHoverTooltip(): void {\n\n        if(!this.params.allowDragToScheduleTask || this.params.readonly){\n            return;\n        }\n        const element = this.component.getElement();\n        \n        const registerTooltipElement = (_tooltipEl: HTMLElement) => {\n            // this.tooltipElement = tooltipEl;\n            \n        };\n\n        const tooltipConfiguration: ITooltipConfiguration = {\n            popupParent                 : this.parentElement,\n            tooltipValue                : 'Drag to schedule',\n            shouldShowTooltip           : () => true,\n            shouldAttachEvents          : true,\n            position                    : 'bottom' as any,\n            gapX                        : 10,\n            gapY                        : 10,\n            keepWithinBounds            : true,\n            hideTooltip                 : false,\n            tooltipTrigger              : TooltipTriggerStates.HOVER,\n            tooltipShowDelay            : 0,\n            tooltipHideDelay            : 0,\n            tooltipMouseTrack           : true,\n            tooltipInteraction          : false,\n            cancelOnMouseDown           : false,\n            cancelOnEscape              : true,\n            fadeOutDelayAfterInteraction: 0,\n            popupClassName              : 'dg-gantt__tooltip-drag-to-schedule',\n            renderer                    : ToolTipComponent,\n            arrow : false,\n            userRendererParams          : {\n                registerTooltipElement: registerTooltipElement\n            }\n        };\n\n        this.tooltipComponent = new Tooltip(element, tooltipConfiguration);\n    }\n\n    private handleMouseDown(event: MouseEvent): void {\n        // event.preventDefault();\n        // event.stopPropagation();\n        \n        // Reset drag tracking state\n        this.hasDragged = false;\n        this.dragStartClientX = event.clientX;\n        \n        // Get the timeline container\n        const timelineContainer = this.params.parentElement as HTMLElement;\n        if (!timelineContainer) {\n            console.warn('Timeline container not found');\n            return;\n        }\n\n        // Capture the click position in parentElement-local-x (timeline content coords).\n        // parentElement is each row's task bar holder; the scroll container is above it.\n        // Therefore (clientX - timelineRect.left) already reflects the current scroll, and\n        // we MUST NOT add scrollLeft (which would double-count and cause the fixed side to\n        // drift during auto-scroll).\n        const timelineRect = timelineContainer.getBoundingClientRect();\n        const relativeX = event.clientX - timelineRect.left;\n\n        this.dragStartX = relativeX;\n        this.cleanupHoverTooltip();\n    }\n\n    private createDragElement(left: number, _top: number, parent: HTMLElement): void {\n        // Clean up existing drag element if any\n        if (this.dragElement && this.dragElement.parentNode) {\n            this.dragElement.parentNode.removeChild(this.dragElement);\n        }\n\n        // Create a visual element (small task bar) at the mouse position\n        this.dragElement = document.createElement('div');\n        this.dragElement.classList.add(GANTT_CLASS_NAMES.GANTT_TASK_DRAG_TO_SCHEDULE);\n        this.dragElement.style.left = `${left}px`;\n        this.dragElement.style.width = `${DEFAULT_DRAG_WIDTH_PX}px`; // Default width of one column\n         this.resizerElement = document.createElement('div');\n         this.resizerElement.classList.add('dg-gantt__shedule-task-bar-resizer');\n\n        this.dragElement.appendChild(this.resizerElement)\n        this.dragElement.style.display = 'none';\n\n        // Append to parent element\n        parent.appendChild(this.dragElement);\n    }\n\n    updateDragElement(left: number): void {\n        if (!this.dragElement) return;\n        this.dragElement.style.left = `${left}px`;\n    }\n\n    private registerDragToScheduleTask(): void {\n        if (!this.params.allowDragToScheduleTask || this.params.readonly) {\n            return;\n        }\n\n        if (!this.dragElement) {\n            return;\n        }\n\n        const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n        if (!dragAndDropHandler) {\n            console.warn('dragAndDropHandler not found for drag to schedule task');\n            return;\n        }\n\n        const timelineContainer = this.params.parentElement as HTMLElement;\n        const data = this.params.data;\n\n        this.dragSourceConfig = {\n            type: 'emptyBarDrag',\n            container: this.component.getElement() as HTMLElement,\n            getGhostElement: () => {\n                // Create ghost element that represents the task bar being scheduled\n                const ghost = document.createElement('div') as HTMLElement;\n                ghost.style.display = 'none';\n                return ghost;\n            },\n            getDragItem: () => {\n                return {\n                    data: data,\n                    element: this.dragElement,\n                    initialLeft: parseFloat(this.dragElement!.style.left),\n                    initialWidth: parseFloat(this.dragElement!.style.width) || DEFAULT_DRAG_WIDTH_PX\n                };\n            },\n            disableYaxis: true,\n            disableXaxis: false,\n            onDragStarted: (mouseEvent?: MouseEvent) => {\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_SCHEDULE_STARTED\n                });\n                // Reset drag tracking\n                this.hasDragged = false;\n                if (mouseEvent) {\n                    this.dragStartClientX = mouseEvent.clientX;\n                }\n                \n\n                // dragStartX is already in parentElement-local-x (set in handleMouseDown).\n                // Position the bar at that exact local-x; this is what every drag-update\n                // and auto-scroll callback will treat as the immutable anchor for the\n                // fixed side of the bar.\n                this.dragElement.style.position = 'absolute';\n                this.dragElement.style.left = `${this.dragStartX}px`;\n                this.dragElement.style.width = `${DEFAULT_DRAG_WIDTH_PX}px`;\n                this.dragElement.style.display = 'block';\n\n                // Capture the FIXED BOUNDARY DATE once. The side that should remain fixed\n                // (start when dragging right, end when dragging left) will reuse this date\n                // throughout the drag lifecycle so auto-scroll cannot shift it.\n                this.dragFixedDateTimestamp = this.calculateDateFromPixelPosition(this.dragStartX);\n                this.dragDirection = 'right';\n\n                // Initialize drag tooltip handler\n                if (!this.dragTooltipHandler) {\n                    this.dragTooltipHandler = new DragResizeTooltipHandler(this.popupHandler);\n                }\n                this.dragTooltipHandler.initialize();\n\n                // Add dragging active class to grid container if available\n                // if (this.params.gridContainer) {\n                //     this.params.gridContainer.classList.add('dg-gantt__task-bar-schedule--active');\n                // }\n\n                // Initialize tooltip for showing start and end dates during drag\n                // this.cleanupHoverTooltip();\n                // this.initializeDragTooltip(this.dragElement);\n                \n                // Initialize tooltip position (content will be updated on first drag move)\n                this.updateDragTooltip();\n                this.updateDragTooltipPosition();\n\n                // Align tooltip pointer with the cursor ONCE at drag start.\n                // The pointer position must not be recalculated during drag move so\n                // that it visually anchors to the initial drag origin.\n                const initialCursorX = mouseEvent ? mouseEvent.clientX : this.dragStartClientX;\n                this.alignDragTooltipPointerToCursor(initialCursorX);\n            },\n            onDragging: (mouseEvent: MouseEvent) => {\n               \n                // Track last X to handle drop even if pointer is over another row\n                this.lastClientX = mouseEvent.clientX;\n                \n                // Check if user has actually dragged (moved more than threshold)\n                if (!this.hasDragged && Math.abs(mouseEvent.clientX - this.dragStartClientX) > DRAG_THRESHOLD_PX) {\n                    this.hasDragged = true;\n                }\n                \n                // Try to initialize autoscroll handler if not already initialized\n                if (!this.autoScrollHandler) {\n                    this.initializeAutoScrollHandler();\n                }\n                \n                // Auto-scroll when dragging near edges (only if handler is ready)\n                if (this.autoScrollHandler) {\n                    // Note: second param is skipVertical, third is skipHorizontal\n                    // We want horizontal scroll, so skipVertical=true, skipHorizontal=false\n                    this.autoScrollHandler.update(mouseEvent, true, false);\n                }\n                \n                // Update drag element position and width dynamically as user drags\n                this.updateDragElementDuringDrag(mouseEvent, timelineContainer);\n                \n                // Update tooltip with start and end dates (if needed)\n                this.updateDragTooltip();\n                \n                // Update tooltip position relative to resizer element\n                this.updateDragTooltipPosition();\n            },\n            onDragStopped: () => {\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_SCHEDULE_ENDED\n                });\n                // Clear autoscroll\n                if (this.autoScrollHandler) {\n                    this.autoScrollHandler.clear();\n                }\n                \n                // Clean up drag tooltip\n                this.cleanupDragTooltip();\n                this.cleanupHoverTooltip();\n\n                \n                // Only update task if user actually dragged (not just clicked)\n                if (this.hasDragged) {\n                    // Handle drop - calculate dates from drag element positions\n                    this.handleTaskScheduleDrop();\n                }\n                \n                // Remove dragging active class\n                // if (this.params.gridContainer) {\n                //     this.params.gridContainer.classList.remove('dg-gantt__task-bar-schedule--active');\n                // }\n                \n                // Clean up drag element (always cleanup, even if no drag)\n                this.cleanup();\n            },\n            onDragCancelled: () => {\n\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_SCHEDULE_CANCELLED\n                });\n                // Clear autoscroll\n                if (this.autoScrollHandler) {\n                    this.autoScrollHandler.clear();\n                }\n                \n                // Clean up drag tooltip\n                this.cleanupDragTooltip();\n                \n                // Remove dragging active class\n                // if (this.params.gridContainer) {\n                //     this.params.gridContainer.classList.remove('dg-gantt__task-bar-schedule--active');\n                // }\n                \n                // Reset drag element state\n                if (this.dragElement) {\n                    this.dragElement.style.display = 'none';\n                }\n                \n                // Clean up\n                this.cleanup();\n            },\n            getRootNode: () => window.document,\n            shouldPreventMouseEvent: () => false\n        };\n\n        dragAndDropHandler.addDragSource(this.dragSourceConfig, true);\n\n        // Create and register drop target for timeline container\n        this.dropTarget = {\n            getContainer: () => timelineContainer,\n            isInterestedIn: (type: string, container: HTMLElement) => {\n                return type === 'emptyBarDrag' && container === this.dragElement;\n            }\n        };\n\n        dragAndDropHandler.addDropTarget(this.dropTarget);\n    }\n\n    /**\n     * Updates the drag element position and width during dragging\n     * Supports bidirectional dragging (left and right directions)\n     * @param mouseEvent - The current mouse event during drag\n     * @param timelineContainer - The timeline container element\n     */\n    private updateDragElementDuringDrag(mouseEvent: MouseEvent, timelineContainer: HTMLElement): void {\n        if (!this.dragElement) {\n            return;\n        }\n\n        // Work entirely in parentElement-local-x. Because parentElement scrolls together\n        // with its ancestor scroll container, (clientX - timelineRect.left) already\n        // captures the current cursor position in the timeline content space.\n        // Using this single coord system guarantees that the FIXED side never drifts.\n        const timelineRect = timelineContainer.getBoundingClientRect();\n        const currentLocalX = mouseEvent.clientX - timelineRect.left;\n        const startLocalX = this.dragStartX;\n\n        const dayWidth = this.params.columnWidth;\n        const viewType = this.params.viewType;\n        const minWidth = this.getMinimumWidth();\n\n        const isDraggingRight = currentLocalX >= startLocalX;\n        this.dragDirection = isDraggingRight ? 'right' : 'left';\n\n        const rawWidth = Math.max(minWidth, Math.abs(currentLocalX - startLocalX));\n        const rawLeft = isDraggingRight ? startLocalX : currentLocalX;\n\n        let left: number;\n        let width: number;\n\n        if (this.isAllDayFillMode && viewType !== VIEW_TYPE.YEAR && viewType !== VIEW_TYPE.QUARTER) {\n            if (isDraggingRight) {\n                left = Math.floor(rawLeft / dayWidth) * dayWidth;\n                const snappedRight = Math.ceil((rawLeft + rawWidth) / dayWidth) * dayWidth;\n                width = Math.max(minWidth, snappedRight - left);\n            } else {\n                left = Math.floor(rawLeft / dayWidth) * dayWidth;\n                const snappedRight = Math.ceil(startLocalX / dayWidth) * dayWidth;\n                width = Math.max(minWidth, snappedRight - left);\n            }\n        } else {\n            left = rawLeft;\n            width = rawWidth;\n        }\n\n        this.dragElement.style.left = `${left}px`;\n        this.dragElement.style.width = `${width}px`;\n\n        if (this.resizerElement) {\n            if (isDraggingRight) {\n                this.resizerElement.style.right = '0';\n                this.resizerElement.style.left = '';\n            } else {\n                this.resizerElement.style.left = '0';\n                this.resizerElement.style.right = '';\n            }\n        }\n    }\n\n    // private calculateDateFromPosition(relativeX: number): number {\n    //     try {\n    //         // Calculate the column width\n    //         const colWidth = this.params.columnWidth;\n            \n    //         if (!colWidth || colWidth <= 0) {\n    //             console.warn('Invalid column width, using fallback');\n    //             return this.dateUtilsInstance.getTimestamp(this.dateUtilsInstance.now());\n    //         }\n        \n    //         // Calculate the absolute left position from the drop position\n    //         const viewType = this.params.viewType;\n            \n    //         // Get project start date and convert to timestamp immediately (timezone-aware)\n    //         // getCurrentProjectStartDate() may return Date, string, or timestamp - convert to timestamp\n    //         const projectStartDate = this.paginationController.getCurrentProjectStartDate();\n    //         let projectStartTimestamp: number;\n            \n    //         // Convert to timestamp first, then apply view-specific adjustments\n    //         const baseTimestamp = this.dateUtilsInstance.getTimestamp(projectStartDate);\n            \n    //         if (viewType === VIEW_TYPE.WEEK) {\n    //             // Convert timestamp to DateTime for week calculation, then back to timestamp\n    //             const projectStartDateTime = this.dateUtilsInstance.parseDate(baseTimestamp);\n    //             const weekStartDateTime = this.dateUtilsInstance.getWeekStartDate(projectStartDateTime, 'sunday');\n    //             projectStartTimestamp = this.dateUtilsInstance.getTimestamp(weekStartDateTime);\n    //         } else if (viewType === VIEW_TYPE.DAY) {\n    //             // Convert timestamp to DateTime for day calculation, then back to timestamp\n    //             const projectStartDateTime = this.dateUtilsInstance.parseDate(baseTimestamp);\n    //             const startOfDayDateTime = this.dateUtilsInstance.startOfDay(projectStartDateTime);\n    //             projectStartTimestamp = this.dateUtilsInstance.getTimestamp(startOfDayDateTime);\n    //         } else {\n    //             // Use timestamp directly for other views\n    //             projectStartTimestamp = baseTimestamp;\n    //         }\n            \n    //         // Calculate what date the position corresponds to using exact fractional values\n    //         // All calculations are done in milliseconds (timestamp-based)\n    //         let targetTimestamp: number;\n            \n    //         if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n    //             // Use exact fractional days for precise positioning\n    //             // Convert timestamp to DateTime for addDays, then back to timestamp\n    //             const daysFromStart = relativeX / colWidth;\n    //             const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartTimestamp);\n    //             const targetDateTime = this.dateUtilsInstance.addDays(projectStartDateTime, daysFromStart);\n    //             targetTimestamp = this.dateUtilsInstance.getTimestamp(targetDateTime);\n    //         } else if (viewType === VIEW_TYPE.YEAR) {\n    //             // Use exact fractional months and days for precise positioning\n    //             const monthsFromStart = relativeX / colWidth;\n    //             const monthIndex = Math.floor(monthsFromStart);\n    //             const fractionalMonth = monthsFromStart - monthIndex;\n                \n    //             // Convert timestamp to DateTime for month operations\n    //             const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartTimestamp);\n                \n    //             // Add whole months first (returns DateTime)\n    //             const targetMonthDateTime = this.dateUtilsInstance.addMonths(projectStartDateTime, monthIndex);\n                \n    //             // Get days in month (requires DateTime, returns number)\n    //             const daysInMonth = this.dateUtilsInstance.getDaysInMonth(targetMonthDateTime);\n    //             const daysOffset = fractionalMonth * daysInMonth;\n                \n    //             // Add fractional days and convert back to timestamp\n    //             if (daysOffset !== 0) {\n    //                 const targetDateTime = this.dateUtilsInstance.addDays(targetMonthDateTime, daysOffset);\n    //                 targetTimestamp = this.dateUtilsInstance.getTimestamp(targetDateTime);\n    //             } else {\n    //                 targetTimestamp = this.dateUtilsInstance.getTimestamp(targetMonthDateTime);\n    //             }\n    //         } else if (viewType === VIEW_TYPE.QUARTER) {\n    //             // Use exact fractional months and days for precise positioning\n    //             const monthsFromStart = relativeX / colWidth;\n    //             const monthIndex = Math.floor(monthsFromStart);\n    //             const fractionalMonth = monthsFromStart - monthIndex;\n                \n    //             // Convert timestamp to DateTime for month operations\n    //             const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartTimestamp);\n                \n    //             // Add whole months first (returns DateTime)\n    //             const targetMonthDateTime = this.dateUtilsInstance.addMonths(projectStartDateTime, monthIndex);\n                \n    //             // Get days in month (requires DateTime, returns number)\n    //             const daysInMonth = this.dateUtilsInstance.getDaysInMonth(targetMonthDateTime);\n    //             const daysOffset = fractionalMonth * daysInMonth;\n                \n    //             // Add fractional days and convert back to timestamp\n    //             if (daysOffset !== 0) {\n    //                 const targetDateTime = this.dateUtilsInstance.addDays(targetMonthDateTime, daysOffset);\n    //                 targetTimestamp = this.dateUtilsInstance.getTimestamp(targetDateTime);\n    //             } else {\n    //                 targetTimestamp = this.dateUtilsInstance.getTimestamp(targetMonthDateTime);\n    //             }\n    //         } else {\n    //             // DAY view - use pure timestamp arithmetic (milliseconds)\n    //             // Calculate hours from start and convert to milliseconds\n    //             const hoursFromStart = relativeX / colWidth;\n    //             const millisecondsFromStart = hoursFromStart * 60 * 60 * 1000; // Convert hours to milliseconds\n    //             targetTimestamp = projectStartTimestamp + millisecondsFromStart;\n    //         }\n\n    //         return targetTimestamp;\n    //     } catch (error) {\n    //         console.error('Error calculating date from position:', error);\n    //         // Return fallback date (current time) as timestamp\n    //         return this.dateUtilsInstance.getTimestamp(this.dateUtilsInstance.now());\n    //     }\n    // }\n\n    private handleTaskScheduleDrop(): void {\n        try {\n            const data = this.params.data;\n            const oldData = { ...data };\n            if (!data) {\n                console.warn('No data available for task schedule drop');\n                return;\n            }\n\n            if (!this.dragElement) {\n                console.warn('Drag element not found during drop');\n                return;\n            }\n\n            // Get actual left and right positions from drag element (in relative coordinates)\n            const dragLeft = parseFloat(this.dragElement.style.left) || 0;\n            const dragWidth = parseFloat(this.dragElement.style.width) || 0;\n            const dragRight = dragLeft + dragWidth;\n\n            const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n            const timezone = optionHandler.getTimezone();\n            const MS_PER_DAY = 86400000;\n\n            // Pixel → real UTC via shared timezone-aware helper (GMT timeline math + convert).\n            // Right edge is an exclusive end (non-all-day): the grid line between day 10\n            // and 11 is Aug 11 00:00, but the bar still occupies only column 10 — use the\n            // last included instant so tooltip/data show Aug 10, not Aug 11.\n            let newStartDateTimestamp = this.calculateDateFromPixelPosition(dragLeft);\n            let newEndDateTimestamp = this.calculateDateFromPixelPosition(dragRight, !this.isAllDayFillMode);\n\n            if (this.isAllDayFillMode) {\n                // Inclusive all-day span: 1 day width → end of start day, N days → end of day (N-1)\n                const durationInDays = (newEndDateTimestamp - newStartDateTimestamp) / MS_PER_DAY;\n                const effectiveDurationInDays = Math.max(1, durationInDays);\n                const targetDateTimestamp = newStartDateTimestamp + ((effectiveDurationInDays - 1) * MS_PER_DAY);\n                newEndDateTimestamp = this.dateUtilsInstance.getEndOfDayForUTCTimestampAsTimestamp(targetDateTimestamp, timezone);\n                newStartDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(newStartDateTimestamp, timezone);\n            }\n\n            // Pin the FIXED boundary to the date captured at drag start so that\n            // auto-scroll, snapping, or any pixel re-derivation cannot shift it.\n            //   Right drag -> start is fixed (cursor extends to the right)\n            //   Left drag  -> end is fixed   (cursor extends to the left)\n            if (this.dragFixedDateTimestamp !== null && this.dragDirection !== null) {\n                if (this.dragDirection === 'right') {\n                    newStartDateTimestamp = this.dragFixedDateTimestamp;\n                    if (this.isAllDayFillMode) {\n                        newStartDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(newStartDateTimestamp, timezone);\n                    }\n                } else {\n                    newEndDateTimestamp = this.dragFixedDateTimestamp;\n                    if (this.isAllDayFillMode) {\n                        newEndDateTimestamp = this.dateUtilsInstance.getEndOfDayForUTCTimestampAsTimestamp(newEndDateTimestamp, timezone);\n                    }\n                }\n            }\n            // Enforce minimum width constraint based on view type (timestamp-based duration)\n            const minWidthDuration = this.getMinimumWidthDuration(); // Returns milliseconds (timestamp)\n            const currentDuration = newEndDateTimestamp - newStartDateTimestamp; // Pure timestamp arithmetic\n\n            let finalStartDateTimestamp: number = newStartDateTimestamp;\n            let finalEndDateTimestamp: number = newEndDateTimestamp;\n\n            if (currentDuration < minWidthDuration) {\n                // Maintain the minimum duration WITHOUT moving the fixed boundary:\n                // - Right drag keeps start fixed; push end out.\n                // - Left  drag keeps end fixed;   pull start back.\n                if (this.dragDirection === 'left') {\n                    finalStartDateTimestamp = newEndDateTimestamp - minWidthDuration;\n                } else {\n                    finalEndDateTimestamp = newStartDateTimestamp + minWidthDuration;\n                }\n            }\n\n            const newData = {\n                startDate: finalStartDateTimestamp,\n                taskID: data.taskID,\n                endDate: finalEndDateTimestamp\n            };\n            \n            const ganttViewHookManager = this.params.getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER);\n                \n            const metas = {\n                oldData: oldData,\n                newData: newData,\n                eventOrigin: 'dragToScheduleTask',\n                event: null,\n                userParams: null\n            };\n            \n            const api = () => {\n                const hookMeta: IGanttHookMeta = {\n                    eventOrigin: 'dragToScheduleTask',\n                    event: {} as any\n                };\n               \n                this.taskApi.updateTaskDataById(newData.taskID, {\n                    startDate: newData.startDate,\n                    taskID: newData.taskID,\n                    endDate: newData.endDate\n                }, hookMeta);\n            };\n\n            ganttViewHookManager.executeBeforeHook('onBeforeScheduleDrop', api, metas);\n        } catch (error) {\n            console.error('Error handling task schedule drop:', error);\n            // Re-throw to allow caller to handle if needed\n            throw error;\n        }\n    }\n\n    /**\n     * GMT month arithmetic matching PaginationController — keeps wall-clock components\n     * stable without applying IANA timezone setZone to GMT-shifted timestamps.\n     */\n    private addMonthsGMT(timestamp: number, months: number): number {\n        const date = new Date(timestamp);\n        const newMonth = date.getUTCMonth() + months;\n        const newYear = date.getUTCFullYear() + Math.floor(newMonth / 12);\n        const finalMonth = ((newMonth % 12) + 12) % 12;\n        const daysInMonth = new Date(Date.UTC(newYear, finalMonth + 1, 0)).getUTCDate();\n        const day = Math.min(date.getUTCDate(), daysInMonth);\n        return Date.UTC(\n            newYear,\n            finalMonth,\n            day,\n            date.getUTCHours(),\n            date.getUTCMinutes(),\n            date.getUTCSeconds(),\n            date.getUTCMilliseconds()\n        );\n    }\n\n    private getDaysInMonthGMT(timestamp: number): number {\n        const date = new Date(timestamp);\n        return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth() + 1, 0)).getUTCDate();\n    }\n\n    /**\n     * Convert a parentElement-local-x pixel position into a real UTC timestamp.\n     *\n     * PaginationController stores the timeline anchor as a GMT wall-clock timestamp\n     * (local calendar components encoded as UTC). Pixel math must stay in that GMT\n     * space — the same as getCurrentViewPortDate — then convertTimezoneTimestampToUTC\n     * maps the wall-clock instant into real UTC for the configured timezone.\n     *\n     * Using parseDate/getStartOfMonth/etc. on the GMT anchor is incorrect: setZone\n     * (e.g. America/Chicago) shifts Aug 1 00:00Z to the previous local evening and\n     * snaps to the prior month, which drifts the drag date by about a month over\n     * long ranges (Aug 2026 click → wrong month in tooltip/data).\n     *\n     * @param isExclusiveEnd - when true (right edge of a range), return the last\n     *   included instant so a bar ending on a day-column grid line maps to that\n     *   column's calendar day, not the next day's 00:00.\n     */\n    private calculateDateFromPixelPosition(pixelPosition: number, isExclusiveEnd: boolean = false): number {\n        const colWidth = this.params.columnWidth;\n        const viewType = this.params.viewType;\n        const MS_PER_HOUR = 3600000;\n        const MS_PER_DAY = 86400000;\n\n        const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n        const timezone = optionHandler ? optionHandler.getTimezone() : null;\n\n        // Already view-aligned in GMT by PaginationController.updateProjectDateRange\n        const projectStartGmt = this.paginationController.getCurrentProjectStartDate();\n\n        let gmtTimestamp: number;\n\n        if (viewType === VIEW_TYPE.DAY) {\n            const hoursFromStart = pixelPosition / colWidth;\n            gmtTimestamp = projectStartGmt + (hoursFromStart * MS_PER_HOUR);\n        } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n            const daysFromStart = pixelPosition / colWidth;\n            gmtTimestamp = projectStartGmt + (daysFromStart * MS_PER_DAY);\n        } else if (viewType === VIEW_TYPE.YEAR || viewType === VIEW_TYPE.QUARTER) {\n            const monthsFromStart = pixelPosition / colWidth;\n            const monthIndex = Math.floor(monthsFromStart);\n            const fractionalMonth = monthsFromStart - monthIndex;\n            const monthStartGmt = this.addMonthsGMT(projectStartGmt, monthIndex);\n            const daysInMonth = this.getDaysInMonthGMT(monthStartGmt);\n            gmtTimestamp = monthStartGmt + (fractionalMonth * daysInMonth * MS_PER_DAY);\n        } else {\n            const daysFromStart = pixelPosition / colWidth;\n            gmtTimestamp = projectStartGmt + (daysFromStart * MS_PER_DAY);\n        }\n\n        // GMT wall-clock → real UTC for configured timezone (no-op when timezone unset)\n        const utcTimestamp = this.dateUtilsInstance.convertTimezoneTimestampToUTC(gmtTimestamp, timezone);\n        // Exclusive end on a grid line is 00:00 of the next day; step back 1ms so the\n        // tooltip/data stay on the day column the bar visually occupies.\n        return isExclusiveEnd ? utcTimestamp - 1 : utcTimestamp;\n    }\n\n    /**\n     * Get the minimum duration in milliseconds based on view type\n     * Minimum is always one pixel of timeline width mapped to time (same scale as drop calculation).\n     */\n    private getMinimumWidthDuration(): number {\n        const viewType = this.params.viewType;\n        const colWidth = this.params.columnWidth;\n        const MS_PER_HOUR = 3600000;\n        \n        // Get project start date for reference and convert to timestamp\n        let projectStartDate = this.paginationController.getCurrentProjectStartDate();\n        let projectStartTimestamp: number;\n        \n        if (viewType === VIEW_TYPE.WEEK) {\n            const weekStartDateTime = this.dateUtilsInstance.getWeekStartDate(projectStartDate, 'sunday');\n            projectStartTimestamp = this.dateUtilsInstance.getTimestamp(weekStartDateTime);\n        } else if (viewType === VIEW_TYPE.DAY) {\n            const startOfDayDateTime = this.dateUtilsInstance.startOfDay(projectStartDate);\n            projectStartTimestamp = this.dateUtilsInstance.getTimestamp(startOfDayDateTime);\n        } else {\n            projectStartTimestamp = this.dateUtilsInstance.getTimestamp(projectStartDate);\n        }\n        \n        if (viewType === VIEW_TYPE.DAY) {\n            // DAY view: colWidth is pixels per hour — duration for 1px matches handleTaskScheduleDrop\n            const safeColWidth = colWidth > 0 ? colWidth : 1;\n            return MS_PER_HOUR / safeColWidth;\n        } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n            // For MONTH/WEEK view, 1px represents a fraction of a day\n            const daysPerPixel = 1 / colWidth;\n            const minDateTime = this.dateUtilsInstance.addDays(projectStartTimestamp, daysPerPixel);\n            const minTimestamp = this.dateUtilsInstance.getTimestamp(minDateTime);\n            return minTimestamp - projectStartTimestamp;\n        } else if (viewType === VIEW_TYPE.YEAR || viewType === VIEW_TYPE.QUARTER) {\n            // For YEAR/QUARTER view, 1px represents a fraction of a month\n            const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartTimestamp);\n            const daysInMonth = this.dateUtilsInstance.getDaysInMonth(projectStartDateTime);\n            const widthPerDay = colWidth / daysInMonth;\n            const daysPerPixel = 1 / widthPerDay;\n            const minDateTime = this.dateUtilsInstance.addDays(projectStartTimestamp, daysPerPixel);\n            const minTimestamp = this.dateUtilsInstance.getTimestamp(minDateTime);\n            return minTimestamp - projectStartTimestamp;\n        } else {\n            // Default: 1px represents a fraction of a day\n            const daysPerPixel = 1 / colWidth;\n            const minDateTime = this.dateUtilsInstance.addDays(projectStartTimestamp, daysPerPixel);\n            const minTimestamp = this.dateUtilsInstance.getTimestamp(minDateTime);\n            return minTimestamp - projectStartTimestamp;\n        }\n    }\n\n    private initializeAutoScrollHandler(controllerParams?: any): void {\n        if (this.autoScrollHandler) {\n            return; // Already initialized\n        }\n\n        // If controllerParams provided, use them (from onAfterGridReady callback)\n        if (controllerParams) {\n            const bodyController = controllerParams.bodyController;\n            const centerController = controllerParams.centerRowContainerControl;\n            \n            if (bodyController) {\n                this.scrollHandler = bodyController.getScrollHandler();\n                this.scrollContainer = bodyController.getViewPortContainer();\n            }\n            \n            if (centerController) {\n                this.horizontalScrollContainer = centerController.getViewPortContainer();\n            }\n            \n            // Create handler if we have both containers\n            if (this.scrollContainer && this.horizontalScrollContainer) {\n                this.createAutoScrollHandler();\n                return;\n            }\n        }\n        \n        // Fallback: try to find scroll containers manually\n        this.findScrollContainers();\n        \n        // If we found containers, create handler\n        if (this.scrollContainer && this.horizontalScrollContainer) {\n            this.createAutoScrollHandler();\n        }\n    }\n\n    private findScrollContainers(): void {\n        // Try to get scroll containers from params first\n        if (this.params.scrollHolder) {\n            this.scrollContainer = this.params.scrollHolder as HTMLElement;\n        }\n        \n        // Find horizontal scroll container (center column viewport)\n        // Look for elements with class names that might indicate scroll containers\n        let element: HTMLElement | null = this.parentElement;\n        let foundHorizontal = false;\n        \n        while (element && element !== document.body) {\n            // Check if this element is scrollable horizontally\n            if (element.scrollWidth > element.clientWidth && !foundHorizontal) {\n                this.horizontalScrollContainer = element;\n                foundHorizontal = true;\n            }\n            \n            // Also check for common scroll container class names\n            const classList = element.classList;\n            if (classList && (classList.contains('ZG-centerColViewport') || \n                classList.contains('dg-gantt-timeline-container') ||\n                element.getAttribute('class')?.includes('viewport'))) {\n                if (!this.horizontalScrollContainer) {\n                    this.horizontalScrollContainer = element;\n                }\n            }\n            \n            element = element.parentElement;\n        }\n\n        // Find vertical scroll container if not already set\n        if (!this.scrollContainer) {\n            element = this.parentElement;\n            while (element && element !== document.body) {\n                if (element.scrollHeight > element.clientHeight) {\n                    this.scrollContainer = element;\n                    break;\n                }\n                element = element.parentElement;\n            }\n        }\n\n        // Fallback: use parentElement if it's scrollable\n        if (!this.horizontalScrollContainer && this.parentElement.scrollWidth > this.parentElement.clientWidth) {\n            this.horizontalScrollContainer = this.parentElement;\n        }\n        \n        if (!this.scrollContainer && this.parentElement.scrollHeight > this.parentElement.clientHeight) {\n            this.scrollContainer = this.parentElement;\n        }\n    }\n\n    private createAutoScrollHandler(): void {\n        if (!this.scrollContainer || !this.horizontalScrollContainer) {\n            // Can't create autoscroll handler without containers\n            return;\n        }\n\n        const scrollOptions: IAutoScrollOptions = {\n            scrollContainer: this.scrollContainer,\n            horizontalScrollContainer: this.horizontalScrollContainer,\n            scrollAxis: 'x', // Only horizontal scroll for drag to schedule\n            getVerticalPosition: () => {\n                if (this.scrollHandler) {\n                    return this.scrollHandler.getVScrollPosition().top;\n                }\n                return this.scrollContainer?.scrollTop || 0;\n            },\n            setVerticalPosition: (position: number) => {\n                if (this.scrollHandler) {\n                    this.scrollHandler.setVerticalScrollPosition(position);\n                } else if (this.scrollContainer) {\n                    this.scrollContainer.scrollTop = position;\n                }\n            },\n            getHorizontalPosition: () => {\n                if (this.scrollHandler) {\n                    return this.scrollHandler.getHScrollPosition().left;\n                }\n                return this.horizontalScrollContainer?.scrollLeft || 0;\n            },\n            setHorizontalPosition: (position: number) => {\n                if (this.scrollHandler) {\n                    this.scrollHandler.setHorizontalScrollPosition(position);\n                } else if (this.horizontalScrollContainer) {\n                    this.horizontalScrollContainer.scrollLeft = position;\n                }\n            },\n            shouldSkipVerticalScroll: () => true, // Skip vertical scroll\n            shouldSkipHorizontalScroll: () => false, // Enable horizontal scroll (don't skip)\n            onScrollCallback: () => {\n                // Update drag element position when scrolling\n                this.handleAutoScrollWhileDragging();\n            },\n            scrollConfig: [\n                { percent: 0, speed: 15 },\n            ]\n        };\n\n        this.autoScrollHandler = new AutoScrollHandler(scrollOptions);\n    }\n\n    private handleAutoScrollWhileDragging(): void {\n        // When auto-scroll fires, the cursor is parked at the viewport edge while the\n        // scroll container drags content under it. Because parentElement is INSIDE the\n        // scroll container, parentElement's bounding rect changes during the scroll, so\n        // (lastClientX - timelineRect.left) now reports a NEW parent-local-x for the\n        // cursor. We use that to grow/shrink only the active side, while the fixed side\n        // stays anchored to the original click position (this.dragStartX).\n        if (!this.dragElement || this.lastClientX === 0) {\n            return;\n        }\n\n        const timelineContainer = this.params.parentElement as HTMLElement;\n        const timelineRect = timelineContainer.getBoundingClientRect();\n        const currentLocalX = this.lastClientX - timelineRect.left;\n        const startLocalX = this.dragStartX;\n\n        const dayWidth = this.params.columnWidth;\n        const viewType = this.params.viewType;\n        const minWidth = this.getMinimumWidth();\n        const isDraggingRight = currentLocalX >= startLocalX;\n        this.dragDirection = isDraggingRight ? 'right' : 'left';\n\n        let left: number;\n        let width: number;\n\n        if (isDraggingRight) {\n            // Active side = right edge. Left edge anchored at startLocalX (NEVER moves).\n            left = startLocalX;\n            const targetRight = Math.max(currentLocalX, startLocalX + minWidth);\n            width = targetRight - left;\n\n            if (this.isAllDayFillMode && viewType !== VIEW_TYPE.YEAR && viewType !== VIEW_TYPE.QUARTER) {\n                left = Math.floor(left / dayWidth) * dayWidth;\n                const snappedRight = Math.ceil(targetRight / dayWidth) * dayWidth;\n                width = Math.max(minWidth, snappedRight - left);\n            }\n        } else {\n            // Active side = left edge. Right edge anchored at startLocalX (NEVER moves).\n            const fixedRight = startLocalX;\n            left = Math.min(currentLocalX, fixedRight - minWidth);\n            width = fixedRight - left;\n\n            if (this.isAllDayFillMode && viewType !== VIEW_TYPE.YEAR && viewType !== VIEW_TYPE.QUARTER) {\n                left = Math.floor(left / dayWidth) * dayWidth;\n                const snappedRight = Math.ceil(fixedRight / dayWidth) * dayWidth;\n                width = Math.max(minWidth, snappedRight - left);\n            }\n        }\n\n        this.dragElement.style.left = `${left}px`;\n        this.dragElement.style.width = `${width}px`;\n\n        if (this.resizerElement) {\n            if (isDraggingRight) {\n                this.resizerElement.style.right = '0';\n                this.resizerElement.style.left = '';\n            } else {\n                this.resizerElement.style.left = '0';\n                this.resizerElement.style.right = '';\n            }\n        }\n\n        // Tooltip content also depends on the bar's edges — refresh it so the date the\n        // user sees in the tooltip stays consistent with the bar that's drawn.\n        this.updateDragTooltip();\n        this.updateDragTooltipPosition();\n    }\n\n    /**\n     * Minimum drag width in pixels (visual floor). Duration still comes from pixel distance × time-per-pixel.\n     */\n    private getMinimumWidth(): number {\n        return 1;\n    }\n\n    private cleanup(): void {\n        // Cancel any pending drag start operations\n        if (this.dragStartAnimationFrameId !== null) {\n            cancelAnimationFrame(this.dragStartAnimationFrameId);\n            this.dragStartAnimationFrameId = null;\n        }\n\n        // Hide drag element (don't remove, keep it for next drag)\n        if (this.dragElement) {\n            this.dragElement.style.display = 'none';\n            this.dragElement.style.opacity = '1';\n            this.dragElement.style.width = `${DEFAULT_DRAG_WIDTH_PX}px`;\n        }\n\n        // Remove drag source and drop target\n        if (this.dragSourceConfig) {\n            const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n            if (dragAndDropHandler) {\n                dragAndDropHandler.removeDragSource(this.dragSourceConfig);\n            }\n            this.dragSourceConfig = null;\n        }\n\n        if (this.dropTarget) {\n            const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n            if (dragAndDropHandler) {\n                dragAndDropHandler.removeDropTarget(this.dropTarget);\n            }\n            this.dropTarget = null;\n        }\n\n        // Reset drag state\n        this.dragStartX = 0;\n        // this.dragStartDate = null;\n        this.lastClientX = 0;\n        this.dragStartClientX = 0;\n        this.hasDragged = false;\n        this.dragFixedDateTimestamp = null;\n        this.dragDirection = null;\n    }\n\n    /**\n     * Initializes the drag tooltip for showing start and end dates during dragging\n     * @param dragElement - The drag element to attach the tooltip to\n     */\n    // private initializeDragTooltip(dragElement: HTMLElement): void {\n    //     // Clean up existing drag tooltip if any\n    //     // if (this.dragTooltipComponent) {\n    //     //     this.cleanupDragTooltip();\n    //     // }\n\n    //     const registerTooltipElement = (element: HTMLElement) => {\n    //         this.dragTooltipElement = element;\n    //     };\n\n    //     // Create tooltip configuration\n    //     const tooltipConfiguration: ITooltipConfiguration = {\n    //         popupParent                 : this.parentElement,\n    //         tooltipValue                : 'Drag to schedule',\n    //         shouldShowTooltip           : () => true,\n    //         shouldAttachEvents          : true,\n    //         position                    : 'topRight' as any,\n    //         gapX                        : 0,\n    //         gapY                        : 0,\n    //         keepWithinBounds            : false,\n    //         hideTooltip                 : false,\n    //         tooltipTrigger              : TooltipTriggerStates.HOVER,\n    //         tooltipShowDelay            : 0,\n    //         tooltipHideDelay            : 0,\n    //         tooltipMouseTrack           : true,\n    //         tooltipInteraction          : false,\n    //         fadeOutDelayAfterInteraction: 0,\n    //         renderer                    : ToolTipComponent,\n    //         userRendererParams          : {\n    //             registerTooltipElement: registerTooltipElement\n    //         }\n    //     };\n\n    //     // Initialize tooltip\n    //     this.dragTooltipComponent = new Tooltip(dragElement, tooltipConfiguration);\n    //     this.dragTooltipComponent.api.open();\n    // }\n\n    /**\n     * Updates the drag tooltip with start and end dates during dragging\n     * @param mouseEvent - The current mouse event during drag\n     */\n    private updateDragTooltip(): void {\n        if (!this.dragTooltipHandler || !this.dragElement) return;\n        // console.log('updateDragTooltip');\n\n        // Get actual left and right positions from drag element (in relative coordinates)\n        const dragLeft = parseFloat(this.dragElement.style.left) || 0;\n        const dragWidth = parseFloat(this.dragElement.style.width) || 0;\n        const dragRight = dragLeft + dragWidth;\n\n        const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n        const timezone = optionHandler.getTimezone();\n        const MS_PER_DAY = 86400000;\n\n        // Pixel → real UTC via shared timezone-aware helper (GMT timeline math + convert).\n        // Right edge is exclusive in exact-time mode (see handleTaskScheduleDrop).\n        let startDateTimestamp = this.calculateDateFromPixelPosition(dragLeft);\n        let endDateTimestamp = this.calculateDateFromPixelPosition(dragRight, !this.isAllDayFillMode);\n\n        if (this.isAllDayFillMode) {\n            const durationInDays = (endDateTimestamp - startDateTimestamp) / MS_PER_DAY;\n            const effectiveDurationInDays = Math.max(1, durationInDays);\n            const targetDateTimestamp = startDateTimestamp + ((effectiveDurationInDays - 1) * MS_PER_DAY);\n            endDateTimestamp = this.dateUtilsInstance.getEndOfDayForUTCTimestampAsTimestamp(targetDateTimestamp, timezone);\n        }\n\n        // Pin the FIXED boundary to the date captured at drag start so that the\n        // tooltip ALWAYS shows the original click date for the side that should not\n        // move, regardless of any pixel drift introduced by auto-scroll.\n        if (this.dragFixedDateTimestamp !== null && this.dragDirection !== null) {\n            if (this.dragDirection === 'right') {\n                startDateTimestamp = this.dragFixedDateTimestamp;\n            } else {\n                endDateTimestamp = this.dragFixedDateTimestamp;\n                if (this.isAllDayFillMode) {\n                    endDateTimestamp = this.dateUtilsInstance.getEndOfDayForUTCTimestampAsTimestamp(endDateTimestamp, timezone);\n                }\n            }\n        }\n\n        // Get drag to schedule formatter from option handler\n        const dragToScheduleFormatter = optionHandler.getFormatterForDragToSchedule();\n        \n        // Normalize dates for all-day mode to ensure accurate duration calculation\n        let normalizedStartDateTimestamp: number | undefined = startDateTimestamp;\n        let normalizedEndDateTimestamp: number | undefined = endDateTimestamp;\n        \n        if (this.isAllDayFillMode) {\n            // Floor every date to start-of-day so that inclusive daysBetween\n            // matches the dates the user sees in the tooltip.\n            normalizedStartDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(startDateTimestamp, timezone);\n            normalizedEndDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(endDateTimestamp, timezone);\n        }\n        \n        // Calculate duration for display using normalized dates for accurate calculation\n        // In all-day mode, use normalized dates; in normal mode, use raw timestamps\n        const durationInMilliseconds = this.isAllDayFillMode && normalizedStartDateTimestamp !== undefined && normalizedEndDateTimestamp !== undefined\n            ? normalizedEndDateTimestamp - normalizedStartDateTimestamp\n            : endDateTimestamp - startDateTimestamp;\n        \n        // Build tooltip content directly (performance optimized - no text parsing)\n        let startDateText: string;\n        let endDateText: string;\n        let durationText: string | undefined;\n        \n        if (dragToScheduleFormatter) {\n            // Create a wrapper function that adapts dateUtils.formatDate to match the formatter signature\n            // The formatter expects: (timestamp: number, format: string) => string\n            const formatterFn = (timestamp: number, format: string): string => {\n                const dateTime = this.dateUtilsInstance.parseDate(timestamp);\n                return this.dateUtilsInstance.formatDate(dateTime, format);\n            };\n            \n            // Call the drag to schedule formatter\n            const formattedResult = dragToScheduleFormatter(formatterFn, startDateTimestamp, endDateTimestamp);\n            startDateText = formattedResult.startDate;\n            endDateText = formattedResult.endDate;\n            \n            // Add duration if showDuration is true\n            if (formattedResult.showDuration) {\n                durationText = this.formatDuration(\n                    durationInMilliseconds,\n                    normalizedStartDateTimestamp,\n                    normalizedEndDateTimestamp\n                );\n            }\n        } else {\n            // Default formatter: Parse timestamps to DateTime objects with timezone awareness\n            const startDateTime = this.dateUtilsInstance.parseDate(startDateTimestamp);\n            const endDateTime = this.dateUtilsInstance.parseDate(endDateTimestamp);\n            \n            // Format dates based on All-Day Fill Mode\n            // If All-Day Fill Mode is enabled, show only date format (no time)\n            // Otherwise, show date and time format\n            const dateFormat = this.isAllDayFillMode ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss';\n            startDateText = this.dateUtilsInstance.formatDate(startDateTime, dateFormat);\n            endDateText = this.dateUtilsInstance.formatDate(endDateTime, dateFormat);\n        }\n        \n        // Create tooltip content directly (performance optimized)\n        const tooltipContent: ITooltipContent = this.createTooltipContent(startDateText, endDateText, durationText);\n        \n        // Update tooltip content using handler\n        if (this.dragTooltipHandler) {\n            this.dragTooltipHandler.updateContent(tooltipContent);\n        }\n    }\n\n    /**\n     * Create ITooltipContent from start date, end date, and optional duration\n     * Performance optimized - directly accepts values instead of parsing text\n     */\n    private createTooltipContent(startDateText: string, endDateText: string, durationText?: string): ITooltipContent {\n        return {\n            startDate: startDateText,\n            endDate: endDateText,\n            duration: durationText,\n        };\n    }\n\n    // Helper function to calculate duration as number of days difference\n    // For All-Day mode: calculates calendar days difference\n    // For Normal mode: calculates days with proper rounding\n    private formatDuration(durationMs: number, startDateTimestamp?: number, endDateTimestamp?: number): string {\n        const MS_PER_DAY = 86400000;\n        const MS_PER_MINUTE = 60000;\n\n        let days = 0;\n        let hours = 0;\n        let minutes = 0;\n\n        if (this.isAllDayFillMode) {\n            if (startDateTimestamp !== undefined && endDateTimestamp !== undefined) {\n                try {\n                    const startDateTime = this.dateUtilsInstance.parseDate(startDateTimestamp);\n                    const endDateTime = this.dateUtilsInstance.parseDate(endDateTimestamp);\n\n                    if (startDateTime.isValid && endDateTime.isValid) {\n                        // Both dates are floored to start-of-day, so inclusive=true\n                        // counts both the start and end dates the user sees.\n                        days = this.dateUtilsInstance.daysBetween(startDateTime, endDateTime, true);\n                    } else {\n                        days = Math.ceil(durationMs / MS_PER_DAY);\n                    }\n                } catch {\n                    days = Math.ceil(durationMs / MS_PER_DAY);\n                }\n            } else {\n                days = Math.ceil(durationMs / MS_PER_DAY);\n            }\n            days = Math.max(1, days);\n        } else {\n            // Normal mode: break into days / hours / minutes\n            const totalMinutes = Math.max(1, Math.round(durationMs / MS_PER_MINUTE));\n            days = Math.floor(totalMinutes / 1440);\n            const remainingAfterDays = totalMinutes % 1440;\n            hours = Math.floor(remainingAfterDays / 60);\n            minutes = remainingAfterDays % 60;\n        }\n\n        const dayLabel = days === 1 ? 'day' : 'days';\n        const hourLabel = hours === 1 ? 'hr' : 'hrs';\n        const minuteLabel = minutes === 1 ? 'min' : 'mins';\n\n        return `${days}${dayLabel} ${hours}${hourLabel} ${minutes}${minuteLabel}`;\n    }\n\n    private updateDragTooltipPosition(): void {\n        if (!this.dragElement || !this.dragTooltipHandler || !this.resizerElement || !this.gridContainer) return;\n        \n        // Configure tooltip position\n        const positionConfig: ITooltipPositionConfig = {\n            sourceElement: this.resizerElement,\n            containerElement: this.gridContainer,\n            position: Position.bottom,\n            fallbackPositions: [Position.top],\n            alignSide: 'left',\n            gapX: 0,\n            gapY: 10,\n            keepWithinBounds: true,\n            tooltipType: 'dragtoschedule',\n        };\n        \n        // Update tooltip position using handler\n        this.dragTooltipHandler.updatePosition(positionConfig);\n    }\n\n    /**\n     * Align the tooltip's triangle pointer to the cursor X position.\n     *\n     * Called ONCE at drag start so the pointer visually anchors at the spot the\n     * user clicked. Subsequent drag moves intentionally do NOT recompute this —\n     * the tooltip body shifts via `updateDragTooltipPosition`, but the pointer\n     * stays locked to the original cursor location.\n     *\n     * The value is applied as an inline CSS variable (`--popover-pointer-left`)\n     * on the tooltip element, overriding the default 50% set by the parent class.\n     * A small edge padding is enforced so the triangle never visually escapes\n     * the rounded corners of the tooltip.\n     */\n    private alignDragTooltipPointerToCursor(cursorX: number): void {\n        if (!this.dragTooltipHandler) {\n            return;\n        }\n        const tooltipElement = this.dragTooltipHandler.getTooltipElement();\n        if (!tooltipElement) {\n            return;\n        }\n\n        const tooltipRect = tooltipElement.getBoundingClientRect();\n        if (tooltipRect.width === 0) {\n            return;\n        }\n\n        const rawPointerLeft = cursorX - tooltipRect.left;\n        const minPointerLeft = TOOLTIP_POINTER_EDGE_PADDING_PX;\n        const maxPointerLeft = Math.max(minPointerLeft, tooltipRect.width - TOOLTIP_POINTER_EDGE_PADDING_PX);\n        const clampedPointerLeft = Math.max(minPointerLeft, Math.min(maxPointerLeft, rawPointerLeft));\n\n        tooltipElement.style.setProperty('--popover-pointer-left', `${clampedPointerLeft}px`);\n    }\n\n    private cleanupDragTooltip(): void {\n        if (this.dragTooltipComponent) {\n            this.dragTooltipComponent.api.close();\n            this.dragTooltipComponent = null;\n        }\n        \n        // Clean up drag tooltip handler\n        if (this.dragTooltipHandler) {\n            this.dragTooltipHandler.cleanup();\n            this.dragTooltipHandler = null;\n        }\n    }\n\n    private cleanupHoverTooltip(): void {\n        if (this.tooltipComponent) {\n            this.tooltipComponent.api.close();\n            this.tooltipComponent = null;\n        }\n        // this.tooltipElement = null;\n    }\n\n    public destroy(): void {\n        // Cancel any pending operations\n        if (this.dragStartAnimationFrameId !== null) {\n            cancelAnimationFrame(this.dragStartAnimationFrameId);\n            this.dragStartAnimationFrameId = null;\n        }\n\n        // Clean up tooltips\n        this.cleanupHoverTooltip();\n        this.cleanupDragTooltip();\n        this.cleanup();\n    }\n\n    /**\n     * Destroys the component instance\n     * Currently delegates to destroy() method\n     */\n    public destroyComponent(): void {\n        this.destroy();\n    }\n}","\nimport { BEAN_NAME, clearElement, Component, removeFromParent } from \"@dg/corecomponent\";\nimport { TaskBarHolderController } from \"./TaskBarHolderController\";\nimport { GANTT_CLASS_NAMES } from \"../../../../Grid/Core/Constants/CSSClassNameContants\";\nimport { ITaskData, ITaskType } from \"GanttModelClasses/IGanttConfiguration\";\nimport { EmtyBarHolderController } from \"./EmtyBarFullWidthController/EmtyBarFullWidthController\";\nimport { VIEW_TYPE } from \"../../../../GanttModelClasses/GanttCoreComponent\";\n\n\n\nfunction TaskBarHolderTemplate(taskType : ITaskType) : HTMLElement{\n\n    // Holder DOM\n    const div = document.createElement('div');\n    div.classList.add(GANTT_CLASS_NAMES.GANTT_TASK_BAR_HOLDER);\n\n    let className = GANTT_CLASS_NAMES.GANTT_TASK_BAR_VALID;\n    switch(taskType){\n        case 'invalid':\n            className = GANTT_CLASS_NAMES.GANTT_TASK_BAR_INVALID;\n            break;\n        case 'critical':\n            className = GANTT_CLASS_NAMES.GANTT_TASK_BAR_CRITICAL;\n            break;\n    }\n\n    div.classList.add(className);\n    // div.setAttribute('tabindex','0');\n    return div;\n}\n\n// function dummyDiv():HTMLElement{\n//     const div = document.createElement('div');\n\n//     return div\n// }\n\nfunction FullWidthDiv(param : any):HTMLElement{\n    const div = document.createElement('div');\n    div.classList.add(GANTT_CLASS_NAMES.GANTT_TASK_BAR_FULL_WIDTH);\n    if(!param.allowDragToScheduleTask || param.readonly){\n        div.classList.add(GANTT_CLASS_NAMES.GANTT_TASK_BAR_FULL_WIDTH_READONLY);\n    }\n\n\n    return div\n}\nfunction MilestoneTemplate(): HTMLElement {\n    // Milestone DOM structure matching gantt-static-dom.html\n    const holder = document.createElement('div');\n    holder.classList.add(GANTT_CLASS_NAMES.GANTT_MILESTONE_HOLDER);\n    // Center milestone vertically like task bar holder\n    const milestone = document.createElement('div');\n    milestone.classList.add(GANTT_CLASS_NAMES.GANTT_MILESTONE);\n    \n    holder.appendChild(milestone);\n    // holder.setAttribute('tabindex', '0');\n    return holder;\n}\n\n\nexport class TaskBarHolderComponent extends Component {\n    // @queryAssignedNodes('taskTitle') private taskTitleDOM : HTMLElement\n    // @queryAssignedNodes('leftResizer') private leftResizer : HTMLElement\n    // @queryAssignedNodes('rightResizer') private rightResizer : HTMLElement\n\n    private isNeedToBeRendered : boolean = true;\n\n    private params;\n    private controller;\n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    init(params) {\n        this.params = params;\n        const rowNode = this.params.node ;\n\n        const isAllDayFillMode = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER).isAllDayFillMode();\n\n        \n        // Extract start and end dates from data\n        const startDate    = rowNode.getStartDate();\n        const endDate      = rowNode.getEndDate();\n        const hasStartDate = startDate != null && startDate !== undefined;\n        const hasEndDate   = endDate   != null && endDate   !== undefined;\n\n        const data     = this.params.data as ITaskData;\n        \n        // Check if this is a milestone - support both 'milestone' and 'isMilestone' for backward compatibility\n        const isMilestone = data.milestone === true \n        \n        // Check if start date is before end date\n        if (hasStartDate && hasEndDate && startDate > endDate) {\n            // Start date is not before end date - invalid, don't render\n            this.setTemplate(FullWidthDiv({allowDragToScheduleTask: this.params.allowDragToScheduleTask, readonly: this.params.readonly}))\n            this.controller = this.createManagedBean(new EmtyBarHolderController())\n            this.controller.setUpComponent(this,this.params)\n            return\n        }\n\n        if ((hasStartDate && hasEndDate) && (!isMilestone)) {\n            if(!isAllDayFillMode){\n                if(startDate > endDate){\n                    this.setTemplate(FullWidthDiv({allowDragToScheduleTask: this.params.allowDragToScheduleTask, readonly: this.params.readonly}))\n                    this.controller = this.createManagedBean(new EmtyBarHolderController())\n                    this.controller.setUpComponent(this,this.params)\n                    return\n                }\n            }\n        }\n        \n        // Validation logic based on date availability\n        if (!hasStartDate && !hasEndDate) {\n            // Neither start date nor end date given - don't render\n            this.setTemplate(FullWidthDiv({allowDragToScheduleTask: this.params.allowDragToScheduleTask, readonly: this.params.readonly}))\n            this.controller = this.createManagedBean(new EmtyBarHolderController())\n            this.controller.setUpComponent(this,this.params)\n            return\n        }\n        \n        if (!hasStartDate && hasEndDate) {\n            // Only end date given - invalid, don't render\n            this.setTemplate(FullWidthDiv({allowDragToScheduleTask: this.params.allowDragToScheduleTask, readonly: this.params.readonly}))\n            this.controller = this.createManagedBean(new EmtyBarHolderController())\n            this.controller.setUpComponent(this,this.params)\n            return\n        }\n\n\n        if (hasStartDate && !hasEndDate) {\n            // Only start date given - invalid, don't render\n            this.setTemplate(FullWidthDiv({allowDragToScheduleTask: this.params.allowDragToScheduleTask, readonly: this.params.readonly}))\n            this.controller = this.createManagedBean(new EmtyBarHolderController())\n            this.controller.setUpComponent(this,this.params)\n            return\n        }\n        \n        const viewType = this.params.viewType;\n\n        // Check if task should be rendered based on project start date\n        // Use endDate for comparison (as per pagination model requirement)\n        const dateForComparison = hasEndDate ? endDate : this.params.dateUtilsInstance.addDays(startDate, 1).toJSDate();\n        const dateForComparisonTimestamp = this.params.dateUtilsInstance.getTimestamp(dateForComparison);\n        let isRender\n\n        if(viewType === VIEW_TYPE.WEEK || viewType === VIEW_TYPE.MONTH){\n            const projectStartWeekDate = this.params.dateUtilsInstance.getWeekStartDate(this.params.projestStartDate,'sunday')\n            const projectStartWeekDateTimestamp = this.params.dateUtilsInstance.getTimestamp(projectStartWeekDate)\n            isRender = dateForComparisonTimestamp >= projectStartWeekDateTimestamp\n        } \n        else if(viewType === VIEW_TYPE.DAY){\n            const projectStartDateTimestamp = this.params.dateUtilsInstance.getTimestamp(this.params.projestStartDate)\n            isRender = dateForComparisonTimestamp >= projectStartDateTimestamp\n        } \n        else if(viewType === VIEW_TYPE.YEAR){\n            const projectStartDate = this.params.dateUtilsInstance.getStartOfYear(this.params.projestStartDate)\n            const projectStartDateTimestamp = this.params.dateUtilsInstance.getTimestamp(projectStartDate)\n            isRender = dateForComparisonTimestamp >= projectStartDateTimestamp\n        } \n        else if(viewType === VIEW_TYPE.QUARTER){\n            const projectStartDate = this.params.dateUtilsInstance.getQuarterStartDate(this.params.projestStartDate)\n            const projectStartDateTimestamp = this.params.dateUtilsInstance.getTimestamp(projectStartDate)\n            isRender = dateForComparisonTimestamp >= projectStartDateTimestamp\n        } \n       \n        if(!isRender){\n           this.isNeedToBeRendered = false;\n        }\n\n      \n        \n        if(isMilestone){\n            this.setTemplate(MilestoneTemplate());\n        } else {\n            const taskType = data.type;\n            this.setTemplate(TaskBarHolderTemplate(taskType));\n        }\n\n        this.controller =  this.createManagedBean(new TaskBarHolderController())\n        this.controller.setUpComponent(this,this.params)\n\n\t}\n\n    refresh(params: any):void{\n        this.params = params;\n        this.controller.refresh && this.controller.refresh(params);\n    }\n\n    setRendererDetails(componentDetails: any) :void {\n        \n\n        if (componentDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = componentDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\tthis.destroyRenderer();\n\t\t\t// this.insertValueWithoutRenderer(props);\n\t\t}\n\t}\n\n    private afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n    private destroyRenderer(): void {\n        const destroyBean = this.controller.getDestroyBeanInstance();\n\t\tthis.renderer = destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n\n    getRenderer(): any {\n        return this.renderer;\n    }\n\n    // getTaskTitleDOM(){\n    //     return this.taskTitleDOM\n    // }\n\n    // getLeftResizserDOM(){\n    //     return this.leftResizer\n    // }\n\n    // getRightResizserDOM(){\n    //     return this.rightResizer\n    // }\n\n\tgetElement() {\n        if(!this.isNeedToBeRendered){\n            return null;\n        }\n\t\treturn this.getGui()\n\t}\n\n    isInViewPort() : boolean {\n        return this.isNeedToBeRendered;\n    }\n\n    protected destroy(): void {\n        super.destroy();\n        if(this.controller.destroyComponent){\n            this.controller.destroyComponent();\n            this.controller = null;\n        }\n       \n    }\n\n \n}","import {    BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { TaskBarHolderComponent } from \"./TaskBarHolderComponent\";\nimport { AutoScrollHandler } from \"../../../../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler\";\nimport { IAutoScrollOptions } from \"../../../../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler.types\";\nimport { IDragSourceConfig, IDropTarget, DraggingEvent } from \"../../../../DragAndDrop-handler/dragAndDrop-handler.types\";\nimport { GANTT_BEAN_NAME } from \"../../../Constant/GanttBeanNameConstant\";\nimport { IGanttTaskApi } from \"../../../Api/IGanttTaskApi\";\nimport { IControllerHandler, IPaneControllerParam } from \"../../../../Grid/Core/Interface/IControllerHandler\";\nimport { GridBodyScrollHandler } from \"../../../../Grid/Core/GridBodyScrollHandler\";\nimport { IGanttPaginationController } from \"GanttModelClasses/Core/Pagination/IPaginationController\";\nimport { Tooltip } from \"../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Tooltip\";\nimport { CorePopupHandler, Position } from \"../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/PopupHandler/CorePopupHandler\";\nimport { DragResizeTooltipHandler, ITooltipContent, ITooltipPositionConfig } from \"./DragResizeTooltipHandler\";\nimport { IGanttHookMeta, ITaskType } from \"../../../IGanttConfiguration\";\nimport { GRID_BEAN_NAME } from \"../../../../Grid/Core/Constants/BeanName\";\nimport { IGanttOptionsHandler } from \"GanttModelClasses/Core/OptionsHandler/IGanttOptionsHandler\";\nimport { IDateUtils } from \"../../../../Utils/IDateUtils\";\nimport { Events } from \"../../../../Grid/Core/Constants/Events\";\nimport { GANTT_CLASS_NAMES } from \"../../../../Grid/Core/Constants/CSSClassNameContants\";\nimport { ITaskBarInteractionState } from \"../TaskBarInteractionState\";\n\n\n\nexport const VIEW_TYPE = {\n    DAY    : 'day',\n    MONTH  : 'month',\n    WEEK   : 'week',\n    YEAR   : 'year',\n    QUARTER: 'quarter'\n\n}\n\n/** Pixel width for tasks with startDate === endDate (not milestones); logical duration remains 0. */\nconst ZERO_DURATION_TASK_MIN_VISUAL_WIDTH_PX = 3;\n\n\nconst HOOK_RESIZE             = 'taskDragResize';\nconst HOOK_TASK_BAR_MOVE      = 'taskBarDragMove';\nconst HOOK_MARKING_DEPENDENCY = 'taskDependencyConnect'\n\nexport class TaskBarHolderController extends EventEmitter {\n    private    component                                                       : TaskBarHolderComponent;\n    private params;\n    private data : any\n    private left : number = 0;\n    private width : number = 0\n    private dragSourceConfig                                                   : IDragSourceConfig<any>;\n    private dropTarget                                                         : IDropTarget<any>;\n    // private lastClientX                                                        : number = 0;\n    private taskApi : IGanttTaskApi\n    private leftResizer : HTMLElement;\n    private rightResizer : HTMLElement;\n    private leftMarker : HTMLElement;\n    private rightMarker : HTMLElement;\n    private autoScrollHandler                                                  : AutoScrollHandler;\n    private markerAutoScrollHandler                                            : AutoScrollHandler;\n    private scrollContainer                                                   : HTMLElement;\n    private horizontalScrollContainer                                         : HTMLElement;\n\n    private scrollHandler : GridBodyScrollHandler;\n\n   private controllerHandler : IControllerHandler;\n\n    private leftResizeBaseLeft: number = 0;\n    private leftResizeBaseWidth: number = 0;\n    private rightResizeBaseWidth: number = 0;\n    private rightResizeBaseLeft: number = 0;\n    private activeResizeDirection: 'left' | 'right' | null = null;\n    private lastResizePointerClientX: number | null = null;\n    private initialResizePointerClientX: number | null = null;\n    private leftResizerDragSourceConfig: IDragSourceConfig<any> | null = null;\n    private rightResizerDragSourceConfig: IDragSourceConfig<any> | null = null;\n    private resizeGhostElement: HTMLElement | null = null;\n    private resizerElement: HTMLElement | null = null;\n    private resizeTooltipComponent: Tooltip | null = null;\n    private resizeTooltipHandler: DragResizeTooltipHandler | null = null;\n    private dragTooltipComponent: Tooltip | null = null;\n    private dragTooltipHandler: DragResizeTooltipHandler | null = null;\n    private popupHandler: CorePopupHandler;\n    private gridContainer: HTMLElement | null = null;\n\n    private leftMarkerDragSourceConfig: IDragSourceConfig<any> | null = null;\n    private rightMarkerDragSourceConfig: IDragSourceConfig<any> | null = null;\n    private lastMarkerClientX: number = 0;\n    private lastMarkerClientY: number = 0;\n    private lastMarkerPageX: number = 0;\n    private lastMarkerPageY: number = 0;\n    private lastMarkerMouseEvent: MouseEvent | null = null;\n    private markerGhostElement: HTMLElement | null = null;\n    private markerHoverTaskBarElement: HTMLElement | null = null;\n    private markerStartContentX: number = 0;\n    private markerStartContentY: number = 0;\n    private activeMarkerType: 'left' | 'right' | null = null;\n\n    private paginationController : IGanttPaginationController\n    private isMilestone : boolean = false;\n\n    private parentElement : HTMLElement;\n\n    private cachedResizeStartTimestamp: number | null = null;\n    private cachedResizeEndTimestamp: number | null = null;\n\n    private dragAndDropGhostElement: HTMLElement | null = null;\n    /** Screen-space anchor captured at drag start — maps timeline px (`currentGhostLeft`) to viewport coords without clipping by scroll ancestors. */\n    private dragGhostScreenAnchor: {\n        /** `getBoundingClientRect().left` of the bar at drag start */\n        startBarScreenLeft : number;\n        /** Bar top − row top when drag started; reapplied via current row rect each frame (vertical virtualization / scroll). */\n        barOffsetYFromRow  : number;\n    } | null = null;\n    /** Full-size overlay inside `.dg-gantt-view-right` — `overflow: visible` so ghosts are not clipped by inner scroll ports, scoped to exclude the records/sidebar pane. */\n    private dragGhostLayerRoot                       : HTMLElement | null = null;\n    /** Panel that received temporary `position: relative` for the overlay — cleared on teardown. */\n    private dragGhostLayerParentMarkedRelative       : HTMLElement | null = null;\n    // private dragAndDropGhostHolderElement: HTMLElement | null = null;\n    \n    private isAllDayFillMode: boolean = false;\n    private dragStartClientX: number = 0;\n    private dragStartLeft: number = 0;\n    private dragStartScrollLeft: number = 0;\n    private lastDragMouseEvent: MouseEvent | null = null;\n    private currentGhostLeft: number = 0;\n    private isDragActive: boolean = false;\n    private milestoneDragSnapOffset: number = 0;\n\n    // Drag lifecycle hardening: rAF-coalesced updates + global safety listeners.\n    // These exist to make rapid / back-to-back drags recoverable when the\n    // upstream drag-and-drop handler misses a terminal event (window blur,\n    // pointer leaves viewport, tab switch, browser chrome steals focus, etc.).\n    private dragUpdateRafId: number | null = null;\n    private dragGlobalMouseUpHandler: ((e: MouseEvent) => void) | null = null;\n    private dragGlobalBlurHandler: (() => void) | null = null;\n    private dragGlobalVisibilityHandler: (() => void) | null = null;\n    private dragGlobalMouseLeaveHandler: ((e: MouseEvent) => void) | null = null;\n\n    private initialStartDate: number | null = null;\n    private initialEndDate: number | null = null;\n    private initialIsMilestone: boolean | null = null;\n\n    /**\n     * Snapshot of the task bar's pre-drag state.\n     *\n     * Captured in onDragStarted before any mutation can occur and consulted\n     * by `cancelDrag()` to deterministically restore the bar (model + DOM)\n     * when the drag terminates without a valid drop (ESC, drop outside\n     * container, column header, viewport exit, etc.).\n     *\n     * Cleared after every drag terminates (successful drop OR cancel).\n     */\n    private dragInitialState: {\n        startDate: number | null | undefined;\n        endDate: number | null | undefined;\n        left: number;\n        width: number;\n        isMilestone: boolean;\n        leftStyle: string;\n        widthStyle: string;\n    } | null = null;\n\n     private dateUtilsInstance : IDateUtils;\n    private interactionState : ITaskBarInteractionState;\n\n\n    // private viewCommunicationManager : ViewsCommunicationHandler;\n\n    constructor() {\n        super();\n        this.popupHandler = new CorePopupHandler();\n    }\n\n    public setUpComponent( component: TaskBarHolderComponent, params : any): void {\n              this.component                = component;\n              const element = this.component.getElement();\n              this.init(params);\n        this.registerEvents();\n        this.setRendererDetails();\n        this.registerDragAndDropEvent(element); // need to be configurable\n\n        this.controllerHandler.onAfterGridReady((params) => {\n            this.initializeAutoScrollHandler(params);\n        })   // need to be configurable\n\n\n\n        // this.registerLeftResizers();\n        // this.registerRightResizers();\n    }\n\n    private init(params: any):void{\n              this.params                   = params;\n              this.parentElement            = this.params.parentElement as HTMLElement;\n              this.gridContainer            = this.params.gridContainer as HTMLElement || null;\n              this.data                     = {...params.data};\n              this.scrollContainer          = this.params.scrollHolder;\n              this.taskApi                  = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.TASK_API)\n            //   this.viewCommunicationManager = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.VIEWS_COMMUNICATION_HANDLER)\n            const element                       = this.component.getElement();\n              this.controllerHandler        = params.controllerHandler\n              this.paginationController     = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.PAGINATION_CONTROLLER)\n\n        // Check if this is a milestone - support both 'milestone' and 'isMilestone' for backward compatibility\n        this.isMilestone = this.data.milestone === true || (this.data as any).isMilestone === true;\n        const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n        this.dateUtilsInstance = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.DATE_UTILS) as IDateUtils;\n        const viewsCommunicationHandler = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.VIEWS_COMMUNICATION_HANDLER) ;\n        if(viewsCommunicationHandler){\n            const gridContext = viewsCommunicationHandler.getGanttPanelContext();\n            this.interactionState = gridContext.getBean(GANTT_BEAN_NAME.TASK_BAR_INTERACTION_STATE) as ITaskBarInteractionState;\n\n        }\n        // this.interactionState = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.TASK_BAR_INTERACTION_STATE) as ITaskBarInteractionState;\n        this.isAllDayFillMode = optionHandler.isAllDayFillMode();\n\n\n\n\n        // Initialize auto scroll handler once for use in drag-and-drop and resizers\n\n        this.setLeft(element);\n        this.setWidth(element);\n        this.setId(element);\n        \n        // Skip task title for milestones (they don't display text)\n        if(!this.isMilestone){\n            this.setTaskTitle();\n        }\n    }\n\n    refresh(params : any):void{\n        this.init(params);\n        this.setRendererDetails();\n\n    }\n     initializeAutoScrollHandler(controllerParams : IPaneControllerParam): void {\n        if (!this.autoScrollHandler) {\n            // Get horizontal scroll container (center column viewport for horizontal scrolling)\n            // This should be the .ZG-centerColViewport element that contains the timeline\n            const bodyController = controllerParams.bodyController;\n            // const centerController = controllerParams.centerRowContainerControl;\n            this.scrollHandler = bodyController.getScrollHandler();\n\n            this.horizontalScrollContainer = bodyController.gridScrollHolder;\n            this.scrollContainer = bodyController.gridScrollHolder;\n            \n\n            \n            const scrollOptions: IAutoScrollOptions = {\n                \n                scrollContainer: this.scrollContainer,\n                horizontalScrollContainer: this.horizontalScrollContainer,\n                scrollAxis: 'x', // Only vertical scroll for task bar operations (horizontal is disabled)\n                getVerticalPosition : () => this.scrollHandler.getVScrollPosition().top,\n                setVerticalPosition : (position: number) => this.scrollHandler.setVerticalScrollPosition(position),\n                getHorizontalPosition : () => this.scrollHandler.getHScrollPosition().left,\n                setHorizontalPosition : (position: number) => this.scrollHandler.setHorizontalScrollPosition(position),\n                shouldSkipVerticalScroll: () => true,\n                shouldSkipHorizontalScroll: () => false,\n                onScrollCallback : () => {\n                    this.handleAutoScrollWhileDragging();\n                    this.handleAutoScrollWhileResizing();\n                },\n                scrollConfig : [\n                    { percent: 5, speed: 40 },\n                    { percent: 7, speed: 20 },\n                    { percent: 10, speed: 10 },\n                ]\n            };\n            \n            this.autoScrollHandler = new AutoScrollHandler(scrollOptions);\n\n            // Create separate autoscroll handler for markers that supports both vertical and horizontal scrolling\n            const markerScrollOptions: IAutoScrollOptions = {\n                scrollContainer: this.scrollContainer,\n                horizontalScrollContainer: this.horizontalScrollContainer,\n                scrollAxis: 'xy',\n                getVerticalPosition : () => this.scrollHandler.getVScrollPosition().top,\n                setVerticalPosition : (position: number) => this.scrollHandler.setVerticalScrollPosition(position),\n                getHorizontalPosition : () => this.scrollHandler.getHScrollPosition().left,\n                setHorizontalPosition : (position: number) => this.scrollHandler.setHorizontalScrollPosition(position),\n                shouldSkipVerticalScroll: () => false, // Enable vertical scroll for markers\n                shouldSkipHorizontalScroll: () => false, // Enable horizontal scroll for markers\n                onScrollCallback : () => {\n                    // Update marker line during autoscroll to follow cursor\n                    if (this.lastMarkerMouseEvent && this.activeMarkerType) {\n                        this.updateMarkerGhostLine(this.lastMarkerMouseEvent);\n                    }\n                },\n                scrollConfig : [\n                    { percent: 5, speed: 40 },\n                    { percent: 7, speed: 20 },\n                    { percent: 10, speed: 10 },\n                ]\n            };\n            \n            this.markerAutoScrollHandler = new AutoScrollHandler(markerScrollOptions);\n        }\n    }\n\n   \n\n\n    setRendererDetails():void{\n        if(this.data.startDate === null || this.data.startDate === undefined ||this.data.endDate === null || this.data.endDate === undefined ){\n            this.component.setRendererDetails(null);\n            return;\n        }\n\t\tlet componentDetails;\n\n\t\tconst params               = this.createRendererParams();\n\t\tconst userComponentHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n\t\t      componentDetails     = userComponentHandler.getTaskBarRendererDetails(\n\t\t\t{renderer :  this.params.renderer},\n\t\t\tparams,\n\t\t);\n\n\t\tthis.component.setRendererDetails(componentDetails);\n    }\n\n    private createRendererParams(){\n        return {\n           data                    : this.params.data,\n           rendererParams          : this.params.rendererParams,\n           registerLeftResizer     : this.isMilestone ? undefined                                                                : this.registerLeftResizers.bind(this),\n           registerRightResizer    : this.isMilestone ? undefined                                                                : this.registerRightResizers.bind(this),\n           registerDragAndDropEvent: this.registerDragAndDropEvent.bind(this),\n           registerLeftPointer     : this.registerLeftMarker.bind(this),\n           registerRightPointer    : this.registerRightMarker.bind(this),\n           element                 : this.component.getGui(),\n           parentElement           : this.params.parentElement,\n           isMilestone             : this.isMilestone,\n           rowNode                 : this.params.node,\n           dateHelper              : {convertToTimezoneObject : this.params.dateUtilsInstance.convertToTimezoneObject.bind(this)},\n           timezone                : this.params.timezone,\n           isInViewPort            : this.component.isInViewPort(),\n           left                    : this.left,\n           width                   : this.width,\n           right                   : this.left + this.width,\n        }\n    }\n\n    getDestroyBeanInstance():CallableFunction{\n        return this.params.destroyBean\n    }\n    private setId(element){\n        (element) && (element.setAttribute('taskID',this.params.data.taskName))\n\n    }\n\n    private setLeft(element){\n        if(this.data.startDate === null || this.data.startDate === undefined ||this.data.endDate === null || this.data.endDate === undefined ){\n            return;\n        }\n        if(this.isMilestone){\n            const milestoneWidth = this.params.milestoneWidth;\n            const isEndDatePrioritizedForMilestone = this.params.node.isEndDatePrioritizedForMilestone();\n            if(isEndDatePrioritizedForMilestone){\n                this.left = this.calculateLeft(true) - (milestoneWidth/2);\n            } else {\n                this.left = this.calculateLeft(false);\n            }\n        }\n        else{\n            this.left = this.calculateLeft();\n        }\n\n        (element) && (element.style.left = `${this.left}px`);\n    }\n\n    private setWidth(element){\n        if(this.data.startDate === null || this.data.startDate === undefined ||this.data.endDate === null || this.data.endDate === undefined ){\n            return;\n        }\n        if(this.isMilestone){\n            this.width = this.params.milestoneWidth;\n        } else {\n            this.width  = this.calculateWidth();\n        }\n        (element) && (element.style.width = `${this.width}px`);\n        this.syncZeroDurationVisualClass(element);\n    }\n\n    /** True when the task has no time span but is not a milestone (valid zero-duration bar). */\n    private isZeroDurationTask(): boolean {\n        if (this.isMilestone) {\n            return false;\n        }\n        const start = this.data?.startDate;\n        const end = this.data?.endDate;\n        return start != null && end != null && start === end;\n    }\n\n    private syncZeroDurationVisualClass(holder: HTMLElement | null | undefined): void {\n        if (!holder) {\n            return;\n        }\n        const cls = GANTT_CLASS_NAMES.GANTT_TASK_BAR_HOLDER_ZERO_DURATION;\n        if (this.isZeroDurationTask()) {\n            holder.classList.add(cls);\n        } else {\n            holder.classList.remove(cls);\n        }\n    }\n\n    private setTaskTitle(){\n        if(this.data.startDate === null || this.data.startDate === undefined ||this.data.endDate === null || this.data.endDate === undefined ){\n            return;\n        }\n        const titleElement =  this.component.getElement();\n\n        (titleElement) && (titleElement.innerText = this.params.data.taskName);\n    }\n\n     registerDragAndDropEvent(element :  HTMLElement):void{\n\n        if(!this.params.allowTaskDragAndDrop || this.params.readonly || !element){\n            return;\n        }\n        const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n        \n        if (!dragAndDropHandler) {\n            console.warn('dragAndDropHandler not found');\n            return;\n        }\n\n        // Find the timeline container (parent element with timeline wrapper class)\n        const timelineContainer =   this.params.parentElement;\n        if (!timelineContainer) {\n            console.warn('Timeline container not found for drag and drop');\n            return;\n        }\n\n        // Use custom drag element if provided, otherwise use the main element\n        const dragElement =  element;\n\n        // const mainElement = this.component.getElement();\n\n        // Auto scroll handler is already initialized in setUpComponent\n        this.dragSourceConfig = {\n            type: 'taskBarDrag',\n            container: dragElement,\n            useGrabOffset : true,\n            getGhostElement: () => {\n                // ghost.style.display = 'none';\n                return null;\n                // const ghost = dragElement.cloneNode(true) as HTMLElement;\n                // ghost.style.left = '0px'\n                //   ghost.style.height = `${dragElement.offsetHeight}px`\n                // ghost.style.width =  `${dragElement.offsetWidth}px`\n                // // ghost.style.transform = 'rotate(2deg)';\n                // return ghost;\n            },\n            getDragItem: () => {\n                return {\n                    data: this.data,\n                    element: dragElement,\n                    initialLeft: this.left,\n                    initialWidth: this.width\n                };\n            },\n            disableYaxis: true,\n            disableXaxis: false,\n            bypassMouseEvent: (event: MouseEvent) => {\n                // For milestones, no resizers to bypass\n                if (this.isMilestone) return false;\n                \n                // Do not start dragging when interacting with known resizer/marker elements\n                const target = event.target as HTMLElement | null;\n                if (!target) return false;\n                const isOnLeftResizer  = !!this.leftResizer  && (target === this.leftResizer  || this.leftResizer.contains(target));\n                const isOnRightResizer = !!this.rightResizer && (target === this.rightResizer || this.rightResizer.contains(target));\n                const isOnLeftMarker   = !!this.leftMarker   && (target === this.leftMarker   || this.leftMarker.contains(target));\n                const isOnRightMarker  = !!this.rightMarker  && (target === this.rightMarker  || this.rightMarker.contains(target));\n                return isOnLeftResizer || isOnRightResizer || isOnLeftMarker || isOnRightMarker;\n            },\n            onDragStarted: (mouseEvent: MouseEvent) => {\n                // Re-entrancy guard: upstream can dispatch a new dragStart before\n                // the previous drag's terminal event (mouseup / cancel) was ever\n                // delivered (fast flick-release-press, window blur, pointer left\n                // viewport, tab switch).  Without this guard the previous ghost\n                // is overwritten and leaked in the DOM, the previous tooltip\n                // handler lingers with a stale bounding rect, and the\n                // `dg-gantt__task-bar-source` class stays on the old source —\n                // this is the root cause of the \"ghost missing\" / \"tooltip\n                // stuck\" symptoms under rapid interactions.  Force-cleanup any\n                // orphaned state before starting the new drag.\n                if (this.isDragActive) {\n                    this.resetDragState(true);\n                }\n\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_GRAB_STARTED\n                });\n                \n                this.isDragActive = true;\n                this.interactionState.setTaskBarDragging(true, this.params.node.id);\n\n                this.initialStartDate = this.data.startDate;\n                this.initialEndDate = this.data.endDate;\n                this.initialIsMilestone = this.isMilestone;\n\n                // Full pre-drag snapshot used by cancelDrag() to revert the\n                // bar (model + DOM) if the drag terminates without a valid\n                // drop.  Captured here BEFORE any mutation can happen.\n                const sourceElement = this.component.getElement();\n                this.dragInitialState = {\n                    startDate:   this.data.startDate,\n                    endDate:     this.data.endDate,\n                    left:        this.left,\n                    width:       this.width,\n                    isMilestone: this.isMilestone,\n                    leftStyle:   sourceElement ? sourceElement.style.left  : '',\n                    widthStyle:  sourceElement ? sourceElement.style.width : ''\n                };\n\n                // Store initial mouse event for tooltip positioning\n                this.lastDragMouseEvent = mouseEvent;\n\n                // Use the live element if the captured one was detached by a refresh\n                const liveDragElement = (dragElement.isConnected ? dragElement : this.component.getElement()) || dragElement;\n\n                // Initialize drag tooltip handler\n                if (!this.dragTooltipHandler) {\n                    this.dragTooltipHandler = new DragResizeTooltipHandler(this.popupHandler);\n                }\n                this.dragTooltipHandler.initialize();\n\n                // Capture initial drag state (canonical approach - use integer px arithmetic only)\n                this.dragStartClientX = mouseEvent.clientX;\n                this.dragStartLeft = liveDragElement.isConnected ? liveDragElement.offsetLeft : this.left;\n                this.dragStartScrollLeft = this.getHorizontalScrollPosition();\n\n                // For milestones in all-day MONTH/WEEK mode, compute the offset between\n                // the actual initial position and the nearest snap-grid point.  Applying\n                // this offset during drag keeps the ghost stable on the first frame\n                // instead of jumping to the grid-aligned position + milestoneWidth.\n                if (this.isMilestone && this.isAllDayFillMode) {\n                    const vt = this.params.viewType;\n                    if (vt === VIEW_TYPE.MONTH || vt === VIEW_TYPE.WEEK) {\n                        const dw = this.params.columnWidth;\n                        const nearestSnap = Math.round(this.dragStartLeft / dw) * dw;\n                        this.milestoneDragSnapOffset = this.dragStartLeft - nearestSnap;\n                    }\n                }\n\n                // Track ghost position as data (survives DOM detachment)\n                this.currentGhostLeft = this.dragStartLeft;\n\n                this.captureDragGhostScreenAnchor(liveDragElement);\n\n                // Create ghost (resilient to a detached row parent — see helper)\n                this.createDragGhostElement(liveDragElement);\n\n                const element = this.component.getElement();\n                if(element) {\n                    element.classList.add('dg-gantt__task-bar-source');\n                }\n\n                // Initialize tooltip for showing start date\n                this.updateDragTooltip();\n\n                // First-frame viewport positioning (mousemove coalescing may delay scheduleDragUpdate)\n                this.updateDragGhostPosition();\n\n                // Position tooltip at bottom center of ghost element (after content is set)\n                this.updateDragTooltipPosition();\n\n                // Global safety listeners: guarantee cleanup even when the upstream\n                // drag-and-drop handler misses its terminal mouseup (window blur,\n                // pointer leaves viewport, tab switch, devtools focus, etc.).\n                this.attachDragGlobalSafetyListeners();\n            },\n            onDragging: (mouseEvent: MouseEvent) => {\n                // Always capture the latest mouse event so the coalesced\n                // update consumes the freshest cursor position (last-event-wins).\n                this.lastDragMouseEvent = mouseEvent;\n\n                // rAF-coalesce rapid mousemoves.  Running the full date-math +\n                // tooltip-reflow synchronously on every move event (can be 100+/s\n                // on a fast trackpad) produced out-of-order DOM writes and stale\n                // tooltip positions.  One update per frame is sufficient and\n                // guarantees the last event wins.\n                this.scheduleDragUpdate();\n\n                if (this.autoScrollHandler) {\n                    this.autoScrollHandler.update(mouseEvent, true, false);\n                }\n            },\n            onDragStopped: (mouseEvent: MouseEvent) => {\n                // Clear stored mouse event\n                this.lastDragMouseEvent = null;\n\n                // Check if drop target is the timeline container\n                const timelineContainer = document.querySelector(\".dg-gantt-view-right .ZG-centerCol .ZG-centerColContainer\") as HTMLElement;\n                const dropTarget = mouseEvent.target as HTMLElement;\n                const isDroppedOnTimeline = timelineContainer && (timelineContainer.contains(dropTarget) || timelineContainer === dropTarget);\n\n                // When dropped on the timeline, the registered dropTarget.onDragStop\n                // handler runs immediately after this callback and is responsible for\n                // applying the drop and dispatching EVENT_TASK_BAR_GRAB_ENDED.\n                if (isDroppedOnTimeline) {\n                    return;\n                }\n\n                // Drop happened outside a valid drop zone (column header, outside the\n                // grid, pointer left viewport, fast drag + release, etc.).  The drop\n                // target's onDragStop will NOT fire in this case, so we must fully\n                // cancel the drag here — otherwise `dg-gantt__task-bar-grab--active`\n                // stays on the root element and the UI is stuck in dragging state.\n                this.resetDragState(true);\n            },\n            onDragCancelled: () => {\n                // ESC key cancel (handled by drag-core-handler) and other explicit\n                // cancellations route through here.\n                this.resetDragState(true);\n            },\n            shouldPreventMouseEvent: (event: MouseEvent) => {\n                // For milestones, no resizers to check\n                if (this.isMilestone) return true;\n                \n                const target = event.target as HTMLElement | null;\n                if (!target) return true;\n\n                const isOnLeftResizer  = !!this.leftResizer  && (target === this.leftResizer  || this.leftResizer.contains(target));\n                const isOnRightResizer = !!this.rightResizer && (target === this.rightResizer || this.rightResizer.contains(target));\n                const isOnLeftMarker   = !!this.leftMarker   && (target === this.leftMarker   || this.leftMarker.contains(target));\n                const isOnRightMarker  = !!this.rightMarker  && (target === this.rightMarker  || this.rightMarker.contains(target));\n\n                if (isOnLeftResizer || isOnRightResizer || isOnLeftMarker || isOnRightMarker) {\n                    return false;\n                }\n\n                if(event.target){\n                    return false;\n                }\n                // Prevent mouse down defaults during drag to avoid text selection\n                return true;\n            },\n            getRootNode: () => window.document\n        };\n\n        // Register drag source\n        dragAndDropHandler.addDragSource(this.dragSourceConfig, true);\n\n        // Create and register drop target for timeline container\n        this.dropTarget = {\n            getContainer: () => document.querySelector(\".dg-gantt-view-right .ZG-centerCol .ZG-centerColContainer\"),\n            isInterestedIn: (type: string, container: HTMLElement) => {\n                // Only react to drags originating from the drag element (custom or main)\n                return type === 'taskBarDrag' && container === dragElement;\n            },\n            onDragStop: (params: DraggingEvent<any>) => {\n                this.handleTaskBarDrop(params);\n                this.resetDragState(false);\n            }\n        };\n\n        dragAndDropHandler.addDropTarget(this.dropTarget);\n\n        // this.addDestroyFunc(() => { // temp fix, need to seperate as class.\n        //     dragAndDropHandler.removeDragSource(this.dragSourceConfig);\n        //     dragAndDropHandler.removeDropTarget(this.dropTarget);\n\n        // })\n    }\n\n    private handleTaskBarDrop(dropEvent: DraggingEvent<any>): void {\n        // Defensive guard: never compute or apply new dates for a drag that\n        // has been cancelled (ESC, dropped outside container, column header,\n        // pointer left viewport, programmatic cancelDrag()).  In those paths\n        // `resetDragState(true)` has already restored the preserved snapshot\n        // (startDate / endDate / left / width / isMilestone), so running the\n        // date math here would overwrite that restored state and silently\n        // commit a drop the user never made.\n        //\n        // isDragActive and dragInitialState are both still truthy when a\n        // legitimate drop target fires its onDragStop (resetDragState runs\n        // AFTER handleTaskBarDrop in the happy path), so this guard is a\n        // pure safety net that cannot regress normal drops.\n        if (!this.isDragActive || !this.dragInitialState) {\n            return;\n        }\n\n        const { dragItem } = dropEvent;\n\n        const oldData = {\n            ...this.data,\n            startDate: this.initialStartDate ?? this.data.startDate,\n            endDate: this.initialEndDate ?? this.data.endDate\n        };\n        \n        if (!dragItem || !dragItem.data) {\n            return;\n        }\n\n        // Use the tracked ghost left position rather than reading from the DOM.\n        // This is resilient to the ghost element being detached from the DOM\n        // (e.g., when an async data refresh destroys/recreates the row mid-drag).\n        const ghostLeft = this.currentGhostLeft;\n        \n        // Convert to relativeX: absolute position within the scrollable timeline content\n        const milestoneWidth = this.params.milestoneWidth;\n        const wasMilestone = this.initialIsMilestone ?? this.isMilestone;\n        let relativeX = ghostLeft;\n\n        if(wasMilestone){\n            relativeX = ghostLeft + (milestoneWidth/2);\n        }else{\n            relativeX = ghostLeft;\n        }\n        \n        // Calculate the column width (timelineWidth per unit)\n        const colWidth = this.params.columnWidth;\n        \n        // Get view type and date computation engine\n        const viewType = this.params.viewType;\n        const dateComputationEngine = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.GANTT_DATE_COMPUTATION_ENGINE);\n        \n        if (!dateComputationEngine) {\n            console.warn('dateComputationEngine not found');\n            return;\n        }\n        \n        // Get project start date as timestamp (UTC)\n        let projectStartDateTimestamp = this.paginationController.getCurrentProjectStartDate();\n        \n        // Helper: Get start of quarter timestamp from a given timestamp (timezone-aware)\n        const getStartOfQuarterTimestamp = (ts: number): number => {\n            const dateTime = this.dateUtilsInstance.parseDate(ts);\n            if (!dateTime.isValid) {\n                return ts; // Fallback\n            }\n            // Get first month of quarter (0-indexed: 0, 3, 6, 9)\n            const quarterStartMonth = Math.floor((dateTime.month - 1) / 3) * 3 + 1; // Convert to 1-indexed\n            const startOfQuarter = dateTime.set({ month: quarterStartMonth, day: 1, hour: 0, minute: 0, second: 0, millisecond: 0 });\n            return this.dateUtilsInstance.getTimestamp(startOfQuarter);\n        };\n        \n        // Adjust project start date for view type using timezone-aware operations\n        const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n        const timezone = optionHandler.getTimezone();\n        \n        if (viewType === VIEW_TYPE.WEEK) {\n            const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n            if (projectStartDateTime.isValid) {\n                const weekStartDateTime = this.dateUtilsInstance.getWeekStartDate(projectStartDateTime, 'sunday');\n                projectStartDateTimestamp = this.dateUtilsInstance.getTimestamp(weekStartDateTime);\n            }\n        } else if (viewType === VIEW_TYPE.DAY) {\n            projectStartDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(projectStartDateTimestamp, timezone);\n        } else if (viewType === VIEW_TYPE.MONTH) {\n            // Pagination already stores a GMT month-aligned start. Do NOT run\n            // parseDate/getStartOfMonth on it — setZone (e.g. America/Chicago)\n            // shifts Aug 1 00:00Z to July and breaks pixel→date for drag/resize.\n        } else if (viewType === VIEW_TYPE.YEAR) {\n            const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n            if (projectStartDateTime.isValid) {\n                const yearStartDateTime = this.dateUtilsInstance.getStartOfYear(projectStartDateTime);\n                projectStartDateTimestamp = this.dateUtilsInstance.getTimestamp(yearStartDateTime);\n            }\n        } else if (viewType === VIEW_TYPE.QUARTER) {\n            // QUARTER view: adjust to start of quarter\n            projectStartDateTimestamp = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n        }\n\n        // projectStartDateTimestamp = this.dateUtilsInstance.convertTimezoneTimestampToUTC(projectStartDateTimestamp, timezone);\n\n        // Constants for timestamp calculations\n        const MS_PER_HOUR = 3600000;\n        const MS_PER_DAY = 86400000;\n        \n        // Calculate new start date timestamp from position using UTC timestamp arithmetic\n        // Reverse of getExactLeftPositionByDate formula\n        let newStartDateTimestamp: number;\n        \n        if (this.isAllDayFillMode) {\n            // All-Day Fill Mode: Snap to whole calendar days\n            let calculatedTimestamp: number;\n            \n            if (viewType === VIEW_TYPE.DAY) {\n                // DAY View: colWidth is width per hour\n                const hoursFromStart = relativeX / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (hoursFromStart * MS_PER_HOUR);\n            } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n                // WEEK/MONTH View: colWidth is width per day\n            if(wasMilestone){\n                relativeX = relativeX - (milestoneWidth/2);\n            }\n                const daysFromStart = relativeX / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            } else if (viewType === VIEW_TYPE.YEAR) {\n                // YEAR View: colWidth is width per month\n                const monthsFromStart = relativeX / colWidth;\n                const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n                if (!projectStartDateTime.isValid) {\n                    calculatedTimestamp = projectStartDateTimestamp;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = projectStartDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    calculatedTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else if (viewType === VIEW_TYPE.QUARTER) {\n                // QUARTER View: colWidth is width per month\n                const monthsFromStart = relativeX / colWidth;\n                const anchorStartQuarter = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n                const anchorStartQuarterDateTime = this.dateUtilsInstance.parseDate(anchorStartQuarter);\n                if (!anchorStartQuarterDateTime.isValid) {\n                    calculatedTimestamp = anchorStartQuarter;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = anchorStartQuarterDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    calculatedTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else {\n                // Fallback: use days difference\n                const daysFromStart = relativeX / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            }\n            \n            // Round to nearest whole day (start of day in UTC)\n            newStartDateTimestamp =          calculatedTimestamp;\n            ;\n            // newStartDateTimestamp = getStartOfDayTimestamp(calculatedTimestamp);\n        } else {\n            // Normal Exact-Time Mode: Use fractional time conversion with UTC timestamp arithmetic\n            if (viewType === VIEW_TYPE.DAY) {\n                // DAY View: colWidth is width per hour\n                const hoursFromStart = relativeX / colWidth;\n                newStartDateTimestamp = projectStartDateTimestamp + (hoursFromStart * MS_PER_HOUR);\n            } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n                // WEEK/MONTH View: colWidth is width per day\n                const daysFromStart = relativeX / colWidth;\n                newStartDateTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            } else if (viewType === VIEW_TYPE.YEAR) {\n                // YEAR View: colWidth is width per month\n                const monthsFromStart = relativeX / colWidth;\n                const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n                if (!projectStartDateTime.isValid) {\n                    newStartDateTimestamp = projectStartDateTimestamp;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = projectStartDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    newStartDateTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else if (viewType === VIEW_TYPE.QUARTER) {\n                // QUARTER View: colWidth is width per month\n                const monthsFromStart = relativeX / colWidth;\n                const anchorStartQuarter = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n                const anchorStartQuarterDateTime = this.dateUtilsInstance.parseDate(anchorStartQuarter);\n                if (!anchorStartQuarterDateTime.isValid) {\n                    newStartDateTimestamp = anchorStartQuarter;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = anchorStartQuarterDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    newStartDateTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else {\n                // Fallback: use days difference\n                const daysFromStart = relativeX / colWidth;\n                newStartDateTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            }\n        }\n\n        // GMT wall-clock from pixel math → real UTC for configured timezone\n        newStartDateTimestamp = this.dateUtilsInstance.convertTimezoneTimestampToUTC(newStartDateTimestamp, timezone);\n\n        // For milestones, startDate and endDate should be the same\n       \n\n        // Regular task bar logic\n        // Calculate the duration of the task using the snapshotted initial dates\n        const oldStartDateTimestamp = this.initialStartDate ?? this.data.startDate;\n        const oldEndDateTimestamp = this.initialEndDate ?? this.data.endDate;\n        \n        let newEndDateTimestamp: number;\n\n        if (this.isAllDayFillMode) {\n            // All-Day Fill Mode: Preserve duration in full calendar days (UTC)\n            // Use timestamp-based duration calculation\n            const durationInMilliseconds = oldEndDateTimestamp - oldStartDateTimestamp;\n            \n            // Add duration to new start timestamp (pure timestamp arithmetic)\n             newEndDateTimestamp = newStartDateTimestamp + durationInMilliseconds;\n            \n            // Normalize both old and new dates to start of day for calendar day calculation (UTC)\n           \n        } else {\n            // Normal Exact-Time Mode: Preserve duration in milliseconds\n            const durationInMilliseconds = oldEndDateTimestamp - oldStartDateTimestamp;\n            \n            // Add duration in milliseconds to new start date timestamp\n            newEndDateTimestamp = newStartDateTimestamp + durationInMilliseconds;\n        }\n\n        if (wasMilestone) {\n            const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n            const isFlexible = optionHandler.isFlexibleMilestone();\n            const isEndDatePrioritized = optionHandler.isEndDatePrioritizedForMilestone();\n\n            if (isFlexible) {\n                const durationMs = oldEndDateTimestamp - oldStartDateTimestamp;\n                if (isEndDatePrioritized) {\n                    this.data.endDate   = newStartDateTimestamp;\n                    this.data.startDate = newStartDateTimestamp - durationMs;\n                } else {\n                    this.data.startDate = newStartDateTimestamp;\n                    this.data.endDate   = newStartDateTimestamp + durationMs;\n                }\n            } else {\n                this.data.startDate = newStartDateTimestamp;\n                this.data.endDate   = newStartDateTimestamp;\n            }\n\n            const ganttViewHookManager = this.params.getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER);\n            \n        const metas =  {\n            oldData     : oldData,\n            newData     : this.data,\n            eventOrigin : 'taskBarDrop',\n            event       : null,\n            userParams  : null\n        }\n        const api =()=>{\n            const hookMeta  : IGanttHookMeta = {\n                eventOrigin : HOOK_TASK_BAR_MOVE,\n                event       : {} as any\n            }\n           \n            this.taskApi.updateTaskDataById(this.data.taskID,{\n                startDate : this.data.startDate,\n                taskID    : this.data.taskID,\n                endDate   : this.data.endDate\n            }, hookMeta)\n        }\n\n      ganttViewHookManager.executeBeforeHook('onBeforeTaskBarDrop',api,metas)\n\n            return;\n        }\n\n        // Update data\n        this.data.startDate = newStartDateTimestamp;\n        this.data.endDate = newEndDateTimestamp;\n\n        const ganttViewHookManager = this.params.getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER);\n            \n        const metas =  {\n            oldData:oldData,\n            newData:this.data,\n            eventOrigin : 'taskBarDrop',\n            event : null,\n            userParams : null\n        }\n        const api =()=>{\n            const hookMeta : IGanttHookMeta = {\n                eventOrigin : HOOK_TASK_BAR_MOVE,\n                event       : {} as any\n            }\n           \n            this.taskApi.updateTaskDataById(this.data.taskID,{\n                startDate : this.data.startDate,\n                taskID : this.data.taskID,\n                endDate : this.data.endDate\n            }, hookMeta)\n        }\n\n      ganttViewHookManager.executeBeforeHook('onBeforeTaskBarDrop',api,metas)\n\n    }\n\n    private registerEvents(){\n\n    }\n    private calculateLeft(isEndDatePrioritizedForMilestone: boolean = false){\n\n        const dateComputationEngine = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.GANTT_DATE_COMPUTATION_ENGINE);\n        const isAllDayFillMode = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER).isAllDayFillMode();\n        if (!dateComputationEngine) {\n            console.warn('dateComputationEngine not found');\n            return 0;\n        }\n\n\n        if(isEndDatePrioritizedForMilestone && isAllDayFillMode){\n            return dateComputationEngine.getRightPositionByDate(this.data.endDate, true); // for milestone, end date is prioritized\n        }else if(isEndDatePrioritizedForMilestone && !isAllDayFillMode){\n            return dateComputationEngine.getLeftPositionByDate(this.data.endDate);\n        }\n\n        const left = dateComputationEngine.getLeftPositionByDate(this.data.startDate); // for normal task, start date is prioritized\n        return left;\n\n        // const viewType = this.params.viewType;\n        // const dateUtilsInstance = this.params.dateUtilsInstance;\n        // const rowNode = this.params.node ;\n        // const startDate = rowNode.getStartDate();\n\n        // // Get project start date and parse to DateTime for timezone-aware calculations\n\t\t// let projestStartDate = dateUtilsInstance.parseDate(this.paginationController.getCurrentProjectStartDate());\n\n\t\t// if(viewType === VIEW_TYPE.WEEK){\n\t\t// \t// Get week start date - returns DateTime\n\t\t// \tprojestStartDate = dateUtilsInstance.getWeekStartDate(projestStartDate,'sunday');\n\t\t// }else if(viewType === VIEW_TYPE.DAY){\n\t\t// \t// Align to start of day for hour-based positioning - returns DateTime\n\t\t// \tprojestStartDate = dateUtilsInstance.startOfDay(projestStartDate);\n\t\t// }\n\t\t\n\t\t// // Parse startDate with timezone support - keep as DateTime (exact timestamp, no rounding)\n\t\t// const actualStartDate = dateUtilsInstance.parseDate(startDate);\n\n\t\t// const width = this.params.columnWidth;\n\n\t\t// if(viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK){\n\t\t// \t// Bottom tier is days → use exact fractional day difference for precise positioning\n\t\t// \t// Use diff to get precise fractional days including hours, minutes, seconds\n\t\t// \tconst dateDifference = actualStartDate.diff(projestStartDate, 'days').days;\n\t\t// \tthis.left = width * dateDifference;\n\t\t// }else if(viewType === VIEW_TYPE.YEAR){\n\t\t// \t// Bottom tier is months (columns), but offset within month is by exact fractional day\n\t\t// \tconst monthDifference = dateUtilsInstance.monthsBetween(projestStartDate, actualStartDate);\n\t\t// \tconst startOfMonth = dateUtilsInstance.getStartOfMonth(actualStartDate);\n\t\t// \t// Use diff to get precise fractional days including hours, minutes, seconds\n\t\t// \tconst dateDifference = actualStartDate.diff(startOfMonth, 'days').days;\n\t\t// \tconst daysInMonth = dateUtilsInstance.getDaysInMonth(actualStartDate);\n\t\t// \tconst widthPerDay = width / daysInMonth;\n\n\t\t// \tthis.left = (width * monthDifference) + (dateDifference * widthPerDay);\n\t\t// }else if(viewType === VIEW_TYPE.QUARTER){\n\t\t// \t// Quarter columns render months with proportional exact fractional day offsets\n\t\t// \tconst monthDifference = dateUtilsInstance.monthsBetween(projestStartDate, actualStartDate);\n\t\t// \tconst startOfMonth = dateUtilsInstance.getStartOfMonth(actualStartDate);\n\t\t// \t// Use diff to get precise fractional days including hours, minutes, seconds\n\t\t// \tconst dateDifference = actualStartDate.diff(startOfMonth, 'days').days;\n\t\t// \tconst daysInMonth = dateUtilsInstance.getDaysInMonth(actualStartDate);\n\t\t// \tconst widthPerDay = width / Math.max(daysInMonth, 1);\n\n\t\t// \tthis.left = (width * monthDifference) + (dateDifference * widthPerDay);\n\t\t// }else if(viewType === VIEW_TYPE.DAY){\n\t\t// \t// Bottom tier is hours → use exact fractional hours/minutes/seconds for precise positioning\n\t\t// \t// Calculate exact difference in hours (including fractional hours from minutes/seconds)\n\t\t// \tconst diffInHours = actualStartDate.diff(projestStartDate, 'hours').hours;\n\t\t// \tthis.left = width * diffInHours;\n\t\t// }\n\n\t\t// // const isProjectStartAfterTaskStart = dateUtilsInstance.isAfter(projestStartDate,actualStartDate);\n\t\t// // if(isProjectStartAfterTaskStart){\n\t\t// // \tthis.left = -(this.left);\n\t\t// // }\n        // return this.left\n        \n    }\n\n    private calculateWidth(){\n\n        const dateComputationEngine = this.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.GANTT_DATE_COMPUTATION_ENGINE);\n        if (!dateComputationEngine) {\n            console.warn('dateComputationEngine not found');\n            return 0;\n        }\n\n        const width = dateComputationEngine.getWidthByDate(this.data.startDate, this.data.endDate);\n        return width;\n\n        // const viewType = this.params.viewType;\n        // const dateUtilsInstance = this.params.dateUtilsInstance;\n        // const columnWidth = this.params.columnWidth;\n        \n        // // Parse dates with timezone support - keep as DateTime (exact timestamps, no rounding)\n        // const actualStartDateRaw = this.params.data.startDate;\n        // let actualEndDateRaw = this.params.data.endDate;\n\n        // // If only start date is given, render as 1-day task\n        // const hasStartDate = actualStartDateRaw != null && actualStartDateRaw !== undefined;\n        // const hasEndDate = actualEndDateRaw != null && actualEndDateRaw !== undefined;\n        \n        // // Parse startDate with timezone - keep as DateTime (exact timestamp)\n        // const actualStartDate = hasStartDate ? dateUtilsInstance.parseDate(actualStartDateRaw) : null;\n        \n        // let actualEndDate;\n        // if (hasStartDate && !hasEndDate) {\n        //     // Only start date given - render as 1-day task\n        //     // Set endDate to startDate for width calculation (same day) - keep as DateTime\n        //     actualEndDate = actualStartDate;\n        // } else if (hasEndDate) {\n        //     // Parse endDate with timezone - keep as DateTime (exact timestamp)\n        //     actualEndDate = dateUtilsInstance.parseDate(actualEndDateRaw);\n        // } else {\n        //     actualEndDate = actualStartDate; // Fallback\n        // }\n\n        // if (!actualStartDate || !actualEndDate) {\n        //     this.width = 0;\n        //     return this.width;\n        // }\n\n\t\t// if(viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK){\n\t\t// \t// Bottom tier is days → use exact fractional day difference for precise width\n\t\t// \t// Calculate exact fractional days including hours, minutes, seconds\n\t\t// \t// Use diff to get precise fractional days (e.g., 1 hour = 1/24 days = 0.04167 days)\n\t\t// \tconst dateDifference = actualEndDate.diff(actualStartDate, 'days').days;\n\t\t// \t// Ensure minimum width for visibility (at least 1px)\n\t\t// \tconst minDays = dateDifference < (1 / (24 * 60)) ? (1 / (24 * 60)) : dateDifference; // Minimum 1 minute\n\t\t// \tthis.width = columnWidth * Math.max(minDays, 0);\n\t\t// }else if(viewType === VIEW_TYPE.YEAR){\n\t\t// \t// Columns are months → scale by exact fractional days within months\n\t\t// \t// Calculate exact fractional days including hours, minutes, seconds\n\t\t// \tconst dateDifference = actualEndDate.diff(actualStartDate, 'days').days;\n\t\t// \tconst daysInMonth = dateUtilsInstance.getDaysInMonth(actualStartDate);\n\t\t// \t// Ensure minimum width for visibility\n\t\t// \tconst minDays = dateDifference < (1 / (24 * 60)) ? (1 / (24 * 60)) : dateDifference;\n\t\t// \tthis.width = (columnWidth / daysInMonth) * Math.max(minDays, 0);\n\n\t\t// }else if(viewType === VIEW_TYPE.QUARTER){\n\t\t// \t// Quarter columns are months; allocate width per exact fractional day across spanned months\n\t\t// \t// Calculate exact fractional days for precise width\n\t\t// \tif (!actualStartDate.isValid || !actualEndDate.isValid || actualEndDate.toMillis() < actualStartDate.toMillis()) {\n\t\t// \t\tthis.width = 0;\n\t\t// \t\treturn this.width;\n\t\t// \t}\n\n\t\t// \tconst monthWidth = columnWidth;\n\t\t// \tlet computedWidth = 0;\n\t\t\t\n\t\t// \t// Start from the exact start date (not rounded to start of day)\n\t\t// \tlet cursor = actualStartDate;\n\t\t// \tconst endMillis = actualEndDate.toMillis();\n\n\t\t// \twhile (cursor.toMillis() < endMillis) {\n\t\t// \t\t// Get the end of the current month\n\t\t// \t\tconst monthEnd = cursor.endOf('month');\n\t\t// \t\t// Use the earlier of: month end or actual end date\n\t\t// \t\tconst spanEnd = monthEnd.toMillis() > endMillis ? actualEndDate : monthEnd;\n\t\t\t\t\n\t\t// \t\t// Calculate exact fractional days in this span (including hours, minutes, seconds)\n\t\t// \t\t// Use diff to get precise fractional days instead of daysBetween which adds 1 for inclusive\n\t\t// \t\tconst daysInSpan = spanEnd.diff(cursor, 'days').days;\n\t\t// \t\tconst daysInMonth = dateUtilsInstance.getDaysInMonth(cursor);\n\t\t// \t\tconst widthPerDay = monthWidth / Math.max(daysInMonth, 1);\n\t\t\t\t\n\t\t// \t\tcomputedWidth += widthPerDay * Math.max(daysInSpan, 0);\n\t\t\t\t\n\t\t// \t\t// Move cursor to start of next month (or end if we've reached the end date)\n\t\t// \t\tif (spanEnd.toMillis() >= endMillis) {\n\t\t// \t\t\tbreak;\n\t\t// \t\t}\n\t\t// \t\tcursor = spanEnd.plus({ milliseconds: 1 }).startOf('month');\n\t\t// \t}\n\n\t\t// \tthis.width = computedWidth;\n\n\t\t// }else if(viewType === VIEW_TYPE.DAY){\n\t\t// \t// Bottom tier is hours → use exact fractional hours/minutes/seconds for precise width\n\t\t// \t// Calculate exact difference in hours (including fractional hours from minutes/seconds)\n\t\t// \tconst diffInHours = actualEndDate.diff(actualStartDate, 'hours').hours;\n\t\t// \t// Ensure minimum width is at least 1px for visibility\n\t\t// \tconst minHours = diffInHours < (1 / (24 * 60)) ? (1 / (24 * 60)) : diffInHours; // Minimum 1 minute\n\t\t// \tthis.width = columnWidth * Math.max(minHours, 0);\n\t\t// }\n        // return this.width;\n        \n    }\n\n\n\n   \n    getComponent(): TaskBarHolderComponent {\n        return this.component;\n    }\n\n    getParams(){\n        return this.params\n    }\n\n    /**\n     * Cleanup method to remove drag sources when component is destroyed\n     */\n    public cleanup(): void {\n        if (this.interactionState) {\n            this.interactionState.reset();\n        }\n        const dragAndDropHandler = this.params?.getBeanInstanceByBeanName('dragAndDropHandler');\n        if (dragAndDropHandler) {\n            if (this.leftResizerDragSourceConfig) {\n                dragAndDropHandler.removeDragSource(this.leftResizerDragSourceConfig);\n                this.leftResizerDragSourceConfig = null;\n            }\n            if (this.rightResizerDragSourceConfig) {\n                dragAndDropHandler.removeDragSource(this.rightResizerDragSourceConfig);\n                this.rightResizerDragSourceConfig = null;\n            }\n            if (this.leftMarkerDragSourceConfig) {\n                dragAndDropHandler.removeDragSource(this.leftMarkerDragSourceConfig);\n                this.leftMarkerDragSourceConfig = null;\n            }\n            if (this.rightMarkerDragSourceConfig) {\n                dragAndDropHandler.removeDragSource(this.rightMarkerDragSourceConfig);\n                this.rightMarkerDragSourceConfig = null;\n            }\n        }\n    }\n\n\n    // Markers\n\n    registerLeftMarker(element: HTMLElement): void {\n\n        if(!this.params.allowDependencyMarking || this.params.readonly || !element) {\n            return;\n        }\n\n        this.leftMarker = element;\n        // Add data attributes for task ID and dependency type\n        element.setAttribute('data-task-id', this.data.taskID);\n        element.setAttribute('data-dependency-type', 'start');\n\n\n        const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n        \n        if (!dragAndDropHandler) {\n            console.warn('dragAndDropHandler not found for left marker');\n            return;\n        }\n\n        const mainElement = this.component.getElement();\n\n        this.leftMarkerDragSourceConfig = {\n            type: 'leftMarker',\n            container: element,\n            getGhostElement: () => {\n                const ghost = document.createElement('div') as HTMLElement;\n                ghost.classList.add('dg-gantt__false-line-connector');\n\n                return ghost;\n            },\n            getDragItem: () => {\n                return {\n                    data: this.data,\n                    element: mainElement,\n                    markerType: 'left',\n                    sourceTaskId: this.data.taskID,\n                    sourceTaskData: this.data\n                };\n            },\n            disableYaxis: false,\n            disableXaxis: false,\n            onDragStarted: (mouseEvent: MouseEvent) => {\n                // Add dragging class to component element\n                this.component.getElement().classList.add('dg-gantt__bar-pt--dragging');\n                this.component.getElement().classList.add('dg-gantt__bar-pt--dragging-left');\n                this.dispatchEvent({\n\n                    type: Events.EVENT_TASK_BAR_POINTER_DRAG_STARTED\n                });\n                \n                // Set active marker type\n                this.activeMarkerType = 'left';\n                this.interactionState.setDependencyConnecting(true, 'left', this.params.node.id);\n                \n                this.markerGhostElement = document.createElement('div') as HTMLElement;\n                this.markerGhostElement.classList.add('dg-gantt__false-line');\n                this.markerGhostElement.classList.add('dg-gantt__false-line-left');\n\n                this.initMarkerGhostPosition(mouseEvent);\n            },\n            onDragging: (mouseEvent: MouseEvent) => {\n                // Track last position to handle drop even if pointer is over another row\n                // Use both client and page coordinates for accurate tracking\n                this.lastMarkerClientX = mouseEvent.clientX;\n                this.lastMarkerClientY = mouseEvent.clientY;\n                this.lastMarkerPageX = mouseEvent.pageX !== undefined ? mouseEvent.pageX : mouseEvent.clientX + window.scrollX;\n                this.lastMarkerPageY = mouseEvent.pageY !== undefined ? mouseEvent.pageY : mouseEvent.clientY + window.scrollY;\n                \n                // Store last mouse event for autoscroll updates\n                this.lastMarkerMouseEvent = mouseEvent;\n                \n                // Update ghost line position, width, and rotation\n                this.updateMarkerGhostLine(mouseEvent);\n                this.updateMarkerHoverTaskBar(mouseEvent);\n                \n                // Auto-scroll when dragging near edges (both vertical and horizontal)\n                if (this.markerAutoScrollHandler) {\n                    this.markerAutoScrollHandler.update(mouseEvent, false, false);\n                }\n            },\n            onDragStopped: (mouseEvent: MouseEvent) => {\n                // Remove dragging class from component element\n                this.component.getElement().classList.remove('dg-gantt__bar-pt--dragging');\n                this.component.getElement().classList.remove('dg-gantt__bar-pt--dragging-left');\n                this.clearMarkerHoverTaskBar();\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_POINTER_DRAG_ENDED\n                });\n\n                this.activeMarkerType = null;\n                this.lastMarkerMouseEvent = null;\n                this.interactionState.setDependencyConnecting(false);\n                this.cleanupMarkerGhost();\n                this.handleMarkerDrop('left', mouseEvent);\n                this.markerAutoScrollHandler && this.markerAutoScrollHandler.clear();\n            },\n            onDragCancelled: () => {\n                // Remove dragging class from component element\n                this.component.getElement().classList.remove('dg-gantt__bar-pt--dragging');\n                this.component.getElement().classList.remove('dg-gantt__bar-pt--dragging-left');\n                this.clearMarkerHoverTaskBar();\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_POINTER_DRAG_CANCELLED\n                });\n\n                this.activeMarkerType = null;\n                this.lastMarkerMouseEvent = null;\n                this.interactionState.setDependencyConnecting(false);\n                this.cleanupMarkerGhost();\n                this.markerAutoScrollHandler && this.markerAutoScrollHandler.clear();\n            },\n            getRootNode: () => window.document,\n            shouldPreventMouseEvent: () => false,\n\n\n\n        };\n\n        dragAndDropHandler.addDragSource(this.leftMarkerDragSourceConfig, true);\n    }\n\n    registerRightMarker(element: HTMLElement): void {\n        if(!this.params.allowDependencyMarking || this.params.readonly || !element) {\n            return;\n        }\n\n        this.rightMarker = element;\n        // Add data attributes for task ID and dependency type\n        element.setAttribute('data-task-id', this.data.taskID);\n        element.setAttribute('data-dependency-type', 'finish');\n\n\n        const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n        \n        if (!dragAndDropHandler) {\n            console.warn('dragAndDropHandler not found for right marker');\n            return;\n        }\n\n        const taskBarHolder = this.component.getElement();\n\n        this.rightMarkerDragSourceConfig = {\n            type: 'rightMarker',\n            container: element,\n            getGhostElement: () => {\n\n                const ghost = document.createElement('div') as HTMLElement;\n                ghost.classList.add('dg-gantt__false-line-connector');\n                return ghost;\n            },\n            getDragItem: () => {\n                return {\n                    data: this.data,\n                    element: taskBarHolder,\n                    markerType: 'right',\n                    sourceTaskId: this.data.taskID,\n                    sourceTaskData: this.data\n                };\n            },\n            disableYaxis: false,\n            disableXaxis: false,\n            onDragStarted: (mouseEvent: MouseEvent) => {\n                // Add dragging class to component element\n                taskBarHolder.classList.add('dg-gantt__bar-pt--dragging');\n                taskBarHolder.classList.add('dg-gantt__bar-pt--dragging-right');\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_POINTER_DRAG_STARTED\n                });\n                // Set active marker type\n                this.activeMarkerType = 'right';\n                this.interactionState.setDependencyConnecting(true, 'right', this.params.node.id);\n                \n                this.markerGhostElement = document.createElement('div') as HTMLElement;\n                this.markerGhostElement.classList.add('dg-gantt__false-line');\n                this.markerGhostElement.classList.add('dg-gantt__false-line-right');\n\n                this.initMarkerGhostPosition(mouseEvent);\n            },\n            onDragging: (mouseEvent: MouseEvent) => {\n                // Track last position to handle drop even if pointer is over another row\n                // Use both client and page coordinates for accurate tracking\n                this.lastMarkerClientX = mouseEvent.clientX;\n                this.lastMarkerClientY = mouseEvent.clientY;\n                this.lastMarkerPageX = mouseEvent.pageX !== undefined ? mouseEvent.pageX : mouseEvent.clientX + window.scrollX;\n                this.lastMarkerPageY = mouseEvent.pageY !== undefined ? mouseEvent.pageY : mouseEvent.clientY + window.scrollY;\n                \n                // Store last mouse event for autoscroll updates\n                this.lastMarkerMouseEvent = mouseEvent;\n                \n                // Update ghost line position, width, and rotation\n                this.updateMarkerGhostLine(mouseEvent);\n                this.updateMarkerHoverTaskBar(mouseEvent);\n                \n                // Auto-scroll when dragging near edges (both vertical and horizontal)\n                if (this.markerAutoScrollHandler) {\n                    this.markerAutoScrollHandler.update(mouseEvent, false, false);\n                }\n            },\n            onDragStopped: (mouseEvent: MouseEvent) => {\n                // Remove dragging class from component element\n                this.component.getElement().classList.remove('dg-gantt__bar-pt--dragging');\n                this.component.getElement().classList.remove('dg-gantt__bar-pt--dragging-right');\n                this.clearMarkerHoverTaskBar();\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_POINTER_DRAG_ENDED\n                });\n\n                this.activeMarkerType = null;\n                this.lastMarkerMouseEvent = null;\n                this.interactionState.setDependencyConnecting(false);\n                this.cleanupMarkerGhost();\n                this.handleMarkerDrop('right', mouseEvent);\n                this.markerAutoScrollHandler && this.markerAutoScrollHandler.clear();\n            },\n            onDragCancelled: () => {\n                // Remove dragging class from component element\n                this.component.getElement().classList.remove('dg-gantt__bar-pt--dragging');\n                this.component.getElement().classList.remove('dg-gantt__bar-pt--dragging-right');\n                this.clearMarkerHoverTaskBar();\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_POINTER_DRAG_CANCELLED\n                });\n\n                this.activeMarkerType = null;\n                this.lastMarkerMouseEvent = null;\n                this.interactionState.setDependencyConnecting(false);\n                this.cleanupMarkerGhost();\n                this.markerAutoScrollHandler && this.markerAutoScrollHandler.clear();\n            },\n            getRootNode: () => window.document,\n            shouldPreventMouseEvent: () => false\n        };\n\n        dragAndDropHandler.addDragSource(this.rightMarkerDragSourceConfig, true);\n    }\n\n    /**\n     * Store the marker start relative to parentElement and append the\n     * ghost there so it shares the same stacking context as task bars.\n     * All coordinates are relative to parentElement's bounding box.\n     */\n    private initMarkerGhostPosition(mouseEvent: MouseEvent): void {\n        if (!this.markerGhostElement) return;\n\n        const parentEl = this.params.parentElement as HTMLElement;\n        const parentRect = parentEl.getBoundingClientRect();\n\n        this.markerStartContentX = mouseEvent.clientX - parentRect.left;\n        this.markerStartContentY = mouseEvent.clientY - parentRect.top;\n\n        this.markerGhostElement.style.position = 'absolute';\n        this.markerGhostElement.style.left = `${this.markerStartContentX}px`;\n        this.markerGhostElement.style.top = `${this.markerStartContentY}px`;\n        this.markerGhostElement.style.width = '0px';\n        this.markerGhostElement.style.height = '0px';\n        this.markerGhostElement.style.transformOrigin = '0 0';\n        this.markerGhostElement.style.pointerEvents = 'none';\n        this.markerGhostElement.style.zIndex = '9999';\n\n        parentEl.appendChild(this.markerGhostElement);\n    }\n\n    private updateMarkerGhostLine(mouseEvent: MouseEvent): void {\n        if (!this.markerGhostElement || !this.activeMarkerType) return;\n\n        const parentEl = this.params.parentElement as HTMLElement;\n        const parentRect = parentEl.getBoundingClientRect();\n\n        const cursorContentX = mouseEvent.clientX - parentRect.left;\n        const cursorContentY = mouseEvent.clientY - parentRect.top;\n\n        this.markerGhostElement.style.left = `${this.markerStartContentX}px`;\n        this.markerGhostElement.style.top = `${this.markerStartContentY}px`;\n\n        const deltaX = cursorContentX - this.markerStartContentX;\n        const deltaY = cursorContentY - this.markerStartContentY;\n\n        const distance = Math.max(0, Math.sqrt(deltaX * deltaX + deltaY * deltaY));\n\n        const angleRad = Math.atan2(deltaY, deltaX);\n        const angleDeg = (angleRad * 180) / Math.PI;\n\n        this.markerGhostElement.style.width = `${distance}px`;\n        this.markerGhostElement.style.transform = `rotate(${angleDeg}deg)`;\n    }\n\n    private updateMarkerHoverTaskBar(mouseEvent: MouseEvent): void {\n        const hoveredElement = document.elementFromPoint(mouseEvent.clientX, mouseEvent.clientY) as HTMLElement | null;\n        const hoveredHolder = hoveredElement?.closest('.dg-gantt__task-bar-holder, .dg-gantt-milestone-holder') as HTMLElement | null;\n        const hoveredTaskBar = (hoveredHolder?.firstElementChild as HTMLElement | null) || (hoveredElement?.closest('.dg-gantt__task-bar') as HTMLElement | null);\n        if (hoveredTaskBar === this.markerHoverTaskBarElement) {\n            return;\n        }\n\n        this.clearMarkerHoverTaskBar();\n        if (hoveredTaskBar) {\n            hoveredTaskBar.classList.add('dg-gantt__task-bar--dependency-hover');\n            this.markerHoverTaskBarElement = hoveredTaskBar;\n        }\n    }\n\n    private clearMarkerHoverTaskBar(): void {\n        if (!this.markerHoverTaskBarElement) {\n            return;\n        }\n        this.markerHoverTaskBarElement.classList.remove('dg-gantt__task-bar--dependency-hover');\n        this.markerHoverTaskBarElement = null;\n    }\n\n    private cleanupMarkerGhost(): void {\n        this.clearMarkerHoverTaskBar();\n        if (this.markerGhostElement && this.markerGhostElement.parentNode) {\n            this.markerGhostElement.parentNode.removeChild(this.markerGhostElement);\n        }\n        this.markerGhostElement = null;\n        this.markerStartContentX = 0;\n        this.markerStartContentY = 0;\n    }\n\n    /**\n     * Check if the drop target element is a valid marker element (left or right marker)\n     * Returns true only if the element at the drop position has data-dependency-type attribute\n     */\n    private isDropTargetValidMarker(mouseEvent: MouseEvent): boolean {\n        // Use the mouse event to find the element under the cursor\n        const targetElement = mouseEvent.target as HTMLElement | null;\n        \n        if (!targetElement) {\n            return false;\n        }\n\n        // Check if the element itself or any of its parents has the data-dependency-type attribute\n        let currentElement: HTMLElement | null = targetElement;\n        while (currentElement) {\n            const dependencyType  = currentElement.getAttribute('data-dependency-type');\n            if (dependencyType === 'start' || dependencyType === 'finish') {\n                // Found a valid marker element\n                return true;\n            }\n            // Check parent element\n            currentElement = currentElement.parentElement;\n        }\n\n        // No marker element found\n        return false;\n    }\n\n    /**\n     * Get the dependency type of the drop target marker element\n     * Returns 'start' or 'finish' if found, null otherwise\n     */\n    private getDropTargetDependencyType(mouseEvent: MouseEvent): 'start' | 'finish' | null {\n        const targetElement = mouseEvent.target as HTMLElement | null;\n        \n        if (!targetElement) {\n            return null;\n        }\n\n        // Check if the element itself or any of its parents has the data-dependency-type attribute\n        let currentElement: HTMLElement | null = targetElement;\n        while (currentElement) {\n            const dependencyType = currentElement.getAttribute('data-dependency-type');\n            if (dependencyType === 'start' || dependencyType === 'finish') {\n                return dependencyType as 'start' | 'finish';\n            }\n            // Check parent element\n            currentElement = currentElement.parentElement;\n        }\n\n        return null;\n    }\n\n    /**\n     * Get the task ID from the drop target marker element\n     * Returns the task ID if found, null otherwise\n     */\n    private getDropTargetTaskId(mouseEvent: MouseEvent): string | null {\n        const targetElement = mouseEvent.target as HTMLElement | null;\n        \n        if (!targetElement) {\n            return null;\n        }\n\n        // Check if the element itself or any of its parents has the data-task-id attribute\n        let currentElement: HTMLElement | null = targetElement;\n        while (currentElement) {\n            const taskId = currentElement.getAttribute('data-task-id');\n            if (taskId) {\n                return taskId;\n            }\n            // Check parent element\n            currentElement = currentElement.parentElement;\n        }\n\n        return null;\n    }\n\n    private handleMarkerDrop(markerType: 'left' | 'right', mouseEvent: MouseEvent): void {\n        // Check if drop target is a valid marker element\n        if (!this.isDropTargetValidMarker(mouseEvent)) {\n            // Drop was not on a marker element, don't update dependencies\n            return;\n        }\n\n        // Calculate exact position relative to the timeline container\n        const timelineContainer = document.querySelector(\".dg-gantt-view-right .ZG-centerCol .ZG-centerColContainer\") as HTMLElement; // need to change from flow of params.\n        if (!timelineContainer) {\n            console.warn('Timeline container not found for marker drop');\n            return;\n        }\n\n        const rect = timelineContainer.getBoundingClientRect();\n        \n        // Use page coordinates for accurate calculation even when cursor is outside viewport\n        const containerPageX = rect.left + window.scrollX;\n        const containerPageY = rect.top + window.scrollY;\n        \n        // Calculate relative position using page coordinates\n        const relativeX = this.lastMarkerPageX - containerPageX;\n        const relativeY = this.lastMarkerPageY - containerPageY;\n\n        // Get scroll positions\n        const scrollLeft = this.getHorizontalScrollPosition();\n        const scrollTop = this.scrollHandler ? this.scrollHandler.getVScrollPosition().top : 0;\n\n        // Calculate absolute position within the scrollable area\n        const absoluteX = relativeX + scrollLeft;\n        const absoluteY = relativeY + scrollTop;\n\n        // Calculate date position for X coordinate\n        const viewType = this.params.viewType;\n        const colWidth = this.params.columnWidth;\n        const dateUtils = this.params.dateUtilsInstance;\n        let projectStartDate = this.paginationController.getCurrentProjectStartDate();\n\n        if (viewType === VIEW_TYPE.WEEK) {\n            projectStartDate = dateUtils.getWeekStartDate(projectStartDate, 'sunday');\n        } else if (viewType === VIEW_TYPE.DAY) {\n            const startOfDay = dateUtils.startOfDay(projectStartDate);\n            projectStartDate = dateUtils.parseDateTimeToJSDate(startOfDay);\n        }\n\n        let targetDate: Date;\n        if (viewType === VIEW_TYPE.DAY) {\n            // DAY view - use exact fractional hours for precise positioning\n            const hoursFromStart = absoluteX / colWidth;\n            const baseDate = dateUtils.parseDate(projectStartDate);\n            targetDate = baseDate.plus({ hours: hoursFromStart }).toJSDate();\n        } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n            // Use exact fractional days for precise positioning\n            const daysFromStart = absoluteX / colWidth;\n            targetDate = dateUtils.addDays(projectStartDate, daysFromStart).toJSDate();\n        } else if (viewType === VIEW_TYPE.YEAR) {\n            // Use exact fractional months and days for precise positioning\n            const monthsFromStart = absoluteX / colWidth;\n            const monthIndex = Math.floor(monthsFromStart);\n            const fractionalMonth = monthsFromStart - monthIndex;\n            // Calculate target month first to get correct days in that month\n            const targetMonth = dateUtils.addMonths(projectStartDate, monthIndex);\n            const daysInMonth = dateUtils.getDaysInMonth(targetMonth);\n            const daysOffset = fractionalMonth * daysInMonth;\n            targetDate = dateUtils.addMonths(projectStartDate, monthIndex).toJSDate();\n            if (daysOffset !== 0) {\n                targetDate = dateUtils.addDays(targetDate, daysOffset).toJSDate();\n            }\n        } else if (viewType === VIEW_TYPE.QUARTER) {\n            // Use exact fractional months and days for precise positioning\n            const monthsFromStart = absoluteX / colWidth;\n            const monthIndex = Math.floor(monthsFromStart);\n            const fractionalMonth = monthsFromStart - monthIndex;\n            // Calculate target month first to get correct days in that month\n            const targetMonth = dateUtils.addMonths(projectStartDate, monthIndex);\n            const daysInMonth = dateUtils.getDaysInMonth(targetMonth);\n            const daysOffset = fractionalMonth * daysInMonth;\n            targetDate = dateUtils.addMonths(projectStartDate, monthIndex).toJSDate();\n            if (daysOffset !== 0) {\n                targetDate = dateUtils.addDays(targetDate, daysOffset).toJSDate();\n            }\n        } else {\n            // Fallback: use days difference\n            const daysFromStart = absoluteX / colWidth;\n            targetDate = dateUtils.addDays(projectStartDate, daysFromStart).toJSDate();\n        }\n\n        // Emit event with exact position information\n        const dropEvent = {\n            markerType: markerType,\n            sourceTaskId: this.data.taskID,\n            sourceTaskData: this.data,\n            position: {\n                x: absoluteX,\n                y: absoluteY,\n                relativeX: relativeX,\n                relativeY: relativeY,\n                clientX: this.lastMarkerClientX,\n                clientY: this.lastMarkerClientY\n            },\n            date: targetDate,\n            viewType: viewType,\n            timelineContainer: timelineContainer\n        };\n\n        // Dispatch event for dependency marking\n        this.dispatchEvent({ \n            type: 'onMarkerDrop', \n            payload: dropEvent \n        } as any);\n\n        // Get the task ID from the drop target element\n        const dropTargetTaskId = this.getDropTargetTaskId(mouseEvent);\n        \n        if (!dropTargetTaskId) {\n            console.warn('Could not find task ID from drop target element');\n            return;\n        }\n\n        // Get row data using the task ID from drop target element\n        const rowData = this.taskApi.getTaskDataById(dropTargetTaskId);\n        \n        if (!rowData) {\n            console.warn(`Could not find row data for task ID: ${dropTargetTaskId}`);\n            return;\n        }\n\n        if(dropTargetTaskId === this.data.taskID){\n            return;\n        }\n\n        \n        \n        // Get the drop target's dependency type\n        const dropTargetDependencyType = this.getDropTargetDependencyType(mouseEvent);\n        \n        // Determine connection type based on dragged marker type and drop target marker type\n        // Left marker (start) + Finish element → SF\n        // Left marker (start) + Start element → SS\n        // Right marker (finish) + Finish element → FF\n        // Right marker (finish) + Start element → FS\n        let connectionType: string;\n        if (markerType === 'left' && dropTargetDependencyType === 'finish') {\n            connectionType = 'SF';\n        } else if (markerType === 'left' && dropTargetDependencyType === 'start') {\n            connectionType = 'SS';\n        } else if (markerType === 'right' && dropTargetDependencyType === 'finish') {\n            connectionType = 'FF';\n        } else if (markerType === 'right' && dropTargetDependencyType === 'start') {\n            connectionType = 'FS';\n        } else {\n            // Fallback to default behavior if drop target type is not found\n            connectionType = markerType === 'left' ? 'SS' : 'FS';\n        }\n\n\n        const hookMeta : IGanttHookMeta = {\n            eventOrigin : HOOK_MARKING_DEPENDENCY,\n            event : null\n        }\n        \n        const sourceTaskId = String(this.data.taskID);\n        const existingDependencies = rowData.dependencies ? [...rowData.dependencies] : [];\n        const existingDep = existingDependencies.find(dep => String(dep.taskID) === sourceTaskId);\n\n        if (existingDep) {\n            if (existingDep.connectionType === connectionType) {\n                return;\n            }\n            const dependencies = existingDependencies.map(dep =>\n                String(dep.taskID) === sourceTaskId\n                    ? { taskID: sourceTaskId, connectionType: connectionType, type: 'valid' as ITaskType }\n                    : dep\n            );\n            this.taskApi.updateTaskDataById(dropTargetTaskId, { taskID: rowData.taskID, dependencies: dependencies }, hookMeta);\n        } else {\n            const dependency = { taskID: sourceTaskId, connectionType: connectionType, type: 'valid' as ITaskType };\n            const dependencies = [...existingDependencies, dependency];\n            this.taskApi.updateTaskDataById(dropTargetTaskId, { taskID: rowData.taskID, dependencies: dependencies }, hookMeta);\n        }\n\n        // Call configuration hook if available\n        if (this.params && this.params.events && typeof this.params.events.onMarkerDrop === 'function') {\n            this.params.events.onMarkerDrop(dropEvent);\n        }\n    }\n\n    // Resizer Handlers \n\n    registerLeftResizers(element : HTMLElement){\n        if(!this.params.allowStartDateResize || this.params.readonly || !element) {\n            return;\n        }\n\n        this.leftResizer = element;\n\n        const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n        \n        if (!dragAndDropHandler) {\n            console.warn('dragAndDropHandler not found for left resizer');\n            return;\n        }\n\n        const mainElement = this.component.getElement();\n        const leftResizer = this.leftResizer;\n\n        this.leftResizerDragSourceConfig = {\n            type: 'leftResizer',\n            container: leftResizer,\n            getGhostElement: () => {\n                const ghost = document.createElement('div') ;\n                // Create ghost element that represents the task bar with new size\n                // this.resizeGhostElement = mainElement.cloneNode(true) as HTMLElement;\n                // this.resizeGhostElement.style.position = 'absolute';\n                // this.resizeGhostElement.style.pointerEvents = 'none';\n                // this.resizeGhostElement.style.left = `${this.left}px`;\n                // this.resizeGhostElement.style.height = `${mainElement.offsetHeight}px`;\n                // this.resizeGhostElement.style.width = `${mainElement.offsetWidth}px`;\n                return ghost;\n            },\n            getDragItem: () => {\n                return {\n                    data: this.data,\n                    element: mainElement,\n                    initialLeft: this.left,\n                    initialWidth: this.width,\n                    direction: 'left'\n                };\n            },\n            disableYaxis: true,\n            disableXaxis: false,\n            onDragStarted: () => {\n                this.onLeftResizeStart();\n                \n                // Reset initial position flag - will be set on first drag event\n                this.initialResizePointerClientX = null;\n                \n                // Create resizer element and append to parent\n                const mainElement = this.component.getElement();\n                this.resizerElement = mainElement.cloneNode(true) as HTMLElement;\n                this.resizerElement.classList.add('dg-gantt__bar-rs-ghost');\n                this.resizerElement.style.position = 'absolute';\n                // Use the base values set by onLeftResizeStart\n                this.resizerElement.style.left = `${this.leftResizeBaseLeft}px`;\n                this.resizerElement.style.width = `${this.leftResizeBaseWidth}px`;\n                this.resizerElement.style.height = `${mainElement.offsetHeight}px`;\n                this.resizerElement.style.pointerEvents = 'none';\n                this.parentElement.appendChild(this.resizerElement);\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_RESIZE_STARTED\n                });\n\n                \n                // Initialize tooltip for showing start date\n                this.initializeResizeTooltip(this.resizerElement, 'topLeft');\n\n            },\n            onDragging: (mouseEvent: MouseEvent) => {\n                // Track initial position on first drag event to prevent updates on click\n                if (this.initialResizePointerClientX === null) {\n                    this.initialResizePointerClientX = mouseEvent.clientX;\n                    return; // Don't update on initial click/very first drag event\n                }\n                \n                // Only update if mouse has moved significantly from initial position (at least 2px)\n                if (Math.abs(mouseEvent.clientX - this.initialResizePointerClientX) < 2) {\n                    return; // Don't update on initial click\n                }\n                \n                this.handleLeftResizing(mouseEvent);\n                // Update ghost element width dynamically\n                this.updateResizeGhostElement('left', mouseEvent);\n                // Update tooltip with calculated start date\n                this.updateResizeTooltip('left', mouseEvent);\n            },\n            onDragStopped: () => {\n                this.handleLeftResizer(null);\n                // Remove resizer element\n                if (this.resizerElement && this.resizerElement.parentNode) {\n                    this.resizerElement.parentNode.removeChild(this.resizerElement);\n                    this.resizerElement = null;\n                }\n                // Clean up tooltip\n                this.cleanupResizeTooltip();\n                // Reset initial position flag\n                this.initialResizePointerClientX = null;\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_RESIZE_ENDED\n                });\n\n            },\n            onDragCancelled: () => {\n                // Reset to original state\n                const element = this.component.getElement();\n                element.style.left = `${this.leftResizeBaseLeft}px`;\n                element.style.width = `${this.leftResizeBaseWidth}px`;\n                this.left = this.leftResizeBaseLeft;\n                this.width = this.leftResizeBaseWidth;\n                this.activeResizeDirection = null;\n                this.lastResizePointerClientX = null;\n                this.resizeGhostElement = null;\n                this.initialStartDate = null;\n                this.initialEndDate = null;\n                this.initialIsMilestone = null;\n                this.cachedResizeStartTimestamp = null;\n                this.cachedResizeEndTimestamp = null;\n                this.interactionState.setResizing(false);\n                // Remove resizer element\n                if (this.resizerElement && this.resizerElement.parentNode) {\n                    this.resizerElement.parentNode.removeChild(this.resizerElement);\n                    this.resizerElement = null;\n                }\n                // Clean up tooltip\n                this.cleanupResizeTooltip();\n                // Reset initial position flag\n                this.initialResizePointerClientX = null;\n                this.autoScrollHandler && this.autoScrollHandler.clear();\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_RESIZE_CANCELLED\n                });\n\n            },\n            getRootNode: () => window.document,\n            shouldPreventMouseEvent: () => false\n        };\n\n        dragAndDropHandler.addDragSource(this.leftResizerDragSourceConfig, true);\n    }\n\n    registerRightResizers(element : HTMLElement){\n\n        if(!this.params.allowEndDateResize || this.params.readonly || !element) {\n            return;\n        }\n        \n        this.rightResizer = element;\n\n        \n        const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n        \n        if (!dragAndDropHandler) {\n            console.warn('dragAndDropHandler not found for right resizer');\n            return;\n        }\n\n        const mainElement = this.component.getElement();\n        const rightResizer = this.rightResizer;\n\n        this.rightResizerDragSourceConfig = {\n            type: 'rightResizer',\n            container: rightResizer,\n            getGhostElement: () => {\n                // Create ghost element that represents the task bar with new size\n                const ghost = document.createElement('div') ;\n                \n                return ghost;\n            },\n            getDragItem: () => {\n                return {\n                    data: this.data,\n                    element: mainElement,\n                    initialLeft: this.left,\n                    initialWidth: this.width,\n                    direction: 'right'\n                };\n            },\n            disableYaxis: true,\n            disableXaxis: false,\n            onDragStarted: () => {\n                this.onRightResizeStart();\n\n                this.initialResizePointerClientX = null;\n                \n                const mainElement = this.component.getElement();\n                this.resizerElement = mainElement.cloneNode(true) as HTMLElement;\n                this.resizerElement.classList.add('dg-gantt__bar-rs-ghost');\n                this.resizerElement.style.position = 'absolute';\n                this.resizerElement.style.left = `${this.rightResizeBaseLeft}px`;\n                this.resizerElement.style.width = `${this.rightResizeBaseWidth}px`;\n                this.resizerElement.style.height = `${mainElement.offsetHeight}px`;\n                this.resizerElement.style.pointerEvents = 'none';\n                this.parentElement.appendChild(this.resizerElement);\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_RESIZE_STARTED\n                });\n\n                this.initializeResizeTooltip(this.resizerElement, 'topRight');\n            },\n            onDragging: (mouseEvent: MouseEvent) => {\n                if (this.initialResizePointerClientX === null) {\n                    this.initialResizePointerClientX = mouseEvent.clientX;\n                    return;\n                }\n\n                if (Math.abs(mouseEvent.clientX - this.initialResizePointerClientX) < 2) {\n                    return;\n                }\n\n                this.handleRightResizing(mouseEvent);\n                this.updateResizeGhostElement('right', mouseEvent);\n                this.updateResizeTooltip('right', mouseEvent);\n            },\n            onDragStopped: () => {\n                this.handleRightResizer(null);\n                if (this.resizerElement && this.resizerElement.parentNode) {\n                    this.resizerElement.parentNode.removeChild(this.resizerElement);\n                    this.resizerElement = null;\n                }\n                this.cleanupResizeTooltip();\n                this.initialResizePointerClientX = null;\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_RESIZE_ENDED\n                });\n\n            },\n            onDragCancelled: () => {\n                const element = this.component.getElement();\n                element.style.width = `${this.rightResizeBaseWidth}px`;\n                this.width = this.rightResizeBaseWidth;\n                this.left = this.rightResizeBaseLeft;\n                this.activeResizeDirection = null;\n                this.lastResizePointerClientX = null;\n                this.resizeGhostElement = null;\n                this.initialStartDate = null;\n                this.initialEndDate = null;\n                this.initialIsMilestone = null;\n                this.cachedResizeStartTimestamp = null;\n                this.cachedResizeEndTimestamp = null;\n                this.initialResizePointerClientX = null;\n                this.interactionState.setResizing(false);\n                if (this.resizerElement && this.resizerElement.parentNode) {\n                    this.resizerElement.parentNode.removeChild(this.resizerElement);\n                    this.resizerElement = null;\n                }\n                this.cleanupResizeTooltip();\n                this.autoScrollHandler && this.autoScrollHandler.clear();\n                this.dispatchEvent({\n                    type: Events.EVENT_TASK_BAR_RESIZE_CANCELLED\n                });\n            },\n            getRootNode: () => window.document,\n            shouldPreventMouseEvent: () => false\n\n        };\n\n        dragAndDropHandler.addDragSource(this.rightResizerDragSourceConfig, true);\n    }\n\n    private updateResizeGhostElement(direction: 'left' | 'right', mouseEvent: MouseEvent): void {\n        if (!this.resizeGhostElement) return;\n\n        const clientX = mouseEvent.clientX;\n        \n        // Ensure ghost element stays absolutely positioned\n        this.resizeGhostElement.style.position = 'absolute';\n        \n        if (direction === 'left') {\n            // Calculate new width and left based on pointer position\n            const pointerRelative = this.getPointerRelativePositionForGhost(clientX);\n            const baseRight = this.leftResizeBaseLeft + this.leftResizeBaseWidth;\n            const clampedPointer = Math.min(baseRight - 1, Math.max(0, pointerRelative));\n            const newWidth = Math.max(1, baseRight - clampedPointer);\n            const newLeft = clampedPointer;\n            \n            // Update ghost element width and left position\n            this.resizeGhostElement.style.width = `${newWidth}px`;\n            this.resizeGhostElement.style.left = `${newLeft}px`;\n        } else {\n            // Calculate new width based on pointer position\n            const pointerRelative = this.getPointerRelativePositionForGhost(clientX);\n            const baseLeft = this.rightResizeBaseLeft;\n            const newWidth = Math.max(1, pointerRelative - baseLeft);\n            \n            // Update ghost element width and left position (left stays at base for right resize)\n            this.resizeGhostElement.style.width = `${newWidth}px`;\n            // this.resizeGhostElement.style.left = `${baseLeft}px`;\n        }\n    }\n\n    private getPointerRelativePositionForGhost(clientX: number): number {\n        // Use the main element to get the container reference\n        const mainElement = this.component.getElement();\n        const offsetParent = (mainElement.offsetParent as HTMLElement) || null;\n        const container = this.horizontalScrollContainer || offsetParent || this.scrollContainer;\n        if (!container) {\n            return clientX;\n        }\n        const rect = container.getBoundingClientRect();\n        const scrollLeft = this.getHorizontalScrollPosition();\n        return clientX - rect.left + scrollLeft;\n    }\n\n    /**\n     * Direction-aware auto-scroll for resize operations.\n     * Only activates when cursor is near an edge AND moving toward it.\n     * When cursor is stationary at the edge, an already-running scroll continues\n     * (the RAF loop keeps going with the last known position).\n     */\n    private applyDirectionalResizeAutoScroll(\n        mouseEvent: MouseEvent,\n        clientX: number,\n        prevClientX: number | null\n    ): void {\n        if (prevClientX === null) return;\n\n        const containerRect = this.horizontalScrollContainer?.getBoundingClientRect();\n        if (!containerRect) return;\n\n        const edgeThreshold = containerRect.width * 0.10;\n        const nearLeftEdge = clientX < containerRect.left + edgeThreshold;\n        const nearRightEdge = clientX > containerRect.right - edgeThreshold;\n\n        if (!nearLeftEdge && !nearRightEdge) {\n            this.autoScrollHandler.clear();\n            return;\n        }\n\n        const deltaX = clientX - prevClientX;\n\n        if (deltaX === 0) return;\n\n        const movingToward = (nearLeftEdge && deltaX < 0) || (nearRightEdge && deltaX > 0);\n\n        if (movingToward) {\n            this.autoScrollHandler.update(mouseEvent, true, false);\n        } else {\n            this.autoScrollHandler.clear();\n        }\n    }\n\n    /**\n     * While resizing, skip edge autoscroll when the pointer is past the limit where the bar is\n     * already clamped (end cannot go before start / start cannot go after end).\n     */\n    private shouldSuppressResizeAutoScroll(direction: 'left' | 'right', clientX: number): boolean {\n        const pointerRelative = this.getPointerRelativePositionForGhost(clientX);\n        const minWidth = this.getMinimumWidth();\n        if (direction === 'left') {\n            const baseRight = this.leftResizeBaseLeft + this.leftResizeBaseWidth;\n            const maxLeft = baseRight - minWidth;\n            return pointerRelative > maxLeft;\n        }\n        const minRight = this.rightResizeBaseLeft + minWidth;\n        return pointerRelative < minRight;\n    }\n\n\n    private onLeftResizeStart(){\n        const element = this.component.getElement();\n        const styleLeft = parseFloat(element.style.left || '');\n        const styleWidth = parseFloat(element.style.width || '');\n        this.leftResizeBaseLeft = isNaN(styleLeft) ? element.offsetLeft : styleLeft;\n        this.leftResizeBaseWidth = isNaN(styleWidth) ? element.offsetWidth : styleWidth;\n        this.left = this.leftResizeBaseLeft;\n        this.width = this.leftResizeBaseWidth;\n        this.activeResizeDirection = 'left';\n        this.lastResizePointerClientX = null;\n        this.initialStartDate = this.data.startDate;\n        this.initialEndDate = this.data.endDate;\n        this.initialIsMilestone = this.isMilestone;\n        this.interactionState.setResizing(true, 'left', this.params.node.id);\n    }\n\n    private onRightResizeStart(){\n        const element = this.component.getElement();\n        const styleWidth = parseFloat(element.style.width || '');\n        this.rightResizeBaseWidth = isNaN(styleWidth) ? element.offsetWidth : styleWidth;\n        this.width = this.rightResizeBaseWidth;\n        const styleLeft = parseFloat(element.style.left || '');\n        this.rightResizeBaseLeft = isNaN(styleLeft) ? element.offsetLeft : styleLeft;\n        this.activeResizeDirection = 'right';\n        this.lastResizePointerClientX = null;\n        this.initialStartDate = this.data.startDate;\n        this.initialEndDate = this.data.endDate;\n        this.initialIsMilestone = this.isMilestone;\n        this.interactionState.setResizing(true, 'right', this.params.node.id);\n    }\n \n    private handleLeftResizing(mouseEvent: MouseEvent){\n        if(!mouseEvent) return;\n \n        const clientX = mouseEvent.clientX;\n        const prevClientX = this.lastResizePointerClientX;\n        this.lastResizePointerClientX = clientX;\n        this.applyLeftResizeFromPointer(clientX);\n\n        if (this.autoScrollHandler) {\n            if (this.shouldSuppressResizeAutoScroll('left', clientX)) {\n                this.autoScrollHandler.clear();\n            } else {\n                this.applyDirectionalResizeAutoScroll(mouseEvent, clientX, prevClientX);\n            }\n        }\n    }\n\n \n     \n \n    private handleLeftResizer(_event: any){\n        // stop auto scroll at end\n        this.autoScrollHandler && this.autoScrollHandler.clear();\n        this.resizeGhostElement = null;\n\n        const endDateTimestamp = this.initialEndDate ?? this.data.endDate;\n\n        // Use the timestamp cached by updateResizeTooltip during dragging\n        let newStartDateTimestamp: number = this.cachedResizeStartTimestamp ?? endDateTimestamp;\n\n        // Validate: newStartDateTimestamp must be before or equal to endDateTimestamp.\n        // Also clamp when bar is at minimum pixel width so that every view\n        // (Day/Week/Month/Year/Quarter) produces a consistent result at the extreme.\n        const leftWasClamped = newStartDateTimestamp > endDateTimestamp\n            || this.width <= this.getMinimumWidth();\n        if (leftWasClamped) {\n            if (this.isAllDayFillMode) {\n                const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n                const timezone = optionHandler.getTimezone();\n                newStartDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(endDateTimestamp, timezone);\n            } else {\n                newStartDateTimestamp = endDateTimestamp;\n            }\n        }\n\n        // update data and refresh UI if changed\n        if(newStartDateTimestamp !== (this.initialStartDate ?? this.data.startDate)){\n            \n            this.leftResizeBaseLeft = this.left;\n            this.leftResizeBaseWidth = this.width;\n\n            const mainEl = this.component.getElement();\n            if (mainEl && mainEl.isConnected) {\n                mainEl.style.left = `${this.left}px`;\n                mainEl.style.width = `${this.width}px`;\n            }\n\n            if (this.initialEndDate != null && this.initialEndDate !== this.data.endDate) {\n                const oldData = { ...this.data };\n                this.data.startDate = newStartDateTimestamp;\n                this.data.endDate = this.initialEndDate ?? this.data.endDate;\n\n                const ganttViewHookManager = this.params.getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER);\n                const metas = {\n                    oldData     : oldData,\n                    newData     : this.data,\n                    eventOrigin : 'taskBarDrop',\n                    event       : null,\n                    userParams  : null\n                };\n                const api = () => {\n                    const hookMeta: IGanttHookMeta = {\n                        eventOrigin : HOOK_TASK_BAR_MOVE,\n                        event       : {} as any\n                    };\n                    this.taskApi.updateTaskDataById(this.data.taskID, {\n                        taskID    : this.data.taskID,\n                        startDate : newStartDateTimestamp,\n                        endDate : this.initialEndDate ?? this.data.endDate\n                    }, hookMeta);\n                };\n                ganttViewHookManager.executeBeforeHook('onBeforeTaskBarDrop', api, metas);\n            } else {\n                try{\n\n\n\n                    const hookMeta : IGanttHookMeta = {\n                        eventOrigin : HOOK_RESIZE,\n                        event       : null\n                    }\n\n                    this.taskApi.updateTaskDataById(this.data.taskID,{\n                        taskID : this.data.taskID,\n                        startDate : newStartDateTimestamp,\n                    }, hookMeta)\n\n\n                }catch(e){\n                    console.warn('Failed to dispatch onAfterDataUpdate for startDate change', e);\n                }\n            }\n        }\n        this.activeResizeDirection = null;\n        this.lastResizePointerClientX = null;\n        this.resizeGhostElement = null;\n        this.initialStartDate = null;\n        this.initialEndDate = null;\n        this.initialIsMilestone = null;\n        this.cachedResizeStartTimestamp = null;\n        this.cachedResizeEndTimestamp = null;\n        this.interactionState.setResizing(false);\n\n    }\n\n    private handleRightResizing(mouseEvent: MouseEvent){\n        if(!mouseEvent) return;\n        \n        const clientX = mouseEvent.clientX;\n        const prevClientX = this.lastResizePointerClientX;\n        this.lastResizePointerClientX = clientX;\n        this.applyRightResizeFromPointer(clientX);\n        \n        if (this.autoScrollHandler) {\n            if (this.shouldSuppressResizeAutoScroll('right', clientX)) {\n                this.autoScrollHandler.clear();\n            } else {\n                this.applyDirectionalResizeAutoScroll(mouseEvent, clientX, prevClientX);\n            }\n        }\n    }\n    private handleRightResizer(_event: any){\n        // stop auto scroll at end\n        this.autoScrollHandler && this.autoScrollHandler.clear();\n        this.resizeGhostElement = null;\n\n        const startDateTimestamp = this.initialStartDate ?? this.data.startDate;\n\n        // Use the timestamp cached by updateResizeTooltip during dragging\n        let newEndDateTimestamp: number = this.cachedResizeEndTimestamp ?? startDateTimestamp;\n\n        // In All-Day Fill Mode the stored end date should be end-of-day\n        if (this.isAllDayFillMode) {\n            const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n            const timezone = optionHandler.getTimezone();\n            newEndDateTimestamp = this.dateUtilsInstance.getEndOfDayForUTCTimestampAsTimestamp(newEndDateTimestamp, timezone);\n        }\n\n        // Validate: newEndDateTimestamp must be after or equal to startDateTimestamp.\n        // Also clamp when bar is at minimum pixel width so that every view\n        // (Day/Week/Month/Year/Quarter) produces a consistent result at the extreme.\n        const rightWasClamped = newEndDateTimestamp < startDateTimestamp\n            || this.width <= this.getMinimumWidth();\n        if (rightWasClamped) {\n            if (this.isAllDayFillMode) {\n                const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n                const timezone = optionHandler.getTimezone();\n                newEndDateTimestamp = this.dateUtilsInstance.getEndOfDayForUTCTimestampAsTimestamp(startDateTimestamp, timezone);\n            } else {\n                newEndDateTimestamp = startDateTimestamp;\n            }\n        }\n\n        if(newEndDateTimestamp !== (this.initialEndDate ?? this.data.endDate)){\n            \n            this.rightResizeBaseWidth = this.width;\n            this.rightResizeBaseLeft = this.left;\n\n            const mainEl = this.component.getElement();\n            if (mainEl && mainEl.isConnected) {\n                mainEl.style.width = `${this.width}px`;\n            }\n\n            if (this.initialStartDate != null && this.initialStartDate !== this.data.startDate) {\n                const oldData = { ...this.data };\n                this.data.endDate = newEndDateTimestamp;\n                this.data.startDate = this.initialStartDate ?? this.data.startDate;\n\n                const ganttViewHookManager = this.params.getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER);\n                const metas = {\n                    oldData     : oldData,\n                    newData     : this.data,\n                    eventOrigin : 'taskBarDrop',\n                    event       : null,\n                    userParams  : null\n                };\n                const api = () => {\n                    const hookMeta: IGanttHookMeta = {\n                        eventOrigin : HOOK_TASK_BAR_MOVE,\n                        event       : {} as any\n                    };\n                    this.taskApi.updateTaskDataById(this.data.taskID, {\n                        taskID  : this.data.taskID,\n                        startDate : this.initialStartDate ?? this.data.startDate,\n                        endDate : newEndDateTimestamp\n                    }, hookMeta);\n                };\n                ganttViewHookManager.executeBeforeHook('onBeforeTaskBarDrop', api, metas);\n            } else {\n                try{\n                    const hookMeta : IGanttHookMeta = {\n                        eventOrigin : HOOK_RESIZE,\n                        event       : null\n                    }\n\n                    this.taskApi.updateTaskDataById(this.data.taskID,{\n                        taskID  : this.data.taskID,\n                        endDate : newEndDateTimestamp\n                    }, hookMeta);\n                }catch(e){\n                    console.warn('Failed to dispatch onAfterDataUpdate for endDate change', e);\n                }\n            }\n        }\n        this.activeResizeDirection = null;\n        this.lastResizePointerClientX = null;\n        this.resizeGhostElement = null;\n        this.initialStartDate = null;\n        this.initialEndDate = null;\n        this.initialIsMilestone = null;\n        this.cachedResizeStartTimestamp = null;\n        this.cachedResizeEndTimestamp = null;\n        this.interactionState.setResizing(false);\n    }\n\n\n    /**\n     * Re-attach the resize ghost to the DOM if its parent row was\n     * destroyed by a timeline re-render / pagination during scroll.\n     */\n    private ensureResizerInDOM(): void {\n        if (!this.resizerElement || this.resizerElement.isConnected) return;\n\n        const freshParent = this.component.getElement()?.parentElement;\n        if (freshParent && freshParent.isConnected) {\n            this.parentElement = freshParent;\n            freshParent.appendChild(this.resizerElement);\n        } else if (this.parentElement && this.parentElement.isConnected) {\n            this.parentElement.appendChild(this.resizerElement);\n        }\n    }\n\n    /**\n     * Re-attach the drag ghost to the DOM if its parent row was\n     * destroyed by a timeline re-render / pagination during scroll.\n     * Falls back to the timeline container which survives row refreshes.\n     */\n    /**\n     * Timeline (right-side) panel that excludes the records / info column.\n     * Mounting the ghost here avoids both inner scroll clipping and overlap with `.dg-gantt-view-left`.\n     */\n    private resolveDragGhostPanelRoot(): HTMLElement | null {\n        const ganttRightClass = 'dg-gantt-view-right';\n\n        let panel: HTMLElement | null = null;\n        const gridRoot = this.gridContainer;\n        if (gridRoot?.isConnected) {\n            panel = gridRoot.closest(`.${ganttRightClass}`) as HTMLElement | null;\n        }\n        if (!panel) {\n            const row = this.params.parentElement as HTMLElement | undefined;\n            if (row?.isConnected) {\n                panel = row.closest(`.${ganttRightClass}`) as HTMLElement | null;\n            }\n        }\n        return panel && panel.isConnected ? panel : null;\n    }\n\n    /**\n     * `overflow:visible` overlay covering only the timeline panel — children are not clipped\n     * by `ZG-centerCol` scrollports, but coordinates stay confined to the right pane.\n     */\n    private ensureDragGhostLayerRoot(): HTMLElement | null {\n        const panel = this.resolveDragGhostPanelRoot();\n        if (!panel) return null;\n\n        if (typeof getComputedStyle !== 'undefined' && getComputedStyle(panel).position === 'static') {\n            panel.style.position = 'relative';\n            this.dragGhostLayerParentMarkedRelative = panel;\n        }\n\n        if (!this.dragGhostLayerRoot) {\n            const layer = document.createElement('div');\n            layer.className = 'dg-gantt__task-drag-ghost-layer';\n            layer.setAttribute('aria-hidden', 'true');\n            layer.style.position = 'absolute';\n            layer.style.left = '0';\n            layer.style.top = '0';\n            layer.style.right = '0';\n            layer.style.bottom = '0';\n            layer.style.pointerEvents = 'none';\n            layer.style.overflow = 'visible';\n            layer.style.zIndex = '12000';\n            this.dragGhostLayerRoot = layer;\n        }\n\n        if (this.dragGhostLayerRoot.parentElement !== panel) {\n            panel.appendChild(this.dragGhostLayerRoot);\n        }\n\n        return this.dragGhostLayerRoot;\n    }\n\n    private teardownDragGhostLayer(): void {\n        if (this.dragGhostLayerRoot?.parentElement) {\n            this.dragGhostLayerRoot.parentElement.removeChild(this.dragGhostLayerRoot);\n        }\n        this.dragGhostLayerRoot = null;\n        if (this.dragGhostLayerParentMarkedRelative?.isConnected) {\n            this.dragGhostLayerParentMarkedRelative.style.removeProperty('position');\n        }\n        this.dragGhostLayerParentMarkedRelative = null;\n    }\n\n    private ensureDragGhostInDOM(): void {\n        if (!this.isDragActive || !this.dragAndDropGhostElement) return;\n\n        const ghost = this.dragAndDropGhostElement;\n        const layer = this.ensureDragGhostLayerRoot();\n\n        if (layer) {\n            if (ghost.parentElement !== layer) {\n                layer.appendChild(ghost);\n            }\n            return;\n        }\n\n        if (ghost.isConnected) return;\n\n        const freshParent = this.component.getElement()?.parentElement;\n        if (freshParent && freshParent.isConnected) {\n            this.parentElement = freshParent;\n            freshParent.appendChild(ghost);\n        } else if (this.parentElement && this.parentElement.isConnected) {\n            this.parentElement.appendChild(ghost);\n        } else {\n            const stableContainer = this.gridContainer\n                || document.querySelector(\".dg-gantt-view-right .ZG-centerCol .ZG-centerColContainer\") as HTMLElement;\n            if (stableContainer && stableContainer.isConnected) {\n                stableContainer.appendChild(ghost);\n            }\n        }\n    }\n\n    /**\n     * Create the drag-ghost element from a live source and attach it to a\n     * live parent.  Centralised so we can self-heal (re-create) when the\n     * ghost goes missing mid-drag without duplicating the fallback logic.\n     *\n     * Previously the ghost was always appended to `this.params.parentElement`\n     * directly — that reference can be detached by a row re-render happening\n     * between `mousedown` and the first `mousemove`, which left the ghost\n     * attached to an orphaned tree (invisible).  Now we resolve a live parent\n     * via the same fallback chain as `ensureDragGhostInDOM`.\n     */\n    private createDragGhostElement(sourceEl: HTMLElement | null): void {\n        const liveSource = (sourceEl && sourceEl.isConnected ? sourceEl : this.component.getElement()) || sourceEl;\n        if (!liveSource) return;\n\n        const ghost = liveSource.cloneNode(true) as HTMLElement;\n        ghost.classList.add('dg-gantt__task-bar-ghost');\n\n        const boundRect = liveSource.getBoundingClientRect();\n        ghost.style.pointerEvents = 'none';\n        ghost.style.position = 'absolute';\n        ghost.style.boxSizing = 'border-box';\n        ghost.style.margin = '0';\n        ghost.style.zIndex = '1';\n        ghost.style.left = '0';\n        ghost.style.top = '0';\n        ghost.style.width = `${boundRect.width || this.width}px`;\n\n        this.dragAndDropGhostElement = ghost;\n        this.ensureDragGhostInDOM();\n        this.syncDragGhostViewportPosition(this.currentGhostLeft || this.dragStartLeft);\n    }\n\n    /**\n     * Cache bar/row rects once at drag start. Together with tracked timeline `newLeft`\n     * and horizontal scroll, this yields the correct viewport position without relying\n     * on an ancestor that applies overflow clipping.\n     */\n    private captureDragGhostScreenAnchor(barEl: HTMLElement): void {\n        const barRect = barEl.getBoundingClientRect();\n        const rowEl = this.params.parentElement as HTMLElement | undefined;\n        const rowRect = rowEl?.getBoundingClientRect();\n        const rowTop = rowRect?.top ?? barRect.top;\n        this.dragGhostScreenAnchor = {\n            startBarScreenLeft : barRect.left,\n            barOffsetYFromRow  : barRect.top - rowTop\n        };\n    }\n\n    /**\n     * Maps timeline-space `timelineLeftPx` to the drag layer — keeps drop math (`currentGhostLeft`)\n     * unchanged while painting inside `.dg-gantt-view-right` only (no sidebar overlap).\n     */\n    private syncDragGhostViewportPosition(timelineLeftPx: number): void {\n        const ghost = this.dragAndDropGhostElement;\n        if (!ghost) return;\n\n        const anchor = this.dragGhostScreenAnchor;\n        const rowEl = this.params.parentElement as HTMLElement | undefined;\n        const scrollNow = this.getHorizontalScrollPosition();\n\n        let screenLeft : number;\n        let screenTop  : number;\n\n        if (anchor && rowEl?.isConnected) {\n            screenLeft =\n                anchor.startBarScreenLeft\n                + (timelineLeftPx - this.dragStartLeft)\n                - (scrollNow - this.dragStartScrollLeft);\n            screenTop = rowEl.getBoundingClientRect().top + anchor.barOffsetYFromRow;\n        } else {\n            const ph = ghost.parentElement;\n            if (!ph?.isConnected || ph === this.dragGhostLayerRoot) {\n                return;\n            }\n            const pr = ph.getBoundingClientRect();\n            screenLeft = pr.left + timelineLeftPx;\n            screenTop = pr.top;\n        }\n\n        const layer = this.dragGhostLayerRoot;\n        if (layer?.isConnected) {\n            const lr = layer.getBoundingClientRect();\n            let relLeft = screenLeft - lr.left;\n            let relTop = screenTop - lr.top;\n            const gw = ghost.offsetWidth || 0;\n            const gh = ghost.offsetHeight || 0;\n            const maxLeft = Math.max(0, layer.clientWidth - gw);\n            const maxTop = Math.max(0, layer.clientHeight - gh);\n            relLeft = Math.max(0, Math.min(relLeft, maxLeft));\n            relTop = Math.max(0, Math.min(relTop, maxTop));\n            ghost.style.position = 'absolute';\n            ghost.style.left = `${Math.round(relLeft)}px`;\n            ghost.style.top = `${Math.round(relTop)}px`;\n        } else {\n            ghost.style.position = 'fixed';\n            ghost.style.left = `${Math.round(screenLeft)}px`;\n            ghost.style.top = `${Math.round(screenTop)}px`;\n        }\n        ghost.style.transform = 'none';\n    }\n\n    /**\n     * Self-heal: if the ghost is missing during an active drag (e.g. a row\n     * refresh removed its parent subtree and reassigned node references),\n     * recreate it in place instead of silently dropping the drag visuals.\n     */\n    private recreateDragGhostIfMissing(): void {\n        if (!this.isDragActive) return;\n        if (this.dragAndDropGhostElement && this.dragAndDropGhostElement.isConnected) return;\n\n        // Clean up a detached-but-non-null ghost before replacing it.\n        if (this.dragAndDropGhostElement && this.dragAndDropGhostElement.parentElement) {\n            this.dragAndDropGhostElement.parentElement.removeChild(this.dragAndDropGhostElement);\n        }\n        this.dragAndDropGhostElement = null;\n        const liveBar = this.component.getElement()?.firstElementChild as HTMLElement | undefined;\n        if (liveBar?.getBoundingClientRect) {\n            this.captureDragGhostScreenAnchor(liveBar);\n        }\n        this.createDragGhostElement(this.component.getElement());\n    }\n\n    /**\n     * rAF-coalesced drag update.  Multiple mousemove events fired within the\n     * same frame collapse to a single ghost+tooltip update using the latest\n     * stored `lastDragMouseEvent` — guarantees last-event-wins and prevents\n     * the stacked stale-write problem under rapid interactions.\n     */\n    private scheduleDragUpdate(): void {\n        if (this.dragUpdateRafId !== null) return;\n        this.dragUpdateRafId = requestAnimationFrame(() => {\n            this.dragUpdateRafId = null;\n            if (!this.isDragActive || !this.lastDragMouseEvent) return;\n            this.updateDragGhostPosition();\n        });\n    }\n\n    /**\n     * Attach document-level listeners that force-cancel the drag when the\n     * upstream handler misses a terminal event (window blur, tab switch,\n     * pointer leaving the viewport, devtools focus, etc.).  All listeners\n     * are registered in capture phase so we see the event even if a nested\n     * element calls `stopPropagation`, and they are idempotent — calling\n     * `attach` twice is a no-op because references are kept until `detach`.\n     */\n    private attachDragGlobalSafetyListeners(): void {\n        if (this.dragGlobalMouseUpHandler) return;\n\n        this.dragGlobalMouseUpHandler = (_e: MouseEvent) => {\n            // If after this mouseup the drag-and-drop handler still hasn't\n            // terminated the drag on the next frame, it's stuck — kill it.\n            if (!this.isDragActive) return;\n            requestAnimationFrame(() => {\n                if (this.isDragActive) this.resetDragState(true);\n            });\n        };\n        this.dragGlobalBlurHandler = () => {\n            if (this.isDragActive) this.resetDragState(true);\n        };\n        this.dragGlobalVisibilityHandler = () => {\n            if (document.visibilityState === 'hidden' && this.isDragActive) {\n                this.resetDragState(true);\n            }\n        };\n        this.dragGlobalMouseLeaveHandler = (e: MouseEvent) => {\n            // Pointer left the viewport entirely (relatedTarget === null on\n            // document).  Without this the drag can stay \"active\" forever.\n            if (e.relatedTarget === null && this.isDragActive) {\n                this.resetDragState(true);\n            }\n        };\n\n        document.addEventListener('mouseup',          this.dragGlobalMouseUpHandler,       true);\n        window.addEventListener('blur',               this.dragGlobalBlurHandler,          true);\n        document.addEventListener('visibilitychange', this.dragGlobalVisibilityHandler,    true);\n        document.addEventListener('mouseleave',       this.dragGlobalMouseLeaveHandler,    true);\n    }\n\n    private detachDragGlobalSafetyListeners(): void {\n        if (this.dragGlobalMouseUpHandler) {\n            document.removeEventListener('mouseup', this.dragGlobalMouseUpHandler, true);\n            this.dragGlobalMouseUpHandler = null;\n        }\n        if (this.dragGlobalBlurHandler) {\n            window.removeEventListener('blur', this.dragGlobalBlurHandler, true);\n            this.dragGlobalBlurHandler = null;\n        }\n        if (this.dragGlobalVisibilityHandler) {\n            document.removeEventListener('visibilitychange', this.dragGlobalVisibilityHandler, true);\n            this.dragGlobalVisibilityHandler = null;\n        }\n        if (this.dragGlobalMouseLeaveHandler) {\n            document.removeEventListener('mouseleave', this.dragGlobalMouseLeaveHandler, true);\n            this.dragGlobalMouseLeaveHandler = null;\n        }\n    }\n\n    private applyLeftResizeFromPointer(clientX: number): void {\n        if (!this.resizerElement) return;\n        this.ensureResizerInDOM();\n        \n        const pointerRelative = this.getPointerRelativePositionForGhost(clientX);\n        const baseRight = this.leftResizeBaseLeft + this.leftResizeBaseWidth;\n        \n        // Calculate the maximum left position based on end date\n        // The rightmost valid left position is where start date would equal end date\n        // Use view-specific minimum width\n        const minWidth = this.getMinimumWidth();\n        const maxLeft = baseRight - minWidth;\n        \n        // Clamp pointer to not exceed the rightmost boundary\n        const clampedPointer = Math.min(maxLeft, Math.max(0, pointerRelative));\n        \n        // Get day width (column width represents one day)\n        const dayWidth = this.params.columnWidth;\n        const viewType = this.params.viewType;\n        \n        // Apply snapping for All-Day Fill Mode (only for MONTH, WEEK, and DAY views)\n        // YEAR and QUARTER views: smooth pixel movement during resize, whole day calculation in date update\n        let newLeft: number;\n        if (this.isAllDayFillMode && viewType !== VIEW_TYPE.YEAR && viewType !== VIEW_TYPE.QUARTER) {\n            // Snap to full-day blocks for MONTH, WEEK, and DAY views\n            // When crossing a day boundary, automatically fill the entire day (no halfway calculations)\n            // Use Math.floor to snap to the start of the day\n            const snappedLeft = Math.floor(clampedPointer / dayWidth) * dayWidth;\n            newLeft = Math.min(maxLeft, Math.max(0, snappedLeft));\n        } else {\n            // Normal mode: smooth pixel movement (or YEAR/QUARTER views in All-Day Fill Mode)\n            newLeft = clampedPointer;\n        }\n        \n        const newWidth = Math.max(minWidth, baseRight - newLeft);\n        \n        // Don't update if left has reached or exceeded the maximum allowed position\n        if (newLeft >= maxLeft) {\n            // Set to maximum allowed position\n            this.resizerElement.style.left = `${maxLeft}px`;\n            this.resizerElement.style.width = `${minWidth}px`;\n            this.left = maxLeft;\n            this.width = minWidth;\n            return;\n        }\n        \n        this.resizerElement.style.left = `${newLeft}px`;\n        this.resizerElement.style.width = `${newWidth}px`;\n        this.left = newLeft;\n        this.width = newWidth;\n    }\n\n    private applyRightResizeFromPointer(clientX: number): void {\n        if (!this.resizerElement) return;\n        this.ensureResizerInDOM();\n        \n        const pointerRelative = this.getPointerRelativePositionForGhost(clientX);\n        const baseLeft = this.rightResizeBaseLeft;\n        \n        // Use view-specific minimum width\n        const minWidth = this.getMinimumWidth();\n        \n        // Calculate minimum allowed right position (start date position + minWidth)\n        const minRight = baseLeft + minWidth;\n        \n        // Clamp pointer to not go before the minimum right position\n        const clampedPointer = Math.max(minRight, pointerRelative);\n        \n        // Get day width (column width represents one day)\n        const dayWidth = this.params.columnWidth;\n        const viewType = this.params.viewType;\n        \n        // Apply snapping for All-Day Fill Mode (only for MONTH, WEEK, and DAY views)\n        // YEAR and QUARTER views: smooth pixel movement during resize, whole day calculation in date update\n        let snappedRightPosition: number;\n        if (this.isAllDayFillMode && viewType !== VIEW_TYPE.YEAR && viewType !== VIEW_TYPE.QUARTER) {\n            // Snap right position to full-day blocks for MONTH, WEEK, and DAY views\n            // When crossing a day boundary, automatically fill the entire day (no halfway calculations)\n            // Use Math.ceil to snap to the end of the day when crossing halfway\n            const snappedRight = Math.ceil(clampedPointer / dayWidth) * dayWidth;\n            snappedRightPosition = Math.max(minRight, snappedRight);\n        } else {\n            // Normal mode: smooth pixel movement (or YEAR/QUARTER views in All-Day Fill Mode)\n            snappedRightPosition = clampedPointer;\n        }\n        \n        const newWidth = Math.max(minWidth, snappedRightPosition - baseLeft);\n        \n        // Don't update if width would be less than minimum\n        if (newWidth < minWidth) {\n            this.resizerElement.style.width = `${minWidth}px`;\n            this.width = minWidth;\n            return;\n        }\n        \n        this.resizerElement.style.width = `${newWidth}px`;\n        this.width = newWidth;\n    }\n\n    private getHorizontalScrollPosition(): number {\n        if (this.scrollHandler) {\n            return this.scrollHandler.getHScrollPosition().left;\n        }\n        if (this.horizontalScrollContainer) {\n            return this.horizontalScrollContainer.scrollLeft;\n        }\n        return 0;\n    }\n\n    /**\n     * Minimum bar width in pixels when resizing. Timed duration follows the same pixel→time scale as the timeline.\n     */\n    private getMinimumWidth(): number {\n        if (this.isZeroDurationTask()) {\n            return ZERO_DURATION_TASK_MIN_VISUAL_WIDTH_PX;\n        }\n        return 1;\n    }\n\n\n    private handleAutoScrollWhileResizing(): void {\n        if (this.activeResizeDirection === 'left' && this.lastResizePointerClientX !== null) {\n            this.applyLeftResizeFromPointer(this.lastResizePointerClientX);\n            this.updateResizeTooltip('left', null);\n            this.updateResizeTooltipPosition();\n        } else if (this.activeResizeDirection === 'right' && this.lastResizePointerClientX !== null) {\n            this.applyRightResizeFromPointer(this.lastResizePointerClientX);\n            this.updateResizeTooltip('right', null);\n            this.updateResizeTooltipPosition();\n        }\n    }\n\n    private handleAutoScrollWhileDragging(): void {\n        if (this.dragAndDropGhostElement && this.lastDragMouseEvent) {\n            this.updateDragGhostPosition();\n        }\n    }\n\n    private updateDragGhostPosition(): void {\n        // Self-heal: if the ghost vanished mid-drag (row subtree replaced by\n        // an async refresh / pagination), recreate it instead of silently\n        // skipping every subsequent frame.\n        if (this.isDragActive && !this.dragAndDropGhostElement) {\n            this.recreateDragGhostIfMissing();\n        }\n        if (!this.dragAndDropGhostElement || !this.lastDragMouseEvent) return;\n        this.ensureDragGhostInDOM();\n\n        const cursorDelta = this.lastDragMouseEvent.clientX - this.dragStartClientX;\n\n        const currentScrollLeft = this.getHorizontalScrollPosition();\n        const scrollDelta = currentScrollLeft - this.dragStartScrollLeft;\n\n        let rawLeft = this.dragStartLeft + cursorDelta + scrollDelta;\n\n        const dayWidth = this.params.columnWidth;\n\n        let newLeft: number;\n        if (this.isAllDayFillMode) {\n            const viewType = this.params.viewType;\n            if (this.initialIsMilestone ?? this.isMilestone) {\n                if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n                    const snappedLeft = Math.round((rawLeft - this.milestoneDragSnapOffset) / dayWidth) * dayWidth;\n                    newLeft = snappedLeft + this.milestoneDragSnapOffset;\n                } else {\n                    newLeft = rawLeft;\n                }\n            } else {\n                const snappedLeft = Math.round(rawLeft / dayWidth) * dayWidth;\n                newLeft = snappedLeft;\n            }\n        } else {\n            newLeft = rawLeft;\n        }\n\n        const parentEl = this.params.parentElement;\n        const parentWidth = parentEl && parentEl.isConnected ? parentEl.offsetWidth : 0;\n        const ghostWidth = this.dragAndDropGhostElement.offsetWidth;\n        if (parentWidth > 0) {\n            const maxLeft = parentWidth - ghostWidth;\n            newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n        } else {\n            newLeft = Math.max(0, newLeft);\n        }\n\n        this.currentGhostLeft = newLeft;\n        /* Timeline-space `left` preserved for any style readers; visuals use the right-panel layer + `syncDragGhostViewportPosition`. */\n        this.dragAndDropGhostElement.style.left = `${newLeft}px`;\n\n        this.syncDragGhostViewportPosition(newLeft);\n\n        this.updateDragTooltip();\n        this.updateDragTooltipPosition();\n    }\n\n     initializeResizeTooltip( _resizerElement: HTMLElement, _position: 'topLeft' | 'topRight' = 'topLeft'): void {\n        // Clean up existing tooltip if any\n        if (this.resizeTooltipHandler) {\n            this.cleanupResizeTooltip();\n        }\n\n        // Initialize resize tooltip handler\n        if (!this.resizeTooltipHandler) {\n            this.resizeTooltipHandler = new DragResizeTooltipHandler(this.popupHandler);\n        }\n        this.resizeTooltipHandler.initialize();\n\n        // Determine direction based on active resize direction\n        const direction = this.activeResizeDirection || 'left';\n        \n        // Initialize tooltip content\n        this.updateResizeTooltip(direction, null);\n        \n        // Position tooltip\n        this.updateResizeTooltipPosition();\n    }\n\n    private updateResizeTooltip(direction: 'left' | 'right', mouseEvent: MouseEvent | null): void {\n        if (!this.resizeTooltipHandler || !this.resizerElement) return;\n\n        // Calculate pointer position - use resizer element position if mouseEvent is null\n        let pointerRelative: number;\n        if (mouseEvent) {\n            const clientX = mouseEvent.clientX;\n            pointerRelative = this.getPointerRelativePositionForGhost(clientX);\n            \n            // For right resize, use the actual right position (baseLeft + current width) to match handleRightResizer calculation\n            if (direction === 'right') {\n                // Calculate the right position the same way as handleRightResizer does\n                const baseLeft = this.rightResizeBaseLeft;\n                const currentWidth = this.width; // This is updated by applyRightResizeFromPointer\n                pointerRelative = baseLeft + currentWidth;\n            }\n        } else {\n            // Use resizer element's current position\n            if (direction === 'left') {\n                pointerRelative = this.left;\n            } else {\n                // For right resize, use the actual right position (baseLeft + current width)\n                const baseLeft = this.rightResizeBaseLeft;\n                const currentWidth = this.width;\n                pointerRelative = baseLeft + currentWidth;\n            }\n        }\n        const dateUtils = this.params.dateUtilsInstance;\n        const viewType = this.params.viewType;\n        const colWidth = this.params.columnWidth;\n        \n        // Constants for timestamp calculations\n        const MS_PER_HOUR = 3600000;\n        const MS_PER_DAY = 86400000;\n        \n        // Helper: Get start of quarter timestamp from a given timestamp (timezone-aware)\n        const getStartOfQuarterTimestamp = (ts: number): number => {\n            const dateTime = this.dateUtilsInstance.parseDate(ts);\n            if (!dateTime.isValid) {\n                return ts; // Fallback\n            }\n            // Get first month of quarter (0-indexed: 0, 3, 6, 9)\n            const quarterStartMonth = Math.floor((dateTime.month - 1) / 3) * 3 + 1; // Convert to 1-indexed\n            const startOfQuarter = dateTime.set({ month: quarterStartMonth, day: 1, hour: 0, minute: 0, second: 0, millisecond: 0 });\n            return this.dateUtilsInstance.getTimestamp(startOfQuarter);\n        };\n\n        // Calculate new date based on pointer position using timezone-aware timestamps\n        let projectStartDateTimestamp = this.paginationController.getCurrentProjectStartDate();\n        \n        // Adjust project start date for view type using timezone-aware operations\n        const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n        const timezone = optionHandler.getTimezone();\n        \n        if (viewType === VIEW_TYPE.WEEK) {\n            const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n            if (projectStartDateTime.isValid) {\n                const weekStartDateTime = this.dateUtilsInstance.getWeekStartDate(projectStartDateTime, 'sunday');\n                projectStartDateTimestamp = this.dateUtilsInstance.getTimestamp(weekStartDateTime);\n            }\n        } else if (viewType === VIEW_TYPE.DAY) {\n            projectStartDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(projectStartDateTimestamp, timezone);\n        } else if (viewType === VIEW_TYPE.MONTH) {\n            // Pagination already stores a GMT month-aligned start. Do NOT run\n            // parseDate/getStartOfMonth on it — setZone (e.g. America/Chicago)\n            // shifts Aug 1 00:00Z to July and breaks pixel→date for drag/resize.\n        } else if (viewType === VIEW_TYPE.YEAR) {\n            const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n            if (projectStartDateTime.isValid) {\n                const yearStartDateTime = this.dateUtilsInstance.getStartOfYear(projectStartDateTime);\n                projectStartDateTimestamp = this.dateUtilsInstance.getTimestamp(yearStartDateTime);\n            }\n        } else if (viewType === VIEW_TYPE.QUARTER) {\n            // QUARTER view: adjust to start of quarter\n            projectStartDateTimestamp = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n        }\n\n        // projectStartDateTimestamp = this.dateUtilsInstance.convertTimezoneTimestampToUTC(projectStartDateTimestamp, timezone);\n\n        let targetDateTimestamp: number;\n\n        if (this.isAllDayFillMode) {\n            // All-Day Fill Mode: Snap to whole calendar days\n            let calculatedTimestamp: number;\n            \n            if (viewType === VIEW_TYPE.DAY) {\n                // DAY View: colWidth is width per hour\n                const hoursFromStart = pointerRelative / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (hoursFromStart * MS_PER_HOUR);\n            } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n                // WEEK/MONTH View: colWidth is width per day\n                // For right resize in All-Day Fill Mode, account for the -60 offset (same as handleRightResizer)\n                const daysFromStart = (direction === 'right' && this.isAllDayFillMode) ? (pointerRelative - 60) / colWidth : pointerRelative / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            } else if (viewType === VIEW_TYPE.YEAR) {\n                // YEAR View: colWidth is width per month\n                const monthsFromStart = pointerRelative / colWidth;\n                const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n                if (!projectStartDateTime.isValid) {\n                    calculatedTimestamp = projectStartDateTimestamp;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = projectStartDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    calculatedTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else if (viewType === VIEW_TYPE.QUARTER) {\n                // QUARTER View: colWidth is width per month\n                const monthsFromStart = pointerRelative / colWidth;\n                const anchorStartQuarter = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n                const anchorStartQuarterDateTime = this.dateUtilsInstance.parseDate(anchorStartQuarter);\n                if (!anchorStartQuarterDateTime.isValid) {\n                    calculatedTimestamp = anchorStartQuarter;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = anchorStartQuarterDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    calculatedTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else {\n                // Fallback: use days difference\n                const daysFromStart = pointerRelative / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            }\n            \n            targetDateTimestamp = calculatedTimestamp;\n        } else {\n            // Normal Exact-Time Mode: Use fractional time conversion with UTC timestamp arithmetic\n            if (viewType === VIEW_TYPE.DAY) {\n                // DAY View: colWidth is width per hour\n                const hoursFromStart = pointerRelative / colWidth;\n                targetDateTimestamp = projectStartDateTimestamp + (hoursFromStart * MS_PER_HOUR);\n            } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n                // WEEK/MONTH View: colWidth is width per day\n                const daysFromStart = pointerRelative / colWidth;\n                targetDateTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            } else if (viewType === VIEW_TYPE.YEAR) {\n                // YEAR View: colWidth is width per month\n                const monthsFromStart = pointerRelative / colWidth;\n                const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n                if (!projectStartDateTime.isValid) {\n                    targetDateTimestamp = projectStartDateTimestamp;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = projectStartDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    targetDateTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else if (viewType === VIEW_TYPE.QUARTER) {\n                // QUARTER View: colWidth is width per month\n                const monthsFromStart = pointerRelative / colWidth;\n                const anchorStartQuarter = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n                const anchorStartQuarterDateTime = this.dateUtilsInstance.parseDate(anchorStartQuarter);\n                if (!anchorStartQuarterDateTime.isValid) {\n                    targetDateTimestamp = anchorStartQuarter;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = anchorStartQuarterDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    targetDateTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else {\n                // Fallback: use days difference\n                const daysFromStart = pointerRelative / colWidth;\n                targetDateTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            }\n        }\n\n        // GMT wall-clock from pixel math → real UTC for configured timezone\n        targetDateTimestamp = this.dateUtilsInstance.convertTimezoneTimestampToUTC(targetDateTimestamp, timezone);\n\n        const anchoredStartDate = this.initialStartDate ?? this.data.startDate;\n        const anchoredEndDate = this.initialEndDate ?? this.data.endDate;\n\n        // Normalize dates for all-day mode to ensure accurate duration calculation\n        let normalizedTargetDateTimestamp = targetDateTimestamp;\n        let normalizedStartDate = anchoredStartDate;\n        let normalizedEndDate = anchoredEndDate;\n        \n        if (this.isAllDayFillMode) {\n            // For all-day mode, floor every date to start-of-day so that\n            // inclusive daysBetween matches the dates the user sees in the tooltip.\n            normalizedTargetDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(targetDateTimestamp, timezone);\n            normalizedStartDate = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(anchoredStartDate, timezone);\n            normalizedEndDate = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(anchoredEndDate, timezone);\n        }\n\n        // Clamp invalid ranges so the tooltip always shows valid data.\n        // Also clamp when the bar is at minimum pixel width so that every\n        // view consistently shows the same dates/duration at the extreme.\n        const isAtMinWidth = this.width <= this.getMinimumWidth();\n\n        if (direction === 'left') {\n            if (targetDateTimestamp >= anchoredEndDate || isAtMinWidth) {\n                targetDateTimestamp = anchoredEndDate;\n                normalizedTargetDateTimestamp = normalizedEndDate;\n            }\n        } else {\n            if (targetDateTimestamp <= anchoredStartDate || isAtMinWidth) {\n                targetDateTimestamp = anchoredStartDate;\n                normalizedTargetDateTimestamp = normalizedStartDate;\n            }\n        }\n\n        // Cache the calculated timestamps so handleLeftResizer / handleRightResizer\n        // can reuse them instead of recalculating from pixel position.\n        if (direction === 'left') {\n            this.cachedResizeStartTimestamp = targetDateTimestamp;\n        } else {\n            this.cachedResizeEndTimestamp = targetDateTimestamp;\n        }\n\n        // Get resize formatter from option handler based on direction\n        const startDateResizeFormatter = optionHandler.getFormatterForStartDateResize();\n        const endDateResizeFormatter = optionHandler.getFormatterForEndDateResize();\n        \n        // Create a wrapper function that adapts dateUtils.formatDate to match the formatter signature\n        // The formatter expects: (timestamp: number, format: string) => string\n        const formatterFn = (timestamp: number, format: string): string => {\n            const dateTime = dateUtils.parseDate(timestamp);\n            return dateUtils.formatDate(dateTime, format);\n        };\n        \n        // Calculate duration for display\n        // Use normalized dates for accurate duration calculation in all-day mode\n        let durationInMilliseconds: number;\n        let durationStartDate: number;\n        let durationEndDate: number;\n        \n        if (direction === 'left') {\n            // For left resize: duration = endDate - newStartDate\n            durationInMilliseconds = anchoredEndDate - targetDateTimestamp;\n            durationStartDate = normalizedTargetDateTimestamp;\n            durationEndDate = normalizedEndDate;\n        } else {\n            // For right resize: duration = newEndDate - startDate\n            durationInMilliseconds = targetDateTimestamp - anchoredStartDate;\n            durationStartDate = normalizedStartDate;\n            durationEndDate = normalizedTargetDateTimestamp;\n        }\n        \n        // Build tooltip content directly (performance optimized - no text parsing)\n        let startDateText: string;\n        let endDateText: string;\n        let durationText: string | undefined;\n        \n        if (direction === 'left') {\n            // For left resize: show new start date and current end date\n            if (startDateResizeFormatter) {\n                const formattedResult = startDateResizeFormatter(formatterFn, targetDateTimestamp, anchoredEndDate);\n                \n                if (formattedResult.showBothDates) {\n                    startDateText = formattedResult.startDate;\n                    endDateText = formattedResult.endDate;\n                } else {\n                    startDateText = formattedResult.formattedString;\n                    const dateFormat = this.isAllDayFillMode ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss';\n                    const currentEndDateTime = dateUtils.parseDate(anchoredEndDate);\n                    endDateText = dateUtils.formatDate(currentEndDateTime, dateFormat);\n                }\n                \n                if (formattedResult.showDuration) {\n                    durationText = this.formatDuration(\n                        durationInMilliseconds,\n                        durationStartDate,\n                        durationEndDate\n                    );\n                }\n            } else {\n                const dateFormat = this.isAllDayFillMode ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss';\n                const newStartDateTime = dateUtils.parseDate(targetDateTimestamp);\n                const currentEndDateTime = dateUtils.parseDate(anchoredEndDate);\n                startDateText = dateUtils.formatDate(newStartDateTime, dateFormat);\n                endDateText = dateUtils.formatDate(currentEndDateTime, dateFormat);\n            }\n        } else {\n            // For right resize: show current start date and new end date\n            if (endDateResizeFormatter) {\n                const formattedResult = endDateResizeFormatter(formatterFn, anchoredStartDate, targetDateTimestamp);\n                \n                if (formattedResult.showBothDates) {\n                    startDateText = formattedResult.startDate;\n                    endDateText = formattedResult.endDate;\n                } else {\n                    const dateFormat = this.isAllDayFillMode ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss';\n                    const currentStartDateTime = dateUtils.parseDate(anchoredStartDate);\n                    startDateText = dateUtils.formatDate(currentStartDateTime, dateFormat);\n                    endDateText = formattedResult.formattedString;\n                }\n                \n                if (formattedResult.showDuration) {\n                    durationText = this.formatDuration(\n                        durationInMilliseconds,\n                        durationStartDate,\n                        durationEndDate\n                    );\n                }\n            } else {\n                const dateFormat = this.isAllDayFillMode ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss';\n                const currentStartDateTime = dateUtils.parseDate(anchoredStartDate);\n                const newEndDateTime = dateUtils.parseDate(targetDateTimestamp);\n                startDateText = dateUtils.formatDate(currentStartDateTime, dateFormat);\n                endDateText = dateUtils.formatDate(newEndDateTime, dateFormat);\n            }\n        }\n\n        if (!this.isAllDayFillMode && !durationText) {\n            durationText = this.formatDuration(durationInMilliseconds, durationStartDate, durationEndDate);\n        }\n\n        // Create tooltip content directly (performance optimized)\n        const tooltipContent: ITooltipContent = this.createTooltipContent(startDateText, endDateText, durationText);\n        \n        // Update tooltip content using handler\n        if (this.resizeTooltipHandler) {\n            this.resizeTooltipHandler.updateContent(tooltipContent);\n        }\n        \n        // Update tooltip position\n        this.updateResizeTooltipPosition();\n    }\n\n    /**\n     * Create ITooltipContent from start date, end date, and optional duration\n     * Performance optimized - directly accepts values instead of parsing text\n     */\n    private createTooltipContent(startDateText: string, endDateText: string, durationText?: string): ITooltipContent {\n        return {\n            startDate: startDateText,\n            endDate: endDateText,\n            duration: durationText,\n        };\n    }\n\n    private updateResizeTooltipPosition(): void {\n        if (!this.resizerElement || !this.resizeTooltipHandler) return;\n        \n        // Use gridContainer if available, otherwise fallback to parentElement\n        const containerElement = this.gridContainer || this.parentElement;\n        if (!containerElement) return;\n        \n        // Determine position based on resize direction\n        const resizeDirection = this.activeResizeDirection || 'left';\n        const defaultPosition = resizeDirection === 'left' ? Position.bottomLeft : Position.bottomRight;\n        const fallbackPositions: Position[] = resizeDirection === 'left' ? [Position.topLeft] : [Position.topRight];\n        \n        // Configure tooltip position\n        const positionConfig: ITooltipPositionConfig = {\n            sourceElement: this.resizerElement,\n            containerElement: containerElement,\n            position: defaultPosition,\n            fallbackPositions: fallbackPositions,\n            alignSide: 'left',\n            gapX: 0,\n            gapY: 10,\n            keepWithinBounds: true,\n            resizeDirection: resizeDirection,\n        };\n        \n        // Update tooltip position using handler\n        this.resizeTooltipHandler.updatePosition(positionConfig);\n    }\n\n    private cleanupResizeTooltip(): void {\n        // Clean up tooltip component if it exists\n        if (this.resizeTooltipComponent) {\n            this.resizeTooltipComponent.api.destroy();\n            this.resizeTooltipComponent = null;\n        }\n        \n        // Clean up resize tooltip handler\n        if (this.resizeTooltipHandler) {\n            this.resizeTooltipHandler.cleanup();\n            this.resizeTooltipHandler = null;\n        }\n    }\n\n    // private initializeDragTooltip(ghostElement: HTMLElement): void {\n    //     // Clean up existing tooltip if any\n    //     if (this.dragTooltipComponent) {\n    //         this.cleanupDragTooltip();\n    //     }\n\n    //     const registerTooltipElement = (element: HTMLElement) => {\n    //         this.dragTooltipElement = element;\n    //     }\n\n    //     // Create tooltip configuration\n    //     const tooltipConfiguration: ITooltipConfiguration = {\n    //         popupParent         : this.parentElement,\n    //         tooltipValue        : 'Drag to move task',\n    //         shouldShowTooltip   : () => true,\n    //         shouldAttachEvents  : true,\n    //         position            : 'under' as any,\n    //         gapX                : 0,\n    //         gapY                : 0,\n    //         keepWithinBounds    : false,\n    //         hideTooltip         : false,\n    //         tooltipTrigger      : TooltipTriggerStates.HOVER,\n    //         tooltipShowDelay    : 0,\n    //         tooltipHideDelay    : 0,\n    //         tooltipMouseTrack   : true,\n    //         tooltipInteraction  : false,\n    //         fadeOutDelayAfterInteraction : 0,\n            \n    //         // renderer\n    //         renderer : ToolTipComponent,\n    //         userRendererParams : {\n    //             registerTooltipElement : registerTooltipElement\n    //         }\n    //     };\n\n    //     // Initialize tooltip\n    //     this.dragTooltipComponent = new Tooltip(ghostElement, tooltipConfiguration);\n    //     this.dragTooltipComponent.api.open();\n    // }\n\n    private formatDuration(durationMs: number, startDateTimestamp?: number, endDateTimestamp?: number): string {\n        const MS_PER_DAY = 86400000;\n        const MS_PER_MINUTE = 60000;\n\n        if (this.isAllDayFillMode) {\n            let days: number;\n            if (startDateTimestamp !== undefined && endDateTimestamp !== undefined) {\n                try {\n                    const startDateTime = this.dateUtilsInstance.parseDate(startDateTimestamp);\n                    const endDateTime = this.dateUtilsInstance.parseDate(endDateTimestamp);\n\n                    if (startDateTime.isValid && endDateTime.isValid) {\n                        // Both dates are floored to start-of-day, so inclusive=true\n                        // counts both the start and end dates the user sees.\n                        days = this.dateUtilsInstance.daysBetween(startDateTime, endDateTime, true);\n                    } else {\n                        days = Math.ceil(durationMs / MS_PER_DAY);\n                    }\n                } catch {\n                    days = Math.ceil(durationMs / MS_PER_DAY);\n                }\n            } else {\n                days = Math.ceil(durationMs / MS_PER_DAY);\n            }\n            days = Math.max(1, days);\n            return days === 1 ? '1 day' : `${days} days`;\n        }\n\n        // Normal mode: break into days / hours / minutes\n        const totalMinutes = Math.round(Math.max(0, durationMs) / MS_PER_MINUTE);\n\n        if (totalMinutes <= 0) {\n            return '0 mins';\n        }\n\n        const days = Math.floor(totalMinutes / 1440);\n        const remainingAfterDays = totalMinutes % 1440;\n        const hours = Math.floor(remainingAfterDays / 60);\n        const minutes = remainingAfterDays % 60;\n\n        const parts: string[] = [];\n        if (days > 0) parts.push(days === 1 ? '1 day' : `${days} days`);\n        if (hours > 0) parts.push(hours === 1 ? '1 hr' : `${hours} hrs`);\n        if (minutes > 0) parts.push(minutes === 1 ? '1 min' : `${minutes} mins`);\n\n        return parts.length > 0 ? parts.join(' ') : '0 mins';\n    }\n\n    private updateDragTooltipPosition(): void {\n        if (!this.dragAndDropGhostElement || !this.dragTooltipHandler || !this.parentElement) return;\n        \n        // Use gridContainer if available, otherwise fallback to parentElement for bounds checking\n        const containerElement = this.gridContainer || this.parentElement;\n        if (!containerElement) return;\n\n        const isMilestoneDragInAllDayMode = this.isMilestone && this.isAllDayFillMode;\n\n        // For milestones in all-day fill mode, anchor tooltip to the inner diamond\n        // element rather than the outer holder so that horizontal centering aligns\n        // with the diamond's true visual center (the holder center can be offset\n        // by the milestone border width).\n        let sourceElement: HTMLElement = this.dragAndDropGhostElement;\n        if (isMilestoneDragInAllDayMode) {\n            const milestoneInner = this.dragAndDropGhostElement.querySelector(\n                `.${GANTT_CLASS_NAMES.GANTT_MILESTONE}`\n            ) as HTMLElement | null;\n            if (milestoneInner) {\n                sourceElement = milestoneInner;\n            }\n        }\n        \n        // Configure tooltip position\n        const positionConfig: ITooltipPositionConfig = {\n            sourceElement: sourceElement,\n            containerElement: containerElement,\n            position: Position.bottom,\n            fallbackPositions: [Position.top],\n            alignSide: isMilestoneDragInAllDayMode ? undefined : 'left',\n            gapX: 0,\n            gapY: 10,\n            keepWithinBounds: true,\n            followCursor: !isMilestoneDragInAllDayMode,\n            cursorX: isMilestoneDragInAllDayMode ? undefined : this.lastDragMouseEvent?.clientX,\n            cursorY: isMilestoneDragInAllDayMode ? undefined : this.lastDragMouseEvent?.clientY,\n            tooltipType: 'drag-and-drop',\n        };\n        \n        // Update tooltip position using handler\n        this.dragTooltipHandler.updatePosition(positionConfig);\n    }\n\n    private updateDragTooltip(): void {\n        if (!this.dragAndDropGhostElement) return;\n        \n        // Use tracked position (resilient to DOM detachment during async refresh)\n        const ghostLeft = this.currentGhostLeft;\n        const dateUtils = this.params.dateUtilsInstance;\n        const viewType = this.params.viewType;\n        const colWidth = this.params.columnWidth;\n        \n        // Constants for timestamp calculations\n        const MS_PER_HOUR = 3600000;\n        const MS_PER_DAY = 86400000;\n        \n        // Helper: Get start of quarter timestamp from a given timestamp (timezone-aware)\n        const getStartOfQuarterTimestamp = (ts: number): number => {\n            const dateTime = this.dateUtilsInstance.parseDate(ts);\n            if (!dateTime.isValid) {\n                return ts; // Fallback\n            }\n            // Get first month of quarter (0-indexed: 0, 3, 6, 9)\n            const quarterStartMonth = Math.floor((dateTime.month - 1) / 3) * 3 + 1; // Convert to 1-indexed\n            const startOfQuarter = dateTime.set({ month: quarterStartMonth, day: 1, hour: 0, minute: 0, second: 0, millisecond: 0 });\n            return this.dateUtilsInstance.getTimestamp(startOfQuarter);\n        };\n\n        const originalStartDateTimestamp = this.initialStartDate ?? this.data.startDate;\n        const originalEndDateTimestamp = this.initialEndDate ?? this.data.endDate;\n        const durationInMilliseconds = originalEndDateTimestamp - originalStartDateTimestamp;\n\n        const wasMilestoneDrag = this.initialIsMilestone ?? this.isMilestone;\n        const milestoneWidth = this.params.milestoneWidth;\n        // Pixel position along the timeline for date lookup — must match handleTaskBarDrop (relativeX).\n        let timelineX = ghostLeft;\n        if (wasMilestoneDrag) {\n            timelineX = ghostLeft + milestoneWidth / 2;\n            if (this.isAllDayFillMode && (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK)) {\n                timelineX -= milestoneWidth / 2;\n            }\n        }\n\n        // Calculate anchor date from timeline position (ghost left for tasks; milestone-adjusted X for milestones)\n        let projectStartDateTimestamp = this.paginationController.getCurrentProjectStartDate();\n        \n        // Adjust project start date for view type using timezone-aware operations\n        const optionHandler = this.params.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IGanttOptionsHandler;\n        const timezone = optionHandler.getTimezone();\n        \n        if (viewType === VIEW_TYPE.WEEK) {\n            const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n            if (projectStartDateTime.isValid) {\n                const weekStartDateTime = this.dateUtilsInstance.getWeekStartDate(projectStartDateTime, 'sunday');\n                projectStartDateTimestamp = this.dateUtilsInstance.getTimestamp(weekStartDateTime);\n            }\n        } else if (viewType === VIEW_TYPE.DAY) {\n            projectStartDateTimestamp = this.dateUtilsInstance.getStartOfDayForUTCTimestampAsTimestamp(projectStartDateTimestamp, timezone);\n        } else if (viewType === VIEW_TYPE.MONTH) {\n            // Pagination already stores a GMT month-aligned start. Do NOT run\n            // parseDate/getStartOfMonth on it — setZone (e.g. America/Chicago)\n            // shifts Aug 1 00:00Z to July and breaks pixel→date for drag/resize.\n        } else if (viewType === VIEW_TYPE.YEAR) {\n            const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n            if (projectStartDateTime.isValid) {\n                const yearStartDateTime = this.dateUtilsInstance.getStartOfYear(projectStartDateTime);\n                projectStartDateTimestamp = this.dateUtilsInstance.getTimestamp(yearStartDateTime);\n            }\n        } else if (viewType === VIEW_TYPE.QUARTER) {\n            // QUARTER view: adjust to start of quarter\n            projectStartDateTimestamp = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n        }\n\n        // projectStartDateTimestamp = this.dateUtilsInstance.convertTimezoneTimestampToUTC(projectStartDateTimestamp, timezone);\n\n        let anchorDateTimestamp: number;\n\n        if (this.isAllDayFillMode) {\n            // All-Day Fill Mode: Snap to whole calendar days\n            let calculatedTimestamp: number;\n            \n            if (viewType === VIEW_TYPE.DAY) {\n                // DAY View: colWidth is width per hour\n                const hoursFromStart = timelineX / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (hoursFromStart * MS_PER_HOUR);\n            } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n                // WEEK/MONTH View: colWidth is width per day\n                const daysFromStart = timelineX / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            } else if (viewType === VIEW_TYPE.YEAR) {\n                // YEAR View: colWidth is width per month\n                const monthsFromStart = timelineX / colWidth;\n                const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n                if (!projectStartDateTime.isValid) {\n                    calculatedTimestamp = projectStartDateTimestamp;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = projectStartDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    calculatedTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else if (viewType === VIEW_TYPE.QUARTER) {\n                // QUARTER View: colWidth is width per month\n                const monthsFromStart = timelineX / colWidth;\n                const anchorStartQuarter = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n                const anchorStartQuarterDateTime = this.dateUtilsInstance.parseDate(anchorStartQuarter);\n                if (!anchorStartQuarterDateTime.isValid) {\n                    calculatedTimestamp = anchorStartQuarter;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = anchorStartQuarterDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    calculatedTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else {\n                // Fallback: use days difference\n                const daysFromStart = timelineX / colWidth;\n                calculatedTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            }\n            \n            anchorDateTimestamp = calculatedTimestamp;\n        } else {\n            // Normal Exact-Time Mode: Use fractional time conversion with UTC timestamp arithmetic\n            if (viewType === VIEW_TYPE.DAY) {\n                // DAY View: colWidth is width per hour\n                const hoursFromStart = timelineX / colWidth;\n                anchorDateTimestamp = projectStartDateTimestamp + (hoursFromStart * MS_PER_HOUR);\n            } else if (viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK) {\n                // WEEK/MONTH View: colWidth is width per day\n                const daysFromStart = timelineX / colWidth;\n                anchorDateTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            } else if (viewType === VIEW_TYPE.YEAR) {\n                // YEAR View: colWidth is width per month\n                const monthsFromStart = timelineX / colWidth;\n                const projectStartDateTime = this.dateUtilsInstance.parseDate(projectStartDateTimestamp);\n                if (!projectStartDateTime.isValid) {\n                    anchorDateTimestamp = projectStartDateTimestamp;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = projectStartDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    anchorDateTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else if (viewType === VIEW_TYPE.QUARTER) {\n                // QUARTER View: colWidth is width per month\n                const monthsFromStart = timelineX / colWidth;\n                const anchorStartQuarter = getStartOfQuarterTimestamp(projectStartDateTimestamp);\n                const anchorStartQuarterDateTime = this.dateUtilsInstance.parseDate(anchorStartQuarter);\n                if (!anchorStartQuarterDateTime.isValid) {\n                    anchorDateTimestamp = anchorStartQuarter;\n                } else {\n                    const monthIndex = Math.floor(monthsFromStart);\n                    const fractionalMonth = monthsFromStart - monthIndex;\n                    // Add months to get target month (DateTime months are 1-indexed)\n                    const targetDateTime = anchorStartQuarterDateTime.plus({ months: monthIndex });\n                    const daysInMonth = targetDateTime.daysInMonth || 30;\n                    const daysOffset = fractionalMonth * daysInMonth;\n                    const finalDateTime = targetDateTime.plus({ days: daysOffset });\n                    anchorDateTimestamp = this.dateUtilsInstance.getTimestamp(finalDateTime);\n                }\n            } else {\n                // Fallback: use days difference\n                const daysFromStart = timelineX / colWidth;\n                anchorDateTimestamp = projectStartDateTimestamp + (daysFromStart * MS_PER_DAY);\n            }\n        }\n\n        // GMT wall-clock from pixel math → real UTC for configured timezone\n        anchorDateTimestamp = this.dateUtilsInstance.convertTimezoneTimestampToUTC(anchorDateTimestamp, timezone);\n\n        let newStartDateTimestamp: number;\n        let newEndDateTimestamp: number;\n        if (wasMilestoneDrag) {\n            const isFlexible = optionHandler.isFlexibleMilestone();\n            const isEndDatePrioritized = optionHandler.isEndDatePrioritizedForMilestone();\n            if (isFlexible) {\n                const preservedDurationMs = durationInMilliseconds;\n                if (isEndDatePrioritized) {\n                    newEndDateTimestamp = anchorDateTimestamp;\n                    newStartDateTimestamp = newEndDateTimestamp - preservedDurationMs;\n                } else {\n                    newStartDateTimestamp = anchorDateTimestamp;\n                    newEndDateTimestamp = newStartDateTimestamp + preservedDurationMs;\n                }\n            } else {\n                newStartDateTimestamp = anchorDateTimestamp;\n                newEndDateTimestamp = anchorDateTimestamp;\n            }\n        } else {\n            newStartDateTimestamp = anchorDateTimestamp;\n            newEndDateTimestamp = newStartDateTimestamp + durationInMilliseconds;\n        }\n\n        // Get drag and drop formatter from option handler\n        const dragAndDropFormatter = optionHandler.getFormatterForDragAndDrop();\n        \n        // Calculate duration for display\n        const newDurationInMilliseconds = newEndDateTimestamp - newStartDateTimestamp;\n        \n        // Build tooltip content directly (performance optimized - no text parsing)\n        let startDateText: string;\n        let endDateText: string;\n        let durationText: string | undefined;\n        \n        if (dragAndDropFormatter) {\n            // Create a wrapper function that adapts dateUtils.formatDate to match the formatter signature\n            // The formatter expects: (timestamp: number, format: string) => string\n            const formatterFn = (timestamp: number, format: string): string => {\n                const dateTime = dateUtils.parseDate(timestamp);\n                return dateUtils.formatDate(dateTime, format);\n            };\n            \n            // Call the drag and drop formatter\n            const formattedResult = dragAndDropFormatter(formatterFn, newStartDateTimestamp, newEndDateTimestamp);\n            startDateText = formattedResult.startDate;\n            endDateText = formattedResult.endDate;\n            \n            // Add duration if showDuration is true\n            if (formattedResult.showDuration) {\n                durationText = this.formatDuration(\n                    wasMilestoneDrag && optionHandler.isFlexibleMilestone()\n                        ? durationInMilliseconds\n                        : newDurationInMilliseconds,\n                    newStartDateTimestamp,\n                    newEndDateTimestamp\n                );\n            }\n        } else {\n            // Default formatter: Parse timestamps to timezone-aware DateTime objects using dateUtils\n            const startDateTime = dateUtils.parseDate(newStartDateTimestamp);\n            const endDateTime = dateUtils.parseDate(newEndDateTimestamp);\n\n            // Format dates based on All-Day Fill Mode\n            // If All-Day Fill Mode is enabled, show only date format (no time)\n            // Otherwise, show date and time format\n            const dateFormat = this.isAllDayFillMode ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss';\n            startDateText = dateUtils.formatDate(startDateTime, dateFormat);\n            endDateText = dateUtils.formatDate(endDateTime, dateFormat);\n            if (wasMilestoneDrag && optionHandler.isFlexibleMilestone()) {\n                durationText = this.formatDuration(\n                    durationInMilliseconds,\n                    newStartDateTimestamp,\n                    newEndDateTimestamp\n                );\n            }\n        }\n\n        // Create tooltip content directly (performance optimized)\n        const tooltipContent: ITooltipContent = this.createTooltipContent(startDateText, endDateText, durationText);\n        \n        // Update tooltip content using handler\n        if (this.dragTooltipHandler) {\n            this.dragTooltipHandler.updateContent(tooltipContent);\n        }\n    }\n\n    /**\n     * Centralized cleanup for the task-bar drag lifecycle.\n     *\n     * Invoked from every termination path:\n     *   - valid drop on the timeline          → cancelled = false → dispatches EVENT_TASK_BAR_GRAB_ENDED\n     *   - drop outside the timeline / header  → cancelled = true  → dispatches EVENT_TASK_BAR_GRAB_CANCELLED\n     *   - ESC / programmatic cancel           → cancelled = true  → dispatches EVENT_TASK_BAR_GRAB_CANCELLED\n     *   - mouseup outside the container       → cancelled = true  (document-level mouseup routes through onDragStopped)\n     *\n     * When `cancelled` is true we additionally revert the task bar to its\n     * pre-drag state (dates + DOM position) so the UI is never left in a\n     * half-updated state.  The dispatched event is what causes GanttController\n     * to remove the `dg-gantt__task-bar-grab--active` class from the Gantt\n     * root.  Missing this dispatch previously left the UI stuck in dragging\n     * state.\n     */\n    private resetDragState(cancelled: boolean): void {\n        if (cancelled) {\n            // Revert model + DOM BEFORE tearing down drag state so the\n            // snapshot is still available when we read it.\n            this.restoreInitialStateFromSnapshot();\n        }\n\n        // Cancel any pending coalesced drag update so it cannot run AFTER\n        // cleanup and write stale coordinates into the next drag.\n        if (this.dragUpdateRafId !== null) {\n            cancelAnimationFrame(this.dragUpdateRafId);\n            this.dragUpdateRafId = null;\n        }\n\n        // Always tear down global safety listeners — we're either done\n        // legitimately or we're force-cancelling; either way they have no\n        // active drag left to protect.\n        this.detachDragGlobalSafetyListeners();\n\n        this.autoScrollHandler && this.autoScrollHandler.clear();\n\n        const rootElement = this.component.getElement();\n        if (rootElement) {\n            rootElement.classList.remove('dg-gantt__task-bar-source');\n        }\n\n        this.cleanupDragTooltip();\n\n        if (this.dragAndDropGhostElement) {\n            if (this.dragAndDropGhostElement.parentElement) {\n                this.dragAndDropGhostElement.parentElement.removeChild(this.dragAndDropGhostElement);\n            }\n            this.dragAndDropGhostElement = null;\n        }\n\n        this.teardownDragGhostLayer();\n\n        this.dragStartClientX        = 0;\n        this.dragStartLeft           = 0;\n        this.dragStartScrollLeft     = 0;\n        this.currentGhostLeft        = 0;\n        this.dragGhostScreenAnchor   = null;\n        this.milestoneDragSnapOffset = 0;\n        this.initialStartDate        = null;\n        this.initialEndDate          = null;\n        this.initialIsMilestone      = null;\n        this.lastDragMouseEvent      = null;\n\n        // Snapshot is cleared after BOTH successful drop and cancel so the\n        // next drag always starts from a clean slate.\n        this.dragInitialState = null;\n\n        this.isDragActive = false;\n        this.interactionState.setTaskBarDragging(false);\n\n        this.dispatchEvent({\n            type: cancelled\n                ? Events.EVENT_TASK_BAR_GRAB_CANCELLED\n                : Events.EVENT_TASK_BAR_GRAB_ENDED\n        });\n    }\n\n    /**\n     * Public cancel entry point — safe to call from any external code path\n     * (e.g. future keyboard shortcuts, programmatic cancellation, hook\n     * rejection) when an in-flight drag must be aborted and fully reverted.\n     * No-op if no drag is currently active.\n     */\n    public cancelDrag(): void {\n        if (!this.isDragActive) return;\n        this.resetDragState(true);\n    }\n\n    /**\n     * Restore the task bar model data (startDate/endDate/isMilestone) and\n     * its DOM position (style.left/width) from the snapshot captured in\n     * onDragStarted.  Safe to call when no snapshot exists (no-op).\n     *\n     * This is a defensive restore: during a normal drag the original bar\n     * is not mutated (only the ghost moves), but hook callbacks, concurrent\n     * refreshes, or future code changes could touch `this.data` mid-drag.\n     * Restoring explicitly guarantees the bar snaps back on cancel.\n     */\n    private restoreInitialStateFromSnapshot(): void {\n        const snapshot = this.dragInitialState;\n        if (!snapshot) return;\n\n        this.data.startDate = snapshot.startDate;\n        this.data.endDate   = snapshot.endDate;\n        this.isMilestone    = snapshot.isMilestone;\n\n        this.left  = snapshot.left;\n        this.width = snapshot.width;\n\n        const element = this.component.getElement();\n        if (element) {\n            element.style.left  = snapshot.leftStyle  || `${snapshot.left}px`;\n            element.style.width = snapshot.widthStyle || `${snapshot.width}px`;\n        }\n    }\n\n    private cleanupDragTooltip(): void {\n        // Clean up tooltip component if it exists\n        if (this.dragTooltipComponent) {\n            this.dragTooltipComponent.api.destroy();\n            this.dragTooltipComponent = null;\n        }\n        \n        // Clean up drag tooltip handler\n        if (this.dragTooltipHandler) {\n            this.dragTooltipHandler.cleanup();\n            this.dragTooltipHandler = null;\n        }\n        \n        // Clear stored mouse event\n        this.lastDragMouseEvent = null;\n    }\n\n    getRenderer(): any {\n        return this.component.getRenderer();\n    }\n\n    destroyComponent() {\n        // const dragAndDropHandler = this.params.getBeanInstanceByBeanName('dragAndDropHandler');\n        // dragAndDropHandler.removeDragSource(this.dragSourceConfig);\n        // dragAndDropHandler.removeDropTarget(this.dropTarget);\n    }\n\n\n}\n\n","import { EventEmitter } from \"@dg/corecomponent\";\n\n\n\n\nexport class ToolTipComponent extends EventEmitter {\n    private params;\n    private tooltipElement : HTMLElement | null = null;\n\n    init(params) {\n        this.params = params;\n    }\n    \n    getElement() {\n         this.tooltipElement = document.createElement('div');\n         this.tooltipElement.classList.add('ZCC-tooltip');\n         this.tooltipElement.textContent = this.params.value;\n         this.params.registerTooltipElement(this.tooltipElement);\n         return this.tooltipElement;\n    }\n\n     destroy(): void {\n        this.params = null;\n\n    }\n\n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { GANTT_BEAN_NAME } from \"../../Constant/GanttBeanNameConstant\";\n\nexport type InteractionType = 'drag' | 'resize' | 'dependencyConnect';\nexport type ResizeDirection  = 'left' | 'right';\nexport type MarkerDirection  = 'left' | 'right';\n\nexport interface ITaskBarInteractionState {\n    isDragActive(): boolean;\n    isRowDragActive(rowId: string): boolean;\n\n    setTaskBarDragging(active: boolean, rowId?: string | null): void;\n    isTaskBarDragging(): boolean;\n\n    setResizing(active: boolean, direction?: ResizeDirection | null, rowId?: string | null): void;\n    isResizing(): boolean;\n    getResizeDirection(): ResizeDirection | null;\n\n    setDependencyConnecting(active: boolean, markerDirection?: MarkerDirection | null, rowId?: string | null): void;\n    isDependencyConnecting(): boolean;\n    getActiveMarkerDirection(): MarkerDirection | null;\n\n    getActiveInteraction(): InteractionType | null;\n    getActiveRowId(): string | null;\n    reset(): void;\n}\n\n@Bean(GANTT_BEAN_NAME.TASK_BAR_INTERACTION_STATE)\nexport class TaskBarInteractionState extends EventEmitter implements ITaskBarInteractionState {\n\n    private taskBarDragging      : boolean              = false;\n    private resizing             : boolean              = false;\n    private resizeDirection      : ResizeDirection | null  = null;\n    private dependencyConnecting : boolean              = false;\n    private markerDirection      : MarkerDirection | null  = null;\n    private activeRowId          : string | null           = null;\n\n    /**\n     * Returns true when any task-bar interaction (drag-move, resize, or\n     * dependency-connect) is in progress.\n     */\n    public isDragActive(): boolean {\n        return this.taskBarDragging || this.resizing || this.dependencyConnecting;\n    }\n\n    public isRowDragActive(rowId: string): boolean {\n        return this.isDragActive() && this.activeRowId === rowId;\n    }\n\n    // ── Task-bar drag (move) ────────────────────────────────────────────\n\n    public setTaskBarDragging(active: boolean, rowId: string | null = null): void {\n        this.taskBarDragging = active;\n        this.activeRowId     = active ? rowId : null;\n    }\n\n    public isTaskBarDragging(): boolean {\n        return this.taskBarDragging;\n    }\n\n    // ── Resize ──────────────────────────────────────────────────────────\n\n    public setResizing(active: boolean, direction: ResizeDirection | null = null, rowId: string | null = null): void {\n        this.resizing        = active;\n        this.resizeDirection  = active ? direction : null;\n        this.activeRowId      = active ? rowId : null;\n    }\n\n    public isResizing(): boolean {\n        return this.resizing;\n    }\n\n    public getResizeDirection(): ResizeDirection | null {\n        return this.resizeDirection;\n    }\n\n    // ── Dependency-line connect ─────────────────────────────────────────\n\n    public setDependencyConnecting(active: boolean, markerDirection: MarkerDirection | null = null, rowId: string | null = null): void {\n        this.dependencyConnecting = active;\n        this.markerDirection       = active ? markerDirection : null;\n        this.activeRowId           = active ? rowId : null;\n    }\n\n    public isDependencyConnecting(): boolean {\n        return this.dependencyConnecting;\n    }\n\n    public getActiveMarkerDirection(): MarkerDirection | null {\n        return this.markerDirection;\n    }\n\n    // ── Common helpers ──────────────────────────────────────────────────\n\n    public getActiveRowId(): string | null {\n        return this.activeRowId;\n    }\n\n    public getActiveInteraction(): InteractionType | null {\n        if (this.taskBarDragging)      return 'drag';\n        if (this.resizing)             return 'resize';\n        if (this.dependencyConnecting) return 'dependencyConnect';\n        return null;\n    }\n\n    public reset(): void {\n        this.taskBarDragging      = false;\n        this.resizing             = false;\n        this.resizeDirection      = null;\n        this.dependencyConnecting = false;\n        this.markerDirection      = null;\n        this.activeRowId          = null;\n    }\n}\n","\n\n\n\nimport { Component } from \"@dg/corecomponent\";\nimport {IBottomTierHolderComponent, IBottomTierHolderController, IBottomTierLabelContainerController} from '../IBottomTierComponent'\nimport { BottomTierLabelContainerComponent } from \"../BottomTierLabelContainerComponent/BottomTierLabelContainerComponent\";\n\n\n\nfunction BottomTierTemplate(_props : any) : HTMLElement{\n\n    const bottomTier = document.createElement('div');\n    bottomTier.classList.add('dg-gantt__column-header-bottom-panel')\n    return bottomTier;\n}\n\n\n\n\nexport class BottomTierComponent extends Component implements  IBottomTierHolderComponent{\n\n    private controller : IBottomTierHolderController;\n  \n\n    constructor(controller : any){\n        super()\n        this.controller = controller;\n        const props = this.controller.getProperty();\n        this.setTemplate(BottomTierTemplate(props));\n        this.controller.setUpComponent(this);\n\n    }\n\n\n\tgetElement() {\n\t\treturn this.getGui()\n\t}\n\n    setComponent(controllers : IBottomTierLabelContainerController[]): void{\n        controllers.forEach((controller)=>{\n            const bottomTierTextComponent = new BottomTierLabelContainerComponent(controller);\n            this.appendChild(bottomTierTextComponent)\n        })\n\n    }\n    \n}","import {    EventEmitter } from \"@dg/corecomponent\";\nimport { IBottomTierHolderComponent, IBottomTierHolderController} from '../IBottomTierComponent'\nimport { BottomTierLabelContainerController } from \"../BottomTierLabelContainerComponent/BottomTierLabelContainerController\";\n\n\n\nexport class BottomTierController extends EventEmitter implements IBottomTierHolderController {\n    private component !: IBottomTierHolderComponent;\n    private params : any;\n    private bottomTierLabelContainerControllers: BottomTierLabelContainerController[] = [];\n\n    constructor(params :any){\n        super();\n        this.params = params\n    }\n\n    getProperty() : any{\n        return {bottomTierTitle : 'Jan',\n            bottomTierData : this.params.params.bottomTierData\n        }\n    }\n\n    setUpComponent(component : IBottomTierHolderComponent) :void{\n        this.component = component;\n        this.setBottomTierLabelContainerControllers();\n    }\n\n    setBottomTierLabelContainerControllers(){\n        const bottomTierData =  this.params.params.bottomTierData\n        const length = this.params.params.bottomTierCount;\n        this.bottomTierLabelContainerControllers = [];\n\n        for (let i = 0; i < length; i++) {\n            const dateRange = bottomTierData[i]\n            const bottomTierLabelContainerController = new BottomTierLabelContainerController(this.params,dateRange);\n            this.bottomTierLabelContainerControllers.push(bottomTierLabelContainerController);\n        }\n\n        this.component.setComponent(this.bottomTierLabelContainerControllers)\n\n    }\n\n    getBottomTierLabelContainerControllerByIndex(index: number): BottomTierLabelContainerController | null {\n        if (index >= 0 && index < this.bottomTierLabelContainerControllers.length) {\n            return this.bottomTierLabelContainerControllers[index];\n        }\n        return null;\n    }\n  \n\n\n\n\n   \n\n\n\n\n\n}\n","\n\n\n\nimport {  clearElement, Component, removeFromParent } from \"@dg/corecomponent\";\nimport {IBottomTierLabelContainerComponent, IBottomTierLabelContainerController, IBottomTierTextController} from '../IBottomTierComponent'\nimport { BottomTierTextComponent } from \"../BottomTierTextComponent/BottomTierTextComponent\";\nimport { GANTT_CLASS_NAMES } from \"../../../../../Grid/Core/Constants/CSSClassNameContants\";\n\n\n\nfunction BottomTierLabelContainerTemplate(_props : any) : HTMLElement{\n\n    const bottomTierLabelContainer = document.createElement('div');\n    bottomTierLabelContainer.classList.add(GANTT_CLASS_NAMES.GANTT_COLUMN_HEADER_LABEL_CONTAINER)\n\n    return bottomTierLabelContainer;\n}\n\n\n\n\nexport class BottomTierLabelContainerComponent extends Component implements  IBottomTierLabelContainerComponent{\n\n    private controller : IBottomTierLabelContainerController;\n    private renderer       : any;\n\tprivate rendererElement: any;\n   \n\n    constructor(controller : any){\n        super()\n        this.controller = controller;\n        const props = this.controller.getProperty()\n        this.setTemplate(BottomTierLabelContainerTemplate(props));\n        this.controller.setUpComponent(this);\n    }\n    setComponent(controller : IBottomTierTextController): void{\n            const bottomTierTextComponent = new BottomTierTextComponent(controller);\n            this.appendChild(bottomTierTextComponent)\n    }\n\n\taddCssClass(cssClass: string): void {\n\t\tthis.getGui().classList.add(cssClass);\n\t}\n\n\tgetElement() {\n\t\treturn this.getGui()\n\t}\n\n    setRendererDetails(componentDetails: any) :void {\n\n        if (componentDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = componentDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\t// this.destroyRenderer();\n\t\t\t// this.insertValueWithoutRenderer(props);\n\t\t}\n\t}\n\n    private afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n    private destroyRenderer(): void {\n        const destroyBean = this.controller.getDestroyBeanInstance();\n\t\tthis.renderer = destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n    \n}","import {    BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { IBottomTierLabelContainerComponent, IBottomTierLabelContainerController, IDateRange} from '../IBottomTierComponent'\nimport { BottomTierTextController } from \"../BottomTierTextComponent/BottomTierTextController\";\nimport { GANTT_BEAN_NAME } from \"../../../../Constant/GanttBeanNameConstant\";\nimport { IDateUtils } from \"../../../../../Utils/IDateUtils\";\nimport { GANTT_CLASS_NAMES } from \"../../../../../Grid/Core/Constants/CSSClassNameContants\";\n\n\n\nexport class BottomTierLabelContainerController extends EventEmitter implements IBottomTierLabelContainerController {\n    private component !: IBottomTierLabelContainerComponent;\n    private params : any;\n    private dateRange :IDateRange;\n\n\n    constructor(params :any, dateRange :IDateRange){\n        super();\n        this.params = params\n        this.dateRange = dateRange\n    }\n\n    addCssClass(cssClass: string): void {\n        this.component.addCssClass(cssClass);\n    }\n\n    getProperty() : any{\n        return {bottomTierTitle : 'Jan'}\n    }\n\n    setUpComponent(component :  IBottomTierLabelContainerComponent):void{\n        this.component =  component;\n        this.setClasNames();\n        this.setBottomTierTextControllers();\n        this.setRendererDetails()\n\n    }\n\n    private  setClasNames(){\n        if(this.dateRange.isToday){\n            this.component.getElement().classList.add(GANTT_CLASS_NAMES.GANTT_ACTIVE_COLUMN_HEADER_LABEL_CONTAINER);\n        }\n    }\n\n    setBottomTierTextControllers(){\n        const bottomTierLabelContainerController = new BottomTierTextController(this.params);\n        this.component.setComponent(bottomTierLabelContainerController)\n\n    }\n\n   \n    setRendererDetails():void{\n\t\tlet componentDetails;\n\n        const dateUtilInstance = this.params.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.DATE_UTILS);\n        const params = this.createRendererParam(dateUtilInstance);\n\t\tconst userComponentHandler = this.params.params.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n\t\tcomponentDetails = userComponentHandler.getBottomTierRendererDetails(\n\t\t\tthis.params.bottomTier,\n\t\t\tparams,\n\t\t);\n\n\t\tthis.component.setRendererDetails(componentDetails);\n    }\n\n    private createRendererParam(dateUtilInstance: IDateUtils){\n        return {\n            dateRange : {\n                from :this.dateRange.from,   \n                 to :this.dateRange.to,    \n                },\n            timelineViewMode : this.params.timelineViewMode,\n    dateHelper       : {\n        convertToTimezoneObject :(date: string | Date | number, timezone?: string | null)=> dateUtilInstance.convertToTimezoneObject(date, timezone),\n        formatDate : (date : Date, format : string) => dateUtilInstance.formatDate(date, format),\n    },\n    timezone         : this.params.timezone\n        }\n    }\n\n    getDestroyBeanInstance():CallableFunction{\n        return this.params.params.destroyBean\n    }\n\n\n\n\n}\n","\n\n\n\nimport {  Component } from \"@dg/corecomponent\";\nimport {IBottomTierTextComponent, IBottomTierTextController} from '../IBottomTierComponent'\n\n\n\nfunction BottomTierTextTemplate(props : any) : HTMLElement{\n\n    const bottomTierTitle = document.createElement('div');\n    bottomTierTitle.classList.add('dg-gantt__column-header-label');\n    bottomTierTitle.classList.add('dg-gantt__column-header-bottom-text');\n    bottomTierTitle.innerText = props.bottomTierTitle;\n\n    return bottomTierTitle;\n}\n\n\n\n\nexport class BottomTierTextComponent extends Component implements  IBottomTierTextComponent{\n\n    private controller : IBottomTierTextController;\n   \n\n    constructor(controller : any){\n        super()\n        this.controller = controller;\n        const props = this.controller.getProperty()\n        this.setTemplate(BottomTierTextTemplate(props));\n        this.controller.setUpComponent(this);\n    }\n\n\n\tgetElement() {\n\t\treturn this.getGui()\n\t}\n\n    \n}","import {    EventEmitter } from \"@dg/corecomponent\";\nimport { IBottomTierTextComponent, IBottomTierTextController} from '../IBottomTierComponent'\n\n\n\nexport class BottomTierTextController extends EventEmitter implements IBottomTierTextController {\n    // private component !: IBottomTierTextComponent;\n    // private params : any;\n\n\n    constructor(_params :any){\n        super();\n        // this.params = params\n    }\n\n    getProperty() : any{\n        return {bottomTierTitle : 'Jan'}\n    }\n\n    setUpComponent(_component :  IBottomTierTextComponent):void{\n        // this.component =  component;\n\n    }\n\n   \n\n\n   \n\n\n\n\n\n}\n","import { AutoWired, Bean, BEAN_NAME, PostConstruct } from \"@dg/corecomponent\";\nimport { GANTT_BEAN_NAME } from \"../../../Constant/GanttBeanNameConstant\";\nimport { IDateRange, ITimelineData, ITimelineDataProvider } from \"./ITimelineDataProvider\";\nimport { IGanttPaginationController } from \"../../Pagination/IPaginationController\";\nimport { IDateUtils } from \"../../../../Utils/IDateUtils\";\nimport { GanttOptionsHandler } from \"../../OptionsHandler/GanttOptionsHandler\";\nimport { IUnit } from \"../../../IGanttConfiguration\";\n\n@Bean(GANTT_BEAN_NAME.TIMELINE_DATA_PROVIDER)\nexport class TimelineDataProvider implements ITimelineDataProvider {\n\n    @AutoWired(GANTT_BEAN_NAME.PAGINATION_CONTROLLER) private paginationController : IGanttPaginationController;\n    @AutoWired(GANTT_BEAN_NAME.DATE_UTILS) private dateUtils : IDateUtils;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler : GanttOptionsHandler;\n\n    @PostConstruct()\n    init(){\n\n    }\n\n    private getViewType(): IUnit {\n        return this.optionHandler.getTimelineViewMode() as IUnit;\n    }\n\n    /**\n     * PaginationController stores timeline anchors as GMT wall-clock timestamps\n     * (local calendar components encoded as UTC). parseDate() would setZone again\n     * and shift the calendar (e.g. Aug 1 00:00Z → July 31 in America/Chicago),\n     * so headers would disagree with pixel↔date math by about a month.\n     * Convert GMT → real UTC for the configured timezone first.\n     */\n    private parsePaginationTimestamp(gmtTimestamp: number | Date): ReturnType<IDateUtils['parseDate']> {\n        const millis = typeof gmtTimestamp === 'number' ? gmtTimestamp : gmtTimestamp.getTime();\n        const timezone = this.optionHandler.getTimezone();\n        const utcTimestamp = this.dateUtils.convertTimezoneTimestampToUTC(millis, timezone);\n        return this.dateUtils.parseDate(utcTimestamp);\n    }\n\n    /**\n     * Create a date range with timezone support\n     * Accepts Date objects but works with DateTime internally for timezone-aware calculations\n     */\n    private createDateRange(from: Date, to: Date, viewType?: IUnit | string): IDateRange {\n        const currentViewType = (viewType || this.getViewType()) as string;\n        \n        // Parse dates to DateTime for timezone-aware operations\n        const fromDateTime = this.dateUtils.parseDate(from);\n        const toDateTime = this.dateUtils.parseDate(to);\n        \n        // Get today and now as DateTime (timezone-aware)\n        const today = this.dateUtils.today();\n        const now = this.dateUtils.now();\n        let isToday = false;\n\n        switch (currentViewType) {\n            case 'year':\n                // For year view, check if today falls within the year range (timezone-aware)\n                isToday = this.dateUtils.isInRange(today, fromDateTime, toDateTime);\n                break;\n            case 'month':\n                // For month view, check if today falls within the month range (timezone-aware)\n                isToday = this.dateUtils.isInRange(today, fromDateTime, toDateTime);\n                break;\n            case 'week':\n                // For week view, check if today falls within the week range (timezone-aware)\n                isToday = this.dateUtils.isInRange(today, fromDateTime, toDateTime);\n                break;\n            case 'day':\n                // For day view, check if current time (including hour) falls within the range\n                // This handles both same-day check and hour-range check (timezone-aware)\n                isToday = this.dateUtils.isInRange(now, fromDateTime, toDateTime);\n                break;\n            case 'quarter':\n                // For quarter view, check if today falls within the quarter range (timezone-aware)\n                isToday = this.dateUtils.isInRange(today, fromDateTime, toDateTime);\n                break;\n            default:\n                // Default: check if today is in range (timezone-aware)\n                isToday = this.dateUtils.isInRange(today, fromDateTime, toDateTime);\n        }\n\n        // Return Date objects for API compatibility\n        return { from, to, isToday };\n    }\n\n    /**\n     * Get start of day with timezone support\n     */\n    private startOfDay(date: Date | ReturnType<IDateUtils['parseDate']>): Date {\n        const dateTime = this.dateUtils.parseDate(date as Date);\n        return this.dateUtils.parseDateTimeToJSDate(this.dateUtils.startOfDay(dateTime));\n    }\n\n    /**\n     * Get end of day with timezone support\n     */\n    private endOfDay(date: Date | ReturnType<IDateUtils['parseDate']>): Date {\n        const dateTime = this.dateUtils.parseDate(date as Date);\n        return this.dateUtils.parseDateTimeToJSDate(this.dateUtils.endOfDay(dateTime));\n    }\n\n    getMonthViewData(): ITimelineData[] {\n        const { from, to } = this.paginationController.getDateRange();\n        const fromDateTime = this.parsePaginationTimestamp(from);\n        const toDateTime = this.parsePaginationTimestamp(to);\n        const monthStartDateTimes = this.dateUtils.getMonthStartDatesAsDateTime(fromDateTime, toDateTime);\n        const viewType: IUnit = 'month';\n\n        return monthStartDateTimes.map((monthStartDateTime) => {\n            // Work with DateTime internally for timezone-aware calculations\n            const monthStart = monthStartDateTime;\n            const monthEnd = this.dateUtils.getEndOfMonth(monthStart);\n            const { start, end } = this.dateUtils.getMonthBounds(monthStart.toJSDate());\n            const dateRange = this.dateUtils.getDateRangeAsJSDate(start, end);\n            \n            const bottomTierData: IDateRange[] = dateRange.map((currentDate) => {\n                return this.createDateRange(currentDate, currentDate, 'month');\n            });\n\n            // Convert DateTime to Date for API compatibility\n            return {\n                date: monthStart.toJSDate(),\n                bottomTierCount: this.dateUtils.getDaysInMonth(monthStart),\n                bottomTierData,\n                topTierData: this.createDateRange(monthStart.toJSDate(), monthEnd.toJSDate(), viewType),\n            };\n        });\n    }\n\n    getYearViewData(): ITimelineData[] {\n        const yearAnchors = this.paginationController.getArrayOfRange();\n        if (!yearAnchors.length) {\n            return [];\n        }\n        const viewType: IUnit = 'year';\n\n        return yearAnchors.map((anchorDate) => {\n            const anchorDateTime = this.parsePaginationTimestamp(anchorDate);\n            const yearStart = this.dateUtils.getStartOfYear(anchorDateTime);\n            const yearEnd = this.dateUtils.getEndOfYear(anchorDateTime);\n            \n            // Get month start dates as DateTime (timezone-aware)\n            const monthStartDateTimes = this.dateUtils.getMonthStartDatesAsDateTime(yearStart, yearEnd);\n            const bottomTierData = monthStartDateTimes.map((monthStartDateTime) => {\n                // Work with DateTime internally\n                const monthEnd = this.dateUtils.getEndOfMonth(monthStartDateTime);\n                // Convert to Date for createDateRange (which expects Date but works with DateTime internally)\n                return this.createDateRange(monthStartDateTime.toJSDate(), monthEnd.toJSDate(), 'month');\n            });\n\n            // Convert DateTime to Date for API compatibility\n            return {\n                date: yearStart.toJSDate(),\n                bottomTierCount: bottomTierData.length,\n                bottomTierData,\n                topTierData: this.createDateRange(yearStart.toJSDate(), yearEnd.toJSDate(), viewType),\n            };\n        });\n    }\n    getWeekViewData(): ITimelineData[] {\n\n        const weekAnchors = this.paginationController.getArrayOfRange();\n        if (!weekAnchors.length) {\n            return [];\n        }\n        const viewType: IUnit = 'week';\n\n        return weekAnchors.map((anchorDate) => {\n            const weekStart = this.startOfDay(this.parsePaginationTimestamp(anchorDate));\n            const weekEndDateTime = this.dateUtils.endOfDay(this.dateUtils.addDays(this.dateUtils.parseDate(weekStart), 6));\n            const weekEnd = weekEndDateTime.toJSDate();\n            \n            const bottomTierData = this.dateUtils\n                .getDateRangeAsJSDate(weekStart, weekEnd)\n                .map((day) => this.createDateRange(day, day, 'month'));\n\n            return {\n                date: weekStart,\n                bottomTierCount: bottomTierData.length,\n                bottomTierData,\n                topTierData: this.createDateRange(weekStart, weekEnd, viewType),\n            };\n        });\n    }\n    getDayViewData(): ITimelineData[] {\n\n        const dayAnchors = this.paginationController.getArrayOfRange();\n        if (!dayAnchors.length) {\n            return [];\n        }\n        const viewType: IUnit = 'day';\n\n        const HOURS_IN_DAY = 24;\n\n        return dayAnchors.map((anchorDate) => {\n            const anchorDateTime = this.parsePaginationTimestamp(anchorDate);\n            const dayStart = this.startOfDay(anchorDateTime);\n            const dayEnd = this.endOfDay(anchorDateTime);\n            \n            // Parse to DateTime for hour calculations\n            const dayStartDateTime = this.dateUtils.parseDate(dayStart);\n            \n            // Use DateTime to create hour ranges with timezone support\n            const bottomTierData = Array.from({ length: HOURS_IN_DAY }, (_, hour) => {\n                // Work with DateTime - add hours and get start/end of hour (timezone-aware)\n                const hourStart = dayStartDateTime.plus({ hours: hour }).startOf('hour');\n                const hourEnd = hourStart.endOf('hour');\n                // Convert to Date for createDateRange (which expects Date but works with DateTime internally)\n                const from = hourStart.toJSDate();\n                const to = hourEnd.toJSDate();\n                // For hour ranges, check if today's hour falls within this hour range\n                return this.createDateRange(from, to, 'day');\n            });\n\n            return {\n                date: dayStart,\n                bottomTierCount: bottomTierData.length,\n                bottomTierData,\n                topTierData: this.createDateRange(dayStart, dayEnd, viewType),\n            };\n        });\n    }\n    getQuaterViewData(): ITimelineData[] {\n\n        const quarterAnchors = this.paginationController.getArrayOfRange();\n        if (!quarterAnchors.length) {\n            return [];\n        }\n        const viewType = 'quarter' as IUnit;\n\n        return quarterAnchors.map((anchorDate) => {\n            const anchorDateTime = this.parsePaginationTimestamp(anchorDate);\n            const quarterStartDateTime = this.dateUtils.getQuarterStartDate(anchorDateTime);\n            const quarterEndDateTime = quarterStartDateTime.plus({ months: 3 }).minus({ milliseconds: 1 });\n            \n            // Convert to Date for helper methods\n            const quarterStart = quarterStartDateTime.toJSDate();\n            const quarterEnd = quarterEndDateTime.toJSDate();\n            \n            // Get month start dates - work with DateTime internally\n            const monthStartDateTimes = this.dateUtils.getQuarterMonthStartDates(quarterStartDateTime);\n            const bottomTierData = monthStartDateTimes.map((monthStartDateTime) => {\n                // Convert to Date for getMonthBounds and createDateRange\n                const monthStart = monthStartDateTime.toJSDate();\n                const { start, end } = this.dateUtils.getMonthBounds(monthStart);\n                return this.createDateRange(start, end, 'month');\n            });\n\n            return {\n                date: quarterStart,\n                bottomTierCount: bottomTierData.length,\n                bottomTierData,\n                topTierData: this.createDateRange(quarterStart, quarterEnd, viewType),\n            };\n        });\n    }\n\n}","\n\n\n\nimport { Component } from \"@dg/corecomponent\";\nimport { TimelineHeaderController } from \"./TimelineHeaderController\";\nimport {ITimelineHeaderComponent, ITimelineHeaderController} from './ITimelineHeaderComponent'\nimport { ITimelineSettings } from \"../../../IGanttConfiguration\";\nimport { BottomTierComponent } from \"../BottomTeirComponent/BottomTierHolderComponent/BottomTierHolderComponent\";\nimport { ITopTierTextController } from \"../TopTeirComponent/ITopTierComponent\";\nimport { TopTierHolderComponent } from \"../TopTeirComponent/TopTierHolderComponent/TopTierHolderComponent\";\n\n\n\n\nfunction TimelineHeaderTemplate(_property : ITimelineSettings) : HTMLElement{\n    const div = document.createElement('div');\n    div.classList.add('dg-gantt__column-header-wrapper');\n    return div;\n}\n\n\n\n\nexport class TimelineHeaderComponent extends Component implements  ITimelineHeaderComponent{\n\n\n    private params;\n    private controller : ITimelineHeaderController;\n    private bottomTierController: any;\n\n    init(params) {\n        this.params = params;\n        this.controller = new TimelineHeaderController()\n        this.controller.setUpComponent(this,this.params)\n        const property = this.controller.getProperty()\n        this.setTemplate(TimelineHeaderTemplate(property))\n        this.controller.createTopTierController()\n\t}\n\n\tgetElement() {\n\t\treturn this.getGui()\n\t}\n\n    setComponent(controller : ITopTierTextController,type : string):void{\n        if(type === 'top'){\n            const topTierComponent = new TopTierHolderComponent(controller);\n            this.getElement().appendChild(topTierComponent.getElement());\n        }else{\n            this.bottomTierController = controller;\n            const bottomTierComponent = new BottomTierComponent(controller);\n            this.getElement().appendChild(bottomTierComponent.getElement());\n\n        }\n       \n\n    }\n\n    getBottomTierLabelContainerControllerByIndex(index: number): any {\n        if (this.bottomTierController) {\n            return this.bottomTierController.getBottomTierLabelContainerControllerByIndex(index);\n        }\n        return null;\n    }\n}","import {  BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport {ITimelineHeaderComponent, ITimelineHeaderController} from './ITimelineHeaderComponent'\nimport { IGanttOptionsHandler } from \"../../OptionsHandler/IGanttOptionsHandler\";\nimport { ITimelineSettings } from \"../../../IGanttConfiguration\";\n\nimport { BottomTierController } from \"../BottomTeirComponent/BottomTierHolderComponent/BottomTierHolderController\";\nimport { TopTierController } from \"../TopTeirComponent/TopTierHolderComponent/TopTierHolderController\";\n\n\n\n\n\n\nexport class TimelineHeaderController extends EventEmitter implements ITimelineHeaderController {\n    private component !: ITimelineHeaderComponent;\n    private params;\n    private getBeanInstanceByBeanName: any\n    private optionHandler : IGanttOptionsHandler\n\n    public setUpComponent( component: ITimelineHeaderComponent, params : any): void {\n        this.component                 = component;\n        this.params                    = params;\n        this.getBeanInstanceByBeanName = this.params.getBeanInstanceByBeanName;   \n        this.optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n    }\n\n    getProperty() : ITimelineSettings{\n        return  {\n            topTier         : this.optionHandler.getTopTier(),\n            bottomTier      : this.optionHandler.getBottomTier(),\n            weekStartDay    : this.optionHandler.getWeekStartDay(),\n            timelineUnitSize: this.optionHandler.getTimelineUnitSize(),\n            showWeekend     : this.optionHandler.isShowWeekend(),\n            timelineViewMode: this.optionHandler.getTimelineViewMode(),\n            timezone        : this.optionHandler.getTimezone()\n        }\n      }\n\n      createTopTierController(){\n        const props =  this.getProperty();\n        const mergeParams = {\n            ...props,\n            params  : this.params\n            \n        }\n        \n        const topTierController = new TopTierController(mergeParams);\n        this.component.setComponent(topTierController,'top')\n\n        const bottomTierController = new BottomTierController(mergeParams);\n        this.component.setComponent(bottomTierController,'bottom');\n\n      }\n\n\n\n\n\n}\n","\n\n\n\nimport { clearElement, Component, removeFromParent } from \"@dg/corecomponent\";\nimport { ITopTierHolderComponent, ITopTierHolderController, ITopTierTextController } from \"../ITopTierComponent\";\nimport { TopTierTextComponent } from \"../TopTierTextComponent/TopTierTextComponent\";\n\n\n\nfunction TopTierTemplate(props : any) : HTMLElement{\n\n    const topTier = document.createElement('div');\n    topTier.classList.add('dg-gantt__column-header-top-panel')\n    const topTierTitle = document.createElement('div');\n    topTierTitle.classList.add('dg-gantt__column-header-label')\n    topTierTitle.classList.add('dg-gantt__column-header-top-text')\n    topTierTitle.innerText = props.topTierTitle;\n    topTier.append(topTierTitle)\n    return topTier;\n}\n\n\n\n\n\nexport class TopTierHolderComponent extends Component implements  ITopTierHolderComponent{\n\n    private controller : ITopTierHolderController;\n    private renderer       : any;\n\tprivate rendererElement: any;\n\n    constructor(controller : any){\n        super()\n        this.controller = controller;\n        const props = this.controller.getProperty();\n        this.setTemplate(TopTierTemplate(props));\n        this.controller.setUpComponent(this);\n\n    }\n\n\n\tgetElement() {\n\t\treturn this.getGui()\n\t}\n\n    setComponent(controllers : ITopTierTextController[]): void{\n        controllers.forEach((controller)=>{\n            const bottomTierTextComponent = new TopTierTextComponent(controller);\n            this.appendChild(bottomTierTextComponent)\n        })\n\n    }\n\n     setRendererDetails(componentDetails: any) :void {\n\n        if (componentDetails) {\n\t\t\tthis.destroyRenderer();\n\t\t\tconst callback = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = componentDetails.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callback);\n\t\t\t}\n\t\t}else {\n\t\t\t// this.destroyRenderer();\n\t\t\t// this.insertValueWithoutRenderer(props);\n\t\t}\n\t}\n\n    private afterRenderer(renderer: any) {\n\t\tthis.renderer = renderer;\n\t\tthis.rendererElement = renderer.getElement?.() ?? null;\n\t\tif (this.rendererElement) {\n\t\t\tconst parentElement = this.getGui() as HTMLElement;\n\t\t\tclearElement(parentElement);\n\t\t\tparentElement.appendChild(this.rendererElement);\n\t\t}\n\t}\n\n    private destroyRenderer(): void {\n        const destroyBean = this.controller.getDestroyBeanInstance();\n\t\tthis.renderer = destroyBean(this.renderer);\n\t\tremoveFromParent(this.rendererElement);\n\t\tthis.rendererElement = null;\n\t}\n}","import {   BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { ITopTierHolderComponent, ITopTierHolderController } from \"../ITopTierComponent\";\nimport { TopTierTextController } from \"../TopTierTextComponent/TopTierTextController\";\nimport { GANTT_BEAN_NAME } from \"../../../../Constant/GanttBeanNameConstant\";\nimport { IDateUtils } from \"../../../../../Utils/IDateUtils\";\n\n\n\nexport class TopTierController extends EventEmitter implements ITopTierHolderController {\n    private component !: ITopTierHolderComponent;\n    private params : any;\n\n    constructor(params :any){\n        super();\n        this.params = params;\n    }\n\n    getProperty(){\n        return {\n\n        }\n    }\n\n    setUpComponent(component : ITopTierHolderComponent) :void{\n        this.component = component;\n        this.setTopTierTextControllers();\n        this.setRendererDetails();\n    }\n\n    setTopTierTextControllers(){\n        let controllers =[];\n            const topTierTextController = new TopTierTextController(this.params);\n            controllers.push(topTierTextController);\n\n        this.component.setComponent(controllers)\n\n    }\n\n\n    setRendererDetails():void{\n\t\tlet componentDetails;\n\n        const dateUtilInstance = this.params.params.getBeanInstanceByBeanName(GANTT_BEAN_NAME.DATE_UTILS);\n        const params = this.createRendererParam(dateUtilInstance);\n\t\tconst userComponentHandler = this.params.params.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n\t\tcomponentDetails = userComponentHandler.getTopTierRendererDetails(\n\t\t\tthis.params.topTier,\n\t\t\tparams,\n\t\t);\n\n\t\tthis.component.setRendererDetails(componentDetails);\n\n\n    }\n\n    private createRendererParam(dateUtilInstance: IDateUtils){\n        return {\n            dateRange : {\n                from :this.params.params.topTierData.from,   \n                 to :this.params.params.topTierData.to,    \n                },\n                timelineViewMode : this.params.params.timeLineViewType,\n                dateHelper       : {\n                    convertToTimezoneObject :(date: string | Date | number, timezone?: string | null)=> dateUtilInstance.convertToTimezoneObject(date, timezone),\n                    formatDate : (date : Date, format : string) => dateUtilInstance.formatDate(date, format),\n                },\n                timezone         : this.params.timezone\n        }\n    }\n\n    getDestroyBeanInstance():CallableFunction{\n        return this.params.params.destroyBean\n    }\n}\n\n\n\n\n\n\n\n\n\n","\n\n\n\nimport {  Component } from \"@dg/corecomponent\";\nimport {ITopTierTextComponent, ITopTierTextController} from '../ITopTierComponent'\n\n\n\nfunction TopTierTextTemplate(props : any) : HTMLElement{\n\n    const topTierTitle = document.createElement('div');\n    topTierTitle.classList.add('dg-gantt__column-header-label')\n    topTierTitle.classList.add('dg-gantt__column-header-top-text')\n    topTierTitle.innerText = props.topTierTitle;\n\n    return topTierTitle;\n}\n\n\n\n\nexport class TopTierTextComponent extends Component implements  ITopTierTextComponent{\n\n    private controller : ITopTierTextController;\n\n    constructor(controller : any){\n        super()\n        this.controller = controller;\n        const props = this.controller.getProperty()\n        this.setTemplate(TopTierTextTemplate(props));\n        this.controller.setUpComponent(this);\n    }\n\n\n\tgetElement() {\n\t\treturn this.getGui()\n\t}\n\n    //  setRendererDetails(componentDetails: any) :void {\n\n    //     if (componentDetails) {\n\t// \t\tthis.destroyRenderer();\n\t// \t\tconst callback = this.afterRenderer.bind(this);\n\t// \t\tconst componentInstance = componentDetails.newInstance();\n\t// \t\tif (componentInstance) {\n\t// \t\t\tcomponentInstance.then(callback);\n\t// \t\t}\n\t// \t}else {\n\t// \t\t// this.destroyRenderer();\n\t// \t\t// this.insertValueWithoutRenderer(props);\n\t// \t}\n\t// }\n\n    // private afterRenderer(renderer: any) {\n\t// \tthis.renderer = renderer;\n\t// \tthis.rendererElement = renderer.getElement?.() ?? null;\n\t// \tif (this.rendererElement) {\n\t// \t\tconst parentElement = this.getGui() as HTMLElement;\n\t// \t\tclearElement(parentElement);\n\t// \t\tparentElement.appendChild(this.rendererElement);\n\t// \t}\n\t// }\n\n    // private destroyRenderer(): void {\n    //     const destroyBean = this.controller.getDestroyBeanInstance();\n\t// \tthis.renderer = destroyBean(this.renderer);\n\t// \tremoveFromParent(this.rendererElement);\n\t// \tthis.rendererElement = null;\n\t// }\n}","import {    EventEmitter } from \"@dg/corecomponent\";\nimport { ITopTierTextComponent, ITopTierTextController} from '../ITopTierComponent'\n\n\n\nexport class TopTierTextController extends EventEmitter implements ITopTierTextController {\n    // private component !: ITopTierTextComponent;\n    // private params : any;\n\n\n    constructor(_params :any){\n        super();\n        // this.params = params\n    }\n\n    getProperty() : any{\n        return {TopTierTitle : 'Jan'}\n    }\n\n    setUpComponent(_component :  ITopTierTextComponent):void{\n        // this.component =  component;\n        // this.setRendererDetails()\n\n    }\n\n    // setRendererDetails():void{\n\t// \tlet componentDetails;\n\n    //     const params = this.createRendererParam();\n\t// \tconst userComponentHandler = this.params.params.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n\t// \tcomponentDetails = userComponentHandler.getTopTierRendererDetails(\n\t// \t\tthis.params.topTier,\n\t// \t\tparams,\n\t// \t);\n\n\t// \tthis.component.setRendererDetails(componentDetails);\n\n\n    // }\n\n    // private createRendererParam(){\n    //     return {\n    //         date : {\n    //             from : new Date(),   \n    //              to : new Date(),    \n    //             }\n    //     }\n    // }\n\n    // getDestroyBeanInstance():CallableFunction{\n    //     return this.params.params.destroyBean\n    // }\n\n\n\n   \n\n\n\n\n\n}\n","\nimport { AutoWired, BEAN_NAME, Bean, ComponentMetadata, UserComponentHandler, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GanttUserComponentRegistry } from \"./UserComponentRegistry\";\nimport { ITopTierRendererParams } from \"../TimelineHeaderComponent/TopTeirComponent/ITopTierComponent\";\nimport { IBottomTierRendererParams } from \"../TimelineHeaderComponent/BottomTeirComponent/IBottomTierComponent\";\nimport { ITaskBarRendererParams } from \"../TaskBarComponent/ITaskBarComponent\";\n\n\nexport interface ComponentType {\n\tpropertyName: PropertyName;\n\tcellRenderer: boolean;\n}\n\nexport const enum PropertyName {\n    TOP_TIER_RENDERER    = 'topTierRenderer',\n    BOTTOM_TIER_RENDERER = 'bottomTierRenderer',\n    TASK_BAR_RENDERER    = 'taskBarRenderer',\n    ACTION_RENDERER = 'actionRenderer'\n}\n\nexport interface IComponentDetails {\n\tjsComponent              : any;\n\tcomponentName            : string;\n\tframeworkComponent       : any;\n\tpopupFromSelector        : boolean;\n\tpopupPositionFromSelector: 'under' | 'over' | undefined;\n\tparamsFromSelector       : any;\n}\n\nexport interface UserComponentDetails {\n    newInstance              : (params ?: any) => Promise<any>;\n    componentClass           : any;\n    componentFramework       : boolean;\n    popupFromSelector        : boolean;\n    params                   : any;\n    propertyName             : any;\n}\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nclass GanttUserComponentHandler extends UserComponentHandler {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    getTopTierRendererDetails(item: any, params : ITopTierRendererParams) {\n        return this.getComponentDetails(item, PropertyName.TOP_TIER_RENDERER, params, PropertyName.TOP_TIER_RENDERER);\n    }\n    \n    getBottomTierRendererDetails(item: any, params : IBottomTierRendererParams) {\n        return this.getComponentDetails(item, PropertyName.BOTTOM_TIER_RENDERER, params, PropertyName.BOTTOM_TIER_RENDERER);\n    }\n\n    getTaskBarRendererDetails(item: any, params : ITaskBarRendererParams) {\n        return this.getComponentDetails(item, PropertyName.TASK_BAR_RENDERER, params, PropertyName.TASK_BAR_RENDERER);\n    }\n\n    getActionRendererDetails(item : any, params : any) {\n        return this.getComponentDetails(item, PropertyName.ACTION_RENDERER, params, PropertyName.ACTION_RENDERER);\n    }\n\n   \n\n    protected newInstance(component : any, componentFrameWork: boolean, propertyName: PropertyName, param : any) : Promise<any> {\n        let instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName) ?? { mandatoryMethodList: [], optionalMethodList : []};\n\t\t\tinstance = frameworkComponentWrapper.wrap( component, componentMeta.mandatoryMethodList, componentMeta.optionalMethodList, );\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, param);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n    }\n\n   protected getComponentDetails(definition: any, propertyName: any, params?: any, defaultName?: string): UserComponentDetails {\n       let {jsComponent, frameworkComponent, componentName, paramsFromSelector, popupFromSelector} = this.getComponentMeta(definition, propertyName);\n        const mergeParams = this.getMergeParams(definition, propertyName, params, paramsFromSelector);\n\n        const looUpRegistry = (name : string) => {\n            const userComponentRegistry = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_REGISTRY) as GanttUserComponentRegistry;\n            const item = userComponentRegistry.retrieve(name);\n            if(item) {\n                jsComponent        = !item.componentFrameWork ? item.component : undefined;\n                frameworkComponent = item.componentFrameWork ? item.component : undefined;\n            }\n        }\n\n        if(componentName != null) {\n            looUpRegistry(componentName);\n        }\n\n        if(jsComponent == null && frameworkComponent == null && defaultName != null) {\n            looUpRegistry(defaultName);\n        }\n\n        if(!jsComponent && !frameworkComponent) {\n            return undefined;\n        }\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass     = jsComponent ? jsComponent : frameworkComponent;\n\n        return {\n\t\t\tcomponentClass,\n\t\t\tcomponentFramework,\n\t\t\tpopupFromSelector,\n\t\t\tparams: mergeParams,\n            propertyName,\n\t\t\tnewInstance: (params : any = {}) => this.newInstance(componentClass, componentFramework, propertyName, {...mergeParams, ...params}),\n\t\t};\n   }\n\n    protected getComponentMeta(definition: any, propertyName: any): IComponentDetails {\n        let popupFromSelector : boolean | undefined;\n        let paramsFromSelector : any;\n        let popupPositionFromSelector : 'under' | 'over' | undefined;\n\n        let componentName     : string | null = null;\n        let jsComponent       : any           = null;\n        let frameworkComponent: any           = null;\n\n        const assignComponentNameOrComponentClass = (component : any) => {\n            if(typeof component === 'string') {\n                componentName = component;\n            }else if(component != null && component !== true) {\n                const isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent(component);\n\n                if(isFrameworkComponent) {\n                    frameworkComponent = component;\n                }else {\n                    jsComponent = component;\n                }\n            }\n        }\n\n\n\n        assignComponentNameOrComponentClass(this.getComponent(definition, propertyName));\n        return {\n            jsComponent,\n            frameworkComponent,\n            componentName,\n            popupFromSelector,\n            popupPositionFromSelector,\n            paramsFromSelector\n        }\n    }\n\n  \n\n    protected getComponent(item : any, propertyName : PropertyName) : any {\n        switch (propertyName) {\n            case PropertyName.TOP_TIER_RENDERER:\n                return item.renderer;\n            case PropertyName.BOTTOM_TIER_RENDERER:\n                return item.renderer;\n            case PropertyName.TASK_BAR_RENDERER:\n                    return item.renderer;\n            case PropertyName.ACTION_RENDERER:\n                return item.renderer;\n        }\n    }\n\n    private getMergeParams(definition : any, propertyName : PropertyName, params : any, paramsFromSelector : any) : any {\n        return {...params, ...paramsFromSelector, ...this.getUserParams(definition, propertyName, params)};\n    }\n\n    private getUserParams(definition : any, propertyName : PropertyName, params : any) : any {\n        switch (propertyName) {\n\t\t\tcase PropertyName.TOP_TIER_RENDERER:\n\t\t\t\treturn this.getUserTopTierRendererParams(definition, params);\n            case PropertyName.BOTTOM_TIER_RENDERER:\n\t\t\t\treturn this.getUserBottomTierRendererParams(definition, params);\n            case PropertyName.TASK_BAR_RENDERER:\n                    return this.getUserTaskBarRendererParams(definition, params);\n            case PropertyName.ACTION_RENDERER:\n                return this.getUserActionRendererParams(definition, params);\n            default:\n                return {};\n\t\t}\n    }\n\n\n    private getUserTopTierRendererParams(definition : any, params : ITopTierRendererParams) :  any {\n        const cellRendererParams = definition.rendererParams;\n\n        let cellRendererParamsResult : any = {};\n\n        if(typeof cellRendererParams == 'function') {\n            cellRendererParamsResult = (cellRendererParams)(params);\n        }else if(typeof cellRendererParams == 'object') {\n            cellRendererParamsResult = cellRendererParams;\n        }\n\n        return cellRendererParamsResult;\n    }\n    private getUserBottomTierRendererParams(definition : any, params : ITopTierRendererParams) :  any {\n        const cellRendererParams = definition.rendererParams;\n\n        let cellRendererParamsResult : any = {};\n\n        if(typeof cellRendererParams == 'function') {\n            cellRendererParamsResult = (cellRendererParams)(params);\n        }else if(typeof cellRendererParams == 'object') {\n            cellRendererParamsResult = cellRendererParams;\n        }\n\n        return cellRendererParamsResult;\n    }\n    private getUserTaskBarRendererParams(definition : any, params : ITopTierRendererParams) :  any {\n        const cellRendererParams = definition.rendererParams;\n\n        let cellRendererParamsResult : any = {};\n\n        if(typeof cellRendererParams == 'function') {\n            cellRendererParamsResult = (cellRendererParams)(params);\n        }else if(typeof cellRendererParams == 'object') {\n            cellRendererParamsResult = cellRendererParams;\n        }\n\n        return cellRendererParamsResult;\n    }\n\n    private getUserActionRendererParams(definition : any, params : ITopTierRendererParams) :  any {\n        const cellRendererParams = definition.rendererParams;\n\n        let cellRendererParamsResult : any = {};\n\n        if(typeof cellRendererParams == 'function') {\n            cellRendererParamsResult = (cellRendererParams)(params);\n        }else if(typeof cellRendererParams == 'object') {\n            cellRendererParamsResult = cellRendererParams;\n        }\n\n        return cellRendererParamsResult;\n    }\n\n\n\n    protected initComponent(component: any, params: any): Promise<any> | any {\n        this.context.createBean(component);\n        if (component.init == null) { return; }\n        return component.init(params);\n    }\n\n\n}\n\nexport {\n    GanttUserComponentHandler\n}","import { Context } from \"@dg/corecomponent\";\nimport { GANTT_BEAN_NAME } from \"./Constant/GanttBeanNameConstant\";\nimport { GanttCoreComponent, IUserParams } from \"./GanttCoreComponent\";\nimport { IGanttConfiguration } from \"./IGanttConfiguration\";\nimport { IGanttApi } from \"./Api/IGanttApi\";\nimport { IGanttTaskApi } from \"./Api/IGanttTaskApi\";\nimport { IGanttPaginationApi } from \"./Api/IGanttPaginationApi\";\nimport { IDateUtils } from \"../Utils/IDateUtils\";\nimport { DateUtils } from \"../Utils/DateUtils\";\n\n\n\n\n\nexport class Gantt {\n    public api     : IGanttApi  | undefined;\n    public taskApi : IGanttTaskApi  | undefined;\n    public paginationApi : IGanttPaginationApi  | undefined;\n\n    public static dateUtils = new DateUtils() as IDateUtils;\n\n    constructor(container: HTMLElement, ganttOptions: IGanttConfiguration, params : IUserParams = {}) {\n        const setContextAPI = (context : Context) => {\n        this.api     = context.getBean(GANTT_BEAN_NAME.API) as IGanttApi;\n        this.taskApi = context.getBean(GANTT_BEAN_NAME.TASK_API) as IGanttTaskApi;\n        this.paginationApi = context.getBean(GANTT_BEAN_NAME.PAGINATION_API) as IGanttPaginationApi\n\t\t};\n        new GanttCoreComponent().initialize(container, ganttOptions,setContextAPI, params);\n    }\n}","import { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { AutoWired, Bean, BEAN_NAME, getBeanInstanceByBeanName, EventEmitter } from \"@dg/corecomponent\";\nimport { GANTT_BEAN_NAME } from \"./Constant/GanttBeanNameConstant\";\n\n@Bean(GRID_BEAN_NAME.API_HANDLER)\nexport class GanttApiHandler extends EventEmitter {\n    @AutoWired(BEAN_NAME.BEANS) getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    getGanttApi() {\n        return this.getBeanInstanceByBeanName(GANTT_BEAN_NAME.API);\n    }\n\n    getGanttTaskApi() {\n        return this.getBeanInstanceByBeanName(GANTT_BEAN_NAME.TASK_API);\n    }\n\n    getGanttPaginationApi() {\n        return this.getBeanInstanceByBeanName(GANTT_BEAN_NAME.PAGINATION_API);\n    }\n}","import { ComponentMeta } from \"@dg/corecomponent\"\nimport { GanttComponent } from \"./Core/GanttComponent/GanttComponent\"\nimport { getGanttViewTemplate } from \"./Core/GanttComponent/GanttTemplate\"\nimport { ActionComponent } from \"./Core/ActionComponent/ActionComponent\"\n\n\nexport function createComponentList(): ComponentMeta[] {\n    let components: ComponentMeta[] = [\n        {\n            componentName  : 'dg-gantt',\n            componentClass : GanttComponent,\n            template       : getGanttViewTemplate(),\n        },\n        {\n            componentName : 'gantt-action',\n            componentClass : ActionComponent\n        }\n    ]\n    return components\n}","import { GanttComponent } from \"./Core/GanttComponent/GanttComponent\";\nimport { IGanttConfiguration } from \"./IGanttConfiguration\";\n// import { ComponentMetadataProvider } from '@dg/corecomponent/ComponentMetadataProvider.js';\n\nimport { DateUtils } from \"./../Utils/DateUtils\";\nimport { BEAN_NAME, ComponentMetadataProvider, ComponentsRegistry, Context, IFrameworkOverrides, traverseObject, UserComponentRegistry, VanillaFrameWorkOverrider } from \"@dg/corecomponent\";\nimport { IModule } from \"./Modules/modules.types\";\nimport { createComponentList } from \"./GanttComponentRegistry\";\nimport { GanttApi } from \"./Api/GanttApi\";\nimport { GanttEventHandler } from \"./GanttEventHandler\";\nimport { GanttOptionsHandler } from \"./Core/OptionsHandler/GanttOptionsHandler\";\nimport { ControllerHandler } from \"./Core/Contoller/GanttControllerHandler\";\nimport { ViewsCommunicationHandler } from \"./Core/OptionsHandler/viewsCommunicationHandler\";\nimport { GanttTaskApi } from \"./Api/GanttTaskApi\";\nimport { GanttUserComponentHandler } from \"./Core/UserComponentHandler/UserComponentHandler\";\nimport { PropertyName } from \"./Core/UserComponentHandler/UserComponentHandler\";\nimport { TaskbarComponent } from \"./TaskBarRenderer/TaskbarComponent\";\nimport { DragAndDropHandler } from \"../DragAndDrop-handler/dragAndDrop-handler\";\nimport { DragHandler } from \"../drag-handler/drag-handler\";\nimport { GanttPaginationController } from \"./Core/Pagination/PaginationController\";\nimport { GanttPaginationApi } from \"./Api/GanttPaginationApi\";\nimport { TimelineDataProvider } from \"./Core/TimelineHeaderComponent/TimelineDataProvider/TimelineDataProvider\";\nimport { HookManager } from \"../Grid/Core/Hooks/HookManager\";\nimport { GanttApiHandler } from \"./GanttApiHandler\";\nimport { GANTT_BEAN_NAME } from \"./Constant/GanttBeanNameConstant\";\nimport { GanttDateComputationEngine } from \"./Core/GanttDateComputationEngine/GanttDateComputationEngine\";\n\nexport const VIEW_TYPE = {\n DAY    : 'day',\n MONTH  : 'month',\n WEEK   : 'week',\n YEAR   : 'year',\n QUARTER: 'quarter'\n}\n\nlet nextInstanceId = 1;\n\nexport interface IUserParams {\n\tglobalEventListener      ?: Function;\n\tframeworkOverrides       ?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n\tmodules                  ?: IModule[];\n}\n\nexport class GanttCoreComponent {\n    private component          : GanttComponent;\n    // private viewContext        : Context;\n    // private ganttContext       : Context;\n    private context  :Context;\n\n    initialize(container: HTMLElement, ganttOptions: IGanttConfiguration, setContextAPI, params:  IUserParams = {}) {\n\t\tconst instanceID =  String(nextInstanceId++);\n        \n        const userConfigurations = this.createUserCongiguration(container, ganttOptions, instanceID, params);\n\t\tconst beanClasses        = this.getBeanClasses();\n\n        if (!beanClasses) {\n\t\t\treturn;\n\t\t}\n\n        this.context = new Context();\n\n        this.context.registerBeanClasses(beanClasses, userConfigurations);\n        this.registerComponent(this.context);\n        this.registryDefaultComponent(this.context);\n        \n        // Initialize timezone in DateUtils after context is created\n        this.initializeTimezone(this.context, ganttOptions);\n\n        this.component = new GanttComponent(container);\n        this.context.createBean(this.component);\n\n        (window as any).ganttContext = this.context;\n\n        // this.configuration = ganttOptions;\n\n        setContextAPI(this.context);\n\n        // const { leftViewConfiguration, ganttConfiguration }  = this.parseGanttConfiguration(ganttOptions);\n        // const viewGui                      = this.component.getViewGui();\n        // const ganttGui                     = this.component.getGanttGui();\n\n        // const getViewContext = (context : Context) => {\n        //     this.viewContext = context;\n        // }\n\n        // const getGanttContext = (context : Context) => {\n        //     this.ganttContext = context;\n        // }\n\n        // const infoPanel                 = leftViewConfiguration.viewType == 'grid' ? new GridMain(viewGui, leftViewConfiguration as any, {}, getViewContext) : new List(viewGui, leftViewConfiguration as any, {}, getViewContext);\n        // const ganttPanel                = new GridMain(ganttGui, ganttConfiguration, {}, getGanttContext);\n        // const viewsCommunicationHandler = this.context.getBean(GANTT_BEAN_NAME.VIEWS_COMMUNICATION_HANDLER) as ViewsCommunicationHandler;\n        // viewsCommunicationHandler.setContext(this.viewContext, this.ganttContext);\n        // viewsCommunicationHandler.setPanelInstance(infoPanel, ganttPanel);\n\n\n        // this.component.setGanttContext(this.ganttContext);\n        // this.component.setViewContext(this.viewContext);\n        // this.component.appendToParent(container);\n        // this.component.onAfterGuiAttached();\n    }\n\n\n    private createUserCongiguration(container : HTMLElement, configuration : any , instanceID :string, params : IUserParams = {}) : any {\n        let frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider() as any;\n\t\t}\n        return {\n            container,\n            configuration,\n\t\t\tinstanceID,\n\t\t\tframeWorkOverrides,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\n        }\n    }\n\n    private getBeanClasses() {\n\t\tconst beans = new Set([\n            ComponentsRegistry,\n\t\t\tGanttApi,\n            GanttTaskApi,\n            GanttPaginationApi,\n            GanttEventHandler,\n            GanttOptionsHandler,\n            ViewsCommunicationHandler,\n            ControllerHandler,\n            GanttUserComponentHandler,\n            DateUtils,\n            ComponentMetadataProvider,\n            UserComponentRegistry,\n            DragAndDropHandler,\n            DragHandler,\n            GanttPaginationController,\n            TimelineDataProvider,\n            GanttApiHandler,\n            HookManager,\n            GanttDateComputationEngine,\n\t\t]);\n\n\t\treturn beans;\n\t}\n\n    private registerComponent(context : Context) {\n        const registry   = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n\n    private registryDefaultComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean( BEAN_NAME.USER_COMPONENT_REGISTRY ) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n            [PropertyName.TASK_BAR_RENDERER] : TaskbarComponent\n\t\t};\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n    \n    \n\n    getBeanInstance(callback : string ,beanName : string){\n        return this.context[callback](beanName)\n    }\n\n    /**\n     * Initialize timezone in DateUtils based on configuration\n     */\n    private initializeTimezone(context: Context, ganttOptions: IGanttConfiguration): void {\n        try {\n            const dateUtils = context.getBean(GANTT_BEAN_NAME.DATE_UTILS) as DateUtils;\n            if (dateUtils) {\n                const timezone = ganttOptions?.timelineSettings?.timezone;\n                if (timezone) {\n                    dateUtils.setTimezone(timezone);\n                }\n            }\n        } catch (error) {\n            // DateUtils might not be available yet, will be set later\n            console.warn('Could not initialize timezone in DateUtils:', error);\n        }\n    }\n\n    \n\n\n}","import { AutoWired, BEAN_NAME, Bean, DGEvent, EventHandler, } from \"@dg/corecomponent\";\nimport { IGanttApi } from \"./Api/IGanttApi\";\nimport { GANTT_BEAN_NAME } from \"./Constant/GanttBeanNameConstant\";\n\n\n@Bean(BEAN_NAME.EVENT_HANDLER)\nexport class GanttEventHandler extends EventHandler {\n    @AutoWired(GANTT_BEAN_NAME.API) apiHandler !: IGanttApi;\n    dispatchEvent(event: DGEvent): void {\n        let dgEvent = event as any;\n\t\tif (this.optionHandler) {\n\t\t\tdgEvent.instanceAPI = this.apiHandler;\n\t\t}\n\n\t\tthis.dispatchToListeners(dgEvent, true);\n\t\tthis.dispatchToListeners(dgEvent, false);\n\n\t\tthis.firedEvents[dgEvent.type] = true;\n    }\n}","import { EventEmitter as NodeEventEmitter } from \"events\";\n\nexport type ResizeDirection = \"start\" | \"end\" | \"left\" | \"right\" | \"top\" | \"bottom\" | null;\n\nexport interface IResizeHandle {\n    element: HTMLElement;\n    direction: ResizeDirection;\n    data?: any; // Optional data attached to the resize handle\n}\n\nexport interface IResizeEvent {\n    handle: IResizeHandle;\n    currentX: number;\n    currentY: number;\n    deltaX: number;\n    deltaY: number;\n    startX: number;\n    startY: number;\n    originalEvent: MouseEvent | TouchEvent;\n}\n\nexport interface IResizeStartEvent extends IResizeEvent {\n    // Same as IResizeEvent\n}\n\nexport interface IResizeEndEvent extends IResizeEvent {\n    totalDeltaX: number;\n    totalDeltaY: number;\n    // Absolute horizontal distance moved in pixels\n    distanceX: number;\n    isCanceled: boolean;\n}\n\nexport interface IResizingEvent extends IResizeEvent {\n    // Additional properties can be added here\n}\n\n/**\n * Utility-based Resize Controller\n * \n * A generic resize controller that handles element resizing without application logic.\n * It simply registers elements for resize, tracks mouse/touch movement, and emits events\n * with pixel-based deltas.\n * \n * Usage:\n * const resizeController = new ResizeUtil();\n * resizeController.on('resizeStart', (event) => { ... });\n * resizeController.on('resizing', (event) => { ... });\n * resizeController.on('resizeEnd', (event) => { ... });\n * \n * resizeController.registerHandle({\n *     element: myElement,\n *     direction: 'end',\n *     data: { eventId: '123' }\n * });\n */\nexport class ResizeUtil extends NodeEventEmitter {\n    private registeredHandles: Map<HTMLElement, IResizeHandle> = new Map();\n    private isResizing: boolean = false;\n    private activeHandle: IResizeHandle | null = null;\n    private startX: number = 0;\n    private startY: number = 0;\n    private totalDeltaX: number = 0;\n    private totalDeltaY: number = 0;\n\n    /**\n     * Register an element to be resizable\n     * @param handle - The resize handle configuration\n     */\n    public registerHandle(handle: IResizeHandle): void {\n        if (this.registeredHandles.has(handle.element)) {\n            console.warn(`Resize handle already registered for element`);\n            this.unregisterHandle(handle.element);\n        }\n\n        this.registeredHandles.set(handle.element, handle);\n        this.attachListeners(handle);\n    }\n\n    /**\n     * Register multiple elements at once\n     * @param handles - Array of resize handle configurations\n     */\n    public registerHandles(handles: IResizeHandle[]): void {\n        handles.forEach(handle => this.registerHandle(handle));\n    }\n\n    /**\n     * Unregister a resize handle\n     * @param element - The element to unregister\n     */\n    public unregisterHandle(element: HTMLElement): void {\n        const handle = this.registeredHandles.get(element);\n        if (handle) {\n            this.detachListeners(handle);\n            this.registeredHandles.delete(element);\n        }\n    }\n\n    /**\n     * Unregister all resize handles\n     */\n    public unregisterAllHandles(): void {\n        this.registeredHandles.forEach((handle) => {\n            this.detachListeners(handle);\n        });\n        this.registeredHandles.clear();\n    }\n\n    /**\n     * Get the active handle currently being resized\n     */\n    public getActiveHandle(): IResizeHandle | null {\n        return this.activeHandle;\n    }\n\n    /**\n     * Check if resizing is currently active\n     */\n    public isResizingActive(): boolean {\n        return this.isResizing;\n    }\n\n    /**\n     * Cancel the current resize operation\n     */\n    public cancelResize(): void {\n        if (this.isResizing && this.activeHandle) {\n            const endEvent: IResizeEndEvent = {\n                handle: this.activeHandle,\n                currentX: 0,\n                currentY: 0,\n                deltaX: 0,\n                deltaY: 0,\n                totalDeltaX: this.totalDeltaX,\n                totalDeltaY: this.totalDeltaY,\n                distanceX: Math.abs(this.totalDeltaX),\n                startX: this.startX,\n                startY: this.startY,\n                originalEvent: {} as MouseEvent,\n                isCanceled: true\n            };\n            \n            this.emit('resizeCancel', endEvent);\n            this.cleanup();\n        }\n    }\n\n    /**\n     * Destroy the resize controller and clean up all listeners\n     */\n    public destroy(): void {\n        this.unregisterAllHandles();\n        this.cleanup();\n    }\n\n    private attachListeners(handle: IResizeHandle): void {\n        handle.element.addEventListener(\"mousedown\", (e) => this.onResizeStart(e, handle));\n        handle.element.addEventListener(\"touchstart\", (e) => this.onResizeStart(e, handle), { passive: true });\n        \n        // Add visual feedback class\n        handle.element.classList.add('dg-resize-handle');\n    }\n\n    private detachListeners(handle: IResizeHandle): void {\n        handle.element.removeEventListener(\"mousedown\", this.onResizeStart as EventListener);\n        handle.element.removeEventListener(\"touchstart\", this.onResizeStart as EventListener);\n        handle.element.classList.remove('dg-resize-handle');\n    }\n\n    private onResizeStart = (\n        e: MouseEvent | TouchEvent,\n        handle: IResizeHandle\n    ): void => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.isResizing = true;\n        this.activeHandle = handle;\n        this.startX = this.getX(e);\n        this.startY = this.getY(e);\n        this.totalDeltaX = 0;\n        this.totalDeltaY = 0;\n\n        // Attach global listeners\n        window.addEventListener(\"mousemove\", this.onResizeMove);\n        window.addEventListener(\"touchmove\", this.onResizeMove, { passive: false });\n        window.addEventListener(\"mouseup\", this.onResizeEnd);\n        window.addEventListener(\"touchend\", this.onResizeEnd);\n\n        // Emit start event\n        const startEvent: IResizeStartEvent = {\n            handle,\n            currentX: this.startX,\n            currentY: this.startY,\n            deltaX: 0,\n            deltaY: 0,\n            startX: this.startX,\n            startY: this.startY,\n            originalEvent: e\n        };\n\n        this.emit('resizeStart', startEvent);\n    };\n\n    private onResizeMove = (e: MouseEvent | TouchEvent): void => {\n        if (!this.isResizing || !this.activeHandle) return;\n\n        const currentX = this.getX(e);\n        const currentY = this.getY(e);\n        const deltaX = currentX - this.startX;\n        const deltaY = currentY - this.startY;\n\n        // Update total delta\n        this.totalDeltaX = deltaX;\n        this.totalDeltaY = deltaY;\n\n        // Emit resizing event\n        const resizingEvent: IResizingEvent = {\n            handle: this.activeHandle,\n            currentX,\n            currentY,\n            deltaX,\n            deltaY,\n            startX: this.startX,\n            startY: this.startY,\n            originalEvent: e\n        };\n\n        this.emit('resizing', resizingEvent);\n    };\n\n    private onResizeEnd = (e: MouseEvent | TouchEvent): void => {\n        if (!this.isResizing || !this.activeHandle) return;\n\n        const currentX = this.getX(e);\n        const currentY = this.getY(e);\n        const deltaX = currentX - this.startX;\n        const deltaY = currentY - this.startY;\n\n        // Emit end event\n        const endEvent: IResizeEndEvent = {\n            handle: this.activeHandle,\n            currentX,\n            currentY,\n            deltaX,\n            deltaY,\n            totalDeltaX: this.totalDeltaX,\n            totalDeltaY: this.totalDeltaY,\n            distanceX: Math.abs(this.totalDeltaX),\n            startX: this.startX,\n            startY: this.startY,\n            originalEvent: e,\n            isCanceled: false\n        };\n\n        this.emit('resizeEnd', endEvent);\n\n        this.cleanup();\n    };\n\n    private cleanup(): void {\n        // Remove global listeners\n        window.removeEventListener(\"mousemove\", this.onResizeMove);\n        window.removeEventListener(\"touchmove\", this.onResizeMove);\n        window.removeEventListener(\"mouseup\", this.onResizeEnd);\n        window.removeEventListener(\"touchend\", this.onResizeEnd);\n\n        // Reset state\n        this.isResizing = false;\n        this.activeHandle = null;\n        this.startX = 0;\n        this.startY = 0;\n        this.totalDeltaX = 0;\n        this.totalDeltaY = 0;\n    }\n\n    private getY(e: MouseEvent | TouchEvent): number {\n        if (e instanceof MouseEvent) return e.clientY;\n        if (e.touches && e.touches.length > 0) return e.touches[0].clientY;\n        return 0;\n    }\n\n    private getX(e: MouseEvent | TouchEvent): number {\n        if (e instanceof MouseEvent) return e.clientX;\n        if (e.touches && e.touches.length > 0) return e.touches[0].clientX;\n        return 0;\n    }\n}\n\n","import { Component, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { TaskbarController } from \"./TaskbarController\";\n\n\nfunction TaskbarTemplate() : HTMLElement{\n\n    // Holder DOM\n    const div = document.createElement('div');\n    div.classList.add('dg-gantt__task-bar')\n\n    //holder for progress bar pointer resizer first\n    const progressBarPointerResizerHolderFirst = document.createElement('div');\n    progressBarPointerResizerHolderFirst.classList.add('dg-gantt__bar-pt-rs-holder')\n    progressBarPointerResizerHolderFirst.classList.add('dg-gantt__bar-pt-rs-holder-first')\n    div.appendChild(progressBarPointerResizerHolderFirst)\n\n\n\n    //progress bar start pointer\n    const startPointer = document.createElement('div');\n    startPointer.classList.add('dg-gantt__bar-pt')\n    startPointer.classList.add('dg-gantt__bar-pt-start')\n    startPointer.setAttribute('ref','startPointer')\n    progressBarPointerResizerHolderFirst.appendChild(startPointer)\n\n    //progress bar start pointer plus\n    const progressBarStartPointerPlus = document.createElement('div');\n    progressBarStartPointerPlus.classList.add('dg-gantt__bar-pt-plus')\n    progressBarStartPointerPlus.innerText = '+';\n    startPointer.appendChild(progressBarStartPointerPlus)\n\n    // Left Resizer \n    const leftResizer = document.createElement('div');\n    leftResizer.classList.add('dg-gantt__bar-rs')\n    leftResizer.classList.add('dg-gantt__bar-rs-left')\n    leftResizer.setAttribute('ref','leftResizer')\n    progressBarPointerResizerHolderFirst.appendChild(leftResizer)\n\n\n    // Title DOM\n    const taskTitle = document.createElement('div');\n    taskTitle.classList.add('dg-gantt__task-title');\n    taskTitle.setAttribute('ref','taskTitle')\n    div.appendChild(taskTitle);\n\n\n    // Progress Bar DOM\n    const progressbar = document.createElement('div');\n    progressbar.classList.add('dg-gantt__progress-bar');\n    div.appendChild(progressbar);\n\n    //holder for progress bar pointer resizer last\n    const progressBarPointerResizerHolderLast = document.createElement('div');\n    progressBarPointerResizerHolderLast.classList.add('dg-gantt__bar-pt-rs-holder')\n    progressBarPointerResizerHolderLast.classList.add('dg-gantt__bar-pt-rs-holder-last')\n    div.appendChild(progressBarPointerResizerHolderLast)\n\n    // Right Resizer \n    const rightResizer = document.createElement('div');\n    rightResizer.classList.add('dg-gantt__bar-rs')\n    rightResizer.classList.add('dg-gantt__bar-rs-right')\n    rightResizer.setAttribute('ref','rightResizer')\n    progressBarPointerResizerHolderLast.appendChild(rightResizer)\n\n    //progress bar  end pointer\n    const endPointer = document.createElement('div');\n    endPointer.classList.add('dg-gantt__bar-pt')\n    endPointer.classList.add('dg-gantt__bar-pt-end')\n    endPointer.setAttribute('ref','endPointer')\n    progressBarPointerResizerHolderLast.appendChild(endPointer)  \n    \n    //progress bar end pointer plus\n    const progressBarEndPointerPlus = document.createElement('div');\n    progressBarEndPointerPlus.classList.add('dg-gantt__bar-pt-plus')\n    progressBarEndPointerPlus.innerText = '+';\n    endPointer.appendChild(progressBarEndPointerPlus)\n\n    return div;\n}\n\nfunction dummyDiv():HTMLElement{\n    const div = document.createElement('div');\n    return div\n}\n\n\nexport class TaskbarComponent extends Component {\n    @queryAssignedNodes('taskTitle') private taskTitleDOM : HTMLElement\n    @queryAssignedNodes('leftResizer') private leftResizer : HTMLElement\n    @queryAssignedNodes('rightResizer') private rightResizer : HTMLElement\n\n    private params;\n    private controller;\n\n    init(params) {\n        this.params = params;\n\n        const rowNode = this.params.rowNode ;\n        const startDate = rowNode.getStartDate();\n        const endDate = rowNode.getEndDate();\n        const hasStartDate = startDate != null && startDate !== undefined;\n        const hasEndDate = endDate != null && endDate !== undefined;\n        \n        // Validation logic based on date availability\n        if (!hasStartDate && !hasEndDate) {\n            // Neither start date nor end date given - don't render\n            this.setTemplate(dummyDiv())\n            return\n        }\n        \n        if (!hasStartDate && hasEndDate) {\n            // Only end date given - invalid, don't render\n            this.setTemplate(dummyDiv())\n            return\n        }\n        \n        // Check if task should be rendered based on project start date\n        // Use endDate if available, otherwise use startDate + 1 day (for 1-day task)\n        const dateForComparison = hasEndDate ? endDate : this.params.dateUtilsInstance.addDays(startDate, 1).toJSDate();\n        const projectStartWeekDate = this.params.dateUtilsInstance.getWeekStartDate(this.params.projestStartDate,'sunday')\n        const isRender = this.params.dateUtilsInstance.isBefore(projectStartWeekDate, dateForComparison)\n        if(!isRender){\n            this.setTemplate(dummyDiv())\n            return\n        }\n\n        this.setTemplate(TaskbarTemplate())\n\n        this.controller = new TaskbarController()\n        this.controller.setUpComponent(this,this.params)\n\n\t}\n\n    getTaskTitleDOM(){\n        return this.taskTitleDOM\n    }\n\n    getLeftResizserDOM(){\n        return this.leftResizer\n    }\n\n    getRightResizserDOM(){\n        return this.rightResizer\n    }\n\n\tgetElement() {\n\t\treturn this.getGui()\n\t}\n}","import {  EventEmitter } from \"@dg/corecomponent\";\nimport { TaskbarComponent } from \"./TaskbarComponent\";\nimport {ResizeUtil} from '../ResizeController/ResizeUtil'\n\n\nexport const VIEW_TYPE = {\n\tDAY  : 'day',\n\tMONTH: 'month',\n\tWEEK : 'week',\n\tYEAR : 'year'\n\n}\n\n\nexport class TaskbarController extends EventEmitter {\n    private    component                                                       : TaskbarComponent;\n    private params;\n    private data : any\n    private left : number = 0;\n    private width : number = 0\n\n\n    constructor() {\n        super();\n    }\n\n    public setUpComponent( component: TaskbarComponent, params : any): void {\n        this.component         = component;\n        this.params = params;\n        this.data = params.data;\n\n        const element = this.component.getElement();\n\n        this.setLeft(element);\n        this.setWidth(element);\n        this.setId(element);\n        this.setTaskTitle();\n        this.registerEvents();\n        this.registerLeftResizers();\n        this.registerRightResizers();\n    }\n\n    private setId(element){\n        element.setAttribute('id',this.params.data.taskName)\n\n    }\n\n    private setLeft(element){\n        const left = this.calculateLeft();\n        element.style.left = `${left}px`\n\n    }\n\n    private setWidth(element){\n        this.calculateWidth();\n        element.style.width = `${this.width}px`     \n    }\n\n    private setTaskTitle(){\n        const titleElement =  this.component.getTaskTitleDOM();\n        titleElement.innerText = this.params.data.taskName;\n        // console.log(this.optionsHandler.getProjectStartDate());\n    }\n\n    private registerEvents(){\n        const element = this.component.getElement();\n        element.addEventListener('click',this.handleClick.bind(this));\n        // element.addEventListener('mouseenter',this.handleMouseIn.bind(this));\n        // element.addEventListener('mouseout',this.handleMouseOut.bind(this));\n        // element.addEventListener('mousemove',this.handleHover.bind(this));\n    }\n\n    \n\n    private handleClick(event : MouseEvent){\n        console.log(event)\n    }\n\n    // private handleMouseIn(event : MouseEvent){\n    //     // console.log(event)\n\n\n    // }\n\n    // private handleMouseOut(event : MouseEvent){\n    //     // console.log(event)\n    // }\n\n    // private handleHover(event : MouseEvent){\n    //     // console.log(event)\n    // }\n\n    private calculateLeft(){\n        const viewType = this.params.viewType;\n        const rowNode = this.params.node ;\n        const startDate = rowNode.getStartDate();\n        let projestStartDate = this.params.projestStartDate;\n        if(viewType === VIEW_TYPE.WEEK){\n              projestStartDate = this.params.dateUtilsInstance.getWeekStartDate(this.params.projestStartDate,'sunday');\n\n        }\n        const actualStartDate = startDate\n\n        \n\n        const width = this.params.columnWidth;\n        const dateUtilsInstance = this.params.dateUtilsInstance;\n\n        if(viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK){\n            const dateDiffernce = Math.floor(dateUtilsInstance.daysBetween(projestStartDate,actualStartDate));\n            this.left = width * dateDiffernce\n        }else if(viewType === VIEW_TYPE.YEAR){\n            const montDiffernce = Math.floor(dateUtilsInstance.monthsBetween(projestStartDate,actualStartDate));\n            const dateDiffernce = Math.floor(dateUtilsInstance.daysBetween(dateUtilsInstance.getStartOfMonth(actualStartDate),actualStartDate))\n            const daysInMonth = dateUtilsInstance.getDaysInMonth(actualStartDate);\n            const widthPerTask = width/daysInMonth\n\n            this.left = (width * montDiffernce) + (dateDiffernce * widthPerTask)\n        }\n\n        const isProjectStartAfterTaskStart = dateUtilsInstance.isAfter(projestStartDate,actualStartDate);\n\t\tif(isProjectStartAfterTaskStart){\n\t\t\tthis.left = -(this.left);\n\t\t}\n        return this.left\n        \n    }\n\n    private calculateWidth(){\n        const viewType        = this.params.viewType;\n        const rowNode         = this.params.node ;\n        const actualStartDate = rowNode.getStartDate();\n        let   actualEndDate   = rowNode.getEndDate();\n\n        // If only start date is given, render as 1-day task\n        const hasStartDate = actualStartDate != null && actualStartDate !== undefined;\n        const hasEndDate = actualEndDate != null && actualEndDate !== undefined;\n        \n        if (hasStartDate && !hasEndDate) {\n            // Only start date given - render as 1-day task\n            // Set endDate to startDate + 1 day for width calculation\n            actualEndDate = this.params.dateUtilsInstance.addDays(actualStartDate, 1).toJSDate();\n        }\n\n         const columnWidth             = this.params.columnWidth;\n        const dateUtilsInstance = this.params.dateUtilsInstance;\n\n         this.width;\n\n        if(viewType === VIEW_TYPE.MONTH || viewType === VIEW_TYPE.WEEK){\n            const dateDiffernce = Math.floor(dateUtilsInstance.daysBetween(actualStartDate,actualEndDate,true));\n                   this.width  = columnWidth * dateDiffernce\n        }else if(viewType === VIEW_TYPE.YEAR){\n            const dateDiffernce = Math.floor(dateUtilsInstance.daysBetween(actualStartDate,actualEndDate,true));\n            const daysInMonth = dateUtilsInstance.getDaysInMonth(actualStartDate);\n             this.width = (columnWidth/daysInMonth) * dateDiffernce \n\n        }\n        return  this.width;\n        \n    }\n\n\n\n   \n    getComponent(): TaskbarComponent {\n        return this.component;\n    }\n\n    getParams(){\n        return this.params\n    }\n\n\n    // Resizer Handlers \n\n    private registerLeftResizers(){\n        const leftResizer = this.component.getLeftResizserDOM();\n        const resizeController = new ResizeUtil();\n        resizeController.registerHandle({\n            element : leftResizer,\n            direction : 'left'\n        })\n\n        resizeController.on('resizeStart', this.onLeftResizeStart.bind(this));\n        resizeController.on('resizing', this.handleLeftResizing.bind(this));\n        resizeController.on('resizeEnd', this.handleLeftResizer.bind(this));\n\n    }\n\n    private registerRightResizers(){\n        const rightResizer = this.component.getRightResizserDOM();\n        const resizeController = new ResizeUtil();\n        resizeController.registerHandle({\n            element : rightResizer,\n            direction : 'right'\n        })\n\n        resizeController.on('resizeStart', this.onRightResizeStart.bind(this));\n        resizeController.on('resizing', this.handleRightResizing.bind(this));\n        resizeController.on('resizeEnd', this.handleRightResizer.bind(this));\n\n    }\n\n\n    private onLeftResizeStart(){\n        // const element = this.component.getElement();\n        // const width = parseFloat(element.style.width || '0') || element.getBoundingClientRect().width;\n        // this._leftBaseWidth = isNaN(width) ? 0 : width;\n    }\n\n    private onRightResizeStart(){\n        // const element = this.component.getElement();\n        // const width = parseFloat(element.style.width || '0') || element.getBoundingClientRect().width;\n        // this._rightBaseWidth = isNaN(width) ? 0 : width;\n    }\n \n    private handleLeftResizing(event?: any){\n        if(!event) return;\n \n        const element = this.component.getElement();\n        const distanceX = event.deltaX || 0; // resizing emits deltaX, not totalDeltaX\n        const newLeft = this.left + distanceX;\n        const newWidth = Math.max(1, this.width - distanceX);\n        element.style.left = `${newLeft}px`;\n        element.style.width = `${newWidth}px`;\n    }\n \n     \n \n    private handleLeftResizer(event){\n        const totalDeltaX = event.totalDeltaX || 0;\n        if(!totalDeltaX) return;\n\n        // Snap by column width before applying date logic\n        const colWidth = this.params.columnWidth;\n        const snappedDelta = Math.round(totalDeltaX / colWidth) * colWidth;\n        const snappedUnits = Math.round(snappedDelta / colWidth);\n\n        const viewType = this.params.viewType;\n        const dateUtils = this.params.dateUtilsInstance;\n\n        let newStartDate = this.data.startDate;\n\n        if(viewType === VIEW_TYPE.WEEK){\n            const daysDelta = snappedUnits;\n            if(daysDelta !== 0){\n                newStartDate = dateUtils.addDays(this.data.startDate, daysDelta).toJSDate();\n            }\n        }else if(viewType === VIEW_TYPE.YEAR){\n            const monthsDelta = snappedUnits;\n            if(monthsDelta !== 0){\n                newStartDate = dateUtils.addMonths(this.data.startDate, monthsDelta).toJSDate();\n            }\n        }else if(viewType === VIEW_TYPE.DAY){\n            const daysDelta = snappedUnits;\n            if(daysDelta !== 0){\n                newStartDate = dateUtils.addDays(this.data.startDate, daysDelta).toJSDate();\n            }\n        }else if(viewType === VIEW_TYPE.MONTH){\n            const daysDelta = snappedUnits;\n            if(daysDelta !== 0){\n                newStartDate = dateUtils.addDays(this.data.startDate, daysDelta).toJSDate();\n            }\n        }\n\n        // update data and refresh UI if changed\n        if(newStartDate !== this.data.startDate){\n            const oldStartDate = this.data.startDate;\n            this.data.startDate = newStartDate;\n            const element = this.component.getElement();\n            this.setLeft(element);\n            this.setWidth(element);\n\n            // Dispatch update hooks/events if available\n            try{\n                const payload = {\n                    field     : 'startDate',\n                    oldValue  : oldStartDate,\n                    newValue  : newStartDate,\n                    rowData   : this.data\n                };\n                // Emit via controller EventEmitter\n                this.dispatchEvent({ type: 'onAfterDataUpdate', payload } as any);\n                // console.log(payload)\n                // Call any configuration hook passed in params\n                if(this.params && this.params.events && typeof this.params.events.onAfterDataUpdate === 'function'){\n                    this.params.events.onAfterDataUpdate(payload);\n                }\n            }catch(e){\n                console.warn('Failed to dispatch onAfterDataUpdate for startDate change', e);\n            }\n        }\n\n    }\n\n    private handleRightResizing(event?: any){\n        if(!event) return;\n        const element = this.component.getElement();\n        const distanceX = event.deltaX || 0; // resizing emits deltaX, not totalDeltaX\n        const newWidth = Math.max(1, this.width + distanceX);\n        element.style.width = `${newWidth}px`;\n    }\n    private handleRightResizer(event){\n        const totalDeltaX = event.totalDeltaX || 0;\n        if(!totalDeltaX) return;\n\n        // Snap by column width before applying date logic\n        const colWidth = this.params.columnWidth;\n        const snappedDelta = Math.round(totalDeltaX / colWidth) * colWidth;\n        const snappedUnits = Math.round(snappedDelta / colWidth);\n\n        const viewType = this.params.viewType;\n        const dateUtils = this.params.dateUtilsInstance;\n\n        let newEndDate = this.data.endDate;\n\n        if(viewType === VIEW_TYPE.WEEK){\n            const daysDelta = snappedUnits;\n            if(daysDelta !== 0){\n                newEndDate = dateUtils.addDays(this.data.endDate, daysDelta).toJSDate();\n            }\n        }else if(viewType === VIEW_TYPE.YEAR){\n            const monthsDelta = snappedUnits;\n            if(monthsDelta !== 0){\n                newEndDate = dateUtils.addMonths(this.data.endDate, monthsDelta).toJSDate();\n            }\n        }else if(viewType === VIEW_TYPE.DAY){\n            const daysDelta = snappedUnits;\n            if(daysDelta !== 0){\n                newEndDate = dateUtils.addDays(this.data.endDate, daysDelta).toJSDate();\n            }\n        }else if(viewType === VIEW_TYPE.MONTH){\n            const daysDelta = snappedUnits;\n            if(daysDelta !== 0){\n                newEndDate = dateUtils.addDays(this.data.endDate, daysDelta).toJSDate();\n            }\n        }\n\n        if(newEndDate !== this.data.endDate){\n            const oldEndDate = this.data.endDate;\n            this.data.endDate = newEndDate;\n            const element = this.component.getElement();\n            // Right resize affects width only\n            this.setWidth(element);\n\n            // Dispatch update hooks/events if available\n            try{\n                const payload = {\n                    field     : 'endDate',\n                    oldValue  : oldEndDate,\n                    newValue  : newEndDate,\n                    rowData   : this.data\n                };\n                this.dispatchEvent({ type: 'onAfterDataUpdate', payload } as any);\n                // console.log(payload)\n\n                if(this.params && this.params.events && typeof this.params.events.onAfterDataUpdate === 'function'){\n                    this.params.events.onAfterDataUpdate(payload);\n                }\n            }catch(e){\n                console.warn('Failed to dispatch onAfterDataUpdate for endDate change', e);\n            }\n        }\n    }\n\n\n}\n","import { Bean } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Core/Constants/BeanName\";\n\nconst logger = console;\n\n\nexport interface IAPIErrorHandler{\n    throwError(msg : string, ev ?: any) : void;\n    throwWarning(msg : string, ev ?: any) : void;\n}\n\n@Bean(GRID_BEAN_NAME.ERROR_HANDLER)\nexport class APIErrorHandler implements IAPIErrorHandler{\n    throwError(msg : string, ev ?: any) {\n        logger.log(msg, ev);\n    }\n\n    throwWarning(msg : string, ev ?: any) {\n        logger.warn(msg, ev);\n    }\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IAPIHandler } from \"../Interface/IAPIHandler\";\nimport { IGridAPI } from \"../Interface/IGridAPI\";\nimport { IExperimentalAPI } from \"../Interface/IGridExperimentalAPI\";\nimport { IColumnAPIManager } from \"./ColumnAPI/Interface/IColumnAPI\";\nimport { IRowAPIManager } from \"./RowAPI/Interface/IRowAPI\";\nimport { GRID_BEAN_NAME } from \"../Core/Constants/BeanName\";\nimport { IFloatingRowAPI } from \"./FloatingRowAPI/Interface/IFloatingRowAPI\";\nimport { IReorderableAPI } from './ReorderableAPI/Interface/IReorderableAPI';\nimport { ICellAPIManager, IClipboardApiManager, IFilterApiManager, INavigationAPI, IRangeSelectionAPI, IRowGroupingApiManager, ISortApiManager, UserPresenceAPIType } from \"../Main\";\nimport { IPinningAPIManager } from \"./PinningAPI/Interface/IPinningAPIManager.types\";\nimport { ITreeApiManager } from \"./TreeAPI/Interface/ITreeApi\";\n\n\n@Bean(GRID_BEAN_NAME.API_HANDLER)\nexport class APIHandler extends EventEmitter implements IAPIHandler {\n\t@AutoWired(BEAN_NAME.BEANS) getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\t\n\tgetSortAPI(): ISortApiManager {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.SORT_API);\n\t}\n\tgetFilterAPI(): IFilterApiManager {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FILTER_API);\n\t}\n\tgetRowGroupingAPI(): IRowGroupingApiManager {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_GROUPING_API);\n\t}\n\tgetRangeSelectionAPI(): IRangeSelectionAPI {\n\t\treturn this.getBeanInstanceByBeanName('rangeSelectionAPI');\n\t}\n\tgetUserPresenceAPI(): UserPresenceAPIType {\n\t\treturn this.getBeanInstanceByBeanName('userPresenceAPI');\n\t}\n\tgetClipboardAPI(): IClipboardApiManager {\n\t\treturn this.getBeanInstanceByBeanName('clipBoardAPI');\n\t}\n\tgetGridAPI(): IGridAPI {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_API);\n\t}\n\tgetExperimentalAPI(): IExperimentalAPI {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EXPERIMENTAL_API);\n\t}\n\tgetCellAPI(): ICellAPIManager {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CELL_API);\n\t}\n\tgetColumnAPI(): IColumnAPIManager {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_API);\n\t}\n\tgetRowAPI(): IRowAPIManager {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_API);\n\t}\n\tgetRowSelectionAPI() {\n\t\treturn this.getBeanInstanceByBeanName('rowSelectionAPI');\n\t}\n\tgetColumnSelectionAPI() {\n\t\treturn this.getBeanInstanceByBeanName('columnSelectionAPI');\n\t}\n\tgetNavigationAPI(): INavigationAPI {\n\t\treturn this.getBeanInstanceByBeanName('navigationAPI');\n\t}\n\tgetFloatingRowAPI(): IFloatingRowAPI {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_ROW_API);\n\t}\n\tgetReorderableAPI() : IReorderableAPI {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.REORDERABLE_API);\n\t}\n\tgetPinningAPI() : IPinningAPIManager {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.PINNING_API);\n\t}\n\tgetTreeAPI() : ITreeApiManager {\n\t\treturn this.getBeanInstanceByBeanName(GRID_BEAN_NAME.TREE_API);\n\t}\n}","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { ICellHookHandler, ICellHookParamProvider, IDataUpdateHookParamsWithoutAPI, IRangeDataChangeMeta } from \"./Interface/ICellHookAction\";\nimport { ICellAPIInteracter } from \"./Interface/ICellAPIInteracter\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { ICellOptionalConfig } from \"../CommonAPIInterface\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { IDataUpdateEventOrigin, data_update_event_origin } from \"../../Main\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\n\nclass CellHookParamProvider implements ICellHookParamProvider{\n    fieldHandler: any;\n    recordHandler: IRecordHandler;\n    constructor(getBeanInstanceByBeanName : getBeanInstanceByBeanName){\n        this.fieldHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        this.recordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n    }\n    createSetDataHookParams(rangeDatasMeta: IRangeDataChangeMeta[], hookMeta : IHookMeta = {}): IDataUpdateHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams, action} = hookMeta;\n        const metas =  rangeDatasMeta.map(({data, columnIds, startRow, endRow}) => {\n            return {data, columnIds, startRow, endRow}\n        })\n        const cellType  : IDataUpdateEventOrigin = data_update_event_origin.CELL\n\n        return {\n            values : metas,\n            eventOrigin, \n            event,\n            userParams,\n            cellType,\n            action\n        }\n    }\n\n    createUpdateDataHookParams(rangeDatasMeta: IRangeDataChangeMeta[], hookMeta : IHookMeta = {}): IDataUpdateHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams, action} = hookMeta;\n        const metas =  rangeDatasMeta.map(({columnIds, startRow, endRow, data}) => {\n            const rowNodes = this.recordHandler.getSequenceRowNodes(startRow, endRow);\n            const rowData = rowNodes.map((rowNode, rowIndex ) => {\n                return {\n                    [rowNode.getId()] : {...rowNode.getRowData(), ...data[rowIndex]}\n                }\n            })\n            return {data : rowData, columnIds, startRow, endRow}\n        })\n        const cellType  : IDataUpdateEventOrigin = data_update_event_origin.CELL\n        return {\n            values : metas,\n            eventOrigin, \n            event,\n            userParams,\n            cellType,\n            action\n        }\n    }\n}\n\n/** @internal */\nexport function CellHookAction(getBeanInstanceByBeanName : getBeanInstanceByBeanName, apiInteracter : ICellAPIInteracter) {\n    const hook       = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    class CellHookHandler implements ICellHookHandler {\n        private hookArgumentProvider: CellHookParamProvider;\n        constructor() {\n            this.hookArgumentProvider = new CellHookParamProvider(getBeanInstanceByBeanName);\n        }\n        \n        setDataInRanges(rangeDataObjects: IRangeDataChangeMeta[], optionalConfig : ICellOptionalConfig = {}, hookMeta : IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = optionalConfig.userParams;\n            const metas = this.hookArgumentProvider.createSetDataHookParams(rangeDataObjects, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.setDataInRanges(rangeDataObjects, optionalConfig);\n            };\n\n            !suppressEventTrigger && hook.executeHook(HookEventsName.onBeforeDataUpdate, HookEventsName.onAfterDataUpdate, api, metas);\n            \n        }\n\n\n        updateDataInRanges(rangeDataObjects: IRangeDataChangeMeta[], optionalConfig : ICellOptionalConfig = {}, hookMeta : IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = optionalConfig?.userParams;\n            const metas = this.hookArgumentProvider.createUpdateDataHookParams(rangeDataObjects, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.setDataInRanges(rangeDataObjects, optionalConfig);\n            };\n\n            !suppressEventTrigger && hook.executeHook(HookEventsName.onBeforeDataUpdate, HookEventsName.onAfterDataUpdate, api, metas);\n        }\n        // setDataInRanges(rangeDataObjects: IRangeDataObject[], optionalConfig?: ICellOptionalConfig, hookMeta?: IHookMeta): void {\n        //     const {suppressEventTrigger        = true, useApiCaller = true, useActionOldValues = false, oldValues} = hookMeta;\n\n        //     const dataRangeMeta = [];\n\n        //     rangeDataObjects.forEach((dataObject, index) => {\n        //         const oldData = (useActionOldValues && oldValues )? oldValues.values[index] : apiInteracter.getDataInRanges(dataObject.range);\n        //         dataRangeMeta.push({\n        //             oldData,\n        //             data : dataObject.data,\n        //             range : dataObject.range\n        //         })\n        //     })\n        //     const metas   = this.createSetDataHookParams(dataRangeMeta, optionalConfig, hookMeta);\n\n        //     const api = () => {\n\t\t// \t\tuseApiCaller &&\n\t\t// \t\t\tapiInteracter.setDataInRanges(rangeDataObjects, optionalConfig);\n\t\t// \t};\n\n        //     suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeDataUpdate, HookEventsName.onAfterDataUpdate, api, metas) : api();\n\n        // }\n        // clearDataInRanges(ranges: IRange[], cellOptionalConfig?: ICellOptionalConfig, hookMeta?: IHookMeta): void {\n\n        //     const {suppressEventTrigger        = true, useApiCaller = true, useActionOldValues = false, oldValues} = hookMeta;\n        //     const datas                                                                               = [];\n\n        //     ranges.forEach((range, index) => {\n        //         const oldData = (useActionOldValues && oldValues )? oldValues.values[index] : apiInteracter.getDataInRanges(range);\n        //         datas.push(oldData);\n        //     })\n        //     const metas   = this.createclearDataHookParams(ranges,datas, cellOptionalConfig,hookMeta);\n\n        //     const api = ({ranges} : any) => {\n        //         useApiCaller && apiInteracter.clearDataInRanges(ranges, cellOptionalConfig);\n        //     };\n\n        //     suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeDataUpdate, HookEventsName.onAfterDataUpdate, api, metas) : api(metas);\n\n\n        // }      \n        \n        \n        // createSetDataHookParams(rangeMetas : IDataRangeMeta[], optionalConfig : ICellOptionalConfig, hookMeta : IHookMeta)  : IDataUpdateHookParamsWithoutAPI{\n        //     return {\n        //         rangeMetas,\n        //         parentKeys      : optionalConfig.parentKeys,\n        //         rowPinPositions : optionalConfig.pinPosition,\n        //         force           : optionalConfig.force,\n        //         eventOrigin       : hookMeta.eventOrigin,\n        //         event           : hookMeta.event\n        //     }\n        // }\n\n        // createclearDataHookParams(ranges : IRange[],data : any, cellOptionalConfig : ICellOptionalConfig, hookMeta : IHookMeta)  : IClearDataHookParamsWithoutAPI{\n        //     return {\n        //         ranges,\n        //         data,\n        //         parentKeys      : cellOptionalConfig.parentKeys,\n        //         force           : cellOptionalConfig.force,\n        //         rowPinPositions : cellOptionalConfig.pinPosition,\n        //         eventOrigin       : hookMeta.eventOrigin,\n        //         event           : hookMeta.event\n        //     }\n        // }\n    }\n\n    return new CellHookHandler();\n}\n","import { AutoWired, EventEmitter } from \"@dg/corecomponent\";\nimport { ICellOptionalConfig, IRange, IRangeData, RefreshCellParams } from \"../CommonAPIInterface\";\nimport { ICellAPIInteracter } from \"./Interface/ICellAPIInteracter\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { RowRenderController } from \"../../Core/Rows/RowRenderController\";\nimport { IRangeDataChangeMeta } from \"./Interface/ICellHookAction\";\nimport { Events } from \"../../Core/Constants/Events\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { CellPositionType } from \"../../Core/Navigation/cell-position.types\";\nimport { IFloatingRecordHandler } from \"Grid/FloatingRecords/Interface/IFloatingRecordHandler\";\n\n\nexport class CellAPIInteracter extends EventEmitter implements ICellAPIInteracter {\n\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler: IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) fieldHandler: FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) rowRendererController : RowRenderController;\n    @AutoWired(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) floatingRecordHandler: IFloatingRecordHandler;\n\n    getData(rowId: string, columnId: string) {\n        const rowNode    = this.recordHandler.getRowNodeById(rowId);\n        const columnNode = this.fieldHandler.getColumnNodeByID(columnId);\n        if(rowNode && columnNode) {\n            const key  = columnNode.getColumnKey();\n            return rowNode.getDataByKey(key);\n        }\n\n        return null;\n    }\n\n    setDataInRanges(rangeDataObjects: IRangeDataChangeMeta[], _optionalConfig?: ICellOptionalConfig): void {\n        rangeDataObjects.forEach(({startRow : startMeta, endRow : endMeta, columnIds, data}) => {\n            if(!startMeta || !endMeta){\n                return \n            }\n            const isFloatingRecord = startMeta.pinPosition == 'FloatingRecord';\n            // const startRowMeta     = isFloatingRecord ? this.recordHandler.getIndexMetaById(this.floatingRecordHandler.getSourceFloatingRow(), true) : startMeta;\n            // const endRowMeta       = isFloatingRecord ? this.recordHandler.getIndexMetaById(this.floatingRecordHandler.getTargetRowId(), true) : endMeta;\n            const sequenceRowNodes = isFloatingRecord ? [this.floatingRecordHandler.getFloatingRowNode()] : this.recordHandler.getSequenceRowNodes(startMeta, endMeta);\n            sequenceRowNodes.forEach((rowNode) => {\n                rowNode && columnIds.forEach((columnId, index) => {\n                    const columnNode = this.fieldHandler.getColumnNodeByID(columnId);\n                    if(columnNode) {\n                        const key = columnNode.getColumnKey();\n                        const newData = data[index][key];\n                        const oldData = rowNode.getDataByKey(columnNode.getColumnKey());\n                        rowNode.updateDataByKey(key, newData);\n                        const rowMeta = rowNode.getRowMeta();\n                        this.dispatchEvent({\n                            type : 'EVENT_MIN_SPARE_UPDATE',\n                            cellPosition : {\n                               ...rowMeta,\n                               columnID : columnId\n                            } as CellPositionType,\n                            isNewValue : oldData !== newData\n                        })\n                    }\n                })\n            })\n        })\n\n        this.dispatchEvent({\n            type: Events.EVENT_CELL_REFRESH\n        })\n    }\n\n\n\n    refreshCell(recordId: string, fieldId: string, refreshParams: RefreshCellParams): void {\n        this.rowRendererController.refreshCell(recordId, fieldId, refreshParams);\n    }\n\n    getDataInRanges(ranges : IRange[]) : IRangeData[] {\n        return ranges.map(({startRow : startMeta, endRow : endMeta, columnIds}) => {\n            const sequenceRowNodes = this.recordHandler.getSequenceRowNodes(startMeta, endMeta);\n            const columnKeys = columnIds.map((columnId) => {\n                const node = this.fieldHandler.getColumnNodeByID(columnId);\n                return node && node.getColumnKey();\n            })\n            const data = [];\n            sequenceRowNodes.forEach((rowNode) => {\n                rowNode && data.push(rowNode.getRowData())\n            })\n            return {\n                columnKeys,\n                data\n            }\n        });\n    }\n\n    refreshGroupCells(refreshParams: RefreshCellParams = {}): void {\n        this.rowRendererController.refreshGroupCells(refreshParams);\n    }\n       \n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { ICellOptionalConfig, IForceOption, IRange, RefreshCellParams } from \"../CommonAPIInterface\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { CellHookAction } from \"./CellAPIHookHandler\";\nimport { createCellValidationWrapper } from \"./CellAPIValidator\";\nimport { CellAPIInteracter } from \"./CellAPIInteracter\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { ICellAPIInteracter } from \"./Interface/ICellAPIInteracter\";\nimport { ICellAPIManager, ICellApiValidator } from \"./Interface/ICellAPIManager\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { ICellHookHandler, IRangeDataChangeMeta } from \"./Interface/ICellHookAction\";\n\nconst cellAPIHookMeta : IHookMeta = {\n    suppressEventTrigger: false,\n    useApiCaller        : true,\n    eventOrigin         : 'api'\n}\n@Bean(GRID_BEAN_NAME.CELL_API)\nexport class CellAPIManager extends EventEmitter implements ICellAPIManager {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName  : getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler   : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private columnHandler : FieldHandler;\n    private    interacter                                          : ICellAPIInteracter;\n    private    validator                                           : ICellApiValidator;\n    private    hookAction                                          : ICellHookHandler;\n\n    @PostConstruct()\n    init() {\n        this.interacter = this.createManagedBean(new CellAPIInteracter());\n        this.hookAction = CellHookAction(this.getBeanInstanceByBeanName, this.interacter);\n        this.validator  = createCellValidationWrapper(this.getBeanInstanceByBeanName);\n    }\n    getData(rowIndex: number, columnIndex: number, cellOptionalConfig?: ICellOptionalConfig) : any {\n        const columnId = this.columnHandler.getAbsoluteID(columnIndex);\n        const rowId    = this.recordHandler.getId(rowIndex, cellOptionalConfig?.pinPosition, cellOptionalConfig?.parentKeys);\n        return this.getDataById(rowId, columnId);\n    }\n    getDataById(rowId: string, columnId: string) {\n       return this.interacter.getData(rowId, columnId);\n    }\n    clearCell(rowIndex: number, columnIndex: number, cellOptionalConfig?: ICellOptionalConfig, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        const emptyData = '';\n        this.setData(rowIndex, columnIndex, emptyData, cellOptionalConfig, hookMeta);\n    }\n    clearCellById(rowId: string, columnId: string, forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        const emptyData = '';\n        this.setDataById(rowId, columnId, emptyData, forceOptionalConfig, hookMeta);\n    }\n    clearDataInRange(range: IRange, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        this.clearDataInRanges([range], hookMeta);\n    }\n    clearDataInRanges(ranges: IRange[], forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        const dataRange = ranges.map(range=>{\n            const {columnIds} = range;\n            const data        = [];\n            const columnKeys  = columnIds.map(columnId => {\n                const columnNode = this.columnHandler.getColumnNodeByID(columnId);\n                const columnKey  = columnNode?.getColumnKey();\n                data.push({[columnKey] : ''});\n                return columnKey\n            })\n\n            return { ...range, columnKeys, data };\n        });\n        this.setDataInRanges(dataRange, forceOptionalConfig, hookMeta);\n    }\n    setData(rowIndex: number, columnIndex: number, value: any, cellOptionalConfig : ICellOptionalConfig = {}, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        const {pinPosition, parentKeys} = cellOptionalConfig;\n        const rowId                     = this.recordHandler.getId(rowIndex, pinPosition, parentKeys);\n        const columnId                  = this.columnHandler.getAbsoluteID(columnIndex);\n        this.setDataById(rowId, columnId, value, cellOptionalConfig, hookMeta);\n    }\n    updateData(rowIndex: number, columnIndex: number, value: any, cellOptionalConfig : ICellOptionalConfig = {}, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        const {pinPosition, parentKeys} = cellOptionalConfig;\n        const rowId                     = this.recordHandler.getId(rowIndex, pinPosition, parentKeys);\n        const columnId                  = this.columnHandler.getAbsoluteID(columnIndex);\n        this.updateDataById(rowId, columnId, value, cellOptionalConfig, hookMeta);\n    }\n    updateDataById(rowId: string, columnId: string, value: any, forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        const rowMeta = this.recordHandler.getIndexMetaById(rowId);\n        const columnNode = this.columnHandler.getColumnNodeByID(columnId);\n        const columnKey = columnNode?.getColumnKey();\n        const rangeData = [{startRow : rowMeta, endRow : rowMeta, columnIds : [columnId], data : [{[columnKey] : value}]}] as IRangeDataChangeMeta[];\n        const isValid = this.validator.validateRangeDataChange(rangeData, hookMeta);\n        if(isValid) {\n            this.hookAction.updateDataInRanges(rangeData, forceOptionalConfig, hookMeta);\n        }\n    }\n    setDataById(rowId: string, columnId: string, value: any, forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        const isValid    = this.validator.validateCellDataChange(rowId, columnId, value, hookMeta);\n        if(isValid) {\n            const rowMeta    = this.recordHandler.getIndexMetaById(rowId);\n            const columnNode = this.columnHandler.getColumnNodeByID(columnId);\n            const columnKeys = [columnNode?.getColumnKey()];\n            const data       = columnKeys.map(key=>({[key] : value}));\n            this.setDataInRange({startRow : rowMeta, endRow : rowMeta, columnIds : [columnId], data}, forceOptionalConfig, hookMeta);\n        }\n    }\n    setDataInRange(dataRange: IRangeDataChangeMeta, forceOptionalConfig?: IForceOption,  hookMeta: IHookMeta = cellAPIHookMeta): void {\n        this.setDataInRanges([dataRange], forceOptionalConfig, hookMeta);\n    }\n    setDataInRanges(rangeDatas: IRangeDataChangeMeta[], forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = cellAPIHookMeta): void {\n        const isValid = this.validator.validateRangeDataChange(rangeDatas, hookMeta);\n        if(isValid) {\n            this.hookAction.setDataInRanges(rangeDatas, forceOptionalConfig, hookMeta);\n        }\n    }\n    refreshCell(recordId: string, fieldId: string, refreshParams: RefreshCellParams = {}): void {\n        this.interacter.refreshCell(recordId, fieldId, refreshParams);\n    }\n\n    refreshCellByIndex(recordIndex: number, fieldIndex: number, refreshParams: RefreshCellParams = {}, optionalConfig : ICellOptionalConfig): void {\n        const recordId    = this.recordHandler.getId(recordIndex, optionalConfig?.pinPosition, optionalConfig?.parentKeys);\n        const fieldId = this.columnHandler.getAbsoluteID(fieldIndex);\n        this.refreshCell(recordId, fieldId, refreshParams);\n    }\n\n    refreshGroupCells(refreshParams: RefreshCellParams = {}): void {\n        this.interacter.refreshGroupCells(refreshParams);\n    }\n}","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IRangeDataChangeMeta } from \"./Interface/ICellHookAction\";\nimport { ICellApiValidator } from \"./Interface/ICellAPIManager\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { FloatingRecordHandler } from \"../../../Grid/FloatingRecords/FloatingRecordHandler\";\n\nfunction isDataChanged(oldValue : any, newValue : any) : boolean {\n  if (Number.isNaN(oldValue) && Number.isNaN(newValue)) return false;\n  if (oldValue === newValue) return false;\n  if (typeof oldValue !== typeof newValue) return true;\n\n  if (Array.isArray(oldValue) && Array.isArray(newValue)) {\n    if (oldValue.length !== newValue.length) return true;\n    return oldValue.some((val, i) => isDataChanged(val, newValue[i]));\n  }\n\n  if ( oldValue && newValue && typeof oldValue === \"object\" && typeof newValue === \"object\" ) {\n    const oldKeys = Object.keys(oldValue);\n    const newKeys = Object.keys(newValue);\n    if (oldKeys.length !== newKeys.length) return true;\n    return oldKeys.some(\n      (key) =>\n        !newValue.hasOwnProperty(key) || isDataChanged(oldValue[key], newValue[key])\n    );\n  }\n\n  return oldValue !== newValue;\n}\n\n\n/** @internal */\nexport function createCellValidationWrapper( getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n\tclass CellAPIValidator implements ICellApiValidator {\n        private rowHandler    : IRecordHandler;\n        private columnHandler;\n        private floatingRecordHandler : FloatingRecordHandler;\n        \n        constructor(){\n            this.rowHandler   = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n            this.columnHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n            this.floatingRecordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER);\n        }\n\n        validateRangeDataChange(ranges: IRangeDataChangeMeta[], _hookMeta?: IHookMeta): boolean {\n          //skip item when startRow or endRow is null\n\n          for(let i = 0; i < ranges.length; i++) {\n            const range = ranges[i];\n            if(!range.startRow || !range.endRow) {\n              ranges.splice(i, 1);\n              i--;\n            }\n          }\n          return true;\n        }\n\n        validateCellDataChange(rowId : string, columnId : string, value : any, _hookMeta?: IHookMeta) : boolean {\n            const  columnNode      = this.columnHandler.getColumnNodeByID(columnId);\n            let  rowNode           = this.rowHandler.getRowNodeById(rowId);\n            const isFloatingRecord = this.floatingRecordHandler.isFloatingRecord(rowId);\n            if(isFloatingRecord) {\n                rowNode = this.floatingRecordHandler.getFloatingRowNode();\n            }\n            if(!rowNode || !columnNode) {\n                return false;\n            }\n            const  columnKey      = columnNode?.getColumnKey();\n            const  existingData   = rowNode.getDataByKey(columnKey);\n            return isDataChanged(existingData, value);\n        }\n\t}\n\n\treturn new CellAPIValidator();\n}\n","import { Bean, EventEmitter, Optional } from \"@dg/corecomponent\";\nimport { ClipBoardHandler } from \"../../../clipboard/clipboard-handler\";\nimport { IClipBoardCopyParams, IClipBoardCutParams, IClipBoardPasteParams } from \"../../../clipboard/clipboard-handler.types\";\nimport { IClipboardApiManager } from \"./Interface/IClipboardApiManager.types\";\n\n@Bean('clipBoardAPI')\nexport class ClipboardAPI extends EventEmitter implements IClipboardApiManager {\n    @Optional('clipBoardHandler') private clipBoardHandler : ClipBoardHandler;\n    copyToClipboard(params : IClipBoardCopyParams = {}) : void {\n        params.source  = params.source ?? 'api';\n        this.clipBoardHandler && this.clipBoardHandler.copyOrCutToClipboard(params, false);\n    }\n    cutToClipboard(params : IClipBoardCutParams = {}) : void {\n        params.source  = params.source ?? 'api';\n        this.clipBoardHandler && this.clipBoardHandler.copyOrCutToClipboard(params, true);\n    }\n    pasteFromClipboard(params : IClipBoardPasteParams = {}) : void {\n        params.source  = params.source ?? 'api';\n        this.clipBoardHandler && this.clipBoardHandler.pasteFromClipboard(params);\n    }\n    copySelectedRowsToClipboard(params : IClipBoardCopyParams = {}) : void {\n        params.source  = params.source ?? 'api';\n        this.clipBoardHandler && this.clipBoardHandler.exportRowSelectionToClipboard(params);\n    }\n    copySelectedRangesToClipboard(params : IClipBoardCopyParams = {}) : void {\n        params.source  = params.source ?? 'api';\n        this.clipBoardHandler && this.clipBoardHandler.exportRangeToClipboard(params);\n    }\n}","import { AutoWired, EventEmitter } from \"@dg/corecomponent\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { MovePosition } from \"../../Main\";\nimport { IColumnAPIInteracter, IColumnDefinitonChangeWithIndex, IColumnInsertMetaWithIndex, IWidthOptionWithIndex } from \"./Interface/IColumnAPI\";\nimport { COLUMN_NODE_EVENTS, Events } from \"../../Core/Constants/Events\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { ColumnSizeHandler } from \"../../Core/Columns/ColumnSizeHandler\";\n\n\n// class ColumnAPIInteracter implements IColumnAPIInteracter {\n//     @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) rowRenderController : any;\n//     @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler : any;\n//     @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) fieldHandler : FieldHandler;\n//     @AutoWired(GRID_BEAN_NAME.NAVIGATIONHANDLER) navigation : NavigationHandler;\n\n//     applySort(sortKeys) : void{\n//         this.recordHandler.applySort(sortKeys);\n//         this.rowRenderController.refreshAfterModelUpdate();\n//     }\n\n//     resetSort() : void {\n//         this.recordHandler.resetSort();\n//         this.rowRenderController.refreshAfterModelUpdate();\n//     }\n    \n//     resetFilter() {\n//         this.recordHandler.resetFilter();\n//         this.rowRenderController.refreshAfterModelUpdate();\n//     }\n//     applyFilter(filterKeys: any) {\n//         this.recordHandler.applyFilter(filterKeys);\n//         this.rowRenderController.refreshAfterModelUpdate();\n//     }\n\n\n//     resetGroup() {\n//         this.recordHandler.resetGroup();\n//         this.rowRenderController.refreshAfterModelUpdate();\n//     }\n//     applyGroup(groupModel: any) {\n//         this.recordHandler.applyGroupBy(groupModel)\n//         this.rowRenderController.refreshAfterModelUpdate();\n//     }\n\n//     appendColumns(columnDefinitions ?: IColumnDefinition[]) : void {\n//         this.fieldHandler.appendColumns(columnDefinitions.length, columnDefinitions);\n//         const centerHandler = this.fieldHandler.getCenterHandler();\n//         const lastIndex = centerHandler.getLastColumn();\n\n//         this.navigation.updateColumnAxis(lastIndex, columnDefinitions.length + lastIndex);\n//         this.rowRenderController.refreshAfterModelUpdate();\n// \t\tthis.rowRenderController.refreshColumnAfterModelUpdate();\n//     }\n\n\n//     insertColumnsAfter(columnMetas : IColumnInsertMeta[]) : void {\n//         columnMetas.sort((a, b) => b.columnIndices - a.columnIndices);\n//         columnMetas.forEach(columnMeta => {\n//             const columnDefinitions  = columnMeta.columnDefinitions;\n//             columnDefinitions.forEach((columnDefinition) => {\n//                 this.fieldHandler.insertColumnAfter(columnMeta.columnIndices++, columnDefinition);\n//             })\n//             this.navigation.updateColumnAxis(columnMeta.columnIndices + 1, columnDefinitions.length);\n//         });\n// \t\tthis.rowRenderController.refreshAfterModelUpdate();\n// \t\tthis.rowRenderController.refreshColumnAfterModelUpdate();\n//     }\n\n//     insertColumnsBefore(columnMetas :IColumnInsertMeta[]) : void {\n//         columnMetas.sort((a, b) => b.columnIndices - a.columnIndices);\n//         columnMetas.forEach(columnMeta => {\n//             const columnDefinitions  = columnMeta.columnDefinitions;\n//             columnDefinitions.forEach((columnDefinition) => {\n//                 this.fieldHandler.insertColumnBefore(columnMeta.columnIndices--, columnDefinition);\n//                 (columnMeta.columnIndices++, columnDefinition);\n//             })\n//             this.navigation.updateColumnAxis(columnMeta.columnIndices + 1, columnDefinitions.length);\n//         });\n// \t\tthis.rowRenderController.refreshAfterModelUpdate();\n// \t\tthis.rowRenderController.refreshColumnAfterModelUpdate();\n//     }\n\n//     duplicateColumns(columnMetas : IColumnDupicateMeta[]) : void {\n//         columnMetas.sort((a, b) => b.columnIndices - a.columnIndices);\n//         for(let i = 0; i < columnMetas.length; i++) {\n//             const columnDefinition = this.fieldHandler.getColumnDefinition(columnMetas[i].columnIndices);\n//             columnDefinition.columnId && (columnDefinition.columnId = columnDefinition.columnId+\"copy\");\n//             this.fieldHandler.insertColumnAfter(columnMetas[i].columnIndices, columnDefinition);\n//             this.navigation.updateColumnAxis(columnMetas[i].columnIndices + 1, 1);\n//         }\n//         this.rowRenderController.refreshAfterModelUpdate();\n// \t\tthis.rowRenderController.refreshColumnAfterModelUpdate();\n//     }\n\n\n//     removeColumns(columnIndexes : number[]) : void {\n//         columnIndexes.sort((a, b) => b - a);\n//         columnIndexes.forEach((columnIndex) => {\n//             this.fieldHandler.deleteColumn(columnIndex);\n// \t\t    this.navigation.updateColumnAxis(columnIndex, -1);\n//         })\n// \t\tthis.rowRenderController.refreshAfterModelUpdate();\n// \t\tthis.rowRenderController.refreshColumnAfterModelUpdate();\n//     }\n\n//     setColumnsWidth(widthOptions : IWidthOption[], _columnOptionalConfig ?: IColumnOptionalConfig) : void {\n//         for(let i = 0; i < widthOptions.length; i++) {\n//             this.fieldHandler.setColumnWidth(widthOptions[i].columnIndex, widthOptions[i].columnWidth as number);    \n//         }\n//         this.rowRenderController.refreshColumnAfterModelUpdate();\n//     }\n//     // setColumnsWidthById(widthOptions : IWidthOption[], columnOptionalConfig ?: IColumnOptionalConfig) : void {\n//     //     for(let i = 0; i < widthOptions.length; i++) {\n//     //         this.fieldHandler.setColumnWidthByID(widthOptions[i].columnId, widthOptions[i].columnWidth as number);    \n//     //     }\n//     //     this.rowRenderController.refreshColumnAfterModelUpdate();\n//     // }\n\n//     getColumnCount(ignoreHidden ?: boolean) : number {\n//         if(ignoreHidden == true) {\n//             return this.fieldHandler.getNonHiddenFieldCount();\n//         }\n//         return this.fieldHandler.getTotalCount();\n//     }\n\n\n//     hideColumns(columnIndexes : number[], _columnOptionalConfig ?: IColumnOptionalConfig) : void {\n//         columnIndexes.sort((a, b) => b - a);\n//         for(let i = 0; i < columnIndexes.length; i++) {\n//                 this.fieldHandler.hideColumn(columnIndexes[i]);\n//         }\n//         this.rowRenderController.refreshColumnAfterModelUpdate();\n\n//     }\n   \n//     showColumns(columnIndexes : number[], _columnOptionalConfig ?: IColumnOptionalConfig) : void {\n//         columnIndexes.sort((a, b) => b - a);\n//         for(let i = 0; i < columnIndexes.length; i++) {\n//                 this.fieldHandler.unHideColumn(columnIndexes[i]); \n//         }\n//         this.rowRenderController.refreshColumnAfterModelUpdate();\n//     }\n\n//     updateColumnsDefiniton(udateColumnDefinitonObject : IUpdateColumnDefinitonObject[]): void {\n//         for(let i = 0; i < udateColumnDefinitonObject.length; i++) {\n//             this.fieldHandler.updateColumnsDefiniton(udateColumnDefinitonObject[i].columnIndices, udateColumnDefinitonObject[i].columnDefinition);\n//         }\n    \n//         this.rowRenderController.refreshColumnAfterModelUpdate();\n       \n//     }\n\n//     clearColumns(_columnIndexes : number[], _columnOptionalConfig ?: IColumnOptionalConfig) : void {\n//         // this.fieldHandler.setData\n//     }\n\n// }\n\n// export {\n//     ColumnAPIInteracter\n// }\n\nclass ColumnAPIInteracter extends EventEmitter implements IColumnAPIInteracter {\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired('ColumnSizeHandler') columnSizeHandler: ColumnSizeHandler;\n    \n    getColumnCount(_ignoreHidden  ?: boolean) : number {\n        return this.fieldHandler.getTotalCount();\n    }\n    insertColumns(columnMetas?: IColumnInsertMetaWithIndex[], insertPosition?: MovePosition): void {\n        columnMetas.map((columnMeta)=>{\n            const columnDefinition = columnMeta.columnDefinition;\n            if(insertPosition == 'after') {\n                this.fieldHandler.insertColumnAfter(columnMeta.columnIndex,columnDefinition)\n            }else{\n                this.fieldHandler.insertColumnBefore(columnMeta.columnIndex,columnDefinition)\n            }\n        })\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_INSERT,\n            refresh : true\n        })\n    }\n    removeColumns(columnIndexes: number[]): void {\n        columnIndexes.sort((a, b) => b - a);\n        columnIndexes.forEach((index)=>{\n            index != null && this.fieldHandler.deleteColumn(index);\n        })\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_DELETE,\n            refresh: true\n        });\n    }\n    setColumnsWidth(widthOptions: IWidthOptionWithIndex[]): void {\n        widthOptions.map((widthOption)=>{\n            this.fieldHandler.setColumnWidth(widthOption.columnIndex, Number(widthOption.columnWidth));\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_REFRESH,\n        });\n\n        this.dispatchEvent({\n            type : Events.EVENT_DISPLAYED_COLUMNS_RESIZE_CHANGED\n        })\n    }\n    hideColumns(columnIndexes: number[]): void {\n        columnIndexes.forEach((index)=>{\n            this.fieldHandler.hideColumn(index);\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_HIDE,\n            refresh: true\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_DISPLAYED_COLUMNS_RESIZE_CHANGED,\n        });\n\n        this.columnSizeHandler.refreshFlexedColumns({columns : this.fieldHandler.getDisplayedCenterColumns()});\n    }\n    showColumns(columnIndexes: number[]): void {\n        columnIndexes.forEach((index)=>{\n            this.fieldHandler.unHideColumn(index);\n        })\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_SHOW,\n            refresh: true\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_DISPLAYED_COLUMNS_RESIZE_CHANGED,\n        });\n        this.columnSizeHandler.refreshFlexedColumns({columns : this.fieldHandler.getDisplayedCenterColumns()});\n    }\n    clearColumns(columnIndexes: number[]): void {\n        // columnIndexes.forEach((index)=>{\n        //     this.fieldHandler.deleteColumn(index);\n        // })\n        // this.dispatchEvent({\n        //     type : Events.EVENT_DISPLAYED_COLUMNS_CHANGED,\n        // });\n        // this.dispatchEvent({\n        //     type : Events.EVENT_COLUMN_REFRESH,\n        // });\n        // this.recordHandler\n        // columnIndexes.forEach(({startIndex : startMeta, endIndex : endMeta, columnIds, data}) => {\n            const startMeta = this.recordHandler.getFirstIndexMeta()\n            const endMeta = this.recordHandler.getLastIndexMeta()\n\n            const sequenceRowNodes = this.recordHandler.getSequenceRowNodes(startMeta, endMeta);\n            sequenceRowNodes.forEach((rowNode) => {\n                rowNode && columnIndexes.forEach((columnIndex) => {\n                    const columnId = this.fieldHandler.getAbsoluteID(columnIndex)\n                    const columnNode = this.fieldHandler.getColumnNodeByID(columnId);\n                    if(columnNode) {\n                        const key = columnNode.getColumnKey();\n                        rowNode.updateDataByKey(key, \"\");\n                    }\n                })\n            })\n        // })\n\n        this.dispatchEvent({\n            type: Events.EVENT_ROW_DATA_LOADED\n        })\n        this.dispatchEvent({\n            type : Events.EVENT_DISPLAYED_COLUMNS_CHANGED,\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_REFRESH,\n        });\n    }\n    updateColumnsDefiniton(columnIndexes: IColumnDefinitonChangeWithIndex[]): void {\n        columnIndexes.forEach((index)=>{\n            this.fieldHandler.updateColumnsDefiniton(index.columnIndex, index.columnDefinition);\n        })\n        this.dispatchEvent({\n            type : COLUMN_NODE_EVENTS.EVENT_COLUMN_DEFINITION_CHANGED\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_REFRESH,\n        });\n    }\n}\n\n\nexport{\n    ColumnAPIInteracter\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IColumnAPIManager, IColumnDupicateMetaWithId, IColumnDupicateMetaWithIndex, IColumnHookAction, IColumnInsertMetaWithId, IColumnInsertMetaWithIndex, IColumnWidth, IDuplicateOption, IWidthOptionWithIndex, IWidthOptionWithId, IColumnDefinitonChangeWithIndex, IColumnDefinitonChangeWithId, IColumnAPIValidator } from \"./Interface/IColumnAPI\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { GridOptioHandler } from \"../../Core/GridOptionHandler\";\nimport { IControllerHandler } from \"../../Core/Interface/IControllerHandler\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { requestAutoColumnHeaderHeightRefresh } from \"../../GridComponent/Header/column-header-auto-height\";\nimport { ColumnAPIInteracter } from \"./ColumnAPIInteracter\";\nimport { createColumnHookAction } from \"./ColumnHookAction\";\n\nimport { createColumnAPIValidationWrapper } from \"./ColumnAPIValidator\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IColumnOptionalConfig } from \"../CommonAPIInterface\";\nimport { IColumnDefinition, IColumnNode, MovePosition } from \"../../Main\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { IColumnAutofitHandler } from \"../../../Autofit/ColumnAutofit/column-autofitHandler.types\";\nimport { ColumnVisibleHandlerType } from \"../../Core/Columns/column-visible-handler.types\";\n\n\nconst columnHookMeta : IHookMeta = {\n    eventOrigin         : 'api',\n    suppressEventTrigger: false\n}\n\n\n@Bean(GRID_BEAN_NAME.COLUMN_API)\nclass ColumnAPIManager extends EventEmitter implements IColumnAPIManager {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName                  : getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler                  : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.COLUMN_AUTOFIT_HANDLER) private columnAutofitHandler : IColumnAutofitHandler;\n    @AutoWired(GRID_BEAN_NAME.COLUMN_VISIBLE_HANDLER) private columnVisibleHandler : ColumnVisibleHandlerType;\n\n    // private validator : IColumnAPIValidator;\n    private interacter: ColumnAPIInteracter;\n    private hookAction : IColumnHookAction;\n    private validator : IColumnAPIValidator;\n    @PostConstruct()\n    init() {\n       this.interacter = this.createManagedBean(new ColumnAPIInteracter());\n       this.hookAction = createColumnHookAction(this.getBeanInstanceByBeanName, this.interacter);\n       this.validator  = createColumnAPIValidationWrapper(this.getBeanInstanceByBeanName, this.hookAction);\n    }\n    appendColumn(columnDefinition ?: IColumnDefinition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        if(!columnDefinition){\n            console.error(\"Invalid ColumnMeta\")\n            return\n           }\n        this.appendColumns([columnDefinition],columnOptionalConfig,hookMeta)\n    }\n    appendColumns(columnDefinition ?: IColumnDefinition[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        if(!columnDefinition){\n            console.error(\"Invalid ColumnMeta\")\n            return\n           }\n        const position = 'after'\n        const columnIndex = this.interacter.getColumnCount(false);\n        let columnInsertMeta = [];\n        let columnIndexCount = 0 ;\n\n        for (let i = columnIndex; i < columnDefinition.length + columnIndex; i++){\n            const meta = {\n                columnIndex : i-1,\n                columnDefinition : columnDefinition[columnIndexCount]\n            }\n            columnIndexCount ++\n\n            columnInsertMeta.push(meta)\n      \n        }\n        this.insertColumns(columnInsertMeta,position,columnOptionalConfig, hookMeta);\n    }\n    insertColumn(columnIndex : number, columnDefinition ?: IColumnDefinition, position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        this.insertColumns([{columnIndex, columnDefinition}],position,columnOptionalConfig,hookMeta)\n    }\n\n    insertColumns(columnMeta: IColumnInsertMetaWithIndex[], position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta): void {\n       if(!columnMeta){\n        console.error(\"Invalid ColumnMeta\")\n        return\n       }\n        const isValid = this.validator.validateInsertColumns(columnMeta, position, columnOptionalConfig)  \n        if(!isValid) {\n            console.error(\"Invalid ColumnMeta\")\n            return\n            \n        }\n        this.hookAction.insertColumns(columnMeta, position, columnOptionalConfig, hookMeta);\n    }\n    \n    insertColumnById(columnId : string, columnDefinition ?: IColumnDefinition, position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndex = this.fieldHandler.getIndexById(columnId)\n        this.insertColumns([{columnIndex, columnDefinition}],position,columnOptionalConfig,hookMeta)\n    } \n\n    insertColumnsById(columnMeta : IColumnInsertMetaWithId[],  position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta): void {\n        let columnMetas = columnMeta.map(({columnId, columnDefinition}) => {\n            return {\n                columnIndex : this.fieldHandler.getIndexById(columnId),\n                columnDefinition,\n                columnOptionalConfig\n            } \n        }); \n        this.insertColumns(columnMetas,position,columnOptionalConfig,hookMeta);\n    }\n\n\n    duplicateColumn(columnIndex : number, duplicateOptions ?: IDuplicateOption, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n       if(columnIndex === undefined || columnIndex === null){\n        console.error(\"Invalid Error\")\n        return\n       }\n        this.duplicateColumns([{columnIndex :columnIndex, duplicateOption :duplicateOptions}],columnOptionalConfig,hookMeta)\n    }\n    duplicateColumns(columnMeta : IColumnDupicateMetaWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        if(!columnMeta){\n            console.error(\"Invalid ColumnMeta\")\n            return\n        }\n        const isValid = this.validator.validateDuplicateColumns(columnMeta,columnOptionalConfig,hookMeta)\n        if(!isValid){\n            console.error(\"Invalid Column ID\")\n            return\n        }\n        let columnMetas = []\n        const position = 'before'\n        for (let i = 0; i < columnMeta.length; i++) {\n            const columnIndex = columnMeta[i].columnIndex;\n            const columnDefinition = this.fieldHandler.getColumnDefinition(columnIndex);\n            const meta = {\n                columnIndex,\n                columnDefinition :columnDefinition\n            }\n            columnMetas.push(meta)\n            \n        }\n        this.insertColumns(columnMetas,position,columnOptionalConfig,hookMeta)\n    }\n    \n    duplicateColumnById(columnId : string, duplicateOptions ?: IDuplicateOption,columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta ) : void {\n        \n        if(columnId === undefined || columnId === null){\n            console.error(\"Invalid Error\")\n            return\n           }\n        const columnIndex = this.fieldHandler.getIndexById(columnId);\n        this.duplicateColumns([{columnIndex :columnIndex ,duplicateOption :duplicateOptions}],columnOptionalConfig,hookMeta)\n\n    }\n\n    duplicateColumnsById(columnMeta : IColumnDupicateMetaWithId[],columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnMetas = [];\n\n        for(let i = 0; i <= columnMeta.length; i++) {\n            const columnId = columnMeta[i].columnId;\n            const columnIndex = this.fieldHandler.getIndexById(columnId)\n            const meta = {\n                columnIndex,\n                duplicateOption : columnMeta[i].duplicateOption\n\n            }\n            columnMetas.push(meta)\n\n        }\n        this.duplicateColumns(columnMetas,columnOptionalConfig,hookMeta)\n        \n    }\n    removeColumn(columnIndex : number, endColumnIndex : number = columnIndex, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnMetas = [];\n        for(let i = columnIndex; i <= endColumnIndex; i++) {\n            columnMetas.push(i)\n        }\n        this.removeColumns(columnMetas,columnOptionalConfig,hookMeta);\n    }\n    removeColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndex = this.fieldHandler.getIndexById(columnId)\n        this.hookAction.removeColumns([columnIndex], columnOptionalConfig, hookMeta);\n    }\n\n    removeColumns(columnIndexes : number[],columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const isValid =  this.validator.validateRemoveColumns(columnIndexes,columnOptionalConfig,hookMeta);\n        isValid ? this.hookAction.removeColumns(columnIndexes, columnOptionalConfig, hookMeta) :  null;\n    }\n    removeColumnsById(columnIds : string[] ,columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnMetas = [];\n\n        for(let i = 0; i <= columnIds.length - 1; i++) {\n            const columnId = columnIds[i];\n            const columnIndex = this.fieldHandler.getIndexById(columnId)\n            columnMetas.push(columnIndex)\n        }\n        this.hookAction.removeColumns(columnMetas, columnOptionalConfig, hookMeta);\n    }\n    setColumnWidth(columnIndex : number, width : IColumnWidth,columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        if(width == 'auto') {\n            this.runSingleColumnWidthAutofit(columnIndex, columnOptionalConfig,hookMeta);\n        }\n        else {\n            const widthOptions = [{\n                columnIndex ,\n                columnWidth :width\n            }]\n            this.setColumnsWidth(widthOptions,columnOptionalConfig,hookMeta);\n        }\n    }\n    setColumnWidthById(columnId : string, width : IColumnWidth, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndex = this.fieldHandler.getIndexById(columnId);\n        if(width == 'auto') {\n            this.runColumnWidthAutofit([columnIndex], columnOptionalConfig,hookMeta);\n        }\n        else {\n            const widthOptions = [{\n                columnIndex ,\n                columnWidth :width\n            }]\n            this.setColumnsWidth(widthOptions,columnOptionalConfig,hookMeta)\n        }\n    }\n\n    setAllColumnWidthAs(columnWidth : IColumnWidth, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        if(columnWidth == 'auto') {\n            this.runAutofitAllColumnIndexes();\n        } \n        else {\n            const columnCount = this.interacter.getColumnCount(false);\n            const widthOptions = [];\n            for(let i = 0; i < columnCount; i++) {\n                const meta = {\n                    columnIndex : i,\n                    columnWidth : columnWidth\n                };\n                widthOptions.push(meta)\n            }\n            this.setColumnsWidth(widthOptions,columnOptionalConfig,hookMeta);\n        }\n    }\n\n    setColumnsWidth(widthOptions : IWidthOptionWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const autofits = [];\n        const manualWidths = [];\n        const width_options_copy = [...widthOptions];\n        widthOptions.forEach((widthOption : IWidthOptionWithIndex) => {\n            const width = widthOption.columnWidth;\n            if(width == 'auto') {\n                autofits.push(widthOption.columnIndex);\n            }else {\n                manualWidths.push(widthOption);\n            }\n        });\n\n        const onSuccess = (autoFitMapping : Record<number,number>) => {\n            width_options_copy.forEach((opt : IWidthOptionWithIndex) => {\n                const width = opt.columnWidth;\n                if(width == 'auto') {\n                    opt.columnWidth = autoFitMapping[opt.columnIndex];\n                }\n            })\n           \n            this.setColumnsWidth(width_options_copy, columnOptionalConfig, hookMeta);\n        }\n\n        (autofits.length != 0) && this.columnAutofitHandler.autofitColumns(autofits, onSuccess);\n        if(autofits.length == 0) {\n            const isValid = this.validator.validateSetColumnsWidth(widthOptions, columnOptionalConfig, hookMeta);\n            if(isValid){\n                this.hookAction.setColumnsWidth(widthOptions,columnOptionalConfig,hookMeta);\n            }\n        }\n    }\n    setColumnsWidthById(widthOptions : IWidthOptionWithId[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        let widthOptionsWithIndex = [];\n        for (let i = 0; i < widthOptions.length; i++) {\n            const columnIndex = this.fieldHandler.getIndexById(widthOptions[i].columnId)\n            const meta = {\n                columnIndex : columnIndex,\n                columnWidth : widthOptions[i].columnWidth         \n              };\n              widthOptionsWithIndex.push(meta)\n            \n        }\n        this.setColumnsWidth(widthOptionsWithIndex,columnOptionalConfig,hookMeta)\n    }\n\n    autoFitColumn(columnIndex : number, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        this.runSingleColumnWidthAutofit(columnIndex, columnOptionalConfig, hookMeta);\n    }\n\n    autoFitColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndex = this.fieldHandler.getIndexById(columnId);\n        this.runColumnWidthAutofit([columnIndex], columnOptionalConfig, hookMeta);\n    }\n\n    autoFitColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        this.runColumnWidthAutofit(columnIndexes, columnOptionalConfig, hookMeta);\n    }\n\n    autoFitColumnsById(columnIds : string[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndexes = columnIds.map((id) => this.fieldHandler.getIndexById(id));\n        this.runColumnWidthAutofit(columnIndexes, columnOptionalConfig, hookMeta);\n    }\n\n    autoFitAllColumns(columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnCount = this.interacter.getColumnCount(false);\n        const columnIndexes : number[] = [];\n        for (let i = 0; i < columnCount; i++) {\n            columnIndexes.push(i);\n        }\n        this.runColumnWidthAutofit(columnIndexes, columnOptionalConfig, hookMeta);\n    }\n\n    autoFitColumnHeader() : void {\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n        requestAutoColumnHeaderHeightRefresh(controllerHandler, optionHandler, recordHandler, this, this.fieldHandler);\n    }\n\n\n    getColumnCount(ignoreHidden ?: boolean) : number {\n        return this.interacter.getColumnCount(ignoreHidden) \n    }\n    isColumnIdHidden(columnId : string) : boolean {\n        return this.fieldHandler.isColumnHidden(columnId);\n    }\n\n    isColumnHidden(columnIndex : number) : boolean {\n        const columnId = this.fieldHandler.getIdByIndex(columnIndex);\n        return this.isColumnIdHidden(columnId);\n    }\n\n    hideColumn(columnIndex : number, endColumnIndex : number = columnIndex, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndexes = [];\n        for(let i = columnIndex; i <= endColumnIndex; i++) {\n            columnIndexes.push(i)\n        }    \n        this.hideColumns(columnIndexes, columnOptionalConfig, hookMeta )\n    }\n    hideColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndex = this.fieldHandler.getIndexById(columnId)\n        this.hideColumns([columnIndex], columnOptionalConfig, hookMeta )\n    }\n    hideColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const isValid = this.validator.validateHideColumns(columnIndexes, columnOptionalConfig,hookMeta)\n        if(isValid){\n            this.hookAction.hideColumns(columnIndexes, columnOptionalConfig,hookMeta)\n        }\n    }\n    hideColumnsById(columnIds : string[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndexes = [];\n        for(let i = 0; i < columnIds.length; i++) {\n            const columnId = columnIds[i];\n            const columnIndex = this.fieldHandler.getIndexById(columnId)\n            columnIndexes.push(columnIndex)\n        }\n        this.hideColumns(columnIndexes, columnOptionalConfig,hookMeta)\n    }\n\n\n    showColumn(columnIndex : number, endColumnIndex : number = columnIndex, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndexes = [];\n        for(let i = columnIndex; i <= endColumnIndex; i++) {\n            columnIndexes.push(i)\n        }    \n        this.showColumns(columnIndexes, columnOptionalConfig, hookMeta)\n    }\n    showColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndex = this.fieldHandler.getIndexById(columnId)\n        this.showColumns([columnIndex], columnOptionalConfig, hookMeta)\n    }\n\n    showColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n           this.hookAction.showColumns(columnIndexes, columnOptionalConfig, hookMeta)\n    }\n    showColumnsById(columnIds : string[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndexes = [];\n\n        for(let i = 0; i < columnIds.length; i++) {\n            const columnId = columnIds[i];\n            const columnIndex = this.fieldHandler.getIndexById(columnId)\n            columnIndexes.push(columnIndex)\n        }\n        this.showColumns(columnIndexes, columnOptionalConfig,hookMeta)\n    }\n    getHiddenColumnNodes(): IColumnNode[] {\n        const hiddenColumns = this.fieldHandler.getHiddenColumnNodes();\n        return hiddenColumns;\n    }\n    getVisibleColumnNodes(): IColumnNode[] {\n        const nonHiddenColumns = this.fieldHandler.getNonHiddenColumnNodes();\n        return nonHiddenColumns;\n    }\n\n\n    clearColumn(columnIndex : number , endColumnIndex : number = columnIndex, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndexes = [];\n        for(let i = columnIndex; i <= endColumnIndex; i++) {\n            columnIndexes.push(i)\n        }    \n        this.clearColumns(columnIndexes, columnOptionalConfig, hookMeta)\n    }\n    clearColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndex = this.fieldHandler.getIndexById(columnId)\n        this.clearColumns([columnIndex], columnOptionalConfig, hookMeta)\n    }\n\n    clearColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n           this.hookAction.clearColumns(columnIndexes, columnOptionalConfig,hookMeta)\n    }\n    clearColumnsById(columnIds : string[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndexes = [];\n\n        for(let i = 0; i < columnIds.length; i++) {\n            const columnId = columnIds[i];\n            const columnIndex = this.fieldHandler.getIndexById(columnId)\n            columnIndexes.push(columnIndex)\n        }\n        this.clearColumns(columnIndexes, columnOptionalConfig,hookMeta)\n    }\n\n\n    updateColumnDefiniton(columnIndex : number, columnDefinition : IColumnDefinition,columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        this.hookAction.updateColumnsDefiniton([{ columnIndex ,columnDefinition}], columnOptionalConfig, hookMeta)\n    }\n    updateColumnDefinitonById(columnId : string, columnDefinition : IColumnDefinition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const columnIndex = this.fieldHandler.getIndexById(columnId)\n        this.hookAction.updateColumnsDefiniton([{ columnIndex : columnIndex,columnDefinition}], columnOptionalConfig, hookMeta)   \n    }\n\n    updateColumnsDefiniton(columnIndexes: IColumnDefinitonChangeWithIndex[], columnOptionalConfig: IColumnOptionalConfig = {}, hookMeta?: IHookMeta): void {\n        for(let i=0;i<columnIndexes.length;i++){\n            this.updateColumnDefiniton(columnIndexes[i].columnIndex, columnIndexes[i].columnDefinition, columnOptionalConfig, hookMeta)\n        }\n    }\n    updateColumnsDefinitonById(columnIds: IColumnDefinitonChangeWithId[], columnOptionalConfig : IColumnOptionalConfig = {}, hookMeta?: IHookMeta): void {\n        for(let i=0; i< columnIds.length;i++){\n            this.updateColumnDefinitonById(columnIds[i].columnId, columnIds[i].columnDefinition, columnOptionalConfig, hookMeta)\n        }\n    }\n\n    getIndexById(columnId : string) : number {\n        return this.fieldHandler.getIndexById(columnId)\n    }\n\n    getIdByIndex(columnIndex : number) : string {\n        return this.fieldHandler.getIdByIndex(columnIndex)\n    }\n\n    getAllDisplayedColumns() : string[] {\n        return this.columnVisibleHandler.getAllDisplayedColumns();\n    }\n\n    getLeftColumnCount() : number {\n        return this.columnVisibleHandler.getLeftColumns({} as any).length;\n    }\n\n    getRightColumnCount() : number {\n        return this.columnVisibleHandler.getRightColumns({} as any).length;\n    }\n\n    getCenterColumnCount() : number {\n        return this.columnVisibleHandler.getCenterColumns({} as any).length;\n    }\n\n    private runSingleColumnWidthAutofit(columnIndex : number, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        this.runColumnWidthAutofit([columnIndex], columnOptionalConfig, hookMeta)\n    }\n\n    private runAutofitAllColumnIndexes() : void {\n        const columnCount = this.interacter.getColumnCount(false);\n        const columnIndexes = [];\n        for(let i = 0; i < columnCount; i++) {\n            columnIndexes.push(i);\n        }\n        this.runColumnWidthAutofit(columnIndexes);\n    }\n\n    private runColumnWidthAutofit(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta : IHookMeta = columnHookMeta) : void {\n        const onSuccess = (autoFitMapping : Record<number, number>)=>{\n            const columnWidthsOptions = columnIndexes.map(columnIndex=>{\n                return {\n                    columnIndex : Number(columnIndex),\n                    columnWidth : autoFitMapping[columnIndex]\n                }\n            })\n            this.setColumnsWidth(columnWidthsOptions, columnOptionalConfig, hookMeta);\n        }\n\n        this.columnAutofitHandler.autofitColumns(columnIndexes, onSuccess);\n    }\n    \n}\n\nexport {\n    ColumnAPIManager\n}\n\n\n","import {  getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IColumnAPIValidator, IColumnDefinitonChangeWithIndex, IColumnDupicateMetaWithIndex, IColumnInsertMetaWithIndex, IWidthOptionWithIndex } from \"./Interface/IColumnAPI\";\nimport { IHookMeta, MovePosition } from \"../../Main\";\nimport { IColumnOptionalConfig } from \"../CommonAPIInterface\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\n\n\n\nfunction createColumnAPIValidationWrapper (getBeanInstanceByBeanName : getBeanInstanceByBeanName, _hookAction : any) : IColumnAPIValidator{\n    class ColumnAPIValidator implements IColumnAPIValidator {\n\n\n        validateRemoveColumns(_columnIndexes: number[], _columnOptionalConfig : IColumnOptionalConfig = {}, _hookMeta?: IHookMeta): boolean {\n            return true\n        }\n        validateInsertColumns(columnMeta: IColumnInsertMetaWithIndex[], _insertPosition?: MovePosition, _columnOptionalConfig : IColumnOptionalConfig = {}, _hookMeta?: IHookMeta): boolean {\n            const fieldHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n            const totalCount = fieldHandler.getTotalCount();\n\n            for (let i = 0; i < columnMeta.length; i++) {\n                if(columnMeta[i].columnIndex < 0){\n                    columnMeta[i].columnIndex = 0;\n                }\n                else if(columnMeta[i].columnIndex + 1 >totalCount){\n                    return false\n                }\n            }\n            \n            return true\n        }\n        validateDuplicateColumns(columnMeta: IColumnDupicateMetaWithIndex[], _columnOptionalConfig : IColumnOptionalConfig = {}, _hookMeta?: IHookMeta): boolean {\n            const fieldHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n            const totalCount = fieldHandler.getTotalCount();\n\n            for (let i = 0; i < columnMeta.length; i++) {\n                if(columnMeta[i].columnIndex >totalCount){\n                    return false\n                }\n            }\n            \n            return true\n        }\n        validateHideColumns(_columnIndexes: number[], _columnOptionalConfig : IColumnOptionalConfig = {}, _hookMeta?: IHookMeta): boolean {\n            return true\n        }\n        validateShowColumns(_columnIndexes: number[], _columnOptionalConfig : IColumnOptionalConfig = {}, _hookMeta?: IHookMeta): boolean {\n            return true\n        }\n        validateSetColumnsWidth(widthOptions: IWidthOptionWithIndex[], _columnOptionalConfig : IColumnOptionalConfig = {}, hookMeta?: IHookMeta): boolean {\n            const fieldHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n            for (let i = 0; i < widthOptions.length; i++) {\n                const {columnIndex, columnWidth} = widthOptions[i];\n                const currentWidth = fieldHandler.getWidthByIndex(columnIndex);\n                if (\n                    columnWidth !== currentWidth\n                    || (hookMeta.stopBeforeAction && !hookMeta.isOnHookAction)\n                    || (hookMeta.stopAfterAction && hookMeta.useApiCaller === false)\n                ) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        updateColumnsDefiniton(_columnIndexes: IColumnDefinitonChangeWithIndex[], _columnOptionalConfig : IColumnOptionalConfig = {}, _hookMeta?: IHookMeta): boolean {\n            return true\n        }\n  \n    }\n\n    return new ColumnAPIValidator();\n}\n\nexport {\n    createColumnAPIValidationWrapper\n}","\n\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { MovePosition, IHookMeta, IInsertColumnsHookParamsWithoutAPI, IRemoveColumnsHookParamsWithoutAPI, IColumnsWidthUpdateHookParamsWithoutAPI, IUpdateColumnsDefinitonHookParamsWithoutAPI, IHideShowColumnsHookParamsWithoutAPI, IClearColumnsHookParamsWithoutAPI, IDataUpdateHookParamsWithoutAPI, data_update_event_origin } from \"../../Main\";\nimport { IColumnOptionalConfig } from \"../CommonAPIInterface\";\nimport { IColumnAPIInteracter, IColumnDefinitonChangeWithIndex, IColumnHookAction, IColumnInsertMetaWithIndex, IWidthOptionWithIndex } from \"./Interface/IColumnAPI\";\nimport { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n\ninterface IColumnAPIHookParamsProvider{\n    createInsertColumnsParams(columnMeta ?: IColumnInsertMetaWithIndex[],insertPosition ?: MovePosition,  hook?: IHookMeta ) : IInsertColumnsHookParamsWithoutAPI;\n    createRemoveColumnsParams(columnIndexes : number[],  hook?: IHookMeta )                                                  : IRemoveColumnsHookParamsWithoutAPI;\n    createColumnsWidthUpdateParams(widthOptions : IWidthOptionWithIndex[],  hook?: IHookMeta )                               : IColumnsWidthUpdateHookParamsWithoutAPI;\n    createUpdateColumnsDefinitonParams(columnIndexes : IColumnDefinitonChangeWithIndex[],  hook?: IHookMeta )                : IUpdateColumnsDefinitonHookParamsWithoutAPI;\n    createShowColumnsParams (columnIndexes : number[],  hook?: IHookMeta )                                                   : IHideShowColumnsHookParamsWithoutAPI;\n    createHideColumnsParams (columnIndexes : number[],  hook?: IHookMeta )                                                   : IHideShowColumnsHookParamsWithoutAPI;\n    createClearColumnsParams(columnIndexes : number[],  hook?: IHookMeta )                                                   : IDataUpdateHookParamsWithoutAPI;\n}\nclass ColumnAPIHookParamsProvider implements IColumnAPIHookParamsProvider{\n     private fieldHandler: FieldHandler;\n     private recordHandler :  IRecordHandler;\n\n    constructor( getBeanInstanceByBeanName : getBeanInstanceByBeanName,){\n        this.fieldHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        this.recordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n    } \n    createInsertColumnsParams(columnMetas?: IColumnInsertMetaWithIndex[], _insertPosition?: MovePosition,hookMeta?: IHookMeta): IInsertColumnsHookParamsWithoutAPI {\n\n\n    \n        const {eventOrigin, event, userParams} = hookMeta;\n        const metas = columnMetas.map((columnMeta)=>{\n            const columnId = this.fieldHandler.getAbsoluteID(columnMeta.columnIndex);\n            const columnIndex = columnMeta.columnIndex\n            const columnDefinition = columnMeta.columnDefinition\n            const count =  columnMetas.length\n            return {columnId, columnDefinition : [columnDefinition], columnIndex,count};\n        })\n        return {\n            metas,\n            eventOrigin  : eventOrigin,\n            event      : event,\n            userParams : userParams\n        }\n    }\n    \n    createRemoveColumnsParams(columnIndexes: number[],hookMeta?: IHookMeta): IRemoveColumnsHookParamsWithoutAPI {\n\n        const {eventOrigin, event, userParams} = hookMeta;\n        const metas = columnIndexes.map((columnIndex :  number) => {\n            const columnId = this.fieldHandler.getAbsoluteID(columnIndex);\n            const columnDefinition = this.fieldHandler.getColumnDefinition(columnIndex)\n            return {columnId, columnDefinition,columnIndex };\n        })\n        return {\n                metas,\n                eventOrigin  : eventOrigin,\n                event      : event,\n                userParams :userParams \n            }\n    }\n    createColumnsWidthUpdateParams(widthOptions: IWidthOptionWithIndex[], hookMeta?: IHookMeta): IColumnsWidthUpdateHookParamsWithoutAPI {\n        const { eventOrigin, event, userParams } = hookMeta;\n        const metas = widthOptions.map(({ columnIndex, columnWidth }) => {\n            const columnId = this.fieldHandler.getAbsoluteID(columnIndex);\n            return {\n                columnId,\n                columnIndex,\n                columnWidth\n            };\n        }) as any;\n    \n        return {\n            metas,\n            eventOrigin,\n            event,\n            userParams\n        };\n    }\n    \n    createUpdateColumnsDefinitonParams(columnIndexes: IColumnDefinitonChangeWithIndex[],hookMeta?: IHookMeta): IUpdateColumnsDefinitonHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams} = hookMeta;\n        const metas =  columnIndexes.map(({columnIndex, columnDefinition}) =>{\n            const columnId = this.fieldHandler.getAbsoluteID(columnIndex);\n            return {columnId, columnDefinition, columnIndex};\n        })\n        return {\n            metas,\n            eventOrigin  : eventOrigin,\n            event      : event,\n            userParams : userParams\n        }\n    }\n    createShowColumnsParams(columnIndexes: number[], hookMeta?: IHookMeta): IHideShowColumnsHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams} = hookMeta;\n        const metas = columnIndexes.map((columnIndex)=>{\n            const columnId = this.fieldHandler.getAbsoluteID(columnIndex);\n            const columnDefinition = this.fieldHandler.getColumnDefinition(columnIndex)\n            return {columnId, columnDefinition, columnIndex };\n        })\n        return {\n            metas,\n            eventOrigin  : eventOrigin,\n            event      : event,\n            userParams : userParams\n           }\n    }\n    createHideColumnsParams(columnIndexes: number[],hookMeta?: IHookMeta): IHideShowColumnsHookParamsWithoutAPI {\n    const {eventOrigin, event, userParams} = hookMeta;\n    const metas = columnIndexes.map((columnIndex)=>{\n        const columnId = this.fieldHandler.getAbsoluteID(columnIndex);\n        const columnDefinition = this.fieldHandler.getColumnDefinition(columnIndex)\n        return {columnId, columnDefinition, columnIndex };\n    })\n       return {\n        metas,\n        eventOrigin  : eventOrigin,\n        event      : event,\n        userParams : userParams\n       }\n    }\n\n    createClearColumnsParams(columnIndexes: number[], hookMeta?: IHookMeta): IClearColumnsHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams, action} = hookMeta;\n\n        const columnIds     = [];\n        const columnKeys    = [];\n        columnIndexes.forEach((columnIndex : number) => {\n            const columnNode = this.fieldHandler.getColumnNode(columnIndex);\n            columnIds.push(columnNode.getID());\n            columnKeys.push(columnNode.getColumnKey());\n        })\n        const rowCount      = this.recordHandler.getCountIncludePinned();\n        const startRow    = this.recordHandler.getFirstIndexMeta();\n        const endRow      = this.recordHandler.getLastIndexMeta();\n        const rowNodes      = this.recordHandler.getSequenceRowNodes(startRow, endRow);\n        const cellType = data_update_event_origin.COLUMN;\n        const values = [{\n            startRow,\n            endRow,\n            rowCount,\n            columnIds,\n            columnKeys,\n            get data(){\n                if(!this.__dataMemo){\n                    this.__dataMemo = rowNodes.map((node)=>{\n                        const rowId = node?.getId() ?? '';\n                        const data = node?.getRowData() ?? {};\n                        return {[rowId] : data} \n                    })\n                }\n                return this.__dataMemo;\n            } \n        }]\n        return {    \n            values,\n            eventOrigin,\n            event,\n            userParams,\n            cellType,\n            action\n        } as IClearColumnsHookParamsWithoutAPI;\n    }\n}\n\n\nfunction  createColumnHookAction(getBeanInstanceByBeanName : getBeanInstanceByBeanName, apiInteracter : IColumnAPIInteracter) : IColumnHookAction {\n    const hook       = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    class ColumnHookAction implements IColumnHookAction {\n        private hookParamsProvider : IColumnAPIHookParamsProvider;\n        constructor(){\n            this.hookParamsProvider= new ColumnAPIHookParamsProvider(getBeanInstanceByBeanName)\n        } \n        insertColumns(columnMeta?: IColumnInsertMetaWithIndex[], insertPosition?: MovePosition, columnOptionalConfig: IColumnOptionalConfig={}, hookMeta?: IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = columnOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createInsertColumnsParams(columnMeta, insertPosition, hookMeta);\n            const api =()=>{\n                useApiCaller && apiInteracter.insertColumns(columnMeta, insertPosition);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeColumnInsert,HookEventsName.onAfterColumnInsert,api,metas) : null;\n        }\n        removeColumns(columnIndexes: number[], columnOptionalConfig : IColumnOptionalConfig = {}, hookMeta?: IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = columnOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createRemoveColumnsParams(columnIndexes,hookMeta);\n            const api =()=>{\n                useApiCaller && apiInteracter.removeColumns(columnIndexes);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeColumnRemove,HookEventsName.onAfterColumnRemove,api,metas) : null;\n        }\n        setColumnsWidth(widthOptions: IWidthOptionWithIndex[], columnOptionalConfig : IColumnOptionalConfig = {}, hookMeta?: IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true, isOnHookAction = false, stopBeforeAction = false, stopAfterAction = false} = hookMeta;\n            hookMeta.userParams = columnOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createColumnsWidthUpdateParams(widthOptions,hookMeta);\n            const api =()=>{\n                useApiCaller && apiInteracter.setColumnsWidth(widthOptions)\n            }\n            if(!suppressEventTrigger){\n                if(stopBeforeAction && stopAfterAction && !isOnHookAction){\n                    api();\n                    return;\n                }\n                else if(stopBeforeAction && stopAfterAction && isOnHookAction){\n                    hook.executeOnHook(HookEventsName.onColumnResize, api, metas);\n                }\n                else if(stopBeforeAction){\n                    hook.executeAfterHook(HookEventsName.onAfterColumnResize, metas);\n                }\n                else if(stopAfterAction){\n                    hook.executeBeforeHook(HookEventsName.onBeforeColumnResize, api, metas);\n                }\n                else{\n                    hook.executeHook(HookEventsName.onBeforeColumnResize,HookEventsName.onAfterColumnResize,api,metas)\n                }\n            }\n            \n        }\n        hideColumns(columnIndexes: number[], columnOptionalConfig : IColumnOptionalConfig = {}, hookMeta?: IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = columnOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createHideColumnsParams(columnIndexes,hookMeta);\n            const api =()=>{\n                useApiCaller && apiInteracter.hideColumns(columnIndexes)\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeColumnHide,HookEventsName.onAfterColumnHide,api,metas) : null; \n        }\n        showColumns(columnIndexes: number[], columnOptionalConfig : IColumnOptionalConfig = {}, hookMeta?: IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = columnOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createShowColumnsParams(columnIndexes,hookMeta);\n            const api =()=>{\n                useApiCaller && apiInteracter.showColumns(columnIndexes);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeColumnShow,HookEventsName.onAfterColumnShow,api,metas) : null;\n        }\n        clearColumns(columnIndexes: number[], columnOptionalConfig : IColumnOptionalConfig = {}, hookMeta?: IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = columnOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createClearColumnsParams(columnIndexes,hookMeta);\n            const api =()=>{\n                useApiCaller && apiInteracter.clearColumns(columnIndexes);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeDataUpdate,HookEventsName.onAfterDataUpdate,api,metas) : null;\n        }\n        updateColumnsDefiniton(columnIndexes: IColumnDefinitonChangeWithIndex[], columnOptionalConfig : IColumnOptionalConfig = {}, hookMeta?: IHookMeta) : void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = columnOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createUpdateColumnsDefinitonParams(columnIndexes,hookMeta);\n            const api =()=>{\n                useApiCaller && apiInteracter.updateColumnsDefiniton(columnIndexes);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeColumnDefinitionUpdate,HookEventsName.onAfterColumnDefinitionUpdate,api,metas) : null;\n        }\n    }\n\n    return new ColumnHookAction();\n}\n\nexport {createColumnHookAction}","import { IColumnDefinition } from \"../../../Core/Interface/IColumnDefinition\";\nimport { IHookMeta } from \"../../../Interface/Hooks\";\nimport { IColumnNode, MovePosition } from \"../../../Main\";\nimport { IColumnOptionalConfig } from \"../../CommonAPIInterface\";\n\nexport interface IColumnDupticateMetaByIndex {\n    columnIndex: number;\n    duplicateOption : IDuplicateOption\n} \n\nexport interface IColumnDuplicateMetaById {\n    columnId : string;\n    duplicateOption : IDuplicateOption\n}\n\n\ninterface IColumnAPIManager {\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Appends a column to the end of the grid.\",\n     *   \"params\": {\n     *     \"columnDefinition\": \"Column definition object\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Append a new text column\\ngrid.columnAPI.appendColumn({\\n  columnId: 'notes',\\n  headerName: 'Notes',\\n  width: 200,\\n  type: 'text',\\n  editable: true\\n});\\n\\n// Append a number column\\ngrid.columnAPI.appendColumn({\\n  columnId: 'price',\\n  headerName: 'Price',\\n  width: 100,\\n  type: 'number'\\n});\"\n     *     }\n     *   ]\n     * })\n     */\n\n    appendColumn(columnDefinition ?: IColumnDefinition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Appends multiple columns at once.\",\n     *   \"params\": {\n     *     \"columnDefinition\": \"Array of column definitions\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.columnAPI.appendColumns([\\n  { columnId: 'col1', headerName: 'Column 1', width: 120, type: 'text' },\\n  { columnId: 'col2', headerName: 'Column 2', width: 120, type: 'number' }\\n]);\"\n     *     }\n     *   ]\n     * })\n     */\n    appendColumns(columnDefinition ?: IColumnDefinition[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) :void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Inserts a column at a specific index position.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Target column index\",\n     *     \"columnDefinitions\": \"Column definition\",\n     *     \"position\": \"Insert before or after\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Insert a column before column 2\\ngrid.columnAPI.insertColumn(2, {\\n  columnId: 'inserted',\\n  headerName: 'New Column',\\n  width: 150,\\n  type: 'text'\\n}, 'before');\"\n     *     }\n     *   ]\n     * })\n     */\n\n    insertColumn(columnIndex : number, columnDefinitions ?: IColumnDefinition, position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta ): void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Inserts multiple columns at once.\",\n     *   \"params\": {\n     *     \"columnMeta\": \"Column meta\",\n     *     \"position\": \"Position to insert the columns\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Insert multiple columns\\ngrid.columnAPI.insertColumns([{ columnIndex: 2, columnDefinitions: [{ columnId: 'inserted', headerName: 'New Column', width: 150, type: 'text' }] }], 'before');\"\n     *     }\n     *   ]\n     * })\n     */\n    insertColumns(columnMeta: IColumnInsertMetaWithIndex[], position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta?: IHookMeta): void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Inserts a column by its ID.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID to insert\",\n     *     \"columnDefinitions\": \"Column definition\",\n     *     \"position\": \"Insert before or after\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Insert a column before column 2\\ngrid.columnAPI.insertColumnById('inserted', {\\n  columnId: 'inserted',\\n  headerName: 'New Column',\\n  width: 150,\\n  type: 'text'\\n}, 'before');\"\n     *     }\n     *   ]\n     * })\n     */\n    insertColumnById(columnId : string, columnDefinitions ?: IColumnDefinition, position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Inserts multiple columns by their IDs.\",\n     *   \"params\": {\n     *     \"columnMeta\": \"Column meta\",\n     *     \"position\": \"Position to insert the columns\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Insert multiple columns by their IDs\\ngrid.columnAPI.insertColumnsById([{ columnId: 'inserted', columnDefinitions: [{ columnId: 'inserted', headerName: 'New Column', width: 150, type: 'text' }] }], 'before');\"\n     *     }\n     *   ]\n     * })\n     */\n    insertColumnsById(columnMeta : IColumnInsertMetaWithId[],  position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta ) : void;\n\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Duplicates a column by index.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Column index to duplicate\",\n     *     \"duplicateOptions\": \"Duplicate options\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Duplicate column at index 3\\ngrid.columnAPI.duplicateColumn(3, { duplicateWithoutData: true });\"\n     *     }\n     *   ]\n     * })\n     */\n    duplicateColumn(columnIndex : number, duplicateOptions ?: IDuplicateOption, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Duplicates multiple columns by index.\",\n     *   \"params\": {\n     *     \"columnMeta\": \"Column meta\",\n     *     \"duplicateOptions\": \"Duplicate options\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Duplicate multiple columns at index 3\\ngrid.columnAPI.duplicateColumns([{ columnIndex: 3, duplicateOptions: { duplicateWithoutData: true } }]);\"\n     *     }\n     *   ]\n     * })\n     */\n    duplicateColumns(columnMeta : IColumnDupicateMetaWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void\n\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",   \n     *   \"description\": \"Duplicates a column by its ID.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID to duplicate\",\n     *     \"duplicateOptions\": \"Duplicate options\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Duplicate column by ID\\ngrid.columnAPI.duplicateColumnById('inserted', { duplicateWithoutData: true });\"\n     *     }\n     *   ]\n     * })\n     */\n    duplicateColumnById(columnId : string, duplicateOptions ?: IDuplicateOption,columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta ) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Duplicates multiple columns by their IDs.\",\n     *   \"params\": {\n     *     \"columnMeta\": \"Column meta\",\n     *     \"duplicateOptions\": \"Duplicate options\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Duplicate multiple columns by their IDs\\ngrid.columnAPI.duplicateColumnsById([{ columnId: 'inserted', duplicateOptions: { duplicateWithoutData: true } }]);\"\n     *     }\n     *   ]\n     * })\n     */\n    duplicateColumnsById(columnMeta : IColumnDupicateMetaWithId[],columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta ) : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\",\"gallery\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Removes a column (or range) by index.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Column index to remove\",\n     *     \"endColumnIndex\": \"End index for range removal\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Remove column at index 3\\ngrid.columnAPI.removeColumn(3);\\n\\n// Remove columns 2 through 5\\ngrid.columnAPI.removeColumn(2, 5);\"\n     *     }\n     *   ]\n     * })\n     */\n\n    removeColumn(columnIndex : number, endColumnIndex ?: number, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\",\"gallery\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Removes a column by its ID.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID to remove\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.columnAPI.removeColumnById('notes');\"\n     *     }\n     *   ]\n     * })\n     */\n    removeColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\",\"gallery\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Removes multiple columns by index.\",\n     *   \"params\": {\n     *     \"columnIndexes\": \"Column indexes to remove\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Remove columns at indexes 2 and 4\\ngrid.columnAPI.removeColumns([2, 4]);\"\n     *     }\n     *   ]\n     * })\n     */\n    removeColumns(columnIndexes : number[],columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Removes multiple columns by their IDs.\",\n     *   \"params\": {\n     *     \"columnIds\": \"Column IDs to remove\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Remove columns by IDs\\ngrid.columnAPI.removeColumnsById(['name', 'email']);\"\n     *     }\n     *   ]\n     * })\n     */\n    removeColumnsById(columnIds : string[] ,columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Sets the width of a column by index.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Column index\",\n     *     \"width\": \"Width in pixels or 'auto'\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set column 0 width to 200px\\ngrid.columnAPI.setColumnWidth(0, 200);\\n\\n// Auto-width\\ngrid.columnAPI.setColumnWidth(0, 'auto');\"\n     *     }\n     *   ]\n     * })\n     */\n    setColumnWidth(columnIndex : number, width : IColumnWidth,columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Sets the width of a column by its ID.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID\",\n     *     \"width\": \"Width in pixels or 'auto'\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.columnAPI.setColumnWidthById('name', 250);\"\n     *     }\n     *   ]\n     * })\n     */\n    setColumnWidthById(columnId : string, width : IColumnWidth, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Sets the width of multiple columns by index.\",\n     *   \"params\": {\n     *     \"widthOptions\": \"Width options\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set columns 0 and 1 to 200px\\ngrid.columnAPI.setColumnsWidth([{ columnIndex: 0, width: 200 }, { columnId: 'name', width: 200 }]);\"\n     *     }\n     *   ]\n     * })\n     */\n    setColumnsWidth(widthOptions : IWidthOptionWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    // setAllColumnWidthAs(columnWidth : IColumnWidth, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Sets the width of multiple columns by ID.\",\n     *   \"params\": {\n     *     \"widthOptions\": \"Width options\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set columns 'name' and 'email' to 200px\\ngrid.columnAPI.setColumnsWidthById([{ columnId: 'name', width: 200 }, { columnId: 'email', width: 200 }]);\"\n     *     }\n     *   ]\n     * })\n     */\n    setColumnsWidthById(widthOptions : IWidthOptionWithId[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    /** Column width autofit — same behavior as `setColumnWidth(..., 'auto')` / `setColumnsWidth` with `'auto'`. */\n    /* @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Auto-fits the width of a column based on its content. Only applies if the column's width is set to 'auto'.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Column index to auto-fit\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Auto-fit column at index 3\\ngrid.columnAPI.autoFitColumn(3);\"\n     *     }\n     *   ]\n     * })\n     */\n    autoFitColumn(columnIndex : number, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /** @feedMcp_api({\n     *  \"apiName\": \"columnAPI\",\n     * \"accessPath\": \"[instance].columnAPI\",\n     * \"interfaceName\": \"IColumnAPIManager\",\n     * \"viewType\": [\"grid\", \"list\"],\n     * \"category\": \"structure\",\n     * \"description\": \"Auto-fits the width of a column based on its content by ID. Only applies if the column's width is set to 'auto'.\",\n     * \"params\": {\n     *    \"columnId\": \"Column ID to auto-fit\"\n     *  },\n     *  \"examples\": [\n     *    {\n     *      \"title\": \"Basic\",\n     *      \"code\": \"// Auto-fit column with ID 'name'\\ngrid.columnAPI.autoFitColumnById('name');\"\n     *    }\n     *  ]\n     * })\n     */\n    autoFitColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n        /** @feedMcp_api({\n         *  \"apiName\": \"columnAPI\",\n         * \"accessPath\": \"[instance].columnAPI\",\n         * \"interfaceName\": \"IColumnAPIManager\",\n         * \"viewType\": [\"grid\", \"list\"],\n         * \"category\": \"structure\",\n         * \"description\": \"Auto-fits the width of multiple columns based on their content by index. Only applies if the columns' widths are set to 'auto'.\",\n         * \"params\": {\n         *   \"columnIndexes\": \"Column indexes to auto-fit\"\n         * },\n         * \"examples\": [\n         *  {\n         *   \"title\": \"Basic\",\n         *  \"code\": \"// Auto-fit columns at index 3 and 4\\ngrid.columnAPI.autoFitColumns([3, 4]);\"\n         * }\n         * ]\n         * })\n         */\n    autoFitColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /** @feedMcp_api({\n     * \"apiName\": \"columnAPI\",\n     * \"accessPath\": \"[instance].columnAPI\",\n     * \"interfaceName\": \"IColumnAPIManager\",\n     * \"viewType\": [\"grid\", \"list\"],\n     * \"category\": \"structure\",\n     * \"description\": \"Auto-fits the width of multiple columns based on their content by ID. Only applies if the columns' widths are set to 'auto'.\",\n     * \"params\": {\n     *  \"columnIds\": \"Column IDs to auto-fit\"\n     * },\n     * \"examples\": [\n     * {\n     * \"title\": \"Basic\",\n     * \"code\": \"// Auto-fit columns with IDs 'name' and 'email'\\ngrid.columnAPI.autoFitColumnsById(['name', 'email']);\"\n     * }\n     * ]\n     * })\n     */\n    autoFitColumnsById(columnIds : string[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n        /** @feedMcp_api({\n         * \"apiName\": \"columnAPI\",\n         * \"accessPath\": \"[instance].columnAPI\",\n         * \"interfaceName\": \"IColumnAPIManager\",\n         * \"viewType\": [\"grid\", \"list\"],\n         * \"category\": \"structure\",\n         * \"description\": \"Auto-fits the width of all columns based on their content. Only applies if the columns' widths are set to 'auto'.\",\n         * \"params\": {},\n         * \"examples\": [\n         * {\n         * \"title\": \"Basic\",\n         * \"code\": \"// Auto-fit all columns\\ngrid.columnAPI.autoFitAllColumns();\"\n         * }\n         * ]\n         * })\n         */\n    autoFitAllColumns(columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * Remeasure column header row height from DOM when `columnHeaderHeights === 'auto'`.\n     * No-op if headers are off or heights are not `'auto'` (numeric/array/function configs are not overridden).\n     */\n    autoFitColumnHeader() : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Returns the total number of columns.\",\n     *   \"params\": {\n     *     \"ignoreHidden\": \"If true, only counts visible columns\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const count = grid.columnAPI.getColumnCount();\\nconsole.log(`Grid has ${count} columns`);\"\n     *     }\n     *   ]\n     * })\n     */\n    getColumnCount(ignoreHidden ?: boolean) : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Hides a column by index.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Column index to hide\",\n     *     \"endColumnIndex\": \"End column index to hide\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Hide column at index 0\\ngrid.columnAPI.hideColumn(0);\"\n     *     }\n     *   ]\n     * })\n     */\n    hideColumn(columnIndex : number, endColumnIndex : number, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Hides a column by its ID.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID to hide\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.columnAPI.hideColumnById('internal_id');\"\n     *     }\n     *   ]\n     * })\n     */\n    hideColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Hides multiple columns by index.\",\n     *   \"params\": {\n     *     \"columnIndexes\": \"Column indexes to hide\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Hide columns at indexes 0 and 1\\ngrid.columnAPI.hideColumns([0, 1]);\"\n     *     }\n     *   ]\n     * })\n     */\n    hideColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Hides multiple columns by ID.\",\n     *   \"params\": {\n     *     \"columnIds\": \"Column IDs to hide\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Hide columns 'name' and 'email'\\ngrid.columnAPI.hideColumnsById(['name', 'email']);\"\n     *     }\n     *   ]\n     * })\n     */\n    hideColumnsById(columnIds : string[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Shows a column by index.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Column index to show\",\n     *     \"endColumnIndex\": \"End column index to show\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Show column at index 0\\ngrid.columnAPI.showColumn(0);\"\n     *     }\n     *   ]\n     * })\n     */\n    showColumn(columnIndex : number, endColumnIndex ?: number, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Shows a previously hidden column by its ID.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID to show\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.columnAPI.showColumnById('internal_id');\"\n     *     }\n     *   ]\n     * })\n     */\n    showColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Checks whether a column is currently hidden.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID to check\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"if (grid.columnAPI.isColumnIdHidden('notes')) {\\n  grid.columnAPI.showColumnById('notes');\\n}\"\n     *     }\n     *   ]\n     * })\n     */\n\n    isColumnIdHidden(columnId : string)  : boolean;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Checks whether a column is currently hidden by index.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Column index to check\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"if (grid.columnAPI.isColumnHidden(0)) {\\n  grid.columnAPI.showColumn(0);\\n}\"\n     *     }\n     *   ]\n     * })\n     */\n    isColumnHidden(columnIndex : number) : boolean;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Returns all hidden column nodes.\",\n     *   \"params\": {},\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const hidden = grid.columnAPI.getHiddenColumnNodes();\\nconsole.log(`${hidden.length} columns are hidden`);\"\n     *     }\n     *   ]\n     * })\n     */\n\n    getHiddenColumnNodes(): IColumnNode[];\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Returns all visible column nodes.\",\n     *   \"params\": {},\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const visible = grid.columnAPI.getVisibleColumnNodes();\\nconsole.log(`${visible.length} columns are visible`);\"\n     *     }\n     *   ]\n     * })\n     */\n    getVisibleColumnNodes(): IColumnNode[];\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Shows multiple columns by index.\",\n     *   \"params\": {\n     *     \"columnIndexes\": \"Column indexes to show\",\n     *     \"columnIds\": \"Column IDs to show\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Show columns at indexes 0 and 1\\ngrid.columnAPI.showColumns([0, 1]);\"\n     *     }\n     *   ]\n     * })\n     */\n    showColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Shows multiple columns by ID.\",\n     *   \"params\": {\n     *     \"columnIds\": \"Column IDs to show\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Show columns 'name' and 'email'\\ngrid.columnAPI.showColumnsById(['name', 'email']);\"\n     *     }\n     *   ]\n     * })\n     */\n    showColumnsById(columnIds : string[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Clears all cell data in a column by index.\",\n     *   \"params\": {\n     *     \"columnIndex\": \"Column index to clear\",\n     *     \"endColumnIndex\": \"End column index to clear\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Clear all values in the 'notes' column\\ngrid.columnAPI.clearColumn(0, 1);\"\n     *     }\n     *   ]\n     * })\n     */\n    clearColumn(columnIndex : number , endColumnIndex ?: number, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Clears all cell data in a column by ID.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID to clear\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Clear all values in the 'notes' column\\ngrid.columnAPI.clearColumnById('notes');\"\n     *     }\n     *   ]\n     * })\n     */\n\n    clearColumnById(columnId : string, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Clears all cell data in multiple columns by index.\",\n     *   \"params\": {\n     *     \"columnIndexes\": \"Column indexes to clear\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Clear all values in columns at indexes 0 and 1\\ngrid.columnAPI.clearColumns([0, 1]);\"\n     *     }\n     *   ]\n     * })\n     */\n    clearColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Clears all cell data in multiple columns by ID.\",\n     *   \"params\": {\n     *     \"columnIds\": \"Column IDs to clear\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Clear all values in columns 'name' and 'email'\\ngrid.columnAPI.clearColumnsById(['name', 'email']);\"\n     *     }\n     *   ]\n     * })\n     */\n    clearColumnsById(columnIds : string[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n    updateColumnDefiniton(columnIndex : number, columnDefinition : IColumnDefinition,columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Updates the definition (headerName, type, renderer, etc.) of a column by ID.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column ID\",\n     *     \"columnDefinition\": \"New column definition (merged)\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Change column header and make it editable\\ngrid.columnAPI.updateColumnDefinitonById('email', {\\n  headerName: 'Email Address',\\n  editable: true,\\n  width: 250\\n});\"\n     *     }\n     *   ]\n     * })\n     */\n\n    updateColumnDefinitonById(columnId : string, columnDefinition : IColumnDefinition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Updates the definition (headerName, type, renderer, etc.) of multiple columns by index.\",\n     *   \"params\": {\n     *     \"columnIndexes\": \"Column indexes to update\",\n     *     \"columnDefinitions\": \"New column definitions\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Change header name and make it editable for columns at indexes 0 and 1\\ngrid.columnAPI.updateColumnsDefiniton([{ columnIndex: 0, headerName: 'Name', editable: true }, { columnIndex: 1, headerName: 'Email', editable: true }]);\"\n     *     }\n     *   ]\n     * })\n     */\n    updateColumnsDefiniton(columnIndexes : IColumnDefinitonChangeWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta): void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Updates the definition (headerName, type, renderer, etc.) of multiple columns by ID.\",\n     *   \"params\": {\n     *     \"columnIds\": \"Column IDs to update\",\n     *     \"columnDefinitions\": \"New column definitions\",\n     *     \"columnOptionalConfig\": \"Column optional config\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Change header name and make it editable for columns 'name' and 'email'\\ngrid.columnAPI.updateColumnsDefinitonById(['name', 'email'], [{ headerName: 'Name', editable: true }, { headerName: 'Email', editable: true }]);\"\n     *     }\n     *   ]\n     * })\n     */\n    updateColumnsDefinitonById(columnIds : IColumnDefinitonChangeWithId[], columnOptionalConfig?: IColumnOptionalConfig, hookMeta ?: IHookMeta): void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Returns the number of columns on the left side of the grid.\",\n     *   \"params\": {},\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const leftCount = grid.columnAPI.getLeftColumnCount();\\nconsole.log(`Grid has ${leftCount} columns on the left`);\"\n     *     }\n     *   ]\n     * })\n     */\n    getLeftColumnCount() : number;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Returns the number of columns on the right side of the grid.\",\n     *   \"params\": {},\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const rightCount = grid.columnAPI.getRightColumnCount();\\nconsole.log(`Grid has ${rightCount} columns on the right`);\"\n     *     }\n     *   ]\n     * })\n     */\n    getRightColumnCount() : number;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Returns the number of columns in the center of the grid.\",\n     *   \"params\": {},\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const centerCount = grid.columnAPI.getCenterColumnCount();\\nconsole.log(`Grid has ${centerCount} columns in the center`);\"\n     *     }\n     *   ]\n     * })\n     */ \n    getCenterColumnCount() : number;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Returns all displayed columns.\",\n     *   \"params\": {},\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const displayedColumns = grid.columnAPI.getAllDisplayedColumns();\\nconsole.log(`Grid has ${displayedColumns.length} displayed columns`);\"\n     *     }\n     *   ]\n     * })\n     */\n    getAllDisplayedColumns() : string[];\n}\n \n\ninterface IColumnAPIInteracter {\n    insertColumns(columnMeta ?: IColumnInsertMetaWithIndex[],position ?: MovePosition) : void;\n\n    removeColumns(columnIndexes : number[]) : void;\n\n    setColumnsWidth(widthOptions : IWidthOptionWithIndex[]) : void;\n\n    hideColumns(columnIndexes : number[]) : void;\n\n    showColumns(columnIndexes : number[]) : void;\n\n    clearColumns(columnIndexes : number[]) : void;\n\n    updateColumnsDefiniton(columnIndexes : IColumnDefinitonChangeWithIndex[]): void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"columnAPI\",\n     *   \"accessPath\": \"[instance].columnAPI\",\n     *   \"interfaceName\": \"IColumnAPIManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"structure\",\n     *   \"description\": \"Returns the total number of columns.\",\n     *   \"params\": {\n     *     \"ignoreHidden\": \"If true, only counts visible columns\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const count = grid.columnAPI.getColumnCount();\\nconsole.log(`Grid has ${count} columns`);\"\n     *     }\n     *   ]\n     * })\n     */\n\n    getColumnCount(ignoreHidden  ?: boolean) : number;\n}\n\n\nexport interface IColumnAPIValidator{\n    validateRemoveColumns(columnIndexes : number[],columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n\n    validateInsertColumns(columnMeta: IColumnInsertMetaWithIndex[], position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n    \n    validateDuplicateColumns(columnMeta : IColumnDupicateMetaWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n    \n    validateHideColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n    \n    validateShowColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n    \n    validateSetColumnsWidth(widthOptions : IWidthOptionWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n\n    updateColumnsDefiniton(columnIndexes : IColumnDefinitonChangeWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta): boolean;\n\n}\ninterface IColumnHookAction {\n    insertColumns(columnMeta ?: IColumnInsertMetaWithIndex[],position ?: MovePosition, columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    removeColumns(columnIndexes : number[],columnOptionalConfig  ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    setColumnsWidth(widthOptions : IWidthOptionWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig,hookMeta ?: IHookMeta) : void;\n\n    hideColumns(columnIndexes : number[],columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    showColumns(columnIndexes : number[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    clearColumns(columnIndexes : number[],columnOptionalConfig ?: IColumnOptionalConfig,  hookMeta ?: IHookMeta) : void;\n\n    // updateColumnsDefiniton(columnMeta : IUpdateColumnDefinitonObject[], columnOptionalConfig ?: IColumnOptionalConfig,hookMeta ?: IHookMeta) : void;\n    updateColumnsDefiniton(columnIndexes : IColumnDefinitonChangeWithIndex[], columnOptionalConfig ?: IColumnOptionalConfig, hookMeta ?: IHookMeta): void;\n}\n\n\ninterface IColumnInsertMeta{\n    columnDefinition : IColumnDefinition;\n}\n\ninterface IColumnInsertMetaWithId extends IColumnInsertMeta{\n    columnId : string;\n}\n\ninterface IColumnInsertMetaWithIndex extends IColumnInsertMeta{\n    columnIndex : number;\n}\n\ninterface IColumnDupicateMeta {\n    duplicateOption : IDuplicateOption;\n}\n\ninterface IColumnDupicateMetaWithId extends IColumnDupicateMeta{\n    columnId      : string;\n}\n\ninterface IColumnDupicateMetaWithIndex extends IColumnDupicateMeta{\n    columnIndex      : number;\n}\n\n\n\n\n\n\n\ninterface IColumnMeta {\n    columnIndex      ?: number,\n    columnId         ?: string,\n    columnDefinitions?: IColumnDefinition[]\n}\n\ninterface IColumnWidthOption {\n    columnWidth : IColumnWidth;\n}\n\n\ninterface IWidthOptionWithId extends IColumnWidthOption{\n    columnId : string\n}\n\ninterface IWidthOptionWithIndex extends IColumnWidthOption{\n    columnIndex : number\n}\n\ninterface IWidthOptionByID {\n    columnIndex ?; number,\n    columnId   : string,\n    columnWidth: IColumnWidth\n}\n\ninterface IDuplicateOption {\n    duplicateWithoutData ?: boolean\n}\n\ninterface IColumnDefinitonChangeParam {\n    columnDefinition : IColumnDefinition\n}\n\nexport interface IColumnDefinitonChangeWithIndex extends IColumnDefinitonChangeParam{\n    columnIndex : number\n}\n\nexport interface IColumnDefinitonChangeWithId extends IColumnDefinitonChangeParam{\n    columnId : string\n}\n\ntype IColumnWidth = number | 'auto';\n\nexport {\n    IColumnAPIInteracter,\n    IColumnAPIManager,\n    IColumnHookAction,\n    IColumnMeta,\n    // IColumnAPIValidator,\n    IColumnWidth,\n    IDuplicateOption,\n    IWidthOptionWithIndex,\n    IWidthOptionWithId,\n    IWidthOptionByID,\n    IColumnInsertMetaWithId,\n    IColumnInsertMetaWithIndex,\n    IColumnDupicateMetaWithId,\n    IColumnDupicateMetaWithIndex,\n}\n","import { AutoWired, Bean, BEAN_NAME, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookMeta } from \"../../Main\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { IFilterModel } from \"../../Core/Interface/IFilterConfigurations\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { IFilterApiManager } from \"./Interface/IFilterApiManager.types\";\nimport { IFilterApiValidator } from \"./Interface/IFilterApiValidator.types\";\nimport { createFilterApiValidator } from \"./FilterApiValidator\";\nimport { IFilterHookHandler } from \"./Interface/IFilterHookHandler.types\";\nimport { createFilterHookAction } from \"./FilterHookHandler\";\n\nconst filterHookMeta : IHookMeta = {\n    eventOrigin : 'api'\n} \n\n@Bean(GRID_BEAN_NAME.FILTER_API)\nexport class FilterApiManager implements IFilterApiManager {\n    @AutoWired( BEAN_NAME.BEANS ) private getBeanInstanceByBeanName   : getBeanInstanceByBeanName;\n    \n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n\n    private validator   : IFilterApiValidator;\n    private hookHandler : IFilterHookHandler;\n \n    @PostConstruct()\n    init() {\n        this.validator   = createFilterApiValidator(this.getBeanInstanceByBeanName);\n        this.hookHandler = createFilterHookAction(this.getBeanInstanceByBeanName);\n    }\n    applyFilter(filterModel : IFilterModel, forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = filterHookMeta): void {\n        const isValid = this.validator.validateFilterModel(filterModel, forceOptionalConfig, hookMeta);\n        if(isValid){\n            this.hookHandler.applyFilter(filterModel, forceOptionalConfig, hookMeta);\n        }\n    }\n    clearFilter(forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = filterHookMeta): void {\n        const filterModel = this.getFilterModel();\n        this.hookHandler.removeFilter(filterModel, forceOptionalConfig, hookMeta);\n    }\n    getFilterModel(): IFilterModel {\n        const middleHandler = this.recordHandler.getMiddleHandler();\n        return middleHandler.getFilterModel();\n    }\n}\n \n","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IFilterModel } from \"../../Core/Interface/IFilterConfigurations\";\nimport { IHookMeta } from \"../../Main\";\nimport { IFilterApiValidator } from \"./Interface/IFilterApiValidator.types\";\n\nexport function createFilterApiValidator( _getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n    class FilterApiValidator implements IFilterApiValidator {\n        validateFilterModel(_filterModel : IFilterModel, _hookMeta : IHookMeta): boolean {\n            return true;\n        }\n    }\n    return new FilterApiValidator();\n\n}\n","import { EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport {IAddFilterHookParam, IFilterHookHandler, IFilterHookParamProvider, IRemoveFilterHookParam} from \"./Interface/IFilterHookHandler.types\";\nimport { IFilterModel } from \"../../Core/Interface/IFilterConfigurations\";\nimport { IHookMeta } from \"../../Main\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { Events } from \"../../Core/Constants/Events\";\n\nclass FilterAPIHookParamsProvider implements IFilterHookParamProvider {\n    constructor( _getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n    }\n    createApplyFilterParams(filterModel: IFilterModel, hookMeta: IHookMeta): IAddFilterHookParam {\n        const {eventOrigin, event, userParams} = hookMeta;\n        return { filterModel, eventOrigin, event, userParams }\n    }\n    createRemoveFilterParams(filterModel: IFilterModel, hookMeta: IHookMeta): IRemoveFilterHookParam {\n        const {eventOrigin, event, userParams} = hookMeta;\n        return { filterModel, eventOrigin, event, userParams }\n    }\n\n}\n\n/** @internal */\nexport function createFilterHookAction( getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n    const rowHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n    const hook       = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    class FilterHookAction extends EventEmitter implements IFilterHookHandler {\n        private hookParamsProvider : FilterAPIHookParamsProvider;\n        \n        constructor() {\n            super();\n            this.hookParamsProvider = new FilterAPIHookParamsProvider(getBeanInstanceByBeanName);\n        }\n        \n\n        removeFilter(filterModel: IFilterModel, forceOptionalConfig: IForceOption, hookMeta: IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createApplyFilterParams(filterModel, hookMeta);\n            const api = () => {\n                const middleHandler = rowHandler.getMiddleHandler();\n                if(useApiCaller){\n                    middleHandler.resetFilter();\n\n                    this.dispatchEvent({\n                        type        : Events.EVENT_DISPLAYED_ROWS_CHANGED,\n                        recycleRows : true\n                    })\n                    getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER).refreshAfterModelUpdate();\n                }\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeFilterApplied, HookEventsName.onAfterFilterApplied, api, metas) : api();\n        }\n\n        applyFilter(filterModel: IFilterModel, forceOptionalConfig: IForceOption, hookMeta: IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createRemoveFilterParams(filterModel, hookMeta);\n            const api = () => {\n                const middleHandler = rowHandler.getMiddleHandler();\n                if(useApiCaller){\n                    middleHandler.resetFilter();\n                    middleHandler.applyFilter(filterModel);\n                    this.dispatchEvent({\n                        type        : Events.EVENT_DISPLAYED_ROWS_CHANGED,\n                        recycleRows : true\n                    })\n                    getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER).refreshAfterModelUpdate();\n                }\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeFilterRemove, HookEventsName.onAfterFilterRemove, api, metas) : api();\n        }\n         \n    }\n\n    return new FilterHookAction();\n}","import { AutoWired } from \"@dg/corecomponent\";\nimport { IFloatingRowAPIInteracter } from \"./Interface/IFloatingRowAPIInteracter\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IFloatingRecordHandler } from \"../../FloatingRecords/Interface/IFloatingRecordHandler\";\nimport { IForceOption } from \"../CommonAPIInterface\";\n\n\nexport class FloatingRowAPIInteracter implements IFloatingRowAPIInteracter {\n\n    @AutoWired(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) floatingRecordHandler : IFloatingRecordHandler;\n    floatRow(fromRowId: string, _optionalConfig?: IForceOption): void {\n        this.floatingRecordHandler.floatRow(fromRowId);\n    }\n\n    commitAndUnFloatRow(toRowId?: string, _optionalConfig?: IForceOption): void {\n       this.floatingRecordHandler.commitAndUnFloatRow(toRowId);\n    }\n\n    moveRowTemporarily(toRowId: string, _optionalConfig?: IForceOption): void {\n        this.floatingRecordHandler.moveRowTemporarily(toRowId);\n    }\n\n    isFloatingRow(rowId : string) : boolean {\n        return this.floatingRecordHandler.isFloatingRecord(rowId);\n    }  \n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IFloatingRowAPI, IOptionalConfig } from \"./Interface/IFloatingRowAPI\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { FloatingRowAPIInteracter } from \"./FloatingRowAPIInteracter\";\nimport { FloatingRowHookAction } from \"./FloatingRowAPiHookAction\";\nimport { createFloatingValidationWrapper } from \"./FloatingRowAPIValidator\";\nimport { IFloatingRecordHandler } from \"../../FloatingRecords/Interface/IFloatingRecordHandler\";\nimport { IRowNodeCore } from \"DataStore/rownode.types\";\n\nconst floatingRowAPIHookMeta : IHookMeta = {\n    suppressEventTrigger : false,\n    useApiCaller : true,\n    eventOrigin : 'api'\n}\n\n@Bean(GRID_BEAN_NAME.FLOATING_ROW_API)\nexport class FloatingRowAPI extends EventEmitter implements IFloatingRowAPI {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    private validator : IFloatingRowAPI;\n    @PostConstruct()\n    init() {\n        const apiInteracter  = this.createManagedBean(new FloatingRowAPIInteracter());\n        const hookAction     = FloatingRowHookAction(this.getBeanInstanceByBeanName, apiInteracter);\n              this.validator = createFloatingValidationWrapper(this.getBeanInstanceByBeanName, hookAction, apiInteracter);\n    }\n    updateMessage(label : string) : void {\n        const floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n        floatingRecordHandler.updateFloatingRecordMovedLabel(label);\n    }\n    floatRow(fromRowIndex: number, optionalConfig?: IOptionalConfig, hookMeta?: IHookMeta): void {\n        this.validator.floatRow(fromRowIndex, optionalConfig, hookMeta ?? floatingRowAPIHookMeta);\n    }\n    floatRowById(fromRowId: string, optionalConfig?: IForceOption, hookMeta?: IHookMeta): void {\n        this.validator.floatRowById(fromRowId, optionalConfig, hookMeta ?? floatingRowAPIHookMeta)\n    }\n    commitAndUnFloatRow(toRowIndex?: number, optionalConfig?: IOptionalConfig, hookMeta?: IHookMeta): void {\n        this.validator.commitAndUnFloatRow(toRowIndex, optionalConfig, hookMeta ?? floatingRowAPIHookMeta);\n    }\n    commitAndUnFloatRowById(toRowId?: string, optionalConfig?: IForceOption, hookMeta?: IHookMeta): void {\n        this.validator.commitAndUnFloatRowById(toRowId, optionalConfig, hookMeta ?? floatingRowAPIHookMeta);\n    }\n    moveRowTemporarilyById(toRowId: string, optionalConfig?: IForceOption): void {\n        this.validator.moveRowTemporarilyById(toRowId, optionalConfig)\n    }\n    moveRowTemporarily(toRowIndex: number, optionalConfig?: IOptionalConfig): void {\n        this.validator.moveRowTemporarily(toRowIndex, optionalConfig)\n    }\n\n    observeFloat() : void{\n        const floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n        floatingRecordHandler.observeFloat();\n    }\n\n    unObserveFloat() : void{\n        const floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n        floatingRecordHandler.unObserveFloat();\n    }\n    isRowFloated(rowId: string): boolean {\n        return this.validator.isRowFloated(rowId);\n    }\n    getFloatingRowNode(): IRowNodeCore | null {\n        const floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n        return floatingRecordHandler.getFloatingRowNode();\n    }\n}","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IFloatingRowAPI, IOptionalConfig } from \"./Interface/IFloatingRowAPI\";\nimport { IFloatingRowAPIInteracter } from \"./Interface/IFloatingRowAPIInteracter\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IFloatingRowOptionalConfig, IForceOption } from \"../CommonAPIInterface\";\nimport { IFloatingAPIHookAction } from \"./Interface/IFloatingRowAPIHookAction\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { IFloatingRecordHandler } from \"Grid/FloatingRecords/Interface/IFloatingRecordHandler\";\nimport { RowRenderController } from \"../../Core/Rows/RowRenderController\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { IRowNodeCore } from \"../../../DataStore/rownode.types\";\n\n/** @internal */\nexport function createFloatingValidationWrapper( getBeanInstanceByBeanName: getBeanInstanceByBeanName, hookAction: IFloatingAPIHookAction, apiInteracter: IFloatingRowAPIInteracter ) {\n    const recordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n    const fieldHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n    const floatingRecordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n    const rowRenderController = getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n\tclass FloatingRowAPIValidator implements IFloatingRowAPI {\n        getFloatingRowNode(): IRowNodeCore | null {\n            return floatingRecordHandler.getFloatingRowNode();\n        }\n        floatRow(fromRowIndex: number, optionalConfig?: IOptionalConfig, hookMeta?: IHookMeta): void {\n            const rowId = recordHandler.getId(fromRowIndex, 'middle', optionalConfig?.parentKeys);\n\n            this.floatRowById(rowId, optionalConfig, hookMeta);\n        }\n        floatRowById(fromRowId: string, optionalConfig?: IFloatingRowOptionalConfig, hookMeta?: IHookMeta): void {\n            const isSameTargetRow = floatingRecordHandler.getTargetRowId() == fromRowId;\n            if(this.isRowExist(fromRowId) || isSameTargetRow) {\n                const rowHeaderHandler = fieldHandler.getHeaderHandler();\n                const columns         = rowHeaderHandler.getDisplayedColumns();\n                columns.forEach(column => {\n                    rowRenderController.refreshHeaderCell(fromRowId, column.getID(), {force : true});\n                });\n                return;\n            }\n            hookAction.floatRow(fromRowId, optionalConfig, hookMeta);\n        }\n        commitAndUnFloatRow(toRowIndex?: number, optionalConfig?: IOptionalConfig, hookMeta?: IHookMeta): void {\n            const rowId = recordHandler.getId(toRowIndex, 'middle', optionalConfig?.parentKeys) ?? null;\n            this.commitAndUnFloatRowById(rowId, optionalConfig, hookMeta);\n        }\n        commitAndUnFloatRowById(toRowId?: string, optionalConfig?: IForceOption, hookMeta?: IHookMeta): void {\n            if(toRowId == null || this.isRowExist(toRowId)) {\n                if(this.isRowExist(toRowId)) {\n                    // console.warn(`${toRowId} is not belongs to grid.So it will commit to last id`)\n                }\n                hookAction.commitAndUnFloatRow(null, optionalConfig, hookMeta);\n                return;\n            }\n            hookAction.commitAndUnFloatRow(toRowId, optionalConfig, hookMeta);\n        }\n        moveRowTemporarilyById(toRowId: string, optionalConfig?: IForceOption): void {\n            if(!this.isRowExist(toRowId)) {\n                return;\n            }\n            apiInteracter.moveRowTemporarily(toRowId, optionalConfig);\n        }\n        moveRowTemporarily(toRowIndex: number, optionalConfig?: IOptionalConfig): void {\n            const rowId = recordHandler.getId(toRowIndex, 'middle', optionalConfig?.parentKeys);\n\n            apiInteracter.moveRowTemporarily(rowId, optionalConfig);\n        }\n        updateMessage(_label : string) : void {\n        }\n\n        isRowFloated(rowId: string): boolean {\n            return apiInteracter.isFloatingRow(rowId);\n        }\n\n        private isRowExist(rowId: string): boolean {\n            const rowNode = recordHandler.getRowNodeById(rowId)\n            return !(rowNode && rowNode.getPinnedPosition() === 'middle');\n        }\n        \n       \n\t}\n\n\treturn new FloatingRowAPIValidator();\n}\n","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { ICommitAndUnFloatRowHookParamsWithoutAPI, IFloatRowHookParamsWithoutAPI, IFloatingAPIHookAction } from \"./Interface/IFloatingRowAPIHookAction\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { HookEventsName, } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { IFloatingRowAPIInteracter } from \"./Interface/IFloatingRowAPIInteracter\";\nimport { IFloatingRecordHandler } from \"../../FloatingRecords/Interface/IFloatingRecordHandler\";\nimport { IForceOption, IFloatingRowOptionalConfig } from \"../CommonAPIInterface\";\nimport { IFloatingTriggerAction } from \"../../FloatingRecords/FloatingRecordBehaviourHandler\";\n\nexport function FloatingRowHookAction(getBeanInstanceByBeanName : getBeanInstanceByBeanName, apiInteracter : IFloatingRowAPIInteracter) {\n    const hook = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    const floatingRecordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n    class FloatingRowHookAction implements IFloatingAPIHookAction {\n        floatRow(fromRowId: string, optionalConfig?: IFloatingRowOptionalConfig, hookMeta?: IHookMeta): void {\n            const {suppressEventTrigger        = false, useApiCaller = true} = hookMeta;\n            const metas   = this.createFloatRowHookParams(fromRowId, optionalConfig.triggerAction, optionalConfig,hookMeta);\n\n            const api = (params : IFloatRowHookParamsWithoutAPI) => {\n\t\t\t\tuseApiCaller && apiInteracter.floatRow(params.rowId, optionalConfig);\n\t\t\t};\n\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeFloatingRowStarted, HookEventsName.onAfterFloatingRowStarted, api, metas) : api(metas);\n\n        }\n        commitAndUnFloatRow(toRowId?: string, optionalConfig?: IForceOption, hookMeta?: IHookMeta): void {\n\n            const {suppressEventTrigger        = false, useApiCaller = true} = hookMeta;\n            if(!toRowId) {\n                toRowId = floatingRecordHandler.getTargetRowId();\n            }\n            const metas   = this.createCommitAndUnFloatRowHookParams(toRowId,optionalConfig,hookMeta);\n\n            const api = (params : ICommitAndUnFloatRowHookParamsWithoutAPI) => {\n\t\t\t\tuseApiCaller && apiInteracter.commitAndUnFloatRow(params.targetRowId, {\n                    force :params.force\n                });\n\t\t\t};\n\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeFloatingRowEnded, HookEventsName.onAfterFloatingRowEnded, api, metas) : api(metas);\n        }   \n        \n        createFloatRowHookParams(fromRowId: string, triggerAction : IFloatingTriggerAction, optionalConfig: IForceOption = {}, hookMeta: IHookMeta): IFloatRowHookParamsWithoutAPI{\n            return {\n                rowId         : fromRowId,\n                force         : optionalConfig.force,\n                eventOrigin   : hookMeta.eventOrigin,\n                event         : hookMeta.event,\n                userParams    : hookMeta.userParams,\n                triggerAction : triggerAction\n            }\n\n        }\n        createCommitAndUnFloatRowHookParams(toRowId: string,optionalConfig: IForceOption = {}, hookMeta: IHookMeta): ICommitAndUnFloatRowHookParamsWithoutAPI{\n            const FloatingRecordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n            const sourceRowId = FloatingRecordHandler.getSourceFloatingRow();\n            return {\n                targetRowId : toRowId,\n                sourceRowId ,\n                force      : optionalConfig.force,\n                eventOrigin  : hookMeta.eventOrigin,\n                event      : hookMeta.event,\n                userParams : hookMeta.userParams\n            }\n\n        }\n        \n    }\n\n    return new FloatingRowHookAction();\n}\n","import { AutoWired, BEAN_NAME, Bean, Context, EventEmitter, Optional, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n// import { IUserPresence } from \"../../../userpresence/core/src/DataHandler/Interface/IUserPresenceConfig\";\n// import { IUserPresenceHandler } from \"../Core/UserPresence/Interface/IUserPresenceHandler\";\nimport { GRID_BEAN_NAME } from \"../Core/Constants/BeanName\";\nimport { IGridConfiguration } from \"../Core/Interface/IGridConfiguration\";\nimport { ICellOptionalConfig, IRowMeta, RefreshCellParams } from \"./CommonAPIInterface\";\nimport { IGridAPI, IRefreshColumn, IViewPort } from \"../Interface/IGridAPI\";\nimport { Events } from \"../Core/Constants/Events\";\nimport { ICellEditorComponent, ICellRendererComponent, IColumnNode, IRowNode } from \"../Main\";\nimport { FieldHandler } from \"../Core/Columns/FieldHandler\";\nimport { RowRenderController } from \"../Core/Rows/RowRenderController\";\nimport { rowPinPositions } from \"../Core/Constants/GridConfigurationConstants\";\nimport { IRowNodeCore } from \"../../DataStore/rownode.types\";\nimport { RecordHeaderColumnNode } from \"../Core/Columns/ColumnNode\";\nimport { focusedCellPosition, IFocusHandler } from \"../Core/Navigation/focus-handler.types\";\nimport { CellPositionType } from \"../Core/Navigation/cell-position.types\";\nimport { INavigationHandler } from \"../Core/Navigation/navigation-handler.types\";\nimport { IRowSelectionHandler } from \"../../Selection/row-selection-handler.types\";\nimport { IColumnSelection } from \"../../Selection/column-selection.types\";\nimport { IRangeSelectionHandler } from \"../../rangeselection/range-selection-handler.types\";\nimport { IGridCellEditorHandler } from \"../GridComponent/Editor/GridCellEditorHandler\";\nimport { IControllerHandler } from \"../Core/Interface/IControllerHandler\";\nimport { IRecordHandler } from \"../Core/Rows/RecordHandler.types\";\nimport { ColumnVisibleHandlerType } from \"../Core/Columns/column-visible-handler.types\";\nimport { RowController } from \"../GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { IFloatingRecordHandler } from \"../FloatingRecords/Interface/IFloatingRecordHandler\";\n\n@Bean(GRID_BEAN_NAME.GRID_API)\nclass GridApi extends EventEmitter implements IGridAPI {\n    \n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRendererController;\n    @AutoWired('columnVisibleHandler') private columnVisibleHandler                  : ColumnVisibleHandlerType;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler                  : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler                    : FieldHandler;\n    @Optional ('RowSelectionHandler') private rowSelectionHandler                    : IRowSelectionHandler;\n    @Optional ('columnSelection') private columnSelectionHandler                     : IColumnSelection;\n    @Optional ('rangeSelectionHandler') private rangeSelectionHandler                : IRangeSelectionHandler;\n    @AutoWired(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) private gridCellEditorHandler: IGridCellEditorHandler;\n    @AutoWired('focusHandler') private focusHandler                                  : IFocusHandler;\n    @AutoWired(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) private floatingRecordHandler: IFloatingRecordHandler;\n\n\n    updateConfiguration(configuration: IGridConfiguration) : void {\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        optionHandler.updateConfiguration(configuration);\n        this.dispatchEvent({\n            type : Events.EVENT_GRID_CONFIGURATION_UPDATED,\n            configuration : configuration\n        })\n    }\n\n    getConfigurationByKey(key: keyof IGridConfiguration) : IGridConfiguration[keyof IGridConfiguration] {\n        const optionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_OPTIONS) as IGridConfiguration;\n        return optionHandler[key];\n    }\n    getViewPort() : IViewPort {\n        // const pinPosition = 'middle';\n        // const parentKeys  = [];\n        const startColumn = this.columnVisibleHandler.getFirstRenderIndex();\n        const endColumn   = this.columnVisibleHandler.getLastRenderIndex();\n\n        const startRow : IRowMeta =this.rowRendererController.getViewportStart();\n        const endRow: IRowMeta = this.rowRendererController.getViewportEnd();\n        // const startRow : IRowMeta = {\n        //     rowIndex    : this.rowRendererController.getViewportStart(),\n        //     pinPosition,\n        //     parentKeys\n        // };\n        // const endRow: IRowMeta = {\n        //     rowIndex    : this.rowRendererController.getViewportEnd(),\n        //     pinPosition,\n        //     parentKeys\n        // }\n        return {\n            startRow,\n            startColumn : this.fieldHandler.convertToRelativeIndex(startColumn),\n            endRow,\n            endColumn   : this.fieldHandler.convertToRelativeIndex(endColumn)\n        }\n    }\n    startCellEditing(recordId: string, fieldId: string, event ?: KeyboardEvent, value : any = null): void {\n        if(!this.isRowExist(recordId) || !this.isColumnExist(fieldId)) {\n            return;\n        }    \n\n        let rowNode = this.recordHandler.getRowNodeById(recordId);\n        if (this.floatingRecordHandler && this.floatingRecordHandler.isFloatingRecord(recordId)) {\n            const floatingRowNode = this.floatingRecordHandler.getFloatingRowNode();\n            if (floatingRowNode) {\n                rowNode = floatingRowNode;\n            }\n        }\n        const columnNode = this.fieldHandler.getColumnNodeByID(fieldId);\n        const rowMeta = rowNode.getRowMeta();\n        const cellPosition: CellPositionType = {\n            rowIndex   : rowMeta.rowIndex,\n            pinPosition: rowMeta.pinPosition || 'middle',\n            columnID   : columnNode.getID(),\n            parentKeys : rowMeta.parentKeys\n        };\n\n        const navigationHandler = this.getBeanInstanceByBeanName('navigationService') as INavigationHandler;\n        const focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\n        const cellController = navigationHandler.getCellController(cellPosition);\n\n        if (!cellController) {\n            return;\n        }\n        if (!focusHandler.isCellFocused(cellPosition)) {\n            navigationHandler.focusPosition(cellPosition, event, 'api');\n        }\n        // cellController.startEditing(event?.key,event);\n        this.gridCellEditorHandler.startEditing(cellController, event?.key, event, value);\n    }\n    startCellEditingByIndex(rowIndex : number, columnIndex : number, cellOptionalConfig ?: ICellOptionalConfig, event ?: KeyboardEvent) : void {\n        const {pinPosition, parentKeys} = cellOptionalConfig ?? {};\n        if(!this.isRowExistByIndex(rowIndex, pinPosition, parentKeys) || !this.isColumnExistByIndex(columnIndex)) {\n            return null;\n        }\n\n        const rowNode = this.getRowNodeByIndex(rowIndex, pinPosition, parentKeys);\n        const columnNode = this.getColumnNodeByIndex(columnIndex);\n        const rowMeta = rowNode.getRowMeta();\n\n        const cellPosition: CellPositionType = {\n            rowIndex : rowMeta.rowIndex,\n            pinPosition: rowMeta.pinPosition || 'middle',\n            columnID : columnNode.getID(),\n            parentKeys : rowMeta.parentKeys\n        };\n\n        const navigationHandler = this.getBeanInstanceByBeanName('navigationService') as INavigationHandler;\n        const focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\n        const cellController = navigationHandler.getCellController(cellPosition);\n\n        if (!cellController) {\n            return;\n        }\n        if (!focusHandler.isCellFocused(cellPosition)) {\n            navigationHandler.focusPosition(cellPosition, event, 'api');\n        }\n        // cellController.startEditing(event?.key,event);\n        this.gridCellEditorHandler.startEditing(cellController, event?.key, event);\n    }\n\n    startHeaderCellEditing(fieldId : string, event ?: KeyboardEvent) : void {\n        const columnIndex = this.fieldHandler.getIndexById(fieldId);\n        this.startHeaderCellEditingByIndex(columnIndex, event);\n    }\n\n    startHeaderCellEditingByIndex(columnIndex : number, event ?: KeyboardEvent) : void {\n        if(this.isColumnExistByIndex(columnIndex)) {\n            const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n            const cellController      = rowRenderController.getColumnHeaderCellController(columnIndex);\n            if (cellController) {\n                // cellController.startEditing(event?.key,event);\n                this.gridCellEditorHandler.startEditing(cellController, event?.key, event);\n            } \n        }\n    }\n    stopCellEditing(cancel ?: boolean, event ?: KeyboardEvent, stopNavigation : boolean = true) : void{\n        // const focusedCell = this.getFocusedCell();\n\n        // if(!focusedCell) {\n        //     return;\n        // }\n        // const navigationHandler = this.getBeanInstanceByBeanName('navigationService') as INavigationHandler;\n        // const cellController = navigationHandler.getCellController(focusedCell);\n\n        // if (!cellController) {\n        //     return;\n        // }\n\n        // cellController.stopEditing(cancel, event,event.shiftKey);\n        this.gridCellEditorHandler.stopEditing(cancel, event, event?.shiftKey , stopNavigation);\n    }\n\n    updateExtraRow(isExtraRow : boolean) : void {\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const previousExtraRow = optionHandler.getIsExtraRow();\n\n        if(previousExtraRow != isExtraRow) {\n            optionHandler.setIsExtraRow(isExtraRow);\n\n            this.dispatchEvent({\n                type       : Events.EVENT_ROW_DATA_LOADED,\n                recycleRows: true,\n                focus      : false\n            })\n        }\n    }\n    getUserConfigurations() : IGridConfiguration {\n        return this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_OPTIONS);\n    }\n\n    getRowControllerInstance(index: number): RowController | null {\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getRowControllerByIndex(index);\n    }\n    getCellRendererInstance(recordId: string, fieldId: string): ICellRendererComponent {\n       if(!this.isRowExist(recordId) || !this.isColumnExist(fieldId)) {\n            return null;\n       }\n       const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n       return rowRenderController.getCellRendererInstance(recordId, fieldId);\n    }\n    getColumnHeaderCellRendererInstance(fieldId: string): ICellRendererComponent {\n        if(!this.isColumnExist(fieldId)) {\n            return null;\n        }\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getColumnHeaderCellRendererInstance(fieldId);\n    }\n    getRowHeaderCellRendererInstance(recordId: string, fieldId: string): ICellRendererComponent {\n        if (!this.isRowExist(recordId) || !this.isHeaderColumnExist(fieldId)) {\n\t\t\treturn null;\n\t\t}\n       const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n       return rowRenderController.getRowHeaderCellRendererInstance(recordId, fieldId);\n    }\n    getRowHeaderColumnHeaderCellRendererInstance(fieldId: string): ICellRendererComponent {\n        if(!this.isHeaderColumnExist(fieldId)) {\n            return null;\n        }\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getRowHeaderColumnHeaderCellRendererInstance(fieldId);\n    }\n    getCellRendererInstanceByIndex(recordIndex: number, fieldIndex: number, optionalConfig?: ICellOptionalConfig): ICellRendererComponent {\n        const {pinPosition, parentKeys} = optionalConfig ?? {};\n        if(!this.isRowExistByIndex(recordIndex, pinPosition, parentKeys) || !this.isColumnExistByIndex(fieldIndex)) {\n            return null;\n        }\n\n        const rowNode = this.getRowNodeByIndex(recordIndex, pinPosition, parentKeys);\n        const columnNode = this.getColumnNodeByIndex(fieldIndex);\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getCellRendererInstance(rowNode.getId(), columnNode.getID());\n\n    }\n    getColumnHeaderCellRendererInstanceByIndex(fieldIndex: number): ICellRendererComponent {\n        if(!this.isColumnExistByIndex(fieldIndex)) {\n            return null;\n        }\n        const columnNode          = this.getColumnNodeByIndex(fieldIndex);\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getColumnHeaderCellRendererInstance(columnNode.getID());\n    }\n    getRowHeaderCellRendererInstanceByIndex(recordIndex: number, fieldIndex: number, optionalConfig?: ICellOptionalConfig): ICellRendererComponent {\n        const {pinPosition, parentKeys} = optionalConfig ?? {};\n        if(!this.isRowExistByIndex(recordIndex, pinPosition, parentKeys) || !this.isHeaderColumnExistByIndex(fieldIndex)) {\n            return null;\n        }\n\n        const rowNode             = this.getRowNodeByIndex(recordIndex, pinPosition, parentKeys);\n        const columnNode          = this.getHeaderColumnNodeByIndex(fieldIndex);\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getRowHeaderCellRendererInstance(rowNode.getId(), columnNode.getID());\n    }\n    getRowHeaderColumnHeaderCellRendererInstanceByIndex(fieldIndex: number): ICellRendererComponent {\n        if(!this.isHeaderColumnExistByIndex(fieldIndex)) {\n            return null;\n        }\n\n        const columnNode          = this.getHeaderColumnNodeByIndex(fieldIndex);\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getRowHeaderColumnHeaderCellRendererInstance(columnNode.getID());\n    }\n    getFocusedCell(): focusedCellPosition | null {\n        const focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n        return focusHandler.getFocusedCellPosition();\n    }\n    clearAllSelections() : void {\n        if(this.rangeSelectionHandler) {\n            this.rangeSelectionHandler.removeRangeSelectionWithHook('api');\n        }\n\n        if(this.rowSelectionHandler) {\n            this.rowSelectionHandler.clearSelection({source : 'api'});\n        }\n\n        if(this.columnSelectionHandler) {\n            this.columnSelectionHandler.clearSelection({source : 'api'});\n        }\n    }\n    selectAll() : void {\n        if(this.rangeSelectionHandler) {\n            this.rangeSelectionHandler.selectAll();\n        }\n    }\n\n    deselectAll() : void {\n        if(this.rangeSelectionHandler) {\n            this.rangeSelectionHandler.removeRangeSelection();\n        }\n    }\n\n    getSummaryCellRendererInstance(recordId: string, fieldId: string): ICellRendererComponent | null {\n        if (!this.isSummaryRowExist(recordId) || !this.isColumnExist(fieldId)) {\n\t\t\treturn null;\n\t\t}\n\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getSummaryCellRendererInstance(recordId,fieldId);\n    }\n\n    getSummaryCellRendererInstanceByIndex(recordIndex: number, fieldIndex: number): ICellRendererComponent | null {\n        if(!this.isRowExistByIndex(recordIndex, 'summary', []) || !this.isColumnExistByIndex(fieldIndex)) {\n            return null;\n        }\n\n        const rowNode             = this.getRowNodeByIndex(recordIndex, 'summary', []);\n        const columnNode          = this.getColumnNodeByIndex(fieldIndex);\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getSummaryCellRendererInstance(rowNode.getId(), columnNode.getID());\n    }\n\n    getSummaryHeaderCellRendererInstance(recordId: string, fieldId: string): ICellRendererComponent | null {\n        if (!this.isSummaryRowExist(recordId) || !this.isHeaderColumnExist(fieldId)) {\n\t\t\treturn null;\n\t\t}\n\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getSummaryHeaderCellRendererInstance(recordId,fieldId);\n    }\n\n    getSummaryHeaderCellRendererInstanceByIndex(recordIndex: number, fieldIndex: number): ICellRendererComponent | null {\n        if(!this.isRowExistByIndex(recordIndex, 'summary', [])|| !this.isHeaderColumnExistByIndex(fieldIndex)) {\n            return null;\n        }\n\n        const rowNode             = this.getRowNodeByIndex(recordIndex, 'summary', []);\n        const columnNode          = this.getHeaderColumnNodeByIndex(fieldIndex);\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getSummaryHeaderCellRendererInstance(rowNode.getId(), columnNode.getID());\n    }\n\n    getCellEditorInstance(recordId: string, fieldId: string): ICellEditorComponent | null {\n        if(!this.isRowExist(recordId) || !this.isColumnExist(fieldId)) {\n            return null;\n        }\n\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getCellEditorInstance(recordId, fieldId);\n    }\n\n    getCellEditorInstanceByIndex(recordIndex: number, fieldIndex: number, optionalConfig?: ICellOptionalConfig): ICellEditorComponent | null {\n        const {pinPosition, parentKeys} = optionalConfig ?? {};\n        if(!this.isRowExistByIndex(recordIndex, pinPosition, parentKeys) || !this.isColumnExistByIndex(fieldIndex)) {\n            return null;\n        }\n\n        const rowNode = this.getRowNodeByIndex(recordIndex, pinPosition, parentKeys);\n        const columnNode = this.getColumnNodeByIndex(fieldIndex);\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getCellEditorInstance(rowNode.getId(), columnNode.getID());\n    }\n\n    clearEditorTooltip() : void {\n        this.dispatchEvent({\n            type : 'destroyEditorTooltip'\n        })\n    }\n\n    public refresh(refreshParams: RefreshCellParams): void {\n        this.dispatchEvent({\n            type : Events.EVENT_CELL_REFRESH,\n            ...refreshParams\n        })\n    }\n\n    public refreshHeaderRows(refreshParams: RefreshCellParams) : void {\n        this.dispatchEvent({\n            type : Events.EVENT_HEADER_ROW_CELL_REFRESH,\n            ...refreshParams\n        })\n    }\n\n    public refreshColumns(refreshColumns : IRefreshColumn[]): void {\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        rowRenderController.refreshColumn(refreshColumns);\n    }\n\n    public destroyGrid() : void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        const gridController = controllerHandler.getGridController();\n        const  editorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as IGridCellEditorHandler;\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n\n        editorHandler && editorHandler.stopEditing(true, null, false, true);\n\n        rowRenderController.removeAllRowComponents(false);\n\n        this.dispatchEvent({\n            type : 'preDestroyed'\n        })\n\n        gridController && gridController.destroyComponent();\n\n        this.optionsHandler.on('gridDestroy');\n        \n        const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT) as Context;\n        context.destroy();\n    }\n\n    private isSummaryRowExist(recordID : string) : boolean {\n        const summaryHandler = this.recordHandler.getSummaryHandler();\n        return !!summaryHandler.getRowNodeById(recordID);\n    }\n\n    private isRowExist(recordID: string): boolean {\n        const isFloatingRecord = this.floatingRecordHandler.isFloatingRecord(recordID);\n        if(isFloatingRecord) {\n            return true;\n        }\n        return !!this.recordHandler.getRowNodeById(recordID);\n    }\n\n    private isColumnExist(fieldId: string): boolean {\n        return !!this.fieldHandler.getColumnNodeByID(fieldId)\n    }\n\n    private isHeaderColumnExist(fieldId: string): boolean {\n        const headerHandler = this.fieldHandler.getHeaderHandler();\n        return !!headerHandler.getColumnNodeById(fieldId);\n    }\n\n    private getRowNodeByIndex(recordIndex : number, pinPosition : rowPinPositions, parentKeys : string[]) : IRowNodeCore {\n        const recordID = this.recordHandler.getId(recordIndex, pinPosition, parentKeys);\n        const summaryHandler = this.recordHandler.getSummaryHandler();\n        return pinPosition === 'summary' ? summaryHandler.getRowNodeById(recordID) :this.recordHandler.getRowNodeById(recordID);\n    }\n\n    private getColumnNodeByIndex(fieldIndex : number) : IColumnNode {\n        return this.fieldHandler.getColumnNode(fieldIndex);\n    }\n\n    private isRowExistByIndex(recordIndex : number, pinPosition : rowPinPositions, parentKeys : string[]) : boolean {\n        return !!this.getRowNodeByIndex(recordIndex, pinPosition, parentKeys);\n    }\n\n    private isColumnExistByIndex(fieldIndex) : boolean {\n        return !!this.fieldHandler.getColumnNode(fieldIndex);\n    }\n\n    private isHeaderColumnExistByIndex(fieldIndex) : boolean {\n        return !!this.getHeaderColumnNodeByIndex(fieldIndex);\n    }\n\n    private getHeaderColumnNodeByIndex(fieldIndex : number) : RecordHeaderColumnNode {\n        const headerHandler = this.fieldHandler.getHeaderHandler();\n        return headerHandler.getColumnNode(fieldIndex);\n    }\n    focus(): void {\n        const cellPosition = this.focusHandler.getFocusedCellPosition();\n\n        if(cellPosition && cellPosition.rowIndex !== null) {\n            this.focusHandler.setFocusedCell(cellPosition, true);\n        }\n    }\n    //feed to mcp\n    getAllRowNodes() : IRowNode[] {\n        const rownodes = this.recordHandler.getSequenceRowNodes(this.recordHandler.getFirstIndexMeta(), this.recordHandler.getLastIndexMeta());\n        return rownodes.filter(rownode => rownode && rownode.getPinnedPosition() !== 'bottomDraftRow' && rownode.getPinnedPosition() !== 'topDraftRow')\n    }\n\n    getAllColumnNodes() : IColumnNode[] {\n        return this.fieldHandler.getDisplayedAllColumns();\n    }\n\n    getColumnHeaderCellElement(fieldId : string) : HTMLElement | null {\n         if(!this.isColumnExist(fieldId)) {\n            return null;\n        }\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        return rowRenderController.getColumnHeaderElement(fieldId);\n    }\n\n    getAddRowBufferInstance(): any {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        return controllerHandler.getRowBufferContainerController()?.getRenderer?.();\n    }\n\n    getAddColumnBufferInstance(): any {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        return controllerHandler.getColumnBufferContainerController()?.getRenderer?.();\n    }\n\n    getCurrentEditingCell() : {recordID : string, fieldID : string} | null {\n        const cellController = this.gridCellEditorHandler.getCellController();\n        if(cellController) {\n            const rowNode        = cellController.getRowNode();\n            const columnNode     = cellController.getColumn();\n            return {\n                recordID: rowNode.getId(),\n                fieldID : columnNode.getID()\n            }\n        }\n        return null\n    }\n\n    getCurrentEditingCellPosition() : CellPositionType| null {\n        const cellController = this.gridCellEditorHandler.getCellController();\n        if(cellController) {\n            const cellPosition = this.gridCellEditorHandler.getCellPosition();\n            return cellPosition;\n        }\n        return null\n    }\n\n\n}\n\nexport {\n    GridApi\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IExperimentalAPI } from \"../Interface/IGridExperimentalAPI\";\nimport { GRID_BEAN_NAME } from \"../Core/Constants/BeanName\";\nimport { IColumnNode, IRowNode } from \"../Main\";\nimport { IRowMeta, IRowOptionalConfigWithoutForce } from \"./CommonAPIInterface\";\nimport { rowPinPositions } from \"../Core/Constants/GridConfigurationConstants\";\n\n@Bean(GRID_BEAN_NAME.GRID_EXPERIMENTAL_API)\nexport class GridExperimentalAPI extends EventEmitter implements IExperimentalAPI {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    getColumnNode(columnIndex: number): IColumnNode {\n        const fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        return fieldHandler.getColumnNode(columnIndex);\n    }\n    getColumnNodeById(columnId: string): IColumnNode {\n        const fieldHandler  = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        const index         = fieldHandler.getIndexById(columnId);\n        return this.getColumnNode(index);\n    }\n\n    getRowNode(rowIndex: number, {pinPosition}: IRowOptionalConfigWithoutForce = {}): IRowNode{\n        const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        let paneInfoHandler;\n        switch (pinPosition) {\n            case 'top' : \n                paneInfoHandler = recordHandler.getTopHandler();\n                break;\n            case 'bottom' :\n                paneInfoHandler = recordHandler.getBottomHandler();\n                break;\n            default :\n                paneInfoHandler = recordHandler.getMiddleHandler();\n                break;\n        }\n        return paneInfoHandler.getRowNode(rowIndex);\n    }\n\n    getRowNodeById(id: string): IRowNode {\n        const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        return recordHandler.getRowNodeById(id);\n    }\n\n    getCurrentEditingCell() : void {\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        return rowRenderController.getEditorState();\n    }\n\n    getLastScrollPixel() : number {\n\t\tconst rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        return rowRenderController.getLastScrollPixel();\n\t}\n\n\tgetFirstScrollPixel() : number {\n\t\tconst rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        return rowRenderController.getFirstScrollPixel();\n\t}\n\n    getRecordsContainerHeight() : number {\n        const recordHandler   = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        const extraRowHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.EXTRA_RECORD_HANDLER);\n        const optionHandler   = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\n        const extraRowHeight = optionHandler.getIsExtraRow() ? extraRowHandler.getRowHeight() : 0;\n        const centerHandler  = recordHandler.getMiddleHandler();\n        return centerHandler.getTotalHeight() + extraRowHeight;\n    }\n\n    isLastRowReached() : boolean{\n        const scrollLastPixel = this.getLastScrollPixel();\n\n        const containerHeight = this.getRecordsContainerHeight();\n\n        return scrollLastPixel >= containerHeight;\n    }\n\n    addDropZone(dropZones : any[]) : void {\n        const rowReorderComponent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_REORDER_COMPONENT_HANDLER);\n        rowReorderComponent.addDropZone(dropZones);\n    }\n\n    findIndexByPosition(y : number) : number {\n        const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        const index = recordHandler.findRowbyPosition(y);\n        return index;\n    }\n\n    getCellComponentByPosition(row: number, column: number, position: rowPinPositions) {\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n\t\treturn rowRenderController.getCellComponentByPosition(row, column, position);\n    }\n\n    getRootInstance() {\n        return this.getBeanInstanceByBeanName;\n    }\n\n    getRowComponentElements(rowMeta : IRowMeta) : HTMLElement[] {\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        return rowRenderController.getRowByPosition(rowMeta)?.getElements() ?? [];\n    }\n\n    getLeafChildrenIncludingCollapsed(startRowMeta : IRowMeta, endRowMeta : IRowMeta) : IRowMeta[] {\n        const hasFullTreeStructure = this.optionsHandler.hasFullTreeStructureProvided();\n        if(hasFullTreeStructure){\n            const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n            const middleHandler = recordHandler.getMiddleHandler() as any;\n            const leafChildren = middleHandler.getLeafChildrenIncludingCollapsed(startRowMeta, endRowMeta);\n            return leafChildren;\n        }\n        return [];\n    }\n\n    getCardsPerRow() : number | undefined {\n        const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        const middleHandler = recordHandler.getMiddleHandler();\n        const rowAxis = middleHandler.getRowAxis() as { getCardsPerRow?: () => number };\n        return rowAxis?.getCardsPerRow?.();\n    }\n}","import { AutoWired, EventEmitter } from \"@dg/corecomponent\";\nimport { IPinningAPIInteracter } from \"./Interface/IPinningApiInteracter.types\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { columnPinPosition, IPinningOptionalConfig } from \"../CommonAPIInterface\";\nimport { Events } from \"../../Core/Constants/Events\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\n\nexport class PinningApiInteracter extends EventEmitter implements IPinningAPIInteracter{\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private rowHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private columnHandler : FieldHandler;\n\n    pinColumns(columnIds : string[], position : columnPinPosition, insertMetas : Pick<IPinningOptionalConfig, 'insertIndex' | 'insertPosition'>) : void {\n        this.columnHandler.changePinPosition(columnIds, position, insertMetas);\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_REFRESH,\n            force : true\n        })\n    }\n\n    isColumnPinned(columnId: string): boolean {\n        return this.columnHandler.isColumnPinned(columnId);\n    }\n    isRowIdPinned(rowId: string): boolean {\n        return this.rowHandler.isRowPinned(rowId);\n    }\n    getTopPinnedRows(): string[] {\n        return this.rowHandler.getTopPinnedIds();\n    }\n    getBottomPinnedRows(): string[] {\n        return this.rowHandler.getBottomPinnedIds();\n    }\n    getLeftPinnedColumns(): string[] {\n        return this.columnHandler.getLeftPinnedIds();\n    }\n    getRightPinnedColumns(): string[] {\n        return this.columnHandler.getRightPinnedIds();\n    }\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookMeta } from \"../../Main\";\nimport { columnPinPosition, IColumnOptionalConfig, IPinningOptionalConfig } from \"../CommonAPIInterface\";\nimport { IPinningAPIManager } from \"./Interface/IPinningAPIManager.types\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { IPinningAPIInteracter } from \"./Interface/IPinningApiInteracter.types\";\nimport { IPinningAPIValidator } from \"./Interface/IPinningAPIValidator.types\";\nimport { IPinningAPIHookAction } from \"./Interface/IPinningAPIHookParams.types\";\nimport { PinningApiInteracter } from \"./PinningAPIInteracter\";\nimport { PinningApiValidator } from \"./PinningAPIValidator\";\nimport { createPinnedHookAction } from \"./PinningHookHandler\";\nimport { Events } from \"../../Core/Constants/Events\";\n\n\nconst pinHookMeta : IHookMeta = {\n    eventOrigin         : 'api',\n    suppressEventTrigger: false\n}\n\n@Bean(GRID_BEAN_NAME.PINNING_API)\nclass PinningAPIManager extends EventEmitter implements IPinningAPIManager {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName   : getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private columnHandler : FieldHandler;\n    private    interacter                                           : IPinningAPIInteracter;\n    private    validator                                            : IPinningAPIValidator;\n    private    hookAction                                           : IPinningAPIHookAction;\n    @PostConstruct()\n    init(){\n        this.interacter = this.createManagedBean(new PinningApiInteracter());\n        this.validator  = this.createManagedBean(new PinningApiValidator());\n        this.hookAction = createPinnedHookAction(this.getBeanInstanceByBeanName, this.interacter);\n    }\n    pinColumn(columnIndex: number, position: columnPinPosition, columnOptionalConfig?: IColumnOptionalConfig, hookMeta: IHookMeta = pinHookMeta): void {\n        this.pinColumns([columnIndex], position, columnOptionalConfig, hookMeta);\n    }\n    pinColumnById(columnId: string, position: columnPinPosition, forceOptionalConfig?: IPinningOptionalConfig, hookMeta: IHookMeta = pinHookMeta): void {\n        this.pinColumnsById([columnId], position, forceOptionalConfig, hookMeta);\n    }\n    pinColumns(columnIndexes: number[], position: columnPinPosition, columnOptionalConfig?: IColumnOptionalConfig, hookMeta: IHookMeta = pinHookMeta): void {\n        const ids = columnIndexes.map(index => this.columnHandler.getAbsoluteID(index));\n        this.pinColumnsById(ids, position, columnOptionalConfig, hookMeta);\n    }\n    pinColumnsById(columnIds: string[], position: columnPinPosition, forceOptionalConfig : IPinningOptionalConfig = {}, hookMeta: IHookMeta = pinHookMeta): void {\n        const isValid = this.validator.validatePinColumns(columnIds, position, forceOptionalConfig);\n        if(isValid){\n            this.hookAction.pinColumnsById(columnIds, position, forceOptionalConfig, hookMeta);\n        }\n    }\n    // unpinAllRows(hookMeta: IHookMeta = pinHookMeta): void {\n    //     throw new Error(\"Method not implemented.\");\n    // }\n    unpinAllColumns( optionalConfig: IPinningOptionalConfig, hookMeta: IHookMeta = pinHookMeta): void {\n        const leftColumns = this.getLeftPinnedColumns();\n        const rightColumns = this.getRightPinnedColumns();\n        this.pinColumnsById(leftColumns, 'none', optionalConfig, hookMeta);\n        this.pinColumnsById(rightColumns, 'none', optionalConfig, hookMeta);\n\n        this.dispatchEvent({\n            type   : Events.EVENT_CELL_REFRESH,\n            force  : leftColumns.length === 0 || rightColumns.length === 0\n        })\n    }\n\n    unpinColumn(columnIndex: number, optionalConfig: IPinningOptionalConfig, hookMeta: IHookMeta = pinHookMeta): void {\n        const id = this.columnHandler.getAbsoluteID(columnIndex);\n        this.unpinColumnById(id, optionalConfig, hookMeta);\n    }\n\n    unpinColumnById(columnId: string, optionalConfig: IPinningOptionalConfig, hookMeta: IHookMeta = pinHookMeta): void {\n        this.pinColumnsById([columnId], 'none', optionalConfig, hookMeta);\n    }\n\n    isColumnPinned(columnIndex: number): void {\n        const id = this.columnHandler.getAbsoluteID(columnIndex);\n        this.isColumnIdPinned(id);\n    }\n    isColumnIdPinned(columnId: string): boolean {\n        return this.interacter.isColumnPinned(columnId);\n    }\n    isRowIdPinned(rowId: string): boolean {\n        return this.interacter.isRowIdPinned(rowId);\n    }\n    \n    getTopPinnedRows(): string[] {\n        return this.interacter.getTopPinnedRows();\n    }\n\n    getBottomPinnedRows(): string[] {\n        return this.interacter.getBottomPinnedRows();\n    }\n    getLeftPinnedColumns(): string[] {\n        return this.interacter.getLeftPinnedColumns();\n    }\n    getRightPinnedColumns(): string[] {\n        return this.interacter.getRightPinnedColumns();\n    }\n}\n\nexport {\n    PinningAPIManager\n}","import { columnPinPosition, IForceOption } from \"../CommonAPIInterface\";\nimport { IPinningAPIValidator } from \"./Interface/IPinningAPIValidator.types\";\n\nexport class PinningApiValidator implements IPinningAPIValidator{\n    validatePinColumns(_columnIds: string[], _position : columnPinPosition, _forceOptionalConfig?: IForceOption): boolean {\n        return true\n    }\n}","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IColumnPinningHookParams, IPinningAPIHookAction, IPinningHookParamProvider } from \"./Interface/IPinningAPIHookParams.types\";\nimport { IHookMeta } from \"../../Main\";\nimport { columnPinPosition, IPinningOptionalConfig } from \"../CommonAPIInterface\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { IPinningAPIInteracter } from \"./Interface/IPinningApiInteracter.types\";\nimport { MOVE_POSITION } from \"../../Core/Constants/GridConstants\";\n\nclass PinningHookParamProvider implements IPinningHookParamProvider{\n    columnHandler: any;\n    constructor(getBeanInstanceByBeanName : getBeanInstanceByBeanName){\n        this.columnHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n    }\n    createPinColumnsParam(columnIds : string[], pinPosition : columnPinPosition, optionalConfig : IPinningOptionalConfig = {}, hookMeta : IHookMeta = {}): IColumnPinningHookParams {\n        const {eventOrigin, event, userParams} = hookMeta;\n        return {\n            metas : {\n                columnIds,\n                columnIndex : columnIds.map(id=>this.columnHandler.getIndexById(id)),\n                pinPosition,\n                insertIndex : optionalConfig.insertIndex ?? 0,\n                insertPosition : optionalConfig.insertPosition ?? MOVE_POSITION.BEFORE\n            },\n\n            eventOrigin,\n            event,\n            userParams\n        }\n    }\n}\n\n/** @internal */\nexport function createPinnedHookAction(getBeanInstanceByBeanName: getBeanInstanceByBeanName, apiInteracter : IPinningAPIInteracter) {\n    const hook = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    class PinningHookHandler implements IPinningAPIHookAction{\n        private hookParamProvider: IPinningHookParamProvider;\n\n        constructor(){\n            this.hookParamProvider = new PinningHookParamProvider(getBeanInstanceByBeanName);\n        }\n        pinColumnsById(columnIds: string[], position: columnPinPosition, optionalConfig : IPinningOptionalConfig = {}, hookMeta : IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = optionalConfig.userParams ?? null;\n            const metas = this.hookParamProvider.createPinColumnsParam(columnIds, position, optionalConfig, hookMeta);\n            const api = () => {\n                const {columnIds, pinPosition, insertIndex, insertPosition} = metas.metas;\n                useApiCaller && apiInteracter.pinColumns(columnIds, pinPosition, {insertIndex, insertPosition});\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeColumnPinning, HookEventsName.onAfterColumnPinning, api, metas) : api();\n        }\n    }\n\n    return new PinningHookHandler();\n}","import { AutoWired, Bean, EventEmitter, Optional } from \"@dg/corecomponent\";\nimport { IRangeSelectionAPI } from \"./range-selection-api.types\";\nimport { CellRangeParams, CellRangeType, IRangeSelectionHandler } from \"../../../rangeselection/range-selection-handler.types\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { rowPinPositions } from \"../../Core/Constants/GridConfigurationConstants\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\n\n@Bean('rangeSelectionAPI')\nexport class RangeSelectionAPI extends EventEmitter implements IRangeSelectionAPI {\n    @Optional('rangeSelectionHandler') private rangeSelectionHandler : IRangeSelectionHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler : FieldHandler;\n    addCellRange(cellRange: CellRangeParams): void {\n        this.addCellRanges([cellRange])\n    }\n\n    addCellRanges(cellRanges: CellRangeParams[] = []): void {\n        if (!this.rangeSelectionHandler || !cellRanges) {\n            return;\n        }\n    \n        const validRanges = cellRanges.filter(range => this.validateCellRange(range));\n\n        if (validRanges.length === 0) {\n            return;\n        }\n        this.rangeSelectionHandler.addCellRanges(validRanges, 'api');\n    }\n    \n    removeCellRange(cellRange: CellRangeType): void {\n        this.removeCellRanges(cellRange ? [cellRange] : []);\n    }\n\n    removeCellRanges(cellRanges: CellRangeType[] = []): void {\n        if(!this.rangeSelectionHandler || !cellRanges) {\n            return;\n        }\n\n        const existingRange = this.rangeSelectionHandler.isCellRangeExist(cellRanges);\n        if(!existingRange) {\n            return;\n        }\n\n        this.rangeSelectionHandler.removeCellRanges(cellRanges, 'api');\n    }\n    clearRangeSelection(): void {\n        if(!this.rangeSelectionHandler) {\n            return;\n        }\n        this.rangeSelectionHandler.removeRangeSelectionWithHook('api');\n    }\n\n    getCellRanges(): CellRangeType[] {\n        if(this.rangeSelectionHandler) {\n            return this.rangeSelectionHandler.getCellRanges();\n        }\n\n        return [];\n    }\n\n    hasMultipleCells() : boolean {\n        if(this.rangeSelectionHandler) {\n            return this.rangeSelectionHandler.hasMultipleCells();\n        }\n        return false;\n    }\n\n    private validateCellRange(CellRangeParams: CellRangeParams): boolean {\n        const startRowExists = this.isRowExist(CellRangeParams?.rowStartIndex, CellRangeParams?.rowStartPinned);\n        const endRowExists = this.isRowExist(CellRangeParams?.rowEndIndex, CellRangeParams?.rowEndPinned);\n    \n        const columnExists = (columnId: string | undefined) => columnId ? this.isColumnExist(columnId) : false;\n    \n        let allColumnsExist = true;\n    \n        if (CellRangeParams?.columnIds) {\n            for (const columnId of CellRangeParams?.columnIds) {\n                if (!columnExists(columnId)) {\n                    allColumnsExist = false;\n                    break;\n                }\n            }\n        } else {\n            const startColumnExists = columnExists(CellRangeParams?.columnStart);\n            const endColumnExists = columnExists(CellRangeParams?.columnEnd);\n            allColumnsExist = startColumnExists && endColumnExists;\n        }\n    \n        return startRowExists && endRowExists && allColumnsExist;\n    }\n    \n\n    private isColumnExist(columnId : string) : boolean {\n        return !!this.fieldHandler.getColumnNodeByID(columnId);\n    }\n\n    private isRowExist(rowIndex : number, pinPosition : rowPinPositions): boolean {\n        const topHandler = this.recordHandler.getTopHandler();\n        const centerHandler = this.recordHandler.getMiddleHandler();\n        const bottomHandler = this.recordHandler.getBottomHandler();\n        switch(pinPosition) {\n            case 'top':\n                return !!topHandler.getRowNode(rowIndex);\n            case 'bottom':\n                return !!bottomHandler.getRowNode(rowIndex);\n            case 'middle':\n                return !!centerHandler.getRowNode(rowIndex);\n        }\n\n        return false;\n    }\n    \n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IReorderableAPI, MovePosition, RowRange } from \"./Interface/IReorderableAPI\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IRowOptionalConfig, IForceOption, IColumnOptionalConfig, IRowMeta } from \"../CommonAPIInterface\";\nimport { ReorderableAPIInteracter } from \"./ReorderableAPIInteracter\";\nimport { ReorderableAPIHookAction } from \"./ReorderableAPIHookAction\";\nimport { createReorderableValidationWrapper } from \"./ReorderableAPIValidator\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IReorderableHookAction } from \"./Interface/IReorderableHookParams\";\nimport { IReordableApiValidator } from \"./Interface/IReordableApiValidator.types\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\n\n\nconst reorderableAPIHookMeta: IHookMeta = {\n suppressEventTrigger: false,\n useApiCaller        : true,\n eventOrigin         : 'api'\n};\n\nconst parseRowRanges = (rowRanges: RowRange[], recordHandler : IRecordHandler) => {\n    const rowMetas = [];\n    rowRanges.forEach(({from : startMeta, to : endMeta}) => {\n        const sequenceRowNodes = recordHandler.getSequenceRowMetas(startMeta, endMeta);\n        rowMetas.push(...sequenceRowNodes);\n    });\n    return rowMetas;\n};\n\n@Bean(GRID_BEAN_NAME.REORDERABLE_API)\nexport class ReorderableAPI extends EventEmitter implements IReorderableAPI{\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler : FieldHandler;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName   : getBeanInstanceByBeanName;\n    private    validator                                            : IReordableApiValidator;\n    private    hookAction                                           : IReorderableHookAction;\n\n    @PostConstruct()\n    init() {\n        const apiInteracter  = this.createManagedBean(new ReorderableAPIInteracter());\n\n        this.hookAction = ReorderableAPIHookAction(this.getBeanInstanceByBeanName, apiInteracter);\n        this.validator  = createReorderableValidationWrapper(this.getBeanInstanceByBeanName, this.recordHandler);\n    }\n\n    private getRowMetas(rowIds : string[]) : IRowMeta[]{\n        return rowIds.map(id => ({...this.recordHandler.getIndexMetaById(id), rowId : id}));\n    }\n\n    private getColumnIndexes(columnIds : string[]) : number[]{\n        return columnIds.map(id => (this.fieldHandler.getIndexById(id)));\n    }\n    moveRow(rowIndex: number, targetRowIndex: number, position?: MovePosition, optionalConfig : IRowOptionalConfig = {}, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        const {pinPosition, parentKeys} = optionalConfig;\n        this.moveRows([{rowIndex, pinPosition, parentKeys}], {rowIndex: targetRowIndex, pinPosition, parentKeys}, position, optionalConfig, hookMeta);\n    }\n    moveRowById(sourceRowId: string, targetRowId: string, position?: MovePosition, optionalConfig?: IForceOption, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        this.moveRowsById([sourceRowId], targetRowId, position, optionalConfig, hookMeta);\n    }\n\n    moveRows(sourceRowMetas: IRowMeta[], targetRowIndex: IRowMeta, position?: MovePosition, optionalConfig?: IRowOptionalConfig, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        const isValid = this.validator.validateMoveRows(sourceRowMetas, targetRowIndex, position, optionalConfig);\n        if(isValid){\n            this.hookAction.moveRows(sourceRowMetas, targetRowIndex, position, optionalConfig, hookMeta);\n        }\n    }\n\n    moveRowsById(sourceRowIds: string[], targetRowId: string, position?: MovePosition, optionalConfig?: IForceOption, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        const sourceMetas = this.getRowMetas(sourceRowIds);\n        const targetMetas = this.getRowMetas([targetRowId])[0];\n\n        this.moveRows(sourceMetas, targetMetas, position, optionalConfig, hookMeta);\n    }\n    moveColumn(sourceColumnIndex: number, targetColumnIndex: number, position?: MovePosition, optionalConfig?: IColumnOptionalConfig, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        this.moveColumns([sourceColumnIndex], targetColumnIndex, position, optionalConfig, hookMeta);\n    }\n    moveColumnById(sourceColumnId: string, targetColumnId: string, position?: MovePosition, optionalConfig?: IForceOption, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        this.moveColumnsById([sourceColumnId], targetColumnId, position, optionalConfig, hookMeta);\n    }\n    \n    moveColumns(sourceColumnIndexes: number[], targetColumnIndex: number, position?: MovePosition, optionalConfig?: IColumnOptionalConfig, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        const isValid = this.validator.validateMoveColumns(sourceColumnIndexes, targetColumnIndex, position, optionalConfig);\n        if(isValid){\n            this.hookAction.moveColumns(sourceColumnIndexes, targetColumnIndex, position, optionalConfig, hookMeta);\n        }\n    }\n\n    moveColumnsById(sourceColumnIds: string[], targetColumnId: string, position?: MovePosition, optionalConfig?: IForceOption, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        const sourceColumnIndexes = this.getColumnIndexes(sourceColumnIds);\n        const targetColumnIndex   = this.getColumnIndexes([targetColumnId])[0];\n\n        this.moveColumns(sourceColumnIndexes, targetColumnIndex, position, optionalConfig, hookMeta);\n    }\n\n\n    moveRowRange(sourceRows: RowRange[], targetRowIndex: IRowMeta, position?: MovePosition, optionalConfig?: IRowOptionalConfig, hookMeta: IHookMeta = reorderableAPIHookMeta): void {\n        const rowsMetas = parseRowRanges(sourceRows, this.recordHandler);\n        this.moveRows(rowsMetas, targetRowIndex, position, optionalConfig, hookMeta);\n    }\n}","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { IMoveColumnsHookParamsWithoutAPI, IMoveRowsHookParamsWithoutAPI, IReorderableHookAction, IReorderableHookParamProvider } from \"./Interface/IReorderableHookParams\";\nimport { IReorderableAPIInteracter } from \"./Interface/IRorderableAPIInteracter\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IColumnOptionalConfig, IRowMeta, IRowOptionalConfig } from \"../CommonAPIInterface\";\nimport { MovePosition } from \"./Interface/IReorderableAPI\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { RowType } from \"../../../Selection/row-selection/row-selection.types\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\n\n\nclass ReorderableHookParamProvider implements IReorderableHookParamProvider{\n    private rowHandler: IRecordHandler;\n    private columnHandler: FieldHandler;\n    \n    constructor( getBeanInstanceByBeanName : getBeanInstanceByBeanName,){\n        this.rowHandler    = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        this.columnHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n    } \n    createMoveRowsParams(rowIndexes: IRowMeta[], targetRowIndex: IRowMeta, movePosition?: MovePosition, _optionalConfig ?: IRowOptionalConfig, hookMeta?: IHookMeta): IMoveRowsHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams} = hookMeta;\n        const sourceRows = rowIndexes.map((meta) =>{ \n            return this.getRowType(meta);\n        });\n        const targetRow = this.getRowType(targetRowIndex);\n      \n        const metas : IMoveRowsHookParamsWithoutAPI['metas']= { \n            sourceRows,\n            targetRow,\n            movePosition\n        }\n        return {\n            metas,\n            eventOrigin,\n            event,\n            userParams\n        };\n    }\n\n    // createMoveRowsRangeParams(rowRanges: RowRange[], targetRowIndex: IRowMeta, movePosition?: MovePosition, _optionalConfig ?: IRowOptionalConfig, hookMeta?: IHookMeta): IMoveRowsHookParamsWithoutAPI {\n    //     const {eventOrigin, event, userParams} = hookMeta;\n    //     const sourceRows = [];\n    //     rowRanges.forEach((rowRange) => {\n    //         const sequenceRowNodes = this.rowHandler.getSequenceRowNodes(rowRange.from, rowRange.to);\n    //         sequenceRowNodes.forEach((rowNode) => {\n    //             if(rowNode) {\n    //                 const {rowIndex, parentKeys, pinPosition} = rowNode.getRowMeta();\n    //                 sourceRows.push({\n    //                     rowIndex,\n    //                     parentKeys,\n    //                     pinPosition,\n    //                     rowID : rowNode.getId()\n    //                 })\n    //             }\n    //         })\n            \n    //     })\n\n    //     const targetRow = this.getRowType(targetRowIndex);\n        \n       \n      \n    //     const metas : IMoveRowsHookParamsWithoutAPI['metas']= { \n    //         sourceRows,\n    //         targetRow,\n    //         movePosition\n    //     }\n    //     return {\n    //         metas,\n    //         eventOrigin,\n    //         event,\n    //         userParams\n    //     };\n    // }\n    createMoveColumnsParams(columnIndexes: number[], targetColumnIndex: number, movePosition?: MovePosition, _optionalConfig?: IColumnOptionalConfig, hookMeta?: IHookMeta): IMoveColumnsHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams}  = hookMeta;\n        const columnIds     = columnIndexes.map(index => this.columnHandler.getAbsoluteID(index));\n        const targetColumnId = this.columnHandler.getAbsoluteID(targetColumnIndex);\n        \n        return {\n            metas : { \n                columnIndexes,\n                columnIds,\n                targetColumnIndex,\n                targetColumnId,\n                movePosition\n            },\n            eventOrigin,\n            event,\n            userParams\n        };\n    }\n\n    private getRowType(rowMeta : IRowMeta) : RowType {\n        const {rowIndex, parentKeys, pinPosition} = rowMeta;\n        const rowID = this.rowHandler.getId(rowIndex, pinPosition, parentKeys);\n\n        return{\n            rowIndex ,\n            pinPosition,\n            parentKeys,\n            rowID \n        }\n    }\n}\n\n\nexport function ReorderableAPIHookAction(getBeanInstanceByBeanName : getBeanInstanceByBeanName, apiInteracter : IReorderableAPIInteracter) {\n    const hook = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    class ReorderableHookAction implements IReorderableHookAction {\n        hookParamsProvider: ReorderableHookParamProvider;\n        constructor(){\n            this.hookParamsProvider = new ReorderableHookParamProvider(getBeanInstanceByBeanName);\n        }\n        moveColumns(sourceColumnIndexes: number[], targetColumnIndex: number, position?: MovePosition, optionalConfig?: IColumnOptionalConfig, hookMeta : IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            const metas = this.hookParamsProvider.createMoveColumnsParams(sourceColumnIndexes, targetColumnIndex, position, optionalConfig, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.moveColumns(sourceColumnIndexes, targetColumnIndex, position, optionalConfig);\n            }\n\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeColumnReorder, HookEventsName.onAfterColumnReorder, api, metas) : api();\n        }\n\n        moveRows(sourceRowIndexes: IRowMeta[], targetRowIndex: IRowMeta, position?: MovePosition, optionalConfig?: IRowOptionalConfig, hookMeta?: IHookMeta): void {\n            const {suppressEventTrigger        = false, useApiCaller = true} = hookMeta;\n            const metas = this.hookParamsProvider.createMoveRowsParams(sourceRowIndexes, targetRowIndex, position, optionalConfig, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.moveRows(sourceRowIndexes, targetRowIndex, position, optionalConfig);\n            }\n\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowReorder, HookEventsName.onAfterRowReorder, api, metas) : api();\n        } \n\n        // moveRowsRange(sourceRows: RowRange[], targetRowIndex: IRowMeta, position?: MovePosition, optionalConfig?: IRowOptionalConfig, hookMeta?: IHookMeta): void {\n        //     const {suppressEventTrigger        = false, useApiCaller = true} = hookMeta;\n        //     const metas = this.hookParamsProvider.createMoveRowsRangeParams(sourceRows, targetRowIndex, position, optionalConfig, hookMeta);\n        //     const api = () => {\n        //         useApiCaller && apiInteracter.moveRowsRange(sourceRows, targetRowIndex, position, optionalConfig);\n        //     }\n\n        //     !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowReorder, HookEventsName.onAfterRowReorder, api, metas) : api();\n        // }\n    }\n\n    return new ReorderableHookAction();\n}\n","import { AutoWired, EventEmitter } from \"@dg/corecomponent\";\nimport { IColumnOptionalConfig, IRowMeta, IRowOptionalConfig } from \"../CommonAPIInterface\";\nimport { MovePosition } from \"./Interface/IReorderableAPI\";\nimport { IReorderableAPIInteracter } from \"./Interface/IRorderableAPIInteracter\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { RowRenderController } from \"../../Core/Rows/RowRenderController\";\nimport { Events, ROW_REORDER_EVENT } from \"../../Core/Constants/Events\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { INavigationAPI } from \"../navigation/navigation-api.types\";\nimport { IFocusHandler } from \"../../Core/Navigation/focus-handler.types\";\nimport { IGridCellEditorHandler } from \"../../GridComponent/Editor/GridCellEditorHandler\";\nimport { areArraysEqual } from \"../../Core/utils/Object\";\n\nexport class ReorderableAPIInteracter extends EventEmitter implements IReorderableAPIInteracter {\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) fieldHandler : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) rowRenderController : RowRenderController;\n    @AutoWired(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) gridCellEditorHandler : IGridCellEditorHandler;\n    @AutoWired(\"navigationAPI\") navigationAPI : INavigationAPI;\n    @AutoWired(\"focusHandler\") focusHandler : IFocusHandler;\n\n    moveColumns(sourceColumnIndexes: number[], targetColumnIndex: number, position?: MovePosition, _optionalConfig?: IColumnOptionalConfig): void {\n        const sourceIds = sourceColumnIndexes.map(index => this.fieldHandler.getAbsoluteID(index));\n        const targetId = this.fieldHandler.getAbsoluteID(targetColumnIndex);\n        this.fieldHandler.shiftMultipleField(sourceIds, targetId, position);\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_REORDERED,\n            refresh : true,\n        });\n    } \n\n    moveRows(sourceRowMetas: IRowMeta[], targetRowMetas: IRowMeta, position?: MovePosition, _optionalConfig?: IRowOptionalConfig): void {\n        const cellPosition             = this.focusHandler.getFocusedCellPosition();\n        const hasFocusInFloatingRecord = cellPosition ? (cellPosition as any).pinPosition == 'FloatingRecord' : false;\n        const hasGridFocus             = this.focusHandler.isGridFocus();\n        const activeRowNode            = cellPosition ? this.recordHandler.getRowNodeByMeta(cellPosition) : null;\n        this.recordHandler.moveRows(sourceRowMetas, targetRowMetas, position);\n        if(activeRowNode) {\n            const {rowIndex, parentKeys} = activeRowNode.getRowMeta();\n            if(!hasFocusInFloatingRecord) {\n                const editedCellPosition = this.gridCellEditorHandler.getCellPosition();\n                let updateFocus = true;\n                if(editedCellPosition) {\n                    updateFocus = editedCellPosition.rowIndex == rowIndex && editedCellPosition.columnID == cellPosition.columnID && editedCellPosition.pinPosition == cellPosition.pinPosition && areArraysEqual(editedCellPosition.parentKeys, parentKeys);\n                }\n                this.navigationAPI.setFocusToCell({\n                    rowIndex,\n                    columnID : cellPosition.columnID,\n                    pinPosition : cellPosition.pinPosition,\n                    parentKeys : parentKeys\n                }, {focus : hasGridFocus && updateFocus});\n            }\n        }\n        this.dispatchEvent({\n            type : ROW_REORDER_EVENT.EVENT_ROW_REORDERED,\n            recycleRows : true,\n            floating : true\n        });\n    }\n\n    // moveRowsRange(sourceRows: RowRange[], targetRowIndex: IRowMeta, position?: MovePosition, _optionalConfig?: IRowOptionalConfig): void {\n    //     const sourceRowMeta = [];\n    //     sourceRows.forEach((rowRange) => {\n    //         const sequenceRowNodes = this.recordHandler.getSequenceRowNodes(rowRange.from, rowRange.to);\n    //         sequenceRowNodes.forEach((rowNode) => {\n    //             if(rowNode) {\n    //                 sourceRowMeta.push(rowNode.getRowMeta())\n    //             }\n    //         })\n    //     })\n    //     this.recordHandler.moveRows(sourceRowMeta, targetRowIndex, position);\n    //     this.dispatchEvent({\n    //         type : ROW_REORDER_EVENT.EVENT_ROW_REORDERED\n    //     });\n    // }\n}","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IReordableApiValidator } from \"./Interface/IReordableApiValidator.types\";\nimport { MovePosition } from \"../../Main\";\nimport { IRowOptionalConfig, IColumnOptionalConfig, IRowMeta } from \"../CommonAPIInterface\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\n\n\nconst isTargetInSourceRowSequence = (sourceRowIndexes: IRowMeta[], targetRowIndex: IRowMeta, recordHandler : IRecordHandler) => {\n    const middleHandler    = recordHandler.getMiddleHandler();\n    const sourceIndexAlone = [];\n    const targetIndexAlone = middleHandler.getAbsoluteIndex(targetRowIndex.rowIndex, targetRowIndex.parentKeys);\n    let minIndex = null;\n    let maxIndex = null;\n    sourceRowIndexes.forEach(({pinPosition, rowIndex, parentKeys}) => {\n        if(pinPosition == 'middle'){\n            const absoluteIndex = middleHandler.getAbsoluteIndex(rowIndex, parentKeys);\n            sourceIndexAlone.push(absoluteIndex);\n            minIndex = minIndex == null ? absoluteIndex : Math.min(minIndex, absoluteIndex);\n            maxIndex = maxIndex == null ? absoluteIndex : Math.max(maxIndex, absoluteIndex);\n        }\n    });\n\n    const totalSourceIndexes = maxIndex - minIndex + 1;\n    const targetExistInSourceSequence = sourceIndexAlone.includes(targetIndexAlone) && totalSourceIndexes == sourceIndexAlone.length;\n    return targetExistInSourceSequence;\n}\n\nconst isTargetInSourceColumnSequence = (sourceColumnIndexes: number[], targetColumnIndex: number) => {\n    const sortedIndexes = sourceColumnIndexes.slice().sort((a, b) => a - b);\n    const minIndex = sortedIndexes[0];\n    const maxIndex = sortedIndexes[sortedIndexes.length - 1];\n    const totalSourceIndexes = maxIndex - minIndex + 1;\n    const targetExistInSourceSequence = sortedIndexes.includes(targetColumnIndex) && totalSourceIndexes === sortedIndexes.length;\n    return targetExistInSourceSequence;\n}\n\nexport function createReorderableValidationWrapper( _getBeanInstanceByBeanName: getBeanInstanceByBeanName, recordHandler : IRecordHandler ) {\n\tclass ReorderableAPIValidator implements IReordableApiValidator {\n        validateMoveRows(sourceRowIndexes: IRowMeta[], targetRowIndex: IRowMeta, _position?: MovePosition, _optionalConfig?: IRowOptionalConfig): boolean {\n            if(sourceRowIndexes.length == 0){\n                return false;\n            }\n            else if(sourceRowIndexes.length == 1){\n                const sorceMeta = sourceRowIndexes[0];\n                const {rowIndex, parentKeys} = targetRowIndex;\n                if((rowIndex == undefined) || (rowIndex == sorceMeta.rowIndex && parentKeys.toString() == sorceMeta.parentKeys.toString())){\n                    return false;\n                }\n            }\n            const targetExistInSourceSequence = isTargetInSourceRowSequence(sourceRowIndexes, targetRowIndex, recordHandler);\n            if(targetExistInSourceSequence){\n                return false;\n            }\n            return true;\n        }\n        validateMoveColumns(sourceColumnIndexes: number[], targetColumnIndex: number, _position?: MovePosition, _optionalConfig?: IColumnOptionalConfig): boolean {\n            if(sourceColumnIndexes.length == 0){\n                return false;\n            }\n            else if(sourceColumnIndexes.length == 1){\n                const isSameColumn = sourceColumnIndexes[0] == targetColumnIndex;\n                if(isSameColumn){\n                    return false;\n                }\n            }\n            const targetExistInSourceSequence = isTargetInSourceColumnSequence(sourceColumnIndexes, targetColumnIndex);\n            if(targetExistInSourceSequence){\n                return false;\n            }\n            return true;\n        }\n\n        // validateMoveRowsRange(sourceRowIndexes: RowRange[], targetRowIndex: IRowMeta, _position?: MovePosition, _optionalConfig?: IRowOptionalConfig): boolean {\n        //     const recordHandler = _getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        //     const sourceRowMeta = [];\n        //     sourceRowIndexes.forEach((rowRange) => {\n        //         const sequenceRowNodes = recordHandler.getSequenceRowNodes(rowRange.from, rowRange.to);\n        //         sequenceRowNodes.forEach((rowNode) => {\n        //             if(rowNode) {\n        //                 sourceRowMeta.push(rowNode.getRowMeta())\n        //             }\n        //         })\n        //     })\n\n            \n        //     if(sourceRowMeta.length == 0){\n        //         return false;\n        //     }else if(sourceRowMeta.length == 1){\n        //         const sorceMeta = sourceRowMeta[0];\n        //         const {rowIndex, parentKeys} = targetRowIndex;\n        //         if(rowIndex == sorceMeta.rowIndex && parentKeys.toString() == sorceMeta.parentKeys.toString()){\n        //             return false;\n        //         }\n        //     }\n            \n        //     return true;\n        // }\n\n\n    \n        // moveRow(sourceRowIndex: number, targetRowIndex: number, position?: MovePosition, optionalConfig?: IRowOptionalConfig, hookMeta?: IHookMeta): void {\n        //     this.moveRows([sourceRowIndex], targetRowIndex, position, optionalConfig, hookMeta);\n        // }\n        // moveRowById(sourceRowId: string, targetRowId: string, position?: MovePosition, optionalConfig?: IForceOption, hookMeta?: IHookMeta): void {\n        //     this.moveRowsById([sourceRowId], targetRowId, position, optionalConfig, hookMeta);\n        // }\n        // moveColumn(sourceColumnIndex: number, targetColumnIndex: number, position?: MovePosition, optionalConfig?: IColumnOptionalConfig, hookMeta?: IHookMeta): void {\n        //     this.moveColumns([sourceColumnIndex], targetColumnIndex, position,optionalConfig, hookMeta);\n        // }\n        // moveColumnById(sourceColumnId: string, targetColumnId: string, position?: MovePosition, optionalConfig?: IForceOption, hookMeta?: IHookMeta): void {\n        //     this.moveColumnsById([sourceColumnId], targetColumnId, position, optionalConfig, hookMeta);\n        // }\n        // moveRows(sourceRowIndexes: number[], targetRowIndex: number, position?: MovePosition, optionalConfig?: IRowOptionalConfig, hookMeta?: IHookMeta): void {\n        //     const sourceRowIds = new Array<string>();\n        //     const recordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as RecordHandler;\n        //     const targetIndex = recordHandler.getAbsoluteID(targetRowIndex);\n        //     sourceRowIndexes.forEach((rowIndex) => {\n\t\t// \t\tconst rowId = recordHandler.getAbsoluteID(rowIndex);\n\t\t// \t\tsourceRowIds.push(rowId);\n\t\t// \t});\n\n        //     this.moveRowsById(sourceRowIds,targetIndex, position, optionalConfig, hookMeta);\n        // }\n        // moveRowsById(sourceRowIds: string[], targetRowId: string, position?: MovePosition, optionalConfig?: IForceOption, hookMeta?: IHookMeta): void {\n        //     hookAction.moveRows(sourceRowIds, targetRowId, position, optionalConfig, hookMeta);\n        // }\n        // moveColumns(sourceColumnIndexes: number[], targetColumnIndex: number, position?: MovePosition, optionalConfig?: IColumnOptionalConfig, hookMeta?: IHookMeta): void {\n        //     const sourceRowIds = new Array<string>();\n        //     const fieldHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n        //     const targetIndex = fieldHandler.getAbsoluteID(targetColumnIndex);\n        //     sourceColumnIndexes.forEach((columnIndex) => {\n\t\t// \t\tconst columnId = fieldHandler.getAbsoluteID(columnIndex);\n\t\t// \t\tsourceRowIds.push(columnId);\n\t\t// \t});\n\n        //     this.moveColumnsById(sourceRowIds,targetIndex, position, optionalConfig, hookMeta);\n        // }\n        // moveColumnsById(sourceColumnIds: string[], targetColumnId: string, position?: MovePosition, optionalConfig?: IForceOption, hookMeta?: IHookMeta): void {\n        //     hookAction.moveColumns(sourceColumnIds, targetColumnId, position, optionalConfig, hookMeta);\n            \n        // }\n    }\n\n\treturn new ReorderableAPIValidator();\n}\n","import { IBlockInsertMeta } from \"DataStore/rowblock-handler.types\";\nimport { rowPinPositions } from \"../../../Core/Constants/GridConfigurationConstants\";\nimport { IRowDefinition } from \"../../../Core/Interface/IRowDefinitions\";\nimport { IHookMeta } from \"../../../Interface/Hooks\";\nimport { IHideShowRowsHookParamsWithoutAPI, IInsertRowsHookParamsWithoutAPI, IJson, IRemoveRowsHookParamsWithoutAPI, IResizeRowsHookParamsWithoutAPI, IRowDataChangeHookParamsWithoutAPI, MovePosition } from \"../../../Main\";\nimport { IForceOption, IRowMeta, IRowOptionalConfig } from \"../../CommonAPIInterface\";\ninterface IRowAPIManager {\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Appends a single row at the end of the grid.\",\n     *   \"params\": {\n     *     \"rowData\": \"Data object for the new row\",\n     *     \"rowDefinition\": \"Optional row definitions (height, pinned, etc.)\",\n     *     \"forceOptionalConfig\": \"{ force?: boolean, userParams?: any }\",\n     *     \"hookMeta\": \"Hook metadata for intercepting the action\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Append a row with data\\ngrid.rowAPI.appendrow({ id: 5, name: 'Alice', email: 'alice@example.com', status: 'Active' });\\n\\n// Append an empty row\\ngrid.rowAPI.appendrow();\\n\\n// Append with force option (bypass hooks)\\ngrid.rowAPI.appendrow({ id: 6, name: 'Bob' }, undefined, { force: true });\"\n     *     }\n     *   ]\n     * })\n     */\n    appendrow(rowData ?: IJson, rowDefinition ?: IRowDefinition, forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)                        : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Appends multiple rows at the end of the grid.\",\n     *   \"params\": {\n     *     \"count\": \"Number of empty rows to add (if no rowData)\",\n     *     \"rowData\": \"Array of data objects\",\n     *     \"rowDefinitions\": \"Row-level definitions\",\n     *     \"forceOptionalConfig\": \"Force option config\",\n     *     \"hookMeta\": \"Hook metadata\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Append 5 empty rows\\ngrid.rowAPI.appendrows(5);\\n\\n// Append multiple rows with data\\ngrid.rowAPI.appendrows(undefined, [\\n  { id: 10, name: 'User A', status: 'Active' },\\n  { id: 11, name: 'User B', status: 'Inactive' },\\n  { id: 12, name: 'User C', status: 'Active' }\\n]);\"\n     *     }\n     *   ]\n     * })\n     */\n    appendrows(count ?: number, rowData ?: IJson[], rowDefinitions ?: IRowDefinition[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Removes a row (or range of rows) by index.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Start row index\",\n     *     \"endRowIndex\": \"End row index for range removal\",\n     *     \"rowOptionalConfig\": \"Pin position and parent keys\",\n     *     \"hookMeta\": \"Hook metadata\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Remove row at index 3\\ngrid.rowAPI.removeRow(3);\\n\\n// Remove rows from index 2 to 5\\ngrid.rowAPI.removeRow(2, 5);\\n\\n// Remove a pinned row\\ngrid.rowAPI.removeRow(0, undefined, { pinPosition: 'top' });\"\n     *     }\n     *   ]\n     * })\n     */\n    removeRow(rowIndex : number, endRowIndex ?: number, rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Removes multiple rows by their indexes.\",\n     *   \"params\": {\n     *     \"rowIndexes\": \"Array of row indexes to remove\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Remove rows at indexes 2, 3, 4\\ngrid.rowAPI.removeRows([2, 3, 4]);\"\n     *     }\n     *   ]\n     * })\n     */\n    removeRows(rowIndexes : IRowMeta[],rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta)                  : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Removes a single row by its unique ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Unique row identifier\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Remove a specific row by ID\\ngrid.rowAPI.removeRowById('row-123');\"\n     *     }\n     *   ]\n     * })\n     */\n    removeRowById(rowId : string, forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)    : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Removes multiple rows by their IDs.\",\n     *   \"params\": {\n     *     \"rowIds\": \"Array of row IDs to remove\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Remove multiple rows by IDs\\ngrid.rowAPI.removeRowsById(['row-1', 'row-3', 'row-7']);\"\n     *     }\n     *   ]\n     * })\n     */\n    removeRowsById(rowIds : string[],forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Inserts a row at a specific index position.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Index position for insertion\",\n     *     \"insertPosition\": \"Insert before or after the index\",\n     *     \"rowData\": \"Data for the new row\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Insert a row before index 2\\ngrid.rowAPI.insertRow(2, 'before', { id: 99, name: 'Inserted Row' });\\n\\n// Insert after index 5\\ngrid.rowAPI.insertRow(5, 'after', { id: 100, name: 'After Row 5' });\"\n     *     }\n     *   ]\n     * })\n     */\n    insertRow(rowIndex : number, insertPosition ?: MovePosition, rowData ?: IJson, rowDefinition ?: IRowDefinition, rowOptionalConfig?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Inserts a row relative to another row identified by ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Reference row ID\",\n     *     \"insertPosition\": \"Insert before or after\",\n     *     \"rowData\": \"Data for the new row\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Insert a row after 'row-5'\\ngrid.rowAPI.insertRowById('row-5', 'after', { id: 101, name: 'New After' });\"\n     *     }\n     *   ]\n     * })\n     */\n    insertRowById(rowId : string, insertPosition ?: MovePosition, rowData ?: IJson, rowDefinition ?: IRowDefinition, forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)   : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\",\"list\",\"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Inserts multiple rows at specific indexes.\",\n     *   \"params\": {\n     *     \"rowsMeta\": \"Array of row meta objects\",\n     *     \"insertPosition\": \"Insert before or after\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [  \n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Insert rows at indexes 2, 3, 4\\ngrid.rowAPI.insertRows([2, 3, 4], 'before', { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    insertRows(rowsMeta: IIndexInsertRowMeta[], insertPosition ?: MovePosition,  forceOptionalConfig ?: IForceOption, hookMeta?: IHookMeta)                                                                : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Duplicates a row (or range) at the given index.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Row index to duplicate\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Duplicate row at index 0\\ngrid.rowAPI.duplicateRow(0);\\n\\n// Duplicate rows 2 through 4\\ngrid.rowAPI.duplicateRow(2, 4);\"\n     *     }\n     *   ]\n     * })\n     */\n    duplicateRow(rowIndex : number, endRowIndex ?: number, duplicateOptions ?: any, rowOptionalConfig ?: IRowOptionalConfig , hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Duplicates multiple rows at specific indexes.\",\n     *   \"params\": {\n     *     \"rowIndexes\": \"Array of row indexes to duplicate\",\n     *     \"duplicateOptions\": \"Duplicate options\",\n     *     \"rowOptionalConfig\": \"Row optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Duplicate rows at indexes 2, 3, 4\\ngrid.rowAPI.duplicateRows([2, 3, 4], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    duplicateRows(rowIndexes : IRowMeta[], duplicateOptions ?: any, rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta)                        : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Duplicates a single row by its ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Row ID to duplicate\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.rowAPI.duplicateRowById('row-5');\"\n     *     }\n     *   ]\n     * })\n     */\n    duplicateRowById(rowId : string, duplicateOptions ?: any,  forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)    : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Duplicates multiple rows by their IDs.\",\n     *   \"params\": {\n     *     \"rowIds\": \"Array of row IDs to duplicate\",\n     *     \"duplicateOptions\": \"Duplicate options\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Duplicate rows by IDs\\ngrid.rowAPI.duplicateRowsById(['row-5', 'row-6'], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    duplicateRowsById(rowIds : string[], duplicateOptions ?: any ,forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Returns the total number of rows, optionally filtered by pin position.\",\n     *   \"params\": {\n     *     \"pinPosition\": \"Filter by 'top', 'bottom', or 'none'\",\n     *     \"ignoreHidden\": \"If true, excludes hidden rows from count\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Total row count\\nconst total = grid.rowAPI.getRowCount();\\n\\n// Only visible rows\\nconst visible = grid.rowAPI.getRowCount(undefined, true);\\n\\n// Pinned top rows\\nconst pinnedTop = grid.rowAPI.getRowCount('top');\"\n     *     }\n     *   ]\n     * })\n     */\n    getRowCount(pinPosition ?: rowPinPositions, ignoreHidden ?: boolean) : number;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Hides a row (or range) by index. Hidden rows are not removed, just not rendered.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Row index to hide\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Hide row at index 3\\ngrid.rowAPI.hideRow(3);\\n\\n// Hide rows 1 through 5\\ngrid.rowAPI.hideRow(1, 5);\"\n     *     }\n     *   ]\n     * })\n     */\n    hideRow(rowIndex : number, endRowIndex ?: number,rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Hides a row by its ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Row ID to hide\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.rowAPI.hideRowById('row-7');\"\n     *     }\n     *   ]\n     * })\n     */\n    hideRowById(rowId : string,forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)       : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Hides multiple rows by their indexes.\",\n     *   \"params\": {\n     *     \"rowIndexes\": \"Array of row indexes to hide\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Hide rows at indexes 2, 3, 4\\ngrid.rowAPI.hideRows([2, 3, 4], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    hideRows(rowIndexes : IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta): void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Hides multiple rows by their IDs.\",\n     *   \"params\": {\n     *     \"rowIds\": \"Array of row IDs to hide\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Hide rows by IDs\\ngrid.rowAPI.hideRowsById(['row-5', 'row-6'], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    hideRowsById(rowIds : string[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)  : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Shows a previously hidden row by index.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Row index to show\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Show row at index 3\\ngrid.rowAPI.showRow(3);\"\n     *     }\n     *   ]\n     * })\n     */\n    showRow(rowIndex : number, endRowIndex ?: number,rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Shows a previously hidden row by its ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Row ID to show\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.rowAPI.showRowById('row-7');\"\n     *     }\n     *   ]\n     * })\n     */\n    showRowById(rowId : string,forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)       : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Shows multiple rows by their indexes.\",\n     *   \"params\": {\n     *     \"rowIndexes\": \"Array of row indexes to show\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Show rows at indexes 2, 3, 4\\ngrid.rowAPI.showRows([2, 3, 4], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    showRows(rowIndexes : IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta): void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Shows multiple rows by their IDs.\",\n     *   \"params\": {\n     *     \"rowIds\": \"Array of row IDs to show\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Show rows by IDs\\ngrid.rowAPI.showRowsById(['row-5', 'row-6'], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    showRowsById(rowIds : string[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)  : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Sets the height of a specific row.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Row index\",\n     *     \"height\": \"Height in pixels or 'auto'\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set row 0 height to 60px\\ngrid.rowAPI.setRowHeight(0, 60);\\n\\n// Auto-height\\ngrid.rowAPI.setRowHeight(0, 'auto');\"\n     *     }\n     *   ]\n     * })\n     */\n    setRowHeight(rowIndex : number, height : IRowHeight ,rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta)   : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Sets the height of a specific row by its ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Row ID\",\n     *     \"height\": \"Height in pixels or 'auto'\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set row 'row-5' height to 60px\\ngrid.rowAPI.setRowHeightById('row-5', 60);\"\n     *     }\n     *   ]\n     * })\n     */\n    setRowHeightById(rowId : string, height : IRowHeight ,forceOptionalConfig ?: IForceOption , hookMeta ?: IHookMeta)     : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Sets the height of multiple rows.\",\n     *   \"params\": {\n     *     \"rowHeightsConfig\": \"Array of row heights\",\n     *     \"rowOptionalConfig\": \"Row optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set rows 2, 3, 4 height to 60px\\ngrid.rowAPI.setRowsHeight([2, 3, 4], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    setRowsHeight(rowHeightsConfig : IHeightChangeMeta[], rowOptionalConfig ?: IRowOptionalConfig , hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Sets the height of multiple rows by their IDs.\",\n     *   \"params\": {\n     *     \"rowHeightsConfig\": \"Array of row heights\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set rows 'row-5', 'row-6', 'row-7' height to 60px\\ngrid.rowAPI.setRowsHeightById(['row-5', 'row-6', 'row-7'], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    setRowsHeightById(rowHeightsConfig : IHeightChangeMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)  : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Sets all rows to the same height.\",\n     *   \"params\": {\n     *     \"height\": \"Height in pixels or 'auto'\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set all rows to 40px\\ngrid.rowAPI.setAllRowHeightAs(40);\"\n     *     }\n     *   ]\n     * })\n     */\n    setAllRowHeightAs(height : IRowHeight,rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta)                  : void;\n\n    /** When `rowHeights` is `'auto'`, remeasure DOM content and update row height for rendered rows (no-op if not auto height). */\n    /** @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Auto-fits the height of a row based on its content. Only applies if the row's height is set to 'auto'.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Row index to auto-fit\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Auto-fit row at index 3\\ngrid.rowAPI.autoFitRow(3);\"\n     *     }\n     *   ]\n     * })\n     */\n    autoFitRow(rowIndex : number, rowOptionalConfig ?: IRowOptionalConfig) : void;\n        /** @feedMcp_api({\n         *  \"apiName\": \"rowAPI\",\n         * \"accessPath\": \"[instance].rowAPI\",\n         * \"interfaceName\": \"IRowAPIManager\",\n         * \"viewType\": [\"grid\", \"list\", \"gallery\"],\n         * \"category\": \"data\",\n         * \"description\": \"Auto-fits the height of a row by its ID based on its content. Only applies if the row's height is set to 'auto'.\",\n         * \"params\": {\n         *   \"rowId\": \"Row ID to auto-fit\"\n         * },\n         * \"examples\": [\n         *   {\n         *     \"title\": \"Basic\",\n         *     \"code\": \"// Auto-fit row with ID 'row-5'\\ngrid.rowAPI.autoFitRowById('row-5');\"\n         *   }\n         * ]\n         * })\n         */\n    autoFitRowById(rowId : string) : void;\n        /** @feedMcp_api({\n         *  \"apiName\": \"rowAPI\",\n         * \"accessPath\": \"[instance].rowAPI\",\n         * \"interfaceName\": \"IRowAPIManager\",\n         * \"viewType\": [\"grid\", \"list\", \"gallery\"],\n         * \"category\": \"data\",\n         * \"description\": \"Auto-fits the height of multiple rows based on their content. Only applies if the rows' height is set to 'auto'.\",\n         * \"params\": {\n         *   \"rowIndexes\": \"Array of row indexes to auto-fit\"\n         * },\n         * \"examples\": [\n         *   {\n         *     \"title\": \"Basic\",\n         *     \"code\": \"// Auto-fit rows at indexes 2, 3, 4\\ngrid.rowAPI.autoFitRows([2, 3, 4]);\"\n         *   }\n         * ]\n         * })\n         */\n    autoFitRows(rowMetas : IRowMeta[]) : void;\n        /** @feedMcp_api({\n         * \"apiName\": \"rowAPI\",\n         * \"accessPath\": \"[instance].rowAPI\",\n         * \"interfaceName\": \"IRowAPIManager\",\n         * \"viewType\": [\"grid\", \"list\", \"gallery\"],\n         * \"category\": \"data\",\n         * \"description\": \"Auto-fits the height of multiple rows by their IDs based on their content. Only applies if the rows' height is set to 'auto'.\",\n         * \"params\": {\n         *   \"rowIds\": \"Array of row IDs to auto-fit\"\n         * },\n         * \"examples\": [\n         *   {\n         *     \"title\": \"Basic\",\n         *     \"code\": \"// Auto-fit rows with IDs 'row-5', 'row-6', 'row-7'\\ngrid.rowAPI.autoFitRowsById(['row-5', 'row-6', 'row-7']);\"\n         *   }\n         * ]\n         * })\n         */\n    autoFitRowsById(rowIds : string[]) : void;\n    /** Remeasure auto height for every currently mounted row controller (viewport + pinned rows). */\n        /** @feedMcp_api({\n         *  \"apiName\": \"rowAPI\",\n         * \"accessPath\": \"[instance].rowAPI\",\n         * \"interfaceName\": \"IRowAPIManager\",\n         * \"viewType\": [\"grid\", \"list\", \"gallery\"],\n         * \"category\": \"data\",\n         * \"description\": \"Auto-fits the height of all rows based on their content. Only applies if the rows' height is set to 'auto'.\",\n         * \"examples\": [\n         *   {\n         *     \"title\": \"Basic\",\n         *     \"code\": \"// Auto-fit all rows\\ngrid.rowAPI.autoFitAllRows();\"\n         *   }\n         * ]\n         * })\n         */\n    autoFitAllRows() : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Clears all data from a row (or range), keeping the row itself.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Row index\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Clear data for row 2\\ngrid.rowAPI.clearRowData(2);\\n\\n// Clear rows 0 through 3\\ngrid.rowAPI.clearRowData(0, 3);\"\n     *     }\n     *   ]\n     * })\n     */\n    clearRowData(rowIndex : number, endRowIndex ?: number , forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Clears all data from a row by its ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Row ID to clear\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.rowAPI.clearRowDataById('row-5');\"\n     *     }\n     *   ]\n     * })\n     */\n    clearRowDataById(rowId : string, forceOptionalConfig ?: IForceOption , hookMeta ?: IHookMeta)                       : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Clears all data for multiple rows.\",\n     *   \"params\": {\n     *     \"rowIndexes\": \"Array of row indexes to clear\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Clear data for rows at indexes 2, 3, 4\\ngrid.rowAPI.clearRowsData([2, 3, 4], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    clearRowsData(rowIndexes : IRowMeta[],  forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)                 : void;\n    \n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Clears all data for multiple rows by their IDs.\",\n     *   \"params\": {\n     *     \"rowIds\": \"Array of row IDs to clear\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Clear data for rows by IDs\\ngrid.rowAPI.clearRowsDataById(['row-5', 'row-6', 'row-7'], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    clearRowsDataById(rowIds : string[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)                    : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Replaces all data for a row at the given index.\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Row index\",\n     *     \"rowData\": \"Complete row data object (replaces existing data)\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Replace entire row data\\ngrid.rowAPI.setRowData(0, { id: 1, name: 'Updated Name', email: 'new@email.com', status: 'Active' });\"\n     *     }\n     *   ]\n     * })\n     */\n    setRowData(rowIndex : number, rowData : IJson, rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Replaces all data for a row by its ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Row ID\",\n     *     \"rowData\": \"Complete row data object\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.rowAPI.setRowDataById('row-1', { id: 1, name: 'Updated', status: 'Inactive' });\"\n     *     }\n     *   ]\n     * })\n     */\n    setRowDataById(rowId : string , rowData : IJson,forceOptionalConfig  ?: IForceOption, hookMeta ?: IHookMeta)   : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Partially updates row data (merges with existing data).\",\n     *   \"params\": {\n     *     \"rowIndex\": \"Row index\",\n     *     \"rowData\": \"Partial data to merge\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Update only the 'status' field of row 0\\ngrid.rowAPI.updateRowData(0, { status: 'Inactive' });\"\n     *     }\n     *   ]\n     * })\n     */\n    updateRowData(rowIndex : number, rowData : IJson, rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Partially updates row data by ID.\",\n     *   \"params\": {\n     *     \"rowId\": \"Row ID\",\n     *     \"rowData\": \"Partial data to merge\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.rowAPI.updateRowDataById('row-1', { status: 'Active', name: 'Updated Name' });\"\n     *     }\n     *   ]\n     * })\n     */\n    updateRowDataById(rowId: string, rowData: IJson, forceOptionalConfig ?: IForceOption  , hookMeta ?: IHookMeta)    : void;\n    \n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Sets the data for multiple rows.\",\n     *   \"params\": {\n     *     \"dataObject\": \"Array of row data change meta objects\",\n     *     \"rowOptionalConfig\": \"Row optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set data for rows at indexes 2, 3, 4\\ngrid.rowAPI.setRowsData([2, 3, 4], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    setRowsData(dataObject : IIndexRowDataChangeMeta[], rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Sets the data for multiple rows by their IDs.\",\n     *   \"params\": {\n     *     \"dataObject\": \"Array of row data change meta objects\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Set data for rows by IDs\\ngrid.rowAPI.setRowsDataById(['row-5', 'row-6', 'row-7'], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    setRowsDataById(dataObject : IIdRowDataChangeMeta[], forceOptionalConfig ?: IForceOption , hookMeta ?: IHookMeta)   : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Updates the data for multiple rows.\",\n     *   \"params\": {\n     *     \"dataObject\": \"Array of row data change meta objects\",\n     *     \"rowOptionalConfig\": \"Row optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Update data for rows at indexes 2, 3, 4\\ngrid.rowAPI.updateRowsData([2, 3, 4], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    updateRowsData(dataObject : IIndexRowDataChangeMeta[], rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n    \n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Updates the data for multiple rows by their IDs.\",\n     *   \"params\": {\n     *     \"dataObject\": \"Array of row data change meta objects\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Update data for rows by IDs\\ngrid.rowAPI.updateRowsDataById(['row-5', 'row-6', 'row-7'], { id: 99, name: 'Inserted Row' });\"\n     *     }\n     *   ]\n     * })\n     */\n    updateRowsDataById(dataObject : IIdRowDataChangeMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)    : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Finds a row by its position.\",\n     *   \"params\": {\n     *     \"y\": \"Y position\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Find row by position\\nconst rowIndex = grid.rowAPI.findRowbyPosition(100);\"\n     *     }\n     *   ]\n     * })\n     */\n    findRowbyPosition(y : number) : number;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Inserts rows at a specific block.\",\n     *   \"params\": {\n     *     \"rowInsertMeta\": \"Row insert meta\",\n     *     \"rowIndex\": \"Row index\",\n     *     \"parentKeys\": \"Parent keys\",\n     *     \"insertPosition\": \"Insert position\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Insert rows at block 0\\ngrid.rowAPI.insertRowsAtBlock({ count: 5 }, 0, ['parent-key'], 'after');\"\n     *     }\n     *   ]\n     * })\n     */\n    insertRowsAtBlock(rowInsertMeta : IBlockInsertMeta, rowIndex : number, parentKeys : string[], insertPosition : MovePosition) : void;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowAPI\",\n     *   \"accessPath\": \"[instance].rowAPI\",\n     *   \"interfaceName\": \"IRowAPIManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"data\",\n     *   \"description\": \"Gets the ID of a row by its index.\",\n     *   \"params\": {\n     *     \"index\": \"Row index\",\n     *     \"pinPosition\": \"Pin position\",\n     *     \"parentKeys\": \"Parent keys\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Get row ID by index\\nconst rowId = grid.rowAPI.getIdByIndex(0, 'middle', ['parent-key']);\"\n     *     }\n     *   ]\n     * })\n     */\n    getIdByIndex(index : number, pinPosition ?: rowPinPositions, parentKeys ?: string[]) : string;\n} \n\ninterface IRowAPIValidator {\n    validateRemoveRows(rowIndexes : IRowMeta[],rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n\n    validateInsertRows(rowsMeta: IIndexInsertRowMeta[], insertPosition ?: MovePosition,  forceOptionalConfig ?: IForceOption, hookMeta? : IHookMeta) : boolean;\n    \n    validateDuplicateRows(rowIndexes : IRowMeta[], duplicateOptions ?: any, rowOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : boolean;\n    \n    validateHideRows(rowIndexes : IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : boolean;\n    \n    validateShowRows(rowIndexes : IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : boolean;\n    \n    validateSetRowsHeight(rowHeightsConfig : IHeightChangeMeta[], rowOptionalConfig ?: IRowOptionalConfig , hookMeta ?: IHookMeta) : boolean;\n\n    validateSetRowsData(dataObject : IIndexRowDataChangeMeta[], rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n    \n    validateUpdateRowsData(dataObject : IIndexRowDataChangeMeta[], rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : boolean;\n}\n\ninterface IRowHookAction {\n    resetRowCaches(rowCount: number, rowOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n\n    insertRows(insertMeta: IIndexInsertRowMeta[], insertPosition ?: MovePosition, forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n\n    removeRows(rowIndexes: IRowMeta[], rowOptionalConfig ?: IRowOptionalConfig, hookMeta ?: IHookMeta) : void;\n\n    hideRows(rowIndexes: IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n    showRows(rowIndexes: IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n\n    setRowsHeight(rowHeightsConfig: IHeightChangeMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n    setRowsData(dataObject: IIndexRowDataChangeMeta[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n}\n\ninterface IRowAPIInteracter {\n    resetRowCaches(rowCount: number, immediateRender ?: boolean): void;\n    insertRows(insertMeta: IInsertRowsHookParamsWithoutAPI['metas'], insertPosition ?: MovePosition) : void;\n\n    removeRows(rowMetas: IRemoveRowsHookParamsWithoutAPI) : void;\n\n    getRowCount(pinPosition ?: rowPinPositions, ignoreHidden?: boolean) : number;\n\n    hideRows(rowMetas: IHideShowRowsHookParamsWithoutAPI) : void;\n\n    showRows(rowMetas: IHideShowRowsHookParamsWithoutAPI) : void;\n\n    setRowsHeight(rowHeightsConfig: IResizeRowsHookParamsWithoutAPI) : void;\n\n    setRowsData(dataObject: IRowDataChangeHookParamsWithoutAPI) : void;\n\n}\n\ninterface IInsertRowMeta {\n    count         ?: number;\n    rowData       ?: IJson[],\n    rowDefinition ?: IRowDefinition[],\n}\n\nexport interface IIndexInsertRowMeta extends IInsertRowMeta, IRowMeta {}\n\nexport interface IIdInsertRowMeta extends IInsertRowMeta {\n    rowId : string\n}\n\nexport interface IIndexRowDataChangeMeta {\n    rowIndex     : number,\n    data         : IJson,\n    pinPosition ?: rowPinPositions,\n    parentKeys  ?: string[]\n}\n\nexport interface IIdRowDataChangeMeta {\n    rowId : string,\n    data  : IJson\n}\n \ntype IRowHeight = number | 'auto';\n\nexport type IHeightChangeIndex = number | 'all';\n\nexport interface IHeightChangeMeta {\n    height : IRowHeight;\n}\n\nexport interface IIndexHeightChangeMeta extends IHeightChangeMeta {\n    rowIndex     : number | 'all';\n    pinPosition ?: rowPinPositions;\n    parentKeys  ?: string[];\n}\n\nexport interface IIdHeightChangeMeta extends IHeightChangeMeta {\n    rowId : string | 'all';\n}\n\n\n    // type IRowData = {[key : string] : any}; \n\nexport {\n    IRowAPIManager,\n    IRowAPIValidator,\n    IRowHookAction,\n    IRowAPIInteracter,\n    IRowHeight,\n}","import { rowPinPositions } from \"../../../Core/Constants/GridConfigurationConstants\";\nimport { IRowDefinition } from \"../../../Core/Interface/IRowDefinitions\";\nimport { HookInitiator } from \"../../../Interface/Hooks\";\nimport { IAPIHandler } from \"../../../Interface/IAPIHandler\";\nimport { IDataUpdateHookParamsWithoutAPI, IJson, MovePosition } from \"../../../Main\";\nimport { IRowHeight } from \"./IRowAPI\";\n\n\n//insert\nexport interface IInsertRowsHookParamsWithoutAPI<TEvent = any>{\n    metas : {\n        rowIndex       : number,\n        rowId          : string | null,\n        count          : number,\n        parentKeys     : string[],\n        rowData        : IJson[] | null,\n        rowDefinition  : IRowDefinition[] | null,\n        insertPosition : MovePosition\n    }[],\n    eventOrigin  : HookInitiator,\n    event      : TEvent,\n    userParams : any | null\n}\n\n\nexport interface IRowsCacheClearHookParamsWithoutAPI<TEvent = any>{\n    totalRows   : number,\n    eventOrigin : HookInitiator,\n    event       : TEvent,\n    userParams  : any | null\n}\n\nexport interface IRowsCacheClearHookParams<TEvent = any> extends IRowsCacheClearHookParamsWithoutAPI<TEvent> {\n    api : IAPIHandler;\n}\nexport interface IInsertRowsHookParams<TEvent = any> extends IInsertRowsHookParamsWithoutAPI<TEvent> {\n    api : IAPIHandler;\n}\n\nexport interface IRemoveRowsHookParamsWithoutAPI<TEvent = any>{\n    metas  : {\n        rowIndex \t\t: number,\n        parentKeys   \t: string[],\n        rowId    \t\t: string | null,\n    }[],\n\n    eventOrigin   : HookInitiator,\n    event       : TEvent,\n    userParams : any | null\n}\nexport interface IRemoveRowsHookParams<TEvent = any> extends IRemoveRowsHookParamsWithoutAPI<TEvent> {\n    api : IAPIHandler;\n}\n\n\n\nexport interface IHideShowRowsHookParamsWithoutAPI<TEvent = any>{\n    metas  : {\n        rowIndex   : number,\n        parentKeys : string[],\n        rowId      : string | null\n    }[]\n    eventOrigin   : HookInitiator,\n    event       : TEvent,\n    userParams : any | null\n}\nexport interface IHideRowsHookParams<TEvent = any> extends IHideShowRowsHookParamsWithoutAPI<TEvent> {\n    api : IAPIHandler;\n}\n\n\nexport interface IResizeRowsHookParamsWithoutAPI<TEvent = any>{\n    metas : {\n        rowIndex    : number | 'all',\n        parentKeys  : string[],\n        rowId       : string | null,\n        pinPosition : rowPinPositions,\n        height      : IRowHeight\n    }[],\n    eventOrigin        : HookInitiator,\n    event            : TEvent,\n    userParams : any | null\n}\n\nexport interface IRowDataChangeHookParamsWithoutAPI extends IDataUpdateHookParamsWithoutAPI{\n    cellType : IDataUpdateEventOrigin\n}\n\n\nexport interface ISetRowsHeightHookParams<TEvent = any> extends IResizeRowsHookParamsWithoutAPI<TEvent> {\n    api : IAPIHandler;\n}\n\nexport type IDataUpdateEventOrigin = 'cell' | 'row' | 'column';\nexport const data_update_event_origin = {\n    CELL : 'cell' as IDataUpdateEventOrigin,\n    ROW : 'row' as IDataUpdateEventOrigin,\n    COLUMN : 'column' as IDataUpdateEventOrigin\n}","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IRowAPIInteracter, IRowHookAction, IHeightChangeMeta, IIndexRowDataChangeMeta, IIndexInsertRowMeta, IIndexHeightChangeMeta } from \"./Interface/IRowAPI\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { IDataUpdateEventOrigin, IHideShowRowsHookParamsWithoutAPI, IInsertRowsHookParamsWithoutAPI, IRemoveRowsHookParamsWithoutAPI, IResizeRowsHookParamsWithoutAPI, IRowDataChangeHookParamsWithoutAPI, IRowsCacheClearHookParamsWithoutAPI, data_update_event_origin } from \"./Interface/IRowAPIHookParams.types\";\nimport { MovePosition } from \"../../Main\";\nimport { IForceOption, IResetRowCachesOptionalConfig, IRowMeta, IRowOptionalConfig } from \"../CommonAPIInterface\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\n\ninterface IRowAPIHookParamsProvider{\n    createResetRowsParams(rowCount: number, hookMeta: IHookMeta)                                             : IRowsCacheClearHookParamsWithoutAPI;\n    createInsertRowsParams(rowsMeta: IIndexInsertRowMeta[], MovePosition: MovePosition, hookMeta: IHookMeta) : IInsertRowsHookParamsWithoutAPI;\n    createRemoveRowsParams(rowIndexes: IRowMeta[], hookMeta?: IHookMeta)                                     : IRemoveRowsHookParamsWithoutAPI;\n    createHideShowRowsParams(rowIndexes: IRowMeta[], hookMeta?: IHookMeta)                                   : IHideShowRowsHookParamsWithoutAPI;\n    createResizeRowsParams(rowHeightsConfig: IHeightChangeMeta[], hookMeta?: IHookMeta)                      : IResizeRowsHookParamsWithoutAPI;\n    createDataUpdateParams(rowDataConfig: IIndexRowDataChangeMeta[], hookMeta?: IHookMeta)                   : IRowDataChangeHookParamsWithoutAPI;\n}\n\nclass RowAPIHookParamsProvider implements IRowAPIHookParamsProvider{\n    rowHandler   : IRecordHandler;\n    fieldHandler : FieldHandler;\n\n    constructor( getBeanInstanceByBeanName : getBeanInstanceByBeanName,){\n        this.rowHandler   = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        this.fieldHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n    }  \n\n    createResetRowsParams(totalRows : number, hookMeta: IHookMeta): IRowsCacheClearHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams} = hookMeta;\n        return{ totalRows, eventOrigin, event, userParams}\n    }\n\n    createDataUpdateParams(rowDataConfig: IIndexRowDataChangeMeta[], hookMeta?: IHookMeta): IRowDataChangeHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams, action} = hookMeta;\n        \n        const columnNodes    = this.fieldHandler.getSequenceColumnNodes(0);\n        const columnKeys    = [];\n        const columnIds     = [];\n        columnNodes.forEach((columnNode)=>{\n            columnKeys.push(columnNode?.getColumnKey());\n            columnIds.push(columnNode?.getID());\n        })\n        const cellType  : IDataUpdateEventOrigin = data_update_event_origin.ROW\n        const metas : IRowDataChangeHookParamsWithoutAPI['values'] = rowDataConfig.map(({rowIndex, pinPosition = 'middle', parentKeys=[], data : rowData}) => {\n            const rowId      = this.rowHandler.getId(rowIndex, pinPosition, parentKeys);\n            const startRow = {rowIndex, pinPosition, parentKeys};\n            const endRow   = {rowIndex, pinPosition, parentKeys};\n            const data = [{[rowId] : rowData}]\n            return {rowId, columnKeys, columnIds, data, startRow, endRow};\n        })\n\n        return{ values : metas, eventOrigin, event, userParams, cellType, action}\n    }\n\n    createInsertRowsParams(rowsMeta: IIndexInsertRowMeta[], insertPosition : MovePosition, hookMeta: IHookMeta) : IInsertRowsHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams} = hookMeta;\n        const metas = rowsMeta.map(({rowIndex, rowData = null, count = 1, pinPosition = 'middle', parentKeys=[], rowDefinition = null}) => {\n            const rowId = this.rowHandler.getId(rowIndex, pinPosition, parentKeys);\n            return {insertPosition, rowId, count, rowData, rowDefinition, rowIndex, parentKeys};\n        });\n        \n        return{ metas, eventOrigin, event, userParams }\n    }\n    \n    createRemoveRowsParams(rowMetas : IRowMeta[], hookMeta?: IHookMeta) : IRemoveRowsHookParamsWithoutAPI{\n        const {eventOrigin, event, userParams} = hookMeta;\n        const getId              = (rowIndex, pinPosition, parentKeys)=> this.rowHandler.getId(rowIndex, pinPosition, parentKeys);\n        const metas      = rowMetas.map(({rowIndex,pinPosition, parentKeys=[]}) => ({rowIndex, parentKeys, pinPosition, rowId : getId(rowIndex,pinPosition,parentKeys)}));\n        return{ metas, eventOrigin, event, userParams }\n    }\n    \n\n    createHideShowRowsParams(rowMetas: IRowMeta[], hookMeta?: IHookMeta) : IHideShowRowsHookParamsWithoutAPI{\n        const {eventOrigin, event, userParams} = hookMeta;\n        const getId              = (rowIndex, parentKeys,pinPosition)=> this.rowHandler.getId(rowIndex, pinPosition, parentKeys);\n        const metas      = rowMetas.map(({rowIndex, parentKeys=[],pinPosition}) => ({rowIndex, parentKeys, rowId : getId(rowIndex, parentKeys,pinPosition)}));\n        return{ metas, eventOrigin, event, userParams }\n    }\n\n    createResizeRowsParams(rowMetas : IIndexHeightChangeMeta[], hookMeta?: IHookMeta) : IResizeRowsHookParamsWithoutAPI {\n        const {eventOrigin, event, userParams} = hookMeta;\n        const getId              = (rowIndex, parentKeys)=> this.rowHandler.getId(rowIndex, null, parentKeys);\n        const metas      = rowMetas.map(({rowIndex, parentKeys=[], height, pinPosition}) => ({rowIndex, parentKeys, height, pinPosition, rowId : getId(rowIndex, parentKeys)}));\n        return{ metas, eventOrigin, event, userParams }\n    }\n}\n\nfunction createRowHookAction(getBeanInstanceByBeanName : getBeanInstanceByBeanName, apiInteracter : IRowAPIInteracter) : IRowHookAction {\n    const hook       = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    class RowHookAction implements IRowHookAction {\n        private hookParamsProvider : IRowAPIHookParamsProvider;\n\n        constructor(){\n            this.hookParamsProvider = new RowAPIHookParamsProvider(getBeanInstanceByBeanName);\n        } \n        resetRowCaches(rowCount: number, rowOptionalConfig : IResetRowCachesOptionalConfig = {}, hookMeta : IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = rowOptionalConfig.userParams ?? null;\n\n            const metas = this.hookParamsProvider.createResetRowsParams(rowCount, hookMeta);\n            const api   = () => {\n                useApiCaller && apiInteracter.resetRowCaches(rowCount, rowOptionalConfig?.immediateRender);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeAllRowsCacheCleared, HookEventsName.onAfterAllRowsCacheCleared, api, metas) : api();\n        }\n        insertRows(insertMeta: IIndexInsertRowMeta[], insertPosition?: MovePosition, forceOptionalConfig: IForceOption = {}, hookMeta : IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createInsertRowsParams(insertMeta, insertPosition, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.insertRows(metas.metas, insertPosition);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowInsert, HookEventsName.onAfterRowInsert, api, metas) : api();\n        }\n        removeRows(rowMetas: IRowMeta[], rowOptionalConfig: IRowOptionalConfig = {}, hookMeta: IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = rowOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createRemoveRowsParams(rowMetas, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.removeRows(metas);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowRemove, HookEventsName.onAfterRowRemove, api, metas) : api();\n        }\n        hideRows(rowMetas: IRowMeta[], forceOptionalConfig: IForceOption = {}, hookMeta: IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createHideShowRowsParams(rowMetas, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.hideRows(metas);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowHide, HookEventsName.onAfterRowHide, api, metas) : api();\n        }\n        showRows(rowMetas: IRowMeta[], forceOptionalConfig: IForceOption = {}, hookMeta: IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createHideShowRowsParams(rowMetas, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.showRows(metas);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowShow, HookEventsName.onAfterRowShow, api, metas) : api();\n        }\n        setRowsHeight(rowHeightsConfig: IHeightChangeMeta[], forceOptionalConfig: IForceOption = {}, hookMeta: IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamsProvider.createResizeRowsParams(rowHeightsConfig, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.setRowsHeight(metas);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowResize, HookEventsName.onAfterRowResize, api, metas) : api();\n        }\n        setRowsData(dataObject: IIndexRowDataChangeMeta[], forceOptionalConfig: IForceOption = {}, hookMeta: IHookMeta = {}): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig?.userParams ?? null;\n            const metas = this.hookParamsProvider.createDataUpdateParams(dataObject, hookMeta);\n            const api = () => {\n                useApiCaller && apiInteracter.setRowsData(metas);\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeDataUpdate, HookEventsName.onAfterDataUpdate, api, metas) : api();\n        } \n    }\n\n    return new RowHookAction();\n\n}\n\nexport {\n    createRowHookAction\n}","import { AutoWired, EventEmitter } from \"@dg/corecomponent\";\nimport { IRowAPIInteracter } from \"./Interface/IRowAPI\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { Events } from \"../../Core/Constants/Events\";\nimport { IHideShowRowsHookParamsWithoutAPI, IInsertRowsHookParamsWithoutAPI, IRemoveRowsHookParamsWithoutAPI, IResizeRowsHookParamsWithoutAPI, IRowDataChangeHookParamsWithoutAPI } from \"./Interface/IRowAPIHookParams.types\";\nimport { rowPinPositions } from \"../../Core/Constants/GridConfigurationConstants\";\nimport { MovePosition } from \"../../Main\";\nimport { IRowMeta } from \"../CommonAPIInterface\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { IFloatingRecordHandler } from \"Grid/FloatingRecords/Interface/IFloatingRecordHandler\";\n\nclass RowAPIInteracter extends EventEmitter implements IRowAPIInteracter {\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) rowRenderController : any;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler              : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) floatingRecordHandler: IFloatingRecordHandler;\n\n    insertRows(insertMeta: IInsertRowsHookParamsWithoutAPI['metas'], insertPosition ?: MovePosition): void {\n        this.recordHandler.insertRowsAtIndexes(insertMeta, insertPosition);\n        this.dispatchEvent({\n            type       : 'RECORD_INSERT',\n            recycleRows : true\n        });\n\n        this.dispatchEvent({\n            type : Events.EVENT_PINNED_ROW_DATA_CHANGED\n        })\n    }\n \n\n    removeRows(rowMetas: IRemoveRowsHookParamsWithoutAPI): void {\n        this.recordHandler.removeRows(rowMetas.metas);\n        this.dispatchEvent({\n            type : 'RECORD_DELETE',\n            recycleRows : true\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_PINNED_ROW_DATA_CHANGED\n        })\n    }\n\n    hideRows(rowMetas: IHideShowRowsHookParamsWithoutAPI): void {\n        rowMetas.metas.forEach(({rowId}) => {\n            const rowNode = this.recordHandler.getRowNodeById(rowId);\n            rowNode?.hide();\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_ROW_DATA_LOADED,\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_PINNED_ROW_DATA_CHANGED\n        })\n    }\n\n    showRows(rowMetas: IHideShowRowsHookParamsWithoutAPI): void {\n        rowMetas.metas.forEach(({rowId}) => {\n            const rowNode = this.recordHandler.getRowNodeById(rowId);\n            rowNode?.show();\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_ROW_DATA_LOADED,\n            recycleRows : true\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_PINNED_ROW_DATA_CHANGED\n        })\n    }\n\n    setRowsHeight(rowHeightsConfig: IResizeRowsHookParamsWithoutAPI): void {\n        rowHeightsConfig.metas.forEach(({rowIndex, height, pinPosition, parentKeys}) => {\n            if(rowIndex == 'all'){\n                this.recordHandler.setAllRowHeightAs(height as number, pinPosition);\n            }\n            else {\n                const absoluteIndex = this.recordHandler.getIndexByMeta(rowIndex as number, pinPosition, parentKeys);\n                this.recordHandler.setRowHeight(absoluteIndex, height as number);\n            }\n        })\n        this.dispatchEvent({\n            type       : Events.EVENT_ROW_DATA_LOADED,\n            recycleRows: true,\n            focus      : false,\n            floating   : true,\n        })\n    }\n\n    getRowCount(pinPosition ?: rowPinPositions, _ignoreHidden?: boolean): number {\n        return this.recordHandler.getTotalCount(pinPosition);\n    }\n\n    setRowsData(rowsMeta: IRowDataChangeHookParamsWithoutAPI): void {\n        rowsMeta.values.forEach(({data : dataArr}) => {\n            dataArr.forEach((data) => {\n                const [rowId, rowData] = Object.entries(data)[0];\n                const rowNode = this.recordHandler.getRowNodeById(rowId);\n                rowNode?.updateRowData(rowData);\n            })\n        });\n        this.dispatchEvent({\n            type : Events.EVENT_CELL_REFRESH\n        })\n    }\n\n    getIndexById(rowId: string, original ?: boolean): IRowMeta {\n        return this.recordHandler.getIndexMetaById(rowId, original);\n    }\n\n    getIdByIndex(index: number, pinPosition: rowPinPositions, parentKeys: string[]) {\n\n        if(pinPosition == 'FloatingRecord') {\n            return this.floatingRecordHandler.getTargetRowId();\n        }\n        return this.recordHandler.getId(index, pinPosition, parentKeys);\n    }\n\n    resetRowCaches(rowCount ?: number, immediateRender ?: boolean) : void {\n        this.recordHandler.resetRowCaches(rowCount);\n        this.dispatchEvent({\n            type : Events.EVENT_ROW_DATA_LOADED,\n            viewPortChange : true,\n            immediateRender : immediateRender ?? false\n        });\n\n        this.dispatchEvent({\n            type : Events.EVENT_ROW_RESETED\n        })\n\n        this.dispatchEvent({\n            type : Events.EVENT_ROW_RESETED_VIEWPORT\n        })\n    }\n}\n\nexport {\n    RowAPIInteracter\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IRowDefinition } from \"../../Core/Interface/IRowDefinitions\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IDuplicateParamConfig, IForceOption, IResetRowCachesOptionalConfig, IRowMeta, IRowOptionalConfig } from \"../CommonAPIInterface\";\nimport { IRowAPIManager, IRowAPIValidator, IRowHeight, IIndexHeightChangeMeta, IIdHeightChangeMeta, IIndexRowDataChangeMeta, IIdRowDataChangeMeta, IIndexInsertRowMeta, IIdInsertRowMeta, IRowHookAction, IHeightChangeIndex } from \"./Interface/IRowAPI\";\nimport { RowAPIInteracter } from \"./RowAPIInteracter\";\nimport { createRowHookAction } from \"./RowAPIHookAction\";\nimport { createRowAPIValidationWrapper } from \"./RowAPIValidator\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IJson, MovePosition } from \"../../Main\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { RowRenderController } from \"../../Core/Rows/RowRenderController\";\nimport { rowPinPositions } from \"../../Core/Constants/GridConfigurationConstants\";\nimport { IRowNodeCore } from \"../../../DataStore/rownode.types\";\nimport { Events } from \"../../Core/Constants/Events\";\nimport { IBlockInsertMeta } from \"DataStore/rowblock-handler.types\";\n\nconst rowHookMeta : IHookMeta = {\n    eventOrigin         : 'api',\n    suppressEventTrigger: false\n}\n\n@Bean(GRID_BEAN_NAME.ROW_API)\nclass RowAPIManager extends EventEmitter implements IRowAPIManager {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName   : getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRenderController : RowRenderController;\n\n    private validator  : IRowAPIValidator;\n    private interacter : RowAPIInteracter;\n    private hookAction : IRowHookAction;\n    @PostConstruct()\n\n    init() {\n        this.interacter = this.createManagedBean(new RowAPIInteracter());\n        this.hookAction = createRowHookAction(this.getBeanInstanceByBeanName, this.interacter);\n        this.validator  = createRowAPIValidationWrapper(this.getBeanInstanceByBeanName, this.hookAction);\n    }\n\n    private getRowMetas(rowIds : string[]) : IRowMeta[]{\n        return rowIds.map(id => ({...this.recordHandler.getIndexMetaById(id), rowId : id}));\n    }\n    appendrow(rowData ?: IJson, rowDefinition ?: IRowDefinition, forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        this.appendrows(1, [rowData], [rowDefinition], forceOptionalConfig, hookMeta);\n    }\n    appendrows(count : number, rowData ?: IJson[], rowDefinition ?: IRowDefinition[], forceOptionalConfig ?: IRowOptionalConfig, hookMeta : IHookMeta = rowHookMeta) : void {\n        if(count == 0){\n            return;\n        }\n        let insertPosition : MovePosition = 'after'\n\n        const parentKeys       = forceOptionalConfig?.parentKeys;\n        let   rowIndex         = this.interacter.getRowCount() - 1;\n        const includeDraftRows = false;\n        if(parentKeys){\n            const groupNode = this.recordHandler.getGroupLastRow({\n                rowIndex    : 0,\n                parentKeys  : parentKeys,\n                pinPosition : 'middle'\n            }, includeDraftRows);\n\n            if(groupNode){\n                rowIndex = groupNode.rowIndex;\n            }else {\n                rowIndex = 0;\n                insertPosition = 'before';\n            }\n        }\n        if(rowIndex < 0){\n            rowIndex = 0;\n            insertPosition = 'before';\n        }\n        const rowMetas = [{rowIndex, rowData, rowDefinition, count, parentKeys : parentKeys || []}];\n        this.hookAction.insertRows(rowMetas, insertPosition, forceOptionalConfig, hookMeta);\n    }\n    removeRow(rowIndex: number, endRowIndex: number = rowIndex, rowOptionalConfig?: IRowOptionalConfig, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = []; \n        for(let i = rowIndex; i <= endRowIndex; i++) {\n            const {parentKeys = [], pinPosition = 'middle'} = rowOptionalConfig || {};\n            rowMetas.push({rowIndex : i, parentKeys, pinPosition});\n        }\n        this.removeRows(rowMetas, rowOptionalConfig, hookMeta);\n    }\n\n    removeRows(rowMetas : IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const isValid = this.validator.validateRemoveRows(rowMetas, forceOptionalConfig, hookMeta);\n        if(isValid){\n            this.hookAction.removeRows(rowMetas, forceOptionalConfig, hookMeta);\n        };\n    }\n    removeRowById(rowId : string, forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = this.getRowMetas([rowId]);\n        this.removeRows(rowMetas, forceOptionalConfig, hookMeta);\n    }\n    removeRowsById(rowIds : string[],forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = this.getRowMetas(rowIds);\n        this.removeRows(rowMetas, forceOptionalConfig, hookMeta);\n    }\n    insertRow(rowIndex : number, insertPosition ?: MovePosition, rowData ?: IJson, rowDefinition ?: IRowDefinition, rowOptionalConfig?: IRowOptionalConfig, hookMeta : IHookMeta = rowHookMeta) : void {\n        const totalRowCount = this.interacter.getRowCount() - this.recordHandler.getTotalDraftCount();\n        if(rowIndex == totalRowCount){\n            this.appendrow(rowData, rowDefinition, rowOptionalConfig, hookMeta);\n        }\n        else{\n            const count      = 1;\n            const parentKeys = rowOptionalConfig?.parentKeys || [];\n            this.insertRows([{rowIndex, count, rowData : [rowData], rowDefinition : [rowDefinition], parentKeys}], insertPosition, rowOptionalConfig, hookMeta);\n        }\n    }\n    insertRowById(rowId : string, insertPosition ?: MovePosition, rowData ?: IJson, rowDefinition ?: IRowDefinition, forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const count = 1;\n        const rowMetas = this.getRowMetas([rowId])[0];\n        this.insertRows([{...rowMetas, count, rowData : [rowData], rowDefinition : [rowDefinition]}], insertPosition, forceOptionalConfig, hookMeta);\n    }\n\n    insertRows(rowsMeta : IIndexInsertRowMeta[], insertPosition : MovePosition = 'before', forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = rowHookMeta): void {\n        const totalRowCount = this.interacter.getRowCount() - this.recordHandler.getTotalDraftCount();\n        hookMeta = {...{}, ...rowHookMeta, ...hookMeta};\n        if(rowsMeta.length == 1 && rowsMeta[0].rowIndex == totalRowCount){\n            rowsMeta.forEach((meta : IIndexInsertRowMeta) => {\n                this.appendrows(meta.count, meta.rowData, meta.rowDefinition, forceOptionalConfig, hookMeta);\n            })\n            return;\n        }\n        const isValid = this.validator.validateInsertRows(rowsMeta, insertPosition, forceOptionalConfig);\n        if(isValid){\n            this.hookAction.insertRows(rowsMeta, insertPosition, forceOptionalConfig, hookMeta);\n        }\n    }\n\n    insertRowsById(rowsMeta: IIdInsertRowMeta[], insertPosition?: MovePosition, forceOptionalConfig?: IForceOption, hookMeta : IHookMeta = rowHookMeta): void {\n        const rowMetas = rowsMeta.map(({rowId, rowData, rowDefinition, count})=>({...this.recordHandler.getIndexMetaById(rowId), rowId, rowData, rowDefinition, count}));\n        this.insertRows(rowMetas, insertPosition, forceOptionalConfig, hookMeta);\n    }\n    duplicateRow(rowIndex : number, endRowIndex ?: number, duplicateOptions ?: IDuplicateParamConfig, rowOptionalConfig ?: IRowOptionalConfig, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = [];\n        const endIndex = endRowIndex ?? rowIndex;\n        for(let i = rowIndex; i <= endIndex ; i++) {\n            const {parentKeys = []} = rowOptionalConfig || {};\n            rowMetas.push({rowIndex : i, parentKeys});\n        }\n        this.duplicateRows(rowMetas, duplicateOptions, rowOptionalConfig, hookMeta);\n    }\n\n    duplicateRows(rowMetas : IRowMeta[], {withData} : IDuplicateParamConfig = {}, rowOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const count = 1;\n        const insertPosition = 'after';\n        rowMetas.forEach((meta : any) => {\n            const {rowIndex, parentKeys, pinPosition} = meta;\n            const rowId        = this.recordHandler.getId(rowIndex, pinPosition, parentKeys);\n            const rowNode      = this.recordHandler.getRowNodeById(rowId) ?? null;\n            const rowDefinition = [rowNode?.getDefinition()];\n            const rowData      = withData ? [rowNode?.getRowData()] : [{}];\n            Object.assign(meta, {rowId, rowDefinition, rowData, count});\n\n        })\n        this.hookAction.insertRows(rowMetas, insertPosition, rowOptionalConfig, hookMeta);\n    }\n    duplicateRowById(rowId : string, duplicateOptions ?: IDuplicateParamConfig, forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        this.duplicateRowsById([rowId], duplicateOptions, forceOptionalConfig, hookMeta);\n    }\n\n    duplicateRowsById(rowIds : string[], duplicateOptions ?: IDuplicateParamConfig, forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = this.getRowMetas(rowIds);\n        this.duplicateRows(rowMetas, duplicateOptions, forceOptionalConfig, hookMeta);\n    }\n    getRowCount(pinPosition : rowPinPositions = 'middle', ignoreHidden ?: boolean) : number {\n        return this.interacter.getRowCount(pinPosition, ignoreHidden);\n    }\n    hideRow(rowIndex : number, endRowIndex : number = rowIndex, rowOptionalConfig ?: IRowOptionalConfig, hookMeta : IHookMeta = rowHookMeta) : void {\n        const {pinPosition = 'middle'} = rowOptionalConfig || {};\n        const rowMetas = [];\n        for(let i = rowIndex; i <= endRowIndex; i++) {\n            const {parentKeys = []} = rowOptionalConfig || {};\n            rowMetas.push({rowIndex : i, parentKeys, pinPosition});\n        }\n        this.hideRows(rowMetas, rowOptionalConfig, hookMeta);\n    }\n    hideRowById(rowId : string,forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        this.hideRowsById([rowId],forceOptionalConfig,hookMeta);\n    }\n    \n    hideRows(rowIndexes : IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const isValid = this.validator.validateHideRows(rowIndexes, forceOptionalConfig);\n        if(isValid){\n            this.hookAction.hideRows(rowIndexes, forceOptionalConfig, hookMeta);\n        }\n    }\n    hideRowsById(rowIds : string[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = this.getRowMetas(rowIds);\n        this.hideRows(rowMetas, forceOptionalConfig, hookMeta);\n    }\n    showRow(rowIndex : number, endRowIndex : number = rowIndex, rowOptionalConfig ?: IRowOptionalConfig, hookMeta : IHookMeta = rowHookMeta) : void {\n        const {pinPosition='middle'} = rowOptionalConfig || {};\n        const rowMetas = [];\n        for(let i = rowIndex; i <= endRowIndex; i++) {\n            const {parentKeys = []} = rowOptionalConfig || {};\n            rowMetas.push({rowIndex : i, parentKeys, pinPosition});\n        }\n        this.showRows(rowMetas, rowOptionalConfig, hookMeta);\n    }\n    showRowById(rowId : string,forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        this.showRowsById([rowId],forceOptionalConfig,hookMeta);\n    }\n\n    showRows(rowIndexes : IRowMeta[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const isValid = this.validator.validateShowRows(rowIndexes, forceOptionalConfig);\n        if(isValid){\n            this.hookAction.showRows(rowIndexes, forceOptionalConfig, hookMeta);\n        }\n    }\n\n    showRowsById(rowIds : string[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = this.getRowMetas(rowIds);\n        this.showRows(rowMetas, forceOptionalConfig, hookMeta);    \n    }\n    setRowHeight(rowIndex : IHeightChangeIndex , height : IRowHeight, rowOptionalConfig : IRowOptionalConfig = {}, hookMeta : IHookMeta = rowHookMeta) : void {\n        const {pinPosition, parentKeys} = rowOptionalConfig;\n        this.setRowsHeight([{rowIndex, height, pinPosition, parentKeys}], rowOptionalConfig, hookMeta);\n    }\n\n    setRowHeightById(rowId : string, height : IRowHeight ,forceOptionalConfig ?: IForceOption , hookMeta : IHookMeta = rowHookMeta) : void {\n        this.setRowsHeightById([{rowId, height}], forceOptionalConfig, hookMeta);\n    }\n    setRowsHeight(rowMetas : IIndexHeightChangeMeta[], rowOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const isValid = this.validator.validateSetRowsHeight(rowMetas, rowOptionalConfig);\n        if(isValid){\n            this.hookAction.setRowsHeight(rowMetas, rowOptionalConfig, hookMeta);\n        }\n    }\n    setRowsHeightById(rowMetas : IIdHeightChangeMeta[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const indexHeightMeta = rowMetas.map((meta : any) => {\n            const indexMeta = this.recordHandler.getIndexMetaById(meta.rowId);\n            return {...meta, ...indexMeta};\n        })\n        this.setRowsHeight(indexHeightMeta , forceOptionalConfig, hookMeta); \n    }\n    setAllRowHeightAs(height : IRowHeight, rowOptionalConfig ?: IRowOptionalConfig, hookMeta : IHookMeta = rowHookMeta) : void {\n        this.setRowHeight('all', height, rowOptionalConfig, hookMeta);\n    }\n\n    autoFitRow(rowIndex : number, rowOptionalConfig : IRowOptionalConfig = {}) : void {\n        const {pinPosition = 'middle', parentKeys = []} = rowOptionalConfig;\n        this.rowRenderController.getRowByPosition({rowIndex, pinPosition, parentKeys})?.refreshAutoRowHeight();\n    }\n\n    autoFitRowById(rowId : string) : void {\n        const meta = this.recordHandler.getIndexMetaById(rowId);\n        this.rowRenderController.getRowByPosition({\n            rowIndex    : meta.rowIndex,\n            pinPosition : meta.pinPosition ?? 'middle',\n            parentKeys  : meta.parentKeys ?? [],\n        })?.refreshAutoRowHeight();\n    }\n\n    autoFitRows(rowMetas : IRowMeta[]) : void {\n        rowMetas.forEach((meta) => {\n            const {rowIndex, pinPosition = 'middle', parentKeys = []} = meta;\n            this.rowRenderController.getRowByPosition({rowIndex, pinPosition, parentKeys})?.refreshAutoRowHeight();\n        });\n    }\n\n    autoFitRowsById(rowIds : string[]) : void {\n        rowIds.forEach((id) => this.autoFitRowById(id));\n    }\n\n    autoFitAllRows() : void {\n        const rows = this.rowRenderController.getAllRowControllers();\n        for (let i = 0; i < rows.length; i++) {\n            rows[i].refreshAutoRowHeight();\n        }\n    }\n    \n    clearRowData(rowIndex : number, endRowIndex = rowIndex , rowOptionalConfig : IRowOptionalConfig = {}, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = [];\n        for(let i = rowIndex; i <= endRowIndex; i++) {\n            const {parentKeys = [], pinPosition} = rowOptionalConfig || {};\n            rowMetas.push({rowIndex : i, parentKeys, pinPosition, rowData : {}});\n        }\n        this.setRowsData(rowMetas, rowOptionalConfig, hookMeta);\n    }\n    clearRowDataById(rowId : string, forceOptionalConfig ?: IForceOption , hookMeta : IHookMeta = rowHookMeta) : void {\n        this.setRowDataById(rowId, {}, forceOptionalConfig, hookMeta);\n    }\n\n    clearRowsData(rowMetas : IRowMeta[],  forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const datasMeta = rowMetas.map((meta : any) => {\n            meta.rowData = {};\n            return meta\n        })\n        this.setRowsData(datasMeta, forceOptionalConfig, hookMeta);\n    }\n\n    clearRowsDataById(rowIds : string[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const rowMetas = this.getRowMetas(rowIds);\n        this.clearRowsData(rowMetas, forceOptionalConfig, hookMeta);\n    }\n    setRowData(rowIndex : number, data : IJson, rowOptionalConfig ?: IRowOptionalConfig, hookMeta : IHookMeta = rowHookMeta) : void {\n        const {pinPosition, parentKeys} = rowOptionalConfig;\n        this.setRowsData([{rowIndex, data, pinPosition, parentKeys}], rowOptionalConfig, hookMeta);\n    }\n    setRowDataById(rowId : string , data : IJson,forceOptionalConfig  ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        this.setRowsDataById([{rowId, data}], forceOptionalConfig, hookMeta);\n    }\n    updateRowData(rowIndex : number, data : IJson, forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        this.updateRowsData([{rowIndex, data}], forceOptionalConfig, hookMeta);\n    }\n    updateRowDataById(rowId: string, data: IJson, forceOptionalConfig ?: IForceOption  , hookMeta : IHookMeta = rowHookMeta) : void {\n        this.updateRowsDataById([{rowId, data}], forceOptionalConfig, hookMeta);\n    }\n    \n    setRowsData(dataObject : IIndexRowDataChangeMeta[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const isValid = this.validator.validateSetRowsData(dataObject, forceOptionalConfig);\n        if(isValid){\n            this.hookAction.setRowsData(dataObject, forceOptionalConfig, hookMeta);\n        }\n    }\n    setRowsDataById(dataObject : IIdRowDataChangeMeta[], forceOptionalConfig ?: IForceOption , hookMeta : IHookMeta = rowHookMeta) : void {\n        const indexDataMeta = dataObject.map((meta : any) => {\n            const indexMeta = this.recordHandler.getIndexMetaById(meta.rowId);\n            return {...meta, ...indexMeta};\n        })\n        this.setRowsData(indexDataMeta, forceOptionalConfig, hookMeta);\n    }\n    \n    updateRowsData(rowMeta : IIndexRowDataChangeMeta[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        rowMeta.forEach((meta : any) => {\n            const {rowIndex, parentKeys, pinPosition} = meta;\n            const rowId = this.recordHandler.getId(rowIndex, pinPosition, parentKeys);\n            const rowNode = this.recordHandler.getRowNodeById(rowId) ?? null;\n            const rowData = rowNode?.getRowData() ?? null;\n            meta.data = {...rowData, ...meta.data};\n            meta.rowId = rowId;\n        })\n        this.hookAction.setRowsData(rowMeta, forceOptionalConfig, hookMeta);\n    }\n    updateRowsDataById(dataObject : IIdRowDataChangeMeta[], forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = rowHookMeta) : void {\n        const indexDataMeta = dataObject.map((meta : any) => {\n            const indexMeta = this.recordHandler.getIndexMetaById(meta.rowId);\n            return {...meta, ...indexMeta};\n        })\n        this.updateRowsData(indexDataMeta, forceOptionalConfig, hookMeta);\n    }\n\n    getIdByIndex(index : number, pinPosition ?: rowPinPositions, parentKeys ?: string[]) : string {\n        return this.interacter.getIdByIndex(index, pinPosition, parentKeys);\n    }\n\n    getIndexById(rowId : string, original ?: boolean) : IRowMeta {\n        return this.interacter.getIndexById(rowId, original);\n    }\n\n    getDataById(rowId : string) : IJson | null {\n        const rowNode = this.getRowNodeById(rowId);\n        return rowNode?.getRowData() ?? null;\n    }\n\n    getRowNode(rowIndex : number, pinPosition ?: rowPinPositions, parentKeys ?: string[]) : IRowNodeCore | null{\n        const rowId = this.getIdByIndex(rowIndex, pinPosition, parentKeys);\n        return this.getRowNodeById(rowId);\n    }\n\n    getRowNodeById(rowId : string) : IRowNodeCore | null{\n        return this.recordHandler.getRowNodeById(rowId);\n    }\n\n    resetRowCaches(rowCount ?: number, configs ?: IResetRowCachesOptionalConfig) : void {\n        this.hookAction.resetRowCaches(rowCount, configs);\n    }\n\n    updateRowDatasById(params : {rowId : string, data : object}[]) : void {\n        params.forEach((meta) => {\n            const rowNode = this.recordHandler.getRowNodeById(meta.rowId);\n            if(rowNode) {\n                rowNode.updateRowData(meta.data);\n            }\n        })\n\n        this.dispatchEvent({\n            type : Events.EVENT_CELL_REFRESH\n        })\n    }\n    \n    findRowbyPosition(y : number) : number {\n        return this.recordHandler.findRowbyPosition(y);\n    }\n\n    insertRowsAtBlock(rowInsertMeta : IBlockInsertMeta, rowIndex : number, parentKeys : string[], insertPosition : MovePosition) : void {\n        const hasFullTreeStructure = this.optionsHandler.hasFullTreeStructureProvided();\n        if(hasFullTreeStructure){\n            const middleHandler = this.recordHandler.getMiddleHandler();\n            (middleHandler as any).insertRowsAtBlock(rowInsertMeta, rowIndex, parentKeys, insertPosition);\n            this.dispatchEvent({\n                type       : 'RECORD_INSERT',\n                recycleRows : true\n            });\n    \n            this.dispatchEvent({\n                type : Events.EVENT_PINNED_ROW_DATA_CHANGED\n            })\n        }\n    }\n\n    refreshDraftRows() : void {\n        this.recordHandler.refreshDraftRows();\n    }\n\n}\n\nexport {\n    RowAPIManager\n}\n","import { BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IRowAPIValidator, IRowHookAction, IIndexInsertRowMeta, IIndexRowDataChangeMeta, IIndexHeightChangeMeta } from \"./Interface/IRowAPI\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IForceOption, IRowMeta, IRowOptionalConfig } from \"../CommonAPIInterface\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { MovePosition } from \"../../Main\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { IAPIErrorHandler } from \"../APIErrorHandler\";\nimport { rowPinPositions } from \"../../Core/Constants/GridConfigurationConstants\";\nimport { GridOptioHandler } from \"Grid/Core/GridOptionHandler\";\n\nfunction createRowAPIValidationWrapper(getBeanInstanceByBeanName : getBeanInstanceByBeanName, _hookAction : IRowHookAction) : IRowAPIValidator {\n    const errorHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.ERROR_HANDLER) as IAPIErrorHandler;\n    const recordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n    const optionHandler = getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n    class RowAPIValidator implements IRowAPIValidator {\n        isValidRowMeta(rowMetas : IRowMeta[]): boolean {\n            const groupModel      = recordHandler.getRowGroupingModel() ?? [];\n            const level           = groupModel.length;\n            for(let i = 0; i < rowMetas.length; i++){\n                const rowMeta         = rowMetas[i];\n                const givenParentKeys = rowMeta.parentKeys ?? [];\n                //if not valid row meta remove the row from the array\n                if(!recordHandler.isValidRowMeta(rowMeta) && rowMeta.rowIndex != recordHandler.getTotalCount()) {\n                    rowMetas.splice(i, 1);\n                    i--;\n                    continue;\n                    return false\n                }\n                else if(level != givenParentKeys.length && !optionHandler.hasFullTreeStructureProvided()) {\n                    errorHandler.throwError(\"ACTION_NOT_ALLOWED_FOR_GIVEN_PARENTKEYS\", rowMeta);\n                    return false;\n                }\n            }\n            return true\n        }\n\n        validateRowRange(rowIndex: number, endRowIndex: number, pinPosition: rowPinPositions = 'middle', actionName: string): boolean {\n            const totalRowCount = recordHandler.getTotalCount(pinPosition);\n            const endIndex = endRowIndex ?? rowIndex;\n            \n            if (rowIndex < 0 || endIndex < 0) {\n                console.warn(`${actionName}: Invalid row index(s). Row indices cannot be negative.`);\n                return false;\n            }\n            \n            if (rowIndex >= totalRowCount || endIndex >= totalRowCount) {\n                console.warn(`${actionName}: Row index(s) out of bounds. Total rows: ${totalRowCount}.`);\n                return false;\n            }\n            \n            if (rowIndex > endIndex) {\n                console.warn(`${actionName}: Invalid range. rowIndex (${rowIndex}) cannot be greater than endRowIndex (${endIndex})`);\n                return false;\n            }\n\n            if (pinPosition === 'top' || pinPosition === 'bottom') {\n                const pinnedRowCount = recordHandler.getTotalCount(pinPosition);\n                if (rowIndex >= pinnedRowCount || endIndex >= pinnedRowCount) {\n                    console.warn(`${actionName}: Row index(s) out of bounds for ${pinPosition} pinned rows. Total ${pinPosition} rows: ${pinnedRowCount}.`);\n                    return false;\n                }\n            }\n            \n            return true;\n        }\n\n        validateRemoveRows(rowIndexes: IRowMeta[], _rowOptionalConfig?: IRowOptionalConfig, _hookMeta?: IHookMeta): boolean {\n            return this.isValidRowMeta(rowIndexes)\n        }\n        validateInsertRows(rowsMeta: IIndexInsertRowMeta[], _insertPosition?: MovePosition, _forceOptionalConfig?: IForceOption, _hookMeta?: IHookMeta): boolean {\n            return this.isValidRowMeta(rowsMeta)\n        }\n        validateDuplicateRows(rowIndexes: IRowMeta[], _duplicateOptions?: any, _rowOptionalConfig?: IForceOption, _hookMeta?: IHookMeta): boolean {\n            return this.isValidRowMeta(rowIndexes)\n        }\n        validateHideRows(rowIndexes: IRowMeta[], _forceOptionalConfig?: IForceOption, _hookMeta?: IHookMeta): boolean {\n            for (let i = 0; i < rowIndexes.length; i++) {\n                const rowMeta = rowIndexes[i];\n                const { rowIndex, pinPosition = 'middle' } = rowMeta;\n                if (!this.validateRowRange(rowIndex, rowIndex, pinPosition, 'hideRow')) {\n                    return false;\n                }\n            }\n            return this.isValidRowMeta(rowIndexes);\n        }\n        validateShowRows(rowIndexes: IRowMeta[], _forceOptionalConfig?: IForceOption, _hookMeta?: IHookMeta): boolean {\n            for (let i = 0; i < rowIndexes.length; i++) {\n                const rowMeta = rowIndexes[i];\n                const { rowIndex, pinPosition = 'middle' } = rowMeta;\n                if (!this.validateRowRange(rowIndex, rowIndex, pinPosition, 'showRow')) {\n                    return false;\n                }\n            }\n            return this.isValidRowMeta(rowIndexes);\n        }\n        validateSetRowsHeight(_rowHeightsConfig: IIndexHeightChangeMeta[], _rowOptionalConfig?: IRowOptionalConfig, _hookMeta?: IHookMeta): boolean {\n            return true\n        }\n        validateSetRowsData(_dataObject: IIndexRowDataChangeMeta[], _rowOptionalConfig?: IRowOptionalConfig, _hookMeta?: IHookMeta): boolean {\n            return true\n        }\n        validateUpdateRowsData(_dataObject: IIndexRowDataChangeMeta[], _rowOptionalConfig?: IRowOptionalConfig, _hookMeta?: IHookMeta): boolean {\n            return true\n        }\n    }\n\n    return new RowAPIValidator();\n}\n\nexport {\n    createRowAPIValidationWrapper\n}","import { IGroupModel } from \"../../../Core/Interface/IRowGroupingConfigurations\";\nimport { IHookMeta } from \"../../../Main\";\nimport { IForceOption } from \"../../CommonAPIInterface\";\n\n\n\ntype  IGroupOder  = 'ascending' | 'descending';\nexport interface IRowGroupingApiManager {\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowGroupingAPI\",\n     *   \"accessPath\": \"[instance].rowGroupingAPI\",\n     *   \"interfaceName\": \"IRowGroupingApiManager\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"feature\",\n     *   \"description\": \"Adds a row grouping on a column.\",\n     *   \"notes\": \"This API is only available for local row model only.\",\n     *   \"params\": {\n     *     \"columnId\": \"Column to group by\",\n     *     \"order\": \"Group order\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Group rows by 'department' in ascending order\\ngrid.rowGroupingAPI.addRowGrouping('department', 'ascending');\"\n     *     }\n     *   ]\n     * })\n     */\n    addRowGrouping(columnId: string, order: IGroupOder, forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta) : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowGroupingAPI\",\n     *   \"accessPath\": \"[instance].rowGroupingAPI\",\n     *   \"interfaceName\": \"IRowGroupingApiManager\",\n     *   \"notes\": \"This API is only available for local row model only.\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"feature\",\n     *   \"description\": \"Clears all row grouping.\",\n     *   \"params\": {},\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.rowGroupingAPI.clearRowGrouping();\"\n     *     }\n     *   ]\n     * })\n     */\n    clearRowGrouping(forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)                                    : void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowGroupingAPI\",\n     *   \"accessPath\": \"[instance].rowGroupingAPI\",\n     *   \"interfaceName\": \"IRowGroupingApiManager\",\n     *   \"notes\": \"This API is only available for local row model only.\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"feature\",\n     *   \"description\": \"Returns the active group model array.\",\n     *   \"params\": {},\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"const groups = grid.rowGroupingAPI.getGroupModel();\\nconsole.log('Grouped by:', groups);\"\n     *     }\n     *   ]\n     * })\n     */\n    getGroupModel()                                                                                                 : IGroupModel[];\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"rowGroupingAPI\",\n     *   \"accessPath\": \"[instance].rowGroupingAPI\",\n     *   \"interfaceName\": \"IRowGroupingApiManager\",\n     *   \"notes\": \"This API is only available for local row model only.\",\n     *   \"viewType\": [\"grid\"],\n     *   \"category\": \"feature\",\n     *   \"description\": \"Applies a complete group model.\",\n     *   \"params\": {\n     *     \"groupModel\": \"Group model array\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.rowGroupingAPI.applyRowGrouping([\\n  { columnId: 'department', order: 'ascending' },\\n  { columnId: 'status', order: 'descending' }\\n]);\"\n     *     }\n     *   ]\n     * })\n     */\n    applyRowGrouping(groupModel: IGroupModel[], forceOptionalConfig ?: IForceOption, hookMeta ?: IHookMeta)         : void;\n}\n\nexport {\n    IGroupOder\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { createRowGroupHookAction } from \"./RowGroupingHookHandler\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { IHookMeta } from \"../../Main\";\nimport { IGroupOder, IRowGroupingApiManager } from \"./Interface/IRowGroupingApiManager.types\";\nimport { IGroupModel } from \"../../Core/Interface/IRowGroupingConfigurations\";\nimport { IRowGroupingValidator } from \"./Interface/IRowGroupingValidator.types\";\n\nimport { createRowGroupingValidator } from \"./RowGroupingValidator\";\nimport { IRowGroupingHookHandler } from \"./Interface/IRowGroupingHookHandler.types\";\n\nconst rowGroupingHookMeta : IHookMeta= {\n    eventOrigin : 'api',\n    suppressEventTrigger : false\n}\n\n@Bean(GRID_BEAN_NAME.ROW_GROUPING_API)\nexport class RowGroupingApiManager extends EventEmitter implements IRowGroupingApiManager {\n   \n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName   : getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n\n    private validator   : IRowGroupingValidator;\n    private hookHandler : IRowGroupingHookHandler;\n    @PostConstruct()\n    init() {\n        this.validator   = createRowGroupingValidator(this.getBeanInstanceByBeanName);\n        this.hookHandler = createRowGroupHookAction(this.getBeanInstanceByBeanName);\n    }\n    addRowGrouping(columnId: string, order: IGroupOder, forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = rowGroupingHookMeta): void {\n        const groupModel = [{columnId, order}];\n        this.applyRowGrouping(groupModel, forceOptionalConfig, hookMeta);\n    }\n    clearRowGrouping(forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = rowGroupingHookMeta): void {\n        const rowGroupModel = this.getGroupModel();\n        this.hookHandler.removeRowGroup(rowGroupModel, forceOptionalConfig, hookMeta);\n    }\n    getGroupModel(): IGroupModel[] {\n        return this.recordHandler.getRowGroupingModel();\n    }\n    applyRowGrouping(groupModel: IGroupModel[], forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = rowGroupingHookMeta): void {\n        const isValid = this.validator.validateRowGroupModel(groupModel);\n        isValid ? this.hookHandler.applyRowGroup([...groupModel],forceOptionalConfig,hookMeta) :  null;\n    }\n}","import { EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { IGroupModel } from \"../../Core/Interface/IRowGroupingConfigurations\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { IHookMeta } from \"../../Main\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { IAddRowGroupHookParams, IRemoveRowGroupHookParams, IRowGroupingHookParamProvider ,IRowGroupingHookHandler} from \"./Interface/IRowGroupingHookHandler.types\";\nimport { Events } from \"../../Core/Constants/Events\";\nimport { IRangeSelectionAPI } from \"../RangeSelectionAPI/range-selection-api.types\";\n\nclass RowGroupingParamProvider implements IRowGroupingHookParamProvider {\n    createApplyRowGroupParams(rowGroupModel: IGroupModel[], hookMeta : IHookMeta): IAddRowGroupHookParams {\n        const {eventOrigin, event, userParams} = hookMeta;\n        return { rowGroupModel, eventOrigin, event, userParams };\n    }\n\n    createRemoveRowGroupParams(rowGroupModel: IGroupModel[], hookMeta : IHookMeta): IRemoveRowGroupHookParams {\n        const {eventOrigin, event, userParams} = hookMeta;\n        return { rowGroupModel, eventOrigin, event, userParams };\n    }\n}\n\n/** @internal */\nfunction createRowGroupHookAction(getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n    const rowHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n    const hook       = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    class RowGroupingHookHandler extends EventEmitter implements IRowGroupingHookHandler{\n        private hookParamProvider: RowGroupingParamProvider;\n        constructor(private readonly getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n            super();\n            this.hookParamProvider = new RowGroupingParamProvider();   \n        }\n\n        private clearRangeSelection(): void {\n            const rangeApi = this.getBeanInstanceByBeanName(\"rangeSelectionAPI\") as IRangeSelectionAPI | null;\n            rangeApi?.clearRangeSelection();\n        }\n\n        applyRowGroup(groupModel: IGroupModel[], forceOptionalConfig : IForceOption, hookMeta : IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamProvider.createApplyRowGroupParams(groupModel, hookMeta);\n            const api = () => {\n                const middleHandler = rowHandler.getMiddleHandler();\n                if(useApiCaller){\n                    this.clearRangeSelection();\n                    const existingGroupModel = middleHandler.getGroupModel() ?? [];\n                    const newGroupModel = [...existingGroupModel, ...groupModel];\n                    middleHandler.resetRowGrouping();\n                    middleHandler.applyGroupBy(newGroupModel);\n\n                    this.dispatchEvent({\n                        type        : Events.EVENT_DISPLAYED_ROWS_CHANGED,\n                        recycleRows : true\n                    })\n                    getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER).refreshAfterModelUpdate();\n                }\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowGroupingApplied, HookEventsName.onAfterRowGroupingApplied, api, metas) : api();\n        }\n        removeRowGroup(groupModel: IGroupModel[], forceOptionalConfig : IForceOption, hookMeta : IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamProvider.createRemoveRowGroupParams(groupModel, hookMeta);\n            const api = () => {\n                const middleHandler = rowHandler.getMiddleHandler();\n                if(useApiCaller){\n                    this.clearRangeSelection();\n                    middleHandler.resetRowGrouping();\n                    this.dispatchEvent({\n                        type        : Events.EVENT_DISPLAYED_ROWS_CHANGED,\n                        recycleRows : true\n                    })\n                    getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER).refreshAfterModelUpdate();\n                }\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowGroupingRemove, HookEventsName.onAfterRowGroupingRemove, api, metas) : api();\n        }\n    }\n\n    return new RowGroupingHookHandler(getBeanInstanceByBeanName);\n}\n\nexport {\n    createRowGroupHookAction\n}\n","import { IGroupModel } from \"../../Core/Interface/IRowGroupingConfigurations\";\nimport { IRowGroupingValidator } from \"./Interface/IRowGroupingValidator.types\";\n\n\nfunction createRowGroupingValidator(_getBeanInstanceByBeanName): IRowGroupingValidator {\n    class RowGroupingValidator implements IRowGroupingValidator {\n      validateRowGroupModel(_gropuModel: IGroupModel[]): boolean {\n          return true\n      }\n    }\n    return new RowGroupingValidator()\n}\n\n\nexport{ \n    createRowGroupingValidator\n}\n","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { ISortOrder, ISortModel } from \"../../Core/Interface/ISortConfigurations\";\nimport { ISortApiManager } from \"./Interface/ISortApiManager.types\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { ISortApiValidator } from \"./Interface/ISortApiValidator.types\";\nimport { ISortHookHandler } from \"./Interface/ISortHookHandler.types\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { createSortApiValidator } from \"./SortApiValidator\";\nimport { createSortHookAction } from \"./SortHookHandler\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { IHookMeta } from \"../../Main\";\n\nconst sortHookMeta : IHookMeta = {\n    eventOrigin : 'api',\n    suppressEventTrigger : false\n}\n\n@Bean(GRID_BEAN_NAME.SORT_API)\nexport class SortApiManager extends EventEmitter implements ISortApiManager {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName   : getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n\n    private validator   : ISortApiValidator;\n    private hookHandler : ISortHookHandler;\n    @PostConstruct()\n    init() {\n        this.validator   = createSortApiValidator(this.getBeanInstanceByBeanName);\n        this.hookHandler = createSortHookAction(this.getBeanInstanceByBeanName);\n    }\n    addSort(columnId: string, order: ISortOrder, forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = sortHookMeta): void {\n        const sortModel = [{columnId, order}];\n        this.applySort(sortModel, forceOptionalConfig, hookMeta);\n    }\n    clearSort(forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = sortHookMeta): void {\n        const sortModel = this.getSortModel();\n        this.hookHandler.removeSort(sortModel, forceOptionalConfig, hookMeta);\n    }\n    getSortModel(): ISortModel[] {\n        const middleHandler = this.recordHandler.getMiddleHandler();\n        return middleHandler.getSortModel();\n    }\n    applySort(sortModel: ISortModel[], forceOptionalConfig : IForceOption = {}, hookMeta : IHookMeta = sortHookMeta): void {\n        const isValid = this.validator.validateSortModel(sortModel);\n        if(isValid){\n            const existingSortModel = this.getSortModel() ?? [];\n            this.hookHandler.applySort([...existingSortModel, ...sortModel], forceOptionalConfig, hookMeta);\n        }\n    }\n}","import { ISortModel } from \"../../Core/Interface/ISortConfigurations\";\nimport { ISortApiValidator } from \"./Interface/ISortApiValidator.types\";\n\nexport function createSortApiValidator(_getBeanInstanceByBeanName): ISortApiValidator {\n    class SortApiValidator implements ISortApiValidator {\n        validateSortModel(_sortModel: ISortModel[]): boolean {\n            return true\n        }\n    }\n    return new SortApiValidator()\n}\n\n","import { EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { ISortModel } from \"../../Core/Interface/ISortConfigurations\";\nimport { IAddSortHookParams, IRemoveSortHookParams, ISortHookHandler, ISortHookParamProvider } from \"./Interface/ISortHookHandler.types\";\nimport { IHookMeta } from \"../../Main\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { Events } from \"../../Core/Constants/Events\";\n\nclass SortHookParamProvider implements ISortHookParamProvider {\n    createApplySortParams(sortModel: ISortModel[], hookMeta : IHookMeta): IAddSortHookParams {\n        const {eventOrigin, event, userParams} = hookMeta;\n        return { sortModel, eventOrigin, event, userParams };\n    }\n\n    createRemoveSortParams(sortModel: ISortModel[], hookMeta : IHookMeta): IRemoveSortHookParams {\n        const {eventOrigin, event, userParams} = hookMeta;\n        return { sortModel, eventOrigin, event, userParams };\n    }\n}\n\n\n/** @internal */\nexport function createSortHookAction(getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n    const rowHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n    const hook       = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n    \n    class SortHookHandler extends EventEmitter implements ISortHookHandler {\n        private hookParamProvider: SortHookParamProvider;\n        constructor() {\n            super();\n            this.hookParamProvider = new SortHookParamProvider();   \n        }\n\n        applySort(sortModel: ISortModel[], forceOptionalConfig : IForceOption, hookMeta : IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n                  hookMeta.userParams                   = forceOptionalConfig.userParams ?? null;\n            const metas                         = this.hookParamProvider.createApplySortParams(sortModel, hookMeta);\n            const api                                   = () => {\n                const middleHandler = rowHandler.getMiddleHandler();\n                if(useApiCaller){\n                    const existingSortModel = middleHandler.getSortModel() ?? [];\n                    const newSortModel = [...existingSortModel, ...sortModel];\n                    middleHandler.resetSort();\n                    middleHandler.applySort(newSortModel);\n                    this.dispatchEvent({\n                        type        : Events.EVENT_DISPLAYED_ROWS_CHANGED,\n                        recycleRows : true\n                    })\n\n                    getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER).refreshAfterModelUpdate();\n                }\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowSortApplied, HookEventsName.onAfterRowSortApplied, api, metas) : api();\n        }\n        \n        removeSort(sortModel: ISortModel[], forceOptionalConfig : IForceOption, hookMeta : IHookMeta): void {\n            const {suppressEventTrigger = false, useApiCaller = true} = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n            const metas = this.hookParamProvider.createRemoveSortParams(sortModel, hookMeta);\n            const api = () => {\n                const middleHandler = rowHandler.getMiddleHandler();\n                if(useApiCaller){\n                    middleHandler.resetSort();\n\n                    this.dispatchEvent({\n                        type        : Events.EVENT_DISPLAYED_ROWS_CHANGED,\n                        recycleRows : true\n                    })\n                    getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER).refreshAfterModelUpdate();\n                }\n            }\n            !suppressEventTrigger ? hook.executeHook(HookEventsName.onBeforeRowSortRemove, HookEventsName.onAfterRowSortRemove, api, metas) : api();\n        }\n    }\n\n    return new SortHookHandler();\n}","import { IHookMeta } from \"../../../Interface/Hooks\";\nimport { IForceOption, IRowMeta } from \"../../CommonAPIInterface\";\n\n/**\n * Represents a tree node identifier - can be by row ID or by index with parentKeys\n */\nexport interface ITreeNodeMeta extends IRowMeta {\n    rowId?: string;\n}\n\n/**\n * Parameters for expand/collapse operations\n */\nexport interface IExpandCollapseParams {\n    recursive?: boolean;\n}\n\n/**\n * Hook parameters for tree expand operations\n */\nexport interface ITreeExpandCollapseHookParams {\n    rowId       : string;\n    rowIndex    : number;\n    parentKeys  : string[];\n    recursive   : boolean;\n    eventOrigin?: string;\n    event      ?: Event;\n    userParams ?: any;\n}\n\n/**\n * Hook parameters for expand/collapse all operations\n */\nexport interface ITreeExpandCollapseAllHookParams {\n    eventOrigin?: string;\n    event      ?: Event;\n    userParams ?: any;\n}\n\n/**\n * Tree API Manager interface - provides methods for tree operations\n */\n\nexport interface ITreeExpandCollapseMetas {\n    groupId : string;\n    recursive ?: boolean;\n}\n\n\nexport interface ITreeApiManager {\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"treeAPI\",\n     *   \"accessPath\": \"[instance].treeAPI\",\n     *   \"interfaceName\": \"ITreeAPIInteracter\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"feature\",\n     *   \"description\": \"Expands one or more tree groups.\",\n     *   \"params\": {\n     *     \"metas\": \"Array of { groupId: string, recursive?: boolean }\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"// Expand a single group\\ngrid.treeAPI.expandGroups([{ groupId: 'department-engineering' }]);\\n\\n// Expand recursively\\ngrid.treeAPI.expandGroups([{ groupId: 'root', recursive: true }]);\"\n     *     }\n     *   ]\n     * })\n     */\n    expandGroups(expandMetas: ITreeExpandCollapseMetas[], forceOptionalConfig?: IForceOption, hookMeta?: IHookMeta): void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"treeAPI\",\n     *   \"accessPath\": \"[instance].treeAPI\",\n     *   \"interfaceName\": \"ITreeAPIInteracter\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"feature\",\n     *   \"description\": \"Collapses one or more tree groups.\",\n     *   \"params\": {\n     *     \"metas\": \"Array of { groupId: string, recursive?: boolean }\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.treeAPI.collapseGroups([{ groupId: 'department-engineering' }]);\"\n     *     }\n     *   ]\n     * })\n     */\n    collapseGroups(collapseMetas: ITreeExpandCollapseMetas[], forceOptionalConfig?: IForceOption, hookMeta?: IHookMeta): void;\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"treeAPI\",\n     *   \"accessPath\": \"[instance].treeAPI\",\n     *   \"interfaceName\": \"ITreeAPIInteracter\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"feature\",\n     *   \"description\": \"Checks if a group is currently expanded.\",\n     *   \"params\": {\n     *     \"groupId\": \"Group ID to check\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"if (grid.treeAPI.isGroupExpanded('department-engineering')) {\\n  console.log('Engineering group is expanded');\\n}\"\n     *     }\n     *   ]\n     * })\n     */\n    isGroupExpanded(groupId: string): boolean;\n\n    /**\n     * @feedMcp_api({\n     *   \"apiName\": \"treeAPI\",\n     *   \"accessPath\": \"[instance].treeAPI\",\n     *   \"interfaceName\": \"ITreeApiManager\",\n     *   \"viewType\": [\"grid\", \"list\", \"gallery\"],\n     *   \"category\": \"feature\",\n     *   \"description\": \"Toggles a group expanded state.\",\n     *   \"params\": {\n     *     \"groupId\": \"Group ID to toggle\",\n     *     \"forceOptionalConfig\": \"Force optional configuration\"\n     *   },\n     *   \"examples\": [\n     *     {\n     *       \"title\": \"Basic\",\n     *       \"code\": \"grid.treeAPI.toggleGroup('department-engineering');\"\n     *     }\n     *   ]\n     * })\n     */\n    toggleGroup(groupId: string, forceOptionalConfig?: IForceOption, hookMeta?: IHookMeta): void;\n}\n \nexport interface ITreeApiValidator {\n    validateExpandCollapseMetas(expandCollapseMetas: ITreeExpandCollapseMetas[], forceOptionalConfig?: IForceOption): boolean;\n}\n \nexport interface ITreeApiHookHandler {\n    expandGroups(expandMetas: ITreeExpandCollapseMetas[], forceOptionalConfig?: IForceOption, hookMeta?: IHookMeta): void;\n    collapseGroups(collapseMetas: ITreeExpandCollapseMetas[], forceOptionalConfig?: IForceOption, hookMeta?: IHookMeta): void;\n}\n\nexport {\n    ITreeApiManager as ITreeApi\n};\n\n","import { EventEmitter } from \"@dg/corecomponent\";\nimport { ITreeExpandCollapseMetas } from \"./Interface/ITreeApi\";\nimport { IGroupedRowNodeCore } from \"../../../DataStore/group-rownode.types\";\n\nexport interface ITreeAPIInteracter {\n    expandGroups(metas: ITreeExpandCollapseMetas[]): void;\n    collapseGroups(metas: ITreeExpandCollapseMetas[]): void;\n    isGroupExpanded(groupId: string): boolean;\n}\n\nexport class TreeAPIInteracter extends EventEmitter implements ITreeAPIInteracter {\n    private getRowNodeById: (groupId: string) => IGroupedRowNodeCore | null;\n\n    constructor(getRowNodeById: (groupId: string) => IGroupedRowNodeCore | null) {\n        super();\n        this.getRowNodeById = getRowNodeById;\n    }\n\n    expandGroups(metas: ITreeExpandCollapseMetas[]): void {\n        metas.forEach(meta => {\n            const { groupId, recursive = false } = meta;\n            const rowNode = this.getRowNodeById(groupId);\n            if (rowNode && rowNode.expand) {\n                rowNode.expand({recursive : recursive});\n            }\n        });\n    }\n\n    collapseGroups(metas: ITreeExpandCollapseMetas[]): void {\n        metas.forEach(meta => {\n            const { groupId, recursive = false } = meta;\n            const rowNode = this.getRowNodeById(groupId);\n            if (rowNode && rowNode.collapse) {\n                rowNode.collapse(recursive);\n            }\n        });\n    }\n\n    isGroupExpanded(groupId: string): boolean {\n        const rowNode = this.getRowNodeById(groupId);\n        if (!rowNode || !rowNode.isCollapsed) {\n            return false;\n        }\n        return !rowNode.isCollapsed();\n    }\n}\n\n","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { ITreeApiHookHandler, ITreeExpandCollapseMetas } from \"./Interface/ITreeApi\";\nimport { ITreeAPIInteracter } from \"./TreeAPIInteracter\";\n\ninterface ITreeExpandCollapseHookParams {\n    metas: ITreeExpandCollapseMetas[];\n    eventOrigin?: string;\n    event?: Event;\n    userParams?: any;\n}\n\nfunction createTreeApiHookHandler(getBeanInstanceByBeanName: getBeanInstanceByBeanName, interacter: ITreeAPIInteracter): ITreeApiHookHandler {\n    const hook = getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER) as IHookManager;\n\n    class TreeApiHookHandler implements ITreeApiHookHandler {\n\n        private createHookParams(metas: ITreeExpandCollapseMetas[], hookMeta: IHookMeta): ITreeExpandCollapseHookParams {\n            const { eventOrigin, event, userParams } = hookMeta;\n            return {\n                metas,\n                eventOrigin,\n                event,\n                userParams\n            };\n        }\n\n        expandGroups(expandMetas: ITreeExpandCollapseMetas[], forceOptionalConfig: IForceOption = {}, hookMeta: IHookMeta = {}): void {\n            const { suppressEventTrigger = false } = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n\n            const params = this.createHookParams(expandMetas, hookMeta);\n\n            const api = () => {\n                interacter.expandGroups(expandMetas);\n            };\n\n            !suppressEventTrigger\n                ? hook.executeHook(HookEventsName.onBeforeGroupExpand, HookEventsName.onAfterGroupExpand, api, params)\n                : api();\n        }\n\n        collapseGroups(collapseMetas: ITreeExpandCollapseMetas[], forceOptionalConfig: IForceOption = {}, hookMeta: IHookMeta = {}): void {\n            const { suppressEventTrigger = false } = hookMeta;\n            hookMeta.userParams = forceOptionalConfig.userParams ?? null;\n\n            const params = this.createHookParams(collapseMetas, hookMeta);\n\n            const api = () => {\n                interacter.collapseGroups(collapseMetas);\n            };\n\n            !suppressEventTrigger\n                ? hook.executeHook(HookEventsName.onBeforeGroupExpand, HookEventsName.onAfterGroupExpand, api, params)\n                : api();\n        }\n    }\n\n    return new TreeApiHookHandler();\n}\n\nexport {\n    createTreeApiHookHandler\n};\n","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { IHookMeta } from \"../../Interface/Hooks\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { IGroupedRowNodeCore } from \"../../../DataStore/group-rownode.types\";\nimport { ITreeApiManager, ITreeApiValidator, ITreeApiHookHandler, ITreeExpandCollapseMetas } from \"./Interface/ITreeApi\";\nimport { createTreeApiValidator } from \"./TreeApiValidator\";\nimport { createTreeApiHookHandler } from \"./TreeApiHookHandler\";\nimport { TreeAPIInteracter, ITreeAPIInteracter } from \"./TreeAPIInteracter\";\nimport { IBlockInsertMeta } from \"DataStore/rowblock-handler.types\";\nimport { IRowAPIManager, MovePosition } from \"Grid/ListMain\";\n\nconst treeHookMeta: IHookMeta = {\n    eventOrigin: 'api',\n    suppressEventTrigger: false\n};\n\n@Bean(GRID_BEAN_NAME.TREE_API)\nexport class TreeApiManager extends EventEmitter implements ITreeApiManager {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler: IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_API) private rowApi: IRowAPIManager;\n\n    private validator: ITreeApiValidator;\n    private hookHandler: ITreeApiHookHandler;\n    private interacter: ITreeAPIInteracter;\n\n    @PostConstruct()\n    init() {\n        const getRowNodeById = (groupId: string) => this.recordHandler.getRowNodeById(groupId) as IGroupedRowNodeCore;\n        \n        this.interacter = this.createManagedBean(new TreeAPIInteracter(getRowNodeById));\n        this.validator = createTreeApiValidator(this.getBeanInstanceByBeanName);\n        this.hookHandler = createTreeApiHookHandler(this.getBeanInstanceByBeanName, this.interacter);\n    }\n\n    expandGroups(expandMetas: ITreeExpandCollapseMetas[], forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = treeHookMeta): void {\n        const metasCopy = [...expandMetas];\n        const isValid = this.validator.validateExpandCollapseMetas(metasCopy, forceOptionalConfig);\n        if (isValid) {\n            this.hookHandler.expandGroups(metasCopy, forceOptionalConfig, hookMeta);\n        }\n    }\n\n    collapseGroups(collapseMetas: ITreeExpandCollapseMetas[], forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = treeHookMeta): void {\n        const metasCopy = [...collapseMetas];\n        const isValid = this.validator.validateExpandCollapseMetas(metasCopy, forceOptionalConfig);\n        if (isValid) {\n            this.hookHandler.collapseGroups(metasCopy, forceOptionalConfig, hookMeta);\n        }\n    }\n\n    isGroupExpanded(groupId: string): boolean {\n        return this.interacter.isGroupExpanded(groupId);\n    }\n\n    toggleGroup(groupId: string, forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = treeHookMeta): void {\n        const isExpanded = this.isGroupExpanded(groupId);\n        const meta: ITreeExpandCollapseMetas = { groupId };\n        \n        if (isExpanded) {\n            this.collapseGroups([meta], forceOptionalConfig, hookMeta);\n        } else {\n            this.expandGroups([meta], forceOptionalConfig, hookMeta);\n        }\n    }\n\n    expandAll(recursive?: boolean, forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = treeHookMeta): void {\n        const middleHandler = this.recordHandler.getMiddleHandler() as any;\n        const children = middleHandler.getDirectChildren(middleHandler.getRootNode());\n        const metas = children.map(child => ({ groupId : child.getId(), recursive }));\n        this.expandGroups(metas, forceOptionalConfig, hookMeta);\n    }\n\n    collapseAll(recursive?: boolean, forceOptionalConfig?: IForceOption, hookMeta: IHookMeta = treeHookMeta): void {\n        const middleHandler = this.recordHandler.getMiddleHandler() as any;\n        const children = middleHandler.getDirectChildren(middleHandler.getRootNode());\n        const metas = children.map(child => ({ groupId : child.getId(), recursive }));\n        this.collapseGroups(metas, forceOptionalConfig, hookMeta);\n    }\n\n    appendGroupsById(rowInsertMeta : IBlockInsertMeta, groupRowId ?: string) : void{\n        const middleHandler = this.recordHandler.getMiddleHandler() as any;\n        const groupRowNode = groupRowId ? this.recordHandler.getRowNodeById(groupRowId) as IGroupedRowNodeCore : middleHandler.getRootNode();\n        const lastIndex = groupRowNode.getChildCount()-1;\n        this.rowApi.insertRowsAtBlock(rowInsertMeta, lastIndex, groupRowNode.getGroupValues(), 'after');\n    }\n\n    removeGroupsById(groupRowIds : string[],forceOptionalConfig ?: IForceOption, hookMeta : IHookMeta = treeHookMeta) : void {\n        this.rowApi.removeRowsById(groupRowIds, forceOptionalConfig, hookMeta);\n    }\n\n    insertRowsAtBlock(rowInsertMeta : IBlockInsertMeta, rowIndex : number, parentKeys : string[], insertPosition : MovePosition) : void {\n        this.rowApi.insertRowsAtBlock(rowInsertMeta, rowIndex, parentKeys, insertPosition);\n    }\n \n    insertRowsAtBlockByIds(insertMetas : (IBlockInsertMeta & {groupId : string, insertPosition : MovePosition})[]) : void {\n        for(const insertMeta of insertMetas){\n            const middleHandler = this.recordHandler.getMiddleHandler() as any;\n            const groupId       = insertMeta.groupId ?? middleHandler.getRootNode().getId();\n            const groupRowNode  = this.recordHandler.getRowNodeById(groupId) as IGroupedRowNodeCore;\n            const rowMeta       = groupRowNode.getRowMeta();\n            this.rowApi.insertRowsAtBlock(insertMeta, rowMeta.rowIndex, rowMeta.parentKeys, insertMeta.insertPosition);\n        }\n    }\n}\n","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { IForceOption } from \"../CommonAPIInterface\";\nimport { ITreeApiValidator } from \"./Interface/ITreeApi\";\nimport { IGroupedRowNodeCore } from \"../../../DataStore/group-rownode.types\";\n\ninterface ITreeExpandCollapseMetas {\n    groupId: string;\n    recursive?: boolean;\n}\n\nfunction createTreeApiValidator(getBeanInstanceByBeanName: getBeanInstanceByBeanName): ITreeApiValidator {\n    const recordHandler = getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n\n    class TreeApiValidator implements ITreeApiValidator {\n        \n        private isValidGroupId(groupId: string): boolean {\n            if (!groupId) {\n                console.warn('TreeAPI: groupId is required.');\n                return false;\n            }\n\n            const rowNode = recordHandler.getRowNodeById(groupId);\n            if (!rowNode) {\n                console.warn(`TreeAPI: Group with id \"${groupId}\" not found.`);\n                return false;\n            }\n\n            return true;\n        }\n\n        private isGroupNode(groupId: string): boolean {\n            const rowNode = recordHandler.getRowNodeById(groupId) as IGroupedRowNodeCore;\n            if (!rowNode) {\n                return false;\n            }\n\n            // Check if node is a group node (expandable)\n            return rowNode.isExpandable?.() || rowNode.isGroupRow?.() || rowNode.hasChildren?.() || false;\n        }\n\n        validateExpandCollapseMetas(expandCollapseMetas: ITreeExpandCollapseMetas[], _forceOptionalConfig?: IForceOption): boolean {\n            if (!expandCollapseMetas || expandCollapseMetas.length === 0) {\n                console.warn('TreeAPI: expandCollapseMetas array is empty.');\n                return false;\n            }\n\n            // Filter out invalid metas but continue with valid ones\n            const validMetas = expandCollapseMetas.filter(meta => {\n                const isValid = this.isValidGroupId(meta.groupId);\n                const isGroup = isValid && this.isGroupNode(meta.groupId);\n                \n                if (!isGroup && isValid) {\n                    console.warn(`TreeAPI: Node \"${meta.groupId}\" is not a group node.`);\n                }\n                \n                return isValid && isGroup;\n            });\n\n            // Update the original array with only valid metas\n            expandCollapseMetas.length = 0;\n            expandCollapseMetas.push(...validMetas);\n\n            return validMetas.length > 0;\n        }\n    }\n\n    return new TreeApiValidator();\n}\n\nexport {\n    createTreeApiValidator\n};\n","import { EventEmitter, Bean, AutoWired, PostConstruct } from \"@dg/corecomponent\";\nimport { ScrollPositionType } from \"./navigation-api.types\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IControllerHandler, IPaneControllerParam } from \"../../Core/Interface/IControllerHandler\";\nimport { GridBodyScrollHandler } from \"../../Core/GridBodyScrollHandler\";\nimport { IListNavigationAPI } from \"./list-navigation-api.types\";\n\n@Bean('listNavigationAPI')\nexport class ListNavigationAPI extends EventEmitter implements IListNavigationAPI {\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler: IControllerHandler;\n    private    scrollHandler                                               : GridBodyScrollHandler;\n\n    @PostConstruct()\n    init() : void {\n        this.controllerHandler.onAfterGridReady((params : IPaneControllerParam) => {\n            const bodyController = params.bodyController;\n            this.scrollHandler = bodyController.getScrollHandler();\n        })\n    }\n\n   \n    scrollBy(x : number, y : number) : void {\n        this.scrollHandler.scrollBy(x, y);\n    }\n\n    scrollTo(x : number, y : number) : void {\n        this.scrollHandler.scrollTo(x, y);\n    }\n\n   \n\n    getScrollPosition() :ScrollPositionType {\n        return this.scrollHandler.getScrollPosition();\n    }\n\n    ensureIndexVisible(index: number,parentKeys : string[] = [], position?: 'top' | 'bottom' | 'middle' | null) : void {\n        this.scrollHandler.ensureIndexVisible(index, parentKeys ,position);\n    }\n\n    ensureColumnVisible(key: any, position: 'auto' | 'start' | 'middle' | 'end' = 'auto'): void {\n        this.scrollHandler.ensureColumnVisible(key, position);\n    }\n\n\n        \n\n\n\n}","import { EventEmitter, Bean, AutoWired, PostConstruct, BEAN_NAME } from \"@dg/corecomponent\";\nimport { IFocusParams, INavigationAPI, ScrollPositionType } from \"./navigation-api.types\";\nimport { CellPositionType, RowPositionType } from \"../../Core/Navigation/cell-position.types\";\nimport { CellFocusParams, IFocusHandler } from \"../../Core/Navigation/focus-handler.types\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { INavigationHandler } from \"../../Core/Navigation/navigation-handler.types\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { IControllerHandler, IPaneControllerParam } from \"../../Core/Interface/IControllerHandler\";\nimport { GridBodyScrollHandler } from \"../../Core/GridBodyScrollHandler\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { GridOptioHandler } from \"../../Core/GridOptionHandler\";\n\n@Bean('navigationAPI')\nexport class NavigationAPI extends EventEmitter implements INavigationAPI {\n    @AutoWired('navigationService') private navigationService              : INavigationHandler;\n    @AutoWired('focusHandler') private focusHandler                        : IFocusHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler        : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler          : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler: IControllerHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: GridOptioHandler;\n    private    scrollHandler                                               : GridBodyScrollHandler;\n\n    @PostConstruct()\n    init() : void {\n        this.controllerHandler.onAfterGridReady((params : IPaneControllerParam) => {\n            const bodyController = params.bodyController;\n            this.scrollHandler = bodyController.getScrollHandler();\n        })\n    }\n\n    setFocusToCell(cellPosition: CellPositionType, params : IFocusParams = {scrollOnFocus : false, range : true, focus :true} ): void {\n        const {scrollOnFocus, range, focus} = {...{scrollOnFocus : false, range : true, focus :true}, ...params};\n\n        const focusedParams : CellFocusParams = {\n            ...cellPosition,\n        }\n        scrollOnFocus && this.navigationService.ensureCellVisible(focusedParams);\n        this.navigationService.focusPosition(focusedParams, null, 'api', range, scrollOnFocus, focus);\n    }\n\n    getFocusedCell(): CellPositionType | null {\n       return this.focusHandler.getFocusedCellPosition();\n    }\n    \n    clearFocusedCell(): void {\n        this.navigationService.focusPosition({\n            rowIndex : null,\n            pinPosition : null,\n            columnID : null,\n            parentKeys : []\n        }, null, 'api', true, true);\n    }\n    setFocusToCellById(rowId: string, columnId: string, params : IFocusParams = {scrollOnFocus : false, range : true, focus :true}): void {\n        const rowPosition = this.recordHandler.getIndexMetaById(rowId);\n        if(!rowPosition) {\n            return;\n        }\n        const cellPosition = {\n            rowIndex : rowPosition.rowIndex,\n            pinPosition: rowPosition.pinPosition,\n            columnID : columnId,\n            parentKeys : rowPosition.parentKeys\n        }\n\n        if(!this.isCellExist(cellPosition)) {\n            return;\n        }\n        this.navigationService.focusPosition(cellPosition, null, 'api', params.range, params.scrollOnFocus, params.focus);\n    }\n\n    scrollBy(x : number, y : number) : void {\n        this.scrollHandler.scrollBy(x, y);\n    }\n\n    scrollTo(x : number, y : number) : void {\n        this.scrollHandler.scrollTo(x, y);\n    }\n\n    navigateToCellTop(): void {\n        const focusedCell = this.focusHandler.getFocusedCellPosition();\n\n        this.navigationService.navigateToCellUp(focusedCell, null);\n    }\n\n    navigateToCellBottom(): void {\n        const focusedCell = this.focusHandler.getFocusedCellPosition();\n\n        this.navigationService.navigateToCellDown(focusedCell, null);\n    }\n\n    navigateToCellLeft(): void {\n        const focusedCell = this.focusHandler.getFocusedCellPosition();\n\n        this.navigationService.navigateToCellLeft(focusedCell, null);\n    }\n\n    navigateToCellRight(): void {\n        const focusedCell = this.focusHandler.getFocusedCellPosition();\n\n        this.navigationService.navigateToCellRight(focusedCell, null);\n    }\n\n    getScrollPosition() :ScrollPositionType {\n        return this.scrollHandler.getScrollPosition();\n    }\n\n    ensureIndexVisible(index: number,parentKeys : string[] = [], position?: 'top' | 'bottom' | 'middle' | null) {\n        this.scrollHandler.ensureIndexVisible(index, parentKeys, position);\n    }\n\n    ensureColumnVisible(key: any, position: 'auto' | 'start' | 'middle' | 'end' = 'auto'): void {\n        this.scrollHandler.ensureColumnVisible(key, position);\n    }\n\n    private isCellExist(cellPosition : CellPositionType) : boolean {\n        if(!cellPosition){\n            return false;\n        }\n        const isRowExist = this.isRowExist(cellPosition);\n        const isColumnExist = !!this.fieldHandler.getColumnNodeByID(cellPosition.columnID);\n        return isRowExist && isColumnExist;\n    }\n\n    private isRowExist(rowPosition : RowPositionType) : boolean {\n        return this.recordHandler.isValidRowMeta(rowPosition);\n    }\n        \n    enableCellInnerNavigation(): void {\n        const focusedCell = this.getFocusedCell();\n        if (focusedCell) {\n            const cellController = this.navigationService.getCellController(focusedCell);\n            cellController?.setFocustoTrapElements();\n        }\n    }\n\n    disableCellInnerNavigation(): void {\n        const focusedCell = this.getFocusedCell();\n        if (focusedCell) {\n            const cellController = this.navigationService.getCellController(focusedCell);\n            cellController?.removeFocustoTrapElements();\n        }\n    }\n\n\n\n}","import { EventEmitter, AutoWired } from \"@dg/corecomponent\";\nimport { IColumnSelectionAPI } from \"./selection-api.types\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { ColumnSelection } from \"../../../Selection/column-selection\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\n\nexport class ColumnSelectionAPIValidator extends EventEmitter implements IColumnSelectionAPI {\n    \n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler : FieldHandler;\n    @AutoWired('columnSelection') private columnSelection : ColumnSelection;\n\n    // column selection started\n    selectColumn(columnId: string): void {\n        if(!this.isColumnExist(columnId)) {\n            return;\n        }\n\n        this.columnSelection.setColumnSelected({\n            ids : [columnId],\n            newValue : true,\n            source : 'api'\n        })\n    }\n    selectColumns(columnIds: string[]): void {\n        const validColumnIds = columnIds.filter(columnId => this.isColumnExist(columnId)); \n    \n        if (validColumnIds.length === 0) {\n            return;\n        }\n    \n        this.columnSelection.setColumnSelected({\n            ids: validColumnIds,\n            newValue: true,\n            source: 'api'\n        });\n    }\n    \n    deSelectColumns(columnIds: string[]): void {\n        const validColumnIds = columnIds.filter(columnId => this.isColumnExist(columnId)); \n    \n        if (validColumnIds.length === 0) {\n            return;\n        }\n    \n        this.columnSelection.setColumnSelected({\n            ids: validColumnIds,\n            newValue: false,\n            source: 'api'\n        });\n    }\n    \n    deSelectColumn(columnId: string): void {\n        if (!this.isColumnExist(columnId)) {\n            return;\n        }\n    \n        this.columnSelection.setColumnSelected({\n            ids: [columnId],\n            newValue: false,\n            source: 'api'\n        });\n    }\n    \n    getSelectedColumns(): string[] {\n        return this.columnSelection.getSelectedColumns();\n    }\n    \n    isColumnSelected(columnId: string): boolean {\n        return this.columnSelection.isColumnSelected(columnId);\n    }\n\n    clearAllColumnSelection() : void {\n        this.columnSelection.clearSelection({source : 'api'});\n    }\n    \n\n    // column selection ended\n\n    private isColumnExist(columnId : string) : boolean {\n        return !!this.fieldHandler.getColumnNodeByID(columnId);\n    }\n    \n}","import { EventEmitter, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { IColumnSelectionAPI } from \"./selection-api.types\";\nimport { ColumnSelectionAPIValidator } from \"./column-selection-api-validator\";\n\n@Bean('columnSelectionAPI')\nexport class ColumnSelectionAPI extends EventEmitter implements IColumnSelectionAPI {\n\n    private selectionAPIValidator : IColumnSelectionAPI;\n\n    @PostConstruct()\n    init() :void {\n        this.selectionAPIValidator = this.createManagedBean(new ColumnSelectionAPIValidator());\n    }\n\n    selectColumn(columnId: string): void {\n        this.selectionAPIValidator.selectColumn(columnId);\n    }\n    selectColumns(columnIds: string[]): void {\n        this.selectionAPIValidator.selectColumns(columnIds);\n    }\n    deSelectColumns(columnIds: string[]): void {\n        this.selectionAPIValidator.deSelectColumns(columnIds);\n    }\n    deSelectColumn(columnId: string): void {\n        this.selectionAPIValidator.deSelectColumn(columnId);\n    }\n    getSelectedColumns(): string[] {\n        return this.selectionAPIValidator.getSelectedColumns();\n    }\n    isColumnSelected(columnId: string): boolean {\n        return this.selectionAPIValidator.isColumnSelected(columnId);\n    }  \n    \n    clearAllColumnSelection() : void {\n        this.selectionAPIValidator.clearAllColumnSelection();\n    }\n}","import { EventEmitter, AutoWired } from \"@dg/corecomponent\";\nimport { IRowSelectionAPI } from \"./selection-api.types\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { RowSelection } from \"../../../Selection/row-selection\";\nimport { RowIdType, RowType } from \"../../../Selection/row-selection/row-selection.types\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\n\nexport class RowSelectionAPIValidator extends EventEmitter implements IRowSelectionAPI {\n    \n    \n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired('RowSelectionHandler') private rowSelectionHandler : RowSelection;\n    selectRow(rowID: string): void {\n        if(!this.isRowExist(rowID)) {\n            return;\n        }\n\n        this.rowSelectionHandler.setRowSelected({\n            values :[{rowID}] as RowType[],\n            selected : true,\n            source : 'api'\n        })\n    }\n    selectRows(rowIds: string[]): void {\n        const validRowIds = rowIds.filter(rowId => this.isRowExist(rowId));\n    \n        if (validRowIds.length === 0) {\n            return;\n        }\n    \n        this.rowSelectionHandler.setRowSelected({\n            values     : validRowIds.map((value) => ({ rowID: value })) as RowType[],\n            selected: true,\n            source  : 'api'\n        });\n    }\n    \n    deSelectRows(rowIds: string[]): void {\n        const validRowIds = rowIds.filter(rowId => this.isRowExist(rowId));\n    \n        if (validRowIds.length === 0) {\n            return;\n        }\n    \n        this.rowSelectionHandler.setRowSelected({\n            values     : validRowIds.map((value) => ({ rowID: value })) as RowType[],\n            selected: false,\n            source  : 'api'\n        });\n    }\n    \n    deSelectRow(rowID: string): void {\n        if(!this.isRowExist(rowID)) {\n            return;\n        }\n\n        this.rowSelectionHandler.setRowSelected({\n            values     : [{rowID}] as RowType[],\n            selected: false,\n            source  : 'api'\n        })\n    }\n    getSelectedRows(): string[] {\n       return this.rowSelectionHandler.getSelectedRows();\n    }\n    isRowSelected(rowID: string): boolean {\n        return this.rowSelectionHandler.isRowSelected({rowID} as RowIdType);\n    }\n\n    selectAllRows(): void {\n        this.rowSelectionHandler.selectAllRows({source : 'api'});\n    }\n\n    deSelectAllRows(): void {\n        this.rowSelectionHandler.deselectAllRows({source : 'api'});\n    }\n\n    private isRowExist(rowId: string): boolean {\n        const rowPosition = this.recordHandler.getIndexMetaById(rowId);\n        if(rowPosition){\n            const topHandler = this.recordHandler.getTopHandler();\n            const centerHandler = this.recordHandler.getMiddleHandler();\n            const bottomHandler = this.recordHandler.getBottomHandler();\n            switch(rowPosition?.pinPosition) {\n                case 'top':\n                    return !!topHandler.getRowNode(rowPosition.rowIndex);\n                case 'bottom':\n                    return !!bottomHandler.getRowNode(rowPosition.rowIndex);\n                case 'middle':\n                    return !!centerHandler.getRowNode(rowPosition.rowIndex);\n            }\n    \n            return true;\n        }\n        return false;\n    }\n\n    getSelectedRowCount(): number {\n        return this.rowSelectionHandler.getSelectionCount();\n    }\n}","import { EventEmitter, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { IRowSelectionAPI } from \"./selection-api.types\";\nimport { RowSelectionAPIValidator } from \"./row-selection-api-validator\";\n\n@Bean('rowSelectionAPI')\nexport class RowSelectionAPI extends EventEmitter implements IRowSelectionAPI {\n\n    private selectionAPIValidator : IRowSelectionAPI;\n\n    @PostConstruct()\n    init() :void {\n        this.selectionAPIValidator = this.createManagedBean(new RowSelectionAPIValidator());\n    }\n\n    selectRow(rowId: string): void {\n        this.selectionAPIValidator.selectRow(rowId);\n    }\n    selectRows(rowIds: string[]): void {\n        this.selectionAPIValidator.selectRows(rowIds);\n    }\n    deSelectRows(rowIds: string[]): void {\n        this.selectionAPIValidator.deSelectRows(rowIds);\n    }\n    deSelectRow(rowId: string): void {\n        this.selectionAPIValidator.deSelectRow(rowId);\n    }\n    getSelectedRows(): string[] {\n        return this.selectionAPIValidator.getSelectedRows();\n    }\n    isRowSelected(rowId: string): boolean {\n        return this.selectionAPIValidator.isRowSelected(rowId);\n    }\n\n    selectAllRows(): void {\n        this.selectionAPIValidator.selectAllRows();\n    }\n\n    deSelectAllRows(): void {\n        this.selectionAPIValidator.deSelectAllRows();\n    }\n\n    getSelectedRowCount(): number {\n        return this.selectionAPIValidator.getSelectedRowCount();\n    }\n}","import { EventEmitter, AutoWired } from \"@dg/corecomponent\";\nimport { IRowSelectionIndexAPI } from \"../selection-api.types\";\nimport { RowSelectionIndexHandler } from \"../../../../Selection/row-selection/row-selection-index\";\n// import { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { RowIndexType, RowType, SelectedRowRange } from \"../../../../Selection/row-selection/row-selection.types\";\nexport class RowSelectionIndexAPIValidator extends EventEmitter implements IRowSelectionIndexAPI {\n    \n    \n    @AutoWired('RowSelectionHandler') private rowSelectionHandler : RowSelectionIndexHandler;\n    selectRow(fromRow: RowIndexType, toRow: RowIndexType): void {\n        // if(!this.isRowExist(rowID)) {\n        //     return;\n        // }\n        this.rowSelectionHandler.addRange([{ from : fromRow, to : toRow ? toRow : fromRow }], { selected : true, source : 'api', values : [] })\n    }\n    selectRows(selectedRows: SelectedRowRange[]): void {\n        this.rowSelectionHandler.addRange(selectedRows, { selected : true, source : 'api', values : [] })\n        \n    }\n    \n    deSelectRows(rows: RowIndexType[]): void {\n        // const validRowIds = rowIds.filter(rowId => this.isRowExist(rowId));\n    \n        // if (validRowIds.length === 0) {\n        //     return;\n        // }\n\n        const selectedRows = rows.map(row => {\n            return {\n            from : row,\n            to : row\n        }})\n    \n        this.rowSelectionHandler.deSelectRow(selectedRows, {\n            values     : [] as RowType[],\n            selected: false,\n            source  : 'api'\n        })\n    }\n    \n    deSelectRow(row: RowIndexType): void {\n        // if(!this.isRowExist(rowID)) {\n        //     return;\n        // }\n\n        this.rowSelectionHandler.deSelectRow([{from : row, to : row}], {\n            values     : [] as RowType[],\n            selected: false,\n            source  : 'api'\n        })\n    }\n    getSelectedRows(): SelectedRowRange[] {\n       return this.rowSelectionHandler.getSelectedRows();\n    }\n    isRowSelected(row: RowIndexType): boolean {\n        return this.rowSelectionHandler.isRowSelected(row as RowType);\n    }\n\n    selectAllRows(): void {\n        this.rowSelectionHandler.selectAllRows({source : 'api'});\n    }\n\n    deSelectAllRows(): void {\n        this.rowSelectionHandler.deselectAllRows({source : 'api'});\n    }\n\n    getSelectedRowCount(): number {\n        return this.rowSelectionHandler.getSelectionCount();\n    }\n}","import { EventEmitter, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { IRowSelectionIndexAPI } from \"../selection-api.types\";\nimport { RowSelectionIndexAPIValidator } from \"./row-selection-index-api-validator\";\nimport { RowIndexType, SelectedRowRange } from \"../../../../Selection/row-selection/row-selection.types\";\n@Bean('rowSelectionAPI')\nexport class RowSelectionIndexAPI extends EventEmitter implements IRowSelectionIndexAPI {\n    \n\n    private selectionAPIValidator : IRowSelectionIndexAPI;\n\n    @PostConstruct()\n    init() :void {\n        this.selectionAPIValidator = this.createManagedBean(new RowSelectionIndexAPIValidator());\n    }\n\n    selectRow(fromRow: RowIndexType, toRow: RowIndexType): void {\n        this.selectionAPIValidator.selectRow(fromRow, toRow);\n    }\n\n    selectRows(selectedRows: SelectedRowRange[]): void {\n        this.selectionAPIValidator.selectRows(selectedRows)\n    }\n\n    deSelectRow(row: RowIndexType): void {\n        this.selectionAPIValidator.deSelectRow(row);\n    }\n\n    deSelectRows(rows: RowIndexType[]): void {\n        this.selectionAPIValidator.deSelectRows(rows);\n    }\n\n    isRowSelected(row: RowIndexType): boolean {\n        return this.selectionAPIValidator.isRowSelected(row);\n    }\n\n    selectAllRows(): void {\n        this.selectionAPIValidator.selectAllRows();\n    }\n\n    deSelectAllRows(): void {\n        this.selectionAPIValidator.deSelectAllRows();\n    }\n\n    getSelectedRows(): SelectedRowRange[] {\n       return this.selectionAPIValidator.getSelectedRows();\n    }\n\n    getSelectedRowCount(): number {\n        return this.selectionAPIValidator.getSelectedRowCount();\n    }\n}","import { Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IUserPresence, IUserPresenceItem } from \"../../../../userpresence/core/src/DataHandler/Interface/IUserPresenceConfig\";\nimport { IHookMeta, IOptionalConfig, UserPresenceAPIType } from \"../../Main\";\nimport { UserPresenceValidator } from \"./user-presence-validator\";\n\nconst userPresenceAPIHookMeta : IHookMeta = {\n    suppressEventTrigger: false,\n    useApiCaller        : true,\n    eventOrigin         : 'api'\n}\n\n@Bean('userPresenceAPI')\nexport class UserPresenceAPI extends EventEmitter implements UserPresenceAPIType {\n    private userPresenceValidator : UserPresenceAPIType;\n\n    @PostConstruct()\n    init() : void {\n        this.userPresenceValidator = this.createManagedBean(new UserPresenceValidator());\n    }\n\n    addUserPresence(recordId: string, fieldId: string, userPresence: IUserPresence, hookMeta: IHookMeta = userPresenceAPIHookMeta): void {\n        this.userPresenceValidator.addUserPresence(recordId, fieldId, userPresence, hookMeta);\n    }\n\n    removeUserPresence(recordId: string, fieldId: string, hookMeta: IHookMeta = userPresenceAPIHookMeta): void {\n        this.userPresenceValidator.removeUserPresence(recordId, fieldId, hookMeta);\n    }\n\n    updateUserPresence(recordId: string, fieldId: string, userPresence: IUserPresence, hookMeta: IHookMeta = userPresenceAPIHookMeta): void {\n        this.userPresenceValidator.updateUserPresence(recordId, fieldId, userPresence, hookMeta);\n    }\n\n    removeUserPresenceItem(id: string, hookMeta: IHookMeta = userPresenceAPIHookMeta): void {\n        this.userPresenceValidator.removeUserPresenceItem(id, hookMeta);\n    }\n\n    updateUserPresenceItems(recordId: string, fieldId: string, userPresenceItems: IUserPresenceItem[]): void {\n        this.userPresenceValidator.updateUserPresenceItems(recordId, fieldId, userPresenceItems);\n    }\n\n    addUserPresenceItems(recordId: string, fieldId: string, userPresenceItems: IUserPresenceItem[]): void {\n        this.userPresenceValidator.addUserPresenceItems(recordId, fieldId, userPresenceItems);\n    }\n\n    removeUserPresenceItems(recordId: string, fieldId: string, ids: string[]): void {\n        this.userPresenceValidator.removeUserPresenceItems(recordId, fieldId, ids);\n    }\n\n    addUserPresenceByIndex(recordIndex: number, fieldIndex: number, userPresence: IUserPresence,  optionalConfig?: IOptionalConfig, hookMeta: IHookMeta = userPresenceAPIHookMeta): void {\n       this.userPresenceValidator.addUserPresenceByIndex(recordIndex, fieldIndex, userPresence, optionalConfig, hookMeta);\n    }\n\n    removeUserPresenceByIndex(recordIndex: number, fieldIndex: number,  optionalConfig?: IOptionalConfig, hookMeta : IHookMeta = userPresenceAPIHookMeta): void {\n        this.userPresenceValidator.removeUserPresenceByIndex(recordIndex, fieldIndex, optionalConfig, hookMeta);\n    }\n\n    updateUserPresenceByIndex(recordIndex: number, fieldIndex: number, userPresence: IUserPresence, optionalConfig?: IOptionalConfig, hookMeta: IHookMeta = userPresenceAPIHookMeta): void {\n        this.userPresenceValidator.updateUserPresenceByIndex(recordIndex, fieldIndex, userPresence,optionalConfig, hookMeta);\n    }\n\n    updateUserPresenceItemsByIndex(recordIndex: number, fieldIndex: number, userPresenceItems: IUserPresenceItem[], optionalConfig?: IOptionalConfig): void {\n        this.userPresenceValidator.updateUserPresenceItemsByIndex(recordIndex, fieldIndex, userPresenceItems, optionalConfig);\n    }\n\n    addUserPresenceItemsByIndex(recordIndex: number, fieldIndex: number, userPresenceItems: IUserPresenceItem[], optionalConfig?: IOptionalConfig): void {\n        this.userPresenceValidator.addUserPresenceItemsByIndex(recordIndex, fieldIndex, userPresenceItems, optionalConfig);\n    }\n\n    removeUserPresenceItemsByIndex(recordIndex: number, fieldIndex: number, ids: string[], optionalConfig?: IOptionalConfig): void {\n        this.userPresenceValidator.removeUserPresenceItemsByIndex(recordIndex, fieldIndex, ids, optionalConfig);\n    }\n\n    hasUserPresence(recordId: string, fieldId: string): boolean {\n        return this.userPresenceValidator.hasUserPresence(recordId, fieldId);    \n    }\n\n    hasUserPresenceItem(recordId: string, fieldId: string, itemId: string): boolean {\n        return this.userPresenceValidator.hasUserPresenceItem(recordId, fieldId, itemId);    \n        \n    }\n\n    removeAllUserPresence(hookMeta: IHookMeta = userPresenceAPIHookMeta): void {\n        this.userPresenceValidator.removeAllUserPresence(hookMeta);\n    }\n}","import { AutoWired, EventEmitter } from \"@dg/corecomponent\";\nimport { IAddUserPresenceParams, IRemoveUserPresenceParams, IUpdateUserPresenceParams, IUserPresenceHookAPI } from \"./user-presence-api.types\";\nimport { IHookMeta } from \"../../Main\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IUserPresenceHandler } from \"../../Core/UserPresence/Interface/IUserPresenceHandler\";\nimport { IAddUserPresenceHookParams, IRemoveUserPresenceHookParams, IUpdateUserPresenceHookParams } from \"./user-presence-hooks.types\";\nimport { IHookManager } from \"../../Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\n\nexport class UserPresenceHooks extends EventEmitter implements IUserPresenceHookAPI {\n    @AutoWired(GRID_BEAN_NAME.USER_PRESENCE_HANDLER) private userPresenceHandler : IUserPresenceHandler;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) private hookManager : IHookManager;\n\n    addUserPresences(userPresences: IAddUserPresenceParams[], hookMeta?: IHookMeta): void {\n        const {suppressEventTrigger        = false, useApiCaller = true} = hookMeta;\n        const metas   = this.createAddUserPresenceHookParams(userPresences, hookMeta);\n\n        const api = (params : IAddUserPresenceHookParams) => {\n            const callBack = (params : IAddUserPresenceHookParams) => {\n                params.userPresences.forEach((userPresence) => {\n                    this.userPresenceHandler.addUserPresence(userPresence.recordId, userPresence.fieldId, userPresence.userPresence);\n                })\n            }\n            useApiCaller && callBack(params);\n        };\n\n        !suppressEventTrigger ? this.hookManager.executeHook(HookEventsName.onBeforeUserPresenceAdd, HookEventsName.onAfterUserPresenceAdd, api, metas) : api(metas);\n    }\n    removeUserPresences(userPresences: IRemoveUserPresenceParams[], hookMeta?: IHookMeta): void {\n        const {suppressEventTrigger        = false, useApiCaller = true} = hookMeta;\n        const metas   = this.removeUserPresenceHookParams(userPresences, hookMeta);\n\n        const api = (params : IRemoveUserPresenceHookParams) => {\n            const callBack = (params : IRemoveUserPresenceHookParams) => {\n                params.userPresences.forEach((userPresence) => {\n                    this.userPresenceHandler.removeUserPresence(userPresence.recordId, userPresence.fieldId);\n                })\n            }\n            useApiCaller && callBack(params);\n        };\n\n        !suppressEventTrigger ? this.hookManager.executeHook(HookEventsName.onBeforeUserPresenceRemove, HookEventsName.onAfterUserPresenceRemove, api, metas) : api(metas);\n    }\n    updateUserPresences(userPresences: IUpdateUserPresenceParams[], hookMeta?: IHookMeta): void {\n        const {suppressEventTrigger        = false, useApiCaller = true} = hookMeta;\n        const metas   = this.updateUserPresenceHookParams(userPresences, hookMeta);\n\n        const api = (params : IUpdateUserPresenceHookParams) => {\n            const callBack = (params : IUpdateUserPresenceHookParams) => {\n                params.userPresences.forEach((userPresence) => {\n                    this.userPresenceHandler.updateUserPresence(userPresence.recordId, userPresence.fieldId, userPresence.userPresence);\n                })\n            }\n            useApiCaller && callBack(params)\n\n        };\n\n        !suppressEventTrigger ? this.hookManager.executeHook(HookEventsName.onBeforeUserPresenceUpdate, HookEventsName.onAfterUserPresenceUpdate, api, metas) : api(metas);\n\n    }\n    \n    \n    removeUserPresenceItem(id: string, _hookMeta?: IHookMeta): void {\n        this.userPresenceHandler.removeUserPresenceItem(id);\n    }\n\n    private createAddUserPresenceHookParams(userPresences : IAddUserPresenceParams[],  hookMeta : IHookMeta) : IAddUserPresenceHookParams {\n        return {\n           userPresences: userPresences,\n           eventOrigin  : hookMeta.eventOrigin\n        }\n    }\n\n    private removeUserPresenceHookParams(userPresences : IRemoveUserPresenceParams[], hookMeta : IHookMeta) : IRemoveUserPresenceHookParams {\n        return {\n            userPresences : userPresences,\n            eventOrigin: hookMeta.eventOrigin\n        }\n    }\n\n    private updateUserPresenceHookParams(userPresences : IUpdateUserPresenceParams[], hookMeta : IHookMeta) : IUpdateUserPresenceHookParams {\n        return {\n           userPresences: userPresences,\n           eventOrigin  : hookMeta.eventOrigin\n        }\n    }\n\n}","import { AutoWired, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IAddUserPresenceParams, IRemoveUserPresenceParams, IUpdateUserPresenceParams, IUserPresenceHookAPI, UserPresenceAPIType } from \"./user-presence-api.types\";\nimport { IUserPresence, IUserPresenceItem } from \"../../../../userpresence/core/src/DataHandler/Interface/IUserPresenceConfig\";\nimport { IHookMeta, IOptionalConfig } from \"../../Main\";\nimport { UserPresenceHooks } from \"./user-presence-hooks\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { FieldHandler } from \"../../Core/Columns/FieldHandler\";\nimport { IUserPresenceHandler } from \"../../Core/UserPresence/Interface/IUserPresenceHandler\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\n\nexport class UserPresenceValidator extends EventEmitter implements UserPresenceAPIType {\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.USER_PRESENCE_HANDLER) private userPresenceHandler : IUserPresenceHandler;\n    private userPresenceHookAction : IUserPresenceHookAPI;\n\n    @PostConstruct()\n    init() : void {\n        this.userPresenceHookAction = this.createManagedBean(new UserPresenceHooks());\n    }\n    addUserPresence(recordId: string, fieldId: string, userPresence: IUserPresence, hookMeta?: IHookMeta): void {\n        this.addUserPresences([{recordId, fieldId, userPresence}], hookMeta);\n    }\n    removeUserPresence(recordId: string, fieldId: string, hookMeta?: IHookMeta): void {\n        this.removeUserPresences([{recordId, fieldId}], hookMeta);\n    }\n    updateUserPresence(recordId: string, fieldId: string, userPresence: IUserPresence, hookMeta?: IHookMeta): void {\n        this.updateUserPresences([{recordId, fieldId, userPresence}], hookMeta);\n    }\n\n    updateUserPresenceItems(recordId: string, fieldId: string, userPresenceItems: IUserPresenceItem[]): void {\n        if(userPresenceItems.length === 0) {\n            return;\n        }\n        this.userPresenceHandler.updateUserPresenceItems(recordId, fieldId, userPresenceItems)\n    }\n\n    removeUserPresenceItems(recordId: string, fieldId: string, ids: string[]): void {\n        if(ids.length === 0) {\n            return;\n        }\n        this.userPresenceHandler.removeUserPresenceItems(recordId, fieldId, ids);\n    }\n\n    addUserPresenceItems(recordId: string, fieldId: string, userPresenceItems: IUserPresenceItem[]): void {\n        if(userPresenceItems.length === 0) {\n            return;\n        }\n        this.userPresenceHandler.addUserPresenceItems(recordId, fieldId, userPresenceItems);\n    }\n\n    addUserPresenceByIndex(recordIndex: number, fieldIndex: number, userPresence: IUserPresence,  optionalConfig?: IOptionalConfig,  hookMeta?: IHookMeta): void {\n        const rowId = this.recordHandler.getId(recordIndex, optionalConfig?.pinPosition ?? 'middle', optionalConfig?.parentKeys ?? []);\n        const fieldId = this.fieldHandler.getAbsoluteID(fieldIndex);\n\n        this.addUserPresence(rowId, fieldId, userPresence, hookMeta);\n    }\n    removeUserPresenceByIndex(recordIndex: number, fieldIndex: number,  optionalConfig?: IOptionalConfig, hookMeta?: IHookMeta): void {\n        const rowId = this.recordHandler.getId(recordIndex, optionalConfig?.pinPosition ?? 'middle', optionalConfig?.parentKeys ?? []);\n        const fieldId = this.fieldHandler.getAbsoluteID(fieldIndex);\n\n        this.removeUserPresence(rowId, fieldId, hookMeta);\n    }\n    updateUserPresenceByIndex(recordIndex: number, fieldIndex: number, userPresence: IUserPresence,  optionalConfig?: IOptionalConfig,  hookMeta?: IHookMeta): void {\n        const rowId   = this.recordHandler.getId(recordIndex, optionalConfig?.pinPosition ?? 'middle', optionalConfig?.parentKeys ?? []);\n        const fieldId = this.fieldHandler.getAbsoluteID(fieldIndex);\n        this.updateUserPresence(rowId, fieldId, userPresence, hookMeta);\n    }\n\n    removeUserPresenceItem(id: string, hookMeta?: IHookMeta): void {\n        this.userPresenceHookAction.removeUserPresenceItem(id, hookMeta);\n    }\n\n    addUserPresenceItemsByIndex(recordIndex: number, fieldIndex: number, userPresenceItems: IUserPresenceItem[], optionalConfig?: IOptionalConfig): void {\n        const rowId   = this.recordHandler.getId(recordIndex, optionalConfig?.pinPosition ?? 'middle', optionalConfig?.parentKeys ?? []);\n        const fieldId = this.fieldHandler.getAbsoluteID(fieldIndex);\n\n        this.addUserPresenceItems(rowId, fieldId, userPresenceItems);\n    }\n\n    removeUserPresenceItemsByIndex(recordIndex: number, fieldIndex: number, ids: string[], optionalConfig?: IOptionalConfig): void {\n        const rowId   = this.recordHandler.getId(recordIndex, optionalConfig?.pinPosition ?? 'middle', optionalConfig?.parentKeys ?? []);\n        const fieldId = this.fieldHandler.getAbsoluteID(fieldIndex);\n\n        this.removeUserPresenceItems(rowId, fieldId, ids);\n    }\n\n    updateUserPresenceItemsByIndex(recordIndex: number, fieldIndex: number, userPresenceItems: IUserPresenceItem[], optionalConfig?: IOptionalConfig): void {\n        const rowId   = this.recordHandler.getId(recordIndex, optionalConfig?.pinPosition ?? 'middle', optionalConfig?.parentKeys ?? []);\n        const fieldId = this.fieldHandler.getAbsoluteID(fieldIndex);\n\n        this.updateUserPresenceItems(rowId, fieldId, userPresenceItems);\n    }\n    \n    hasUserPresence(recordId: string, fieldId: string): boolean {\n        return this.userPresenceHandler.hasUserPresence(recordId, fieldId);\n    }\n\n    hasUserPresenceItem(recordId: string, fieldId: string, itemId: string): boolean {\n        return this.userPresenceHandler.hasUserPresenceItem(recordId, fieldId, itemId);\n    }\n    \n    removeAllUserPresence(hookMeta?: IHookMeta): void {\n        const userPresences = this.userPresenceHandler.getAllUserPresence() as IRemoveUserPresenceParams[];\n        this.userPresenceHookAction.removeUserPresences(userPresences, hookMeta)\n    }\n    // private isRowExist(rowId: string): boolean {\n    //     return !!this.recordHandler.getRowNodeById(rowId);\n    // }\n\n    // private isColumnExist(columnId: string): boolean {\n    //     return !!this.fieldHandler.getColumnNodeByID(columnId);\n    // }\n    private addUserPresences(userPresences: IAddUserPresenceParams[], hookMeta?: IHookMeta): void {\n        const validPresences = this.validateUserPresences(userPresences, \"add\") as IAddUserPresenceParams[];\n        if (validPresences.length) {\n            this.userPresenceHookAction.addUserPresences(validPresences, hookMeta);\n        }\n    }\n    \n    private updateUserPresences(userPresences: IUpdateUserPresenceParams[], hookMeta?: IHookMeta): void {\n        const validPresences = this.validateUserPresences(userPresences, \"update\") as IUpdateUserPresenceParams[];\n        if (validPresences.length) {\n            this.userPresenceHookAction.updateUserPresences(validPresences, hookMeta); // Fixed action name\n        }\n    }\n    \n    private removeUserPresences(userPresences: IRemoveUserPresenceParams[], hookMeta?: IHookMeta): void {\n        const validPresences = this.validateUserPresences(userPresences, \"remove\") as IRemoveUserPresenceParams[];\n        if (validPresences.length) {\n            this.userPresenceHookAction.removeUserPresences(validPresences, hookMeta);\n        }\n    }\n    \n    private validateUserPresences( userPresences: (IAddUserPresenceParams | IUpdateUserPresenceParams | IRemoveUserPresenceParams)[], actionType: \"add\" | \"update\" | \"remove\" ): (IAddUserPresenceParams | IUpdateUserPresenceParams | IRemoveUserPresenceParams)[] {\n        return userPresences.filter((presence) => {\n            if (actionType === \"remove\") {\n                const { recordId, fieldId } = presence as IRemoveUserPresenceParams;\n                return this.hasUserPresence(recordId, fieldId);\n            }\n            return !!(presence as IAddUserPresenceParams | IUpdateUserPresenceParams).userPresence; // Common validation for add/update\n        });\n    }\n    \n}","const HookEvents = [\n\t'onBeforeCellMouseDown',\n\t'onBeforeCellMouseUp',\n\t'onBeforeCellDragStart',\n\t'onBeforeCellDragMove',\n\t'onBeforeCellDragEnd',\n\t'onBeforeRowMouseDown',\n\t'onBeforeRowMouseUp',\n\t'onBeforeRowDragStart',\n\t'onBeforeRowDragMove',\n\t'onBeforeRowDragEnd',\n\t'onBeforeColumnMouseDown',\n\t'onBeforeColumnMouseUp',\n\t'onBeforeColumnDragStart',\n\t'onBeforeColumnDragMove',\n\t'onBeforeColumnDragEnd',\n\t'onBeforeTabPress',\n\t'onBeforeEnterPress',\n\t'onBeforeUpArrowPress',\n\t'onBeforeDownArrowPress',\n\t'onBeforeLeftArrowPress',\n\t'onBeforeRightArrowPress',\n\t'onBeforePlaceCellSelection',\n\t'onBeforePlaceRowSelection',\n\t'onBeforePlaceColumnSelection',\n\t'onBeforeRemoveCellSelection',\n\t'onAfterCellMouseDown',\n\t'onAfterCellMouseUp',\n\t'onAfterCellDragStart',\n\t'onAfterCellDragMove',\n\t'onAfterCellDragEnd',\n\t'onAfterRowMouseDown',\n\t'onAfterRowMouseUp',\n\t'onAfterRowDragStart',\n\t'onAfterRowDragMove',\n\t'onAfterRowDragEnd',\n\t'onAfterColumnMouseDown',\n\t'onAfterColumnMouseUp',\n\t'onAfterColumnDragStart',\n\t'onAfterColumnDragMove',\n\t'onAfterColumnDragEnd',\n\t'onAfterTabPress',\n\t'onAfterEnterPress',\n\t'onAfterUpArrowPress',\n\t'onAfterDownArrowPress',\n\t'onAfterLeftArrowPress',\n\t'onAfterRightArrowPress',\n\t'onAfterPlaceCellSelection',\n\t'onAfterPlaceRowSelection',\n\t'onAfterPlaceColumnSelection',\n\t'onAfterRemoveCellSelection',\n];\n\nfunction isHookEvent(event : string) {\n\treturn HookEvents.includes(event);\n}\n\nexport function copyAttributesToOptions(options : any, component : any) {\n    const keys = Object.keys(component);\n\n    keys.forEach((key) => {\n        const value = component[key];\n\n        if(isHookEvent(key)) {\n            if(!options?.hookEvents) {\n                options.hookEvents = {};\n            }\n\n            options.hookEvents[key] = value;\n        }else {\n            options[key] = value;\n        }\n    })\n}","import { Component } from \"@dg/corecomponent\";\n\nfunction getTemplate() : HTMLElement {\n    const div = document.createElement('div');\n    div.classList.add('ZG-skeletonLoader');\n    return div as HTMLElement;\n}\nexport class CellLoading extends Component {\n    constructor() {\n        super(getTemplate());\n    }\n\n    public init(_params: any): void {\n    }\n\n    public refresh(_params : any): boolean {\n        return false;\n    }\n\n    public destroy(): void {\n        super.destroy();\n    }\n\n    getElement() : HTMLElement {\n        return this.getGui();\n    }\n}","import { Component } from \"@dg/corecomponent\";\nimport { ICellRendererParams } from \"../../Main\";\nimport { escapeString } from \"../../Core/utils/Generic\";\n\nexport class CellRenderer extends Component {\n\n    private params : ICellRendererParams | null;\n    public init(params: ICellRendererParams): void {\n      this.params = params;\n    }\n\n    public refresh(_params : any): boolean {\n        return false;\n    }\n\n    public destroy(): void {\n        this.params = null;\n        super.destroy();\n    }\n\n    getElement() : HTMLElement {\n        const data         = this.params.cellData;\n        const escapedValue = data != null ? escapeString(data) : \"\";\n        return document.createTextNode(escapedValue) as unknown as HTMLElement;\n    }\n}","import { IBaseComponent, IColumnRoederParams } from \"../Main\";\n\nexport class ColumnReorderRenderer implements IBaseComponent<IColumnRoederParams> {\n    private param: null | IColumnRoederParams;\n    constructor() {\n        this.param = null;\n    }\n\n    init(param: IColumnRoederParams) {\n        this.param = param;\n    }\n\n    getElement() {\n        const selectedFieldIDs    = this.param?.sourceColumnIds as string[] || [];\n        const selectedFieldsCount = selectedFieldIDs.length;\n        const div = document.createElement('div');\n        div.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"> <!-- Up arrow --> <path d=\"M12 3l3 3-3-3-3 3 3-3v18\"></path> <!-- Right arrow --> <path d=\"M21 12l-3-3 3 3-3 3 3-3H3\"></path> <!-- Down arrow --> <path d=\"M12 21l-3-3 3 3 3-3-3 3V3\"></path> <!-- Left arrow --> <path d=\"M3 12l3-3-3 3 3 3-3-3h18\"></path> </svg>`\n        div.classList.add('ZG-column-ghost-element');\n        div.classList.add('ZCC-dflexCenterSpacebetween');\n        div.classList.add('ZCC-p10');\n        const span = document.createElement('span');\n        span.classList.add('ZG-drag-span-element');\n        span.classList.add('ZCC-ml5');\n        span.textContent = selectedFieldsCount === 1 ? \"1 column\" : `${selectedFieldsCount} columns`;\n        div.appendChild(span);\n\n        return div;\n    }\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { FullWidthGroupCellRendererType } from \"./FullWidthGroupCellRenderer.types\";\nimport { setDisplayed } from \"../../Core/utils/Dom\";\nimport { KeyBoardKeyCode } from \"../../Core/Navigation/KeyBoardEventKeys\";\nimport { GroupRowNode } from \"../../../DataStore/GroupRowNode\";\n\nexport class FullWidthGroupCellController extends EventEmitter {\n    private component : FullWidthGroupCellRendererType;\n    private params : any;\n\tsetComponent(component: FullWidthGroupCellRendererType, params : any) {\n        this.component = component;\n        this.params    = params;\n\n        this.addChildCount();\n        this.addValue();\n        this.addExpandAndContracted();\n        this.addClassName();\n\n        this.addListener(params.parentElement, 'keydown', this.onKeyDown.bind(this));\n    }\n\n    private addClassName() : void {\n        const rownode = this.getRowNode();\n        const level = rownode.getLevel();\n        const element = this.component.getElement();\n\n        element && element.classList.add(`dg-row-group-${level}`);\n        element && element.style.setProperty(`--dg-indentation-level`, level);\n    }\n\n\n    private addExpandAndContracted() {\n        const isCollapsed = this.isCollapsed();\n        const expandedElement = this.component.getExpandedElement();\n        const contractedElement = this.component.getContractedElement();\n\n        if(isCollapsed) {\n            this.addListener(contractedElement, 'mousedown', (event : MouseEvent) => {\n                event.preventDefault();\n                event.stopPropagation();\n                const rowNode = this.getRowNode();\n                rowNode && rowNode.expand();\n            })\n            setDisplayed(contractedElement, true);\n            setDisplayed(expandedElement, false);\n        }else {\n            this.addListener(expandedElement, 'mousedown', (event : MouseEvent) => {\n                event.preventDefault();\n                event.stopPropagation();\n                const rowNode = this.getRowNode();\n                rowNode && rowNode.collapse();\n            })\n\n            setDisplayed(expandedElement, true);\n            setDisplayed(contractedElement, false);\n        }\n       \n        \n\n    }\n\n    private getRowNode() {\n        return this.params?.node;\n    }\n\n    private isCollapsed() : boolean {\n        const rowNode = this.getRowNode();\n        return rowNode.isCollapsed();\n    }\n    private addValue() : void {\n        const {node} = this.params;\n        const groupMeta   = node.getCurrentMeta() ?? {};\n\n        const value = groupMeta.groupValue;\n\n        const groupData = `${value}`;\n\n        const element = this.component.getValueElement();\n        element.innerHTML = groupData;\n    }\n\n    private addChildCount() : void {\n        const { node } = this.params;\n\t\tconst count = node.getDirectChildrenCount();\n\n\t\tconst element = this.component.getChildCountElement();\n\t\telement.innerHTML = `Row Count : ${count}`;\n    }\n\n    private onKeyDown(event: KeyboardEvent): void {\n        const isEnterKey = event.key === KeyBoardKeyCode.Enter;\n        const isLeftArrowKey = event.key === KeyBoardKeyCode.ArrowLeft;\n        const isRightArrowKey = event.key === KeyBoardKeyCode.ArrowRight;\n    \n        if (this.params.suppressEnterExpand && !isEnterKey) {\n            return;\n        }\n    \n        if (isEnterKey || isLeftArrowKey || isRightArrowKey) {\n            if (isLeftArrowKey) {\n                this.onCollapse();\n            } else if (isRightArrowKey) {\n                this.onExpand();\n            } else {\n                this.onExpandOrContract(event);\n            }\n        }\n    }\n\n    private onCollapse() {\n        const rowNode: GroupRowNode = this.getRowNode();\n        rowNode.collapse();\n    }\n\n    private onExpand() {\n        const rowNode: GroupRowNode = this.getRowNode();\n        rowNode.expand();\n    }\n    \n\n    private onExpandOrContract(_e: MouseEvent | KeyboardEvent): void {\n        const rowNode: GroupRowNode = this.getRowNode();\n        const isCollapsed = !rowNode.isCollapsed();\n\n        if(isCollapsed) {\n            rowNode.collapse();\n        }else {\n            rowNode.expand();\n        }\n    }\n}","import { Component, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { FullWidthGroupCellRendererType } from \"./FullWidthGroupCellRenderer.types\";\nimport { FullWidthGroupCellController } from \"./FullWidthGroupCellController\";\n\nfunction getTemplate() {\n    const template = `<span class=\"dg-cell-wrapper dg-group\">\n            <span class=\"dg-group-expanded\" ref=\"expandedElement\">\n                <span class=\"dg-icon dg-icon-tree-open\" unselectable=\"on\" role=\"presentation\"></span>\n            </span>\n            <span class=\"dg-group-contracted\" ref=\"contractedElement\">\n                <span class=\"dg-icon dg-icon-tree-closed\" unselectable=\"on\" role=\"presentation\"></span>\n            </span>\n            <span class=\"dg-group-checkbox dg-invisible\" ref=\"checkboxElement\"></span>\n            <span class=\"dg-group-value\" ref=\"valueElement\"></span>\n            <span class=\"dg-group-child-count\" ref=\"childCountElement\"></span>\n        </span>`;\n\tconst div = document.createElement('div');\n\tdiv.innerHTML = template;\n\treturn div.firstChild as HTMLElement;\n}\nexport class FullWidthGroupCellRenderer extends Component {\n\t// private params: any;\n\n    @queryAssignedNodes('expandedElement') private expandedElement    : HTMLSpanElement;\n    @queryAssignedNodes('contractedElement') private contractedElement: HTMLSpanElement;\n    // @queryAssignedNodes('checkboxElement') private checkboxElement    : HTMLSpanElement;\n    @queryAssignedNodes('valueElement') private valueElement          : HTMLSpanElement;\n    @queryAssignedNodes('childCountElement') private childCountElement: HTMLSpanElement;\n    params: any;\n\n\tconstructor() {\n\t\tsuper(getTemplate());\n\t}\n\n\tinit(params: any): void {\n\t\tthis.params = params;\n\n        const component: FullWidthGroupCellRendererType = {\n            getElement : ()=> this.getGui(),\n            getChildCountElement : () => this.childCountElement,\n            getContractedElement  : ()=> this.contractedElement,\n            getExpandedElement : ()=> this.expandedElement,\n            getValueElement : ()=> this.valueElement\n        }\n\n        const controller = this.createManagedBean(new FullWidthGroupCellController());\n        controller.setComponent(component, params);\n\t}\n\n    getElement() : HTMLElement {\n        return this.getGui();\n    }\n}","import { IBaseComponent } from \"../Main\";\n\nexport class NoRecordFoundRenderer implements IBaseComponent<any> {\n    private element : HTMLElement | null = null;\n    \n    getElement(): HTMLElement {\n        const panel = document.createElement(\"div\");\n        panel.className = \"ZG-noResultEmptyPanel\";\n\n        function createNoResultCard() {\n            const card = document.createElement(\"div\");\n            card.className = \"ZG-noResultcard\";\n\n            const span = document.createElement(\"span\");\n            span.className = \"ZG-noResultElement\";\n\n            card.appendChild(span);\n            return card;\n        }\n\n        panel.appendChild(createNoResultCard());\n        panel.appendChild(createNoResultCard());\n\n        const heading = document.createElement(\"h3\");\n        heading.className = \"ZG-emptyStateText\";\n        heading.textContent = \"No Records found\";\n\n        panel.appendChild(heading);\n        this.element = panel;\n        return this.element;\n    }\n    destroy?(): void {\n        this.element = null;\n    }\n}","import { Component } from \"@dg/corecomponent\";\n\nfunction getTemplate() {\n    const template = `<div class=\"ZG-poppedRowMessageSecInner ZCC-dflex ZCC-alignCenter\">\n    <span class=\"ZG-poppedRowMessageText\" ref=\"poppedRowMessageText\">Row Moved</span>\n                        <span class=\"ZG-poppedRowMessageHelpIcon ZCC-cp\" ref=\"tooltipElement\">\n                            <svg width=\"14px\" height=\"14px\" viewBox=\"2 3 21 21\"> <g data-name=\"Layer 2\"><g data-name=\"Layer 11\"><path d=\"M14.52 9.92a2.87 2.87 0 00-1.31-.4h-.5a2.5 2.5 0 00-1.16.39 1.84 1.84 0 00-.8 1 1.16 1.16 0 00-.05.49.53.53 0 00.41.43.63.63 0 00.78-.33l.18-.36a.86.86 0 01.58-.5 1.57 1.57 0 01.61 0 .87.87 0 01.38.2.83.83 0 01.06 1.07 3.45 3.45 0 01-.56.52 4.21 4.21 0 00-.64.56 1.12 1.12 0 00-.28.72.61.61 0 00.3.58.62.62 0 00.87-.28.3.3 0 000-.1 1.24 1.24 0 01.5-.65c.25-.18.51-.37.75-.58a1.72 1.72 0 00.55-.8c0-.11 0-.23.08-.34v-.26c0-.12 0-.25-.07-.37a1.65 1.65 0 00-.68-.99zM12.85 15a.77.77 0 00-.77.78.79.79 0 00.78.77.78.78 0 100-1.55z\"></path><path d=\"M13 5.25A7.75 7.75 0 1020.75 13 7.76 7.76 0 0013 5.25zm0 14A6.25 6.25 0 1119.25 13 6.25 6.25 0 0113 19.25z\"></path><path fill=\"none\" d=\"M0 0h26v26H0z\"></path></g></g></svg>\n                        </span></div>`;\n\tconst div = document.createElement('div');\n\tdiv.innerHTML = template;\n\treturn div.firstChild as HTMLElement;\n}\nexport class RowMovedRenderer extends Component {\n    private params : any;\n\n    private popupRowMessageTextElement : HTMLElement;\n\n    private tooltipElement : HTMLElement;\n\n    constructor() {\n        super(getTemplate());\n\n        this.popupRowMessageTextElement = this.getGui().querySelector('[ref=\"poppedRowMessageText\"]')\n\n        this.tooltipElement = this.getGui().querySelector('[ref=\"tooltipElement\"]')\n\n    }\n    init(params : any) : void {\n        this.params = params;\n\n        this.setPopupRowMessageText();\n        this.registerTooltip();\n    }\n\n    updateRowMovedLabel(label : string) : void {\n        this.popupRowMessageTextElement.textContent = label;\n    }\n\n    private registerTooltip() : void {\n        if(this.params.registerTooltip) {\n            this.params.registerTooltip(this.tooltipElement);\n        }\n    }\n\n    private setPopupRowMessageText() : void {\n        // const { sourceIndex, targetIndex } = this.params;\n        const popupMessageText = this.getPopupMesaage();\n\n        this.popupRowMessageTextElement.textContent = popupMessageText;\n    }\n    \n    private getPopupMesaage() : string {\n        // return `Row Moved ${sourceIndex} to ${targetIndex}`;\n        return `Row Moved`;\n    }\n}","import { AutoWired } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../Core/Rows/RecordHandler.types\";\nimport { IBaseComponent,IRowDragItem, IRowReoderParams } from \"../Main\";\n\nexport class RowReorderRenderer implements IBaseComponent<IRowReoderParams> {\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    private param: null | IRowReoderParams;\n    constructor() {\n        this.param = null;\n    }\n\n    init(param: IRowReoderParams) {\n        this.param = param;\n    }\n\n    getElement() {\n        const values = this.param.values as IRowDragItem;\n        let selectedRecordCounts = 0;\n\n        if (values.selectionType === \"id\") {\n            selectedRecordCounts = (values.rowIDs ?? []).length;\n        } else {\n            selectedRecordCounts = (values.rowRanges ?? []).reduce((count, range) => {\n                const nodes = this.recordHandler.getSequenceRowNodes(range.from, range.to);\n                return count + nodes.length;\n            }, 0);\n        }\n        const div = document.createElement('div');\n        div.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"> <!-- Up arrow --> <path d=\"M12 3l3 3-3-3-3 3 3-3v18\"></path> <!-- Right arrow --> <path d=\"M21 12l-3-3 3 3-3 3 3-3H3\"></path> <!-- Down arrow --> <path d=\"M12 21l-3-3 3 3 3-3-3 3V3\"></path> <!-- Left arrow --> <path d=\"M3 12l3-3-3 3 3 3-3-3h18\"></path> </svg>`\n        div.classList.add('ZG-row-ghost-element');\n        div.classList.add('ZCC-dflexCenterSpacebetween');\n        div.classList.add('ZCC-p10');\n        const span = document.createElement('span');\n        span.classList.add('ZG-drag-span-element');\n        span.classList.add('ZCC-ml5');\n        span.textContent = selectedRecordCounts === 1 ? \"1 row\" : `${selectedRecordCounts} rows`;\n        div.appendChild(span);\n\n        return div;\n    }\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IRect, getElementRectWithOffset } from \"@dg/corecomponent\";\nimport { RowContainerController } from \"../GridComponent/GridBodyComponent/RowContainer/RowContainerController\";\nimport { GridController } from \"../GridComponent/GridController\";\nimport { COLUMN_PANE_TYPE } from \"./Columns/FieldHandler\";\nimport { IControllerHandler, IPaneControllerParam } from \"./Interface/IControllerHandler\";\nimport { GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { ROW_PANE_TYPE } from \"./Constants/GridConfigurationConstants\";\n\n@Bean(GRID_BEAN_NAME.ABSOLUTE_POSITION_HANDLER)\nexport class AbsolutePositionHandler extends EventEmitter {\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\n\tprivate gridController: GridController;\n\n\t@PostConstruct()\n    init() : void {\n\t\tconst controller = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n        controller.onAfterGridReady((param: IPaneControllerParam) => {\n\t\t\tthis.gridController = param.gridController;\n\t\t});\n    }\n\n\tgetAbsolutePosition(rowIndex: number, columnIndex: number) {\n\t\treturn {\n\t\t\tleft: this.findLeftByIndex(rowIndex, columnIndex),\n\t\t\ttop: this.findTopByIndex(rowIndex),\n\t\t\twidth: this.findWidthByColumnIndex(columnIndex),\n\t\t\theight: this.findHeightByRowIndex(rowIndex),\n\t\t};\n\t}\n\n\tprivate findHeightByRowIndex(rowIndex: number): number {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.RECORD_HANDLER,\n\t\t\t\n\t\t);\n\t\tconst rowPaneHandler = recordHandler.getRecordPaneByIndex(rowIndex);\n\t\tconst rowID = recordHandler.getAbsoluteID(rowIndex);\n\t\tconst rowNode = rowPaneHandler.getRowNodeById(rowID);\n\n\t\treturn rowNode.getRowHeight();\n\t}\n\n\tprivate findWidthByColumnIndex(columnIndex: number): number {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.FIELD_HANDLER,\n\t\t\t\n\t\t);\n\t\tconst fieldPaneHandler = fieldHandler.getFieldPaneByIndex(columnIndex);\n\t\tconst columnID = fieldHandler.getAbsoluteID(columnIndex);\n\n\t\treturn fieldPaneHandler.getColumnWidth(columnID);\n\t}\n\n\tprivate findTopByIndex(rowIndex: number): number {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.RECORD_HANDLER,\n\t\t\t\n\t\t);\n\t\tconst rowPaneHandler = recordHandler.getRecordPaneByIndex(rowIndex);\n\n\t\tconst rowID = recordHandler.getAbsoluteID(rowIndex);\n\n\t\tconst rowNode = rowPaneHandler.getRowNodeById(rowID);\n\n\t\tconst rowPaneType = rowPaneHandler.getPinPosition();\n\n\t\tconst relativeTop = rowNode.getTop();\n\n\t\tconst boundRect = this.findRowPaneBoundRect(rowPaneType);\n\n\t\treturn (\n\t\t\trelativeTop +\n\t\t\tboundRect.top -\n\t\t\tthis.findRowPaneScrollTop(rowPaneType) -\n\t\t\tthis.findBoundRectForGridElement().top\n\t\t);\n\t}\n\n\tpublic findAbsoluteTopByRelativeTopInCenterHandler(top: number): number {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.RECORD_HANDLER,\n\t\t\t\n\t\t);\n\n\t\tconst rowPaneHandler = recordHandler.getMiddleHandler();\n\n\t\tconst rowPaneType = rowPaneHandler.getPinPosition();\n\n\t\tconst boundRect = this.findRowPaneBoundRect(rowPaneType);\n\n\t\tconst absoluteTop =\n\t\t\ttop +\n\t\t\tboundRect.top -\n\t\t\tthis.findRowPaneScrollTop(rowPaneType) -\n\t\t\tthis.findBoundRectForGridElement().top;\n\n\t\treturn absoluteTop;\n\t}\n\n\tpublic findMiddlePaneBoundRect(): DOMRect {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.RECORD_HANDLER,\n\t\t\t\n\t\t);\n\n\t\tconst rowPaneHandler = recordHandler.getMiddleHandler();\n\n\t\tconst rowPaneType = rowPaneHandler.getPinPosition();\n\n\t\tconst boundRect = this.findRowPaneBoundRect(rowPaneType);\n\n\t\treturn boundRect;\n\t}\n\n\tprivate findBoundRectForGridElement(): DOMRect {\n\t\tconst controllerHandler = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.CONTROLLER_HANDLER,\n\t\t\t\n\t\t) as IControllerHandler;\n\t\tconst gridController = controllerHandler.getGridController();\n\n\t\treturn gridController.getBoundRectForGridElement();\n\t}\n\n\tprivate findLeftByIndex(rowIndex: number, columnIndex: number): number {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.RECORD_HANDLER,\n\t\t\t\n\t\t);\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.FIELD_HANDLER,\n\t\t\t\n\t\t);\n\n\t\tconst rowPaneHandler   = recordHandler.getRecordPaneByIndex(rowIndex);\n\t\tconst fieldPaneHandler = fieldHandler.getFieldPaneByIndex(columnIndex);\n\n\t\tconst rowPaneType   = rowPaneHandler.getPinPosition();\n\t\tconst fieldPaneType = fieldPaneHandler.getPinPosition();\n\n\t\tconst columnID     = fieldHandler.getAbsoluteID(columnIndex);\n\t\tconst relativeLeft = fieldPaneHandler.getColumnLeft(columnID);\n\n\t\tconst controller         = this.getPaneController(rowPaneType, fieldPaneType);\n\t\tconst boundRect: DOMRect = controller.getRect();\n\n\t\treturn (\n\t\t\trelativeLeft +\n\t\t\tboundRect.left -\n\t\t\tcontroller.getScrollLeft() -\n\t\t\tthis.findBoundRectForGridElement().left\n\t\t);\n\t}\n\n\tprivate findRowPaneScrollTop(rowPaneType: string): number {\n\t\tconst controller = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.CONTROLLER_HANDLER,\n\t\t\t\n\t\t) as IControllerHandler;\n\n\t\tconst bodyController = controller.getBodyController();\n\n\t\tswitch (rowPaneType) {\n\t\t\tcase ROW_PANE_TYPE.HEADER:\n\t\t\t\treturn bodyController.getScrollTopForHeaderComponent();\n\t\t\tcase ROW_PANE_TYPE.TOP:\n\t\t\t\treturn bodyController.getScrollTopForTopContainer();\n\t\t\tcase ROW_PANE_TYPE.MIDDLE:\n\t\t\t\treturn bodyController.getScrollTopForCenterViewPortContainer();\n\t\t\tcase ROW_PANE_TYPE.BOTTOM:\n\t\t\t\treturn bodyController.getScrollTopForBottomContainer();\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\n\tprivate findRowPaneBoundRect(rowPaneType: string): DOMRect {\n\t\tconst controller = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.CONTROLLER_HANDLER,\n\t\t\t\n\t\t) as IControllerHandler;\n\n\t\tconst bodyController = controller.getBodyController();\n\n\t\tswitch (rowPaneType) {\n\t\t\tcase ROW_PANE_TYPE.HEADER:\n\t\t\t\treturn bodyController.getBoundRectForHeaderComponent();\n\t\t\tcase ROW_PANE_TYPE.TOP:\n\t\t\t\treturn bodyController.getBoundRectForTopContainer();\n\t\t\tcase ROW_PANE_TYPE.MIDDLE:\n\t\t\t\treturn bodyController.getBoundRectForCenterViewPortContainer();\n\t\t\tcase ROW_PANE_TYPE.BOTTOM:\n\t\t\t\treturn bodyController.getBoundRectForBottomContainer();\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: 0,\n\t\t\t\t\twidth: 0,\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\ttoJSON: () => 0,\n\t\t\t\t};\n\t\t}\n\t}\n\n\tprivate getPaneController(\n\t\trowPaneType: string,\n\t\tcolumnPaneType: string,\n\t): RowContainerController | null {\n\t\tconst controller = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.CONTROLLER_HANDLER,\n\t\t\t\n\t\t) as IControllerHandler;\n\n\t\tswitch (rowPaneType) {\n\t\t\tcase ROW_PANE_TYPE.TOP:\n\t\t\t\treturn this.getTopRowControllerByColumnType(columnPaneType);\n\t\t\tcase ROW_PANE_TYPE.MIDDLE:\n\t\t\t\treturn this.getCenterRowControllerByColumnType(columnPaneType);\n\t\t\tcase ROW_PANE_TYPE.BOTTOM:\n\t\t\t\treturn this.getBottomRowControllerByColumnType(columnPaneType);\n\t\t\tcase ROW_PANE_TYPE.HEADER:\n\t\t\t\treturn controller.getHeaderRowContainerController();\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate getBottomRowControllerByColumnType(\n\t\tcolumnPaneType: string,\n\t): RowContainerController | null {\n\t\tconst controller = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.CONTROLLER_HANDLER,\n\t\t\t\n\t\t) as IControllerHandler;\n\n\t\tswitch (columnPaneType) {\n\t\t\tcase COLUMN_PANE_TYPE.LEFT:\n\t\t\t\treturn controller.getBottomLeftRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.RIGHT:\n\t\t\t\treturn controller.getBottomRightRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.CENTER:\n\t\t\t\treturn controller.getBottomCenterRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.HEADER:\n\t\t\t\treturn controller.getBottomHeaderRowContainerController();\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate getCenterRowControllerByColumnType(\n\t\tcolumnType: string,\n\t): RowContainerController | null {\n\t\tconst controller = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.CONTROLLER_HANDLER,\n\t\t\t\n\t\t) as IControllerHandler;\n\n\t\tswitch (columnType) {\n\t\t\tcase COLUMN_PANE_TYPE.LEFT:\n\t\t\t\treturn controller.getLeftRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.RIGHT:\n\t\t\t\treturn controller.getRightRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.CENTER:\n\t\t\t\treturn controller.getCenterRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.HEADER:\n\t\t\t\treturn controller.getHeaderRowContainerController();\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate getTopRowControllerByColumnType(\n\t\tcolumnType: string,\n\t): RowContainerController | null {\n\t\tconst controller = this.getBeanInstanceByBeanName(\n\t\t\tGRID_BEAN_NAME.CONTROLLER_HANDLER,\n\t\t\t\n\t\t) as IControllerHandler;\n\n\t\tswitch (columnType) {\n\t\t\tcase COLUMN_PANE_TYPE.LEFT:\n\t\t\t\treturn controller.getTopLeftRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.RIGHT:\n\t\t\t\treturn controller.getTopRightRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.CENTER:\n\t\t\t\treturn controller.getTopCenterRowContainerController();\n\t\t\tcase COLUMN_PANE_TYPE.HEADER:\n\t\t\t\treturn controller.getTopHeaderRowContainerController();\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tgetParentRect(): IRect {\n\t\tconst documentElement = this.optionsHandler.getDocument();\n\t\tlet popupParent = this.getPopupParent();\n\n\t\tif (popupParent === documentElement.body) {\n\t\t\tpopupParent = documentElement.documentElement;\n\t\t} else if (this.isElementIsStatic(popupParent)) {\n\t\t\tpopupParent = popupParent.offsetParent as HTMLElement;\n\t\t}\n\n\t\treturn getElementRectWithOffset(popupParent);\n\t}\n\n\tprivate isElementIsStatic(element: HTMLElement): boolean {\n\t\treturn getComputedStyle(element).position === 'static';\n\t}\n\n    getPopupParent(): HTMLElement {\n\t\tconst popupParentElement = this.optionsHandler.getPopupParent();\n\n\t\tif (popupParentElement) {\n\t\t\treturn popupParentElement;\n\t\t}\n\n\t\treturn this.gridController.getGui();\n\t}\n\n}","import { AutoWired, Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { IGridLayoutPositionHandler } from \"./Interface/IGridLayoutPositionHandler\";\nimport { IColumnNode, IRowNode } from \"../ListMain\";\nimport { GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { FieldHandler } from \"./Columns/FieldHandler\";\nimport { RowContainerType } from \"../GridComponent/GridBodyComponent/RowContainer/utils/type\";\n\n@Bean(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER)\nexport class BasicLayoutPositionHandler extends EventEmitter implements IGridLayoutPositionHandler {\n\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler: FieldHandler;\n\n    getLeft(rowNode : IRowNode, _pinPosition : RowContainerType) : number | null {\n        return rowNode.getLeft();;\n    }\n\n    getWidth(_rowNode: IRowNode, pinPosition: RowContainerType): number | null {\n        let rowWidth = this.getFullWidth(pinPosition);\n        return rowWidth;\n    }\n\n    getCellLeft(_rowNode : IRowNode, _columnNode : IColumnNode, getLeft : CallableFunction) : number {\n        return getLeft();\n    }\n\n    getCellWidth(_rowNode : IRowNode, _columnNode : IColumnNode, getWidth : CallableFunction) : number {\n        return getWidth();\n    }\n\n    getHeight(rowNode: IRowNode): number | null {\n        return rowNode.getHeight()\n    }\n\n    getCellHeight(_rowNode: IRowNode, _columnNode: IColumnNode): number | null {\n        return null;\n    }\n\n\n    private getFullWidth(pinnedPosition : RowContainerType) : number {\n        switch (pinnedPosition) {\n\t\t\tcase RowContainerType.HEADER:\n\t\t\t\treturn this.fieldHandler.getDisplayedColumnsHeaderWidth();\n\t\t\tcase RowContainerType.LEFT:\n\t\t\t\treturn this.fieldHandler.getDisplayedColumnsLeftWidth();\n\t\t\tcase RowContainerType.CENTER:\n\t\t\t\treturn this.fieldHandler.getBodyContainerWidth();\n\t\t\tcase RowContainerType.RIGHT:\n\t\t\t\treturn this.fieldHandler.getDisplayedColumnsRightWidth();\n\t\t\tdefault:\n\t\t\t\treturn this.fieldHandler.getBodyContainerWidth();\n\t\t}\n    }\n}","import { Component } from \"@dg/corecomponent\";\n// import { GridApi } from \"../../../API/GridApi\";\n\nfunction getTemplate() {\n    const div = document.createElement('div');\n    div.innerHTML = `<div class=\"ZG-coladdFieldBtn\">\n                    <svg class=\"icon\" width=\"16\" height=\"16\" viewBox=\"-1 -1 15 15\">\n                        <g data-name=\"Layer 2\"><g data-name=\"Fill Icon\"><path d=\"M10.5 5.75H7.25V2.5a.75.75 0 00-1.5 0v3.25H2.5a.75.75 0 000 1.5h3.25v3.25a.75.75 0 001.5 0V7.25h3.25a.75.75 0 000-1.5z\"/><path fill=\"none\" d=\"M0 0h13v13H0z\"/></g></g>   \n                    </svg>            \n                </div> `;\n    return div.firstChild as HTMLElement;\n}\n\nexport class ColumnAddButtonRenderer extends Component {\n\n    constructor() {\n        super(getTemplate());\n    }\n\n    init(_params : any) {\n        this.addListener(this.getGui(), 'mousedown',(event : KeyboardEvent)=>{\n            // const count = 1;\n            event.preventDefault();\n            // const gridAPI = params.api as GridApi;\n            // gridAPI.appendColumns(count);\n        })\n    }\n\n    getElement() {\n        return this.getGui();\n    }\n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { Events } from \"../../Constants/Events\";\nimport { IGridConfiguration } from \"../../Interface/IGridConfiguration\";\nimport { ColumnBufferItem } from \"./ColumnBufferItem\";\nimport { GRID_BEAN_NAME } from \"../../Constants/BeanName\";\n\n\n@Bean(GRID_BEAN_NAME.COLUMN_BUFFER_HANDLER)\nexport class ColumnBufferHandler extends EventEmitter {\n    private columnBufferItem: ColumnBufferItem;\n\n    private isAddColumnButton : boolean = false;\n\n    constructor() {\n        super();\n        this.columnBufferItem = new ColumnBufferItem();\n    }\n\n    setColumnBuffer(configuration : IGridConfiguration) : void {\n\t\tthis.setUserParams(configuration.addColumnButtonRendererParams);\n\t\tthis.setRenderer(configuration.addColumnButtonRenderer);\n        this.attachAddColumnButton(configuration.addColumnButton);\n        this.setWidth(configuration.endBufferWidth);\n    }\n\n    attachAddColumnButton(addColumnButton : boolean) : void {\n        const height = this.columnBufferItem.getWidth() ?? 42;\n        if(addColumnButton) {\n            this.isAddColumnButton = addColumnButton;\n            if(this.isAddColumnButton == true) {\n\t\t\t\tthis.setWidth(height);\n                this.dispatchRendererEvents();\n                return;\n            }\n        }\n        this.setWidth(0);\n        this.dispatchRendererDestroyEvents();\n    }\n\n    setWidth(height : number) : void {\n        if (this.columnBufferItem && !isNaN(height)) {\n\t\t\tthis.columnBufferItem.setWidth(height);\n\n\t\t\tthis.dispatchWidthEvents();\n\t\t}\n    }\n\n    setRenderer(renderer : any) : void {\n        if (this.columnBufferItem && renderer) {\n\t\t\tthis.columnBufferItem.setRenderer(renderer);\n\t\t\tthis.dispatchRendererEvents();\n\t\t}\n    }\n\n    private dispatchWidthEvents() {\n        this.dispatchEvent({\n            type: Events.EVENT_COLUMN_BUFFER_CONTAINER_WIDTH_CHANGED,\n        });\n    }\n\n    private dispatchRendererEvents() {\n        this.dispatchEvent({\n            type: Events.EVENT_COLUMN_BUFFER_RENDERER_CHANGED,\n        });\n    }\n\n    private dispatchRendererDestroyEvents() {\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_PLUS_RENDERER_DESTROY\n        })\n    }\n\n    setUserParams(params : any) : void {\n        if (this.columnBufferItem && params) {\n            this.columnBufferItem.setUserParams(params);\n        }\n    }\n\n    getColumnBufferItem() : ColumnBufferItem {\n        return this.columnBufferItem;\n    }\n\n    getAddColumnButton() : boolean {\n        return this.isAddColumnButton;\n    }\n\n    getWidth() : number {\n        return this.columnBufferItem?.getWidth() ?? 0;\n    }\n}","import { EventEmitter } from \"@dg/corecomponent\";\n\nexport class ColumnBufferItem extends EventEmitter {\n    private width: number;\n    private renderer : any;\n    private params : any = {};\n    constructor() {\n        super();\n    }\n\n    setWidth(width : number) {\n        this.width = width ?? this.width;\n    }\n\n    setRenderer(renderer : any) {\n        this.renderer = renderer;\n    }\n\n    setUserParams(params : any) {\n        this.params = params;\n    }\n\n    getUserParams() {\n        return this.params ?? {};\n    }\n\n    getRenderer() {\n        return this.renderer;\n    }\n\n    getWidth() {\n        return this.width;\n    }\n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { Events } from \"../../Constants/Events\";\nimport { IGridConfiguration } from \"../../Interface/IGridConfiguration\";\nimport { RowBufferItem } from \"./RowBufferItem\";\nimport { GRID_BEAN_NAME } from \"../../Constants/BeanName\";\n\n@Bean(GRID_BEAN_NAME.ROW_BUFFER_HANDLER)\nexport class RowBufferHandler extends EventEmitter {\n\n    private rowBufferItem: RowBufferItem;\n\n    private isAddRowButton : boolean = false;\n\n    constructor() {\n        super();\n        this.rowBufferItem = new RowBufferItem();\n    }\n\n    setRowBuffer(configuration : IGridConfiguration) : void {\n        this.setUserParams(configuration.addRowButtonRendererParams);\n        this.setHeight(configuration.endBufferHeight);\n        this.setRenderer(configuration.addRowButtonRenderer);\n        this.attachAddRowButton(configuration.addRowButton);\n    }\n\n    attachAddRowButton(addRowButton : boolean) : void {\n        const height = addRowButton ?this.rowBufferItem.getHeight() ?? 42 : (this.rowBufferItem.getHeight() ?? 0);\n        if(addRowButton) {\n            this.isAddRowButton = addRowButton;\n            if(this.isAddRowButton == true) {\n\t\t\t\tthis.setHeight(height);\n                this.dispatchRendererEvents();\n                return;\n            }\n        }\n        this.setHeight(height);\n        this.dispatchRendererDestroyEvents();\n    }\n\n    setHeight(height : number) : void {\n        if (this.rowBufferItem && !isNaN(height)) {\n\t\t\tthis.rowBufferItem.setHeight(height);\n\n\t\t\tthis.dispatchHeightEvents();\n\t\t}\n    }\n\n    setRenderer(renderer : any) : void {\n        if(this.rowBufferItem && renderer) {\n            this.rowBufferItem.setRenderer(renderer);\n            this.dispatchRendererEvents();\n        }\n    }\n\n    private dispatchHeightEvents() {\n        this.dispatchEvent({\n            type: Events.EVENT_ROW_PLUS_CONTAINER_HEIGHT_CHANGED,\n        });\n    }\n\n    private dispatchRendererEvents() {\n        this.dispatchEvent({\n            type: Events.EVENT_ROW_PLUS_RENDERER_CHANGED,\n        });\n    }\n\n    private dispatchRendererDestroyEvents() {\n        this.dispatchEvent({\n            type : Events.EVENT_ROW_PLUS_RENDERER_DESTROY\n        })\n    }\n\n    setUserParams(params : any) : void {\n        if (this.rowBufferItem && params) {\n            this.rowBufferItem.setUserParams(params);\n        }\n    }\n\n    getrowBufferItem() : RowBufferItem {\n        return this.rowBufferItem;\n    }\n\n    getAddRowButton() : boolean {\n        return this.isAddRowButton;\n    }\n}","import { EventEmitter } from \"@dg/corecomponent\";\n\nexport class RowBufferItem extends EventEmitter {\n    private height: number;\n    private renderer : any;\n    private params : any = {};\n    constructor() {\n        super();\n    }\n\n    setHeight(height : number) {\n        this.height = height ?? this.height;\n    }\n\n    setRenderer(renderer : any) {\n        this.renderer = renderer;\n    }\n\n    setUserParams(params : any) {\n        this.params = params;\n    }\n\n    getUserParams() {\n        return this.params ?? {};\n    }\n\n    getRenderer() {\n        return this.renderer;\n    }\n\n    getHeight() {\n        return this.height;\n    }\n}","import { Component } from \"@dg/corecomponent\";\n// import { GridApi } from \"../../../API/GridApi\";\n\nfunction getTemplate() {\n    const div = document.createElement('div');\n    div.innerHTML = `<div class=\"ZG-addRowBtn\">\n                <svg class=\"icon\" width=\"16\" height=\"16\" viewBox=\"-1 -1 15 15\">\n                    <g data-name=\"Layer 2\"><g data-name=\"Fill Icon\"><path d=\"M10.5 5.75H7.25V2.5a.75.75 0 00-1.5 0v3.25H2.5a.75.75 0 000 1.5h3.25v3.25a.75.75 0 001.5 0V7.25h3.25a.75.75 0 000-1.5z\"/><path fill=\"none\" d=\"M0 0h13v13H0z\"/></g></g>   \n                </svg>            \n            </div> `;\n    return div.firstChild as HTMLElement;\n}\n\nexport class RowPlusRenderer extends Component {\n\n    constructor() {\n        super(getTemplate());\n    }\n\n    init(_params : any) {\n        this.addListener(this.getGui(), 'mousedown',(event : KeyboardEvent)=>{\n            // const count = 1;\n            // const gridAPI = params.api as GridApi;\n            // gridAPI.appendRows(count);\n            event.preventDefault();\n        })\n    }\n\n    getElement() {\n        return this.getGui();\n    }\n}","import { Bean, EventEmitter } from '@dg/corecomponent';\nimport { IColumnNode } from './Interface/IColumnNode';\nimport { GRID_BEAN_NAME } from './Constants/BeanName';\n\n@Bean(GRID_BEAN_NAME.COLUMN_HOVER_HANDLER)\nexport class ColumnHoverHandler extends EventEmitter {\n\n\tprivate selectedColumns: IColumnNode[] | null;\n\n\tpublic setMouseOver(columns: IColumnNode[]): void {\n\t\tthis.selectedColumns = columns;\n\t}\n\n\tpublic clearMouseOver(): void {\n\t\tthis.selectedColumns = null;\n\t}\n\n\tpublic isHovered(column: IColumnNode): boolean {\n\t\treturn (\n\t\t\t!!this.selectedColumns && this.selectedColumns.indexOf(column) >= 0\n\t\t);\n\t}\n}\n","import { AutoWired, Bean, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { Events } from \"../Constants/Events\";\nimport { FieldHandler } from \"./FieldHandler\";\nimport { MOVE_POSITION } from \"../Constants/GridConstants\";\nimport { IControllerHandler } from \"../Interface/IControllerHandler\";\nimport { GridBodyController } from \"Grid/GridComponent/GridBodyComponent/GridBodyController\";\nimport { ColumnBufferHandler } from \"../Buffer/column/ColumnBufferHandler\";\nimport { GridOptioHandler } from \"../GridOptionHandler\";\n\n@Bean(GRID_BEAN_NAME.AUTO_UNPINNED_LEFT_COLUMNS)\nexport class AutoUnpinnedLeftColumns extends EventEmitter {\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler!: FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler: IControllerHandler;\n    @AutoWired(GRID_BEAN_NAME.COLUMN_BUFFER_HANDLER) private columnBufferHandler: ColumnBufferHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler: GridOptioHandler;\n    \n    private bodyContainerController: GridBodyController;\n    private autoUnpinnedLeftColumns: string[] = [];\n\n    @PostConstruct()\n    init() {\n        this.controllerHandler.onAfterGridReady(() => {\n            this.bodyContainerController = this.controllerHandler.getBodyController();\n            this.addListener(this.eventHandler, Events.EVENT_GRID_DIMENSION_CHANGED, this.updateLeftPinnedColumns.bind(this));\n            this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_RESIZE_CHANGED, this.updateLeftPinnedColumns.bind(this));\n            this.addListener(this.eventHandler, Events.EVENT_COLUMN_DELETE, () => {\n                this.autoUnpinnedLeftColumns.forEach((column) => {\n                    const columnNode = this.fieldHandler.getColumnNodeByID(column);\n                    if(!columnNode) {\n                        this.autoUnpinnedLeftColumns.splice(this.autoUnpinnedLeftColumns.indexOf(column), 1);\n                    }\n                })\n\n                this.updateLeftPinnedColumns();\n            })\n        });\n    }\n\n    isAllColumnsHidden() : boolean {\n        const centerHandler = this.fieldHandler.getCenterHandler();\n        return centerHandler.getHiddenFieldCount() === (centerHandler.getColumnCount() - this.autoUnpinnedLeftColumns.length);\n    }\n\n    private updateLeftPinnedColumns() {\n        if (!this.optionHandler.isAutoUnpinnedColumns()) {\n            return;\n        }\n        const width = this.bodyContainerController.getViewportWidth();\n        const columnBufferWidth = this.columnBufferHandler.getWidth() ?? 0;\n\t\tconst headerWidth = this.fieldHandler.getDisplayedColumnsHeaderWidth()\n\t\tlet leftPinWidth = this.fieldHandler.getDisplayedColumnsLeftWidth();\n\n\t\tconst effectiveWidth = columnBufferWidth === 0 ? width * 0.9 : width;\n\n\t\twhile (leftPinWidth + headerWidth + columnBufferWidth  > effectiveWidth) {\n\t\t\tconst leftPinnedIds = this.fieldHandler.getLeftPinnedIds();\n\t\t\tif (leftPinnedIds.length === 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst columnToUnpin = leftPinnedIds[leftPinnedIds.length - 1];\n\t\t\tthis.fieldHandler.changePinPosition([columnToUnpin], 'none', {\n\t\t\t\tinsertIndex: 0,\n\t\t\t\tinsertPosition: MOVE_POSITION.BEFORE\n\t\t\t});\n\n\t\t\tthis.autoUnpinnedLeftColumns.unshift(columnToUnpin);\n\n\t\t\tleftPinWidth = this.fieldHandler.getDisplayedColumnsLeftWidth();\n\t\t}\n\n\t\tif (leftPinWidth + headerWidth + columnBufferWidth  <= effectiveWidth && this.autoUnpinnedLeftColumns.length > 0) {\n\t\t\tconst columnsToRepin: string[] = [];\n\t\t\tlet potentialWidthIncrease = 0;\n\n\t\t\tfor (let i = 0; i < this.autoUnpinnedLeftColumns.length; i++) {\n\t\t\t\tconst columnId = this.autoUnpinnedLeftColumns[i];\n\t\t\t\tconst columnNode = this.fieldHandler.getColumnNodeByID(columnId);\n\t\t\t\tif (columnNode) {\n\t\t\t\t\tconst columnWidth = columnNode.getWidth();\n\t\t\t\t\tif (leftPinWidth + headerWidth + potentialWidthIncrease + columnWidth + columnBufferWidth <= effectiveWidth) {\n\t\t\t\t\t\tcolumnsToRepin.push(columnId);\n\t\t\t\t\t\tpotentialWidthIncrease += columnWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (columnsToRepin.length > 0) {\n\t\t\t\tthis.fieldHandler.changePinPosition(columnsToRepin, 'left', {\n\t\t\t\t\tinsertIndex: this.fieldHandler.getLeftSpanCount(),\n\t\t\t\t\tinsertPosition: MOVE_POSITION.AFTER\n\t\t\t\t});\n\n\t\t\t\tthis.autoUnpinnedLeftColumns = this.autoUnpinnedLeftColumns.filter(\n\t\t\t\t\tid => !columnsToRepin.includes(id)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthis.dispatchEvent({\n            type : Events.EVENT_AUTO_UNPINNED_LEFT_COLUMNS_REFRESH,\n            force : true\n        })\n\t}\n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IColumnDefinition } from \"../Interface/IColumnDefinition\";\nimport { IColumnDataTypeHandler } from \"./Interface/IColumnDataTypeHandler\";\nimport { CELL_RENDERING_COMPONENT } from \"../Constants/GridConfigurationConstants\";\n\n\nexport type FieldTypes = 'text' | 'multiline' | 'number' | 'currency' | 'percent' | 'link' | 'email' | 'checkbox' | 'date' | 'rating' | 'phone_number' | 'single_select ' | 'multi_select'\nconst FIELD_TYPE = {\n    TEXT : 'text' as FieldTypes,\n    MULTILINE : 'multiline' as FieldTypes,\n    NUMBER : 'number' as FieldTypes,\n    CURRENCY : 'currency' as FieldTypes,\n    PERCENT : 'percent' as FieldTypes,\n    PHONE_NUMBER : 'phone_number' as FieldTypes,\n    LINK : 'link' as FieldTypes,\n    EMAIL : 'email' as FieldTypes,\n    CHECKBOX : 'checkbox'as FieldTypes ,\n    DATE : 'date' as FieldTypes,\n    RATING : 'rating' as FieldTypes,\n    SingleSelect : 'single_select' as FieldTypes,\n    MultiSelect :'multi_select' as FieldTypes,\n}\n\n\n    \n\n\n\n@Bean(GRID_BEAN_NAME.COLUMN_DATA_TYPE_HANDLER)\nexport class ColumnDataTypeHandler extends EventEmitter implements IColumnDataTypeHandler {\n\tpublic updateColumnDefinitionAndGetColumnType(columnDefinition: IColumnDefinition) : IColumnDefinition {\n        const { type } = columnDefinition;\n\n        switch(type) {\n            case FIELD_TYPE.CURRENCY : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgCurrencyCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgCurrencyCellEditor\";\n                break;\n            }\n            case FIELD_TYPE.NUMBER : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgNumberCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgNumberCellEditor\";\n                break;\n            }\n            case FIELD_TYPE.PERCENT : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgPercentCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgPercentCellEditor\";\n                break;\n            }\n\n            case FIELD_TYPE.TEXT : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgTextCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgTextCellEditor\";\n                break;\n            }\n            case FIELD_TYPE.MULTILINE : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgMultilineRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgMultilineEditor\";\n                break;\n            }\n\n            case FIELD_TYPE.LINK :{\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgLinkCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgURLEditor\";\n                break;\n            }\n\n            case FIELD_TYPE.EMAIL :{\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgEmailRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgEmailEditor\";\n                break;\n            }\n\n            case FIELD_TYPE.PHONE_NUMBER :{\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgPhoneNumberRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgPhoneEditorRenderer\";\n                break;\n            }\n\n            case FIELD_TYPE.CHECKBOX : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? 'dgCheckboxRenderer';\n                columnDefinition.cellEditor   = columnDefinition.cellEditor?? \"dgCheckboxEditor\";\n                break;\n            }\n\n            case FIELD_TYPE.DATE : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgDateCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgDateCellEditor\";\n\n            }\n            case FIELD_TYPE.RATING : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer ?? \"dgRatingCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgRatingCellEditor\";\n\n            }\n\n            case FIELD_TYPE.SingleSelect : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer?? \"dgSingleSelectCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgSingleSelectCellEditor\";\n            }\n\n            case FIELD_TYPE.MultiSelect : {\n                columnDefinition.cellRenderer = columnDefinition.cellRenderer?? \"dgMultiSelectCellRenderer\";\n                columnDefinition.cellEditor   = columnDefinition.cellEditor ?? \"dgMultiSelectCellEditor\";\n            }\n            \n        }\n\n        return columnDefinition;\n    }\n\n    modifyCellRenderer(columnDefinition: IColumnDefinition) : IColumnDefinition {\n        const { cellRenderer } = columnDefinition;\n        if(typeof cellRenderer == 'string'){\n            columnDefinition.cellRenderer = CELL_RENDERING_COMPONENT[cellRenderer];\n        }\n        return columnDefinition;\n    }\n}\n\nexport {\n    FIELD_TYPE\n}","import { AutoWired, Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IColumnDefinition } from \"../Interface/IColumnDefinition\";\nimport { deepMerge } from \"../utils/Object\";\nimport { IColumnDataTypeHandler } from \"./Interface/IColumnDataTypeHandler\";\nimport { IColumnHandler } from \"./Interface/IColumnHandler\";\n\n@Bean(GRID_BEAN_NAME.COLUMN_HANDLER)\nexport class ColumnHandler extends EventEmitter implements IColumnHandler {\n    @AutoWired(GRID_BEAN_NAME.COLUMN_DATA_TYPE_HANDLER) dataTypeHandler : IColumnDataTypeHandler;\n    public addColumnDefaultAndTypes(columnDefinition: IColumnDefinition): IColumnDefinition {\n        const res: IColumnDefinition = {} as IColumnDefinition;\n\n        const defaultColDef = this.optionsHandler.getDefaultColumnDefinitions();\n\n        deepMerge(res, defaultColDef);\n\n        deepMerge(res, columnDefinition);\n\n        this.dataTypeHandler.updateColumnDefinitionAndGetColumnType(res);\n\n        this.dataTypeHandler.modifyCellRenderer(res);\n\n        return res;\n    }\n}","import { DGEvent, EventHandler, IComponent } from \"@dg/corecomponent\";\nimport { COLUMN_NODE_EVENTS } from \"../Constants/Events\";\nimport { columnDataType, columnPinPositions, defaultColumnWidth, defaultMaxWidth, defaultMinWidth, rowHeaderPosition } from \"../Constants/GridConfigurationConstants\";\nimport { CellEditorParamsFunction, CellEditorSelectorFunction, CellLoadingRendererParamsFunction, CellLoadingRendererSelectorFunction, CellRendererParamsFunction, CellRendererSelectorFunction, ClassConstructorType, GroupCellRendererParamsFunction, GroupCellRendererSelectorFunction, HeaderCellRendererParamsFunction, HeaderCellRendererSelectorFunction, IColumnDefinition, IHeaderEditableParams, IRecordHeaderColumnDefinitions, SummaryCellRendererParamsFunction, SummaryCellRendererSelectorFunction } from \"../Interface/IColumnDefinition\";\nimport { CellEditorPopupPosition, ColumnHighlightPosition, IColumnNode, IColumnNodeDS, IRecordHeaderColumnNode} from \"../Interface/IColumnNode\";\nimport { ISummaryCellRenderer } from \"../../GridComponent/Interface/SummaryCellRenderer/ISummaryCellRenderer\";\nimport { ICellRendererComponent } from \"../../GridComponent/Interface/CellRenderer/ICellRendererComponent\";\nimport { IHeaderCellRendererComponent } from \"../../GridComponent/Interface/HeaderCellRenderer/IHeaderCellRendererComponent\";\nimport { ISummaryCellRendererParams } from \"../../GridComponent/Interface/SummaryCellRenderer/ISummaryCellRendererParams\";\nimport { ILoadingCellRendererComponent } from \"../../GridComponent/Interface/LoadingCellRenderer/ILoadingCellRenderer\";\nimport { IRowNodeCore } from \"../../../DataStore/rownode.types\";\nimport { VIEW_TYPE } from \"./FieldHandler\";\nimport { DateTime } from 'luxon';\n\n\nconst headerPosition : rowHeaderPosition = 'rowHeader';\n\ninterface IColumnNodeHelper {\n    getColumnWidth(id   : string) : number;\n    getLeft(id          : string) : number;\n    getIndexById(id     : string) : number;\n    setColumnWidth(id   : string, width : number) : void;\n\tisHide(id: string): boolean;\n}\n\n\nexport class ColumnNode implements IColumnNode {\n\t        #columnData        : IColumnNodeDS;\n\t    private eventHandler!     : EventHandler;\n\t        #userConfiguration : IColumnDefinition;\n\n\t\t\tprivate timeFrameCount : number;\n\t\t\tprivate weekEnds : number[];\n\t\t\tprivate timeFrame: DateTime;\n\t\t\tprivate topTierTitle : string;\n\t\t\tprivate bottomTierData : string[] \n\n\tprivate helper             : IColumnNodeHelper;\n\tprivate highlighted : ColumnHighlightPosition = null;\n\tconstructor(id: string, helper : IColumnNodeHelper , definition : IColumnDefinition = {}) {\n\t\tthis.#columnData        = this.constructNode(id, definition);\n\t\tthis.#userConfiguration = definition;\n\t\tthis.helper             = helper;\n\n\t\tthis.setColumntData()\n\n\t\tObject.seal(this.#columnData);\n\t}\n\n\tprivate setColumntData(){\n\t\tconst viewType = (this.#userConfiguration.headerCellRendererParams as any)?.timeLineViewType\n\t\tthis.timeFrame = (this.#userConfiguration.headerCellRendererParams as any)?.date;\n\t\tthis.topTierTitle =  (this.#userConfiguration.headerCellRendererParams as any)?.topTierTitle\n\t\tthis.bottomTierData = (this.#userConfiguration.headerCellRendererParams as any)?.bottomTierData\n\t\tthis.timeFrameCount = (this.#userConfiguration.headerCellRendererParams as any)?.bottomTierCount\n\n\n\t\tif(viewType === VIEW_TYPE.WEEK){\n\t\t\tthis.weekEnds = []\n\t\t}else if(viewType === VIEW_TYPE.DAY){\n\t\t\tthis.weekEnds = []\n\t\t}else if(viewType === VIEW_TYPE.YEAR){\n\t\t\tthis.weekEnds = []\n\t\t}else if(viewType === VIEW_TYPE.MONTH){\n\t\t\tthis.weekEnds = []\n\t\t}\n\t\telse if(viewType === VIEW_TYPE.QUARTER){\n\t\t\tthis.weekEnds = []\n\t\t}\n\n\n\t}\n\tgetHeaderCellEditor() {\n\t\treturn this.#columnData.headerCellEditor;\n\t}\n\tgetHeaderCellEditorParams() {\n\t\treturn this.#columnData.headerCellEditorParams;\n\t}\n\tgetFlex(): number {\n\t\treturn this.#columnData.flex;\n\t}\n\tupdateFlex(flex: number): void {\n\t\tthis.#columnData.flex = flex;\n\t}\n\n\tupdateHelper(helper : IColumnNodeHelper) : void{\n\t\tthis.helper = helper;\n\t}\n\n\tupdateComputedWidth(_width: number): void {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tgetUserColumnDefinition() {\n\t\treturn this.#userConfiguration;\n\t}\n\n\tupdateUserDefinition(columnDefinition: IColumnDefinition): void {\n\t\tthis.#userConfiguration = {\n\t\t\t...this.#userConfiguration,\n\t\t\t...columnDefinition,\n\t\t};\n\t\tthis.#columnData = this.constructNode(\n\t\t\tthis.#userConfiguration.columnId,\n\t\t\tthis.#userConfiguration,\n\t\t);\n\t\tthis.dispatchEvent({\n\t\t\ttype: COLUMN_NODE_EVENTS.EVENT_COLUMN_DEFINITION_CHANGED,\n\t\t});\n\t}\n\n\tconstructNode( id: string, sourceData?: IColumnDefinition ): IColumnNodeDS {\n\t\treturn {\n\t\t\tid,\n\t\t\tpinned         : sourceData?.pinPosition ?? 'center',\n\t\t\twidth          : (sourceData?.width === 'auto') ? defaultColumnWidth : (sourceData?.width ?? defaultColumnWidth),\n\t\t\tflex           : sourceData?.flex ?? 0,\n\t\t\tlocked         : sourceData?.locked ?? null,\n\t\t\tfieldKey       : sourceData?.columnKey ?? '',\n\t\t\tdataType       : sourceData?.dataType ?? 'string',\n\t\t\tminWidth       : sourceData?.minWidth ?? defaultMinWidth,\n\t\t\tmaxWidth       : sourceData?.maxWidth ?? defaultMaxWidth,\n\t\t\tresizable      : sourceData?.resizable ?? false,\n\t\t\ttype           : sourceData.type,\n\t\t\tfieldProperties: sourceData.fieldProperties,\n\n\t\t\tdragging : null,\n\t\t\tselected : null,\n\t\t\tcellClass: sourceData?.cellClass ?? null,\n\n\t\t\thide      : sourceData.hidden ?? false,\n\t\t\theaderName: sourceData?.headerName ?? null,\n\n\t\t\t\t\t\t\t\t\t\t\t  // cell renderer\n\t\t\trenderer            : sourceData?.cellRenderer ?? null,\n\t\t\tcellRendererParams  : sourceData?.cellRendererParams ?? null,\n\t\t\tcellRendererSelector: sourceData?.cellRendererSelector ?? null,\n\n\t\t\t\t\t\t\t\t\t\t\t  //header cell renderer\n\t\t\theaderRenderer            : sourceData?.headerCellRenderer ?? null,\n\t\t\theaderCellRendererParams  : sourceData?.headerCellRendererParams ?? null,\n\t\t\theaderCellRendererSelector: sourceData?.headerCellRendererSelector ?? null,\n\n\t\t\t\t\t\t\t\t\t\t\t  // summary cell renderer\n\t\t\tsummaryRenderer            : sourceData?.summaryCellRenderer ?? null,\n\t\t\tsummaryCellRendererParams  : sourceData?.summaryCellRendererParams ?? null,\n\t\t\tsummaryCellRendererSelector: sourceData?.summaryCellRendererSelector ?? null,\n\n\t\t\t\t\t\t\t\t\t\t\t  // loading cell renderer\n\t\t\tloadingRenderer        : sourceData?.loadingRenderer ?? null,\n\t\t\tloadingRendererParams  : sourceData?.loadingRendererParams ?? null,\n\t\t\tloadingRendererSelector: sourceData?.loadingRendererSelector ?? null,\n\n\t\t\t\t\t\t\t\t\t\t\t  // cell editor\n\n\t\t\tcellEditor             : sourceData?.cellEditor ?? null,\n\t\t\tcellEditorParams       : sourceData?.cellEditorParams ?? null,\n\t\t\tcellEditorSelector     : sourceData?.cellEditorSelector ?? null,\n\t\t\tcellEditorPopup        : sourceData?.cellEditorPopup ?? false,\n\t\t\tcellEditorPopupPosition: sourceData?.cellEditorPopupPosition ?? null,\n\n\n\t\t\theaderCellEditor             : sourceData.headerCellEditor ?? null,\t\n\t\t\theaderCellEditorParams       : sourceData.headerCellEditorParams ?? null,\n\t\t\t//toolTip\n\t\t\theaderCellToolTipRenderer        : sourceData.headerCellToolTipRenderer ?? null,\n\t\t\theaderCellToolTipRendererParams  : sourceData.headerCellToolTipRendererParams ?? null,\n\t\t\theaderCellToolTipRendererSelector: sourceData.headerCellToolTipRendererSelector ?? null,\n\t\t\ttoolTipRenderer                  : sourceData.toolTipRenderer ?? null,\n\t\t\ttoolTipRendererParams            : sourceData.toolTipRendererParams ?? null,\n\t\t\ttoolTipRendererSelector          : sourceData.toolTipRendererSelector ?? null,\n\n\t\t\tsuppressNavigation              : sourceData.suppressNavigation,\n\t\t\tuseValueFormatterForExport      : sourceData.useValueFormatterForExport,\n\t\t\tnonEditableMessage              : sourceData.nonEditableMessage,\n\t\t\tnonEditableMessageRenderer      : sourceData.nonEditableMessageRenderer,\n\t\t\tnonEditableMessageRendererParams: sourceData.nonEditableMessageRendererParams,\n\t\t\tshowNonEditableMessage          : sourceData.showNonEditableMessage,\n\n\t\t\teditable                         : sourceData.editable,\n\t\t\theaderEditable                   : sourceData.headerEditable,\n\t\t\tenterNavigatesVertically         : sourceData.enterNavigatesVertically ?? false,\n\t\t\tenterNavigatesVerticallyAfterEdit: sourceData.enterNavigatesVerticallyAfterEdit ?? false,\n\t\t\tdraggable                        : sourceData.draggable ?? false,\n\n\t\t\tgroupCellRenderer         : sourceData.groupCellRenderer,\n\t\t\tgroupCellRendererParams   : sourceData.groupCellRendererParams,\n\t\t\tgroupCellRendererSelectors: sourceData.groupCellRendererSelectors\n\t\t};\n\t}\n\n\tprivate dispatchEvent(event: DGEvent) {\n\t\tif (this.eventHandler) {\n\t\t\tthis.eventHandler.dispatchEvent(event);\n\t\t}\n\t}\n\n\t//getters\n\n\tgetCellClass():\n\t\t| string\n\t\t| CallableFunction\n\t\t| string[]\n\t\t| null\n\t\t| undefined {\n\t\treturn this.#columnData.cellClass;\n\t}\n\n\tgetID(): string {\n\t\t//no setter\n\t\treturn this.#columnData.id;\n\t}\n\n\tgetPinnedPosition(): columnPinPositions {\n\t\treturn this.#columnData.pinned;\n\t}\n\n\tgetIndex(): number {\n\t\tconst id = this.getID();\n\t\treturn this.helper.getIndexById(id);\n\t}\n\n\tgetLeft(): number {\n\t\tconst id = this.getID();\n\t\treturn this.helper.getLeft(id);\n\t}\n\n\tgetWidth(): number {\n\t\tconst id = this.getID();\n\t\treturn this.helper.getColumnWidth(id);\n\t}\n\n\n\tisLocked(): boolean | null {\n\t\treturn this.#columnData.locked;\n\t}\n\tisEditable(params : any): boolean | null {\n\t\tconst editable = this.#columnData.editable ?? true;\n\t\tlet isEditable = editable;\n\n\n\t\tif(typeof editable === 'function') {\n\t\t\tisEditable = editable(params)\n\t\t}\n\t\treturn isEditable  && !this.isLocked();\n\t}\n\n\tisHeaderEditable(params : IHeaderEditableParams ): boolean | null {\n\t\tconst editable = this.#columnData.headerEditable ?? true;\n\t\tlet isEditable = editable;\n\t\tif(typeof editable === 'function') {\n\t\t\tisEditable = editable(params)\n\t\t}\n\t\treturn isEditable  && !this.isLocked();\n\t}\n\n\tgetColumnKey(): string {\n\t\treturn this.#columnData.fieldKey;\n\t}\n\n\tgetDataType(): columnDataType {\n\t\treturn this.#columnData.dataType;\n\t}\n\n\tgetMinWidth(): number {\n\t\treturn this.#columnData.minWidth;\n\t}\n\n\tgetMaxWidth(): number {\n\t\treturn this.#columnData.maxWidth;\n\t}\n\n\tisResizable(): boolean {\n\t\treturn this.#columnData.resizable;\n\t}\n\n\tisDragging(): boolean | null {\n\t\treturn this.#columnData.dragging;\n\t}\n\n\tisSelected(): boolean | null {\n\t\treturn this.#columnData.selected;\n\t}\n\n\tgetHeaderName(): string {\n\t\treturn this.#columnData.headerName;\n\t}\n\n\tisHide(): boolean {\n\t\treturn this.helper.isHide(this.getID());\n\t}\n\n\tgetFieldProperties():any{\n\t\treturn this.#columnData.fieldProperties;\n\n\t}\n\n\t// cell renderer\n\n\tgetRenderer(): ICellRendererComponent | string | null {\n\t\treturn this.#columnData.renderer;\n\t}\n\n\tgetCellRendererParams(): Object | CellRendererParamsFunction {\n\t\treturn this.#columnData.cellRendererParams;\n\t}\n\n\tgetCellRendererSelector(): CellRendererParamsFunction {\n\t\treturn this.#columnData.cellRendererSelector;\n\t}\n\n\t// header cell renderer\n\n\tgetHeaderRenderer(): IHeaderCellRendererComponent | string | null {\n\t\treturn this.#columnData.headerRenderer;\n\t}\n\n\tgetHeaderCellRendererParams():\n\t\t| Object\n\t\t| HeaderCellRendererParamsFunction {\n\t\treturn this.#columnData.headerCellRendererParams;\n\t}\n\n\tgetHeaderCellRendererSelector(): HeaderCellRendererSelectorFunction {\n\t\treturn this.#columnData.headerCellRendererSelector;\n\t}\n\n\t// loading cell renderer\n\n\tgetLoadingRenderer(): string | ILoadingCellRendererComponent {\n\t\treturn this.#columnData.loadingRenderer;\n\t}\n\n\tgetLoadingRendererParams():\n\t\t| CellLoadingRendererParamsFunction\n\t\t| Object\n\t\t| null {\n\t\treturn this.#columnData.loadingRendererParams;\n\t}\n\n\tgetLoadingRendererSelector(): CellLoadingRendererSelectorFunction {\n\t\treturn this.#columnData.loadingRendererSelector;\n\t}\n\n\t// summary cell renderer\n\n\tgetSummaryRenderer(): ISummaryCellRenderer | string | null {\n\t\treturn this.#columnData.summaryRenderer;\n\t}\n\n\tgetSummaryCellRendererParams():\n\t\t| Object\n\t\t| SummaryCellRendererParamsFunction {\n\t\treturn this.#columnData.summaryCellRendererParams;\n\t}\n\n\tgetSummaryCellRendererSelector(): SummaryCellRendererSelectorFunction {\n\t\treturn this.#columnData.summaryCellRendererSelector;\n\t}\n\n\t// cell editor renderer\n\n\tgetCellEditor() {\n\t\treturn this.#columnData.cellEditor;\n\t}\n\n\tgetCellEditorSelector(): CellEditorSelectorFunction {\n\t\treturn this.#columnData.cellEditorSelector;\n\t}\n\n\tgetCellEditorParams(): Object | CellEditorParamsFunction {\n\t\treturn this.#columnData.cellEditorParams;\n\t}\n\n\tgetCellEditorPopupPosition(): CellEditorPopupPosition {\n\t\treturn this.#columnData.cellEditorPopupPosition;\n\t}\n\n\tisCellEditorPopup(): boolean {\n\t\treturn this.#columnData.cellEditorPopup;\n\t}\n\n\t//setters\n\n\tupdatePinPosition(position: columnPinPositions): void {\n\t\tthis.#columnData.pinned = position;\n\t}\n\tupdateWidth(width: number): void {\n\t\tconst id = this.getID();\n\t\twidth = Math.max(width, this.#columnData.minWidth);\n        width = Math.min(width, this.#columnData.maxWidth);\n\t\tthis.helper.setColumnWidth(id, width);\n\t}\n\tupdateLockedState(state: boolean): void {\n\t\tthis.#columnData.locked = state;\n\t}\n\tupdateFieldKey(): string {\n\t\treturn this.#columnData.fieldKey;\n\t}\n\tupdateDataType(dataType: columnDataType): void {\n\t\tthis.#columnData.dataType = dataType;\n\t}\n\tupdateMinWidth(minWidth: number): void {\n\t\tthis.#columnData.minWidth = minWidth;\n\t}\n\tupdateMaxWidth(maxWidth: number): void {\n\t\tthis.#columnData.maxWidth = maxWidth;\n\t}\n\tupdateDraggingState(state: boolean): void {\n\t\tthis.#columnData.dragging = state;\n\t\tthis.dispatchEvent({\n\t\t\ttype : \"EVENT_COLUMN_DRAGGING\"\n\t\t})\n\t}\n\tupdateSelectedState(state: boolean): void {\n\t\tthis.#columnData.selected = state;\n\t}\n\n\tupdateHide(hide: boolean): void {\n\t\tthis.#columnData.hide = hide;\n\t}\n\n\tupdateHeaderName(name: string): void {\n\t\tthis.#columnData.headerName = name;\n\t}\n\n\t// cell renderer\n\n\tupdateRenderer(renderer: ICellRendererComponent): void {\n\t\tthis.#columnData.renderer = renderer;\n\t}\n\n\tupdateCellRendererParams(\n\t\tcellRendererParams: CellRendererParamsFunction,\n\t): void {\n\t\tthis.#columnData.cellRendererParams = cellRendererParams;\n\t}\n\n\tupdateCellRendererSelector(\n\t\tcellRendererSelector: CellRendererSelectorFunction,\n\t): void {\n\t\tthis.#columnData.cellRendererSelector = cellRendererSelector;\n\t}\n\n\t// header cell renderer\n\n\tupdateHeaderRender(headerRenderer: IHeaderCellRendererComponent): void {\n\t\tthis.#columnData.headerRenderer = headerRenderer;\n\t}\n\n\tupdateHeaderCellRendererParams(\n\t\theaderCellRendererParams: HeaderCellRendererParamsFunction,\n\t): void {\n\t\tthis.#columnData.headerCellRendererParams =\n\t\t\theaderCellRendererParams;\n\t}\n\n\tupdateHeaderCellRendererSelector(\n\t\tselector: HeaderCellRendererSelectorFunction,\n\t): void {\n\t\tthis.#columnData.headerCellRendererSelector = selector;\n\t}\n\n\t// loading cell renderer\n\n\tupdateLoadingRenderer(renderer: any): void {\n\t\tthis.#columnData.loadingRenderer = renderer;\n\t}\n\n\tupdateLoadingRendererParams(\n\t\tparams: CellLoadingRendererParamsFunction | Object | null,\n\t): void {\n\t\tthis.#columnData.loadingRendererParams = params;\n\t}\n\n\tupdateLoadingRendererSelector(\n\t\tselector: CellLoadingRendererSelectorFunction,\n\t): void {\n\t\tthis.#columnData.loadingRendererSelector = selector;\n\t}\n\n\t// summary cell render\n\n\tupdateSummaryCellRenderer(\n\t\tsummaryCellRenderer: ISummaryCellRenderer<ISummaryCellRendererParams>,\n\t): void {\n\t\tthis.#columnData.summaryRenderer = summaryCellRenderer;\n\t}\n\n\tupdateSummaryCellRendererParams(\n\t\tsummaryCellRendererParams: SummaryCellRendererParamsFunction,\n\t): void {\n\t\tthis.#columnData.summaryCellRendererParams =\n\t\t\tsummaryCellRendererParams;\n\t}\n\n\tupdateSummaryCellRendererSelector(\n\t\tselector: SummaryCellRendererSelectorFunction,\n\t): void {\n\t\tthis.#columnData.summaryCellRendererSelector = selector;\n\t}\n\n\t// cell editor\n\n\tupdateCellEditor(editor: any): void {\n\t\tthis.#columnData.cellEditor = editor;\n\t}\n\n\tupdateCellEditorSelector(\n\t\tcellEditorSelector: CellEditorSelectorFunction,\n\t): void {\n\t\tthis.#columnData.cellEditorSelector = cellEditorSelector;\n\t}\n\n\tupdateCellEditorParams(\n\t\tcellEditorParams: CellEditorParamsFunction,\n\t): void {\n\t\tthis.#columnData.cellEditorParams = cellEditorParams;\n\t}\n\n\tupdateCellEditorPopup(cellEditorPopup: boolean): void {\n\t\tthis.#columnData.cellEditorPopup = cellEditorPopup;\n\t}\n\n\tupdateCellEditorPopupPosition(\n\t\tcellEditorPopupPosition: CellEditorPopupPosition,\n\t): void {\n\t\tthis.#columnData.cellEditorPopupPosition = cellEditorPopupPosition;\n\t}\n\n\t//toolTip\n\n\thasToolTipRenderer(): boolean {\n\t\treturn (\n\t\t\tthis.#columnData.toolTipRenderer != null ||\n\t\t\tthis.#columnData.toolTipRendererSelector != null\n\t\t);\n\t}\n\n\thasHeaderCellToolTipRenderer(): boolean {\n\t\treturn (\n\t\t\tthis.#columnData.headerCellToolTipRenderer != null ||\n\t\t\tthis.#columnData.headerCellToolTipRendererSelector != null\n\t\t);\n\t}\n\n\n\tgetToolTipRenderer(): any {\n\t\treturn this.#columnData.toolTipRenderer;\n\t}\n\n\tgetToolTipRendererParams(): any {\n\t\treturn this.#columnData.toolTipRendererParams;\n\t}\n\n\tgetToolTipRendererSelector(): any {\n\t\treturn this.#columnData.toolTipRendererSelector;\n\t}\n\n\tgetHeaderCellToolTipRenderer(): any {\n\t\treturn this.#columnData.headerCellToolTipRenderer;\n\t}\n\n\tgetHeaderCellToolTipRendererParams(): any {\n\t\treturn this.#columnData.headerCellToolTipRendererParams;\n\t}\n\n\tgetHeaderCellToolTipRendererSelector(): any {\n\t\treturn this.#columnData.headerCellToolTipRendererSelector;\n\t}\n\n\t// events\n\taddEventListener( eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions, ): void {\n\t\tif (!this.eventHandler) {\n\t\t\tthis.eventHandler = new EventHandler();\n\t\t}\n\t\tthis.eventHandler.addEventListener(eventType, listener, async);\n\t}\n\n\tremoveEventListener( eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions, ): void {\n\t\tif (!this.eventHandler) {\n            return;\n        }\n\n        this.eventHandler.removeEventListener(eventType, listener, async);\n\t}\n\tonMouseEnter() {\n\t\tthis.dispatchEvent({\n\t\t\ttype: COLUMN_NODE_EVENTS.EVENT_MOUSE_ENTER,\n\t\t});\n\t}\n\tonMouseLeave() {\n\t\tthis.dispatchEvent({\n\t\t\ttype: COLUMN_NODE_EVENTS.EVENT_MOUSE_LEAVE,\n\t\t});\n\t}\n\n\tisSuppressNavigation(rowNode: IRowNodeCore): boolean {\n\t\tif(this.isHide()) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (typeof this.#columnData.suppressNavigation === 'boolean') {\n\t\t\treturn this.#columnData.suppressNavigation;\n\t\t}\n\n\t\tif (typeof this.#columnData.suppressNavigation === 'function') {\n\t\t\tconst params = this.createParams(rowNode);\n\t\t\tconst userFunction = this.#columnData.suppressNavigation;\n\t\t\treturn userFunction(params);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tisValueFormatterForExport(): boolean {\n\t\treturn this.#columnData.useValueFormatterForExport ?? false;\n\t}\n\n\tsetHighlighted(position : ColumnHighlightPosition | null) : void {\n        this.highlighted = position;\n\n        this.dispatchEvent({\n            type : COLUMN_NODE_EVENTS.EVENT_COLUMN_HIGHLIGHT_CHANGE\n        })\n    }\n\n    getHighlight() : ColumnHighlightPosition  {\n        return this.highlighted;\n    }\n\n\t// non editable message starts\n\n\tisNonEditableMessageEnabled(params : any): boolean | ((params : any) => boolean) {\n\t\tconst showNonEditableMessage = this.#columnData.showNonEditableMessage;\n\n\t\tlet isNonEditableMessageEnabled = showNonEditableMessage as boolean;\n\t\tif(typeof this.#columnData.showNonEditableMessage === 'function') {\n\t\t\tisNonEditableMessageEnabled = (showNonEditableMessage as ((params : any) => boolean))(params)\n\t\t}\n\t\treturn isNonEditableMessageEnabled ?? false;\n\t}\n\n\tupdateNonEditableMessageOption(showNonEditableMessage: boolean | ((params : any) => boolean)): void {\n\t\tthis.#columnData.showNonEditableMessage = showNonEditableMessage;\n\t}\n\n\tgetNonEditableMessage(): string | ((params: any) => string) | null {\n\t\treturn this.#columnData.nonEditableMessage;\n\t}\n\n\tupdateNonEditableMessage(nonEditableMessage: string | ((params: any) => string) | null): void {\n\t\tthis.#columnData.nonEditableMessage = nonEditableMessage;\n\t}\n\n\tgetNonEditableMessageRenderer(): ClassConstructorType<IComponent<any>> {\n\t\treturn this.#columnData.nonEditableMessageRenderer;\n\t}\n\n\tupdateNonEditableMessageRenderer(nonEditableMessageRenderer: ClassConstructorType<IComponent<any>>): void {\n\t\tthis.#columnData.nonEditableMessageRenderer = nonEditableMessageRenderer;\n\t}\n\n\tgetNonEditableMessageRendererParams(): { [key: string]: any; } | null {\n\t\treturn this.#columnData.nonEditableMessageRendererParams;\n\t}\n\n\tupdateNonEditableMessageRendererParams(nonEditableMessageRendererParams: { [key: string]: any; }): void {\n\t\tthis.#columnData.nonEditableMessageRendererParams = nonEditableMessageRendererParams;\n\t}\n\t// non editable message ends\n\n\t// enter navigation starts\n\t\tisEnterNavigatesVertiallyAfterEdit(): boolean {\n\t\t\treturn this.#columnData.enterNavigatesVerticallyAfterEdit;\n\t\t}\n\n\t\tupdateEnterNavigatesVertiallyAfterEdit(enterNavigatesVertiallyAfterEdit: boolean): void {\n\t\t\tthis.#columnData.enterNavigatesVerticallyAfterEdit = enterNavigatesVertiallyAfterEdit;\n\t\t}\n\n\t\tisEnterNavigatesVertically(): boolean {\n\t\t\treturn this.#columnData.enterNavigatesVertically\n\t\t}\n\n\t\tupdateEnterNavigatesVertically(enterNavigatesVertically: boolean): void {\n\t\t\tthis.#columnData.enterNavigatesVertically = enterNavigatesVertically;\n\t\t}\n\t// enter navigation ends\n\n\tisDraggable() : boolean {\n\t\treturn this.#columnData.draggable;\n\t}\n\n\t// Gantt\n\tgetTimeFrame():any{\n\t\treturn this.timeFrame\n\t}\n\n\tgetTimeFrameCount():number{\n\t\treturn this.timeFrameCount\n\t}\n\n\tgetWeekEnds(): number[]{\n\t\treturn this.weekEnds\n\n\t}\n\n\tgetTopTierTitle():string{\n\t\treturn this.topTierTitle\n\t}\n\n\tgetBottomTierData():string[]{\n\t\treturn this.bottomTierData\n\t}\n\n\tgetBottomTierIndexByDate(date: Date): number {\n\t\tconst viewType = (this.#userConfiguration.headerCellRendererParams as any)?.timeLineViewType\n\t\tconst headerParams = this.#userConfiguration.headerCellRendererParams as any;\n\n\t\tif(viewType === VIEW_TYPE.DAY){\n\t\t\t// DAY View → return hour index (0-23)\n\t\t\treturn date.getHours();\n\t\t}else if(viewType === VIEW_TYPE.MONTH){\n\t\t\t// MONTH View → return day of month - 1 (0-30)\n\t\t\treturn date.getDate() - 1;\n\t\t}else if(viewType === VIEW_TYPE.YEAR){\n\t\t\t// YEAR View → return month index (0-11)\n\t\t\treturn date.getMonth();\n\t\t}else if(viewType === VIEW_TYPE.QUARTER){\n\t\t\t// QUARTER View → return quarter index (0-3)\n\t\t\treturn Math.floor(date.getMonth() / 3);\n\t\t}else if(viewType === VIEW_TYPE.WEEK){\n\t\t\t// WEEK View → return difference in whole weeks between the given date and the timeline start date\n\t\t\tconst timelineStartDate = headerParams?.topTierData?.from;\n\t\t\t\n\t\t\tif (!timelineStartDate) {\n\t\t\t\t// Fallback: if timeline start date is not available, return 0\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Parse the timeline start date\n\t\t\tlet startDateTime: DateTime;\n\t\t\tif (DateTime.isDateTime(timelineStartDate)) {\n\t\t\t\tstartDateTime = timelineStartDate;\n\t\t\t} else if (timelineStartDate instanceof Date) {\n\t\t\t\tstartDateTime = DateTime.fromJSDate(timelineStartDate);\n\t\t\t} else {\n\t\t\t\tstartDateTime = DateTime.fromISO(timelineStartDate);\n\t\t\t}\n\n\t\t\t// Parse the given date\n\t\t\tconst targetDateTime = DateTime.fromJSDate(date);\n\n\t\t\t// Check if dates are valid\n\t\t\tif (!startDateTime.isValid || !targetDateTime.isValid) {\n\t\t\t\treturn 0;\n\t\t\t}\n\n\t\t\t// Get start of week for both dates to calculate whole weeks\n\t\t\tconst startOfWeekStart = startDateTime.startOf('week');\n\t\t\tconst startOfWeekTarget = targetDateTime.startOf('week');\n\n\t\t\t// Calculate difference in whole weeks (non-negative index)\n\t\t\tconst diffInWeeks = startOfWeekTarget.diff(startOfWeekStart, 'weeks').weeks;\n\t\t\t\n\t\t\t// Return 0 if date is before timeline start, otherwise return the week difference\n\t\t\treturn Math.max(0, Math.floor(diffInWeeks));\n\t\t}\n\n\t\t// Default return if viewType doesn't match any case\n\t\treturn 0;\n\t}\n\n\tgetGroupHeaderCellRenderer() : (new () => ICellRendererComponent) | undefined {\n\t\treturn this.#columnData.groupCellRenderer;\n\t}\n\n\tgetGroupHeaderCellRendererParams() : GroupCellRendererParamsFunction | Object {\n\t\treturn this.#columnData.groupCellRendererParams;\n\t}\n\n\tgetGroupHeaderCellRendererSelectors() : GroupCellRendererSelectorFunction {\n\t\treturn this.#columnData.groupCellRendererSelectors;\n\t}\n\n\tprivate createParams(rowNode: IRowNodeCore) {\n\t\treturn {\n\t\t\tnode : rowNode,\n\t\t\tcolumn : this\n\t\t}\n\t}\n} \n\nclass RecordHeaderColumnNode {\n    #columnHeaderData    : IRecordHeaderColumnNode;\n    private eventHandler !: EventHandler;\n    #userConfiguration : IRecordHeaderColumnDefinitions;\n    helper : IColumnNodeHelper;\n\n    constructor(id : string, helper : IColumnNodeHelper, data?: IRecordHeaderColumnDefinitions) {\n        this.#columnHeaderData = this.constructNode(id, data);\n        this.#userConfiguration = data;\n        Object.seal(this.#columnHeaderData);\n        this.helper = helper;\n    }\n\n    getUserColumnDefinition() {\n        return this.#userConfiguration;\n    }\n\n    constructNode(id : string, sourceData ?: IRecordHeaderColumnDefinitions ) : IRecordHeaderColumnNode{\n        return {\n            id ,\n            pinned  : headerPosition,\n            fieldKey: sourceData?.columnKey ?? '',\n            width   : sourceData?.width ?? defaultColumnWidth,\n            minWidth: sourceData?.minWidth ?? defaultMinWidth,\n            maxWidth: sourceData?.maxWidth ?? defaultMaxWidth,\n            hidden  : sourceData?.hidden ?? false,\n\n            // cell renderer\n            renderer            : sourceData?.cellRenderer ?? null,\n            cellRendererParams  : sourceData?.cellRendererParams ?? null,\n            cellRendererSelector: sourceData?.cellRendererSelector ?? null,\n\n            // loading cell renderer\n            loadingRenderer        : sourceData?.loadingRenderer ?? null,\n            loadingRendererParams  : sourceData?.loadingRendererParams ?? null,\n            loadingRendererSelector: sourceData?.loadingRendererSelector ?? null,\n\n\n            // summary cell renderer\n            summaryRenderer            : sourceData?.summaryCellRenderer ?? null,\n            summaryCellRendererParams  : sourceData?.summaryCellRendererParams ?? null,\n            summaryCellRendererSelector: sourceData?.summaryCellRendererSelector ?? null,\n\n\n            //header cell renderer\n            headerRenderer            : sourceData?.headerCellRenderer ?? null,\n            headerCellRendererParams  : sourceData?.headerCellRendererParams ?? null,\n            headerCellRendererSelector: sourceData?.headerCellRendererSelector ?? null,\n\n            \n            //toolTip\n            headerCellToolTipRenderer        : sourceData.headerCellToolTipRenderer ?? null,\n            headerCellToolTipRendererParams  : sourceData.headerCellToolTipRendererParams ?? null,\n            headerCellToolTipRendererSelector: sourceData.headerCellToolTipRendererSelector ?? null,\n            toolTipRenderer                  : sourceData.toolTipRenderer ?? null,\n            toolTipRendererParams            : sourceData.toolTipRendererParams ?? null,\n            toolTipRendererSelector          : sourceData.toolTipRendererSelector ?? null,\n            editorToolTipRenderer            : sourceData.editorToolTipRenderer ?? null,\n            editorToolTipRendererParams      : sourceData.editorToolTipRendererParams ?? null,\n\t\t\tgroupCellRenderer         : sourceData.groupCellRenderer,\n\t\t\tgroupCellRendererParams   : sourceData.groupCellRendererParams,\n\t\t\tgroupCellRendererSelectors: sourceData.groupCellRendererSelectors\n        }\n    }\n\n    private dispatchEvent(event : DGEvent) {\n        if (this.eventHandler) {\n            this.eventHandler.dispatchEvent(event);\n        }\n    }\n\n    //getters\n\n    updateSummaryCellRendererParams(summaryCellRendererParams: SummaryCellRendererParamsFunction): void {\n        this.#columnHeaderData.summaryCellRendererParams = summaryCellRendererParams;\n    }\n    getHeaderCellRendererParams(): Object | HeaderCellRendererParamsFunction {\n        return this.#columnHeaderData.headerCellRendererParams\n    }\n    getSummaryCellRendererParams(): Object | SummaryCellRendererParamsFunction {\n        return this.#columnHeaderData.summaryCellRendererParams;\n    }\n    updateHeaderCellRendererParams(headerCellRendererParams: HeaderCellRendererParamsFunction): void {\n        this.#columnHeaderData.headerCellRendererParams = headerCellRendererParams\n    }\n\n    getID(): string {      //no setter\n        return this.#columnHeaderData.id;\n    }\n    getPinnedPosition(): rowHeaderPosition {\n        return this.#columnHeaderData.pinned;\n    }\n    getWidth(): number {\n        const id = this.getID();\n        return this.helper.getColumnWidth(id);\n    }\n    getIndex(): number {\n        const id = this.getID();\n        return this.helper.getIndexById(id);\n    }\n    getLeft(): number {\n        const id = this.getID();\n        return this.helper.getLeft(id);\n    }\n    isLocked(): boolean | null {\n        return false;\n    }\n\n    getColumnKey() : string {\n        return this.#columnHeaderData.fieldKey;\n    }\n\n    getDataType() : columnDataType {\n        return 'string';\n    }\n\n    getMinWidth() : number {\n        return this.#columnHeaderData.minWidth;\n    }\n\n    getMaxWidth() : number {\n        return this.#columnHeaderData.maxWidth;\n    }\n\n    isResizable() : boolean {\n        return false;\n    }\n\n    isDragging(): boolean | null {\n        return false;\n    }\n\n    isSelected(): boolean | null {\n        return false;\n    }\n\n    getComputedWidth(): number | null {\n        return 0;\n    }\n\n    // cell renderer\n    getRenderer() : ICellRendererComponent | null {\n        return this.#columnHeaderData.renderer;\n    }\n\n    getCellRendererParams(): Object | CellRendererParamsFunction {\n        return this.#columnHeaderData.cellRendererParams;\n    }\n\n    getCellRendererSelector() : CellRendererParamsFunction {\n        return this.#columnHeaderData.cellRendererSelector;\n    }\n\n    // header renderer\n\n    getHeaderRenderer() : IHeaderCellRendererComponent | null {\n        return this.#columnHeaderData.headerRenderer;\n    }\n\n    getHeaderRendererParams() : Object | HeaderCellRendererParamsFunction {\n        return this.#columnHeaderData.headerCellRendererParams;\n    }\n\n    getHeaderRendererSelector() : HeaderCellRendererSelectorFunction {\n        return this.#columnHeaderData.headerCellRendererSelector;\n    }\n\n    // summary renderer\n\n\n    getSummaryRenderer() : ISummaryCellRenderer | null {\n        return this.#columnHeaderData.summaryRenderer\n    }\n\n    getSummaryRendererParams() : Object | SummaryCellRendererParamsFunction {\n        return this.#columnHeaderData.summaryCellRendererParams;\n    }\n\n    getSummaryRendererSelector() :SummaryCellRendererSelectorFunction {\n        return this.#columnHeaderData.summaryCellRendererSelector;\n    }\n\n    //loding cell renderer\n\n    getLoadingRenderer() : any {\n        return this.#columnHeaderData.loadingRenderer;\n    }\n\n    getLoadingRendererParams() : CellLoadingRendererParamsFunction | Object {\n        return this.#columnHeaderData.loadingRendererParams;\n    }\n\n    getLoadingRendererSelector(): CellLoadingRendererSelectorFunction {\n        return this.#columnHeaderData.loadingRendererSelector\n    }\n\n    getHeaderName() : string {\n        return '';\n    }\n\n\n    //setters\n\n    updatePinPosition(position: rowHeaderPosition): void {\n        this.#columnHeaderData.pinned = position;\n    }\n    updateWidth(width : number): void {\n        const id = this.getID();\n        this.helper.setColumnWidth(id, width);\n    } \n    updateLockedState(_state: boolean): void {\n\n    } \n    // updateFieldKey() : string {\n    //     return this.#columnHeaderData.fieldKey;\n    // }\n    updateDataType(_dataType : columnDataType) : void {\n\n    } \n    updateMinWidth(minWidth : number) : void {\n        this.#columnHeaderData.minWidth = minWidth;\n    }\n    updateMaxWidth(maxWidth : number) : void {\n        this.#columnHeaderData.maxWidth = maxWidth;\n    }\n    updateDraggingState(_state: boolean): void {\n\n    }\n    updateSelectedState(_state: boolean): void {\n\n    }\n    updateComputedWidth(_width: number): void {\n\n    }\n\n    // cell renderer\n    updateRenderer(renderer : ICellRendererComponent) : void {\n        this.#columnHeaderData.renderer = renderer;\n    }\n\n    updateCellRendererParams(cellRendererParams: CellRendererParamsFunction): void {\n        this.#columnHeaderData.cellRendererParams = cellRendererParams;\n    }\n\n    updateCellRendererSelector(cellRendererSelector  : CellRendererParamsFunction) : void {\n        this.#columnHeaderData.cellRendererSelector = cellRendererSelector;\n    }\n\n    // loading cell renderer\n    updateLoadingRenderer(renderer : any) : void {\n        this.#columnHeaderData.loadingRenderer = renderer;\n    }\n\n    updateLoadingRendererParams(loadingRendererParams : CellLoadingRendererParamsFunction | Object) : void {\n        this.#columnHeaderData.loadingRendererParams = loadingRendererParams;\n    }\n\n    updateLoadingRendererSelector(selector: CellLoadingRendererSelectorFunction): void {\n        this.#columnHeaderData.loadingRendererSelector = selector;\n    }\n\n    // summary cell renderer\n\n    updateSummaryRenderer(summaryRenderer : ISummaryCellRenderer) : void { \n        this.#columnHeaderData.summaryRenderer = summaryRenderer;\n    }\n\n    updateSummaryRendererParams(summaryRendererParams : SummaryCellRendererParamsFunction | Object) : void {\n        this.#columnHeaderData.summaryCellRendererParams = summaryRendererParams;\n    }\n\n    updateSummaryRendererSelector(selector : SummaryCellRendererSelectorFunction) : void {\n        this.#columnHeaderData.summaryCellRendererSelector = selector;\n    }\n\n    // header cell renderer\n\n    updateHeaderRender(headerRenderer : IHeaderCellRendererComponent) : void {\n        this.#columnHeaderData.headerRenderer = headerRenderer;\n    }\n\n    updateHeaderRendererParams(headerRendererParams : HeaderCellRendererParamsFunction | Object) : void {\n        this.#columnHeaderData.headerCellRendererParams = headerRendererParams;\n    }\n\n    updateHeaderRendererSelector(selector : HeaderCellRendererSelectorFunction) : void {\n        this.#columnHeaderData.headerCellRendererSelector = selector;\n    }\n     \n    updateHeaderName(_name: string) : void {\n\n    }\n\n     //toolTip\n        \n     hasToolTipRenderer():boolean{\n        return this.#columnHeaderData.toolTipRenderer != null || this.#columnHeaderData.toolTipRendererSelector !=null;\n    }\n\n    hasHeaderCellToolTipRenderer():boolean{\n        return this.#columnHeaderData.headerCellToolTipRenderer != null || this.#columnHeaderData.headerCellToolTipRendererSelector !=null;\n    }\n\n    hasEditorToolTipRenderer() : boolean {\n        return this.#columnHeaderData.editorToolTipRenderer !=null || this.#columnHeaderData.editorToolTipRendererParams != null;\n    }\n\n    getToolTipRenderer()  : any{\n        return this.#columnHeaderData.toolTipRenderer;\n    }\n\n    getToolTipRendererParams()  : any {\n        return this.#columnHeaderData.toolTipRendererParams;\n    }\n\n    getToolTipRendererSelector() : any{\n        return this.#columnHeaderData.toolTipRendererSelector;\n    }\n\n    getHeaderCellToolTipRenderer() : any {\n        return this.#columnHeaderData.headerCellToolTipRenderer;\n    }\n\n    getHeaderCellToolTipRendererParams()  : any{\n        return this.#columnHeaderData.headerCellToolTipRendererParams;\n    }\n\n    getHeaderCellToolTipRendererSelector(): any{\n        return this.#columnHeaderData.headerCellToolTipRendererSelector;\n    }\n\n    getEditorToolTipRenderer()  : any{\n        return this.#columnHeaderData.editorToolTipRenderer;\n    }\n\n    getEditorToolTipRendererParams()  : any {\n        return this.#columnHeaderData.editorToolTipRendererParams;\n    }\n\n\tisEditable(_params : any) : boolean {\n\t\treturn false;\n\t}\n\n\tisHeaderEditable(_params : IHeaderEditableParams ): boolean | null {\n\t\treturn false;\n\t}\n      \n\n\n    // event\n\n    addEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.addEventListener(eventType, listener, async);\n    }\n    \n    removeEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.removeEventListener(eventType, listener, async);\n    }\n    onMouseEnter() {\n        this.dispatchEvent({\n            type : COLUMN_NODE_EVENTS.EVENT_MOUSE_ENTER\n        })\n    }\n    onMouseLeave() {\n        this.dispatchEvent({\n            type : COLUMN_NODE_EVENTS.EVENT_MOUSE_LEAVE\n        })\n    }\n\n\tisNonEditableMessageEnabled(_params : any): boolean | ((params : any) => boolean) {\n\t\treturn false;\n\t}\n\n\tupdateNonEditableMessageOption(_showNonEditableMessage: boolean | ((params : any) => boolean)): void {\n\t\t// this.#columnData.showNonEditableMessage = showNonEditableMessage;\n\t}\n\n\tgetNonEditableMessage(): string | ((params: any) => string) | null {\n\t\treturn null;\n\t}\n\n\tupdateNonEditableMessage(_nonEditableMessage: string | ((params: any) => string) | null): void {\n\t\t// this.#columnData.nonEditableMessage = nonEditableMessage;\n\t}\n\n\tupdateNonEditableMessageRenderer(_nonEditableMessageRenderer: ClassConstructorType<IComponent<any>>): void {\n\t\t// this.#columnData.nonEditableMessageRenderer = nonEditableMessageRenderer;\n\t}\n\n\tgetNonEditableMessageRendererParams(): { [key: string]: any; } | null {\n\t\treturn null;\n\t}\n\n\tupdateNonEditableMessageRendererParams(_nonEditableMessageRendererParams: { [key: string]: any; }): void {\n\t\t// this.#columnData.nonEditableMessageRendererParams = nonEditableMessageRendererParams;\n\t}\n\n\tisDraggable() : boolean {\n\t\treturn false;\n\t}\n\n\tgetGroupHeaderCellRenderer() : (new () => ICellRendererComponent) | undefined {\n\t\treturn this.#columnHeaderData.groupCellRenderer;\n\t}\n\n\tgetGroupHeaderCellRendererParams() : GroupCellRendererParamsFunction | Object {\n\t\treturn this.#columnHeaderData.groupCellRendererParams;\n\t}\n\n\tgetGroupHeaderCellRendererSelectors() : GroupCellRendererSelectorFunction {\n\t\treturn this.#columnHeaderData.groupCellRendererSelectors;\n\t}\n}\n\nfunction createRecordHeaderColumnNode(helper : IColumnNodeHelper, id : string, data ?: IRecordHeaderColumnDefinitions) : RecordHeaderColumnNode{\n    return new RecordHeaderColumnNode(id, helper, data);\n}\n\n\n\nexport {\n    createRecordHeaderColumnNode,\n    RecordHeaderColumnNode,\n    IColumnNodeHelper\n}","import { Bean, EventEmitter } from '@dg/corecomponent';\nimport { IColumnNode } from '../Interface/IColumnNode';\nimport { exists, removeFromUnorderedArray } from '../utils/Generic';\n\ninterface IFlexedColumnsParams {\n\tviewportWidth?: number;\n\tresizingColumns?: IColumnNode[];\n\tcolumns: IColumnNode[];\n}\n\n@Bean('ColumnSizeHandler')\nexport class ColumnSizeHandler extends EventEmitter {\n\tprivate viewportWidth: number;\n\n\trefreshFlexedColumns(params: IFlexedColumnsParams): IColumnNode[] {\n\t\tconst { resizingColumns, viewportWidth, columns } = params;\n\n\t\tif (viewportWidth != null) {\n\t\t\tthis.viewportWidth = viewportWidth;\n\t\t}\n\n\t\tif (!this.viewportWidth) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst { flexColumns, totalFixedWidth, totalFlex, totalMinFlexWidth } =\n\t\t\tthis.calculateFlexColumns(columns, resizingColumns);\n\t\tif (flexColumns.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet changedColumns: IColumnNode[] = [];\n\t\tchangedColumns = this.adjustFlexColumnsWidths(\n\t\t\tflexColumns,\n\t\t\ttotalFixedWidth,\n\t\t\ttotalFlex,\n\t\t\ttotalMinFlexWidth,\n\t\t\tchangedColumns,\n\t\t);\n\n\t\tthis.dispatchEvent({\n\t\t\ttype : 'columnResized',\n\t\t\tchangedColumns,\n\t\t\tflexColumns\n\t\t})\n\n\t\treturn changedColumns;\n\t}\n\n    private calculateFlexColumns( columns: IColumnNode[], resizingColumns?: IColumnNode[], ): { flexColumns: IColumnNode[]; totalFixedWidth: number; totalFlex: number; totalMinFlexWidth: number; } {\n\t\tlet lastResizingColumnIndex = -1;\n\t\tlet totalFixedWidth = 0;\n\t\tlet totalFlex = 0;\n\t\tlet totalMinFlexWidth = 0;\n\n\t\tif (resizingColumns) {\n\t\t\tconst resizingColumnsSet = new Set(resizingColumns);\n\t\t\tfor (let i = columns.length - 1; i >= 0; i--) {\n\t\t\t\tif (resizingColumnsSet.has(columns[i])) {\n\t\t\t\t\tlastResizingColumnIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst flexColumns: IColumnNode[] = [];\n\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\tconst isFlexColumn = columns[i].getFlex() && i > lastResizingColumnIndex;\n\t\t\tif (isFlexColumn) {\n\t\t\t\tflexColumns.push(columns[i]);\n\t\t\t\ttotalFlex += columns[i].getFlex();\n\t\t\t\ttotalMinFlexWidth += columns[i].getMinWidth() ?? 0;\n\t\t\t} else {\n\t\t\t\ttotalFixedWidth += columns[i].getWidth();\n\t\t\t}\n\t\t}\n\n\t\treturn { flexColumns, totalFixedWidth, totalFlex, totalMinFlexWidth };\n\t}\n\n\tprivate adjustFlexColumnsWidths( flexColumns: IColumnNode[], totalFixedWidth: number, totalFlex: number, totalMinFlexWidth: number, changedColumns: IColumnNode[], ): IColumnNode[] {\n\t\tif (totalFixedWidth + totalMinFlexWidth > this.viewportWidth) {\n\t\t\tflexColumns.forEach((column) =>\n\t\t\t\tcolumn.updateWidth(column.getMinWidth() ?? 0),\n\t\t\t);\n\t\t\tchangedColumns = flexColumns;\n\t\t\tflexColumns = [];\n\t\t}\n\n\t\treturn this.performFlexingLoop( flexColumns, totalFlex, totalFixedWidth, changedColumns, );\n\t}\n\n\tprivate performFlexingLoop( flexColumns: IColumnNode[], totalFlex: number, totalFixedWidth: number, changedColumns: IColumnNode[], ): IColumnNode[] {\n\t\tconst flexColumnSizes: number[] = [];\n\t\tlet availableSpaceForFlexColumns = this.viewportWidth - totalFixedWidth;\n\n\t\tflexingLoop: while (true) {\n\t\t\tconst spacePerFlexUnit = availableSpaceForFlexColumns / totalFlex;\n\n\t\t\tfor (let i = 0; i < flexColumns.length; i++) {\n\t\t\t\tconst column = flexColumns[i];\n\t\t\t\tconst calculatedWidth = spacePerFlexUnit * column.getFlex();\n\t\t\t\tlet constrainedWidth = 0;\n\n\t\t\t\tconst minWidth = column.getMinWidth();\n\t\t\t\tconst maxWidth = column.getMaxWidth();\n\n\t\t\t\tif (exists(minWidth) && calculatedWidth < minWidth) {\n\t\t\t\t\tconstrainedWidth = minWidth;\n\t\t\t\t} else if (exists(maxWidth) && calculatedWidth > maxWidth) {\n\t\t\t\t\tconstrainedWidth = maxWidth;\n\t\t\t\t}\n\n\t\t\t\tif (constrainedWidth) {\n\t\t\t\t\tcolumn.updateWidth(constrainedWidth);\n\t\t\t\t\tremoveFromUnorderedArray(flexColumns, column);\n\t\t\t\t\ttotalFlex -= column.getFlex();\n\t\t\t\t\tavailableSpaceForFlexColumns -= constrainedWidth;\n\t\t\t\t\tchangedColumns.push(column);\n\t\t\t\t\tcontinue flexingLoop;\n\t\t\t\t}\n\n\t\t\t\tflexColumnSizes[i] = Math.round(calculatedWidth);\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tflexColumns.forEach((column, i) => {\n\t\t\tcolumn.updateWidth(\n\t\t\t\tMath.min(flexColumnSizes[i], availableSpaceForFlexColumns),\n\t\t\t);\n\t\t\tchangedColumns.push(column);\n\t\t\tavailableSpaceForFlexColumns -= flexColumnSizes[i];\n\t\t});\n\n\t\treturn changedColumns;\n\t}\n}\n","import { Axis } from \"../../../DataStore/RowAxis/Axis\";\nimport { IAxis } from \"../../../DataStore/RowAxis/IAxis.types\";\nimport { IColumnWidth } from \"../../Main\";\n\ninterface IFieldAxis {\n    appendWidth(width : number) : void;\n    appendMultipleWidths(count : number, getWidthCallback : (index : number)=>number) : void;\n    insertAtIndex(index : number, width : number) : void;\n    deleteWidth(index : number) : void;\n    getIndexByPosition(position : number) : number;\n    getLeft(index : number) : number;\n    getWidth(index : number) : number;\n    updateWidth(index : number, size : IColumnWidth) : void;\n    getTotalWidth() : number;\n}\n\nclass FieldAxis implements IFieldAxis{\n    private axis : IAxis;\n    constructor(){\n        this.axis = new Axis();\n    }\n    appendWidth(_width : number) : void{\n        // this.axis.append(width);\n    }\n    appendMultipleWidths(_count : number, _getWidthCallback : (index : number)=>number) : void{\n        // this.axis.appendSizes(count, getWidthCallback);\n    }\n    insertAtIndex(index : number, width : number) : void{\n        this.axis.insertAtIndex(index , width)\n    }\n    deleteWidth(index : number) : void{\n        this.axis.removeIndex(index);\n    }\n    getIndexByPosition(position: number): number {\n        return this.axis.getIndexByPosition(position);\n    }\n    getLeft(index : number) : number{\n        return this.axis.getPosition(index);\n    }\n    getWidth(index : number) : number{\n        return this.axis.getSize(index);\n    }\n    updateWidth(index : number, size : number) : void{\n        this.axis.resize(index, size);\n    }\n    getTotalWidth() : number{\n        return this.axis.getTotalSize();\n    }\n}\n\nexport{\n    FieldAxis,\n    IFieldAxis\n}","import { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { columnPinPositions } from \"../Constants/GridConfigurationConstants\";\nimport { IColumnDefinition, IRecordHeaderColumnDefinitions } from \"../Interface/IColumnDefinition\";\nimport type { ColumnTreeModel } from \"../../../nested-header/column-tree-model\";\nimport { COLUMN_GROUP_EVENTS } from \"../../../nested-header/constants/events\";\nimport { RecordHeaderColumnNode } from \"./ColumnNode\";\nimport { FieldPaneInfoHandler } from \"./FieldPaneInfoHandler\";\nimport { RecordHeaderPaneInfoHandler } from \"./RecordHeaderPaneInfoHandler\";\nimport { Events } from \"../Constants/Events\";\nimport { IColumnNode } from \"../Interface/IColumnNode\";\nimport { HORIZONTAL_PANE } from \"../ControllerHandler/ControllerHandler\";\nimport { AutoWired, Bean, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { MovePosition } from \"../../API/ReorderableAPI/Interface/IReorderableAPI\";\nimport { GridOptioHandler } from \"../GridOptionHandler\";\nimport { columnPinPosition, IPinningOptionalConfig } from \"../../API/CommonAPIInterface\";\nimport { MOVE_POSITION } from \"../Constants/GridConstants\";\nimport { DateUtils } from \"../../../Utils/DateUtils\";\nimport { IDateUtils } from \"../../../Utils/IDateUtils\";\nimport { DateTime } from \"luxon\";\n\n\nexport const COLUMN_PANE_TYPE = {\n    HEADER: 'header',\n    LEFT  : 'left',\n    CENTER: 'center',\n    RIGHT : 'right'\n}\n\nconst startDate =  new Date();\n\nexport const VIEW_TYPE = {\n\tDAY  : 'day',\n\tMONTH: 'month',\n\tWEEK : 'week',\n\tYEAR : 'year',\n\tQUARTER: 'quarter'\n\n}\n\nexport const PROJECT_START_DATE = {\n\tday : startDate,\n\tyear : startDate,\n\tmonth : startDate.setMonth(5),\n\tweek : startDate.setMonth(5),\n}\n\nexport const PROJECT_END_DATE = {\n\tday : startDate.setDate(10),\n\tyear : startDate.setFullYear(2027),\n\tmonth : startDate.setMonth(10),\n\tweek : startDate.setMonth(10),\n}\n\n\n@Bean(GRID_BEAN_NAME.FIELD_HANDLER)\nclass FieldHandler extends EventEmitter {\n\tprivate leftHandler    !: FieldPaneInfoHandler;\n\tprivate centerHandler  !: FieldPaneInfoHandler;\n\tprivate rightHandler   !: FieldPaneInfoHandler;\n\tprivate headerHandler  !: RecordHeaderPaneInfoHandler;\n\t// private columnWidth : number = 40;\n\tprivate dateUtils : IDateUtils;\n\t@AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controlHandler;\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler : GridOptioHandler;\n\t@AutoWired(GRID_BEAN_NAME.COLUMN_TREE_MODEL) private columnTreeModel ?: ColumnTreeModel;\n    // @AutoWired(GANTT_BEAN_NAME.DATE_UTILS) dateUtils :IDateUtils\n\n\n\n\n\t@PostConstruct()\n\tinit() : void {\n\t\tthis.headerHandler = this.createManagedBean(new RecordHeaderPaneInfoHandler());\n\t\tthis.leftHandler   = this.createManagedBean(new FieldPaneInfoHandler(COLUMN_PANE_TYPE.LEFT));\n\t\tthis.centerHandler = this.createManagedBean(new FieldPaneInfoHandler(COLUMN_PANE_TYPE.CENTER));\n\t\tthis.rightHandler  = this.createManagedBean(new FieldPaneInfoHandler(COLUMN_PANE_TYPE.RIGHT));\n\t\tthis.addListener(this.eventHandler, 'columnGroupExpanded', () => {\n\t\t\tif (this.optionHandler?.hasColumnGroups?.() && this.columnTreeModel) this.syncColumnVisibilityFromTreeModel();\n\t\t});\n\t\tthis.addListener(this.eventHandler, 'columnGroupCollapsed', () => {\n\t\t\tif (this.optionHandler?.hasColumnGroups?.() && this.columnTreeModel) this.syncColumnVisibilityFromTreeModel();\n\t\t});\n\t\tthis.addListener(this.eventHandler, COLUMN_GROUP_EVENTS.EVENT_COLUMN_TREE_STRUCTURE_CHANGED, () => {\n\t\t\tif (this.optionHandler?.hasColumnGroups?.() && this.columnTreeModel) {\n\t\t\t\tthis.constructFieldInfoHandler();\n\t\t\t}\n\t\t});\n\t\t(window as any).fieldHandler = this;\n\t}\n\t\t\n\t// for Gantt\n\n\tgetLeftByDate(date : Date | string | number | DateTime){\n\t\tif (!this.dateUtils) {\n\t\t\tthis.dateUtils = new DateUtils();\n\t\t\tthis.dateUtils.setTimezone(this.optionHandler.getTimezone());\n\t\t}\n\n\t\tlet columnDefinition: IColumnDefinition;\n\t\ttry {\n\t\t\tcolumnDefinition = this.getColumnDefinition(0);\n\t\t} catch (error) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (!columnDefinition || !columnDefinition.width || !isFinite(columnDefinition.width as number)) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst timeLineViewType = this.optionHandler.getTimeLineViewType();\n\t\tconst headerParams = columnDefinition.headerCellRendererParams as any;\n\t\tconst anchorCandidates: { value: any, format?: string }[] = [];\n\n\t\tif (headerParams?.topTierData?.from) {\n\t\t\tanchorCandidates.push({ value: headerParams.topTierData.from });\n\t\t}\n\n\t\tif (columnDefinition.columnId) {\n\t\t\tanchorCandidates.push({ value: columnDefinition.columnId, format: 'MM/dd/yyyy' });\n\t\t}\n\n\t\tconst projectStart = this.optionHandler.getProjectStartDate();\n\t\tif (projectStart) {\n\t\t\tanchorCandidates.push({ value: projectStart });\n\t\t}\n\n\t\tif (!anchorCandidates.length) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Parse anchor date to DateTime with timezone support\n\t\tlet anchorDateTime;\n\t\tfor (const candidate of anchorCandidates) {\n\t\t\ttry {\n\t\t\t\tconst parsedAnchor = this.dateUtils.parseDate(candidate.value, candidate.format);\n\t\t\t\tif (parsedAnchor?.isValid) {\n\t\t\t\t\tanchorDateTime = parsedAnchor;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} catch (_err) {\n\t\t\t\t// try next candidate\n\t\t\t}\n\t\t}\n\n\t\tif (!anchorDateTime) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Parse target date to DateTime with timezone support\n\t\tlet targetDateTime;\n\t\ttry {\n\t\t\ttargetDateTime = this.dateUtils.parseDate(date);\n\t\t} catch (_error) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (!targetDateTime?.isValid) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst bottomTierCount = typeof headerParams?.bottomTierCount === 'number' ? headerParams.bottomTierCount : undefined;\n\t\tconst totalWidth = columnDefinition.width as number;\n\t\tlet left = 0;\n\n\t\tswitch (timeLineViewType) {\n\t\t\tcase VIEW_TYPE.WEEK: {\n\t\t\t\tconst daysInBucket = Math.max(bottomTierCount || 7, 1);\n\t\t\t\tconst widthPerDay = totalWidth / daysInBucket;\n\t\t\t\t// Get week start date - returns DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.getWeekStartDate(anchorDateTime, 'sunday');\n\t\t\t\t// GetLeftByDate accepts DateTime objects and preserves timezone\n\t\t\t\tleft = this.dateUtils.GetLeftByDate(this.dateUtils.parseDate(anchorDateTime), this.dateUtils.parseDate(targetDateTime), widthPerDay);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase VIEW_TYPE.MONTH: {\n\t\t\t\t// Get start of month - returns DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.getStartOfMonth(anchorDateTime);\n\t\t\t\tconst inferredDaysInMonth = Math.max(\n\t\t\t\t\tbottomTierCount || this.dateUtils.getDaysInMonth(anchorDateTime),\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst widthPerDay = totalWidth / inferredDaysInMonth;\n\t\t\t\tleft = this.dateUtils.GetLeftByDate(this.dateUtils.parseDate(anchorDateTime), this.dateUtils.parseDate(targetDateTime), widthPerDay);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase VIEW_TYPE.YEAR: {\n\t\t\t\t// Get start/end of year - returns DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.getStartOfYear(anchorDateTime);\n\t\t\t\tconst yearEnd = this.dateUtils.getEndOfYear(anchorDateTime);\n\t\t\t\tconst totalDaysInYear = Math.max(this.dateUtils.daysBetween(anchorDateTime, yearEnd, true), 1);\n\t\t\t\tconst widthPerDay = totalWidth / totalDaysInYear;\n\t\t\t\tleft = this.dateUtils.GetLeftByDate(this.dateUtils.parseDate(anchorDateTime), this.dateUtils.parseDate(targetDateTime), widthPerDay);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase VIEW_TYPE.QUARTER: {\n\t\t\t\t// Get quarter start - returns DateTime with timezone\n\t\t\t\tconst quarterStart = this.dateUtils.getQuarterStartDate(anchorDateTime);\n\t\t\t\tconst quarterEnd = quarterStart.plus({ months: 3 }).minus({ milliseconds: 1 });\n\t\t\t\tconst totalDaysInQuarter = Math.max(this.dateUtils.daysBetween(quarterStart, quarterEnd, true), 1);\n\t\t\t\tconst widthPerDay = totalWidth / totalDaysInQuarter;\n\t\t\t\tleft = this.dateUtils.GetLeftByDate(this.dateUtils.parseDate(quarterStart), this.dateUtils.parseDate(targetDateTime), widthPerDay);\n\t\t\t\tanchorDateTime = quarterStart;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase VIEW_TYPE.DAY: {\n\t\t\t\t// Get start of day - returns DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.startOfDay(this.dateUtils.parseDate(anchorDateTime));\n\t\t\t\tconst hoursInDay = Math.max(bottomTierCount || 24, 1);\n\t\t\t\tconst widthPerHour = totalWidth / hoursInDay;\n\t\t\t\t// Use DateTime diff method for timezone-aware calculation\n\t\t\t\tconst diffInMinutes = Math.abs(targetDateTime.diff(anchorDateTime, 'minutes').minutes ?? 0);\n\t\t\t\tconst diffInHours = diffInMinutes / 60;\n\t\t\t\tleft = diffInHours * widthPerHour;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tleft = this.dateUtils.GetLeftByDate(this.dateUtils.parseDate(anchorDateTime), this.dateUtils.parseDate(targetDateTime), totalWidth);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Use DateTime comparison methods for timezone-aware comparison\n\t\tif (targetDateTime.toMillis() < anchorDateTime.toMillis()) {\n\t\t\tleft = -left;\n\t\t}\n\n\t\treturn left;\n\t}\n\n\tgetExactLeftByDate(date : Date | string | number | DateTime) : number{\n\t\tif (!this.dateUtils) {\n\t\t\tthis.dateUtils = new DateUtils();\n\t\t\tthis.dateUtils.setTimezone(this.optionHandler.getTimezone());\n\t\t}\n\n\t\tlet columnDefinition: IColumnDefinition;\n\t\ttry {\n\t\t\tcolumnDefinition = this.getColumnDefinition(0);\n\t\t} catch (error) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (!columnDefinition || !columnDefinition.width || !isFinite(columnDefinition.width as number)) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst timeLineViewType = this.optionHandler.getTimeLineViewType();\n\t\tconst headerParams = columnDefinition.headerCellRendererParams as any;\n\t\tconst anchorCandidates: { value: any, format?: string }[] = [];\n\n\t\tif (headerParams?.topTierData?.from) {\n\t\t\tanchorCandidates.push({ value: headerParams.topTierData.from });\n\t\t}\n\n\t\tif (columnDefinition.columnId) {\n\t\t\tanchorCandidates.push({ value: columnDefinition.columnId, format: 'MM/dd/yyyy' });\n\t\t}\n\n\t\tconst projectStart = this.optionHandler.getProjectStartDate();\n\t\tif (projectStart) {\n\t\t\tanchorCandidates.push({ value: projectStart });\n\t\t}\n\n\t\tif (!anchorCandidates.length) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Parse anchor date to DateTime with timezone support\n\t\tlet anchorDateTime;\n\t\tfor (const candidate of anchorCandidates) {\n\t\t\ttry {\n\t\t\t\tconst parsedAnchor = this.dateUtils.parseDate(candidate.value, candidate.format);\n\t\t\t\tif (parsedAnchor?.isValid) {\n\t\t\t\t\tanchorDateTime = parsedAnchor;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} catch (_err) {\n\t\t\t\t// try next candidate\n\t\t\t}\n\t\t}\n\n\t\tif (!anchorDateTime) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Parse target date to DateTime with timezone support\n\t\tlet targetDateTime;\n\t\ttry {\n\t\t\ttargetDateTime = this.dateUtils.parseDate(date);\n\t\t} catch (_error) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tif (!targetDateTime?.isValid) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst bottomTierCount = typeof headerParams?.bottomTierCount === 'number' ? headerParams.bottomTierCount : undefined;\n\t\tconst totalWidth = columnDefinition.width as number;\n\t\tlet left = 0;\n\n\t\tswitch (timeLineViewType) {\n\t\t\tcase VIEW_TYPE.DAY: {\n\t\t\t\t// DAY View: Hours scale (24 hours) - all operations use DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.startOfDay(anchorDateTime);\n\t\t\t\tconst hoursInDay = Math.max(bottomTierCount || 24, 1);\n\t\t\t\tconst cellWidth = totalWidth / hoursInDay;\n\t\t\t\t\n\t\t\t\t// Calculate days difference using DateTime diff (timezone-aware)\n\t\t\t\tconst daysDiff = targetDateTime.startOf('day').diff(anchorDateTime.startOf('day'), 'days').days;\n\t\t\t\t\n\t\t\t\t// Get time components from target DateTime (timezone-aware)\n\t\t\t\tconst hour = targetDateTime.hour;\n\t\t\t\tconst minute = targetDateTime.minute;\n\t\t\t\tconst second = targetDateTime.second;\n\t\t\t\t\n\t\t\t\t// Calculate left position: (hour * cellWidth) + (minutes / 60) * cellWidth + (seconds / 3600) * cellWidth\n\t\t\t\tconst hourFraction = hour + (minute / 60) + (second / 3600);\n\t\t\t\tleft = (daysDiff * totalWidth) + (hourFraction * cellWidth);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase VIEW_TYPE.WEEK: {\n\t\t\t\t// WEEK View: Days scale - all operations use DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.getWeekStartDate(anchorDateTime, 'sunday');\n\t\t\t\tconst daysInBucket = Math.max(bottomTierCount || 7, 1);\n\t\t\t\tconst cellWidth = totalWidth / daysInBucket;\n\t\t\t\t\n\t\t\t\t// Calculate day index using DateTime diff (timezone-aware)\n\t\t\t\tconst dayIndex = targetDateTime.startOf('day').diff(anchorDateTime.startOf('day'), 'days').days;\n\t\t\t\t\n\t\t\t\t// Get time components within the day from DateTime (timezone-aware)\n\t\t\t\tconst hour = targetDateTime.hour;\n\t\t\t\tconst minute = targetDateTime.minute;\n\t\t\t\tconst second = targetDateTime.second;\n\t\t\t\t\n\t\t\t\t// Calculate left: (dayIndex * cellWidth) + (hour / 24) * cellWidth + (minute / 1440) * cellWidth\n\t\t\t\tconst dayFraction = (hour / 24) + (minute / 1440) + (second / 86400);\n\t\t\t\tleft = (dayIndex * cellWidth) + (dayFraction * cellWidth);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase VIEW_TYPE.MONTH: {\n\t\t\t\t// MONTH View: Days scale (1-31) - all operations use DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.getStartOfMonth(anchorDateTime);\n\t\t\t\tconst inferredDaysInMonth = Math.max(\n\t\t\t\t\tbottomTierCount || this.dateUtils.getDaysInMonth(anchorDateTime),\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst cellWidth = totalWidth / inferredDaysInMonth;\n\t\t\t\t\n\t\t\t\t// Calculate day index (day of month - 1, since days are 1-indexed) from DateTime\n\t\t\t\tconst dayOfMonth = targetDateTime.day;\n\t\t\t\tconst dayIndex = dayOfMonth - 1;\n\t\t\t\t\n\t\t\t\t// Get time components within the day from DateTime (timezone-aware)\n\t\t\t\tconst hour = targetDateTime.hour;\n\t\t\t\tconst minute = targetDateTime.minute;\n\t\t\t\tconst second = targetDateTime.second;\n\t\t\t\t\n\t\t\t\t// Calculate left: (dayIndex * cellWidth) + (hour / 24) * cellWidth + (minute / 1440) * cellWidth\n\t\t\t\tconst dayFraction = (hour / 24) + (minute / 1440) + (second / 86400);\n\t\t\t\tleft = (dayIndex * cellWidth) + (dayFraction * cellWidth);\n\t\t\t\t\n\t\t\t\t// Add offset for months difference if target is in a different month (using DateTime properties)\n\t\t\t\tconst monthsDiff = (targetDateTime.year - anchorDateTime.year) * 12 + (targetDateTime.month - anchorDateTime.month);\n\t\t\t\tif (monthsDiff !== 0) {\n\t\t\t\t\t// For each month difference, add the total width\n\t\t\t\t\t// left += monthsDiff * totalWidth;\n\t\t\t\t\tconst columnNode = this.getColumnNode(monthsDiff);\n\t\t\t\t\tconst columnLeft = columnNode?.getLeft() ?? (monthsDiff * totalWidth);\n\t\t\t\t\tleft += columnLeft;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase VIEW_TYPE.YEAR: {\n\t\t\t\t// YEAR View: Months scale (Jan-Dec) - all operations use DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.getStartOfYear(anchorDateTime);\n\t\t\t\tconst monthsInYear = 12;\n\t\t\t\tconst cellWidth = totalWidth / monthsInYear;\n\t\t\t\t\n\t\t\t\t// Calculate month index (0-11) from DateTime\n\t\t\t\tconst monthIndex = targetDateTime.month - 1;\n\t\t\t\t\n\t\t\t\t// Get day of month and time components from DateTime (timezone-aware)\n\t\t\t\tconst dayOfMonth = targetDateTime.day;\n\t\t\t\tconst totalDaysInMonth = this.dateUtils.getDaysInMonth(targetDateTime);\n\t\t\t\tconst hour = targetDateTime.hour;\n\t\t\t\tconst minute = targetDateTime.minute;\n\t\t\t\tconst second = targetDateTime.second;\n\t\t\t\t\n\t\t\t\t// Calculate left: (monthIndex * cellWidth) + (dayOfMonth / totalDaysInMonth) * cellWidth + (hour / (totalDaysInMonth * 24)) * cellWidth\n\t\t\t\tconst monthFraction = (dayOfMonth / totalDaysInMonth) + (hour / (totalDaysInMonth * 24)) + (minute / (totalDaysInMonth * 1440)) + (second / (totalDaysInMonth * 86400));\n\t\t\t\tleft = (monthIndex * cellWidth) + (monthFraction * cellWidth);\n\t\t\t\t\n\t\t\t\t// Add offset for years difference if target is in a different year (using DateTime properties)\n\t\t\t\tconst yearsDiff = targetDateTime.year - anchorDateTime.year;\n\t\t\t\tif (yearsDiff !== 0) {\n\t\t\t\t\t// For each year difference, add the total width\n\t\t\t\t\tleft += yearsDiff * totalWidth;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase VIEW_TYPE.QUARTER: {\n\t\t\t\t// QUARTER View: 3-month block, month scale - all operations use DateTime with timezone\n\t\t\t\tanchorDateTime = this.dateUtils.getQuarterStartDate(anchorDateTime);\n\t\t\t\tconst monthsInQuarter = 3;\n\t\t\t\tconst cellWidth = totalWidth / monthsInQuarter;\n\t\t\t\t\n\t\t\t\t// Calculate month index within quarter (0-2) using DateTime\n\t\t\t\t// Get the quarter start month for the target date\n\t\t\t\tconst targetQuarterStart = this.dateUtils.getQuarterStartDate(targetDateTime);\n\t\t\t\tconst monthIndexInQuarter = targetDateTime.month - targetQuarterStart.month;\n\t\t\t\t\n\t\t\t\t// Get day of month and time components from DateTime (timezone-aware)\n\t\t\t\tconst dayOfMonth = targetDateTime.day;\n\t\t\t\tconst daysInMonth = this.dateUtils.getDaysInMonth(targetDateTime);\n\t\t\t\tconst hour = targetDateTime.hour;\n\t\t\t\tconst minute = targetDateTime.minute;\n\t\t\t\tconst second = targetDateTime.second;\n\t\t\t\t\n\t\t\t\t// Calculate left: (quarterMonthIndex * cellWidth) + (dayOfMonth / daysInMonth) * cellWidth + (hour / (daysInMonth * 24)) * cellWidth\n\t\t\t\tconst monthFraction = (dayOfMonth / daysInMonth) + (hour / (daysInMonth * 24)) + (minute / (daysInMonth * 1440)) + (second / (daysInMonth * 86400));\n\t\t\t\tleft = (monthIndexInQuarter * cellWidth) + (monthFraction * cellWidth);\n\t\t\t\t\n\t\t\t\t// Add offset for quarters difference if target is in a different quarter (using DateTime properties)\n\t\t\t\t// More precise calculation\n\t\t\t\tconst anchorQuarter = Math.floor((anchorDateTime.month - 1) / 3);\n\t\t\t\tconst targetQuarter = Math.floor((targetDateTime.month - 1) / 3);\n\t\t\t\tconst quartersDiffPrecise = (targetDateTime.year - anchorDateTime.year) * 4 + (targetQuarter - anchorQuarter);\n\t\t\t\tif (quartersDiffPrecise !== 0) {\n\t\t\t\t\t// For each quarter difference, add the total width\n\t\t\t\t\tleft += quartersDiffPrecise * totalWidth;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\t// Fallback to basic calculation - GetLeftByDate accepts DateTime and preserves timezone\n\t\t\t\tleft = this.dateUtils.GetLeftByDate(anchorDateTime, targetDateTime, totalWidth);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn left;\n\t}\n\n\tgetRightByDate(date : Date | string | number | DateTime) : number{\n\t\t// getLeftByDate handles timezone-aware date parsing internally and accepts DateTime objects\n\t\tconst timezonedDate = this.dateUtils.parseDate(date);\n\t\tconst left = this.getLeftByDate(timezonedDate);\n\n\t\tlet columnDefinition: IColumnDefinition;\n\t\ttry {\n\t\t\tcolumnDefinition = this.getColumnDefinition(0);\n\t\t} catch (error) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst width = columnDefinition.width as number;\n\t\tconst timeLineViewType = this.optionHandler.getTimeLineViewType();\n\n\t\tconst timeLineWidth = (columnDefinition.headerCellRendererParams as any).bottomTierCount\n\n\n\t\tif(timeLineViewType === VIEW_TYPE.DAY){\n\t\t\treturn left + width\n\t\t}\n\t\telse if(timeLineViewType === VIEW_TYPE.MONTH || timeLineViewType === VIEW_TYPE.WEEK){\n\t\t\treturn left + (width/timeLineWidth);\n\t\t}else if(timeLineViewType === VIEW_TYPE.YEAR){\n\t\t\treturn left +((width/timeLineWidth)/30);\n\t\t}\n\t\telse if(timeLineViewType === VIEW_TYPE.QUARTER){\n\t\t\treturn left +((width/timeLineWidth)/30);\n\t\t}\n\n\t\treturn left + (width/timeLineWidth);;\n\t}\n\n\tgetDisplayedColumns( pinned: columnPinPositions, ): (IColumnNode | RecordHeaderColumnNode)[] {\n\t\tswitch (pinned) {\n\t\t\tcase 'left':\n\t\t\t\treturn this.leftHandler.getDisplayedColumns();\n\t\t\tcase 'right':\n\t\t\t\treturn this.rightHandler.getDisplayedColumns();\n\t\t\tcase 'center':\n\t\t\t\treturn this.centerHandler.getDisplayedColumns();\n\t\t\tcase 'rowHeader':\n\t\t\t\treturn this.headerHandler.getDisplayedColumns(); // need to change with header handler\n\t\t\tdefault:\n\t\t\t\treturn this.centerHandler.getDisplayedColumns();\n\t\t}\n\t}\n\n\n\tgetHiddenColumnNodes() : IColumnNode[] {\n\t\tconst leftHiddenColumns = this.leftHandler.getHiddenColumnNodes();\n\t\tconst centerHiddenColumns = this.centerHandler.getHiddenColumnNodes();\n\t\tconst rightHiddenColumns = this.rightHandler.getHiddenColumnNodes();\n\n\t\tconst columnNodes = [...leftHiddenColumns, ...centerHiddenColumns, ...rightHiddenColumns];\n\n\t\treturn columnNodes;\n\t}\n\n\tgetNonHiddenColumnNodes() : IColumnNode[] {\n\t\tconst leftColumns = this.leftHandler.getDisplayedColumns();\n\t\tconst centerColumns = this.centerHandler.getDisplayedColumns();\n\t\tconst rightColumns = this.rightHandler.getDisplayedColumns();\n\t\n\t\tconst columnNodes = [...leftColumns, ...centerColumns, ...rightColumns];\n\n\t\treturn columnNodes;\n\t}\n\n\tconstructFieldInfoHandler() {\n\t\tconst rowHeader                        = this.optionHandler.getRowHeader();\n\n\t\t\n\t\tconst leftMeta: IColumnDefinition[]   = [];\n\t\tconst centerMeta: IColumnDefinition[] = [];\n\t\tconst rightMeta: IColumnDefinition[]  = [];\n\t\tlet   leftCount                        = 0;\n\t\tlet   rightCount                       = 0;\n\t\tlet   centerCount                      = 0;\n\t\tlet   headerCount                      = rowHeader.length;\n\n\n\n\n\n\n\n\n\n\t\t\n\t\t\t\n\n\t\t\t\n\n\t\t\tconst rawDefs = this.optionHandler.getColumnDef();\n\t\t\tconst useFlattened = this.optionHandler.hasColumnGroups?.() && this.columnTreeModel;\n\t\t\tconst columnDefinitions: IColumnDefinition[] = (useFlattened ? this.columnTreeModel!.getFlattenedColumnDefinitions() : rawDefs) ?? [];\n\t\t\tconst maxColumn = columnDefinitions.length;\n\n\t\t\tlet getDefinition: (index: number) => IColumnDefinition;\n\n\t\t\tif (Array.isArray(columnDefinitions)) {\n\t\t\t\tgetDefinition = (index: number) => columnDefinitions[index];\n\t\t\t} else {\n\t\t\t\tgetDefinition = columnDefinitions as (\n\t\t\t\t\tindex: number,\n\t\t\t\t) => IColumnDefinition;\n\t\t\t}\n\n\t\t\tfor (let index = 0; index < maxColumn; index++) {\n\t\t\t\tconst definition = getDefinition(index);\n\t\t\t\tif (definition.pinPosition == 'left') {\n\t\t\t\t\tleftMeta.push(definition);\n\t\t\t\t\tleftCount++;\n\t\t\t\t} else if (definition.pinPosition == 'right') {\n\t\t\t\t\trightMeta.push(definition);\n\t\t\t\t\trightCount++;\n\t\t\t\t} else {\n\t\t\t\t\tcenterMeta.push(definition);\n\t\t\t\t\tcenterCount++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst getHeaderID = ( definition: IRecordHeaderColumnDefinitions, index: number, ): string => {\n\t\t\t\tconst relativeIndex = leftCount + centerCount + index;\n\t\t\t\treturn definition?.columnId ?? `RecordHeadercolumn ${relativeIndex}`;\n\t\t\t};\n\n\t\tthis.leftHandler.constructColumns(leftMeta, leftCount);\n\t\tthis.centerHandler.constructColumns(centerMeta, centerCount);\n\t\tthis.rightHandler.constructColumns(rightMeta, rightCount);\n\n\t\tthis.headerHandler.constructColumns(\n\t\t\trowHeader,\n\t\t\tgetHeaderID,\n\t\t\theaderCount,\n\t\t);\n\t\tif (useFlattened && this.columnTreeModel) {\n\t\t\tthis.syncColumnVisibilityFromTreeModel();\n\t\t}\n\t\tthis.eventHandler.dispatchEvent({\n\t\t\ttype: Events.EVENT_COLUMN_INIT,\n\t\t});\n\t}\n\n\t/** Sync pane column visibility with tree displayed state (expand/collapse). No reconstruct. */\n\tsyncColumnVisibilityFromTreeModel(): void {\n\t\tif (!this.columnTreeModel) return;\n\t\tconst displayedIds = new Set(this.columnTreeModel.getDisplayedLeafColumnIds());\n\t\tconst syncPane = (pane: FieldPaneInfoHandler) => {\n\t\t\tconst ids = pane.getIdsOrder?.() ?? [];\n\t\t\tids.forEach((id: string) => {\n\t\t\t\tif (displayedIds.has(id)) {\n\t\t\t\t\tpane.unHideColumn?.(id);\n\t\t\t\t} else {\n\t\t\t\t\tpane.hideColumn?.(id);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tsyncPane(this.leftHandler);\n\t\tsyncPane(this.centerHandler);\n\t\tsyncPane(this.rightHandler);\n\t\tthis.eventHandler.dispatchEvent({ type: Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED });\n\t\tthis.eventHandler.dispatchEvent({ type: Events.EVENT_DISPLAYED_COLUMNS_CHANGED });\n\t}\n\n\tisInHeader(id): boolean {\n\t\treturn this.headerHandler.getIndexById(id) != -1;\n\t}\n\n\tconvertToAbsoluteIndex(relativeIndex: number): number {\n\t\tconst paneHandler = this.getFieldPaneByIndex(relativeIndex);\n\t\tconst relativeCount = this.getRelativeCount(paneHandler);\n\t\treturn relativeIndex - relativeCount;\n\t}\n\n\tconvertToRelativeIndex(absoluteIndex: number, pinPosition = 'center'): number {\n\t\tconst paneHandler   = this.getFieldPaneByPinPosition(pinPosition);\n\t\tconst relativeCount = this.getRelativeCount(paneHandler);\n\t\treturn absoluteIndex + relativeCount;\n\t}\n\n\tfindColumnbyPosition(x: number, y: number): number {\n\t\tconst type = this.controlHandler.getHorizontalPaneType(x, y);\n\t\tconst paneRelatedX = this.controlHandler.getPaneRelativeCoordinatesX(\n\t\t\ttype,\n\t\t\tx,\n\t\t);\n\t\tlet index: number;\n\t\tswitch (type) {\n\t\t\tcase HORIZONTAL_PANE.TOP_LEFT:\n\t\t\tcase HORIZONTAL_PANE.MID_LEFT:\n\t\t\tcase HORIZONTAL_PANE.BOTTOM_LEFT:\n\t\t\tcase HORIZONTAL_PANE.HEADER_LEFT: {\n\t\t\t\tconst relativeCount = this.getRelativeCount(this.leftHandler);\n\t\t\t\tindex =\n\t\t\t\t\tthis.leftHandler.getColumnIndexByPosition(paneRelatedX) +\n\t\t\t\t\trelativeCount;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase HORIZONTAL_PANE.TOP_CENTER:\n\t\t\tcase HORIZONTAL_PANE.MID_CENTER:\n\t\t\tcase HORIZONTAL_PANE.BOTTOM_CENTER:\n\t\t\tcase HORIZONTAL_PANE.HEADER_CENTER: {\n\t\t\t\tconst relativeCount = this.getRelativeCount(this.centerHandler);\n\t\t\t\tindex =\n\t\t\t\t\tthis.centerHandler.getColumnIndexByPosition(paneRelatedX) +\n\t\t\t\t\trelativeCount;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase HORIZONTAL_PANE.TOP_RIGHT:\n\t\t\tcase HORIZONTAL_PANE.MID_RIGHT:\n\t\t\tcase HORIZONTAL_PANE.BOTTOM_RIGHT:\n\t\t\tcase HORIZONTAL_PANE.HEADER_RIGHT: {\n\t\t\t\tconst relativeCount = this.getRelativeCount(this.rightHandler);\n\t\t\t\tindex =\n\t\t\t\t\tthis.rightHandler.getColumnIndexByPosition(paneRelatedX) +\n\t\t\t\t\trelativeCount;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tindex = -1;\n\t\t}\n\t\treturn index;\n\t}\n\n\tfindX(column : number) : number {\n\t\tconst fieldPane = this.getFieldPaneByIndex(column);\n\t\tconst absIndex = this.getAbsoluteIndex(column);\n\t\tlet width = this.headerHandler.getTotalWidth();\n\n\t\tif(fieldPane == this.leftHandler) {\n\t\t\tconst columnNode = this.getColumnNode(absIndex);\n\t\t\twidth += columnNode?.getLeft();\n\t\t}\n\t\telse if(fieldPane == this.centerHandler ) {\n\t\t\twidth += this.leftHandler.getTotalWidth();\n\t\t}\n\t\telse if(fieldPane == this.rightHandler) {\n\t\t\twidth += this.leftHandler.getTotalWidth() + this.centerHandler.getTotalWidth();\n\t\t}\n\n\t\tconst columnNode = this.getColumnNode(column);\n\t\twidth += columnNode?.getLeft();\n\t\treturn width;\n\t}\n\n\tgetAbsoluteID(relativeIndex: number): string | null {\n\t\tif (relativeIndex == undefined) {\n\t\t\treturn null;\n\t\t}\n\t\tconst leftCount = this.leftHandler.getColumnCount();\n\t\tconst centerCount = this.centerHandler.getColumnCount();\n\t\tconst fieldPaneHandler = this.getFieldPaneByIndex(relativeIndex);\n\n\t\tlet absoluteIndex = relativeIndex;\n\t\tif (fieldPaneHandler == this.centerHandler) {\n\t\t\tabsoluteIndex -= leftCount;\n\t\t} else if (fieldPaneHandler == this.rightHandler) {\n\t\t\tabsoluteIndex -= leftCount + centerCount;\n\t\t}\n\n\t\treturn fieldPaneHandler.getIdByIndex(absoluteIndex);\n\t}\n\n\n\tgetAbsoluteIndex(relativeIndex : number) : number{\n        // if(relativeIndex == undefined){\n        //     return null;\n        // }\n        // const leftCount = this.leftHandler.getColumnCount();\n        // const centerCount = this.centerHandler.getColumnCount();\n        // const fieldPaneHandler = this.getFieldPaneByIndex(relativeIndex);\n\n        // let absoluteIndex = relativeIndex;\n        // if(fieldPaneHandler == this.centerHandler){\n        //     absoluteIndex -= leftCount;\n        // }\n        // else if(fieldPaneHandler == this.rightHandler){\n        //     absoluteIndex -= (leftCount+centerCount);\n        // }\n        \n        // return absoluteIndex;\n\t\treturn this.convertToAbsoluteIndex(relativeIndex);\n    }\n\n\tgetIndexById(id: string): number | null {\n\t\tif (id == undefined) {\n\t\t\treturn null;\n\t\t}\n\t\tconst tempArr = [\n\t\t\tthis.leftHandler,\n\t\t\tthis.centerHandler,\n\t\t\tthis.rightHandler,\n\t\t];\n\t\tlet relativeIndex = null;\n\t\tfor (let i = 0; i < tempArr.length; i++) {\n\t\t\tconst paneHandler = tempArr[i];\n\t\t\tconst index = paneHandler.getIndexById(id);\n\n\t\t\tif (index != -1) {\n\t\t\t\tconst relativeCount = this.getRelativeCount(paneHandler);\n\t\t\t\trelativeIndex = index + relativeCount;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn relativeIndex;\n\t}\n\n\tgetRelativeCount(paneHandler: FieldPaneInfoHandler): number {\n\t\tlet count = 0;\n\t\tconst topCount = this.leftHandler.getColumnCount();\n\t\tif (paneHandler == this.centerHandler) {\n\t\t\tcount = topCount;\n\t\t} else if (paneHandler == this.rightHandler) {\n\t\t\tconst middleCount = this.centerHandler.getColumnCount();\n\t\t\tcount = topCount + middleCount;\n\t\t}\n\t\treturn count;\n\t}\n\n\tgetFieldPaneByIndex(relativeIndex: number) {\n\t\tconst topCount = this.leftHandler.getColumnCount();\n\t\tconst middleCount = this.centerHandler.getColumnCount();\n\n\t\tif (relativeIndex < topCount) {\n\t\t\treturn this.leftHandler;\n\t\t} else if (relativeIndex < topCount + middleCount) {\n\t\t\treturn this.centerHandler;\n\t\t} else {\n\t\t\treturn this.rightHandler;\n\t\t}\n\t}\n\n\tgetFieldPaneByPinPosition(pinPosition) : FieldPaneInfoHandler {\n\t\tswitch(pinPosition){\n\t\t\tcase 'left':\n\t\t\t\treturn this.leftHandler;\n\t\t\tcase 'right':\n\t\t\t\treturn this.rightHandler;\n\t\t}\n\t\treturn this.centerHandler;\n\t}\n\n\tgetPreviousID(id: string): string | null {\n\t\tconst index = this.getIndexById(id);\n\t\tif (index <= 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn index != null ? this.getAbsoluteID(index - 1) : null;\n\t}\n\n\tgetNextID(id: string): string | null {\n\t\tconst index = this.getIndexById(id);\n\t\tconst maxColumn = this.getTotalCount() - 1;\n\t\tif (index >= maxColumn) {\n\t\t\treturn null;\n\t\t}\n\t\treturn index != null ? this.getAbsoluteID(index + 1) : null;\n\t}\n\n\tgetLeftSpanCount(): number {\n\t\treturn this.leftHandler.getColumnCount();\n\t}\n\n\tgetCenterSpanCount(): number {\n\t\treturn this.centerHandler.getColumnCount();\n\t}\n\n\tgetRightSpanCount(): number {\n\t\treturn this.rightHandler.getColumnCount();\n\t}\n\n\tgetHeaderSpanCount(): number {\n\t\treturn this.headerHandler.getColumnCount();\n\t}\n\t\n\n\tgetTotalCount(): number {\n\t\treturn (\n\t\t\tthis.getLeftSpanCount() +\n\t\t\tthis.getCenterSpanCount() +\n\t\t\tthis.getRightSpanCount()\n\t\t);\n\t}\n\n\tgetNonHiddenFieldCount() : number {\n\t\treturn this.getTotalCount() - (\n\t\t\tthis.leftHandler.getHiddenFieldCount() +\n\t\t\tthis.rightHandler.getHiddenFieldCount() +\n\t\t\tthis.centerHandler.getHiddenFieldCount()\n\t\t);\n\t}\n\n\tgetLeftHandler() {\n\t\treturn this.leftHandler;\n\t}\n\tgetCenterHandler() {\n\t\treturn this.centerHandler;\n\t}\n\tgetRightHandler() {\n\t\treturn this.rightHandler;\n\t}\n\n\tgetHeaderHandler() {\n\t\treturn this.headerHandler;\n\t}\n\n\tgetRowHeaderColumnID(index: number): string {\n\t\treturn this.headerHandler.getIdByIndex(index);\n\t}\n\n\tgetWidthByIndex(index: number): number {\n\t\tconst paneHandler = this.getFieldPaneByIndex(index);\n\t\tconst absoluteIndex = this.convertToAbsoluteIndex(index);\n\t\treturn paneHandler.getColumnWidthByIndex(absoluteIndex);\n\t}\n\n\tsetColumnWidth(index: number, width: number): void {\n\t\tconst paneHandler = this.getFieldPaneByIndex(index);\n\t\tconst absoluteIndex = this.convertToAbsoluteIndex(index);\n\t\tpaneHandler.setColumnWidth(absoluteIndex, width);\n\t}\n\n\tsetColumnWidthByID(id: string, width: number): void {\n\t\tconst index = this.getIndexById(id);\n\t\tif (index != null) {\n\t\t\tthis.setColumnWidth(index, width);\n\t\t}\n\t}\n\n\tupdateColumnsDefiniton(columnIndex : number, columnDefinition : IColumnDefinition): void {\n        const paneHandler = this.getFieldPaneByIndex(columnIndex);\n\t\tconst absIndex = this.convertToAbsoluteIndex(columnIndex);\n\t\tpaneHandler.updateColumnDefinition(absIndex, columnDefinition);\n\t\tif (this.columnTreeModel) {\n\t\t\tconst columnId = this.getAbsoluteID(columnIndex);\n\t\t\tif (columnId) this.columnTreeModel.updateColumnDef(columnId, columnDefinition);\n\t\t}\n    }\n\n\tgetColumnNode(columnIndex : number) : IColumnNode {\n\t\tconst paneHandler = this.getFieldPaneByIndex(columnIndex);\n\t\tconst absIndex = this.convertToAbsoluteIndex(columnIndex);\n\t\treturn paneHandler.getColumnNode(absIndex);\n\t}\n\n\tgetColumnNodeByID(id : string) : IColumnNode {\n\t\tconst panes = [this.leftHandler, this.centerHandler, this.rightHandler];\n\t\tfor(let i = 0; i < panes.length; i++) {\n\t\t\tconst handler = panes[i];\n\t\t\tconst node = handler.getColumnNodeByID(id);\n\t\t\tif (node) {\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetColumnDefinition(index : number) : IColumnDefinition {\n\t\tconst paneHandler = this.getFieldPaneByIndex(index);\n\t\tconst absIndex = this.convertToAbsoluteIndex(index);\n\t\tconst columnDefinition = paneHandler.getColumnDefinition(absIndex);\n\t\treturn columnDefinition;\n\t}\n\n\tgetBodyContainerWidth() {\n\t\treturn this.centerHandler.getTotalWidth();\n\t}\n\n\tgetDisplayedColumnsLeftWidth() {\n\t\treturn this.leftHandler.getTotalWidth();\n\t}\n\n\tgetDisplayedColumnsRightWidth() {\n\t\treturn this.rightHandler.getTotalWidth();\n\t}\n\n\tgetDisplayedColumnsHeaderWidth() {\n\t\treturn this.headerHandler.getTotalWidth();\n\t}\n\n\tgetDisplayedCenterColumns(): IColumnNode[] {\n\t\treturn this.centerHandler.getDisplayedColumns();\n\t}\n\n\tgetDisplayedLeftColumns(): IColumnNode[] {\n\t\treturn this.leftHandler.getDisplayedColumns();\n\t}\n\n\tgetDisplayedRightColumns(): IColumnNode[] {\n\t\treturn this.rightHandler.getDisplayedColumns();\n\t}\n\n\tgetDisplayedHeaderColumns(): RecordHeaderColumnNode[] {\n\t\treturn this.headerHandler.getDisplayedColumns();\n\t}\n\n\tgetCenterColumnIDByX(x: number): string {\n\t\tconst column = this.centerHandler.getColumnIndexByPosition(x);\n\t\tconst columnID = this.centerHandler.getIdByIndex(column);\n\t\treturn columnID;\n\t}\n\n\tisInLeftPane(index: number): boolean {\n\t\tconst infoHandler = this.getFieldPaneByIndex(index);\n\t\treturn infoHandler.getPinPosition() == COLUMN_PANE_TYPE.LEFT;\n\t}\n\n\tisInCenterPane(index: number): boolean {\n\t\tconst infoHandler = this.getFieldPaneByIndex(index);\n\t\treturn infoHandler.getPinPosition() == COLUMN_PANE_TYPE.CENTER;\n\t}\n\n\tisInRightPane(index: number): boolean {\n\t\tconst infoHandler = this.getFieldPaneByIndex(index);\n\t\treturn infoHandler.getPinPosition() == COLUMN_PANE_TYPE.RIGHT;\n\t}\n\n\tisColumnPinned(columnId : string) : boolean {\n\t\tconst node = this.getColumnNodeByID(columnId);\n\t\tconst pinPosition = node?.getPinnedPosition();\n\t\treturn pinPosition == COLUMN_PANE_TYPE.LEFT || pinPosition == COLUMN_PANE_TYPE.RIGHT;\n\t}\n\n\tchangePinPosition(columnIds : string[], pinPosition : columnPinPosition, insertMetas : IPinningOptionalConfig) : void {\n\t\tconst metas = [];\n\t\tconst targetPaneHandler  = this.getFieldPaneByPinPosition(pinPosition);\n\t\tconst helper = targetPaneHandler.getColumNodeHelper();\n\t\tlet {insertIndex, insertPosition} = insertMetas;\n\t\tif(insertPosition == MOVE_POSITION.AFTER){\n\t\t\tinsertIndex = insertIndex + 1;\n\t\t}\n\t\n\t\tconst columnNodes = columnIds.map(id => this.getColumnNodeByID(id));\n\t\tfor(let i = 0; i < columnNodes.length; i++) {\n\t\t\tconst columnNode = columnNodes[i];\n\t\t\tconst currentPinPosition = columnNode.getPinnedPosition();\n\t\t\tconst index              = columnNode?.getIndex();\n\t\t\tconst width              = columnNode?.getWidth();\n\t\t\tconst paneHandler        = this.getFieldPaneByPinPosition(currentPinPosition);\n\t\t\tconst columnPinPosition  = pinPosition == 'none' ? 'center' : pinPosition;\n\t\t\tcolumnNode.updateHelper(helper);\n\t\t\tcolumnNode.updatePinPosition(columnPinPosition);\n\t\t\tif(currentPinPosition != columnPinPosition) {\n\t\t\t\tpaneHandler.deleteColumn(index);\n\t\t\t\tmetas.push({columnNode, width});\n\t\t\t}\n\t\t}\n\n\t\tmetas.forEach(({columnNode, width})=>{\n\t\t\tconst columnCount = targetPaneHandler.getColumnCount();\n\t\t\tconst relativeCount = this.getRelativeCount(targetPaneHandler);\n\t\t\tconst validedIndex = Math.max(Math.min(insertIndex-relativeCount, columnCount), 0);\n\t\t\ttargetPaneHandler.insertColumnNode(validedIndex, columnNode, width);\n\t\t});\n\t}\n\tdeleteColumn(index: number): void {\n\t\tthis.dispatchEvent({\n\t\t\ttype : \"EVENT_BEFORE_COLUMN_DELETE\",\n\t\t\tid : this.getAbsoluteID(index),\n\t\t\tindex\n\t\t})\n\t\tconst paneHandler = this.getFieldPaneByIndex(index);\n\t\tconst absoluteIndex = this.convertToAbsoluteIndex(index);\n\n\t\tpaneHandler.deleteColumn(absoluteIndex);\n\t}\n\n\tdeleteColumnByID(id: string): void {\n\t\tconst index = this.getIndexById(id);\n\t\tthis.deleteColumn(index);\n\t}\n\n\tinsertColumnBefore(index: number, definition: IColumnDefinition): void {\n\t\tconst pinPosition = definition.pinPosition ?? 'center';\n\t\tconst paneHandler = this.getFieldPaneByPinPosition(pinPosition);\n\t\tconst leftCount = this.leftHandler.getColumnCount();\n\t\tconst centerCount = this.centerHandler.getColumnCount();\n\n\t\tlet absoluteIndex;\n\n\t\tif(paneHandler == this.leftHandler && leftCount <= index){\n\t\t\tabsoluteIndex = leftCount-1;\n\t\t}\n\t\telse if(paneHandler == this.centerHandler && index <= leftCount){\n\t\t\tabsoluteIndex = 0;\n\t\t}\n\t\telse if(paneHandler == this.centerHandler && leftCount + centerCount <= index){\n\t\t\tabsoluteIndex = centerCount-1;\n\t\t}\n\t\telse if(paneHandler == this.rightHandler && index <= leftCount + centerCount){\n\t\t\tabsoluteIndex = 0;\n\t\t}\n\t\telse{\n\t\t\tabsoluteIndex = this.convertToAbsoluteIndex(index);\n\t\t}\n\n\t\tdefinition.pinPosition = paneHandler.getPinPosition() as columnPinPositions;\n\t\tpaneHandler.insertColumnBefore(absoluteIndex, definition);\n\t}\n\n\thideColumn(index: number): void {\n\t\tconst paneHandler   = this.getFieldPaneByIndex(index);\n\t\tconst absoluteIndex = this.convertToAbsoluteIndex(index);\n\t\tconst id            = paneHandler.getIdByIndex(absoluteIndex);\n\n\t\tpaneHandler.hideColumn(id);\n\t\tthis.dispatchEvent({\n\t\t\ttype : 'EVENT_COLUMN_HIDE',\n\t\t\tid\t\t\t\n\t\t})\n\t}\n\n\tisColumnHidden(columnId: string): boolean {\n\t\tconst index = this.getIndexById(columnId);\n\t\tconst paneHandler = this.getFieldPaneByIndex(index);\n\t\treturn paneHandler.isColumnHidden(columnId);\n    }\n\n\tunHideColumn(index: number): void {\n\t\tconst paneHandler = this.getFieldPaneByIndex(index);\n\t\tconst absoluteIndex = this.convertToAbsoluteIndex(index);\n\t\tconst id = paneHandler.getIdByIndex(absoluteIndex);\n\n\t\tpaneHandler.unHideColumn(id);\n\t}\n\n\tinsertColumnAfter(index: number, definition: IColumnDefinition): void {\n\t\tconst pinPosition = definition.pinPosition ?? 'center';\n\t\tconst paneHandler = this.getFieldPaneByPinPosition(pinPosition);\n\t\tconst leftCount = this.leftHandler.getColumnCount();\n\t\tconst centerCount = this.centerHandler.getColumnCount();\n\n\t\tlet absoluteIndex;\n\t\tif(paneHandler == this.leftHandler && leftCount <= index){\n\t\t\tabsoluteIndex = leftCount-1;\n\t\t}\n\t\telse if(paneHandler == this.centerHandler && index <= leftCount){\n\t\t\tabsoluteIndex = 0;\n\t\t}\n\t\telse if(paneHandler == this.centerHandler && leftCount + centerCount <= index){\n\t\t\tabsoluteIndex = centerCount-1;\n\t\t}\n\t\telse if(paneHandler == this.rightHandler && index <= leftCount + centerCount){\n\t\t\tabsoluteIndex = 0;\n\t\t}\n\t\telse{\n\t\t\tabsoluteIndex = this.convertToAbsoluteIndex(index);\n\t\t}\n\n\t\tdefinition.pinPosition = paneHandler.getPinPosition() as columnPinPositions;\n\n\t\tpaneHandler.insertColumnAfter(absoluteIndex, definition);\n\t}\n\n\tappendColumns(count: number, definitionArray: IColumnDefinition[]): void {\n\t\tthis.centerHandler.appendColumns(count, definitionArray);\n\t}\n\n\tshiftField(sourceColumn: number, targetColumn: number, position : MovePosition): void {\n\t\tconst sID = this.getAbsoluteID(sourceColumn);\n\t\tconst tID = this.getAbsoluteID(targetColumn);\n\t\tthis.centerHandler.shiftColumn(sID, tID, position);\n\t}\n\n\tshiftMultipleField(sourceIDs: string[], targetID: string, position : MovePosition): void {\n\t\t//if sourceIDs contains different pin positions, then we need to delete the columns from the source pin positions and insert them to the target pin position with the same column node and width to maintain the previous state of the columns\n\t\t//hotFix\n\t\tconst sourceColumns = sourceIDs.map(id => this.getColumnNodeByID(id));\n\t\tconst sourceColumnsWidths = sourceColumns.map(column => column.getWidth());\n\t\tconst targetColumn = this.getColumnNodeByID(targetID);\n\t\tlet pinPositionDiffers = false;\n\t\tsourceColumns.forEach(column => {\n\t\t\tconst sourcePinPosition = column.getPinnedPosition();\n\t\t\tif(sourcePinPosition !== targetColumn.getPinnedPosition()){\n\t\t\t\tpinPositionDiffers = true;\n\t\t\t}\n\t\t});\n\t\tif(pinPositionDiffers){\n\t\t\tsourceColumns.forEach((column, loopIndex) => {\n\t\t\t\tconst sourceIndex = this.getIndexById(column.getID());\n\t\t\t\tthis.deleteColumn(sourceIndex);\n\t\t\t\tconst targetIndex = this.getIndexById(targetColumn.getID());\n\t\t\t\tconst userDefinition = column.getUserColumnDefinition();\n\t\t\t\tuserDefinition.width = sourceColumnsWidths[loopIndex];\n\t\t\t\tposition == MOVE_POSITION.AFTER ? this.insertColumnAfter(targetIndex + loopIndex, userDefinition) : this.insertColumnBefore(targetIndex, userDefinition);\n\t\t\t});\n\t\t}\n\t\telse{\n\t\t\tthis.centerHandler.shiftMultipleColumns(sourceIDs, targetID, position);\n\t\t}\n\t}\n\n\tgetFirstColumnID() : string {\n\t\tconst totalCount = this.getTotalCount();\n\t\tfor (let i = 0; i < totalCount; i++) {\n\t\t\tconst columnId = this.getAbsoluteID(i);\n\t\t\tif (columnId && !this.isColumnHidden(columnId)) {\n\t\t\t\treturn columnId;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetLastColumnID() : string {\n\t\tconst totalCount = this.getTotalCount();\n\t\tfor (let i = totalCount - 1; i >= 0; i--) {\n\t\t\tconst columnId = this.getAbsoluteID(i);\n\t\t\tif (columnId && !this.isColumnHidden(columnId)) {\n\t\t\t\treturn columnId;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetDisplayedAllColumns(): IColumnNode[] {\n\t\treturn [\n\t\t\t...this.getDisplayedLeftColumns(),\n\t\t\t...this.getDisplayedCenterColumns(),\n\t\t\t...this.getDisplayedRightColumns()\n\t\t];\n\t}\n\n\tgetAllDisplayedColumnIDs(): string[] {\n\t\tconst ids = [];\n\n\t\tconst updateIDs =(column : string) => {\n\t\t\tids.push(column);\n\t\t}\n\n\t\tthis.forEachColumns(this.leftHandler.getDisplayedColumnIDs(), updateIDs);\n\t\tthis.forEachColumns(this.centerHandler.getDisplayedColumnIDs(), updateIDs);\n\t\tthis.forEachColumns(this.rightHandler.getDisplayedColumnIDs(), updateIDs);\n\n\t\treturn ids;\n\t}\n\n\tprivate forEachColumns(columns : string[], callback : (column: string) => void) {\n\t\tcolumns.forEach(column => {\n\t\t\tcallback(column);\n\t\t})\n\t}\n\n\tgetLeftPinnedIds() : string[]{\n\t\treturn this.leftHandler.getIdsOrder();\n\t}\n\n\tgetRightPinnedIds() : string[]{\n\t\treturn this.rightHandler.getIdsOrder();\n\t}\n\n\tgetSequenceColumnNodes(startIndex: number, endIndex ?: number) : IColumnNode[] {\n\t\tconst columnNodes = [];\n        endIndex ??= this.getTotalCount() - 1;\n\t\tfor(let i = startIndex; i <= endIndex; i++){\n\t\t\tconst node = this.getColumnNode(i);\n\t\t\tcolumnNodes.push(node);\n\t\t}\n\t\treturn columnNodes;\n    }\n\n\tgetIdByIndex(columnIndex: number): string {\n\t\tconst columnNode = this.getColumnNode(columnIndex);\n\t\treturn columnNode?.getID();\n\t\t\n    }\n\n\tisLastColumn(columnId : string, pinned : columnPinPositions) : boolean {\n\t\tconst handler = this.getHandler(pinned);\n\n\t\treturn handler.getLastColumnID() === columnId;\n\t}\n\n\tisFirstColumn(columnId : string, pinned : columnPinPositions) : boolean {\n\t\tconst handler = this.getHandler(pinned);\n\n\t\treturn handler.getFirstColumnID() === columnId;\n\t}\n\n\tisCenterColumnHidden() : boolean {\n\t\treturn this.centerHandler.getHiddenFieldCount() === this.centerHandler.getColumnCount();\n\t}\n\n\tprivate getHandler(pinned : columnPinPositions) : FieldPaneInfoHandler | RecordHeaderPaneInfoHandler {\n\t\tswitch(pinned) {\n\t\t\tcase 'left':\n\t\t\t\treturn this.leftHandler;\n\t\t\tcase 'right':\n\t\t\t\treturn this.rightHandler;\n\t\t\tcase 'center':\n\t\t\t\treturn this.centerHandler;\n\t\t\tcase 'rowHeader':\n\t\t\t\treturn this.headerHandler;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\n\t// getColumnWidth(){\n\t// \treturn this.columnWidth\n\t// }\n\n\t\n\n}\n\nexport {\n    FieldHandler\n}","import { AutoWired, EventEmitter } from \"@dg/corecomponent\";\nimport { Events } from \"../Constants/Events\";\nimport { defaultColumnWidth } from \"../Constants/GridConfigurationConstants\";\nimport { IColumnDefinition } from \"../Interface/IColumnDefinition\";\nimport { IColumnNode } from \"../Interface/IColumnNode\";\nimport { ColumnNode, IColumnNodeHelper } from \"./ColumnNode\";\nimport { FieldAxis, IFieldAxis } from \"./FieldAxis\";\nimport { v1 as uuid1 } from \"uuid\";\nimport { MovePosition } from \"../../API/ReorderableAPI/Interface/IReorderableAPI\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IColumnHandler } from \"./Interface/IColumnHandler\";\n\nclass FieldPaneInfoHandler extends EventEmitter {\n\n    @AutoWired(GRID_BEAN_NAME.COLUMN_HANDLER) columnHandler : IColumnHandler;\n\n    private fieldAxis            : IFieldAxis;\n    private IDsOrder             : string[];\n    private columnNodeMapping    : Record<string, IColumnNode>;\n    private hiddenFieldMap       : Record<string, number>;\n    private getColumnDefinitions : CallableFunction;\n    private paneType             : string;\n\n    safeIndex: any;\n    columnNodeHelper: IColumnNodeHelper;\n\n    constructor(paenType : string ) {\n        super();\n        this.fieldAxis            = new FieldAxis();\n        this.IDsOrder             = [];\n        this.columnNodeMapping    = {};\n        this.hiddenFieldMap       = {};\n        this.getColumnDefinitions = () => { };\n        this.paneType             = paenType;\n        this.safeIndex            = 0;\n        this.createHelper();\n    }\n\n    private generateID(index: number, definition : IColumnDefinition = {} ) : string {\n        let id = definition.columnId;\n\n        if (id == null || this.columnNodeMapping[id]) {\n            id = `Column${index}_${uuid1()}`; \n\n            while (this.columnNodeMapping[id]) {\n                id = `Column${index}_${uuid1()}`;\n            }\n        }\n\n        return id;\n    }\n\n    protected createHelper() {\n        this.columnNodeHelper = {\n            getIndexById  : this.getIndexById.bind(this),\n            getColumnWidth: this.getColumnWidth.bind(this),\n            getLeft       : this.getColumnLeft.bind(this),\n            setColumnWidth: this.setColumnWidthByID.bind(this),\n            isHide        : this.isColumnHidden.bind(this)\n        }\n    }\n\n    getColumNodeHelper() : IColumnNodeHelper {\n        return this.columnNodeHelper;\n    }\n\n    private createColumnNode(id: string, index: number, definition: IColumnDefinition): void {\n        const isInCache = this.columnNodeMapping[id] != undefined;\n        if(isInCache){\n            id = this.generateID(this.safeIndex, definition);\n        }\n        const isHide = definition?.hidden ?? false;\n\n        const width = (definition?.width === 'auto') ? defaultColumnWidth : (definition?.width ?? defaultColumnWidth);\n        const node = new ColumnNode(id, this.columnNodeHelper, definition);\n        this.insertColumnNode(index, node, width);\n        \n\n        if(isHide) {\n            this.hideColumn(id);\n        }\n        \n        this.safeIndex++;\n    }\n\n    insertColumnNode(index : number, columnNode : IColumnNode, width : number) : void {\n        const minWidth = columnNode.getMinWidth() ?? 0;\n        const maxWidth = columnNode.getMaxWidth() ?? Infinity;\n        width = Math.max(minWidth, Math.min(maxWidth, width));\n        const id = columnNode.getID();\n        this.IDsOrder.splice(index, 0, id);\n        this.columnNodeMapping[id] = columnNode;\n        this.fieldAxis.insertAtIndex(index, width);\n    }\n\n    getIdsOrder() : string[]{\n        return this.IDsOrder;\n    }\n\n    getHiddenFieldCount() : number {\n        return Object.keys(this.hiddenFieldMap).length;\n    }\n\n    clearColumns(): void {\n        this.IDsOrder = [];\n        this.columnNodeMapping = {};\n        this.hiddenFieldMap = {};\n        this.fieldAxis = new FieldAxis();\n        this.safeIndex = 0;\n    }\n\n    constructColumns(columnDefinitions: IColumnDefinition[], count: number) {\n        const previousNodeMapping = { ...this.columnNodeMapping };\n        this.clearColumns();\n        this.getColumnDefinitions = (index: number) => {\n            const userColumnDefinition = columnDefinitions[index] ?? {};\n            return this.columnHandler.addColumnDefaultAndTypes(userColumnDefinition);\n        };\n        for (let index = 0; index < count; index++) {\n            const definition = this.getColumnDefinitions(index);\n            const id = this.generateID(index, definition);\n            const existingNode = previousNodeMapping[id];\n            if (existingNode) {\n                existingNode.updateUserDefinition?.(definition);\n                this.insertColumnNode(index, existingNode, definition?.width ?? defaultColumnWidth);\n                const isHide = definition?.hidden ?? false;\n                if (isHide) { this.hideColumn(id); }\n                this.safeIndex++;\n            } else {\n                this.createColumnNode(id, index, definition);\n            }\n        }\n\n        const event = {\n            type: Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED,\n        };\n        this.eventHandler.dispatchEvent(event);\n    }\n\n    getColumnDefinition(index : number) : IColumnDefinition {\n        const columnNode = this.getColumnNode(index);\n        return columnNode.getUserColumnDefinition();\n    }\n\n    updateColumnDefinition(columnIndex : number, columnDefinition : IColumnDefinition): void {\n        const columnNode = this.getColumnNode(columnIndex);\n        columnNode.updateUserDefinition(columnDefinition);\n    }\n\n    isValidColumn(column : number) : boolean {\n        return 0 <= column && column < this.getColumnCount();\n    }\n\n    deleteColumn(index : number) : void {\n        const id = this.getIdByIndex(index);\n        if(id !=null){\n            const index = this.getIndexById(id);\n            delete this.columnNodeMapping[id];\n            delete this.hiddenFieldMap[id];\n            this.IDsOrder.splice(index, 1);\n            this.fieldAxis.deleteWidth(index);\n        }\n    }\n\n    shiftColumn(sourceID: string, targetID: string, position : MovePosition): void {\n        const sourceIndex = this.getIndexById(sourceID);\n        let targetIndex = this.getIndexById(targetID);\n        targetIndex = position === 'before' ? targetIndex : Math.min(targetIndex+1, this.getColumnCount());\n        if (sourceIndex != -1 && targetIndex != -1) {\n            const sourceWidth = this.getColumnWidth(sourceID);\n            this.fieldAxis.deleteWidth(sourceIndex);\n            if (sourceIndex < targetIndex) {\n                const insertIndex = Math.max(targetIndex-1);\n                this.IDsOrder.splice(sourceIndex, 1);\n                this.IDsOrder.splice(insertIndex, 0, sourceID);\n                this.fieldAxis.insertAtIndex(insertIndex, sourceWidth);\n            }\n            else {\n                this.IDsOrder.splice(sourceIndex, 1);\n                this.IDsOrder.splice(targetIndex, 0, sourceID);\n                this.fieldAxis.insertAtIndex(targetIndex, sourceWidth);\n            }\n        }\n    }\n\n    shiftMultipleColumns(sourceIDs: string[], targetID : string, position : MovePosition): void {\n        const targetIndex = this.getIndexById(targetID);\n        // position === 'after' ? targetIndex++ : targetIndex--;\n        \n        sourceIDs.forEach((sourceID)=>{\n            targetID = this.getIdByIndex(targetIndex);\n            this.shiftColumn(sourceID, targetID, position);\n        });\n    }\n\n    getFirstColumnID() : string {\n        if(this.IDsOrder.length != 0) {\n            let firstIndex = 0;\n            while(this.isColumnHidden(this.getIdByIndex(firstIndex))) {\n                firstIndex++;\n            }\n            return firstIndex != -1 ? this.getIdByIndex(firstIndex) : null;\n        }\n        return null;\n    }\n\n    getLastColumnID() : string {\n        let lastIndex = this.getLastColumn();\n        while(this.isColumnHidden(this.getIdByIndex(lastIndex))) {\n            lastIndex--;\n        }\n        return lastIndex != -1 ? this.getIdByIndex(lastIndex) : null;\n    }\n\n    getLastColumn() : number {\n        return this.IDsOrder.length - 1;\n    }\n\n    insertColumnBefore(index: number, definition: IColumnDefinition): void {\n        const columnDefinition =  this.columnHandler.addColumnDefaultAndTypes(definition);\n        const id = this.generateID(index, columnDefinition);\n        this.createColumnNode(id, index, columnDefinition);\n    }\n\n    insertColumnAfter(index: number, definition: IColumnDefinition): void {\n         const columnDefinition =  this.columnHandler.addColumnDefaultAndTypes(definition);\n        const id = this.generateID(index + 1, columnDefinition);\n        this.createColumnNode(id, index + 1, columnDefinition);\n    }\n\n    appendColumns(count = 1, definitionArr : IColumnDefinition[] = []) : void {\n        const lastIndex = this.getColumnCount()-1;\n        for(let index = count-1; index >= 0; index--){\n            const definition = definitionArr[index];\n            this.insertColumnAfter(lastIndex, definition);\n        }\n    }\n\n    getHeaderRenderer(id : string) : any | null{\n        const node = this.columnNodeMapping[id];\n        const renderer = node.getHeaderRenderer();\n        return renderer ?? null;\n    }\n\n    getRenderer(id : string) : any | null{\n        const node = this.columnNodeMapping[id];\n        const renderer = node.getRenderer();\n        return renderer ?? null;\n    }\n\n    getColumnNode(index: number): IColumnNode | null {\n        let id = this.IDsOrder[index];\n        if (!id) {\n            return null\n        }\n        id = this.IDsOrder[index];\n        return this.columnNodeMapping[id];\n    }\n\n    getColumnNodeByID(id : string) : IColumnNode {\n        return this.columnNodeMapping[id] ?? null;\n    }\n\n    getIdByIndex(index: number): string | null {\n        const node = this.getColumnNode(index);\n        return node?.getID() ?? null;\n    }\n\n    getIndexById(id: string): number {\n        return this.IDsOrder.indexOf(id);\n    }\n\n    getColumnIndexByPosition(position : number) : number {\n        if(position < 0) {\n            return -1;\n        }\n        return this.fieldAxis.getIndexByPosition(position);\n    }\n\n    getPreviousID(id : string) : string | null{\n        const index = this.getIndexById(id);\n        let nextID = null\n        if(index != -1){\n           nextID = this.getIdByIndex(index-1);\n        }\n        return nextID;\n    }\n\n    getNextID(id : string) : string | null{\n        const index = this.getIndexById(id);\n        let nextID = null\n        if(index != -1){\n           nextID = this.getIdByIndex(index+1);\n        }\n        return nextID;\n    }\n\n    getColumnLeft(id: string): number | null {\n        const index = this.getIndexById(id);\n        const totalWidth = this.fieldAxis.getTotalWidth();\n\n        const isRTL = this.optionsHandler.isRTL();\n        return (index != -1) ? isRTL ? totalWidth - this.fieldAxis.getWidth(index) - this.fieldAxis.getLeft(index):this.fieldAxis.getLeft(index) : null;\n    }\n\n    getColumnWidthByIndex(index : number) : number {\n        return this.fieldAxis.getWidth(index);\n    }\n\n    getColumnWidth(id: string): number | null {\n        const index = this.getIndexById(id);\n        return index==-1 ? null : this.getColumnWidthByIndex(index);\n    }\n\n    setColumnWidthByID(id: string, width : number): void {\n        const index = this.getIndexById(id);\n        this.setColumnWidth(index, width);\n    }\n\n    setColumnWidth(index: number, width : number): void {\n        const isValid = this.isValidColumn(index);\n        const isHidden = this.isColumnHidden(this.getIdByIndex(index));\n        if (isValid && !isHidden) {\n            const node = this.getColumnNode(index);\n            const minWidth = node.getMinWidth();\n            const maxWidth = node.getMaxWidth();\n            width = Math.max(minWidth, Math.min(maxWidth, width));\n            this.fieldAxis.updateWidth(index, width);\n        }\n    }\n\n    getColumnCount(): number {\n        return this.IDsOrder.length;\n    }\n\n    getTotalWidth() : number {\n        return this.fieldAxis.getTotalWidth();\n    }\n\n    isColumnHidden(id) : boolean {\n        return this.hiddenFieldMap[id] != undefined;\n    }\n\n    hideColumn(id: string): void {\n        if (this.isColumnHidden(id)) {\n            return; // Stop execution if `id` is already hidden\n        }\n        const index = this.getIndexById(id);\n\n          if (index != -1) {\n            const width = this.getColumnWidth(id) as number;\n            this.fieldAxis.updateWidth(index, 0);\n            this.hiddenFieldMap[id] = width;\n        }\n\n       \n    }\n\n    unHideColumn(id: string): void {\n        const index = this.getIndexById(id);\n        if (index != -1) {\n            if(this.hiddenFieldMap[id]) {\n                const width = this.hiddenFieldMap[id];\n                delete this.hiddenFieldMap[id];\n                this.fieldAxis.updateWidth(index, width);\n            }\n        }\n    }\n\n    getHiddenColumnNodes() : IColumnNode[] {\n        const columns = [];\n        this.IDsOrder.forEach((id) => {\n            if(this.hiddenFieldMap[id]) {\n                columns.push(this.getColumnNodeByID(id))\n            }\n        }); // need to update as static implementation\n        return columns;\n\n    }\n\n    getDisplayedColumns() : IColumnNode[] {\n        const columns = [];\n        this.IDsOrder.forEach((id) => {\n            if(!this.hiddenFieldMap[id]) {\n                columns.push(this.getColumnNodeByID(id))\n            }\n        }); // need to update as static implementation\n        return columns;\n    }\n\n    getDisplayedColumnIDs() : string[] {\n        return this.IDsOrder;\n    }\n\n    getPinPosition() : string{\n        return this.paneType;\n    }\n\n    getColumnNodes(startIndex : number, endIndex : number) : IColumnNode[] { // need to update as static implementation\n        let columnNodes = [];\n        for(let index = startIndex ;index <= endIndex ;index++) {\n            const columnNode =  this.getColumnNode(index)\n            if(columnNode) {\n                if(!this.isColumnHidden(columnNode.getID())) {\n                    columnNodes.push(columnNode);\n                }\n            }\n            \n        }\n\n        return columnNodes;\n    }\n}\n\n\nexport {\n    FieldPaneInfoHandler\n}","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { Events } from \"../Constants/Events\";\nimport { FieldHandler } from \"./FieldHandler\";\n\n@Bean(GRID_BEAN_NAME.PINNED_HANDLER)\nexport class PinnedHandler extends EventEmitter {\n    private leftWidth   !: number;\n    private rightWidth  !: number;\n    private headerWidth !: number;\n\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private columnModel!: FieldHandler;\n\n    @PostConstruct()\n    postConstruct() {\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED,this.onPinnedChanged.bind(this));\n    }\n\n    private onPinnedChanged() {\n        const newLeftWidth   = this.columnModel.getDisplayedColumnsLeftWidth();\n        const newRightWidth  = this.columnModel.getDisplayedColumnsRightWidth();\n        const newHeaderWidth = this.columnModel.getDisplayedColumnsHeaderWidth();\n\n        if(newHeaderWidth != this.headerWidth) {\n            this.headerWidth = newHeaderWidth;\n            this.eventHandler.dispatchEvent({\n                type : Events.EVENT_HEADER_WIDTH_CHANGED\n            })\n        }\n\n        if (newLeftWidth != this.leftWidth) {\n            this.leftWidth = newLeftWidth;\n            this.eventHandler.dispatchEvent({type: Events.EVENT_LEFT_PINNED_WIDTH_CHANGED});\n        }\n\n        if (newRightWidth != this.rightWidth) {\n            this.rightWidth = newRightWidth;\n            this.eventHandler.dispatchEvent({type: Events.EVENT_RIGHT_PINNED_WIDTH_CHANGED});\n        }\n    }\n\n    getHeaderWidth() : number {\n        return this.headerWidth;\n    }\n\n    getLeftWidth() : number {\n        return this.leftWidth;\n    }\n\n    getRightWidth() : number {\n        return this.rightWidth;\n    }\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { Events } from \"../Constants/Events\";\nimport { defaultColumnWidth } from \"../Constants/GridConfigurationConstants\";\nimport { IRecordHeaderColumnDefinitions } from \"../Interface/IColumnDefinition\";\nimport { IColumnNodeHelper, RecordHeaderColumnNode, createRecordHeaderColumnNode } from \"./ColumnNode\";\nimport { FieldAxis, IFieldAxis } from \"./FieldAxis\";\n\n \n\nclass RecordHeaderPaneInfoHandler  extends EventEmitter{\n    private fieldAxis: IFieldAxis;\n    private IDsOrder: string[];\n    private columnNodeMapping: Record<string, RecordHeaderColumnNode>;\n    private hiddenFieldMap: Record<string, number>;\n    private getID: (definition: IRecordHeaderColumnDefinitions, index: number) => string;\n    private getColumnDefinitions: CallableFunction;\n    private columnNodeHelper: IColumnNodeHelper;\n\n    constructor() {\n        super();\n        this.fieldAxis            = new FieldAxis();\n        this.IDsOrder             = [];\n        this.columnNodeMapping    = {};\n        this.getID                = (_definition, index: number) => `Column-${index}`;\n        this.hiddenFieldMap       = {};\n        this.getColumnDefinitions = () => { };\n        this.createHelper();\n    }\n\n    protected createHelper() {\n        const getIndexById = this.getIndexById.bind(this);\n        const getColumnWidth = this.getColumnWidth.bind(this);\n        const getLeft = this.getColumnLeft.bind(this);\n        const setColumnWidth = this.setColumnWidthByID.bind(this);\n        const isHide = () => false;\n        this.columnNodeHelper = {\n            getIndexById,\n            getColumnWidth,\n            getLeft,\n            setColumnWidth,\n            isHide\n        }\n    }\n\n    private createColumnNode(id: string, index: number, definition: IRecordHeaderColumnDefinitions): void {\n        const node = createRecordHeaderColumnNode(this.columnNodeHelper, id, definition);\n        const width = definition.width ?? defaultColumnWidth;\n        this.IDsOrder.splice(index, 0, id);\n        this.columnNodeMapping[id] = node;\n        this.fieldAxis.insertAtIndex(index, width);\n    }\n\n    constructColumns(columnDefinitions: IRecordHeaderColumnDefinitions[], getID: (definition: IRecordHeaderColumnDefinitions, index: number) => string, count: number) {\n        this.getColumnDefinitions = (index: number) => columnDefinitions[index];\n        this.getID = getID;\n        for (let index = 0; index < count; index++) {\n            const definition = this.getColumnDefinitions(index);\n            const id = this.getID(definition, index);\n            this.createColumnNode(id, index, definition);\n        }\n\n        const event = {\n            type: Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED,\n        };\n        this.eventHandler.dispatchEvent(event);\n    }\n\n    isValidColumn(column : number) : boolean {\n        return 0 <= column && column < this.getColumnCount();\n    }\n\n    getColumnNodeById(id : string) : RecordHeaderColumnNode {\n        return this.columnNodeMapping[id];\n    }\n\n    deleteColumn(id: string): void {\n        const index = this.getIndexById(id);\n        delete this.columnNodeMapping[id];\n        this.IDsOrder.splice(index, 1);\n        this.fieldAxis.deleteWidth(index);\n    }\n\n    shiftColumn(sourceID: string, targetID: string): void {\n        const sourceIndex = this.getIndexById(sourceID);\n        const targetIndex = this.getIndexById(targetID);\n        if (sourceIndex != -1 && targetIndex != -1) {\n            if (sourceIndex < targetIndex) {\n                this.IDsOrder.splice(sourceIndex, 1);\n                this.IDsOrder.splice(targetIndex + 1, 0, sourceID);\n            }\n            else {\n                this.IDsOrder.splice(sourceIndex, 1);\n                this.IDsOrder.splice(targetIndex, 0, sourceID);\n            }\n        }\n    }\n\n    insertColumnBefore(index: number, definition: IRecordHeaderColumnDefinitions): void {\n        const id = this.getID(definition, index);\n        this.createColumnNode(id, index, definition);\n    }\n\n    insertColumnAfter(index: number, definition: IRecordHeaderColumnDefinitions): void {\n        const id = this.getID(definition, index + 1);\n        this.createColumnNode(id, index + 1, definition);\n    }\n\n    getHeaderRenderer(id: string): any | null {\n        const node = this.columnNodeMapping[id];\n        const renderer = node.getHeaderRenderer();\n        return renderer ?? null;\n    }\n\n    getRenderer(id: string): any | null {\n        const node = this.columnNodeMapping[id];\n        const renderer = node.getRenderer();\n        return renderer ?? null;\n    }\n\n    getColumnNode(index: number): RecordHeaderColumnNode {\n        let id = this.IDsOrder[index];\n        // if (!id) {\n        //     const definition = this.getColumnDefinitions(index);\n        //     this.createColumnNode(id, index, definition);\n        // }\n        id = this.IDsOrder[index];\n        return this.columnNodeMapping[id];\n    }\n\n    getIdByIndex(index: number): string | null {\n        const node = this.getColumnNode(index);\n        return node?.getID() ?? null;\n    }\n\n    getIndexById(id: string): number {\n        return this.IDsOrder.indexOf(id);\n    }\n\n    getPreviousID(id: string): string | null {\n        const index = this.getIndexById(id);\n        let nextID = null\n        if (index != -1) {\n            nextID = this.getIdByIndex(index - 1);\n        }\n        return nextID;\n    }\n\n    getNextID(id: string): string | null {\n        const index = this.getIndexById(id);\n        let nextID = null\n        if (index != -1) {\n            nextID = this.getIdByIndex(index + 1);\n        }\n        return nextID;\n    }\n\n    getColumnLeft(id: string): number | null {\n        const index      = this.getIndexById(id);\n        const totalWidth = this.fieldAxis.getTotalWidth();\n        const isRTL      = this.optionsHandler.isRTL();\n        return (index != -1) ? isRTL ? totalWidth - this.fieldAxis.getWidth(index) - this.fieldAxis.getLeft(index) :this.fieldAxis.getLeft(index) : null;\n    }\n\n    getColumnWidthByIndex(index : number) : number {\n        return this.fieldAxis.getWidth(index);\n    }\n\n    getColumnWidth(id: string): number | null {\n        const index = this.getIndexById(id);\n        return this.getColumnWidthByIndex(index);\n    }\n\n    setColumnWidthByID(id: string, width : number): void {\n        const index = this.getIndexById(id);\n        this.setColumnWidth(index, width);\n    }\n\n    setColumnWidth(index: number, width : number): void {\n        const isValid = this.isValidColumn(index);\n        if (isValid) {\n            this.fieldAxis.updateWidth(index, width);\n        }\n    }\n\n    getColumnCount(): number {\n        return this.IDsOrder.length;\n    }\n\n    getTotalWidth(): number {\n        return this.fieldAxis.getTotalWidth();\n    }\n\n    hideColumn(id: string): void {\n        const index = this.getIndexById(id);\n        if (index != -1) {\n            const width = this.getColumnWidth(id) as number;\n            this.fieldAxis.updateWidth(index, 0);\n            this.hiddenFieldMap[id] = width;\n        }\n    }\n\n    unHideColumn(id: string): void {\n        const index = this.getIndexById(id);\n        if (index != -1) {\n            const width = this.hiddenFieldMap[id]\n            this.fieldAxis.updateWidth(index, width);\n        }\n    }\n\n    getDisplayedColumns(): RecordHeaderColumnNode[] {\n        return Object.values(this.columnNodeMapping);\n    }\n\n    getFirstColumnID() : string {\n        if(this.IDsOrder.length != 0) {\n            return this.IDsOrder[0];\n        }\n        return null;\n    }\n\n    getLastColumnID() : string {\n        const lastIndex = this.getLastColumn();\n        return this.getIdByIndex(lastIndex);\n    }\n\n    getLastColumn() : number {\n        return this.IDsOrder.length - 1;\n    }\n\n}\n\n\nexport {\n    RecordHeaderPaneInfoHandler\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IControllerHandler } from \"../Interface/IControllerHandler\";\nimport { RowContainerController } from \"../../GridComponent/GridBodyComponent/RowContainer/RowContainerController\";\nimport type { FieldHandler } from \"./FieldHandler\";\nimport { IColumnNode } from \"../Interface/IColumnNode\";\nimport { Events } from \"../Constants/Events\";\nimport { RecordHeaderColumnNode } from \"./ColumnNode\";\nimport { ColumnVisibleHandlerType } from \"./column-visible-handler.types\";\nimport { columnPinPositions } from \"../Constants/GridConfigurationConstants\";\nimport { IColumnAutofitHandler } from \"../../../Autofit/ColumnAutofit/column-autofitHandler.types\";\n// import { IRowNode } from \"../Interface/IRowNode\";\n\n\n@Bean(GRID_BEAN_NAME.COLUMN_VISIBLE_HANDLER)\nexport class ColumnVisibleHandler extends EventEmitter implements ColumnVisibleHandlerType {\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler        : IControllerHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler                  : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.COLUMN_AUTOFIT_HANDLER) private columnAutofitHandler : IColumnAutofitHandler;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!   : getBeanInstanceByBeanName;\n\n    private firstRenderIndex: number   = 0;\n    private lastRenderIndex : number   = 0;\n    private firstVisiblePixel : number = 0;\n    private lastVisiblePixel : number  = 0;\n\n    private centerContainerController : RowContainerController | null = null;\n\n    @PostConstruct()\n    init() : void {\n        this.controllerHandler.onAfterGridReady((params) => {\n            this.centerContainerController = params.centerRowContainerControl;\n            this.attachListeners();\n        })\n    }\n\n    private attachListeners() : void {\n        this.addListener(this.eventHandler, Events.EVENT_HORIZONTAL_SCROLL, this.refresh.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_INIT, this.refresh.bind(this));\n        const refreshCallback = (params : any) => {\n            this.refresh()\n            params.refresh && this.dispatchRefesh();\n        }\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_INSERT, refreshCallback);\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_DELETE, refreshCallback);\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_HIDE, refreshCallback);\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_SHOW, refreshCallback);\n        this.addListener(this.eventHandler, Events.EVENT_GRID_SIZE_UPDATED, refreshCallback);\n        this.addListener(this.eventHandler, Events.EVENT_GRID_REFRESH, this.dispatchDisplayedColumnsChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_RESIZE_CHANGED, refreshCallback);\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_REORDERED, refreshCallback);\n    }\n\n    private dispatchRefesh() : void {\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_REFRESH\n        })\n    }\n\n    private refresh() : void {\n        const previousFirstRenderIndex = this.firstRenderIndex;\n        const previousLastRenderIndex  = this.lastRenderIndex;\n\n        this.findFirstAndLastColumnsToRender();\n\n        const viewPortChange = this.firstRenderIndex !== previousFirstRenderIndex || this.lastRenderIndex !== previousLastRenderIndex;\n\n        if(!viewPortChange) {\n            return;\n        }\n        this.dispatchDisplayedColumnsChanged();\n\n        this.dispatchEvent({\n\t\t\ttype     : Events.EVENT_VIEWPORT_CHANGED,\n\t\t\tfrom     : this.firstRenderIndex,\n\t\t\tto       : this.lastRenderIndex,\n\t\t\tfromMeta : this.firstRenderIndex,\n\t\t\ttoMeta   : this.lastRenderIndex,\n\t\t\tapi      : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER),\n            viewportType : 'column'\n\t\t});\n\n        this.dispatchEvent({\n            type : Events.EVENT_COLUMN_CHANGED\n        })\n    }\n\n    public getDisplayedColumns(rowIndex : number, pinned: columnPinPositions): (IColumnNode | RecordHeaderColumnNode)[] {\n        const params = {\n            rowIndex\n        };\n\t\tswitch (pinned) {\n\t\t\tcase 'left':\n\t\t\t\treturn this.getLeftColumns(params);\n\t\t\tcase 'right':\n\t\t\t\treturn this.getRightColumns(params);\n\t\t\tcase 'center':\n\t\t\t\treturn this.getCenterColumns(params);\n\t\t\tcase 'rowHeader':\n\t\t\t\treturn this.getHeaderColumns(params);\n\t\t\tdefault:\n\t\t\t\treturn this.getCenterColumns(params);\n\t\t}\n\t}\n\n    \n\n    public getCenterColumns(params : any={}) : IColumnNode[] {\n        const isInColumnAutofitProgress = this.columnAutofitHandler.getAutofitProgressState();\n        if(isInColumnAutofitProgress) {         \n            params.startColumnIndex   = this.firstRenderIndex;\n            params.endColumnIndex     = this.lastRenderIndex;\n            return this.columnAutofitHandler.getColumnNodesToBeProcessed(params, 'center');\n        }\n\n        const centerHandler = this.fieldHandler.getCenterHandler();\n        const columnNodes = centerHandler.getColumnNodes(this.getFirstRenderIndex(), this.getLastRenderIndex());\n        return columnNodes;\n    }\n\n    \n\n    public getLeftColumns(params : any) : IColumnNode[] {\n        const isInColumnAutofitProgress = this.columnAutofitHandler.getAutofitProgressState();\n        if(isInColumnAutofitProgress) {\n            params.startColumnIndex   = this.firstRenderIndex;\n            params.endColumnIndex     = this.lastRenderIndex;\n            return this.columnAutofitHandler.getColumnNodesToBeProcessed(params, 'left');\n        }\n\n        const leftHandler = this.fieldHandler.getLeftHandler();\n        return leftHandler.getDisplayedColumns();\n    }\n\n    public getRightColumns(params : any) : IColumnNode[] {\n        const isInColumnAutofitProgress = this.columnAutofitHandler.getAutofitProgressState();\n        if(isInColumnAutofitProgress) {\n            params.startColumnIndex   = this.firstRenderIndex;\n            params.endColumnIndex     = this.lastRenderIndex;\n            return this.columnAutofitHandler.getColumnNodesToBeProcessed(params, 'right');\n        }\n\n        const rightHandler = this.fieldHandler.getRightHandler();\n        return rightHandler.getDisplayedColumns();\n    }\n\n    public getHeaderColumns(_params : any) : RecordHeaderColumnNode[] {\n        const isInColumnAutofitProgress = this.columnAutofitHandler.getAutofitProgressState();\n        if(isInColumnAutofitProgress) {\n            return [];\n        }\n        const headerHandler = this.fieldHandler.getHeaderHandler();\n        return headerHandler.getDisplayedColumns();\n    }\n\n    // private getColumnNodes(rowNode : IRowNode, displayColumns : IColumnNode[]) : IColumnNode[] {\n    //     const result: IColumnNode[] = [];\n    //     let i = 0;\n\n    //     while (i < displayColumns.length) {\n    //         const column = displayColumns[i];\n    //         const columnSpan = column.getColumnSpan({\n    //             columnId      : column.getID(),\n    //             rowIndex      : rowNode.getIndex(),\n    //             rowId         : rowNode.getId(),\n    //             rowPinPosition: rowNode.getPinnedPosition(),\n    //             data          : rowNode.getRowData(),\n    //             value         : rowNode.getDataByKey(column.getColumnKey())\n    //         });\n\n    //         if (columnSpan && columnSpan > 1) {\n    //             result.push(column);\n    //             i += columnSpan;\n    //         } else {\n    //             result.push(column);\n    //             i++;\n    //         }\n    //     }\n\n    //     return result;\n    // }\n\n    public getFirstVisiblePixel() : number {\n        return this.firstVisiblePixel;\n    }\n\n    public getLastVisiblePixel() : number {\n        return this.lastVisiblePixel;\n    }\n\n    getFirstRenderIndex() : number{\n        return this.firstRenderIndex;\n    }\n\n    getLastRenderIndex() : number{\n        return this.lastRenderIndex;\n    }\n\n    getAllDisplayedColumns() : string[] {\n        const leftColumns = this.getLeftColumns({});\n        const centerColumns = this.getCenterColumns();\n        const rightColumns = this.getRightColumns({});\n        const fieldIDs = [];\n        leftColumns.forEach(column => {\n            fieldIDs.push(column.getID());\n        });\n        centerColumns.forEach(column => {\n            fieldIDs.push(column.getID());\n        });\n        rightColumns.forEach(column => {\n            fieldIDs.push(column.getID());\n        });\n\n        return fieldIDs;\n    }\n\n    private dispatchDisplayedColumnsChanged() : void {\n        this.dispatchEvent({\n            type : Events.EVENT_DISPLAYED_COLUMNS_CHANGED,\n        })\n    }\n   private findFirstAndLastColumnsToRender() : void {\n        const scrollPosition = this.centerContainerController.getHScrollPosition();\n\n        const centerHandler  = this.fieldHandler.getCenterHandler();\n\n        const bodyWidth      = centerHandler.getTotalWidth();\n        let firstPixel = 0;\n        let lastPixel  = 0;\n\n        firstPixel = Math.max(scrollPosition.left - 200, 0);\n        lastPixel  = Math.min(scrollPosition.right + 200, bodyWidth);\n\n       \n\n        this.firstVisiblePixel = Math.max(scrollPosition.left, 0);\n\n        this.lastVisiblePixel = Math.min(scrollPosition.right, bodyWidth);\n\n        const pageFirstColumn = centerHandler.getIndexById(centerHandler.getFirstColumnID());\n\n        const pageLastColumn = centerHandler.getIndexById(centerHandler.getLastColumnID());\n\n        let firstColumnIndex = centerHandler.getColumnIndexByPosition(firstPixel);\n\n        let lastColumnIndex = centerHandler.getColumnIndexByPosition(lastPixel);\n\n        if(firstColumnIndex === -1 || firstColumnIndex < pageFirstColumn) {\n            firstColumnIndex = pageFirstColumn;\n        }\n\n        if(lastColumnIndex === -1 || lastColumnIndex > pageLastColumn) {\n            lastColumnIndex = pageLastColumn;\n        }\n\n        const firstDiffers = firstColumnIndex !== this.firstRenderIndex;\n\n\t\tconst lastDiffers = lastColumnIndex !== this.lastRenderIndex;\n\n\t\tif (firstDiffers || lastDiffers) {\n\t\t\tthis.firstRenderIndex = firstColumnIndex;\n\t\t\tthis.lastRenderIndex = lastColumnIndex;\n\t\t}\n    }\n\n   \n}","// import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n// import { COLUMN_REORDER_EVENT } from \"../../Constants/Events\";\n// import { DragScrollListener } from \"../../Navigation/DragListener\";\n// import { GRID_BEAN_NAME } from \"../../Constants/BeanName\";\n// import { GridUserComponentHandler } from \"../UserComponentHandler\";\n\n// @Bean(GRID_BEAN_NAME.COLUMN_REORDER_COMPONENT_HANDLER)\n// class ColumnRorderListener extends EventEmitter {\n\n//     @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n//     private dragScrollListener;\n\n//     onReorderStarted;\n//     onReordering;\n//     onReOrderEnded;\n\n//     constructor() {\n//         super();\n//     }\n\n//     @PostConstruct()\n//     init() {\n//         this.dragScrollListener = this.createManagedBean(new DragScrollListener());\n//         this.createListener();\n//     }\n\n//     registerDragElement(dragElement : HTMLElement) : void {\n// \t\tthis.addListener(dragElement, 'mousedown', this.columnReorderMousedown.bind(this))\n// \t}\n\n//     registerDragAndDropElement(element : HTMLElement) : void {\n//         element.addEventListener('mousedown', (_event : MouseEvent) => {\n//             this.dragScrollListener.setDragScrollListener(this.onReorderStarted, this.onReordering, this.onReOrderEnded);\n//             this.dragScrollListener.mouseDragListener(event, \"column\")\n//         });\n//     }\n\n//     columnReorderMousedown(event : MouseEvent) : void {\n//         this.dragScrollListener.setDragScrollListener(this.onReorderStarted, this.onReordering, this.onReOrderEnded);\n//         this.dragScrollListener.mouseDragListener(event, \"column\");\n//     } \n\n//     createListener() : void {\n//         const columnSelection       = this.getBeanInstanceByBeanName('columnSelection');\n//         const columnSelectionAPI    = this.getBeanInstanceByBeanName('columnSelectionAPI');\n//         const fieldHandler          = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n//         const controlHandler        = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER);\n//         const rowRendererController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n\n//         let sourceColumn : number;\n//         let reorderCue\n//         let selectedColumns = columnSelection.getSelectedColumns() || [];\n//         let sourceColumnArray : number[];\n//         let targetColumn : number;\n//         let targetColumnId : string;\n//         let isSourceColumnSelected : boolean;\n//         let reorderElement : HTMLElement;\n       \n//         this.onReorderStarted = (ev : MouseEvent, _diffRect, _horizontalScroll : number, _rowID : string, columnID : string, _paneType : string) => {\n\n//             reorderCue = document.createElement('div');\n//             reorderCue.style.position = 'absolute'\n//             const gridController = controlHandler.getBodyController();\n//             const gridContainer = gridController.getBodyContainer()\n//             gridContainer.append(reorderCue);\n\n\n//             sourceColumn = fieldHandler.getIndexById(columnID);\n\n//             isSourceColumnSelected = columnSelectionAPI.isColumnSelected(sourceColumn);\n//             if(isSourceColumnSelected) {\n//                 const selectedColumns = columnSelection.getSelectedColumns();\n//                 sourceColumnArray = [...selectedColumns];\n//             } else {\n//                 sourceColumnArray = [sourceColumn];\n//             }\n\n//             const definitionParam = this.createDefinitionParam();\n//             const reorderParams = this.createReorderParams(sourceColumnArray, isSourceColumnSelected);\n//             const userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as GridUserComponentHandler;\n//             const reorderDetails = userComponentHandler.getColumnReorderRendererDetails(definitionParam, reorderParams);\n           \n\n\n//             reorderElement = document.createElement('div');\n// \t\t\treorderElement.style.position = 'absolute';\n\n//             if(reorderDetails) {\n//                 const reorderElementInstance = reorderDetails?.newInstance();\n//                 const ele = reorderElementInstance.getElement();\n//                 reorderElement && reorderElement.appendChild(ele);\n//             }\n           \n//             document.body.append(reorderElement);\n//             reorderElement.style.position = \"absolute\";\n\n//             const translatedCoordinates = controlHandler.translateCoordinates(ev.x, ev.y);\n//             this.dispatchEvent({ type : COLUMN_REORDER_EVENT.EVENT_REORDER_STARTED, columnID : columnID, coordinates : translatedCoordinates, columnIndexes : selectedColumns, event : ev });\n\n//             console.log(sourceColumn);\n//         }\n\n//         this.onReordering = (ev : MouseEvent, _diffRect, _horizontalScroll : number, _rowID : string, columnID : string, _paneType : string) => {\n//             // reorderElement.style.top = ev.y+\"px\";\n//             // reorderElement.style.left = ev.x+\"px\";\n\n\n//               // selectedColumns = columnSelection.getSelectedColumns() || [];\n\n//             const translatedCoordinates = controlHandler.translateCoordinates(ev.x, ev.y);\n//             reorderElement.style.top = ev.y+\"px\";\n//             reorderElement.style.left = ev.x+\"px\";\n\n//             const columnIndex = fieldHandler.getIndexById(columnID);\n//             const left = fieldHandler.findX(columnIndex);\n            \n//             const nextColumnID = fieldHandler.getNextID(columnID);\n//             const nextColumnIndex = fieldHandler.getIndexById(nextColumnID);\n//             const nextLeft = fieldHandler.findX(nextColumnIndex);\n\n//             const midX = (left + nextLeft) / 2;\n            \n//             let cueLeft = left;\n//             targetColumn = columnIndex;\n//             targetColumnId = columnID;\n\n//             if(translatedCoordinates.x >= midX) {\n//                 cueLeft = nextLeft;\n//                 targetColumn = nextColumnIndex;\n//                 targetColumnId = nextColumnID;\n//             } else {\n//                 targetColumnId = sourceColumn > targetColumn ?  fieldHandler.getNextID(targetColumnId) : columnID;\n//                 targetColumn = columnIndex;\n//             }\n\n//             reorderCue.style.left = cueLeft+\"px\";\n//             reorderCue.style.width = '2px'\n//             reorderCue.style.height = '100%';\n//             reorderCue.style.background = 'black'\n//             const selectedColumns = columnSelection.getSelectedColumns();\n\n//             this.dispatchEvent({ type : COLUMN_REORDER_EVENT.EVENT_REORDERING, columnID : columnID, coordinates : translatedCoordinates, columnIndexes : selectedColumns, event : ev });\n//         }\n\n//         this.onReOrderEnded = (ev : MouseEvent, _diffRect, _horizontalScroll : number, _rowID : string, columnID : string, _paneType : string) => {\n\n//             reorderElement.remove();\n//             reorderCue.remove();\n\n//             // selectionAPI.clearAllSelection();\n\n//             const IDs = [];\n//             sourceColumnArray.forEach(column => {\n//                 const id = fieldHandler.getAbsoluteID(column);\n//                 IDs.push(id);\n//             });\n\n//             const actualTargetColumnID = fieldHandler.getPreviousID(targetColumnId);\n//             fieldHandler.shiftMultipleField(IDs, actualTargetColumnID);\n//             // navigation.setColumnReordering(false);\n\n//             isSourceColumnSelected && IDs.forEach(id => {\n//                 const index = fieldHandler.getIndexById(id);\n//                 columnSelectionAPI.selectColumn(index);\n//             });\n\n//             const translatedCoordinates = controlHandler.translateCoordinates(ev.x, ev.y);\n//             this.dispatchEvent({ type : COLUMN_REORDER_EVENT.EVENT_REORDER_ENDED, columnID : columnID, coordinates : translatedCoordinates, columnIndexes : selectedColumns , event : ev});\n//             console.log(targetColumn);\n\n//             rowRendererController.refreshColumnAfterModelUpdate();\n//             this.dragScrollListener.resetDragScrollListener();\n\n//         }\n\n//     }\n\n//     createDefinitionParam() : any {\n//         const optionHandler            = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n//         const reorderRenderer = optionHandler.getColumnReoderRenderer();\n//         const userProvidedRenderParam = optionHandler.getColumnReorderRendererParams();\n//         return {\n//             getRenderer : ()=>reorderRenderer,\n//             getRendererParam : ()=>userProvidedRenderParam\n//         }\n//     }\n\n//     createReorderParams(sourceColumnIndexes, isSourceColumnSelected) : IColumnRoederParams {\n//         const APIHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER)\n//         return {\n//             sourceColumnIndexes : sourceColumnIndexes,\n//             isSourceColumnSelected : isSourceColumnSelected,\n//             APIs : APIHandler\n//         }\n//     }\n\n// }\n\ninterface IColumnRoederParams {\n    sourceColumnIds : string[];\n    isSourceColumnSelected : boolean;\n    APIs : any;\n}\n\nexport {\n    IColumnRoederParams\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { RowController } from \"../../../GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { GRID_BEAN_NAME } from \"../../Constants/BeanName\";\nimport { IRowNode, IRowNodeHelper } from \"../../Interface/IRowNode\";\nimport { RowNode } from \"../../Rows/RowNode\";\nimport { IRecordHandler } from \"../../Rows/RecordHandler.types\";\nimport { IRowMeta } from \"../../../API/CommonAPIInterface\";\nimport { IRowNodeCore } from \"../../../../DataStore/rownode.types\";\nimport { GanttController } from \"../../../../GanttModelClasses/Core/GanttComponent/GanttController\";\nimport { IGroupedRowNodeCore } from \"../../../../DataStore/group-rownode.types\";\n\nexport const  EXTRA_ROW_ID = \"extra_row_id\";\n@Bean(GRID_BEAN_NAME.EXTRA_RECORD_HANDLER)\nclass ExtraRowComponent extends EventEmitter {\n\n\t@AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler : any;\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n\tprivate rowNode       : IRowNode;\n\tprivate rowController : RowController;\n\n\t@PostConstruct()\n\tinit() {\n\t\n\t}\n\n\tprivate createRowNode() : void {\n\t\tconst nodeHelper  = this.createNodeHelper();\n\t\tthis.rowNode      = new RowNode(nodeHelper, EXTRA_ROW_ID, {});\n\t\tthis.rowNode.updateLoaded(true);\n\t}\n\n\tprivate createNodeHelper() : IRowNodeHelper {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst viewType              = optionHandler.getViewType()\n\t\tlet isEndDatePrioritizedForMilestone = false;\n\t\tlet isFlexibleMilestone = false;\n\t\t\n\t\tif(viewType === 'gantt'){\n\t\t\tconst GanttContext = GanttController.getGanttBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\t\tisEndDatePrioritizedForMilestone = GanttContext?.isEndDatePrioritizedForMilestone() ?? false;\n\t\t\tisFlexibleMilestone = GanttContext?.isFlexibleMilestone() ?? false;\n\t\t}\n\n\t\tconst self = this;\n\n\t\treturn {\n\t\t\tgetIndexById             : (id : string) => self.getIndexById(id),\n\t\t\tgetTop                   : (_index : number) =>  self.getTop(),\n\t\t\tgetHeight                : (_index : number) =>  self.getRowHeight(),\n\t\t\tisExtraRow               : (id : string) => self.isExtraRow(id),\n\t\t\tgetUpcomingRowNodes      : null,\n\t\t\tdispatchRowHeightChange  : null,\n\n\t\t\tshow                            : (_index    : number)=>{},\n\t\t\thide                            : (_index    : number)=>{},\n\t\t\tgetLeft                         : (_index : number)=>0,\n\t\t\tgetWidth                        : (_index : number)=>null,\n\t\t\tsetHeight                       : (_index : number, _height : number)=>{},\n\t\t\tgetRowNodeById                  : (id : string) => self.getRowNodeById(id),\n\t\t\tgetRelativeRowMeta              : (index) => self.getRelativeRowMeta(index),\n\t\t\tgetRootNode                     : () => self.getRootNode(),\n\t\t\tonDataUpdate                    : (_rowNode: IRowNodeCore, _key: string, _value: any) => {},\n\t\t\tisEndDatePrioritizedForMilestone: () => isEndDatePrioritizedForMilestone,\n\t\t\tisFlexibleMilestone             : () => isFlexibleMilestone,\n\t\t\tgetGroupHeight                  : (id: string) => this.getRowNodeById(id).getHeight()\n\t\t}\n\t}\n\n\tprivate getRootNode() : IGroupedRowNodeCore {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n\t\tconst middleHandler = recordHandler.getMiddleHandler();\n\t\treturn middleHandler.getRootNode();\n\t}\n\n\tgetRelativeRowMeta(absoluteIndex : number) : IRowMeta{\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n\t\treturn recordHandler.getMetaByAbsoluteIndex(absoluteIndex);\n\t}\n\n\tcreateExtraRowController() : void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst isExtraRow = optionHandler.getIsExtraRow();\n\n\t\tif(!isExtraRow) {\n\t\t\tif (this.rowController) {\n\t\t\t\tthis.rowController.destroy();\n\t\t\t\tthis.rowController = null;\n\t\t\t}\n\t\t\tif (this.rowNode) {\n\t\t\t\tthis.rowNode = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.rowController) {\n\t\t\tthis.rowController.destroy();\n\t\t\tthis.rowController = null;\n\t\t}\n\t\tif (this.rowNode) {\n\t\t\tthis.rowNode = null;\n\t\t}\n\n\t\tthis.createRowNode();\n\t\tthis.rowController = new RowController(this.rowNode, this.getBeanInstanceByBeanName);\n\t}\n\n\tgetIndexById(id : string) : number {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n\t\treturn recordHandler.getRelativeIndexByID(id);\n\t}\n\n\tgetRowNodeById(id : string) : RowNode {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n\t\treturn recordHandler.getRowNodeById(id);\n\t}\n\n\tgetRowHeight() : number {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\treturn optionHandler?.getExtraRowHeight();\n\t}\n\n\tgetTop() : number {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n\t\tconst middleHandler = recordHandler.getMiddleHandler();\n\t\tconst height = middleHandler.getTotalHeight();\n\t\treturn height; \n\t}\n\n\tgetRowNode() {\n\t\treturn this.rowNode;\n\t}\n\n\tsetRowController(controller) {\n\t\tthis.rowController = controller;\n\t}\n\n\tgetRowController() {\n\t\treturn this.rowController;\n\t}\n\n\tisExtraRow(id : string) : boolean {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst isExtraRow = optionHandler.getIsExtraRow();\n\t\tconst isSameId = (id === EXTRA_ROW_ID);\n\t\treturn isExtraRow && isSameId;\n\t}\n}\n\nexport {\n    ExtraRowComponent\n}","\nclass GridExtraRowRenderer {\n\n    private params;\n\n\tinit(params) {\n\t\tthis.params = params;\n\t}\n\n\tgetElement() {\n\n        const paneType = this.params.paneType;\n\t\tconst divEle = document.createElement('div');\n\t\tdivEle.style.width = '100%'\n\t\tdivEle.style.height = '100%';\n\t\tlet innerText = 'nothing';\n\t\tlet color = 'black'\n\t\tif(paneType == 'header') {\n\t\t\tinnerText = \"【+】\"\n\t\t\tcolor = '#ffdfdf'\n\t\t\tdivEle.addEventListener('mousedown', ()=> {\n\t\t\t\tthis.params.APIs.getRowAPI().appendrows(2,[{},{}],[{},{}]);\n\t\t\t})\n\t\t} else if(paneType == 'left') {\n\t\t\tinnerText = \"left pane\"\n\t\t\tcolor = '#d9fdff'\n\t\t\tdivEle.addEventListener('dblclick', ()=> {\n\t\t\t\tthis.params.APIs.getRowAPI().appendrows(1,[{},{}],[{},{}]);\n\t\t\t})\n\t\t} else if(paneType =='right') {\n\t\t\tinnerText = 'right pane'\n\t\t\tdivEle.addEventListener('dblclick', ()=> {\n\t\t\t\tthis.params.APIs.getRowAPI().appendrows(1,[{},{}],[{},{}]);\n\t\t\t})\n\t\t\t\n\t\t} else {\n\t\t\tinnerText = 'middle'\n\t\t\tcolor = '#fdd7ff'\n\t\t\tdivEle.addEventListener('dblclick', ()=> {\n\t\t\t\tthis.params.APIs.getRowAPI().appendrows(2,[{},{}],[{},{}]);\n\t\t\t})\n\t\t}\n\t\t\n\t\tdivEle.innerText = innerText;\n\t\tdivEle.style.background = color\n\t\treturn divEle;\n\t}\n}\n\nexport {\n    GridExtraRowRenderer\n}","import { Bean, BEAN_NAME, ComponentMetadataProvider, PostConstruct } from \"@dg/corecomponent\";\n\n@Bean(BEAN_NAME.COMPONENT_META_DATA_PROVIDER)\nexport class GridComponentMetadataProvider extends ComponentMetadataProvider {\n    @PostConstruct()\n    init() {\n        this.componentMetaData = {\n            cellRenderer : {\n                mandatoryMethodList: [],\n                optionalMethodList : ['refresh', 'afterElementAttached']\n            },\n            cellEditor : {\n                mandatoryMethodList: ['getValue'],\n                optionalMethodList: [\n                    'isCancelBeforeStart',\n                    'isCancelAfterEnd',\n                    'submit',\n                    'focus',\n                    'blur',\n                    'afterElementAttached'\n                ],\n            },\n            headerCellEditor : {\n                mandatoryMethodList: ['getValue'],\n                optionalMethodList: [\n                    'isCancelBeforeStart',\n                    'isCancelAfterEnd',\n                    'submit',\n                    'focus',\n                    'blur',\n                    'afterElementAttached'\n                ],\n            },\n            headerCellRenderer : {\n                mandatoryMethodList: [],\n                optionalMethodList : []\n            },\n            summaryCellRenderer : {\n                mandatoryMethodList: [],\n                optionalMethodList : []\n            }\n        }\n    }\n}","\nimport { CellEditorParamsFunction, CellLoadingRendererParamsFunction, CellRendererParamsFunction } from \"../Interface/IColumnDefinition\";\nimport { CellEditorPopupPosition, IColumnNode } from \"../Interface/IColumnNode\";\nimport { RowBufferItem } from \"../Buffer/row/RowBufferItem\";\nimport { ColumnBufferItem } from \"../Buffer/column/ColumnBufferItem\";\nimport { IFloatingRecordRendererDetails } from \"../../FloatingRecords/Interface/IFloatingRecordRendererDetails\";\nimport { AutoWired, BEAN_NAME, Bean, ComponentMetadata, UserComponentHandler, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GridUserComponentRegistry } from \"./UserComponentRegistry\";\nimport { ICellRendererParams } from \"../../GridComponent/Interface/CellRenderer/ICellRendererParams\";\nimport { IColumnRoederParams } from \"./ColumnReorderController/ColumnReorderListener\";\nimport { IRowReoderParams } from \"../../../row-drag-handler/row-drag-handler\";\n\nexport interface ComponentType {\n\tpropertyName: PropertyName;\n\tcellRenderer: boolean;\n}\n\ninterface IReorderItem {\n    getRenderer() : any//class\n    getRendererParam() : any;\n}\n\nexport const enum PropertyName {\n    HEADER_CELL_EDITOR           = 'headerCellEditor',\n    CELL_EDITOR                  = 'cellEditor',\n    CELL_RENDERER                = 'cellRenderer',\n    EDITOR_TOOL_TIP              = 'editorToolTip',\n    ROW_PLUS_RENDERER            = 'rowPlusRenderer',\n    COLUMN_PLUS_RENDERER         = 'columnPlusRenderer',\n    ROW_MOVED_RENDERER           = 'rowMovedRenderer',\n    CELL_LOADING_RENDERER        = 'cellLoadingRenderer',\n    HEADER_CELL_RENDERER         = \"headerCellRenderer\",\n    SUMMARY_CELL_RENDERER        = \"summaryCellRenderer\",\n    ROW_REORDER_RENDERER         = 'rowReorderRenderer',\n    COLUMN_REORDER_RENDERER      = 'columnReorderRenderer',\n    FULL_WIDTH_CELL_RENDERER     = 'fullWidthCellRenderer',\n    EXTRA_ROW_RENDERER           = \"extraRowRenderer\",\n    FULL_WIDTH_GROUPING_RENDERER = \"fullWidthGroupingRenderer\",\n    FULL_WIDTH_LOADING_RENDERER  = \"fullWidthLoadingRenderer\",\n    ACTION_RENDERER              = 'actionRenderer',\n    NO_RECORD_RENDERER           = 'noRecordRenderer',\n    GROUP_CELL_RENDERER          = 'groupCellRenderer',\n\n}\n\nexport interface IComponentDetails {\n\tjsComponent              : any;\n\tcomponentName            : string;\n\tframeworkComponent       : any;\n\tpopupFromSelector        : boolean;\n\tpopupPositionFromSelector: 'under' | 'over' | undefined;\n\tparamsFromSelector       : any;\n}\n\nexport interface UserComponentDetails {\n    newInstance              : (params ?: any) => Promise<any>;\n    componentClass           : any;\n    componentFramework       : boolean;\n    popupFromSelector        : boolean;\n    popupPositionFromSelector: CellEditorPopupPosition;\n    params                   : any;\n    propertyName             : any;\n}\n\nexport type Definition = IColumnNode | RowBufferItem | ColumnBufferItem | IFloatingRecordRendererDetails;\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nclass GridUserComponentHandler extends UserComponentHandler {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    getActionRendererDetails(item : any, params : any) {\n        return this.getComponentDetails(item, PropertyName.ACTION_RENDERER, params, PropertyName.ACTION_RENDERER);\n    }\n    \n    getNoRecordRendererDetails(params : any) {\n        return this.getComponentDetails(this.optionsHandler, PropertyName.NO_RECORD_RENDERER, params, PropertyName.NO_RECORD_RENDERER);\n    }\n\n    getCellRendererDetails(column : IColumnNode, params : ICellRendererParams) {\n        return this.getComponentDetails(column, PropertyName.CELL_RENDERER, params, PropertyName.CELL_RENDERER);\n    }\n\n    getFullWidthCellRendererDetails(params : any) {\n        return this.getComponentDetails(this.optionsHandler, PropertyName.FULL_WIDTH_CELL_RENDERER, params, PropertyName.FULL_WIDTH_CELL_RENDERER);\n    }\n\n    getFullWidthLoadingRendererDetails(params : any) {\n        return this.getComponentDetails(this.optionsHandler, PropertyName.FULL_WIDTH_LOADING_RENDERER, params, PropertyName.FULL_WIDTH_LOADING_RENDERER);\n    }\n\n    getExtraRowRendererDetails(params : any) {\n        return this.getComponentDetails(this.optionsHandler, PropertyName.EXTRA_ROW_RENDERER, params, PropertyName.EXTRA_ROW_RENDERER);\n    }\n\n    getFullWidthGroupingRendererDetails(params : any) {\n        return this.getComponentDetails(this.optionsHandler, PropertyName.FULL_WIDTH_GROUPING_RENDERER, params, PropertyName.FULL_WIDTH_GROUPING_RENDERER);\n    }\n\n    getCellRendererLoadingDetails(column : IColumnNode, params : any) {\n        return this.getComponentDetails(column, PropertyName.CELL_LOADING_RENDERER, params, PropertyName.CELL_LOADING_RENDERER);\n    }\n\n    getHeaderCellRendererDetails(column : IColumnNode, params : any) {\n        return this.getComponentDetails(column, PropertyName.HEADER_CELL_RENDERER, params, PropertyName.HEADER_CELL_RENDERER);\n    }\n\n    getRowReorderRendererDetails(item : IRowReoderParams, params : any) {\n        return this.getComponentDetails(item, PropertyName.ROW_REORDER_RENDERER, params, PropertyName.ROW_REORDER_RENDERER);\n    }\n\n    getColumnReorderRendererDetails(item : IColumnRoederParams, params : any) {\n        return this.getComponentDetails(item, PropertyName.COLUMN_REORDER_RENDERER, params, PropertyName.COLUMN_REORDER_RENDERER);\n    }\n\n    getSummaryCellRendererDetails(column : IColumnNode, params : any) {\n        return this.getComponentDetails(column, PropertyName.SUMMARY_CELL_RENDERER,params, PropertyName.SUMMARY_CELL_RENDERER);\n    }\n\n    getCellEditorDetails(column : IColumnNode, params : any) : UserComponentDetails {\n        return this.getComponentDetails(column, PropertyName.CELL_EDITOR, params);\n    }\n\n    getHeaderCellEditorDetails(column : IColumnNode, params : any) {\n        return this.getComponentDetails(column, PropertyName.HEADER_CELL_EDITOR, params);\n    }\n\n    getEditorToolTipDetails(column : IColumnNode, params :any ) {\n        return this.getComponentDetails(column, PropertyName.EDITOR_TOOL_TIP, params)\n    }\n\n    cscds(item : RowBufferItem, params : any) {\n        return this.getComponentDetails(item, PropertyName.ROW_PLUS_RENDERER, params, PropertyName.ROW_PLUS_RENDERER);\n    }\n\n    getColumnPlusRendererDetails(item : ColumnBufferItem, params : any) {\n        return this.getComponentDetails(item, PropertyName.COLUMN_PLUS_RENDERER, params, PropertyName.COLUMN_PLUS_RENDERER);\n    }\n\n    getRowPlusRendererDetails(item : RowBufferItem, params : any) {\n        return this.getComponentDetails(item, PropertyName.ROW_PLUS_RENDERER, params, PropertyName.ROW_PLUS_RENDERER);\n    }\n\n\n\n    getRowMovedRendererDetails(item : IFloatingRecordRendererDetails, params : any) {\n        return this.getComponentDetails(item, PropertyName.ROW_MOVED_RENDERER, params, PropertyName.ROW_MOVED_RENDERER);\n    }\n\n    getGroupCellRendererDetails(column : IColumnNode, params : ICellRendererParams) {\n        return this.getComponentDetails(column, PropertyName.GROUP_CELL_RENDERER, params, PropertyName.GROUP_CELL_RENDERER);\n    }\n\n    protected newInstance(component : any, componentFrameWork: boolean, propertyName: PropertyName, param : any) : Promise<any> {\n        let instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER);\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER);\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else { \n            const componentMeta: ComponentMetadata = componentMetaDataProvider.retrieve(propertyName) ?? { mandatoryMethodList: [], optionalMethodList : []};\n\t\t\tinstance = frameworkComponentWrapper.wrap( component, componentMeta.mandatoryMethodList, componentMeta.optionalMethodList, );\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, param);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n    }\n\n   protected getComponentDetails(definition: any, propertyName: any, params?: any, defaultName?: string): UserComponentDetails {\n       let {jsComponent, frameworkComponent, componentName, paramsFromSelector, popupFromSelector, popupPositionFromSelector} = this.getComponentMeta(definition, propertyName, params);\n        const mergeParams = this.getMergeParams(definition, propertyName, params, paramsFromSelector);\n\n        const looUpRegistry = (name : string) => {\n            const userComponentRegistry = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_REGISTRY) as GridUserComponentRegistry;\n            const item = userComponentRegistry.retrieve(name);\n            if(item) {\n                jsComponent        = !item.componentFrameWork ? item.component : undefined;\n                frameworkComponent = item.componentFrameWork ? item.component : undefined;\n            }\n        }\n\n        if(componentName != null) {\n            looUpRegistry(componentName);\n        }\n\n        if(jsComponent == null && frameworkComponent == null && defaultName != null) {\n            looUpRegistry(defaultName);\n        }\n\n        if(!jsComponent && !frameworkComponent) {\n            return undefined;\n        }\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass     = jsComponent ? jsComponent : frameworkComponent;\n\n        return {\n\t\t\tcomponentClass,\n\t\t\tcomponentFramework,\n\t\t\tpopupFromSelector,\n\t\t\tpopupPositionFromSelector,\n\t\t\tparams: mergeParams,\n            propertyName,\n\t\t\tnewInstance: (params : any = {}) => this.newInstance(componentClass, componentFramework, propertyName, Object.assign({},mergeParams, params)),\n\t\t};\n   }\n\n    protected getComponentMeta(definition: any, propertyName: any, params?: any): IComponentDetails {\n        let popupFromSelector : boolean | undefined;\n        let paramsFromSelector : any;\n        let popupPositionFromSelector : 'under' | 'over' | undefined;\n\n        let componentName     : string | null = null;\n        let jsComponent       : any           = null;\n        let frameworkComponent: any           = null;\n\n        const assignComponentNameOrComponentClass = (component : any) => {\n            if(typeof component === 'string') {\n                componentName = component;\n            }else if(component != null && component !== true) {\n                const isFrameworkComponent = this.getFrameWorkOverrides().isFrameworkComponent(component);\n\n                if(isFrameworkComponent) {\n                    frameworkComponent = component;\n                }else {\n                    jsComponent = component;\n                }\n            }\n        }\n\n\n\n        if(definition) {\n            const definitionObject = definition as any;\n\n            const selectorFunction = this.getComponentSelector(definitionObject, propertyName);\n\n            const selector = selectorFunction ? selectorFunction(params) : null;\n\n            if(selector) {\n                assignComponentNameOrComponentClass((selector).component);\n                popupFromSelector         = (selector).popup;\n                paramsFromSelector        = (selector).params;\n                popupPositionFromSelector = (selector).popupPosition;\n            }else {\n                assignComponentNameOrComponentClass(this.getComponent(definitionObject, propertyName));\n            }\n        }\n\n        return {\n            jsComponent,\n            frameworkComponent,\n            componentName,\n            popupFromSelector,\n            popupPositionFromSelector,\n            paramsFromSelector\n        }\n    }\n\n    private getComponentSelector(defintion : any, propertyName : PropertyName) : any {\n        switch(propertyName) {\n            case PropertyName.CELL_EDITOR:\n                return defintion.getCellEditorSelector && (defintion as IColumnNode)?.getCellEditorSelector()\n            case PropertyName.CELL_RENDERER:\n                return (defintion as IColumnNode).getCellRendererSelector && (defintion as IColumnNode).getCellRendererSelector();\n            case PropertyName.CELL_LOADING_RENDERER:\n                return (defintion as IColumnNode).getLoadingRendererSelector && (defintion as IColumnNode).getLoadingRendererSelector();\n            case PropertyName.SUMMARY_CELL_RENDERER:\n                return (defintion as IColumnNode).getSummaryCellRendererSelector && (defintion as IColumnNode).getSummaryCellRendererSelector();\n            case PropertyName.HEADER_CELL_RENDERER:\n                return (defintion as IColumnNode).getHeaderCellRendererSelector && (defintion as IColumnNode).getHeaderCellRendererSelector();\n            case PropertyName.GROUP_CELL_RENDERER:\n                 return (defintion as IColumnNode).getGroupHeaderCellRendererSelectors && (defintion as IColumnNode).getGroupHeaderCellRendererSelectors();\n        }\n    }\n\n\n    protected getComponent(definition : any, propertyName : PropertyName) : any {\n        switch (propertyName) {\n            case PropertyName.CELL_RENDERER:\n                return (definition as IColumnNode).getRenderer && (definition as IColumnNode).getRenderer();\n            case PropertyName.CELL_EDITOR:\n                return (definition as IColumnNode).getCellEditor && (definition as IColumnNode).getCellEditor();\n            case PropertyName.HEADER_CELL_EDITOR:\n                return (definition as IColumnNode).getHeaderCellEditor?.();\n            case PropertyName.EDITOR_TOOL_TIP:\n                return definition.getRenderer && definition.getToolTipRenderer();\n            case PropertyName.ROW_PLUS_RENDERER:\n                return (definition as RowBufferItem).getRenderer();\n            case PropertyName.COLUMN_PLUS_RENDERER:\n                return(definition as ColumnBufferItem).getRenderer();\n            case PropertyName.ROW_MOVED_RENDERER:\n                return (definition as IFloatingRecordRendererDetails).getRenderer();\n            case PropertyName.HEADER_CELL_RENDERER:\n                return (definition as IColumnNode).getHeaderRenderer();\n            case PropertyName.SUMMARY_CELL_RENDERER:\n                return (definition as IColumnNode).getSummaryRenderer();\n            case PropertyName.CELL_LOADING_RENDERER:\n                return (definition as IColumnNode).getLoadingRenderer && (definition as IColumnNode).getLoadingRenderer();\n            case PropertyName.ROW_REORDER_RENDERER:\n                return (definition as IReorderItem).getRenderer &&( definition as IReorderItem).getRenderer();\n            case PropertyName.COLUMN_REORDER_RENDERER:\n                return (definition as IReorderItem).getRenderer && (definition as IReorderItem).getRenderer();\n            case PropertyName.FULL_WIDTH_CELL_RENDERER:\n                return definition.getFullWidthCellRenderer && definition.getFullWidthCellRenderer();\n            case PropertyName.FULL_WIDTH_GROUPING_RENDERER:\n                return definition.getFullWidthGroupCellRenderer && definition.getFullWidthGroupCellRenderer();\n            case PropertyName.EXTRA_ROW_RENDERER:\n                return definition.getExtraRowRenderer && definition.getExtraRowRenderer();\n            case PropertyName.FULL_WIDTH_LOADING_RENDERER:\n                return definition.getFullWidthLoadingRenderer && definition.getFullWidthLoadingRenderer();\n            case PropertyName.ACTION_RENDERER:\n                return definition.renderer;\n            case PropertyName.NO_RECORD_RENDERER:\n                return definition.getNoRecordRenderer && definition.getNoRecordRenderer();\n            case PropertyName.GROUP_CELL_RENDERER:\n                return (definition as IColumnNode).getGroupHeaderCellRenderer();\n        }\n    }\n\n    private getMergeParams(definition : any, propertyName : PropertyName, params : any, paramsFromSelector : any) : any {\n        return Object.assign( params, paramsFromSelector, this.getUserParams(definition, propertyName, params) );\n    }\n\n    private getUserParams(definition : any, propertyName : PropertyName, params : any) : any {\n        switch (propertyName) {\n\t\t\tcase PropertyName.CELL_RENDERER:\n\t\t\t\treturn this.getUserCellRendererParams(definition, params);\n\t\t\tcase PropertyName.CELL_LOADING_RENDERER:\n\t\t\t\treturn this.getUserCellLoadingRendererParams(definition, params);\n\t\t\tcase PropertyName.CELL_EDITOR:\n\t\t\t\treturn this.getUserCellEditorParams(definition, params);\n            case PropertyName.HEADER_CELL_EDITOR:\n                return this.getUserHeaderCellEditorParams(definition, params);\n            case PropertyName.EDITOR_TOOL_TIP:\n                return this.getEditorToolTipDetails(definition, params);\n\t\t\tcase PropertyName.ROW_PLUS_RENDERER:\n\t\t\t\treturn this.getUserAddRowButtonParams(definition, params);\n\t\t\tcase PropertyName.COLUMN_PLUS_RENDERER:\n\t\t\t\treturn this.getUserAddColumnButtonParams(definition, params);\n\t\t\tcase PropertyName.ROW_MOVED_RENDERER:\n\t\t\t\treturn this.getRowMovedRendererParams(definition, params);\n            case PropertyName.HEADER_CELL_RENDERER:\n                return this.getHeaderCellRendererParams(definition, params);\n            case PropertyName.SUMMARY_CELL_RENDERER:\n                return this.getSummaryCellRendererParams(definition, params);\n            case PropertyName.ROW_REORDER_RENDERER:\n                return this.getRowReorderRendererParams(definition, params);\n            case PropertyName.COLUMN_REORDER_RENDERER:\n                return this.getColumnReorderRendererParams(definition, params);\n            case PropertyName.FULL_WIDTH_CELL_RENDERER:\n                return this.getFullWidthRendererParams(definition, params);\n            case PropertyName.FULL_WIDTH_LOADING_RENDERER:\n                return this.getFullWidthLoadingRendererParams(definition, params);\n            case PropertyName.FULL_WIDTH_GROUPING_RENDERER:\n                return this.getGroupingFullWidthRendererParams(definition, params);\n            case PropertyName.ACTION_RENDERER:\n                return this.getUserActionRendererParams(definition, params);\n            case PropertyName.GROUP_CELL_RENDERER:\n                return this.getUserGroupCellRendererParams(definition, params);\n            default:\n                return {};\n\t\t}\n    }\n\n    private getRowReorderRendererParams(definition : IReorderItem, param : any) :any {\n        const reorderRenderParam = (definition as IReorderItem).getRendererParam();\n\n        let reorderRenderParamResult : any = {};\n\n        if (typeof reorderRenderParam == 'function') {\n\t\t\treorderRenderParamResult = reorderRenderParam(param);\n\t\t} else if (typeof reorderRenderParam == 'object') {\n\t\t\treorderRenderParamResult = reorderRenderParam;\n\t\t}\n\n        return reorderRenderParamResult;\n    }\n\n    private getColumnReorderRendererParams(definition : IReorderItem, param : any) :any {\n        const reorderRenderParam = (definition as IReorderItem).getRendererParam();\n\n        let reorderRenderParamResult : any = {};\n\n        if (typeof reorderRenderParam == 'function') {\n\t\t\treorderRenderParamResult = reorderRenderParam(param);\n\t\t} else if (typeof reorderRenderParam == 'object') {\n\t\t\treorderRenderParamResult = reorderRenderParam;\n\t\t}\n\n        return reorderRenderParamResult;\n    }\n\n    private getUserAddRowButtonParams(definition : RowBufferItem, params : ICellRendererParams) :  any {\n        const addRowButtonRendererParams = (definition as RowBufferItem).getUserParams();\n\n        let addRowButtonRendererParamsResult : any = {};\n\n        if (typeof addRowButtonRendererParams == 'function') {\n\t\t\taddRowButtonRendererParamsResult = addRowButtonRendererParams(params);\n\t\t} else if (typeof addRowButtonRendererParams == 'object') {\n\t\t\taddRowButtonRendererParamsResult = addRowButtonRendererParams;\n\t\t}\n\n        return addRowButtonRendererParamsResult;\n    }\n\n    private getRowMovedRendererParams(definition : IFloatingRecordRendererDetails, params : ICellRendererParams) :  any {\n        const rowMovedRendererParams = (definition as IFloatingRecordRendererDetails).getUserRendererParams();\n\n        let rowMovedRendererParamsResult : any = {};\n\n        if (typeof rowMovedRendererParams == 'function') {\n\t\t\trowMovedRendererParamsResult = rowMovedRendererParams(params);\n\t\t} else if (typeof rowMovedRendererParams == 'object') {\n\t\t\trowMovedRendererParamsResult = rowMovedRendererParams;\n\t\t}\n\n        return rowMovedRendererParamsResult;\n    }\n\n    private getUserAddColumnButtonParams(definition : ColumnBufferItem, params : ICellRendererParams) :  any {\n        const addColumnButtonRendererParams = (definition as ColumnBufferItem).getUserParams();\n\n        let addColumnButtonRendererParamsResult : any = {};\n\n        if (typeof addColumnButtonRendererParams == 'function') {\n\t\t\taddColumnButtonRendererParamsResult = addColumnButtonRendererParams(params);\n\t\t} else if (typeof addColumnButtonRendererParams == 'object') {\n\t\t\taddColumnButtonRendererParamsResult = addColumnButtonRendererParams;\n\t\t}\n\n        return addColumnButtonRendererParamsResult;\n    }\n\n    private getUserCellRendererParams(definition : IColumnNode, params : ICellRendererParams) :  any {\n        const cellRendererParams = (definition as IColumnNode).getCellRendererParams && (definition as IColumnNode).getCellRendererParams();\n\n        let cellRendererParamsResult : any = {};\n\n        if(typeof cellRendererParams == 'function') {\n            cellRendererParamsResult = (cellRendererParams as CellRendererParamsFunction)(params);\n        }else if(typeof cellRendererParams == 'object') {\n            cellRendererParamsResult = cellRendererParams;\n        }\n\n        return cellRendererParamsResult;\n    }\n\n    private getUserCellLoadingRendererParams(definition : IColumnNode, params : ICellRendererParams) :  any {\n        const cellLoadingRendererParams = (definition as IColumnNode).getLoadingRendererParams && (definition as IColumnNode).getLoadingRendererParams();\n\n        let cellLoadingRendererParamsResult : any = {};\n\n        if(typeof cellLoadingRendererParams == 'function') {\n            cellLoadingRendererParamsResult = (cellLoadingRendererParams as CellLoadingRendererParamsFunction)(params);\n        }else if(typeof cellLoadingRendererParams == 'object') {\n            cellLoadingRendererParamsResult = cellLoadingRendererParams;\n        }\n\n        return cellLoadingRendererParamsResult;\n    }\n\n    private getUserCellEditorParams(definition : IColumnNode, params : any) : any {\n        const cellEditorParams = definition.getCellEditorParams && definition.getCellEditorParams();\n\n        let cellEditorParamsResult : any = {};\n\n        if(typeof cellEditorParams == \"function\") {\n            cellEditorParamsResult = (cellEditorParams as CellEditorParamsFunction)(params);\n        }else if(typeof cellEditorParams == 'object') {\n            cellEditorParamsResult = cellEditorParams;\n        }\n\n        return cellEditorParamsResult;\n    }\n\n    private getUserHeaderCellEditorParams(definition : IColumnNode, params : any) : any {\n        const cellEditorParams = definition.getHeaderCellEditorParams?.();\n\n        let cellEditorParamsResult : any = {};\n\n        if(typeof cellEditorParams == \"function\") {\n            cellEditorParamsResult = (cellEditorParams as CellEditorParamsFunction)(params);\n        }else if(typeof cellEditorParams == 'object') {\n            cellEditorParamsResult = cellEditorParams;\n        }\n\n        return cellEditorParamsResult;\n    }\n\n    private getHeaderCellRendererParams(definition : IColumnNode, params : any) : any {\n        const headerCellRendererParams = definition.getHeaderCellRendererParams && definition.getHeaderCellRendererParams();\n\n        let headerCellRendererResult : any = {};\n\n        if(typeof headerCellRendererParams == \"function\") {\n            headerCellRendererResult = (headerCellRendererParams as CellEditorParamsFunction)(params);\n        }else if (typeof headerCellRendererParams == 'object') {\n\t\t\theaderCellRendererResult = headerCellRendererParams;\n\t\t}\n\n        return headerCellRendererResult;\n    }\n\n    private getSummaryCellRendererParams(definition : IColumnNode, params : any) : any {\n        const summaryCellRendererParams = definition.getSummaryCellRendererParams && definition.getSummaryCellRendererParams();\n\n        let summaryCellRendererResults : any = {};\n\n        if(typeof summaryCellRendererParams == \"function\") {\n            summaryCellRendererResults = (summaryCellRendererParams as CellEditorParamsFunction)(params);\n        }else if (typeof summaryCellRendererParams == 'object') {\n\t\t\tsummaryCellRendererResults = summaryCellRendererParams;\n\t\t}\n\n        return summaryCellRendererResults;\n    }\n\n    private getFullWidthRendererParams(definition : any, params : any) : any {\n        const fullWidthRendererParams = definition.getFullWidthRendererParams && definition.getFullWidthRendererParams();\n\n        let fullWidthRendererResults : any = {};\n\n        if(typeof fullWidthRendererParams == \"function\") {\n            fullWidthRendererResults = (fullWidthRendererParams as CellEditorParamsFunction)(params);\n        }else if (typeof fullWidthRendererParams == 'object') {\n\t\t\tfullWidthRendererResults = fullWidthRendererParams;\n\t\t}\n\n        return fullWidthRendererResults;\n    }\n\n    private getFullWidthLoadingRendererParams(definition : any, params : any) : any {\n        const fullWidthLoadingRendererParams = definition.getFullWidtLoadinghRendererParams && definition.getFullWidtLoadinghRendererParams();\n\n        let fullWidthLoadingRendererResults : any = {};\n\n        if(typeof fullWidthLoadingRendererParams == \"function\") {\n            fullWidthLoadingRendererResults = (fullWidthLoadingRendererParams as CellEditorParamsFunction)(params);\n        }else if (typeof fullWidthLoadingRendererParams == 'object') {\n\t\t\tfullWidthLoadingRendererResults = fullWidthLoadingRendererParams;\n\t\t}\n\n        return fullWidthLoadingRendererResults;\n    }\n\n    private getGroupingFullWidthRendererParams(definition : any, params : any) : any {\n        const groupingFullWidthRendererParams = definition.getGroupingFullWidthRendererParams && definition.getGroupingFullWidthRendererParams();\n\n        let groupingFullWidthRendererResults : any = {};\n\n        if(typeof groupingFullWidthRendererParams == \"function\") {\n            groupingFullWidthRendererResults = (groupingFullWidthRendererParams as CellEditorParamsFunction)(params);\n        }else if (typeof groupingFullWidthRendererParams == 'object') {\n\t\t\tgroupingFullWidthRendererResults = groupingFullWidthRendererParams;\n\t\t}\n\n        return groupingFullWidthRendererResults;\n    }\n\n\n    protected initComponent(component: any, params: any): Promise<any> | any {\n        this.context.createBean(component);\n        if (component.init == null) { return; }\n        return component.init(params);\n    }\n\n    private getUserActionRendererParams(definition : any, params : any) :  any {\n        const cellRendererParams = definition.rendererParams;\n\n        let cellRendererParamsResult : any = {};\n\n        if(typeof cellRendererParams == 'function') {\n            cellRendererParamsResult = (cellRendererParams)(params);\n        }else if(typeof cellRendererParams == 'object') {\n            cellRendererParamsResult = cellRendererParams;\n        }\n\n        return cellRendererParamsResult;\n    }\n\n    private getUserGroupCellRendererParams(definition : IColumnNode, params : ICellRendererParams) :  any {\n        const cellRendererParams = (definition as IColumnNode).getGroupHeaderCellRendererParams && (definition as IColumnNode).getGroupHeaderCellRendererParams();\n\n        let cellRendererParamsResult : any = {};\n\n        if(typeof cellRendererParams == 'function') {\n            cellRendererParamsResult = (cellRendererParams as CellRendererParamsFunction)(params);\n        }else if(typeof cellRendererParams == 'object') {\n            cellRendererParamsResult = cellRendererParams;\n        }\n\n        return cellRendererParamsResult;\n    }\n\n\n}\n\nexport {\n    GridUserComponentHandler\n}","import { AutoWired, BEAN_NAME, Bean, PostConstruct, UserComponentRegistry } from '@dg/corecomponent';\nimport { IGridConfiguration } from '../Interface/IGridConfiguration';\nimport { traverseObject } from '../utils/Generic';\nimport { GRID_BEAN_NAME } from '../Constants/BeanName';\n\nexport interface IUserComponentResult {\n\tcomponentFrameWork: boolean;\n\tcomponent: any;\n}\n\n@Bean(BEAN_NAME.USER_COMPONENT_REGISTRY)\nexport class GridUserComponentRegistry extends UserComponentRegistry {\n\t\n\t@AutoWired(GRID_BEAN_NAME.GRID_OPTIONS) private gridOptions : IGridConfiguration;\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tif (this.gridOptions.components != null) {\n\t\t\ttraverseObject(this.gridOptions.components, (key, component) =>\n\t\t\t\tthis.registerJSComponent(key, component),\n\t\t\t);\n\t\t}\n\t}\n}\n","export const GRID_BEAN_NAME = {\n\tCONTEXT                          : 'context',\n\tCONTROLLER_HANDLER               : 'controllerHandler',\n\tGRID_OPTIONS                     : 'configuration',\n\tPINNED_HANDLER                   : 'pinnedHandler',\n\tPINNED_ROW_MODEL                 : 'pinnedRowModel',\n\tROW_RENDER_CONTROLLER            : 'rowRenderController',\n\tROW_MODEL                        : 'rowModel',\n\tRECORD_HANDLER                   : 'recordHandler',\n\tFIELD_HANDLER                    : 'fieldHandler',\n\tREQUESTANIMATIONFRAME            : 'requestAnimationFrame',\n\tGRID_MODEL_PROVIDER              : 'GridModelProvider',\n\tCOLUMN_HOVER_HANDLER             : 'columnHoverHandler',\n\tSTYLING_HANDLER                  : 'stylingHandler',\n\tABSOLUTE_POSITION_HANDLER        : 'absolutePositionHandler',\n\tPOPUP_HANDLER                    : 'popupHandler',\n\tGRID_DIV_ELEMENT                 : 'gridElement',\n\tHOOK_MANAGER                     : 'hookManager',\n\tNAVIGATION_WRAPPER               : 'navigationWrapper',\n\tGRID_EVENTS                      : 'gridEvents',\n\tGRID_API                         : 'gridAPI',\n\tGRID_EXPERIMENTAL_API            : 'gridExperimentalAPI',\n\tROW_BUFFER_HANDLER               : 'rowBufferHandler',\n\tCOLUMN_BUFFER_HANDLER            : 'columnBufferHandler',\n\tUSER_PRESENCE_HANDLER            : 'userPresenceHandler',\n\tFLOATING_RECORD_HANDLER          : 'floatingRecordHandler',\n\tFLOATING_RECORD_API_HANDLER      : 'floatingRecordAPIHandler',\n\tROW_REORDER_COMPONENT_HANDLER    : 'rowDragandDropComponentHandler',\n\tCOLUMN_REORDER_COMPONENT_HANDLER : 'columnReorderComponentHandler',\n\tPINNING_API                      : 'pinningApi',\n\tCOLUMN_API                       : 'columnAPI',\n\tROW_API                          : 'rowAPI',\n\tFLOATING_ROW_API                 : 'floatingRowAPI',\n\tSELECTION_API                    : 'selectionAPI',\n\tSELECTION_HANDLER                : 'selectionHandler',\n\tNAVIGATION_API                   : 'navigationAPI',\n\tCELL_API                         : 'cellAPI',\n\tREORDERABLE_API                  : 'reorderableAPI',\n\tSORT_API                         : 'sortAPI',\n\tFILTER_API                       : 'filterAPI',\n\tROW_GROUPING_API                 : 'rowGroupingAPI',\n\tAPI_HANDLER                      : 'apiHandler',\n\tGRID_SELECTION_HELPER            : 'gridSelectionHelper',\n\tEXTRA_RECORD_HANDLER             : 'extraRecordHandler',\n\tCOLUMN_HANDLER                   : 'columnHandler',\n\tCOLUMN_DATA_TYPE_HANDLER         : 'columnDataTypeHandler',\n\tROW_HOVER_HANDLER                : 'rowHoverHandler',\n\n\tMODEL_CLASS_REGISTRY     : 'modelClassRegistry',\n\tVIEW_TYPE                : 'viewType',\n\tERROR_HANDLER            : 'errorHandler',\n\tGRID_CELL_EDITOR_HANDLER : 'gridCellEditorHandler',\n\n\tCOLUMN_AUTOFIT_HANDLER\t: 'columnAutofitHandler',\n\n\tGRID_ESCAPE_HANDLER    : 'gridEscapeHandler',\n\tCOLUMN_VISIBLE_HANDLER : 'columnVisibleHandler',\n\tCELL_INNER_NAVIGATION_CONTROLLER : 'cellInnerNavigationController',\n\tVIEWPORT_RANGE_REGISTRY : 'viewportRangeRegistry',\n\t// Gantt\n\n\tDATE_UTILS                  : 'dateUtils',\n\tGRID_LAYOUT_POSITION_HANDLER: \"GridLayoutPositionHandler\",\n\tTREE_API                    : 'treeAPI',\n\tAUTO_UNPINNED_LEFT_COLUMNS  : 'autoUnpinnedLeftColumns',\n\n\t// Nested Header\n\tCOLUMN_TREE_MODEL    : 'columnTreeModel',\n\tCOLUMN_GROUP_HANDLER : 'columnGroupHandler',\n\tCOLUMN_GROUP_API     : 'columnGroupAPI',\n\tCORE_STATE_HANDLER : 'coreStateHandler'\n\n};\n","\nexport const GANTT_CLASS_NAMES = {\n    GANTT_TIMELINE_INDICATOR_HOLDER            : 'dg-gantt-column-line-wrapper',\n    GANTT_TIMELINE_INDICATOR_LINE              : 'dg-gantt-column-line',\n    GANTT_ACTIVE_TIMELINE_INDICATOR_LINE       : 'dg-gantt-column-line--active',\n    GANTT_TIMELINE_HOLDER                      : 'dg-gantt-timeline-wrapper',\n    GANTT_TIMELINE_INDICATOR_LINE_WEEKEND      : 'dg-gantt-column-line--weekend',\n    GANTT_TIMELINE_INDICATOR_LINE_TODAY        : 'dg-gantt-column-line--marker',\n    GANTT_DEPENDENCY_MARK_CONTAINER            : 'dg-gantt-dependency-mark-container',\n    GANTT_COLUMN_HEADER_LABEL_CONTAINER        : 'dg-gantt__column-header-label-container',\n    GANTT_ACTIVE_COLUMN_HEADER_LABEL_CONTAINER : 'dg-gantt__column-header-label-container--active',\n    GANTT_CURRENT_TIME_INDICATOR               : 'dg-gantt-column-line--marker-holder',\n\n    GANTT_TASK_BAR_TITLE           : 'ZG-takbar-title',\n    GANTT_DEPENDENCY_MARK_VALID    : 'dg-gantt-dependency-mark-valid',\n    GANTT_DEPENDENCY_MARK_INVALID  : 'dg-gantt-dependency-mark-invalid',\n    GANTT_DEPENDENCY_MARK_CRITICAL : 'dg-gantt-dependency-mark-critical',\n    GANTT_TASK_BAR_VALID           : 'dg-gantt__task-bar-valid',\n    GANTT_TASK_BAR_INVALID         : 'dg-gantt__task-bar-invalid',\n    GANTT_TASK_BAR_CRITICAL        : 'dg-gantt__task-bar-critical',\n    GANTT_TASK_BAR_HOLDER          : 'dg-gantt__task-bar-holder',\n    GANTT_TASK_BAR_HOLDER_ZERO_DURATION : 'dg-gantt__task-bar-holder--zero-duration',\n    GANTT_MILESTONE_HOLDER         : 'dg-gantt-milestone-holder',\n    GANTT_MILESTONE                : 'dg-gantt-milestone',\n\n\n    GANTT_TASK_BAR_FULL_WIDTH : 'dg-gantt__shedule-task-bar-holder',\n    GANTT_TASK_BAR_FULL_WIDTH_READONLY : 'dg-gantt__shedule-task-bar-holder-readonly',\n    GANTT_TASK_DRAG_TO_SCHEDULE : 'dg-gantt__shedule-task-bar',\n\n    GANTT_TIMELINE_SCROLL_HOLDER: 'dg-gantt-timeline-scroll-holder',\n}\n\n\nexport const GRID_CLASS_NAMES = {\n    GRID_DRAFT_ROW              : 'dg-draft-row'\n}","\nconst Events = {\n\tEVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED: 'displayedColumnsWidthChanged',\n\tEVENT_DISPLAYED_COLUMNS_RESIZE_CHANGED : 'displayColumnsResizeChanged',\n\tEVENT_LEFT_PINNED_WIDTH_CHANGED: 'leftPinnedWidthChanged',\n\tEVENT_RIGHT_PINNED_WIDTH_CHANGED: 'rightPinnedWidthChanged',\n\tEVENT_PINNED_ROW_DATA_CHANGED: 'pinnedRowDataChanged',\n\tEVENT_ROW_DATA_LOADED: 'rowDataLoaded',\n\tEVENT_DISPLAYED_ROWS_CHANGED: 'displayedRowsChanged',\n\tEVENT_COLUMN_HOVER_CHANGED: 'columnHoverChanged',\n\tEVENT_HEADER_WIDTH_CHANGED: 'headerWidthChanged',\n\tEVENT_DISPLAYED_COLUMNS_CHANGED: 'displayedColumnsChanged',\n\tEVENT_ROW_CONTAINER_HEIGHT_CHANGED: 'rowContainerHeightChanged',\n\n\tEVENT_EXTRA_ROW_HEIGHT_CHANGED: 'extraRowHeightChanged',\n\n\tEVENT_CELL_FOCUSED: 'cellFocused',\n\tEVENT_RANGE_SELECTION: 'rangeSelection',\n\tEVENT_RANGE_SELECTION_START: 'rangeSelectionStart',\n\tEVENT_RANGE_SELECTION_END: 'rangeSelectionEnd',\n\tEVENT_VIEWPORT_CHANGED: 'viewPortChange',\n\n\tEVENT_ROW_CHANGED : 'eventRowChanged',\n\tEVENT_COLUMN_CHANGED : 'eventColumnChanged',\n\n\tEVENT_VIEWPORT_RANGE_UPDATED : 'viewportRangeChange',\n\n\n\tEVENT_LEFT_CHANGED: 'leftChanged',\n\tEVENT_WIDTH_CHANGED: 'widthChanged',\n\n\tEVENT_ROW_PLUS_CONTAINER_HEIGHT_CHANGED: 'rowPlusContainerHeightChanged',\n\n\tEVENT_ROW_PLUS_RENDERER_CHANGED: 'rowPlusRendererChanged',\n\n\tEVENT_ROW_PLUS_RENDERER_DESTROY: 'rowPlusRendererDestroy',\n\n\tEVENT_COLUMN_BUFFER_CONTAINER_WIDTH_CHANGED:\n\t\t'columnPlusContainerHeightChanged',\n\n\tEVENT_COLUMN_BUFFER_RENDERER_CHANGED: 'columnPlusRendererChanged',\n\n\tEVENT_COLUMN_PLUS_RENDERER_DESTROY: 'columnPlusRendererDestroy',\n\n\tEVENT_USER_PRESENCE_UPADTED: 'userPresenceUpdated',\n\n\tEVENT_FLOATING_RECORD_CHANGED: 'flotingRecordChanged',\n\n\tEVENT_FLOATING_RECORD_REMOVED  : 'floatingRecordRemoved',\n\tEVENT_FLOATING_RECORD_ADDED    : 'floatingRecordAdded',\n\tEVENT_FLOATING_RECORD_MOVED : 'floatingRecordMoved',\n\n\tEVENT_RANGE_SELECTION_CHANGED : 'rangeSelectChanged',\n\tEVENT_COLUMN_REFRESH :'columnRefresh',\n\tEVENT_AUTO_UNPINNED_LEFT_COLUMNS_REFRESH : 'autoUnpinnedLeftColumnsRefresh',\n\n\tEVENT_GRID_REFRESH           : 'gridRefresh',\n\tEVENT_CELL_REFRESH           : 'gridCellRefresh',\n\tEVENT_GRID_DIMENSION_CHANGED : 'gridDimensionChanged',\n\tEVENT_COLUMN_INSERT          : 'gridColumnInsert',\n\tEVENT_COLUMN_DELETE          : \"gridColumnDelete\",\n\tEVENT_COLUMN_INIT            : \"gridColumnInit\",\n\tEVENT_COLUMN_HIDE            : \"gridColumnHide\",\n\tEVENT_COLUMN_SHOW            : \"gridColumnShow\",\n\n\tEVENT_GRID_SIZE_UPDATED       : \"gridSizeUpdated\",\n\tEVENT_HEADER_ROW_CELL_REFRESH : 'headerRowCellRefreshed',\n\tEVENT_COLUMN_CELL_REFRESH : 'columnCellRefreshed',\n\n\tEVENT_ROW_RESETED : 'rowCacheReset',\n\tEVENT_ROW_RESETED_VIEWPORT : 'rowCacheResetViewport',\n\tEVENT_ROW_EXPANDED              : 'rowExpanded',\n\tEVENT_ROW_COLLAPSED             : 'rowCollapsed',\n\n\tEVENT_ROW_ENTER : 'rowEnter',\n\tEVENT_ROW_LEAVE : 'rowLeave',\n\n\tEVENT_HORIZONTAL_SCROLL : 'gridHorizontalScroll',\n\tEVENT_VERTICAL_SCROLL   : 'gridVerticalScroll',\n\n\tEVENT_TASK_BAR_GRAB_STARTED : 'taskBarGrabStarted',\n\tEVENT_TASK_BAR_GRAB_ENDED : 'taskBarGrabEnded',\n\tEVENT_TASK_BAR_RESIZE_STARTED : 'taskBarResizeStarted',\n\tEVENT_TASK_BAR_RESIZE_ENDED : 'taskBarResizeEnded',\n\tEVENT_TASK_BAR_GRAB_CANCELLED : 'taskBarGrabCancelled',\n\tEVENT_TASK_BAR_RESIZE_CANCELLED : 'taskBarResizeCancelled',\n\tEVENT_TASK_BAR_POINTER_DRAG_STARTED : 'taskBarPointerDragStarted',\n\tEVENT_TASK_BAR_POINTER_DRAG_ENDED : 'taskBarPointerDragEnded',\n\tEVENT_TASK_BAR_POINTER_DRAG_CANCELLED : 'taskBarPointerDragCancelled',\n\n\tEVENT_TASK_BAR_SCHEDULE_STARTED : 'taskBarScheduleDragStarted',\n\tEVENT_TASK_BAR_SCHEDULE_ENDED : 'taskBarScheduleDragEnded',\n\tEVENT_TASK_BAR_SCHEDULE_CANCELLED : 'taskBarScheduleDragCancelled',\n\n\tEVENT_DEPENDENCY_ADDED : 'dependencyAdded',\n\tEVENT_DEPENDENCY_REMOVED : 'dependencyRemoved',\n\tEVENT_DEPENDENCY_UPDATED : 'dependencyUpdated',\n\tEVENT_DEPENDENCY_TYPE_CHANGED : 'dependencyTypeChanged',\n\tEVENT_TASK_DEPENDENCIES_CLEARED : 'taskDependenciesCleared',\n\tEVENT_TASK_POSITIONS_CHANGED : 'taskPositionsChanged',\n\n\tEVENT_GRID_CONFIGURATION_UPDATED : 'gridConfigurationUpdated',\n\tEVENT_COLUMN_REORDERED : 'columnReordered',\n\n\tEVENT_ON_ZERO_ROWS : 'onZeroRows',\n\n\tEVENT_AUTO_WIDTH_INIT_START    : 'autoWidthInitStart',\n\tEVENT_AUTO_WIDTH_INIT_COMPLETE : 'autoWidthInitComplete',\n};\n\nconst ROW_REORDER_EVENT = {\n\tEVENT_REORDER_STARTED : \"reorderStarted\",\n\tEVENT_REORDERING : \"reordering\",\n\tEVENT_REORDER_ENDED : \"reorderEnded\",\n\tEVENT_ROW_REORDERED : \"rowReorderer\",\n}\n\nconst COLUMN_REORDER_EVENT = {\n\tEVENT_REORDER_STARTED : \"reorderStarted\",\n\tEVENT_REORDERING : \"reordering\",\n\tEVENT_REORDER_ENDED : \"reorderEnded\",\n\t\n}\n\nconst ROW_NODE_EVENTS = {\n\tEVENT_MOUSE_ENTER         : 'mouseEnter',\n\tEVENT_MOUSE_LEAVE         : 'mouseLeave',\n\tEVENT_ROW_TOP_CHANGE      : 'rowTopChange',\n\tEVENT_ROW_HEIGHT_CHANGE   : 'rowHeightChange',\n\tEVENt_STICKY_TOP_CHANGE   : 'stickyTopChange',\n\tEVENT_ROW_HIGHLIGHT_CHANGE: 'rowHighlightChange',\n\tEVENT_ROW_INDEX_CHANGE    : 'rowIndexChange'\n}\n\nconst COLUMN_NODE_EVENTS = {\n\tEVENT_MOUSE_ENTER               : 'mouseEnter',\n\tEVENT_MOUSE_LEAVE               : 'mouseLeave',\n\tEVENT_COLUMN_DEFINITION_CHANGED : 'columnDefinitionChanged',\n\tEVENT_COLUMN_HIGHLIGHT_CHANGE : 'columnHighlightChange',\n};\n\nexport const GRID_USER_PRESENCE_EVENTS = {\n\tEVENTS_ITEM_DESTROYED : \"userPresenceItemDestroyed\",\n\tEVENTS_ITEM_REFRESHED : \"userPresenceItemRefreshed\",\n\tEVENTS_ITEM_REMOVED   : \"userPresenceItemRemoved\",\n}\n\nexport const EDIT_EVENTS = {\n\tEVENT_CELL_EDIT_START          : 'cellEditorStarted',\n\tEVENT_CELL_EDIT_STOPPED        : 'cellEditorStopped',\n\tEVENT_HEADER_CELL_EDIT_START   : 'headerCellEditorStarted',\n\tEVENT_HEADER_CELL_EDIT_STOPPED : 'headerCellEditorStopped'\n}\n\n\n\nimport { isWindows } from './platformUtils';\n\nconst isMacOS = /(Mac|iPhone|iPod|iPad)/i.test(navigator.userAgent);\n\nexport {\n    Events,\n    ROW_NODE_EVENTS,\n    COLUMN_NODE_EVENTS,\n    isMacOS,\n\tisWindows,\n\tROW_REORDER_EVENT,\n\tCOLUMN_REORDER_EVENT\n}","type columnPinPositions = 'left' | 'center' | 'right' | 'rowHeader'\n\ntype rowPinPositions = 'top' | 'middle' | 'bottom' | 'columnHeader' | \"summary\" | \"FloatingRecord\" | 'topDraftRow' | 'bottomDraftRow';\n\n\ntype rowHeaderPosition = 'rowHeader';\ntype columnHeaderPosition = 'columnHeader';\n\ntype columnDataType = 'boolean' | 'string' | 'number ' | 'date'\n\nconst ROW_PANE_TYPE = {\n    HEADER : 'header',\n    TOP    : 'top',\n    MIDDLE : 'middle',\n    BOTTOM : 'bottom',\n    SUMMARY: 'summary',\n    TOP_DRAFT_ROW : 'topDraftRow',\n    BOTTOM_DRAFT_ROW : 'bottomDraftRow'\n}\n\nconst defaultColumnWidth = 100;\nconst defaultMinWidth = 30;\nconst defaultMaxWidth = Infinity;\nconst defaultRowHeight = 42;\nconst defaultRowHeaderWidth = 50;\nconst defaultColumnHeaderHeight = 42;\n\nconst defaultCacheBlockCount = 3;\nconst defaultCacheBlockSize = 10;\nconst defaultFetchTriggerPoint = 0;\nconst minCacheBlockSize = 5;\n\nconst defaultColumnMaxWidth = 500;\nconst defaultColumnMinWidth = 80;\n\nexport const CELL_RENDERER_TYPE = {\n    TEXT     : 'text',\n    CHIP     : 'chip',\n    RATING   : 'rating',\n    CHECKBOX : 'checkbox',\n    IMAGE    : 'image'\n}\n\nexport const CELL_RENDERING_COMPONENT = {\n    [CELL_RENDERER_TYPE.TEXT]     : \"dgTextCellRenderingComponent\",\n    [CELL_RENDERER_TYPE.CHIP]     : \"dgChipCellRenderingComponent\",\n    [CELL_RENDERER_TYPE.RATING]   : \"dgRatingCellRenderingComponent\",\n    [CELL_RENDERER_TYPE.CHECKBOX] : \"dgCheckboxCellRenderingComponent\",\n    [CELL_RENDERER_TYPE.IMAGE]    : \"dgImageCellRenderingComponent\",\n}\n\nexport const GRID_ELEMENT_NAMES = {\n    HORIZONTAL_SCROLL               : 'dg-horizontal-scroll',\n    VERTICAL_SCROLL                 : 'dg-vertical-scroll',\n    GANTT_TIMELINE_HOLDER           : 'datagrid-gantt-timeline-holder',\n    GANTT_DEPENDENCY_MARK_CONTAINER : 'datagrid-gantt-dependencyMark-container',\n    GANTT_CURRENT_TIME_INDICATOR    : 'datagrid-gantt-current-time-indicator',\n    GANTT_ACTION_BAR                : 'gantt-action',\n    NO_RECORD_CONTAINER             : 'datagrid-no-record'\n}\n\nexport {\n    columnPinPositions,\n    rowPinPositions,\n    columnDataType,\n    defaultColumnWidth,\n    defaultMinWidth,\n    defaultMaxWidth,\n    defaultRowHeight,\n    rowHeaderPosition,\n    columnHeaderPosition,\n    defaultRowHeaderWidth,\n    defaultColumnHeaderHeight,\n    defaultCacheBlockCount,\n    defaultCacheBlockSize,\n    minCacheBlockSize,\n    defaultFetchTriggerPoint,\n    defaultColumnMaxWidth,\n    defaultColumnMinWidth,\n    ROW_PANE_TYPE\n}","import { MovePosition } from \"../../Main\"\n\nconst enum GRID_TYPE {\n    CLIENT = 'client',\n    SERVER = 'server'\n}\n\nconst MOVE_POSITION : Record<string, MovePosition> = {\n    BEFORE : 'before',\n    AFTER  : 'after'\n} \n\nexport {\n    GRID_TYPE,\n    MOVE_POSITION\n}","export const isWindows: boolean =\n\ttypeof navigator !== 'undefined' &&\n\t(/Win/i.test(navigator.userAgent) ||\n\t\t(navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData?.platform ===\n\t\t\t'Windows');\n\n\nexport function normalizeWheelDeltasForShiftScroll(event: WheelEvent): { deltaX: number; deltaY: number } {\n\tlet { deltaX, deltaY } = event;\n\tif (isWindows && event.shiftKey && deltaY !== 0 && deltaX === 0) {\n\t\treturn { deltaX: deltaY, deltaY: 0 };\n\t}\n\treturn { deltaX, deltaY };\n}\n","\nimport { AutoWired, Bean, BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { IFloatingRecordController } from \"../../FloatingRecords/UIHandler/Interface/IFloatingRecordController\";\nimport { IFloatingRecordMovedController } from \"../../FloatingRecords/UIHandler/RecordMoved/Interface/IFloatingRecordMovedController\";\nimport { GridFloatingEditorController } from \"../../GridComponent/FloatingEditor/GridFloatingEditorController\";\nimport { IColumnBufferContainerController } from \"../../GridComponent/GridBodyComponent/BufferContainer/column/Interface/IColumnBufferContainerController\";\nimport { IRowBufferContainerController } from \"../../GridComponent/GridBodyComponent/BufferContainer/row/Interface/IRowBufferContainerController\";\nimport { GridBodyController } from \"../../GridComponent/GridBodyComponent/GridBodyController\";\nimport { RowContainerController } from \"../../GridComponent/GridBodyComponent/RowContainer/RowContainerController\";\nimport { HSComponent } from \"../../GridComponent/GridBodyComponent/Scroller/HSComponent\";\nimport { VSComponent } from \"../../GridComponent/GridBodyComponent/Scroller/VSComponent\";\nimport { GridController } from \"../../GridComponent/GridController\";\nimport { RowHeaderContainerController } from \"../../GridComponent/Header/RowContainer/RowHeaderContainerController\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IControllerHandler, IPaneControllerParam } from \"../Interface/IControllerHandler\";\nimport { GridHeaderController } from \"../../GridComponent/Header/GridHeaderController\";\nimport { GridOptioHandler } from \"../GridOptionHandler\";\nimport { NoRecordControllerType } from \"Grid/GridComponent/GridBodyComponent/NoRecordConatiner/no-record.types\";\nimport { GridBodyScrollHandler } from \"../GridBodyScrollHandler\";\n\nconst VERTICAL_PANE = {\n    TOP : \"top\",\n    MIDDLE : \"middle\",\n    BOTTOM : \"bottom\"\n}\n\nconst HORIZONTAL_PANE = {\n    TOP_LEFT : \"top_left\",\n    TOP_RIGHT : \"top_right\",\n    TOP_CENTER : \"top_center\",\n    BOTTOM_LEFT : \"bottom_left\",\n    BOTTOM_CENTER : \"bottom_center\",\n    BOTTOM_RIGHT : \"bottom_right\",\n    MID_LEFT : \"mid_left\",\n    MID_CENTER : \"mid_center\",\n    MID_RIGHT : \"mid_right\",\n\n    RIGHT_OUT : \"right_out\",\n    LEFT_OUT : \"left_out\",\n\n    HEADER_LEFT : \"header_left\",\n    HEADER_RIGHT : \"header_right\",\n    HEADER_CENTER : \"header_center\"\n}\n\n// interface Rect {\n//     x : number,\n//     y : number\n// }\n\n@Bean(GRID_BEAN_NAME.CONTROLLER_HANDLER)\nexport class ControllerHandler extends EventEmitter implements IControllerHandler {\n    \n\n    private headerRowContainerControl       !: RowContainerController;\n    private centerRowContainerControl       !: RowContainerController;\n    private leftRowContainerControl         !: RowContainerController;\n    private rightRowContainerControl        !: RowContainerController;\n\n    private bottomHeaderRowContainerControl !: RowContainerController;\n    private bottomCenterRowContainerControl !: RowContainerController;\n    private bottomLeftRowContainerControl   !: RowContainerController;\n    private bottomRightRowContainerControl  !: RowContainerController;\n\n    private topHeaderRowContainerControl    !: RowContainerController;\n    private topCenterRowContainerControl    !: RowContainerController;\n    private topLeftRowContainerControl      !: RowContainerController;\n    private topRightRowContainerControl     !: RowContainerController;\n\n    private leftRowHeaderContainerController   !: RowHeaderContainerController;\n    private centerRowHeaderContainerController !: RowHeaderContainerController;\n    private rightRowHeaderContainerController  !: RowHeaderContainerController;\n    private headerRowHeaderContainerController !: RowHeaderContainerController;\n\n    private summaryHeaderRowContainerControl !: RowContainerController;\n    private summaryLeftRowContainerControl   !: RowContainerController;\n    private summaryRightRowContainerControl  !: RowContainerController;\n    private summaryCenterRowContainerControl !: RowContainerController;\n\n    private floatingRecordHeaderRowContainerControl !: RowContainerController;\n    private floatingRecordLeftRowContainerControl   !: RowContainerController;\n    private floatingRecordRightRowContainerControl  !: RowContainerController;\n    private floatingRecordCenterRowContainerControl !: RowContainerController;\n\n    private stickyTopHeaderController    !:RowContainerController;\n    private stickyTopLeftController      !:RowContainerController;\n    private stickyTopCenterController    !:RowContainerController;\n    private stickyTopRightController     !:RowContainerController;\n    private stickyTopFullWidthController !:RowContainerController;\n\n    private gridHeaderController !: GridHeaderController;\n\n\n    private floatingEditorController !: GridFloatingEditorController;\n\n    private noRecordFoundController : NoRecordControllerType;\n\n\n\n    private HSComponent : HSComponent;\n    private VSComponent : VSComponent;\n\n    private bodyController : GridBodyController;\n\n    private gridController : GridController;\n\n    private rowBufferContainerController : IRowBufferContainerController;\n\n    private columnBufferContainerController : IColumnBufferContainerController;\n\n    private floatingRecordController !: IFloatingRecordController;\n\n    private floatingRecordMovedController : IFloatingRecordMovedController;\n\n    private ready = false;\n\n    private readyCallbacks: ((param: IPaneControllerParam) => void)[] = [];\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler : GridOptioHandler;\n\n    private checkPaneIsReady(): void {\n        this.ready = true;\n        const panes : any[] = [this.centerRowContainerControl, this.leftRowContainerControl, this.rightRowContainerControl, this.headerRowContainerControl, this.bottomHeaderRowContainerControl, this.bottomCenterRowContainerControl, this.bottomLeftRowContainerControl, this.bottomRightRowContainerControl, this.topHeaderRowContainerControl, this.topCenterRowContainerControl, this.topLeftRowContainerControl, this.topRightRowContainerControl, this.headerRowHeaderContainerController, this.rightRowHeaderContainerController, this.centerRowHeaderContainerController, this.leftRowHeaderContainerController, this.bodyController, this.summaryCenterRowContainerControl, this.summaryHeaderRowContainerControl, this.summaryLeftRowContainerControl, this.summaryRightRowContainerControl, this.gridController, this.rowBufferContainerController, this.floatingRecordController, this.columnBufferContainerController, this.floatingRecordCenterRowContainerControl, this.floatingRecordLeftRowContainerControl, this.floatingRecordRightRowContainerControl, this.floatingRecordHeaderRowContainerControl, this.stickyTopCenterController, this.stickyTopFullWidthController, this.stickyTopLeftController, this.stickyTopRightController, this.stickyTopHeaderController, this.gridHeaderController, this.noRecordFoundController];\n        this.optionHandler.excludeScrollbarForPinning() && panes.push(this.HSComponent, this.VSComponent);\n        for(let i = 0; i < panes.length; i++) {\n            const pane = panes[i];\n            if(pane == null) {\n                this.ready = false;\n                break;\n            }\n        }\n\n        if (this.ready) {\n            const param = this.createPaneController();\n            this.readyCallbacks.forEach(callback => callback(param));\n            this.readyCallbacks.length = 0;\n        }\n    }\n\n    onAfterGridReady(callback: (param: IPaneControllerParam) => void): void {\n        if (this.ready) {\n            callback(this.createPaneController());\n        } else {\n            this.readyCallbacks.push(callback);\n        }\n    }\n\n    private createPaneController(): IPaneControllerParam {\n        return {\n            centerRowContainerControl         : this.centerRowContainerControl,\n            leftRowContainerControl           : this.leftRowContainerControl,\n            rightRowContainerControl          : this.rightRowContainerControl,\n            headerRowContainerControl         : this.headerRowContainerControl,\n\n            bottomHeaderRowContainerControl   : this.bottomHeaderRowContainerControl,\n            bottomCenterRowContainerControl   : this.bottomCenterRowContainerControl,\n            bottomLeftRowContainerControl     : this.bottomLeftRowContainerControl,\n            bottomRightRowContainerControl    : this.bottomRightRowContainerControl,\n\n            topHeaderRowContainerControl      : this.topHeaderRowContainerControl,\n            topCenterRowContainerControl      : this.topCenterRowContainerControl,\n            topLeftRowContainerControl        : this.topLeftRowContainerControl,\n            topRightRowContainerControl       : this.topRightRowContainerControl,\n\n            headerRowHeaderContainerController: this.headerRowHeaderContainerController,\n            rightRowHeaderContainerController : this.rightRowHeaderContainerController,\n            centerRowHeaderContainerController: this.centerRowHeaderContainerController,\n            leftRowHeaderContainerController  : this.leftRowHeaderContainerController,\n\n            HSComponenet                   : this.HSComponent,\n            VSComponent                    : this.VSComponent,\n            bodyController                 : this.bodyController,\n            floatingEditorController       : this.floatingEditorController,\n            gridController                 : this.gridController,\n            rowBufferContainerController   : this.rowBufferContainerController,\n            floatingRecordController       : this.floatingRecordController,\n            columnBufferContainerController: this.columnBufferContainerController,\n\n            summaryCenterRowContainerControl: this.summaryCenterRowContainerControl,\n            summaryHeaderRowContainerControl: this.summaryHeaderRowContainerControl,\n            summaryLeftRowContainerControl  : this.summaryLeftRowContainerControl,\n            summaryRightRowContainerControl : this.summaryRightRowContainerControl,\n\n            floatingRecordCenterRowContainerControl: this.floatingRecordCenterRowContainerControl,\n            floatingRecordHeaderRowContainerControl: this.floatingRecordHeaderRowContainerControl,\n            floatingRecordLeftRowContainerControl  : this.floatingRecordLeftRowContainerControl,\n            floatingRecordRightRowContainerControl : this.floatingRecordRightRowContainerControl,\n\n            floatingRecordMovedController : this.floatingRecordMovedController,\n            gridBodyController : this.bodyController,\n            stickyTopCenterController : this.stickyTopCenterController,\n            stickyTopFullWidthController : this.stickyTopFullWidthController,\n            stickyTopHeaderController : this.stickyTopHeaderController,\n            stickyTopLeftController : this.stickyTopLeftController,\n            stickyTopRightController : this.stickyTopRightController,\n\n            gridHeaderController : this.gridHeaderController,\n            noRecordFoundController : this.noRecordFoundController\n        };\n    }\n\n    // getVerticalPaneType(y : number) : string {\n\n    //     const bodyContainer = this.getBodyController();\n\n    //     const topRect = bodyContainer.getTopContainerBoundRect();\n    //     const centerRect = bodyContainer.getCenterContainerBoundRect();\n    //     const bottomRect = bodyContainer.getBottomContainerBoundRect();\n\n    //     const topStartY = topRect.y;\n    //     const topEndY = topStartY + topRect.height;\n\n    //     const centerStartY = centerRect.y;\n    //     const centerEndY = centerStartY + centerRect.height;\n\n    //     const bottomStartY = bottomRect.y;\n    //     const bottomEndY = bottomStartY + bottomRect.height;\n\n    //     if(topStartY <= y && y <= topEndY) {\n    //         return VERTICAL_PANE.TOP;\n    //     }\n    //     else if(bottomStartY <= y && y <= bottomEndY) {\n    //         return VERTICAL_PANE.BOTTOM;\n    //     }\n    //     else if(centerStartY <= y && y <= centerEndY) {\n    //         return VERTICAL_PANE.MIDDLE\n    //     }\n        \n    //     return null;\n    // }\n\n    // getHorizontalPaneType(x : number, y : number) : string {\n    //     let rect, startX, endX, startY, endY;\n\n    //     const cornerContainers = [this.topLeftRowContainerControl, this.topRightRowContainerControl,\n    //                               this.bottomLeftRowContainerControl, this.bottomRightRowContainerControl, this.leftRowContainerControl, this.rightRowContainerControl];\n    //     const centerContainers = [ this.topCenterRowContainerControl, this.bottomCenterRowContainerControl, this.centerRowContainerControl];\n    //     const headerContainer = [this.rightRowHeaderContainerController, this.leftRowHeaderContainerController, this.centerRowHeaderContainerController];\n\n\n    //     const cornerPanes = [HORIZONTAL_PANE.TOP_LEFT, HORIZONTAL_PANE.TOP_RIGHT, HORIZONTAL_PANE.BOTTOM_LEFT, HORIZONTAL_PANE.BOTTOM_RIGHT, HORIZONTAL_PANE.MID_LEFT, HORIZONTAL_PANE.MID_RIGHT];\n    //     const centerPanes = [ HORIZONTAL_PANE.TOP_CENTER, HORIZONTAL_PANE.BOTTOM_CENTER, HORIZONTAL_PANE.MID_CENTER];\n    //     const headerPanes = [HORIZONTAL_PANE.HEADER_RIGHT, HORIZONTAL_PANE.HEADER_LEFT, HORIZONTAL_PANE.HEADER_CENTER];\n\n\n\n    //     for(let i = 0; i < cornerContainers.length; i++) {\n    //         const ele = cornerContainers[i].getContainer();\n    //         rect = ele.getBoundingClientRect();\n    //         startX = rect.x;\n    //         endX = startX + rect.width; \n    //         startY = rect.y;\n    //         endY = startY + rect.height;\n    //         if(startX <= x && x <= endX && startY <= y && y <= endY) {\n    //             return cornerPanes[i];\n    //         }\n    //     }\n\n    //     for(let i = 0; i < centerContainers.length; i++){\n    //         const ele = centerContainers[i].getViewPortContainer();\n    //         rect = ele.getBoundingClientRect();\n    //         startX = rect.x;\n    //         endX = startX + rect.width;\n    //         startY = rect.y;\n    //         endY = startY + rect.height;\n    //         if(startX <= x && x <= endX && startY <= y && y <= endY) {\n    //             return centerPanes[i];\n    //         }\n    //     }\n\n    //     for(let i = 0; i < headerContainer.length; i++){\n    //         const ele = headerContainer[i].getViewPortContainer();\n    //         rect = ele.getBoundingClientRect();\n    //         startX = rect.x;\n    //         endX = startX + rect.width;\n    //         startY = rect.y - 1;\n    //         endY = startY + rect.height + 2;\n    //         if(startX <= x && x <= endX && startY <= y && y <= endY) {\n    //             return headerPanes[i];\n    //         }\n    //     }\n\n    //     return null;\n    \n    // }\n\n    // translateCoordinates(x : number, y : number) : Rect {\n    //     const bodyContainer = this.bodyController.getBodyContainer();\n    //     const rect = bodyContainer.getBoundingClientRect();\n    //     const X = rect.x;\n    //     const Y = rect.y;\n\n    //     const translatedY = y - Y;\n    //     const translatedX = x - X;\n\n    //     const translateCoordinates = { x : translatedX, y : translatedY}\n    //     return translateCoordinates;\n    // }\n\n    // scrollCenterGridtoX(x : number) : void {\n    //     const centerContainer = this.getCenterRowContainerController().getViewPortContainer();\n    //     centerContainer.scrollTo({\n    //         top : centerContainer.scrollTop,\n    //         left : x\n    //     });\n    // }\n\n    // scrollCenterGridtoY(y : number) : void {\n    //     const centerContainer = this.bodyController.getCenterContainer();\n    //     centerContainer.scrollTo({\n    //         left : centerContainer.scrollLeft,\n    //         top : y\n    //     });\n    // }\n\n    // scrollCenterGridtoXY(x : number, y : number) : void {\n    //     this.scrollCenterGridtoX(x);\n    //     this.scrollCenterGridtoY(y);\n    // }\n\n    // getPaneRelativeCoordinatesY(paneType : string, Y : number) {\n    //     const bodyContainer = this.getBodyController();\n\n    //     let rect = {\n    //         x : 0,\n    //         y : 0\n    //     };\n\n    //     switch(paneType) {\n    //         case VERTICAL_PANE.TOP:\n    //             rect = bodyContainer.getTopContainerBoundRect();\n    //             break;\n    //         case VERTICAL_PANE.MIDDLE:\n    //             rect = bodyContainer.getCenterContainerBoundRect();\n    //             break;\n    //         case VERTICAL_PANE.BOTTOM:\n    //             rect = bodyContainer.getBottomContainerBoundRect();\n    //             break;\n    //     }\n\n    //     let translatedY = Y - rect.y;\n    //     if(paneType === VERTICAL_PANE.MIDDLE) {\n    //         translatedY += this.bodyController.getVScrollPosition().top;\n    //     }\n    //     return translatedY;\n    // }\n\n    // getPaneRelativeCoordinatesX(paneType : string, X : number) {\n    //     let rect = {\n    //         x : 0,\n    //         y : 0\n    //     };\n    //     switch(paneType) {\n    //         case HORIZONTAL_PANE.TOP_LEFT:\n    //             {\n    //                 const element = this.getTopLeftRowContainerController().getContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.TOP_CENTER:\n    //             {\n    //                 const element = this.getTopCenterRowContainerController().getViewPortContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.TOP_RIGHT:\n    //             {\n    //                 const element = this.getTopRightRowContainerController().getContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.BOTTOM_LEFT:\n    //             {\n    //                 const element = this.getBottomLeftRowContainerController().getContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.BOTTOM_CENTER:\n    //             {\n    //                 const element = this.getBottomCenterRowContainerController().getViewPortContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.BOTTOM_RIGHT:\n    //             {\n    //                 const element = this.getBottomRightRowContainerController().getContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.MID_LEFT:\n    //             {\n    //                 const element = this.getLeftRowContainerController().getContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.MID_RIGHT:\n    //             {\n    //                 const element = this.getRightRowContainerController().getContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.MID_CENTER:\n    //             {\n    //                 const element = this.getCenterRowContainerController().getViewPortContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n            \n    //         case HORIZONTAL_PANE.HEADER_LEFT:\n    //             {\n    //                 const element = this.getLeftRowHeaderContainerController().getViewPortContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.HEADER_CENTER:\n    //             {\n    //                 const element = this.getCenterRowHeaderContainerController().getViewPortContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //         case HORIZONTAL_PANE.HEADER_RIGHT:\n    //             {\n    //                 const element = this.getRightRowHeaderContainerController().getViewPortContainer();\n    //                 rect = element.getBoundingClientRect();\n    //                 break;\n    //             }\n    //     }\n\n    //     let translatedX = X - rect.x;\n    //     if(paneType === HORIZONTAL_PANE.MID_CENTER || paneType === HORIZONTAL_PANE.TOP_CENTER || paneType === HORIZONTAL_PANE.BOTTOM_CENTER || paneType === HORIZONTAL_PANE.HEADER_CENTER) {\n    //         translatedX += this.centerRowContainerControl.getScrollLeft();\n    //     }\n    //     return translatedX;\n    // }\n\n    // Horizonatl scroll\n    registerHSComponent(component: HSComponent): void {\n        this.HSComponent = component;\n        this.checkPaneIsReady();    \n    }\n\n    //vertical scroll\n    registerVSComponent(component: VSComponent): void {\n        this.VSComponent = component;\n        this.checkPaneIsReady();    \n    }\n\n    // summary controller\n\n    registerSummaryCenterRowContainerController(controller: RowContainerController): void {\n        this.summaryCenterRowContainerControl =  controller;\n        this.checkPaneIsReady();\n    }\n\n    registerSummaryHeaderRowContainerController(controller: RowContainerController): void {\n        this.summaryHeaderRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerSummaryLeftRowContainerController(controller: RowContainerController): void {\n        this.summaryLeftRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerSummaryRightRowContainerController(controller: RowContainerController): void {\n        this.summaryRightRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    // floating record\n\n    registerFloatingRecordCenterRowContainerController(controller: RowContainerController): void {\n        this.floatingRecordCenterRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerFloatingRecordHeaderContainerController(controller: RowContainerController): void {\n        this.floatingRecordHeaderRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerFloatingRecordLeftContainerController(controller: RowContainerController): void {\n        this.floatingRecordLeftRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerFloatingRecordRightContainerController(controller: RowContainerController): void {\n        this.floatingRecordRightRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    // body controller \n    registerBodyController(controller : GridBodyController) : void {\n        this.bodyController = controller;\n        this.checkPaneIsReady();\n    }\n\n    // Bottom pinning controller\n    registerBottomRightRowContainerController(controller : RowContainerController) {\n        this.bottomRightRowContainerControl = controller;\n        this.checkPaneIsReady();    \n    }\n\n    registerBottomLeftRowContainerController(controller : RowContainerController) {\n        this.bottomLeftRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerBottomCenterRowContainerController(controller : RowContainerController) {\n        this.bottomCenterRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerBottomHeaderRowContainerController(controller : RowContainerController) {\n        this.bottomHeaderRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    // Top pinning controller\n    registerTopRightRowContainerController(controller : RowContainerController) {\n        this.topRightRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n    registerTopLeftRowContainerController(controller : RowContainerController) {\n        this.topLeftRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n    registerTopCenterRowContainerController(controller : RowContainerController) {\n        this.topCenterRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerTopHeaderRowContainerController(controller : RowContainerController) {\n        this.topHeaderRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    // Center pinning controller\n    registerCenterRowContainerController(controller : RowContainerController) {\n        this.centerRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerLeftRowContainerController(controller : RowContainerController) {\n        this.leftRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerRightRowContainerController(controller : RowContainerController) {\n        this.rightRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerHeaderRowContainerController(controller : RowContainerController) {\n        this.headerRowContainerControl = controller;\n        this.checkPaneIsReady();\n    }\n\n    //Column header \n\n    registerLeftRowHeaderContainerController(controller : RowHeaderContainerController) {\n        this.leftRowHeaderContainerController = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerRightRowHeaderContainerController(controller : RowHeaderContainerController) {\n        this.rightRowHeaderContainerController = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerCenterRowHeaderContainerController(controller : RowHeaderContainerController) {\n        this.centerRowHeaderContainerController = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerHeaderRowHeaderContainerController(controller : RowHeaderContainerController) {\n        this.headerRowHeaderContainerController = controller;\n        this.checkPaneIsReady();\n    }\n\n    // floating editor\n\n    registerFloatingEditorController(controller: GridFloatingEditorController): void {\n        this.floatingEditorController = controller;\n        this.checkPaneIsReady();\n    }\n\n    // grid controller\n\n    registerGridController(controller: GridController): void {\n        this.gridController = controller;\n        this.checkPaneIsReady();\n    }\n\n    // rowBuffer\n\n    registerRowBufferContainerController(controller: IRowBufferContainerController): void {\n        this.rowBufferContainerController = controller;\n        this.checkPaneIsReady();\n    }\n\n    //column buffer\n\n    registerColumnBufferContainerController(controller: IColumnBufferContainerController): void {\n        this.columnBufferContainerController = controller;\n        this.checkPaneIsReady();\n    }\n\n    // floaring record\n\n    registerFloatingRecordController(controller: IFloatingRecordController): void {\n        this.floatingRecordController = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerFloatingRecordMovedController(controller: IFloatingRecordMovedController): void {\n        this.floatingRecordMovedController = controller;\n        this.checkPaneIsReady();\n    }\n\n    registerNoRecordFoundCOntroller(controller : NoRecordControllerType) : void {\n        this.noRecordFoundController = controller;\n        this.checkPaneIsReady();\n    }\n    \n    // getter\n\n    getBottomRightRowContainerController() : RowContainerController {\n        return this.bottomRightRowContainerControl;\n    }\n\n    getBottomLeftRowContainerController() : RowContainerController {\n        return this.bottomLeftRowContainerControl;\n    }\n\n    getBottomCenterRowContainerController() : RowContainerController {\n        return this.bottomCenterRowContainerControl;\n    }\n\n    getTopRightRowContainerController() : RowContainerController {\n        return this.topRightRowContainerControl;\n    }\n\n    getTopLeftRowContainerController() : RowContainerController {\n        return this.topLeftRowContainerControl;\n    }\n\n    getTopCenterRowContainerController() : RowContainerController {\n        return this.topCenterRowContainerControl;\n    }\n\n    getCenterRowContainerController() : RowContainerController {\n        return this.centerRowContainerControl;\n    }\n\n    getLeftRowContainerController() : RowContainerController {\n        return this.leftRowContainerControl;\n    }\n\n    getRightRowContainerController() : RowContainerController {\n        return this.rightRowContainerControl;\n    }\n\n    getLeftRowHeaderContainerController() : RowHeaderContainerController {\n        return this.leftRowHeaderContainerController\n    }\n\n    getRightRowHeaderContainerController() : RowHeaderContainerController {\n        return this.rightRowHeaderContainerController\n    }\n\n    getCenterRowHeaderContainerController() : RowHeaderContainerController {\n        return this.centerRowHeaderContainerController\n    }\n\n    getHeaderRowHeaderContainerController() : RowHeaderContainerController {\n        return this.headerRowHeaderContainerController\n    }\n\n    getHeaderRowContainerController() : RowContainerController {\n        return this.headerRowContainerControl;\n    }\n\n    getBottomHeaderRowContainerController() : RowContainerController {\n        return this.bottomHeaderRowContainerControl;\n    }\n\n    getTopHeaderRowContainerController() : RowContainerController {\n        return this.topHeaderRowContainerControl;\n    }\n\n    getHSComponent(): HSComponent | null {\n        return this.HSComponent ?? null;\n    }\n\n    getVSComponent(): VSComponent | null {\n        return this.VSComponent ?? null;\n    }\n\n    getBodyController(): GridBodyController {\n        return this.bodyController;\n    }\n\n    getBodyScrollHandler(): GridBodyScrollHandler {\n        const bodyController  = this.getBodyController();\n        return bodyController.getScrollHandler();\n    }\n\n    getBodyContainerScrollTop() : number {\n        const bodyController = this.getBodyController();\n        const scrollTop = bodyController.getScrollTop();\n        return scrollTop;\n    }\n\n    getSummaryCenterRowContainerController(): RowContainerController {\n        return this.summaryCenterRowContainerControl;\n    }\n\n    getSummaryHeaderRowContainerController(): RowContainerController {\n        return this.summaryHeaderRowContainerControl;\n    }\n\n    getSummaryLeftRowContainerController(): RowContainerController {\n        return this.summaryLeftRowContainerControl;\n    }\n\n    getSummaryRightRowContainerController(): RowContainerController {\n        return this.summaryRightRowContainerControl\n    }\n\n    getFloatingEditorController(): GridFloatingEditorController {\n        return this.floatingEditorController;\n    }\n\n    getGridController(): GridController {\n        return this.gridController;\n    }\n\n    getRowBufferContainerController(): IRowBufferContainerController {\n        return this.rowBufferContainerController;\n    }\n\n    getColumnBufferContainerController(): IColumnBufferContainerController {\n        return this.columnBufferContainerController;\n    }\n\n    getFloatingRecordController(): IFloatingRecordController {\n        return this.floatingRecordController;\n    }\n\n    getFloatingRecordCenterRowContainerController(): RowContainerController {\n        return this.floatingRecordCenterRowContainerControl;\n    }\n\n    getFloatingRecordHeaderRowContainerController(): RowContainerController {\n        return this.floatingRecordHeaderRowContainerControl\n    }\n\n    getFloatingRecordLeftRowContainerController(): RowContainerController {\n        return this.floatingRecordLeftRowContainerControl;\n    }\n\n    getFloatingRecordRightRowContainerController(): RowContainerController {\n        return this.floatingRecordRightRowContainerControl;\n    }\n\n    getFloatingRecordMovedController(): IFloatingRecordMovedController {\n        return this.floatingRecordMovedController;\n    }\n\n\n    // sticky top\n    registerStickyTopHeaderContainerController(controller: RowContainerController): void {\n        this.stickyTopHeaderController = controller;\n        this.checkPaneIsReady();\n    }\n    registerStickyTopLeftContainerController(controller: RowContainerController): void {\n        this.stickyTopLeftController = controller;\n        this.checkPaneIsReady();\n    }\n    registerStickyTopCenterContainerController(controller: RowContainerController): void {\n        this.stickyTopCenterController = controller;\n        this.checkPaneIsReady();\n    }\n    registerStickyTopRightContainerController(controller: RowContainerController): void {\n        this.stickyTopRightController = controller;\n        this.checkPaneIsReady();\n    }\n    registerStickyTopFullWidthContainerController(controller: RowContainerController): void {\n        this.stickyTopFullWidthController = controller;\n        this.checkPaneIsReady();\n    }\n    getStickyTopHeaderController(): RowContainerController {\n        return this.stickyTopHeaderController;\n    }\n    getStickyTopLeftController(): RowContainerController {\n        return this.stickyTopLeftController;\n    }\n    getStickyTopCenterController(): RowContainerController {\n        return this.stickyTopCenterController;\n    }\n    getStickyTopRightController(): RowContainerController {\n        return this.stickyTopRightController;\n    }\n    getStickyTopFullWidthController(): RowContainerController {\n        return this.stickyTopFullWidthController;\n    }\n\n    // grid header\n    registerGridHeaderController(controller: GridHeaderController): void {\n        this.gridHeaderController = controller;\n        this.checkPaneIsReady();\n    }\n\n    getGridHeaderController(): GridHeaderController {\n        return this.gridHeaderController;\n    }\n\n    getNoRecordFoundController() : NoRecordControllerType {\n        return this.noRecordFoundController;\n    }\n\n}\n\nexport {\n    HORIZONTAL_PANE,\n    VERTICAL_PANE\n}","const Components = {\n    METADATA : \"COMPONENT_META_DATA\"\n}\n\nfunction getFunctionName(constructor: any) {\n    if (constructor.name) {\n        return constructor.name;\n    }\n}\n\n\nfunction QuerySelector(selector: string | null = null): Function {\n    return function (classPrototype: any, methodOrAttributeName: string, index: number) {\n        if (selector === null) {\n            console.error('QuerySelector should not be null');\n            return;\n        }\n\n        if (typeof index === 'number') {\n            console.error('QuerySelector should be on an attribute');\n            return;\n        }\n\n        addToProperties(classPrototype, 'querySelectors', {\n            attributeName: methodOrAttributeName,\n            querySelector: selector,\n            refSelector: undefined, \n        });\n    };\n}\n\nfunction queryAssignedNodes(ref: string): Function {\n    return function (classPrototype: any, methodOrAttributeName: string, _index: number) {\n        addToProperties(classPrototype, 'querySelectors', {\n            attributeName: methodOrAttributeName,\n            querySelector: `[ref=${ref}]`, \n            refSelector: ref,\n        });\n    };\n}\n\nfunction addToProperties(target: Object, key: string, value: any): void {\n    const properties = getComponentMetaProperties(target, getFunctionName(target.constructor));\n\n    if (!properties[key]) {\n        properties[key] = [];\n    }\n\n    properties[key].push(value);\n}\n\nfunction getComponentMetaProperties(target: any, instanceName: string): any {\n    const hasMetaData     = Reflect.has(target, Components.METADATA);\n    if (!hasMetaData) {\n        Reflect.set(target, Components.METADATA, {});\n    }\n    const hasMetaInstance = Reflect.has(target[Components.METADATA], instanceName);\n\n    if (!hasMetaInstance) {\n        Reflect.set(target[Components.METADATA], instanceName, {});\n\n    }\n\n    return Reflect.get(target[Components.METADATA], instanceName);\n}\n\n\nexport {\n    Components,\n    getFunctionName,\n    queryAssignedNodes,\n    QuerySelector\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\n@Bean(GRID_BEAN_NAME.GRID_EVENTS)\nclass GridEvents extends EventEmitter {\n\n    private events;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    @PostConstruct()\n    init(): void {\n        const optionsHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        this.events = optionsHandler.getEvents();\n    }\n\n    onCellKeyDown(args) : void {\n        this.events?.onCellKeyDown && this.events.onCellKeyDown(args);\n    }\n\n    onCellKeyUp (args) : void {\n        this.events?.onCellKeyUp && this.events.onCellKeyUp(args);\n    }\n\n    onCellMouseDown (args) : void {\n        this.events?.onCellMouseDown && this.events.onCellMouseDown(args);\n    }\n\n    onCellMouseUp (args) : void {\n        this.events?.onCellMouseUp && this.events.onCellMouseUp(args);\n    }\n\n    onCellMouseEnter (args) : void {\n        this.events?.onCellMouseEnter && this.events.onCellMouseEnter(args);\n    }\n\n    onCellMouseMove (args) : void {\n        this.events?.onCellMouseMove && this.events.onCellMouseMove(args);\n    }\n\n    onCellMouseLeave (args) : void {\n        this.events?.onCellMouseLeave && this.events.onCellMouseLeave(args);\n    }\n\n    \n    onRowHeaderKeyDown (args) : void {\n        this.events?.onRowHeaderKeyDown && this.events.onRowHeaderKeyDown(args);\n    }\n\n    onRowHeaderKeyUp (args) : void {\n        this.events?.onRowHeaderKeyUp && this.events.onRowHeaderKeyUp(args);\n    }\n\n    onRowHeaderMouseDown (args) : void {\n        this.events?.onRowHeaderMouseDown && this.events.onRowHeaderMouseDown(args);\n    }\n\n    onRowHeaderMouseUp (args) : void {\n        this.events?.onRowHeaderMouseUp && this.events.onRowHeaderMouseUp(args);\n    }\n\n    onRowHeaderMouseEnter (args) : void {\n        this.events?.onRowHeaderMouseEnter && this.events.onRowHeaderMouseEnter(args);\n    }\n\n    onRowHeaderMouseMove (args) : void {\n        this.events?.onRowHeaderMouseMove && this.events.onRowHeaderMouseMove(args);\n    }\n\n    onRowHeaderMouseLeave (args) : void {\n        this.events?.onRowHeaderMouseLeave && this.events.onRowHeaderMouseLeave(args);\n    }\n\n\n    onColumnHeaderKeyDown (args) : void {\n        this.events?.onColumnHeaderKeyDown && this.events.onColumnHeaderKeyDown(args);\n    }\n\n    onColumnHeaderKeyUp (args) : void {\n        this.events?.onColumnHeaderKeyUp && this.events.onColumnHeaderKeyUp(args);\n    }\n\n    onColumnHeaderMouseDown (args) : void {\n        this.events?.onColumnHeaderMouseDown && this.events.onColumnHeaderMouseDown(args);\n    }\n\n    onColumnHeaderMouseUp (args) : void {\n        this.events?.onColumnHeaderMouseUp && this.events.onColumnHeaderMouseUp(args);\n    }\n\n    onColumnHeaderMouseEnter (args) : void {\n        this.events?.onColumnHeaderMouseEnter && this.events.onColumnHeaderMouseEnter(args);\n    }\n\n    onColumnHeaderMouseMove (args) : void {\n        this.events?.onColumnHeaderMouseMove && this.events.onColumnHeaderMouseMove(args);\n    }\n\n    onColumnHeaderMouseLeave (args) : void {\n        this.events?.onColumnHeaderMouseLeave && this.events.onColumnHeaderMouseLeave(args);\n    }\n\n\n    onContextMenu(args ) : void {\n        this.events?.onContextMenu && this.events.onContextMenu(args);\n    }\n\n}\n\nexport {\n    GridEvents\n}","import { Bean } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { RowNode } from \"./Rows/RowNode\";\nimport { GroupRowNode } from \"../../DataStore/GroupRowNode\";\nimport { SortHandler } from \"../../DataStore/Local/SortHandler\";\nimport { FilterHandler } from \"../../DataStore/Local/FilterHandler\";\nimport { RowGroupingHandler } from \"../../DataStore/Local/RowGroupingHandler\";\nimport { ISortHandlerConstructor } from \"../../DataStore/Local/sort-handler.types\";\nimport { IFilterHandlerConstructor } from \"../../DataStore/Local/filter-handler.types\";\nimport { IRowGroupingHandlerConstructor } from \"../../DataStore/Local/rowgrouping-handler.types\";\nimport { ListGroupedRowAxis } from \"../../ListModelClasses/ListGroupAxis\";\nimport { IRowNodeCoreConstructor } from \"../../DataStore/rownode.types\";\nimport { IGroupedRowNodeConstructor } from \"../../DataStore/group-rownode.types\";\nimport { IRowAxisConstructor } from \"../../DataStore/RowAxis/rowAxis.types\";\nimport { IGridBeanClassRegistry } from \"./grid-beanclass-registry.types\";\nimport { DynamicRowAxis } from \"../../DataStore/RowAxis/DynamicRowAxis\";\n\n@Bean(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY)\nexport class GridBeanClassRegistry implements IGridBeanClassRegistry {\n    registerClasses: Map<string, any>;\n    constructor() {\n        this.registerClasses = new Map();\n    }\n    getRowNode() : IRowNodeCoreConstructor {\n        return RowNode\n    }\n    getGroupRowNode() : IGroupedRowNodeConstructor {\n        return GroupRowNode;\n    } \n    getStaticRowAxis() : IRowAxisConstructor {\n        return ListGroupedRowAxis;\n    }\n    getDynamicRowAxis(isGroupingEnabled ?: boolean): IRowAxisConstructor {\n        // return ListGroupedRowAxis;\n        return isGroupingEnabled ? ListGroupedRowAxis : DynamicRowAxis;\n    }\n    getSortHandler() : ISortHandlerConstructor {\n        return SortHandler;\n    } \n    getFilterHandler() : IFilterHandlerConstructor {\n        return FilterHandler;\n    } \n    getRowGroupingHandler() : IRowGroupingHandlerConstructor {\n        return RowGroupingHandler;\n    } \n}\n ","\t// import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n// import { IControllerHandler } from \"./Interface/IControllerHandler\";\n// import { GRID_BEAN_NAME } from \"./Constants/BeanName\";\n// import { RowRenderController } from \"./Rows/RowRenderController\";\n// import { FieldHandler } from \"./Columns/FieldHandler\";\n// import { IColumnNode } from \"../Main\";\n// import { RowContainerController } from \"../GridComponent/GridBodyComponent/RowContainer/RowContainerController\";\n// import { IRecordHandler } from \"./Rows/RecordHandler.types\";\n\n// export enum ScrollSource {\n//     Container,\n//     SContainer\n// };\n\n// export  enum HScrollSource {\n//     headerContainer,\n//     centerContainer,\n//     topCenterContainer,\n//     bottomCenterContainer,\n//     summaryCenterContainer,\n//     floatingRecordCenterContainer\n// }\n// export class GridBodyScrollHandler extends EventEmitter {\n// \tprivate bodyViewPortElement: HTMLElement;\n// \t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\n// \tprivate ticking = false;\n// \tprivate nextScrollTop = -1;\n// \tprivate nextScrollLeft = -1;\n// \tprivate scrollTop = -1;\n\n// \tpublic scrollLeft = -1;\n\n// \tprivate centerRowContainerController : RowContainerController | null = null;\n\n// \tconstructor(bodyViewPortElement: HTMLElement) {\n// \t\tsuper();\n// \t\tthis.bodyViewPortElement = bodyViewPortElement;\n// \t}\n\n// \t@PostConstruct()\n// \tinit() {\n// \t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n// \t\tcontrollerHandler.onAfterGridReady((param) => {\n// \t\t\tthis.centerRowContainerController = param.centerRowContainerControl;\n// \t\t\tthis.addScrollListener();\n// \t\t});\n// \t}\n\n// \tprivate addSmoothScroll(element : HTMLElement, onScrollCallback : CallableFunction) : void {\n// \t\tthis.addListener(\n// \t\t\telement, 'scroll',\n// \t\t\t() => {\n// \t\t\t\tif (!this.ticking) {\n// \t\t\t\t\twindow.requestAnimationFrame(() => {\n// \t\t\t\t\t\tonScrollCallback();\n// \t\t\t\t\t\tthis.ticking = false;\n// \t\t\t\t\t});\n// \t\t\t\t\tthis.ticking = true;\n// \t\t\t\t}\n// \t\t\t}\n// \t\t);\n// \t}\n\n// \tprivate setScrollPosition(setScrollCallback : CallableFunction) : void {\n// \t\tsetScrollCallback();\n// \t\t// if (!this.ticking) {\n// \t\t// \twindow.requestAnimationFrame(function() {\n// \t\t// \t\tsetScrollCallback();\n// \t\t// \t\tthis.ticking = false;\n// \t\t// \t});\n// \t\t// \tthis.ticking = true;\n// \t\t// }\n// \t}\n\n// \tprivate addScrollListener() {\n// \t\tthis.addSmoothScroll(this.bodyViewPortElement, this.onVScroll.bind(this, ScrollSource.Container))\n\t\t\n// \t\tconst controllerHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER ) as IControllerHandler;\n// \t\tconst HSComponenet      = controllerHandler.getHSComponent();\n// \t\tconst VSComponent       = controllerHandler.getVSComponent();\n\n// \t\tVSComponent.onScrollCallback(\n// \t\t\tthis.onVScroll.bind(this, ScrollSource.SContainer),\n// \t\t);\n// \t\tHSComponenet.onScrollCallback(this.onHScroll.bind(this));\n\n// \t\tconst centerController =\n// \t\t\tcontrollerHandler.getCenterRowContainerController();\n// \t\tconst topCenterController =\n// \t\t\tcontrollerHandler.getTopCenterRowContainerController();\n// \t\tconst bottomCenterController =\n// \t\t\tcontrollerHandler.getBottomCenterRowContainerController();\n// \t\tconst centerHeaderController =\n// \t\t\tcontrollerHandler.getCenterRowHeaderContainerController();\n// \t\tconst summaryCenterController =\n// \t\t\tcontrollerHandler.getSummaryCenterRowContainerController();\n// \t\tconst floatingRecordCenterController =\n// \t\t\tcontrollerHandler.getFloatingRecordCenterRowContainerController();\n\n// \t\tthis.addListener(\n// \t\t\tcenterHeaderController.getViewPortContainer(),\n// \t\t\t'scroll',\n// \t\t\tthis.onHScroll.bind(\n// \t\t\t\tthis,\n// \t\t\t\tScrollSource.Container,\n// \t\t\t\tHScrollSource.headerContainer,\n// \t\t\t),\n// \t\t);\n// \t\tthis.addListener(\n// \t\t\tcenterController.getViewPortContainer(),\n// \t\t\t'scroll',\n// \t\t\tthis.onHScroll.bind(\n// \t\t\t\tthis,\n// \t\t\t\tScrollSource.Container,\n// \t\t\t\tHScrollSource.centerContainer,\n// \t\t\t),\n// \t\t);\n// \t\tthis.addListener(\n// \t\t\ttopCenterController.getViewPortContainer(),\n// \t\t\t'scroll',\n// \t\t\tthis.onHScroll.bind(\n// \t\t\t\tthis,\n// \t\t\t\tScrollSource.Container,\n// \t\t\t\tHScrollSource.topCenterContainer,\n// \t\t\t),\n// \t\t);\n// \t\tthis.addListener(\n// \t\t\tbottomCenterController.getViewPortContainer(),\n// \t\t\t'scroll',\n// \t\t\tthis.onHScroll.bind(\n// \t\t\t\tthis,\n// \t\t\t\tScrollSource.Container,\n// \t\t\t\tHScrollSource.bottomCenterContainer,\n// \t\t\t),\n// \t\t);\n// \t\tthis.addListener(\n// \t\t\tsummaryCenterController.getViewPortContainer(),\n// \t\t\t'scroll',\n// \t\t\tthis.onHScroll.bind(\n// \t\t\t\tthis,\n// \t\t\t\tScrollSource.Container,\n// \t\t\t\tHScrollSource.summaryCenterContainer,\n// \t\t\t),\n// \t\t);\n// \t\tthis.addListener(\n// \t\t\tfloatingRecordCenterController.getViewPortContainer(),\n// \t\t\t'scroll',\n// \t\t\tthis.onHScroll.bind(\n// \t\t\t\tthis,\n// \t\t\t\tScrollSource.Container,\n// \t\t\t\tHScrollSource.floatingRecordCenterContainer,\n// \t\t\t),\n// \t\t);\n// \t}\n\n// \tprivate onVScroll(source: ScrollSource) {\n// \t\tlet scrollTop: number;\n\n// \t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n// \t\tconst VSComponent = controllerHandler.getVSComponent();\n\n// \t\tif (source === ScrollSource.Container) {\n// \t\t\tscrollTop = this.bodyViewPortElement.scrollTop;\n// \t\t} else {\n// \t\t\tscrollTop = VSComponent.getScrollPosition();\n// \t\t}\n\n// \t\tthis.nextScrollTop = scrollTop;\n\n// \t\tif (source === ScrollSource.Container) {\n// \t\t\tthis.setScrollPosition(VSComponent.setScrollPosition.bind(VSComponent, scrollTop))\n// \t\t} else {\n// \t\t\tthis.bodyViewPortElement.scrollTop = scrollTop;\n// \t\t}\n\n// \t\tthis.scrollGridIfNeeded();\n// \t\tthis.optionsHandler.on('gridScroll');\n// \t}\n\n// \tsetVerticalScrollPosition(scrollPosition: number): void {\n// \t\tthis.bodyViewPortElement.scrollTop = scrollPosition;\n// \t}\n\n// \tscrollBy(x : number,y : number): void {\n// \t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n// \t\tconst centerRowContainerController = controllerHandler.getCenterRowContainerController();\n\n// \t\tthis.bodyViewPortElement.scrollBy(x,y);\n// \t\tcenterRowContainerController.scrollBy(x, y);\n// \t}\n\n// \tscrollTo(x: number, y: number): void {\n// \t\tthis.setHorizontalScrollPosition(x);\n// \t\tthis.setVerticalScrollPosition(y);\n// \t}\n\n// \tsetHorizontalScrollPosition(scrollPosition: number): void {\n// \t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n// \t\tconst centerRowContainerController = controllerHandler.getCenterRowContainerController();\n// \t\tcenterRowContainerController.setScrollLeft(scrollPosition);\n// \t}\n\n//  \tprivate scrollGridIfNeeded(): boolean {\n// \t\tconst frameNeeded = this.scrollTop != this.nextScrollTop;\n\n// \t\tif (frameNeeded) {\n// \t\t\tthis.scrollTop = this.nextScrollTop;\n// \t\t\tthis.eventHandler.dispatchEvent({\n// \t\t\t\ttype: 'BODY_SCROLL',\n// \t\t\t});\n// \t\t}\n\n// \t\treturn frameNeeded;\n// \t}\n\n// \tprivate onHScroll(source: ScrollSource, HSource: HScrollSource) {\n// \t\tlet scrollLeft: number;\n\n// \t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n// \t\tconst HSComponenet                   = controllerHandler.getHSComponent();\n// \t\tconst centerController               = controllerHandler.getCenterRowContainerController();\n// \t\tconst topCenterController            = controllerHandler.getTopCenterRowContainerController();\n// \t\tconst bottomCenterController         = controllerHandler.getBottomCenterRowContainerController();\n// \t\tconst centerHeaderController         = controllerHandler.getCenterRowHeaderContainerController();\n// \t\tconst summaryCenterController        = controllerHandler.getSummaryCenterRowContainerController();\n// \t\tconst floatingRecordCenterController = controllerHandler.getFloatingRecordCenterRowContainerController();\n\n// \t\tif (source === ScrollSource.Container) {\n// \t\t\tswitch (HSource) {\n// \t\t\t\tcase HScrollSource.centerContainer:\n// \t\t\t\t\tscrollLeft = centerController.getScrollLeft();\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.topCenterContainer:\n// \t\t\t\t\tscrollLeft = topCenterController.getScrollLeft();\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.bottomCenterContainer:\n// \t\t\t\t\tscrollLeft = bottomCenterController.getScrollLeft();\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.headerContainer:\n// \t\t\t\t\tscrollLeft = centerHeaderController.getScrollLeft();\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.summaryCenterContainer:\n// \t\t\t\t\tscrollLeft = summaryCenterController.getScrollLeft();\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.floatingRecordCenterContainer:\n// \t\t\t\t\tscrollLeft = floatingRecordCenterController.getScrollLeft();\n// \t\t\t\t\tbreak;\n// \t\t\t\tdefault:\n// \t\t\t\t\tscrollLeft = centerController.getScrollLeft();\n// \t\t\t\t\tbreak;\n// \t\t\t}\n// \t\t} else {\n// \t\t\tscrollLeft = HSComponenet.getScrollPosition();\n// \t\t}\n\n// \t\tif (this.scrollLeft === scrollLeft) {\n// \t\t\treturn;\n// \t\t}\n\n// \t\tscrollLeft = Math.round(scrollLeft);\n\n// \t\tthis.nextScrollLeft = scrollLeft;\n\n// \t\tif (source === ScrollSource.Container) {\n// \t\t\tswitch (HSource) {\n// \t\t\t\tcase HScrollSource.centerContainer:\n// \t\t\t\t\ttopCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbottomCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tcenterHeaderController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tsummaryCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tfloatingRecordCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.topCenterContainer:\n// \t\t\t\t\tcenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbottomCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tcenterHeaderController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tsummaryCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tfloatingRecordCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.bottomCenterContainer:\n// \t\t\t\t\tcenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\ttopCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tcenterHeaderController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tsummaryCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tfloatingRecordCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.headerContainer:\n// \t\t\t\t\tcenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\ttopCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbottomCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tsummaryCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tfloatingRecordCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.summaryCenterContainer:\n// \t\t\t\t\tcenterHeaderController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tcenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\ttopCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbottomCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tfloatingRecordCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbreak;\n// \t\t\t\tcase HScrollSource.floatingRecordCenterContainer:\n// \t\t\t\t\tcenterHeaderController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tcenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\ttopCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbottomCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tsummaryCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbreak;\n// \t\t\t\tdefault:\n// \t\t\t\t\tcenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\ttopCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbottomCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tcenterHeaderController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tfloatingRecordCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tsummaryCenterController.setScrollLeft(scrollLeft);\n// \t\t\t\t\tbreak;\n// \t\t\t}\n// \t\t\tHSComponenet.setScrollPosition(scrollLeft);\n// \t\t} else {\n// \t\t\tcenterController.setScrollLeft(scrollLeft);\n// \t\t\ttopCenterController.setScrollLeft(scrollLeft);\n// \t\t\tbottomCenterController.setScrollLeft(scrollLeft);\n// \t\t\tcenterHeaderController.setScrollLeft(scrollLeft);\n// \t\t\tsummaryCenterController.setScrollLeft(scrollLeft);\n// \t\t\tfloatingRecordCenterController.setScrollLeft(scrollLeft);\n// \t\t}\n\n// \t\tif(this.nextScrollLeft != this.scrollLeft) {\n// \t\t\tthis.scrollLeft = this.nextScrollLeft;\n// \t\t\tthis.dispatchEvent({\n// \t\t\t\ttype : \"EVENT_HORIZONTAL_SCROLL\"\n// \t\t\t})\n\n// \t\t\tthis.optionsHandler.on('gridScroll');\n// \t\t}\n// \t}\n\n// \tensureIndexVisible(index: number, position?: 'top' | 'bottom' | 'middle' | null) {\n// \t\tconst recordHandler       = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n// \t\tconst rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n\n// \t\tconst rowCount = recordHandler.getTotalCount();\n\t\n// \t\tif (typeof index !== 'number' || index < 0 || index >= rowCount) {\n// \t\t\treturn;\n// \t\t}\n\t\n// \t\tconst centerHandler = recordHandler.getMiddleHandler();\n// \t\tconst rowHeight = centerHandler.getHeight(index);\n// \t\tconst rowTop = centerHandler.getTop(index);\n// \t\tlet rowPositionChangedDuringOperation: boolean;\n\t\n// \t\tdo {\n// \t\t\tconst startingRowTop = rowTop;\n// \t\t\tconst startingRowHeight = rowHeight;\n\t\n// \t\t\tconst rowTopPixel = rowTop!;\n// \t\t\tconst rowBottomPixel = rowTopPixel + rowHeight!;\n\t\n// \t\t\tconst scrollPosition = this.getVScrollPosition();\n\t\n// \t\t\tconst vScrollTop = scrollPosition.top;\n// \t\t\tconst vScrollBottom = scrollPosition.bottom;\n\t\n// \t\t\tconst viewportHeight = vScrollBottom - vScrollTop;\n\t\n// \t\t\tconst pxTop = rowTopPixel;\n// \t\t\tconst pxBottom = rowBottomPixel - viewportHeight;\n// \t\t\tconst pxMiddle = Math.min((pxTop + pxBottom) / 2, rowTopPixel);\n\t\n// \t\t\tconst rowAboveViewport = (vScrollTop) > rowTopPixel;\n// \t\t\tconst rowBelowViewport = vScrollBottom < rowBottomPixel;\n\t\n// \t\t\tlet newScrollPosition: number | null = null;\n\t\n// \t\t\tif (position === 'top') {\n// \t\t\t\tnewScrollPosition = pxTop;\n// \t\t\t} else if (position === 'bottom') {\n// \t\t\t\tnewScrollPosition = pxBottom;\n// \t\t\t} else if (position === 'middle') {\n// \t\t\t\tnewScrollPosition = pxMiddle;\n// \t\t\t} else if (rowAboveViewport) {\n// \t\t\t\tnewScrollPosition = pxTop;\n// \t\t\t} else if (rowBelowViewport) {\n// \t\t\t\tnewScrollPosition = pxBottom;\n// \t\t\t}\n\t\n// \t\t\tif (newScrollPosition !== null) {\n// \t\t\t\tthis.setVerticalScrollPosition(newScrollPosition);\n// \t\t\t\trowRenderController.refresh();\n// \t\t\t}\n\t\n// \t\t\trowPositionChangedDuringOperation = (startingRowTop !== rowTop) || (startingRowHeight !== rowHeight);\n\t\n// \t\t} while (rowPositionChangedDuringOperation);\n// \t}\n\n// \tensureColumnVisible(key: any, position: 'auto' | 'start' | 'middle' | 'end' = 'auto'): void {\n// \t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n//         const column = fieldHandler.getColumnNodeByID(key);\n\n//         if (!column) {\n//             return;\n//         }\n\n//         if (column.getPinnedPosition() !== 'center') {\n//             return;\n//         }\n\n//         const newHorizontalScroll: number | null = this.calculateHorizontalScrollPosition(column, position);\n\n//         if (newHorizontalScroll !== null) {\n// \t\t\tconst controllerHandler              = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n// \t\t\tconst HSComponenet                   = controllerHandler.getHSComponent();\n// \t\t\tconst centerController               = controllerHandler.getCenterRowContainerController();\n// \t\t\tconst topCenterController            = controllerHandler.getTopCenterRowContainerController();\n// \t\t\tconst bottomCenterController         = controllerHandler.getBottomCenterRowContainerController();\n// \t\t\tconst centerHeaderController         = controllerHandler.getCenterRowHeaderContainerController();\n// \t\t\tconst summaryCenterController        = controllerHandler.getSummaryCenterRowContainerController();\n// \t\t\tconst floatingRecordCenterController = controllerHandler.getFloatingRecordCenterRowContainerController();\n// \t\t\tcenterHeaderController.setScrollLeft(newHorizontalScroll);\n// \t\t\tcenterController.setScrollLeft(newHorizontalScroll);\n// \t\t\ttopCenterController.setScrollLeft(newHorizontalScroll);\n// \t\t\tbottomCenterController.setScrollLeft(newHorizontalScroll);\n// \t\t\tsummaryCenterController.setScrollLeft(newHorizontalScroll);\n// \t\t\tHSComponenet.setScrollPosition(newHorizontalScroll);\n// \t\t\tfloatingRecordCenterController.setScrollLeft(newHorizontalScroll);\n// \t\t}\n//     }\n\n// \tprivate calculateHorizontalScrollPosition(column: IColumnNode, position: 'auto' | 'start' | 'middle' | 'end'): number | null {\n// \t\tconst suppressVerticalScrollBar  = this.optionsHandler.isSuppressVerticalScroll();\n// \t\tconst { isBeforeViewportStart, isAfterViewportEnd } = this.isColumnOutOfViewport(column);\n// \t\tconst viewportWidth = this.centerRowContainerController.getCenterWidth();\n// \t\tconst isRtl = this.optionsHandler.isRTL();\n\t\n// \t\tlet scrollToColumnStart = (isRtl ? isBeforeViewportStart : isAfterViewportEnd) || (viewportWidth < column.getWidth());\n// \t\tlet scrollToColumnEnd = isRtl ? isAfterViewportEnd : isBeforeViewportStart;\n\t\n// \t\tif (position === 'start') {\n// \t\t\treturn scrollToColumnStart ? this.getColumnStartPosition(column, isRtl) : null;\n// \t\t} else if (position === 'end') {\n// \t\t\treturn scrollToColumnEnd ? this.getColumnEndPosition(column, isRtl, viewportWidth) : null;\n// \t\t} else if (position === 'middle') {\n// \t\t\treturn this.getColumnMiddlePosition(column, viewportWidth, isRtl);\n// \t\t} else {\n// \t\t\tconst {isAfterViewportEnd, isBeforeViewportStart} = this.isColumnOutOfViewport(column);\n\n// \t\t\tif(isBeforeViewportStart || isAfterViewportEnd) {\n// \t\t\t\tconst {columnEnd, columnStart} = this.getColumnEdges(column);\n// \t\t\t\tif(isAfterViewportEnd) {\n// \t\t\t\t\treturn isRtl ? columnEnd : columnStart;\n// \t\t\t\t}\n// \t\t\t\treturn isRtl ? columnStart - viewportWidth : suppressVerticalScrollBar ? columnEnd - viewportWidth :  columnEnd - viewportWidth + 16;\n// \t\t\t}\n// \t\t\treturn null;\n// \t\t}\n\t\n// \t\treturn null;\n// \t}\n\t\n// \tprivate isColumnOutOfViewport(column: IColumnNode): { isBeforeViewportStart: boolean; isAfterViewportEnd: boolean } {\n// \t\tconst { viewportStart, viewportEnd } = this.getViewportEdges();\n// \t\tconst { columnStart, columnEnd }     = this.getColumnEdges(column);\n// \t\tconst isRtl                          = this.optionsHandler.isRTL();\n\t\n// \t\treturn {\n// \t\t\tisBeforeViewportStart: isRtl ? viewportStart > columnEnd : viewportEnd < columnEnd,\n// \t\t\tisAfterViewportEnd: isRtl ? viewportEnd < columnStart : viewportStart > columnStart\n// \t\t};\n// \t}\n\t\n// \tprivate getColumnEdges(column: IColumnNode): { columnStart: number; columnEnd: number} {\n// \t\tconst fieldHandler        = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n// \t\tconst isRtl               = this.optionsHandler.isRTL();\n// \t\tconst bodyWidth           = fieldHandler.getBodyContainerWidth();\n// \t\tconst columnWidth         = column.getWidth();\n// \t\tconst columnLeft          = column.getLeft()!;\n// \t\tconst directionMultiplier = isRtl ? -1 : 1;\n\t\n// \t\tconst columnStart = isRtl ? bodyWidth - columnLeft : columnLeft;\n// \t\tconst columnEnd = columnStart + columnWidth * directionMultiplier;\n\t\n// \t\treturn { columnStart, columnEnd };\n// \t}\n\t\n// \tprivate getColumnStartPosition(column: IColumnNode, isRtl: boolean): number {\n// \t\treturn isRtl ? this.getColumnEdges(column).columnEnd : this.getColumnEdges(column).columnStart;\n// \t}\n\t\n// \tprivate getColumnEndPosition(column: IColumnNode, isRtl: boolean, viewportWidth: number): number {\n// \t\tconst { columnStart, columnEnd } = this.getColumnEdges(column);\n// \t\treturn isRtl ? columnStart - viewportWidth : columnEnd - viewportWidth;\n// \t}\n\t\n// \tprivate getColumnMiddlePosition(column: IColumnNode, viewportWidth: number, isRtl: boolean): number {\n// \t\tconst { columnStart, columnEnd } = this.getColumnEdges(column);\n// \t\treturn columnStart + ((columnEnd - columnStart - viewportWidth) / 2) * (isRtl ? -1 : 1);\n// \t}\n\t\n// \tprivate getViewportEdges(): { viewportStart: number; viewportEnd: number } {\n// \t\tconst viewportWidth = this.centerRowContainerController.getCenterWidth();\n// \t\tconst scrollLeft = this.centerRowContainerController.getScrollLeft();\n\t\n// \t\treturn {\n// \t\t\tviewportStart: scrollLeft,\n// \t\t\tviewportEnd: viewportWidth + scrollLeft\n// \t\t};\n// \t}\n\t\n\n// \tgetVScrollPosition(): { top: number, bottom: number; } {\n//         const result = {\n//             top: this.bodyViewPortElement.scrollTop,\n//             bottom: this.bodyViewPortElement.scrollTop + this.bodyViewPortElement.offsetHeight\n//         };\n//         return result;\n//     }\n\n// \tgetHScrollPosition(): { left: number; right: number } {\n// \t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n// \t\tconst centerRowContainerController = controllerHandler.getCenterRowContainerController();\n// \t\treturn centerRowContainerController.getHScrollPosition();\n//     }\n\t\n// }\n\n\n\n\n\n\nimport { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, addSafePassiveEventListener, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IControllerHandler } from \"./Interface/IControllerHandler\";\nimport { GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { RowRenderController } from \"./Rows/RowRenderController\";\nimport { FieldHandler } from \"./Columns/FieldHandler\";\nimport { IColumnNode, ScrollPositionType } from \"../Main\";\nimport { RowContainerController } from \"../GridComponent/GridBodyComponent/RowContainer/RowContainerController\";\nimport { IRecordHandler } from \"./Rows/RecordHandler.types\";\nimport { Events } from \"./Constants/Events\";\nimport { RequestAnimationFrameHandler, Priority } from \"./RequestAnimationFrame/RequestAnimationFrameHandler\";\nimport { rowPinPositions } from \"./Constants/GridConfigurationConstants\";\nimport { normalizeWheelDeltasForShiftScroll } from \"./Constants/platformUtils\";\n\nexport enum ScrollSource {\n    Container,\n    SContainer\n};\n\nexport  enum HScrollSource {\n    headerContainer,\n    centerContainer,\n    topCenterContainer,\n    bottomCenterContainer,\n    summaryCenterContainer,\n    floatingRecordCenterContainer\n}\nexport class GridBodyScrollHandler extends EventEmitter {\n\tprivate bodyViewPortElement: HTMLElement;\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\t// @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler: IControllerHandler;\n\t@AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) private hookManager;\n\t@AutoWired(GRID_BEAN_NAME.REQUESTANIMATIONFRAME) private rafHandler: RequestAnimationFrameHandler;\n\n\n\t// private ticking = false;\n\tprivate nextScrollTop = -1;\n\tprivate nextScrollLeft = -1;\n\tprivate scrollTop = -1;\n\n\tpublic scrollLeft = -1;\n\n\tprivate centerRowContainerController : RowContainerController | null = null;\n\tprivate gridScrollHolder             : HTMLElement;\n\tprivate isGridScrollableFlag         : boolean = false;\n\n\tprivate scrollPosition : number = null\n\tprivate isUpdatingFromVSComponent : boolean = false;\n\tprivate lastVSComponentScrollTop : number = -1;\n\tprivate pendingVScroll : boolean = false;\n\tprivate pendingHScroll : boolean = false;\n\tprivate scrollTaskIndex : number = 0;\n\n\tconstructor(bodyViewPortElement: HTMLElement) {\n\t\tsuper();\n\t\tthis.bodyViewPortElement = bodyViewPortElement;\n\t}\n\n\t@PostConstruct()\n\tinit() {\n\t\tconst controllerHandler     = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tcontrollerHandler.onAfterGridReady((param) => {\n\t\t\tconst GridComponent         = controllerHandler.getGridController();\n\t\t\tthis.gridScrollHolder = GridComponent.getScrollHolder();\n\t\t\tthis.centerRowContainerController = param.centerRowContainerControl;\n\t\t\tthis.addScrollListener();\n\t\t\tthis.observeResize(controllerHandler);\n\n\t\t\tconst excludeScrollbarForPinning = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER).excludeScrollbarForPinning();\n            if(excludeScrollbarForPinning) {\n\t\t\t\tthis.gridScrollHolder.classList.add('ZG-hideScrollbar');\n\t\t\t}\n\t\t});\n\t}\n\n\thandleScrollerResize(controllerHandler : IControllerHandler) {\n\t\tif(!controllerHandler) {\n\t\t\treturn;\n\t\t}\n\t\tconst gridComponent \t = controllerHandler.getGridController();\n\t\tconst scrollHolderElement = gridComponent.getScrollHolder();\n\t\tconst scrollerElement     = scrollHolderElement.firstElementChild as HTMLElement;\n\n\t\t\n\t\tconst leftPinElement      = controllerHandler.getLeftRowContainerController().getContainer();\n\t\tconst rightPinElement     = controllerHandler.getRightRowContainerController().getContainer();\n\t\tconst topPinElement       = controllerHandler.getTopCenterRowContainerController().getViewPortContainer();\n\t\tconst bottomPinElement    = controllerHandler.getBottomCenterRowContainerController().getViewPortContainer();\n\t\tconst summaryElement      = controllerHandler.getSummaryCenterRowContainerController().getViewPortContainer();\n\t\tconst centerHeaderElement = controllerHandler.getCenterRowContainerController().getViewPortContainer();\n\t\tconst centerElement       = controllerHandler.getCenterRowContainerController().getContainer();\n\t\tconst columnHeaderElement = controllerHandler.getCenterRowHeaderContainerController().getViewPortContainer();\n\t\tconst rowHeaderElement    = controllerHandler.getHeaderRowContainerController().getContainer();\n\n\t\tconst bodyViewPortElement = controllerHandler.getBodyController().getBodyViewPortContainer();\n\n\t\tconst rowHeaderWidth     = rowHeaderElement.offsetWidth;\n\t\tconst columnHeaderHeight = columnHeaderElement.offsetHeight;\n\t\tconst leftPinWidth       = leftPinElement.offsetWidth;\n\t\tconst rightPinWidth      = rightPinElement.offsetWidth;\n\t\tconst topPinHeight       = topPinElement.offsetHeight;\n\t\tconst bottomPinHeight    = bottomPinElement.offsetHeight;\n\t\tconst summaryHeight      = summaryElement.offsetHeight;\n\t\tconst centerWidth        = centerElement.scrollWidth;\n\t\tconst centerHeaderScrollHeight = centerHeaderElement.scrollHeight;\n\t\tconst bodyViewPortClientHeight = bodyViewPortElement.clientHeight;\n\t\tconst centerHeight       = centerHeaderScrollHeight != 0 ? centerHeaderScrollHeight : bodyViewPortClientHeight;\n\n\t\tscrollerElement.style.width = `${leftPinWidth+rightPinWidth+centerWidth+rowHeaderWidth}px`;\n\t\tscrollerElement.style.height = `${topPinHeight+bottomPinHeight+centerHeight+summaryHeight+columnHeaderHeight}px`;\n\n\t\tconst scrollLeft: number = Math.round(this.gridScrollHolder.scrollLeft);\n\t\tconst scrollTop: number = Math.round(this.gridScrollHolder.scrollTop);\n\t\tconst isRTL = this.optionsHandler.isRTL();\n\t\tlet normalizedScrollLeft = scrollLeft;\n\t\tif (isRTL) {\n\t\t\tnormalizedScrollLeft = Math.abs(scrollLeft);\n\t\t}\n\t\tif (this.scrollLeft !== normalizedScrollLeft) {\n\t\t\tthis.onHScroll(null);\n\t\t}\n\t\tif (this.scrollTop !== scrollTop) {\n\t\t\tthis.onVScroll();\n\t\t}\n\n\n\t\tconst scrollHolderClientWidth = scrollHolderElement.clientWidth;\n\t\tconst scrollHolderScrollWidth = scrollHolderElement.scrollWidth;\n\t\tconst scrollHolderClientHeight = scrollHolderElement.clientHeight;\n\t\tconst scrollHolderScrollHeight = scrollHolderElement.scrollHeight;\n\t\tif(this.isGridScrollableFlag == false && (scrollHolderClientWidth < scrollHolderScrollWidth  || scrollHolderClientHeight < scrollHolderScrollHeight)){\n\t\t\tthis.isGridScrollableFlag = true;\n\t\t\tthis.hookManager.executeAfterHook('onGridScrollReady', {});\n\t\t}\n\t}\n\n\tprivate observeResize(controllerHandler) {\n\t\tconst GridComponent  = controllerHandler.getGridController();\n\t\tconst scrollHolder   = GridComponent.getScrollHolder();\n\t\tconst resizeObserver = new ResizeObserver(() => {\n\t\t\tGridComponent.updateDimension();\n\t\t});\n\t\tresizeObserver.observe(scrollHolder);\n \n\n\t\tthis.addEventListener(Events.EVENT_LEFT_PINNED_WIDTH_CHANGED, this.handleScrollerResize.bind(this, controllerHandler));\n\t\tthis.addEventListener(Events.EVENT_RIGHT_PINNED_WIDTH_CHANGED, this.handleScrollerResize.bind(this, controllerHandler));\n\t\tthis.addEventListener(Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, this.handleScrollerResize.bind(this, controllerHandler));\n\t\tthis.addEventListener(Events.EVENT_COLUMN_HIDE, this.handleScrollerResize.bind(this, controllerHandler));\n\t\tthis.addEventListener(Events.EVENT_COLUMN_SHOW, this.handleScrollerResize.bind(this, controllerHandler));\n\t\tthis.addEventListener(Events.EVENT_HEADER_WIDTH_CHANGED, this.handleScrollerResize.bind(this, controllerHandler));\n\t\tthis.addEventListener(Events.EVENT_ROW_CONTAINER_HEIGHT_CHANGED, this.handleScrollerResize.bind(this, controllerHandler));\n\n\t\tthis.addDestroyFunc(() => {\n\t\t\tresizeObserver.disconnect();\n\t\t})\n\t}\n\n\taddSmoothScroll(element : HTMLElement, onScrollCallback : CallableFunction) : void {\n\t\t// this.addListener( element, 'scroll', (ev) => {\n\t\t// \t\twindow.requestAnimationFrame(() => {\n\t\t// \t\t\tonScrollCallback(ev);\n\t\t// \t\t});\n\t\t// \t}\n\t\t// );\n\n\t\taddSafePassiveEventListener(element, \"scroll\", (event) => {\n\t\t\t// if (!this.ticking) {\n\t\t\t\t// this.ticking = true;\n\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tonScrollCallback(event);\n\t\t\t\t\t// this.ticking = false;\n\t\t\t\t});\n\t\t\t// }\n\t\t});\n\n\t}\n \n\tprivate addScrollListener() {\n\t\tconst controllerHandler      = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\t// const centerHeaderController = controllerHandler.getCenterRowHeaderContainerController();\n\t\t// const centerContainer        = centerHeaderController.getViewPortContainer();\n\t\tconst centerController \t\t = controllerHandler.getCenterRowContainerController();\n\t\tconst centerContainer        = centerController.getViewPortContainer();\n\t\tconst GridComponent          = controllerHandler.getGridController();\n\t\tconst scrollHolder           = GridComponent.getScrollHolder();\n\t\tconst hScrollController      = controllerHandler.getHSComponent();\n\t\tconst vScrollController      = controllerHandler.getVSComponent();\n\t\tconst hScrollContainer       = hScrollController?.getViewport();\n\t\tconst vScrollContainer       = vScrollController?.getViewport();\n\n\t\tconst scrollCallback = (ev) => {\n\t\t\t// Mark which scroll directions need processing\n\t\t\tif(this.scrollPosition === 2) {\n\t\t\t\tthis.pendingVScroll = true;\n\t\t\t\tthis.pendingHScroll = true;\n\t\t\t}else if(this.scrollPosition === 3) {\n\t\t\t\tthis.pendingHScroll = true;\n\t\t\t}else if(this.scrollPosition === 4) {\n\t\t\t\tthis.pendingVScroll = true;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tthis.pendingVScroll = true;\n\t\t\t\tthis.pendingHScroll = true;\n\t\t\t}\n\t\t\t\n\t\t\t// Use RequestAnimationFrameHandler to throttle scroll handling with priority scheduling\n\t\t\tconst currentScrollTop = Math.round(this.gridScrollHolder.scrollTop);\n\t\t\tthis.rafHandler.setScrollTop(currentScrollTop);\n\t\t\t\n\t\t\t// Schedule scroll handling as high priority task\n\t\t\tthis.rafHandler.createTask(() => {\n\t\t\t\tif (this.pendingVScroll) {\n\t\t\t\t\tthis.pendingVScroll = false;\n\t\t\t\t\tthis.onVScroll(ev);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (this.pendingHScroll) {\n\t\t\t\t\tthis.pendingHScroll = false;\n\t\t\t\t\tthis.onHScroll(ev);\n\t\t\t\t}\n\t\t\t}, this.scrollTaskIndex++, Priority.high);\n\t\t}\n\n\t\tconst centerContainerScrollCallback = ()=>{\n\t\t\tscrollHolder.scrollLeft = centerContainer.scrollLeft;\n\t\t\tscrollHolder.scrollTop  = this.bodyViewPortElement.scrollTop;\n\t\t};\n\n\t\tconst hScrollCallback = () => {\n\t\t\tthis.scrollPosition = null;\n\t\t\tscrollHolder.scrollLeft = hScrollContainer.scrollLeft;\n\t\t}\n\n\t\tconst vScrollCallback = () => {\t\t\t\n\t\t\tthis.scrollPosition = null;\n\t\t\tconst scrollTop = Math.round(vScrollContainer.scrollTop);\n\t\t\t\n\t\t\tif (this.isUpdatingFromVSComponent) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tif (this.lastVSComponentScrollTop !== -1 && Math.abs(this.lastVSComponentScrollTop - scrollTop) < 1) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t// Use RequestAnimationFrameHandler for consistent task scheduling\n\t\t\tconst currentScrollHolderTop = Math.round(scrollHolder.scrollTop);\n\t\t\tif (Math.abs(currentScrollHolderTop - scrollTop) > 1) {\n\t\t\t\tthis.rafHandler.setScrollTop(scrollTop);\n\t\t\t\t\n\t\t\t\tthis.rafHandler.createTask(() => {\n\t\t\t\t\tif (this.isUpdatingFromVSComponent) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tconst currentScrollTop = Math.round(vScrollContainer.scrollTop);\n\t\t\t\t\tconst currentScrollHolderTop = Math.round(scrollHolder.scrollTop);\n\t\t\t\t\t\n\t\t\t\t\tif (this.lastVSComponentScrollTop !== -1 && Math.abs(this.lastVSComponentScrollTop - currentScrollTop) < 1) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (Math.abs(currentScrollHolderTop - currentScrollTop) > 1) {\n\t\t\t\t\t\tthis.isUpdatingFromVSComponent = true;\n\t\t\t\t\t\tthis.lastVSComponentScrollTop = currentScrollTop;\n\t\t\t\t\t\t\n\t\t\t\t\t\tscrollHolder.scrollTop = currentScrollTop;\n\t\t\t\t\t\tthis.bodyViewPortElement.scrollTop = currentScrollTop;\n\t\t\t\t\t\tthis.nextScrollTop = currentScrollTop;\n\t\t\t\t\t\tthis.scrollGridIfNeeded();\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Use low priority for cleanup task\n\t\t\t\t\t\tthis.rafHandler.createTask(() => {\n\t\t\t\t\t\t\tthis.isUpdatingFromVSComponent = false;\n\t\t\t\t\t\t}, 0, Priority.low);\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.dispatchEvent({\n\t\t\t\t\t\t\ttype      : Events.EVENT_VERTICAL_SCROLL,\n\t\t\t\t\t\t\tscrollTop : currentScrollTop\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis.optionsHandler.on('gridScroll', { type : 'vertical' });\n\t\t\t\t\t}\n\t\t\t\t}, 0, Priority.high);\n\t\t\t}\n\t\t}\n\n\t\taddSafePassiveEventListener(this.gridScrollHolder, \"scroll\", scrollCallback);\n\t\taddSafePassiveEventListener(centerContainer, \"scroll\", centerContainerScrollCallback);\n\t\thScrollController && addSafePassiveEventListener(hScrollContainer,\"scroll\", hScrollCallback.bind(this));\n\t\tvScrollController && addSafePassiveEventListener(vScrollContainer,\"scroll\",  vScrollCallback.bind(this));\n\n\t\tthis.gridScrollHolder.addEventListener('wheel', (event) => {\n\t\t\tconst { deltaX, deltaY } = normalizeWheelDeltasForShiftScroll(event);\n\n\t\t\tif (deltaX !== 0 && deltaY !== 0) {\n\t\t\t\tthis.scrollPosition = 2; //bidirection\n\t\t\t} else if (Math.abs(deltaY) > Math.abs(deltaX)) {\n\t\t\t\tthis.scrollPosition = 4;// vertical\n\t\t\t} else if (Math.abs(deltaX) > Math.abs(deltaY)) {\n\t\t\t\tthis.scrollPosition = 3;//horizontal\n\t\t\t}\n\t\t}, { passive: true });\n\t}\n\n\tonVScroll(_ev ?: Event) {\n\t\tif (this.isUpdatingFromVSComponent) {\n\t\t\treturn; \n\t\t}\n\t\t\n\t\t// Batch DOM reads - read once\n\t\tconst scrollTop: number = Math.round(this.gridScrollHolder.scrollTop);\n\t\tconst currentScrollTop = this.getScrollTop();\n\t\t\n\t\t// Early exit if scroll position hasn't changed\n\t\tif(scrollTop === currentScrollTop) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tconst VSComponent = controllerHandler.getVSComponent();\n\t\tconst vScrollContainer = VSComponent?.getViewport();\n\t\t\n\t\t// Batch DOM writes\n\t\tthis.bodyViewPortElement.scrollTop = scrollTop;\n\t\t\n\t\t\tif (VSComponent && vScrollContainer) {\n\t\t\t\tconst currentVSComponentTop = Math.round(vScrollContainer.scrollTop);\n\t\t\t\tif (Math.abs(currentVSComponentTop - scrollTop) > 1) {\n\t\t\t\t\tthis.isUpdatingFromVSComponent = true;\n\t\t\t\t\tthis.lastVSComponentScrollTop = scrollTop;\n\t\t\t\t\tVSComponent.setScrollTop(scrollTop);\n\t\t\t\t\t// Use low priority for cleanup task\n\t\t\t\t\tthis.rafHandler.createTask(() => {\n\t\t\t\t\t\tthis.isUpdatingFromVSComponent = false;\n\t\t\t\t\t}, 0, Priority.low);\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\tthis.nextScrollTop = scrollTop;\n\t\tconst needsScrollUpdate = this.scrollGridIfNeeded();\n\n\t\t// Only dispatch events if scroll actually changed the viewport\n\t\tif (needsScrollUpdate) {\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype      : Events.EVENT_VERTICAL_SCROLL,\n\t\t\t\tscrollTop : scrollTop\n\t\t\t});\n\t\t\tthis.optionsHandler.on('gridScroll', { type : 'vertical' });\n\t\t}\n\t}\n\t\n\n\t// private setScrollPosition(setScrollCallback : CallableFunction) : void {\n\t// \tif (!this.ticking) {\n\t// \t\twindow.requestAnimationFrame(() => {\n\t// \t\t\tsetScrollCallback();\n\t// \t\t\tthis.ticking = false;\n\t// \t\t});\n\t// \t\tthis.ticking = true;\n\t// \t}\n\t// }\n\n\tsetVerticalScrollPosition(scrollPosition: number): void {\n\t\tthis.gridScrollHolder.scrollTop = scrollPosition;\n\t}\n\n\tscrollBy(x : number,y : number): void {\n\t\tthis.scrollPosition = null;\n\t\tconst isRTL = this.optionsHandler.isRTL();\n\t\tthis.scrollPosition = null;\n\t\tif (isRTL) {\n\t\t\tthis.gridScrollHolder.scrollBy(-x, y);\n\t\t} else {\n\t\t\tthis.gridScrollHolder.scrollBy(x, y);\n\t\t}\n\t}\n\n\tscrollTo(x: number = null, y: number = null): void {\n\t\tconst isRTL = this.optionsHandler.isRTL();\n\t\tthis.scrollPosition = null;\n\t\tif(x != null) {\n\t\t\tx = isRTL ? -x : x;\n\t\t\tthis.gridScrollHolder.scrollLeft = x;\n\t\t}\n\t\tif (y != null) {\n\t\t\tthis.gridScrollHolder.scrollTop = y;\n\t\t}\n\t}\n\n\t\n\tsetScrollLeft(scrollLeft: number): void {\n\t\tthis.scrollLeft = scrollLeft\n\t\tscrollLeft != null && (this.gridScrollHolder.scrollLeft = scrollLeft);\n\t}\n\n\tsetScrollTop(scrollTop: number): void {\n\t\tthis.scrollTop = scrollTop\n\t\tscrollTop != null && (this.gridScrollHolder.scrollTop = scrollTop);\t\n\t}\n\n\tsetHorizontalScrollPosition(scrollPosition: number): void {\n\t\tconst isRTL = this.optionsHandler.isRTL();\n\t\tif (isRTL) {\n\t\t\tthis.gridScrollHolder.scrollLeft = -scrollPosition;\n\t\t} else {\n\t\t\tthis.gridScrollHolder.scrollLeft = scrollPosition;\n\t\t}\n\t}\n\n \tprivate scrollGridIfNeeded(): boolean {\n\t\tconst frameNeeded = this.scrollTop != this.nextScrollTop;\n\n\t\tif (frameNeeded) {\n\t\t\tthis.scrollTop = this.nextScrollTop;\n\t\t\tthis.eventHandler.dispatchEvent({\n\t\t\t\ttype: 'BODY_SCROLL',\n\t\t\t});\n\t\t}\n\n\t\treturn frameNeeded;\n\t}\n\n\tprivate onHScroll(_ev : Event) {\n\t\t// Batch DOM read - read once\n\t\tconst scrollLeft: number = this.gridScrollHolder.scrollLeft;\n\t\tconst isRTL = this.optionsHandler.isRTL();\n\n\t\tlet normalizedScrollLeft = scrollLeft; // new variable to differ between rtl and ltr\n\t\tif(isRTL) {\n\t\t\tnormalizedScrollLeft = Math.abs(scrollLeft);\n\t\t}\n\t\tnormalizedScrollLeft = Math.round(normalizedScrollLeft);\n\t\t\n\t\t// Early exit if scroll position hasn't changed\n\t\tif (this.scrollLeft === normalizedScrollLeft) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n\t\tconst centerHeaderController         = controllerHandler.getCenterRowHeaderContainerController();\n\t\tconst topCenterController            = controllerHandler.getTopCenterRowContainerController();\n\t\tconst centerController               = controllerHandler.getCenterRowContainerController();\n\t\tconst bottomCenterController         = controllerHandler.getBottomCenterRowContainerController();\n\t\tconst summaryCenterController        = controllerHandler.getSummaryCenterRowContainerController();\n\t\tconst floatingRecordCenterController = controllerHandler.getFloatingRecordCenterRowContainerController();\n\t\tconst scrollPane \t\t\t\t  = controllerHandler.getHSComponent();\n\t\t\n\t\tthis.nextScrollLeft = normalizedScrollLeft;\n\n\t\t// Batch DOM writes - update all scroll positions together\n\t\t[centerHeaderController, centerController, topCenterController, bottomCenterController, summaryCenterController, floatingRecordCenterController, scrollPane].forEach((controller) => {\n\t\t\tcontroller && controller.setScrollLeft(normalizedScrollLeft);\n\t\t});\n\n\t\tthis.scrollLeft = this.nextScrollLeft;\n\t\tthis.dispatchEvent({\n\t\t\ttype : Events.EVENT_HORIZONTAL_SCROLL,\n\t\t\tscrollLeft : scrollLeft\n\t\t})\n\n\t\t\tthis.optionsHandler.on('gridScroll', { type : 'horizontal' });\n\t}\n\n\tensureIndexVisible(index: number, parentKeys : string[] = [],  position?: 'top' | 'bottom' | 'middle' | null, immediateScrollPropagate = false, pinPosition?: rowPinPositions) {\n\t\tthis.scrollPosition = null;\n\t\tconst recordHandler       = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n\t\tconst rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n\n\t\tconst rowCount = recordHandler.getTotalCount();\n\t\n\t\tif (typeof index !== 'number' || index < 0 || index >= rowCount) {\n\t\t\treturn;\n\t\t}\n\t\n\t\tconst centerHandler = recordHandler.getMiddleHandler();\n\t\tconst absoluteIndex = centerHandler.getAbsoluteIndex(index, parentKeys, pinPosition);\n\t\tconst rowTop        = centerHandler.getTop(absoluteIndex);\n\t\tconst rowHeight     = centerHandler.getHeight(absoluteIndex);\n\n\t\tlet rowPositionChangedDuringOperation: boolean;\n\t\n\t\tdo {\n\t\t\tconst startingRowTop = rowTop;\n\t\t\tconst startingRowHeight = rowHeight;\n\t\n\t\t\tconst rowTopPixel = rowTop!;\n\t\t\tconst rowBottomPixel = rowTopPixel + rowHeight!;\n\t\n\t\t\tconst scrollPosition = this.getVScrollPosition();\n\t\n\t\t\tconst vScrollTop = scrollPosition.top;\n\t\t\tconst vScrollBottom = scrollPosition.bottom;\n\t\n\t\t\tconst viewportHeight = vScrollBottom - vScrollTop;\n\t\n\t\t\tconst pxTop = rowTopPixel;\n\t\t\tconst pxBottom = rowBottomPixel - viewportHeight;\n\t\t\tconst pxMiddle = Math.min((pxTop + pxBottom) / 2, rowTopPixel);\n\t\n\t\t\tconst rowAboveViewport = (vScrollTop) > rowTopPixel;\n\t\t\tconst rowBelowViewport = vScrollBottom < rowBottomPixel;\n\t\n\t\t\tlet newScrollPosition: number | null = null;\n\t\n\t\t\tif (position === 'top') {\n\t\t\t\tnewScrollPosition = pxTop;\n\t\t\t} else if (position === 'bottom') {\n\t\t\t\tnewScrollPosition = pxBottom;\n\t\t\t} else if (position === 'middle') {\n\t\t\t\tnewScrollPosition = pxMiddle;\n\t\t\t} else if (rowAboveViewport) {\n\t\t\t\tnewScrollPosition = pxTop;\n\t\t\t} else if (rowBelowViewport) {\n\t\t\t\tnewScrollPosition = pxBottom;\n\t\t\t}\n\t\n\t\t\tif (newScrollPosition !== null) {\n\t\t\t\tthis.setVerticalScrollPosition(newScrollPosition);\n\t\n\t\t\t\timmediateScrollPropagate && this.onVScroll() // fix to make both grid body and inner scroll before calcing the position of popup. //Otherwise popuphandler have to change which effect all over\n\t\t\t\t\n\t\t\t\trowRenderController.refresh({});\n\t\t\t}\n\t\n\t\t\trowPositionChangedDuringOperation = (startingRowTop !== rowTop) || (startingRowHeight !== rowHeight);\n\t\n\t\t} while (rowPositionChangedDuringOperation);\n\t}\n\n\tensureColumnVisible(key: any, position: 'auto' | 'start' | 'middle' | 'end' = 'auto'): void {\n\t\tthis.scrollPosition = null;\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n        const column = fieldHandler.getColumnNodeByID(key);\n\n        if (!column) {\n            return;\n        }\n\n        if (column.getPinnedPosition() !== 'center') {\n            return;\n        }\n\n        const newHorizontalScroll: number | null = this.calculateHorizontalScrollPosition(column, position);\n\n        if (newHorizontalScroll !== null) {\n\t\t\t// const controllerHandler              = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\t\t// const HSComponenet                   = controllerHandler.getHSComponent();\n\t\t\t// const centerController               = controllerHandler.getCenterRowContainerController();\n\t\t\t// const topCenterController            = controllerHandler.getTopCenterRowContainerController();\n\t\t\t// const bottomCenterController         = controllerHandler.getBottomCenterRowContainerController();\n\t\t\t// const centerHeaderController         = controllerHandler.getCenterRowHeaderContainerController();\n\t\t\t// const summaryCenterController        = controllerHandler.getSummaryCenterRowContainerController();\n\t\t\t// const floatingRecordCenterController = controllerHandler.getFloatingRecordCenterRowContainerController();\n\t\t\t// centerHeaderController.setScrollLeft(newHorizontalScroll);\n\t\t\t// centerController.setScrollLeft(newHorizontalScroll);\n\t\t\t// topCenterController.setScrollLeft(newHorizontalScroll);\n\t\t\t// bottomCenterController.setScrollLeft(newHorizontalScroll);\n\t\t\t// summaryCenterController.setScrollLeft(newHorizontalScroll);\n\t\t\t// HSComponenet.setScrollLeft(newHorizontalScroll);\n\t\t\t// floatingRecordCenterController.setScrollLeft(newHorizontalScroll);\n\t\t\tthis.gridScrollHolder.scrollLeft = newHorizontalScroll;\n\t\t\tthis.onHScroll(null);\n\t\t}\n    }\n\n\tprivate calculateHorizontalScrollPosition(column: IColumnNode, position: 'auto' | 'start' | 'middle' | 'end'): number | null {\n\t\tconst suppressVerticalScrollBar  = this.optionsHandler.isSuppressVerticalScroll();\n\t\tconst { isBeforeViewportStart, isAfterViewportEnd } = this.isColumnOutOfViewport(column);\n\t\tconst viewportWidth = this.centerRowContainerController.getCenterWidth();\n\t\tconst isRtl = this.optionsHandler.isRTL();\n\t\n\t\tlet scrollToColumnStart = (isRtl ? isBeforeViewportStart : isAfterViewportEnd) || (viewportWidth < column.getWidth());\n\t\tlet scrollToColumnEnd = isRtl ? isAfterViewportEnd : isBeforeViewportStart;\n\t\n\t\tif (position === 'start') {\n\t\t\treturn scrollToColumnStart ? this.getColumnStartPosition(column, isRtl) : null;\n\t\t} else if (position === 'end') {\n\t\t\treturn scrollToColumnEnd ? this.getColumnEndPosition(column, isRtl, viewportWidth) : null;\n\t\t} else if (position === 'middle') {\n\t\t\treturn this.getColumnMiddlePosition(column, viewportWidth, isRtl);\n\t\t} else {\n\t\t\tconst {isAfterViewportEnd, isBeforeViewportStart} = this.isColumnOutOfViewport(column);\n\n\t\t\tlet alignColToStart = (isRtl ? isBeforeViewportStart : isAfterViewportEnd) || (viewportWidth < column.getWidth());\n        \tlet alignColToEnd = isRtl ? isAfterViewportEnd : isBeforeViewportStart;\n\n\t\t\tif(alignColToStart || alignColToEnd) {\n\t\t\t\tconst {columnEnd, columnStart} = this.getColumnEdges(column);\n\t\t\t\tif(alignColToStart) {\n\t\t\t\t\treturn isRtl ? columnEnd : columnStart;\n\t\t\t\t}\n\t\t\t\treturn isRtl ? columnStart - viewportWidth : suppressVerticalScrollBar ? columnEnd - viewportWidth :  columnEnd - viewportWidth + 16;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t\n\t\treturn null;\n\t}\n\t\n\tprivate isColumnOutOfViewport(column: IColumnNode): { isBeforeViewportStart: boolean; isAfterViewportEnd: boolean } {\n\t\tconst { viewportStart, viewportEnd } = this.getViewportEdges();\n\t\tconst { columnStart, columnEnd }     = this.getColumnEdges(column);\n\t\tconst isRtl                          = this.optionsHandler.isRTL();\n\t\n\t\treturn {\n\t\t\tisBeforeViewportStart: isRtl ? viewportStart > columnEnd : viewportEnd < columnEnd,\n\t\t\tisAfterViewportEnd: isRtl ? viewportEnd < columnStart : viewportStart > columnStart\n\t\t};\n\t}\n\t\n\tprivate getColumnEdges(column: IColumnNode): { columnStart: number; columnEnd: number} {\n\t\tconst fieldHandler        = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst isRtl               = this.optionsHandler.isRTL();\n\t\tconst bodyWidth           = fieldHandler.getBodyContainerWidth();\n\t\tconst columnWidth         = column.getWidth();\n\t\tconst columnLeft          = column.getLeft()!;\n\t\tconst directionMultiplier = isRtl ? -1 : 1;\n\t\n\t\tconst columnStart = isRtl ? bodyWidth - columnLeft : columnLeft;\n\t\tconst columnEnd = columnStart + columnWidth * directionMultiplier;\n\t\n\t\treturn { columnStart, columnEnd };\n\t}\n\t\n\tprivate getColumnStartPosition(column: IColumnNode, isRtl: boolean): number {\n\t\treturn isRtl ? this.getColumnEdges(column).columnEnd : this.getColumnEdges(column).columnStart;\n\t}\n\t\n\tprivate getColumnEndPosition(column: IColumnNode, isRtl: boolean, viewportWidth: number): number {\n\t\tconst { columnStart, columnEnd } = this.getColumnEdges(column);\n\t\treturn isRtl ? columnStart - viewportWidth : columnEnd - viewportWidth;\n\t}\n\t\n\tprivate getColumnMiddlePosition(column: IColumnNode, viewportWidth: number, isRtl: boolean): number {\n\t\tconst { columnStart, columnEnd } = this.getColumnEdges(column);\n\t\treturn columnStart + ((columnEnd - columnStart - viewportWidth) / 2) * (isRtl ? -1 : 1);\n\t}\n\t\n\tprivate getViewportEdges(): { viewportStart: number; viewportEnd: number } {\n\t\tconst viewportWidth = this.centerRowContainerController.getCenterWidth();\n\t\tconst scrollLeft = this.centerRowContainerController.getScrollLeftPosition();\n\t\n\t\treturn {\n\t\t\tviewportStart: scrollLeft,\n\t\t\tviewportEnd: viewportWidth + scrollLeft\n\t\t};\n\t}\n\t\n\n\tgetVScrollPosition(): { top: number, bottom: number; } {\n        const result = {\n            top: this.gridScrollHolder.scrollTop,\n            bottom: this.gridScrollHolder.scrollTop + this.bodyViewPortElement.offsetHeight\n        };\n        return result;\n    }\n\n\tgetScrollTop(): number {\n\t\treturn  this.scrollTop\n\t}\n\n\tgetScrollLeft(): number {\n\t\treturn this.scrollLeft;\n\t}\n\n\tgetHScrollPosition(): { left: number; right: number } {\n\t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tconst centerRowContainerController = controllerHandler.getCenterRowContainerController();\n\t\tconst scrollPosition = centerRowContainerController.getHScrollPosition();\n\t\t\n\t\tconst isRTL = this.optionsHandler.isRTL();\n\t\tif (isRTL) {\n\t\t\treturn {\n\t\t\t\tleft: Math.abs(scrollPosition.left),\n\t\t\t\tright: Math.abs(scrollPosition.right)\n\t\t\t};\n\t\t}\n\t\t\n\t\treturn scrollPosition;\n    }\n\tgetScrollPosition(): ScrollPositionType {\n\t\treturn {\n\t\t\ttop: this.scrollTop,\n\t\t\tleft: this.scrollLeft\n\t\t}\n\t}\n\t\n}\n","import { GridComponent } from \"../GridComponent/GridComponent\";\nimport { createComponentList } from \"../GridComponentRegister\";\nimport { PinnedHandler } from \"./Columns/PinnedHandler\";\nimport { ControllerHandler } from \"./ControllerHandler/ControllerHandler\";\nimport { FieldHandler } from \"./Columns/FieldHandler\";\nimport { RecordHandler } from \"./Rows/RecordHandler\";\nimport { RowModel } from \"./Rows/RowModel\";\nimport { RowRenderController } from \"./Rows/RowRenderController\";\nimport { ColumnHoverHandler } from \"./ColumnHoverHandler\";\nimport { StylingHandler } from \"./StylingHandler\";\nimport { AbsolutePositionHandler } from \"./AbosultePositionHandler\";\nimport { PopupHandler } from \"./PopupHandler\";\nimport { HookManager } from \"./Hooks/HookManager\";\nimport { GridEvents } from \"./Events/Events\";\nimport { GridApi } from \"../API/GridApi\";\nimport { IGridConfiguration, IKeyBoardShortcutsParams, IRowModel } from \"./Interface/IGridConfiguration\";\nimport { traverseObject } from \"./utils/Generic\";\nimport { RowBufferHandler } from \"./Buffer/row/RowBufferHandler\";\nimport { ColumnBufferHandler } from \"./Buffer/column/ColumnBufferHandler\";\nimport { UserPresenceHandler } from \"./UserPresence/UserPresenceHandler\";\nimport { FloatingRecordHandler } from \"../FloatingRecords/FloatingRecordHandler\";\nimport { RowMovedRenderer } from \"../Components/RowMovedRenderer\";\nimport { CellLoading } from \"../Components/CellComponents/CellLoading\";\nimport { GridExperimentalAPI } from \"../API/GridExperimentalAPI\";\nimport { BEAN_NAME, ComponentsRegistry, Context, UserComponentRegistry, VanillaFrameWorkOverrider } from \"@dg/corecomponent\";\nimport { GridUserComponentHandler, PropertyName } from \"./Components/UserComponentHandler\";\nimport { GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { GridUserComponentRegistry } from \"./Components/UserComponentRegistry\";\nimport { CellAPIManager } from \"../API/CellAPI/CellAPIManager\";\nimport { APIHandler } from \"../API/APIHandler\";\nimport { FloatingRowAPI } from \"../API/FloatingRowAPI/FloatingRowAPIManager\";\nimport { ReorderableAPI } from \"../API/ReorderableAPI/ReorderableAPI\";\nimport { GridEventHanlder } from \"../GridEventHandler\";\nimport { RowAPIManager } from \"../API/RowAPI/RowAPIManager\";\nimport { SelectionHandler } from \"./Navigation/SelectionHandler\";\nimport { ExtraRowComponent } from \"./Components/ExtraRecordController/ExtraRecordComponent\";\nimport { ColumnHandler } from \"./Columns/ColumnHandler\";\nimport { ColumnDataTypeHandler } from \"./Columns/ColumnDataTypeHandler\";\nimport { FullWidthGroupCellRenderer } from \"../Components/GroupCellRenderer/FullWidthGroupCellRenderer\";\nimport { IUserParams } from \"../../../Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text-core-component\";\nimport { ModuleRegistry } from \"./ModuleRegistry\";\nimport { IModule } from \"../../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\nimport { ColumnSizeHandler } from \"./Columns/ColumnSizeHandler\";\nimport { ResizeObserverHandler } from \"./ResizeObserver\";\nimport { IControllerHandler } from \"./Interface/IControllerHandler\";\nimport { ActionRegistry } from \"./actions/action-registry\";\nimport { KeyboardShortcutRegistry } from \"./actions/key-board-shortcut-registry\";\nimport { FocusHandler } from \"./Navigation/focus-handler\";\nimport { DragHandler } from \"../../drag-handler/drag-handler\";\nimport { StickyRowRenderer } from \"../../sticky-row/sticky-row-renderer\";\nimport { GridKeyBoardNavigation } from \"../../Navigation/grid-key-board-navigation\";\nimport { DragAndDropHandler } from \"../../DragAndDrop-handler/dragAndDrop-handler\";\nimport { ColumnAPIManager } from \"../API/ColumnAPI/ColumnAPIManager\";\nimport { SortApiManager } from \"../API/SortAPI/SortApiManager\";\nimport { FilterApiManager } from \"../API/FilterAPI/FilterApiManager\";\nimport { RowGroupingApiManager } from \"../API/RowGroupingAPI/RowGroupingApiManager\";\nimport { NavigationAPI } from \"../API/navigation/navigation-api\";\nimport { RangeSelectionAPI } from \"../API/RangeSelectionAPI/range-selection-api\";\nimport { PinningAPIManager } from \"../API/PinningAPI/PinningAPIManager\";\nimport { APIErrorHandler } from \"../API/APIErrorHandler\";\nimport { UserPresenceAPI } from \"../API/user-presence/user-presence-api\";\nimport { GridSerializer } from \"../../clipboard/grid-serializer\";\nimport { TableSerializing } from \"../../clipboard/table-serializing\";\nimport { CSVSerializing } from \"../../clipboard/csv-serializing\";\nimport { CSVcreator } from \"../../clipboard/csv-creator\";\nimport { ClipBoardHandler } from \"../../clipboard/clipboard-handler\";\nimport { TableCreator } from \"../../clipboard/table-creator\";\nimport { ClipboardAPI } from \"../API/ClipboardAPI/ClipboardAPIManager\";\nimport { ColumnVisibleHandler } from \"./Columns/column-visible-handler\";\nimport { GridCellEditorHandler } from \"../GridComponent/Editor/GridCellEditorHandler\";\nimport { KeyboardShortcuts } from \"./key-board-shortcut\";\nimport { RowSelectionIndexHandler } from \"../../Selection/row-selection/row-selection-index\";\nimport { RowHoverHandler } from \"./RowHoverHandler\";\nimport { ColumnAutofitHandler } from \"../../Autofit/ColumnAutofit/column-autofitHandler\";\nimport { CellRenderer } from \"../Components/CellComponents/CellRenderer\";\nimport { GridEscapeHandler } from \"../GridEscapeHandler\";\nimport { GridComponentMetadataProvider } from \"./Components/GridComponentMetadataProvider\";\nimport { MinSpareHandler } from \"./MinSpareHandler/min-spare-handler\";\nimport { RowReorderRenderer } from \"../Components/RowReorderRenderer\";\nimport { ColumnReorderRenderer } from \"../Components/ColumnReorderRenderer\";\nimport { GRID_ELEMENT_NAMES } from \"./Constants/GridConfigurationConstants\";\nimport { CellInnerNavigationController } from \"../GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellInnerNavigationController\";\nimport { NoRecordFoundRenderer } from \"../Components/NoRecordFoundRenderer\";\nimport { ListNavigationAPI } from \"../API/navigation/list-navigation-api\";\nimport { TreeApiManager } from \"../API/TreeAPI/TreeApiManager\";\nimport { RequestAnimationFrameHandler } from \"./RequestAnimationFrame/RequestAnimationFrameHandler\";\nimport { AutoUnpinnedLeftColumns } from \"./Columns/AutoUnpinnedLeftColumns\";\nimport { StateHandler } from \"./stateHandler\";\nimport { GridLayoutPositionHandler } from \"./GridLayoutPositionHandler\";\nimport { GanttStateHandler } from \"../../GanttModelClasses/Core/GanttStateHandler\";\nimport { TaskBarInteractionState } from \"../../GanttModelClasses/Core/TaskBarComponent/TaskBarInteractionState\";\n\nconst VIEW_TYPE = {\n    GRID : \"grid\",\n}\n\n\nlet nextInstanceId = 1;\nclass GridCoreComponent {\n    public initializeGrid(gridElement: HTMLElement, gridOptions : any, viewType : 'list' | 'gallery' | 'grid', callback : CallableFunction, params : IUserParams) : void {\n\t\tconst instanceID = gridOptions.instanceID ?? String(nextInstanceId++);\n\n\t\tconst userConfigurations = this.createUserCongiguration(gridElement, gridOptions, viewType, instanceID, params);\n\t\tconst registeredModules  = this.getRegisteredModules(params, instanceID);\n\t\tconst beanClasses        = this.createBeanClasses(viewType, gridOptions.rowModelType ,  gridOptions.selectionModel ,registeredModules);\n\n\t\tif (!beanClasses) {\n\t\t\treturn;\n\t\t}\n        const context = new Context();\n\n        context.registerBeanClasses(beanClasses, userConfigurations)\n        this.registerComponent(context);\n\n        this.registryDefaultComponent(context);\n\n\t\tthis.registerModuleUserComponents(context, registeredModules);\n\n\t\tthis.registerKeyBoardShortCuts(context);\n\n        /*This is likely creating and initializing the UI components for the grid using the `GridComponent` class. */\n        \n        const gridComponent = new GridComponent(gridElement);\n\n        context.createBean(gridComponent);\n\n\t\t// (window as any).gridContext = context;\n\n\t\tconst controllerHandler = context.getBean(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tcontrollerHandler.onAfterGridReady(() => {\n\t\t\tconst optionHandler      = context.getBean(BEAN_NAME.OPTION_HANDLER);\n\t\t\t\n\t\t\tthis.setColumnDef(context);\n\n\t\t\tthis.setRowData(context);\n\t\n\t\t\tthis.setRowBuffer(context, gridOptions);\n\t\n\t\t\tthis.setColumnBuffer(context, gridOptions);\n\t\n\t\t\tthis.registerStaticCache(context);\n\t\n\t\t\tthis.setContextAPI(context, callback);\n\n\t\t\t\n\t\t\toptionHandler.on(\"gridReady\", {instanceAPI : context.getBean(GRID_BEAN_NAME.API_HANDLER)});\n\n\t\t\tglobalThis.rowSelection = context.getBean('RowSelectionHandler');\n\t\t})\n    }\n\n\t\n\n    private registerStaticCache(context : Context) : void {\n\t\tconst recordHandler = context.getBean(GRID_BEAN_NAME.RECORD_HANDLER)\n\n\t\tconst rowRenderController = context.getBean(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n\n\t\tconst middleHandler = recordHandler.getMiddleHandler();\n\n\t\tconst firstRow = middleHandler.getFirstRow();\n\n\t\trowRenderController.addToStaticCache(firstRow);\n\n\t\tconst lastRow = middleHandler.getLastRow();\n\n\t\trowRenderController.addToStaticCache(lastRow);\n\t}\n\n    private setRowBuffer(context : Context, configuration : IGridConfiguration) : void {\n        const rowBufferHandler = context.getBean(GRID_BEAN_NAME.ROW_BUFFER_HANDLER) as RowBufferHandler;\n        rowBufferHandler.setRowBuffer(configuration);\n    }\n\n    private setColumnBuffer(context : Context, configuration : IGridConfiguration) : void {\n        const columnBufferHandler = context.getBean(GRID_BEAN_NAME.COLUMN_BUFFER_HANDLER) as ColumnBufferHandler;\n        columnBufferHandler.setColumnBuffer(configuration);\n    }\n\n    private setContextAPI(context  : Context, callback : CallableFunction) : void {\n        callback && callback(context);\n    }\n    private setRowData(context : Context) : void {\n        const rowModel    = context.getBean(GRID_BEAN_NAME.ROW_MODEL) as RowModel;\n        const gridOptions = context.getBean(GRID_BEAN_NAME.GRID_OPTIONS);\n        rowModel.setRowData(gridOptions);\n    }\n\n    private setColumnDef(context : Context) {\n        const columnModel = context.getBean(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n        columnModel.constructFieldInfoHandler();\n    } \n\n    private registerComponent(context : Context) {\n\t\tconst registry        = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n\t\tconst excludeElements = this.getExcludeElements(context);\n\t\tconst components      = createComponentList(excludeElements);\n        registry.setupComponents(components);\n    }\n\n\tprivate getExcludeElements(context : Context) {\n\t\tconst excludeElements : string[] = [];\n\t\tconst optionHandler              = context.getBean(BEAN_NAME.OPTION_HANDLER);\n\t\tconst excludeScrollbarForPinning = optionHandler.excludeScrollbarForPinning();\n\t\tconst isGantt = optionHandler.getViewType() === 'gantt';\n\t\tif(!excludeScrollbarForPinning) {\n\t\t\texcludeElements.push(GRID_ELEMENT_NAMES.HORIZONTAL_SCROLL, GRID_ELEMENT_NAMES.VERTICAL_SCROLL);\n\t\t}\n\t\tif(!isGantt) {\n\t\t\texcludeElements.push(GRID_ELEMENT_NAMES.GANTT_TIMELINE_HOLDER, GRID_ELEMENT_NAMES.GANTT_DEPENDENCY_MARK_CONTAINER, GRID_ELEMENT_NAMES.GANTT_CURRENT_TIME_INDICATOR);\n\t\t}\n\t\t// if(isGantt) {\n\t\t// \texcludeElements.push(GRID_ELEMENT_NAMES.NO_RECORD_CONTAINER);\n\t\t// }\n\t\t\n\t\treturn excludeElements;\n\t}\n\n    private createUserCongiguration(gridElement : HTMLElement, configuration : any, viewType : 'list' | \"gallery\" | 'grid' , instanceID :string, params : IUserParams = {}) : any {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider() as any;\n\t\t}\n        return {\n            gridElement,\n            configuration,\n\t\t\tviewType,\n\t\t\tinstanceID,\n\t\t\tframeWorkOverrides,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n        }\n    }\n\n    private createBeanClasses(viewType: any = VIEW_TYPE.GRID, model: IRowModel = 'local', selectionModel : 'index' | 'id'  = 'index', registeredModules: IModule[]): Set<any> | undefined {\n\t\tconst modelModules          = registeredModules.filter(module => !module.modelType || module.modelType === viewType);\n\t\tconst rowModelModules       = modelModules.filter(module => !module.rowModel || module.rowModel === model);\n\t\tconst selectionModelModules = rowModelModules.filter(module => !module.selectionModel || module.selectionModel === selectionModel);\n\t\n\t\tif (selectionModelModules.length === 0) {\n\t\t\tconsole.error(`Could not find model for viewType = ${viewType}`);\n\t\t\treturn undefined;\n\t\t}\n\t\n\t\tconst modelModuleNames: Record<string, string> = {\n\t\t\tgrid    : \"grid\",\n\t\t\tgallery : \"gallery\",\n\t\t\tlist    : \"list\"\n\t\t};\n\n\t\tconst modelNames = {\n\t\t\tlocal : 'local',\n\t\t\tremote : 'remote'\n\t\t}\n\n\n\t\tif(!modelNames[model]) {\n\t\t\tconsole.error(`Could not find model for rowModel = ${model}`);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!modelModuleNames[viewType]) {\n\t\t\tconsole.error(`Could not find model for viewType = ${viewType}`);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif(!(selectionModel === 'index' || selectionModel === \"id\")) {\n\t\t\tconsole.error(`Could not find model for selectionModel = ${selectionModel}`);\n\t\t\treturn undefined;\n\t\t}\n\t\n\t\tconst beans = this.getBeanClasses();\n\t\tconst moduleBeans = this.extractModuleEntity(selectionModelModules, module => module.beans || []);\n\t\tmoduleBeans.forEach(moduleBean => beans.add(moduleBean));\n\t\n\t\treturn beans;\n\t}\n\t\n\n\tprivate extractModuleEntity(moduleEntities: any[], extractor: (module: any) => any) {\n        return [].concat(...moduleEntities.map(extractor));\n    }\n\n\tprivate getBeanClasses() {\n\t\tconst beans = new Set([\n\t\t\tGridEventHanlder,\n\t\t\tComponentsRegistry,\n\t\t\tControllerHandler,\n\t\t\tPinnedHandler,\n\t\t\tRowRenderController,\n\t\t\tRowModel,\n\t\t\tGridUserComponentHandler,\n\t\t\tGridComponentMetadataProvider,\n\t\t\tRecordHandler,\n\t\t\tFieldHandler,\n\t\t\t// GridModelProvider,\n\t\t\tColumnHoverHandler,\n\t\t\tStylingHandler,\n\t\t\tAbsolutePositionHandler,\n\t\t\tPopupHandler,\n\t\t\tHookManager,\n\t\t\tGridEvents,\n\t\t\tGridApi,\n\t\t\tRowBufferHandler,\n\t\t\tGridUserComponentRegistry,\n\t\t\tColumnBufferHandler,\n\t\t\tUserPresenceHandler,\n\t\t\tFloatingRecordHandler,\n\t\t\tGridExperimentalAPI,\n\t\t\tAPIHandler,\n\t\t\tCellAPIManager,\n\t\t\tFloatingRowAPI,\n\t\t\tReorderableAPI,\n\t\t\tRowAPIManager,\n\t\t\tFloatingRowAPI,\n\t\t\tSortApiManager,\n\t\t\tFilterApiManager,\n\t\t\tPinningAPIManager,\n\t\t\tRowGroupingApiManager,\n\t\t\tSelectionHandler,\n\t\t\tExtraRowComponent,\n\t\t\tColumnHandler,\n\t\t\tColumnDataTypeHandler,\n\t\t\tColumnSizeHandler,\n\t\t\tResizeObserverHandler,\n\t\t\tActionRegistry,\n\t\t\tKeyboardShortcutRegistry,\n\t\t\tFocusHandler,\n\t\t\tDragHandler,\n\t\t\tStickyRowRenderer,\n\t\t\tGridKeyBoardNavigation,\n\t\t\tDragAndDropHandler,\n\t\t\tColumnAPIManager,\n\t\t\tNavigationAPI,\n\t\t\tRangeSelectionAPI,\n\t\t\tAPIErrorHandler,\n\t\t\tUserPresenceAPI,\n\t\t\tGridSerializer,\n\t\t\tCSVcreator,\n\t\t\tClipBoardHandler,\n\t\t\tTableCreator,\n\t\t\tClipboardAPI,\n\t\t\tColumnVisibleHandler,\n\t\t\tGridCellEditorHandler,\n\t\t\tRowSelectionIndexHandler,\n\t\t\tRowHoverHandler,\n\t\t\tColumnAutofitHandler,\n\t\t\tGridEscapeHandler,\n\t\t\tCellInnerNavigationController,\n\t\t\tMinSpareHandler,\n\t\t\tMinSpareHandler,\n\t\t\tListNavigationAPI,\n\t\t\tGridLayoutPositionHandler,\n\t\t\tTreeApiManager,\n\t\t\tRequestAnimationFrameHandler,\n\t\t\tStateHandler,\n\t\t\tAutoUnpinnedLeftColumns,\n\t\t\tGanttStateHandler,\n\t\t\tTaskBarInteractionState\n\t\t]);\n\n\t\treturn beans;\n\t}\n\n    private registryDefaultComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean( BEAN_NAME.USER_COMPONENT_REGISTRY ) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n\t\t\trowMovedRenderer                           : RowMovedRenderer,\n\t\t\tcellLoadingRenderer                        : CellLoading,\n\t\t\tdgFullWidthLoadingRenderer                 : CellLoading,\n\t\t\tcellRenderer                               : CellRenderer,\n\t\t\t[PropertyName.FULL_WIDTH_GROUPING_RENDERER]: FullWidthGroupCellRenderer,\n\t\t\t[PropertyName.ROW_REORDER_RENDERER]        : RowReorderRenderer,\n\t\t\t[PropertyName.COLUMN_REORDER_RENDERER]     : ColumnReorderRenderer,\n\t\t\t[PropertyName.NO_RECORD_RENDERER] : NoRecordFoundRenderer\n\t\t};\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n\n\tprivate getRegisteredModules( params: IUserParams | undefined, instanceID: string, ): IModule[] {\n\t\tconst passedViaConstructor: IModule[] | undefined | null = params ? params.modules : null;\n\t\tconst registered = ModuleRegistry.__getRegisteredModules(instanceID);\n\n\t\tconst allModules: IModule[] = [];\n\t\tconst mapNames: { [name: string]: boolean } = {};\n\n\t\tconst addModule = (mod: IModule, instanceID: string | undefined) => {\n\t\t\tconst addIndividualModule = (currentModule: IModule) => {\n\t\t\t\tif (!mapNames[currentModule.moduleName]) {\n\t\t\t\t\tmapNames[currentModule.moduleName] = true;\n\t\t\t\t\tallModules.push(currentModule);\n\t\t\t\t\tModuleRegistry.__register(currentModule, instanceID);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\taddIndividualModule(mod);\n\t\t\tif (mod.dependantModules) {\n\t\t\t\tmod.dependantModules.forEach((m) => addModule(m, instanceID));\n\t\t\t}\n\t\t};\n\n\t\tif (passedViaConstructor) {\n\t\t\tpassedViaConstructor.forEach((m) => addModule(m, instanceID));\n\t\t}\n\n\t\tif (registered) {\n\t\t\tregistered.forEach((module) =>\n\t\t\t\taddModule( module, undefined),\n\t\t\t);\n\t\t}\n\n\t\treturn allModules;\n\t}\n\n\tprivate registerModuleUserComponents(context: Context, registeredModules: IModule[]): void {\n        const moduleUserComps: { componentName: string, componentClass: any; }[] = this.extractModuleEntity(registeredModules, (module : IModule) => module.userComponents ? module.userComponents : []);\n\t\tconst userComponentRegistry = context.getBean(BEAN_NAME.USER_COMPONENT_REGISTRY);\n        moduleUserComps.forEach(compMeta => {\n            userComponentRegistry.registerDefaultComponent(compMeta.componentName, compMeta.componentClass);\n        });\n    }\n\n\tprivate registerKeyBoardShortCuts(context: Context): void {\n\t\tconst keyBoardShortCutRegistry = context.getBean('keyBoardShortCutRegistry') as KeyboardShortcutRegistry;\n\t\tconst optionHandler = context.getBean(BEAN_NAME.OPTION_HANDLER);\n\t\tconst keyBoardShortCuts = optionHandler.getKeyBoardShortCuts();\n\t\tconst includeKeyboardShortCuts = optionHandler.getIncludeKeyboardShortcuts().map(s => s.toUpperCase());\n\t\tconst excludeKeyboardShortcuts = optionHandler.getExcludeKeyboardShortcuts().map(s => s.toUpperCase());\n\t\n\t\tconst filteredShortcuts = KeyboardShortcuts.filter((keyBoardShortCut: IKeyBoardShortcutsParams) => {\n\t\t\tconst shortcut = keyBoardShortCut.shortcut.toUpperCase();\n\t\n\t\t\tconst shouldInclude = !includeKeyboardShortCuts.length || includeKeyboardShortCuts.includes(shortcut);\n\t\t\tconst shouldExclude = excludeKeyboardShortcuts.includes(shortcut);\n\t\n\t\t\treturn shouldInclude && !shouldExclude;\n\t\t});\n\t\n\t\tfilteredShortcuts.forEach((keyBoardShortCut: IKeyBoardShortcutsParams) => {\n\t\t\tkeyBoardShortCutRegistry.registerShortcut(keyBoardShortCut.shortcut.toUpperCase(), keyBoardShortCut.action);\n\t\t});\n\t\n\t\tkeyBoardShortCuts.forEach((keyBoardShortCut: IKeyBoardShortcutsParams) => {\n\t\t\tkeyBoardShortCutRegistry.registerShortcut(keyBoardShortCut.shortcut.toUpperCase(), keyBoardShortCut.action);\n\t\t});\n\t}\n\t\n}\n\n(window as any).gridSerialing = new TableSerializing();\n(window as any).csvSerialing = new CSVSerializing({\n\tcolumnSeparator : '\\t',\n\tsuppressQuotes : true\n});\n\nexport {\n    GridCoreComponent\n}\n","import { AutoWired, Bean, BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { IGridLayoutPositionHandler } from \"./Interface/IGridLayoutPositionHandler\";\nimport { GridOptioHandler } from \"./GridOptionHandler\";\nimport { IColumnNode, IRowNode } from \"../ListMain\";\nimport { GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { FieldHandler } from \"./Columns/FieldHandler\";\nimport { RowContainerType } from \"../GridComponent/GridBodyComponent/RowContainer/utils/type\";\nimport { GroupRowNode } from \"../../DataStore/GroupRowNode\";\n@Bean(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER)\nexport class GridLayoutPositionHandler extends EventEmitter implements IGridLayoutPositionHandler {\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler   : GridOptioHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler: FieldHandler;\n\n    getLeft(rowNode : IRowNode, pinPosition : RowContainerType) : number | null {\n        let   rowLeft           = rowNode.getLeft();\n        const level             = rowNode.getLevel();\n        const isLeaf            = !rowNode.isGroupRow();\n        const marginLeft        = this.optionHandler.getTreeLevelLeftMargins(isLeaf ? level - 1 : level);\n        const headerColumnCount = this.fieldHandler.getHeaderSpanCount();\n        const leftColumnCount   = this.fieldHandler.getLeftSpanCount();\n        const centerColumnCount = this.fieldHandler.getCenterSpanCount();\n        const rightColumnCount  = this.fieldHandler.getRightSpanCount();\n\n\n\n        switch(pinPosition) {\n            case RowContainerType.HEADER:\n                if(headerColumnCount > 0) {\n                    rowLeft += marginLeft;\n                    return rowLeft;\n                }\n                \n            case RowContainerType.LEFT:\n                if(headerColumnCount === 0 && leftColumnCount > 0) {\n                    rowLeft += marginLeft;\n                    return rowLeft;\n                }\n            case RowContainerType.CENTER:\n                if(headerColumnCount === 0 && leftColumnCount === 0 && centerColumnCount > 0 ) {\n                    rowLeft += marginLeft;\n                    return rowLeft;\n                }\n            case RowContainerType.RIGHT: \n                if(headerColumnCount === 0 && leftColumnCount === 0 && centerColumnCount === 0 && rightColumnCount > 0) {\n                    rowLeft += marginLeft;\n                    return rowLeft;\n                }\n        }\n        return rowLeft;\n    }\n\n    getWidth(rowNode: IRowNode, pinPosition: RowContainerType): number | null {\n        let rowWidth = this.getFullWidth(pinPosition);\n        \n        const level        = rowNode.getLevel();\n        const isLeaf            = !rowNode.isGroupRow();\n        const marginLeft   = this.optionHandler.getTreeLevelLeftMargins(isLeaf ? level - 1 : level);\n        const marginRight  = this.optionHandler.getTreeLevelRightMargins(level);\n\n        const headerCount = this.fieldHandler.getHeaderSpanCount();\n        const leftCount   = this.fieldHandler.getLeftSpanCount();\n        const centerCount = this.fieldHandler.getCenterSpanCount();\n        const rightCount  = this.fieldHandler.getRightSpanCount();\n\n        const availability = [\n            headerCount > 0,  \n            leftCount > 0,    \n            centerCount > 0,  \n            rightCount > 0    \n        ];\n\n        const firstPaneIdx = availability.indexOf(true);\n        const lastPaneIdx  = availability.lastIndexOf(true);\n\n        const paneIndexMap = {\n            [RowContainerType.HEADER]: 0,\n            [RowContainerType.LEFT]:   1,\n            [RowContainerType.CENTER]: 2,\n            [RowContainerType.RIGHT]:  3\n        } as const;\n\n        const currentIdx = paneIndexMap[pinPosition];\n\n        if (currentIdx === firstPaneIdx) {\n            rowWidth -= marginLeft;\n        }\n\n        if (currentIdx === lastPaneIdx) {\n            rowWidth -= marginRight;\n        }\n\n        return rowWidth;\n    }\n\n    getCellLeft(rowNode : IRowNode, columnNode : IColumnNode, getLeft : CallableFunction) : number {\n\t\tconst level           = rowNode.getLevel();\n\t\tconst marginLeft      = this.optionHandler.getTreeLevelLeftMargins(level);\n\t\tlet   firstColumnId   = this.fieldHandler.getFirstColumnID();\n\t\tconst headerSpanCount = this.fieldHandler.getHeaderSpanCount();\n\t\tconst columnId        = columnNode.getID();\n\n        let left = getLeft();\n\n\t\tif(headerSpanCount> 0) {\n\t\t\tconst rowHeaderFieldHandler = this.fieldHandler.getHeaderHandler();\n\t\t\tfirstColumnId = rowHeaderFieldHandler.getFirstColumnID();\n\t\t}else {\n\t\t\tif(firstColumnId !== columnId) {\n\t\t\t\tleft -= marginLeft;\n\t\t\t}\n\t\t}\n\n        return left;\n    }\n\n    getCellWidth(rowNode : IRowNode, columnNode : IColumnNode, getWidth : CallableFunction) : number {\n\t\tconst columnId              = columnNode.getID();\n\t\tconst level                 = rowNode.getLevel();\n\t\tconst isLeaf                = !rowNode.isGroupRow();\n\t\tconst marginLeft            = this.optionHandler.getTreeLevelLeftMargins(isLeaf ? level- 1 : level);\n\t\tconst marginRight           = this.optionHandler.getTreeLevelRightMargins(isLeaf ? level- 1 : level);\n\t\tconst rowHeaderFieldHandler = this.fieldHandler.getHeaderHandler();\n\t\tconst lastColumnId          = this.fieldHandler.getLastColumnID();\n\t\tlet   firstColumnId         = this.fieldHandler.getFirstColumnID();\n\n\n\t\tlet width = getWidth();\n\n\t\tif(rowHeaderFieldHandler.getColumnCount() > 0) {\n\t\t\tconst rowHeaderFieldHandler = this.fieldHandler.getHeaderHandler();\n\t\t\tfirstColumnId = rowHeaderFieldHandler.getFirstColumnID();\n\t\t}\n\n\t\tif(lastColumnId === columnId) {\n\t\t\twidth -= marginRight;\n\t\t}\n\n\t\tif(firstColumnId === columnId) {\n\t\t\twidth -= marginLeft;\n\t\t}\n\n        return width;\n    }\n\n    getHeight(rowNode: IRowNode): number | null {\n        return rowNode.isGroupRow() ? (rowNode as GroupRowNode).getGroupHeight() : rowNode.getHeight();\n    }\n\n    getCellHeight(rowNode: IRowNode, _columnNode: IColumnNode): number | null {\n        if(rowNode.isGroupRow()) {\n            return rowNode.getHeight();\n        }\n\n        return null;\n    }\n\n\n    private getFullWidth(pinnedPosition : RowContainerType) : number {\n        switch (pinnedPosition) {\n\t\t\tcase RowContainerType.HEADER:\n\t\t\t\treturn this.fieldHandler.getDisplayedColumnsHeaderWidth();\n\t\t\tcase RowContainerType.LEFT:\n\t\t\t\treturn this.fieldHandler.getDisplayedColumnsLeftWidth();\n\t\t\tcase RowContainerType.CENTER:\n\t\t\t\treturn this.fieldHandler.getBodyContainerWidth();\n\t\t\tcase RowContainerType.RIGHT:\n\t\t\t\treturn this.fieldHandler.getDisplayedColumnsRightWidth();\n\t\t\tdefault:\n\t\t\t\treturn this.fieldHandler.getBodyContainerWidth();\n\t\t}\n    }\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IGridAPI } from \"../Interface/IGridAPI\";\nimport { GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { defaultCacheBlockCount, defaultCacheBlockSize, defaultFetchTriggerPoint, defaultRowHeight, minCacheBlockSize } from \"./Constants/GridConfigurationConstants\";\nimport { IColumnDefinition, IRecordHeaderColumnDefinitions } from \"./Interface/IColumnDefinition\";\nimport { ColumnHeaderHeightsParams, IAllowNavigationWithinCell, IGridConfiguration, IGridEventHandlers, IKeyBoardShortcutsParams, IRowModel, ITreeStructureData, SuppressCallback } from \"./Interface/IGridConfiguration\";\nimport { IFetchParam, IRowDefinition, IRowDefinitionFetchParams, IRowHeightParam } from \"./Interface/IRowDefinitions\";\nimport { GridExtraRowRenderer } from \"./Components/ExtraRecordController/GridExtraRowComponent\";\nimport { IRowNodeCore } from \"../../DataStore/rownode.types\";\nimport { IActionRenderer } from \"../../GanttModelClasses/IGanttConfiguration\";\nimport { IBaseComponent, IColumnNode } from \"../Main\";\nimport { VIEW_TYPE } from \"./Columns/FieldHandler\";\n\nexport const gridOptions = {\n    popUpParent : 'popupParent'\n}\n\nfunction getCallbackForEvent(eventName: string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\nfunction getHookCallbackForEvent(eventName: string, Hookname : string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${Hookname}${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nclass GridOptioHandler extends EventEmitter {\n\n\tprivate domKey = `_DG_${Math.random().toString()}`;\n\n\t@AutoWired(GRID_BEAN_NAME.GRID_OPTIONS) private gridOptions !: IGridConfiguration;\n\t@AutoWired(GRID_BEAN_NAME.GRID_DIV_ELEMENT) private \tgridDivElement !: HTMLElement;\n\t@AutoWired(GRID_BEAN_NAME.GRID_API) public api !: IGridAPI;\n\n\tprivate initialMinSpareRows : number = 0;\n\tprivate initialMinSpareColumns : number = 0;\n\t\n\t@PostConstruct()\n\tinit() {\n\t\tthis.setRowData(this.gridOptions.rowData);\n\t\tthis.eventHandler.addGlobalListener(\n\t\t\tthis.globalEventHandler.bind(this),\n\t\t\tfalse,\n\t\t);\n\n\t\tthis.initialMinSpareRows = this.getMinSpareRows();\n\t\tthis.initialMinSpareColumns = this.getMinSpareColumns();\n\n\t}\n\n\tprivate globalEventHandler(eventName: string, event?: any) {\n\t\tconst callbackMethodName = getCallbackForEvent(eventName);\n\t\tif (typeof this.gridOptions[callbackMethodName] === 'function') {\n\t\t\tthis.gridOptions[callbackMethodName](event);\n\t\t}\n\n\t\tthis.on(eventName, event);\n\t}\n\n\tonBefore(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'Before');\n\n\t\tif(typeof this.gridOptions['events']?.[callbackMethodName] === 'function') {\n\t\t\treturn this.gridOptions['events'][callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ton(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, '');\n\n\t\tif(typeof this.gridOptions['events']?.[callbackMethodName] === 'function') {\n\t\t\treturn this.gridOptions['events'][callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tonAfter(eventName : string, event?: any) : void {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'After');\n\n\t\tif(typeof this.gridOptions['events']?.[callbackMethodName] === 'function') {\n\t\t\tthis.gridOptions['events'][callbackMethodName](event);\n\t\t}\n\t}\n\n\tupdateConfiguration(configuration: Partial<IGridConfiguration>) : void {\n\t\tthis.deepMerge(this.gridOptions, configuration);\n\t}\n\n\tprivate deepMerge(target: any, source: any): void {\n\t\tfor (const key in source) {\n\t\t\tif (source.hasOwnProperty(key)) {\n\t\t\t\tif (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {\n\t\t\t\t\t// If target doesn't have this key or it's not an object, initialize it\n\t\t\t\t\tif (!target[key] || typeof target[key] !== 'object') {\n\t\t\t\t\t\ttarget[key] = {};\n\t\t\t\t\t}\n\t\t\t\t\t// Recursively merge nested objects\n\t\t\t\t\tthis.deepMerge(target[key], source[key]);\n\t\t\t\t} else {\n\t\t\t\t\t// For primitive values, arrays, and null/undefined, directly assign\n\t\t\t\t\ttarget[key] = source[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetDomKey(): string {\n\t\treturn this.domKey;\n\t}\n\n\tgetDomData(element: Node | null, key: string): any {\n\t\tconst domData = element[this.getDomKey()];\n\t\treturn domData ? domData[key] : undefined;\n\t}\n\n\tsetDomData(element: Element, key: string, value: any): any {\n\t\tconst domKey = this.getDomKey();\n\t\tlet domData = element[domKey];\n\n\t\tif (!domData) {\n\t\t\tdomData = {};\n\t\t\t(element as any)[domKey] = domData;\n\t\t}\n\n\t\tdomData[key] = value;\n\t}\n\n\tgetDefaultRowHeight(): number {\n\t\treturn defaultRowHeight;\n\t}\n\n\tgetCacheBlockCount(): number {\n\t\treturn this.gridOptions.cacheBlockCount ?? defaultCacheBlockCount;\n\t}\n\n\tgetCacheBlockSize(): number {\n\t\tconst size = this.gridOptions.cacheBlockSize ?? defaultCacheBlockSize;\n\t\treturn Math.max(minCacheBlockSize, size);\n\t}\n\n\tgetStaticCacheIndexes(): number[] {\n\t\treturn this.gridOptions.staticCacheRowIndices ?? [];\n\t}\n\n\tgetFetchTriggerPoint(): number {\n\t\treturn this.gridOptions.fetchTriggerPoint ?? defaultFetchTriggerPoint;\n\t}\n\n\tgetFetchDelay(): number {\n\t\treturn this.gridOptions.fetchDelay ?? 0;\n\t}\n\n\tgetColumnDef(): IColumnDefinition[] {\n\t\treturn this.gridOptions?.columnDefinitions ?? [];\n\t}\n\n\tgetDefaultColGroupDef(): Partial<import(\"./Interface/IColumnDefinition\").IColumnGroupDefinition> {\n\t\treturn this.gridOptions?.defaultColGroupDef ?? {};\n\t}\n\n\thasColumnGroups(): boolean {\n\t\tif (this.gridOptions?.enableNestedHeader === true) return true;\n\t\tif (this.gridOptions?.enableNestedHeader === false) return false;\n\t\tconst defs = this.gridOptions?.columnDefinitions;\n\t\tif (!defs || !Array.isArray(defs)) return false;\n\t\treturn defs.some((d: any) => d && Array.isArray(d.children));\n\t}\n\n\tgetRowDefinitions(rowMeta : IRowDefinitionFetchParams) : IRowDefinition {\n\t\treturn this.gridOptions?.rowDefinitions ? this.gridOptions?.rowDefinitions(rowMeta) ?? {} :{};\n\t}\n\n\tgetRowData() {\n\t\treturn this.gridOptions.rowData;\n\t}\n\n\tgetRowCount() : number {\n\t\tconst hasFullTreeStructure = this.hasFullTreeStructureProvided();\n\t\tif(hasFullTreeStructure){\n\t\t\treturn this.getTreeStructureData()?.length ?? 0;\n\t\t}\n\t\treturn this.gridOptions?.rowCount  ?? this.getRowData().length;\n\t}\n\n\tgetTopDraftRowCount() : number {\n\t\treturn this.gridOptions?.topDraftRowCount ?? 0;\n\t}\n\n\tgetBottomDraftRowCount() : number {\n\t\treturn this.gridOptions?.bottomDraftRowCount ?? 0;\n\t}\n\n\n\n\tisRTL(): boolean {\n\t\treturn this.gridOptions?.rtl ?? false;\n\t}\n\n\tgetAnimateRow() : boolean {\n\t\treturn this.gridOptions?.animateRow ?? true;\n\t}\n\n\tgetRowModelType() : IRowModel {\n\t\treturn this.gridOptions?.rowModelType ?? 'local';\n\t}\n\n\tgetRootRowCount() : ()=>number {\n\t\treturn  ()=>this.getRowCount();\n\t\t// return (()=>this.gridOptions?.rootRowCount?.()) ?? (()=>this.getRowCount());\n\t}\n\n\t// getRowHeightForNode(_node ?: IRowNode) : number {\n\t//     return this.gridOptions?.rowHeight ?? 42\n\t// }\n\n\t// getPinnedRowDefinition() : IRowPinnedDefinition[]{\n\t//     return this.gridOptions.pinnedRowDefinitions;\n\t// }\n\n\t// getPinnedTopRowData() : any[] {\n\t//     return this.gridOptions?.pinnedTopData ?? [];\n\t// }\n\n\t// getPinnedBottomRowData() : any[] {\n\t//     return this.gridOptions?.pinnedBottomData ?? [];\n\t// }\n\n\t// getData() : any[] {\n\t//     return this.gridOptions?.rowData;\n\t// }\n\n\tgetScrollbarWidth(): number {\n\t\treturn 10;\n\t}\n\n\tgetRowHeader(): IRecordHeaderColumnDefinitions[] {\n\t\treturn this.gridOptions?.rowHeaderDefinitions ?? [];\n\t}\n\n\tisRowHoverHighlighter(): boolean {\n\t\treturn this.gridOptions?.rowHighlighter ?? false;\n\t}\n\n\tisColumnHoverHighlighter(): boolean {\n\t\treturn this.gridOptions?.columnHighlighter ?? false;\n\t}\n\n\tgetBufferSize(): number {\n\t\tconst buffer = (this.gridOptions as any).buffer ?? 10;\n\t\treturn Math.max(0, buffer);\n\t}\n\n\tisSuppressHorizontalScroll() {\n\t\treturn false;\n\t}\n\n\tisSuppressVerticalScroll() {\n\t\treturn false;\n\t}\n\n\n\texcludeScrollbarForPinning() {\n\t\treturn this.gridOptions?.excludeScrollbarForPinning ?? true;\n\t}\n\n\tgetPopupParent(): HTMLElement {\n        return this.gridOptions[gridOptions.popUpParent];\n\t}\n\n    getDocument(): Document {\n        let result: Document | null = null;\n        if (this.gridDivElement) {\n\t\t\tresult = this.gridDivElement.ownerDocument;\n\t\t}\n\n        if (result) {\n            return result;\n        }\n\n        return document;\n    }\n\n\tgetGridContainer(): HTMLElement {\n\t\treturn this.gridDivElement ?? null;\n\t}\n\n\tgetHookEvents() : IGridEventHandlers {\n\t\treturn this.gridOptions?.events || {};\n\t}\n\n\tgetEvents(){\n\t\treturn this.gridOptions?.events || {};\n\t}\n\n\tgetSuppressMouseDownEvent() : SuppressCallback {\n\t\treturn this.gridOptions?.suppressMouseDownEvent;\n\t}\n\n\tgetSuppressKeyDownEvent() : SuppressCallback {\n\t\treturn this.gridOptions?.suppressKeyDownEvent;\n\t}\n\n\tgetFloatingBufferPixel() : number {\n\t\treturn this.gridOptions?.floatingBufferPixel ?? -10;\n\t}\n\n\tgetRowMovedRenderer() : any {\n\t\treturn this.gridOptions?.rowMovedRenderer\n\t}\n\n\tgetRowMovedRendererParams() : any {\n\t\treturn this.gridOptions?.rowMovedRendererParams\n\t}\n\n\tgetRowReoderRenderer() : any {\n\t\treturn this.gridOptions?.rowReorderRenderer;\n\t}\n\n\tgetRowReorderRendererParams() : any {\n\t\treturn this.gridOptions?.rowReorderRendererParam;\n\t}\n\n\tgetColumnReoderRenderer() : any {\n\t\treturn this.gridOptions?.columnReorderRenderer;\n\t}\n\n\tgetColumnReorderRendererParams() : any {\n\t\treturn this.gridOptions?.columnReorderRendererParam;\n\t}\n\n\tgetRowDropZones() : any[] {\n\t\treturn this.gridOptions?.rowDropZones ?? [];\n\t}\n\n\tgetColumnHeaderHeight(meta: Partial<ColumnHeaderHeightsParams>): number {\n\t\tconst columnHeaderHeights = this.gridOptions?.columnHeaderHeights;\n\t\tconst rowIndex = meta?.rowIndex ?? 0;\n\t\tconst maxDepth = meta?.maxDepth ?? 1;\n\t\tconst rowType = meta?.rowType ?? (rowIndex < maxDepth - 1 ? 'group' : 'leaf');\n\t\tconst level = meta?.level ?? rowIndex;\n\t\tconst fullMeta: ColumnHeaderHeightsParams = { rowIndex, rowType, level, maxDepth };\n\t\tif (columnHeaderHeights) {\n\t\t\tif (typeof columnHeaderHeights === 'function') {\n\t\t\t\treturn columnHeaderHeights(fullMeta);\n\t\t\t}\n\n\t\t\tif(typeof columnHeaderHeights === 'string' || typeof columnHeaderHeights === 'number') {\n\t\t\t\tif (columnHeaderHeights === 'auto') {\n\t\t\t\t\treturn defaultRowHeight;\n\t\t\t\t}\n\t\t\t\tconst numericHeight = typeof columnHeaderHeights === 'number' ? columnHeaderHeights : Number(columnHeaderHeights);\n\t\t\t\treturn Number.isFinite(numericHeight) ? numericHeight : defaultRowHeight;\n\t\t\t}\n\t\t\t\n\t\t\tif (Array.isArray(columnHeaderHeights)) {\n\t\t\t\tconst idx = Math.min(rowIndex, columnHeaderHeights.length - 1);\n\t\t\t\treturn idx >= 0 ? columnHeaderHeights[idx] : 42;\n\t\t\t}\n\t\t}\n\t\treturn defaultRowHeight;\n\t}\n\n\t/** Sum of header row heights for rows [startRowIndex, startRowIndex + count). Used for spanning cell height. */\n\tgetColumnHeaderHeightSum(maxDepth: number, startRowIndex: number, count: number): number {\n\t\tlet sum = 0;\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tconst rowIndex = startRowIndex + i;\n\t\t\tconst rowType = rowIndex < maxDepth - 1 ? 'group' as const : 'leaf' as const;\n\t\t\tsum += this.getColumnHeaderHeight({ rowIndex, rowType, level: rowIndex, maxDepth });\n\t\t}\n\t\treturn sum;\n\t}\n\n\t/** Total height of all column header rows. */\n\tgetTotalColumnHeaderHeight(maxDepth: number): number {\n\t\treturn this.getColumnHeaderHeightSum(maxDepth, 0, maxDepth);\n\t}\n\n\tgetRowHeights(meta : IRowHeightParam) : number {\n\t\tconst rowHeights = this.gridOptions?.rowHeights;\n\t\tif(rowHeights) {\n\t\t\tif(typeof rowHeights === 'function') {\n\t\t\t\treturn rowHeights(meta);\n\t\t\t}\n\n\t\t\telse if(typeof rowHeights === 'string' || typeof rowHeights === 'number') {\n\t\t\t\t// When configured as 'auto', start with the default row height.\n\t\t\t\t// The actual DOM-based auto height is computed later in the rendering flow.\n\t\t\t\tif (rowHeights === 'auto') {\n\t\t\t\t\treturn defaultRowHeight;\n\t\t\t\t}\n\t\t\t\tconst numericHeight = typeof rowHeights === 'number' ? rowHeights : Number(rowHeights);\n\t\t\t\treturn Number.isFinite(numericHeight) ? numericHeight : defaultRowHeight;\n\t\t\t}\n\t\t}\n\t\treturn defaultRowHeight;\n\t}\n\n\thasStaticRowHeight() : boolean {\n\t\tconst rowHeights = this.gridOptions.rowHeights;\n\t\tif (typeof rowHeights === 'function') {\n\t\t\treturn false;\n\t\t}\n\t\t// Treat 'auto' as dynamic so we can vary height per row.\n\t\tif (rowHeights === 'auto') {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tgetSummaryRowHeights() : number {\n\t\tconst rowHeights = this.gridOptions?.summaryRowHeight;\n\t\tif(rowHeights) {\n\t\t\tif(typeof rowHeights === 'function') {\n\t\t\t\treturn rowHeights();\n\t\t\t}\n\n\t\t\telse if(typeof rowHeights === 'string' || typeof rowHeights === 'number') {\n\t\t\t\treturn Number(rowHeights) ?? defaultRowHeight;\n\t\t\t}\n\t\t}\n\t\treturn defaultRowHeight;\n\t}\n\n\tsetRowData(rowData: Record<string, any>[] | ((param: IFetchParam) => void)) {\n        // const isArray = Array.isArray(rowData);\n        // if(isArray){\n        //     this.gridOptions.rowCount = rowData.length;\n        //     this.gridOptions.rowData = (param : IFetchParam) => { param.onSuccess(rowData.slice(param.startRowIndex, param.endRowIndex+1) )};\n        // }\n        // else{\n            this.gridOptions.rowData = rowData;\n        // }\n    }\n\n\tgetExtraRowHeight(): number {\n\t\tconst extraRowHeight = this.gridOptions?.extraRowHeight;\n\t\n\t\tif (typeof extraRowHeight === 'function') {\n\t\t\treturn extraRowHeight();\n\t\t}\n\t\n\t\treturn typeof extraRowHeight === 'number' ? extraRowHeight : 50;\n\t}\n\t\n\n\tgetExtraRowCount() : number {\n\t\treturn this.gridOptions?.extraRowCount || 1;\n\t}\n\n\tgetExtraRowRenderer() : any {\n\t\tconst isExtraRow = this.getIsExtraRow();\n\t\tconst renderClass = this.gridOptions?.extraRowRenderer;\n\t\tconst defaultClass = isExtraRow && GridExtraRowRenderer\n\t\treturn renderClass ?? defaultClass;\n\t}\n\n\tgetExtraRowRendererParam() : any {\n\t\treturn this.gridOptions.extraRowRendererParam;\n\t}\n\n\tsetIsExtraRow(isExtraRow : boolean) : void {\n\t\tthis.gridOptions.isExtraRow = isExtraRow;\n\t}\n\n\tgetIsExtraRow() : boolean {\n\t\treturn this.gridOptions?.isExtraRow ?? false;\n\t}\n\n\n\tgetFullWidthCallBack() {\n\t\treturn this.gridOptions?.isFullWidthRow;\n\t}\n\n\tgetFullWidthCellRenderer() : any {\n\t\treturn this.gridOptions.fullWidthCellRenderer;\n\t}\n\n\tgetFullWidthGroupCellRenderer() : any {\n\t\treturn this.gridOptions?.groupRowRenderer;\n\t}\n\n\tgetFloatingRecord() : 'absolute' | 'relative' {\n\t\treturn this.gridOptions?.floatingRecord ?? 'relative';\n\t}\n\n\tisRelativeFloatingRecord() : boolean {\n        const floatingRecord = this.getFloatingRecord();\n\n        return floatingRecord === 'relative';\n    }\n\n\tgetDefaultColumnDefinitions() : IColumnDefinition {\n\t\treturn this.gridOptions?.defaultColumnDefinitions ?? {};\n\t}\n\n\tisFullRowHoverOnEdit() : boolean {\n\t\treturn this.gridOptions.fullRowHoverOnEdit ?? false;\n\t}\n\n\tisColumnHeader() : boolean {\n\t\treturn this.gridOptions.columnHeader ?? true;\n\t}\n\n\tisGroupUseFullWidthRow(): boolean {\n        return this.gridOptions.groupDisplayType ? (this.gridOptions.groupDisplayType === 'groupRows'): false;\n    }\n\n\n\tgetViewConfig(_isGrouped : boolean = false) : any {\n\t\t// const viewType = this.gridOptions?.viewType;\n\t\t// switch(viewType) {\n\t\t// \tcase 'gallery':\n\t\t// \t\treturn {...{}, ...{\n\t\t// \t\t\tminWidth     : 150,\n\t\t// \t\t\tminHeight    : isGrouped ? 50 : 300,\n\t\t// \t\t\tmaxWidth     : isGrouped ? innerWidth: 300,\n\t\t// \t\t\tcount        : 0,\n\t\t// \t\t\tmaxHeight    : isGrouped ? 50 : 300,\n\t\t// \t\t\thorizontalGap: 5,\n\t\t// \t\t\tverticalGap  : 5\n\t\t// \t\t}}\n\t\t// \tdefault :\n\t\t// \t\treturn { };\n\t\t// }\n\n\t\treturn {};\n\t}\n\n\tgetTreeLevelTopMargins(level : number = 1) : number {  //level starts from 1\n\t\treturn this.gridOptions.treeLevelTopMargins?.[level - 1] ?? 0;\n\t}\n\n\tgetTreeLevelBottomMargins(level : number = 1) : number {  //level starts from 1\n\t\treturn this.gridOptions.treeLevelBottomMargins?.[level - 1] ?? 0;\n\t}\n\n\tgetMarginBottom() : number {\n        return this.gridOptions.marginBottom ?? 0;\n    }\n\n    getMarginTop() : number {\n        return this.gridOptions.marginTop ?? 0;\n    }\n\n\tgetFullWidthLoadingRenderer() : any {\n\t\treturn this.gridOptions.fullWidthLoadingRenderer ?? 'dgFullWidthLoadingRenderer';\n\t}\n\n\tisRowSuppressNavigation(params : {node : IRowNodeCore, column : IColumnNode}) : boolean {\n\t\tif(typeof this.gridOptions.suppressRowNavigation === 'function') {\n\t\t\tconst useFunction = this.gridOptions.suppressRowNavigation;\n\n\t\t\treturn useFunction(params);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tisWrapNavigationToNextRow() : boolean {\n\t\treturn this.gridOptions.wrapNavigationToNextRow ?? false;\n\t}\n\n\tisRangeSelectionEnabled() : boolean {\n\t\treturn this.gridOptions.enableRangeSelection ?? false;\n\t}\n\n\tsuppressMultiRangeSelection() : boolean {\n\t\treturn this.gridOptions.suppressMultiRangeSelection ?? false;\n\t}\n\n\tisRowTransform() : boolean {\n\t\treturn this.gridOptions.rowTransform ?? true;\n\t}\n\tsuppressGroupRowsSticky() : boolean {\n\t\treturn this.gridOptions.suppressGroupRowsSticky ?? false;\n\t}\n\n\tgetKeyBoardShortCuts() : IKeyBoardShortcutsParams[] {\n\t\treturn this.gridOptions.keyBoardShortcuts ?? [];\n\t}\n\n\tisEnterNavigatesVerticallyAfterEdit() : boolean {\n\t\treturn this.gridOptions.enterNavigatesVerticallyAfterEdit ?? false;\n\t}\n\n\tisEnterNavigatesVertically() : boolean {\n\t\treturn this.gridOptions.enterNavigatesVertically ?? false;\n\t}\n\n\tisCellEditingOnBackspace() : boolean {\n\t\treturn this.gridOptions.enableCellEditingOnBackspace ?? false;\n\t}\n\n\tsuppressCsvExport() : boolean {\n\t\treturn this.gridOptions.suppressCsvExport ?? false;\n\t}\n\n\tshouldCopyHeadersToClipboard() : boolean {\n\t\treturn false;\n\t}\n\n\tshouldCopyGroupHeadersToClipboard() : boolean {\n\t\treturn false;\n\t}\n\n\tshouldCopyAsString() : boolean {\n\t\treturn this.gridOptions.copyAsString ?? false;\n\t}\n\n\tclearSelectionOnMouseDown() : boolean {\n\t\treturn this.gridOptions.clearSelectionOnMouseDown ?? true\n\t}\n\n\tgetIncludeKeyboardShortcuts() : string[] {\n\t\treturn this.gridOptions.includeKeyboardShortcuts ?? [];\n\t}\n\n\tgetExcludeKeyboardShortcuts() : string[] {\n\t\treturn this.gridOptions.excludeKeyboardShortcuts ?? [];\n\t}\n\n\tgetRowSelection() : 'single' | 'multiple' | \"none\"{\n\t\treturn this.gridOptions.rowSelection ?? 'none';\n\t}\n\n\tgetColumnSelection() : 'single' | 'multiple' | 'singleOrMultiCtrl' | \"none\" {\n\t\treturn this.gridOptions.columnSelection ?? 'none';\n\t}\n\n\tisAllowMultipleTypeSelection() : boolean {\n\t\treturn this.gridOptions.allowMultipleTypeSelection ?? false;\n\t}\n\n\tgetFullWidthRendererParams() : any {\n\t\treturn this.gridOptions.fullWidthCellRendererParams\n\t}\n\n\tgetFullWidtLoadinghRendererParams() : any {\n\t\treturn this.gridOptions.fullWidthLoadingRendererParams\n\t}\n\n\tgetGroupingFullWidthRendererParams() : any {\n\t\treturn this.gridOptions.groupRowRendererParams;\n\t}\n\n\tisStopEditingWhenCellsLoseFocus() : boolean {\n\t\treturn this.gridOptions.stopEditingWhenCellsLoseFocus ?? false\n\t}\n\n\tisClearSelectionOnCellRightClick() : boolean {\n\t\tconst isAllowMultipleTypeSelection = this.isAllowMultipleTypeSelection()\n\t\treturn !isAllowMultipleTypeSelection && (this.gridOptions.clearSelectionOnCellRightClick ?? false)\n\t} \n\n\tisCellFocusonSelection() : boolean {\n\t\treturn this.gridOptions.cellFocusOnSelection ?? false;\n\t}\n\n\tsuppressCellFocusOnSelection() : boolean {\n\t\treturn this.gridOptions.suppressCellFocusOnSelection ?? false;\n\t}\n\n\tgetUndoResizeOnCancel() : boolean {\n\t\treturn this.gridOptions.undoResizeOnCancel ?? true;\n\t}\n\n\tisResizeCueEnabled() : boolean {\n\t\treturn this.gridOptions.enableResizeCue ?? false;\n\t}\n\n\tgetShouldPreventGridMousedown() : boolean {\n\t\treturn this.gridOptions.shouldPreventGridMousedown ?? false;\n\t}\n\n\tisCellFocusScrollOnColumnSelection() : boolean {\n\t\treturn this.gridOptions.cellFocusScrollOnColumnSelection ?? false;\n\t}\n\n\n\tgetInnerCellNavigation() : IAllowNavigationWithinCell {\n\t\treturn this.gridOptions.shouldNavigateWithinCell ?? (()=>false);\n\t}\n\n\tsetInnerCellNavigationCallback(callback: IAllowNavigationWithinCell): void {\n\t\tthis.gridOptions.shouldNavigateWithinCell = callback;\n\t}\n\tgetMinSpareRows() : number {\n\t\treturn this.gridOptions.minSpareRows ?? 0;\n\t}\n\n\tgetMinSpareColumns() : number {\n\t\treturn 0;\n\t}\n\n\tgetInitialMinSpareRows() : number {\n\t\treturn this.initialMinSpareRows;\n\t}\n\n\tgetInitialMinSpareColumns() : number {\n\t\treturn this.initialMinSpareColumns;\n\t}\n\n\tisFillSeriesEnabled() : boolean {\n\t\treturn this.gridOptions.fillSeries ?? false;\n\t}\n\n\tgetFillSeriesDirection() : 'x' | 'y' | 'xy' {\n\t\treturn this.gridOptions.fillSeriesDirection ?? 'xy';\n\t}\n\n\tisSuppressClearOnFillReduction() : boolean {\n\t\treturn this.gridOptions.suppressClearOnFillReduction ?? false\n\t}\n\n\tisAutoFillRows() : boolean {\n\t\treturn this.gridOptions.autoFillRows ?? false;\n\t}\n\n\tisRowDraggable() : boolean {\n\t\treturn this.gridOptions.rowDraggable ?? false;\n\t}\n\n\tgetViewportRowPageSize() : number {\n\t\treturn this.gridOptions.viewportRowPageSize != undefined ? this.gridOptions.viewportRowPageSize : 100;\n\t}\n\n\tgetViewportColumnPageSize() : number {\n\t\treturn this.gridOptions.viewportColumnPageSize ? this.gridOptions.viewportColumnPageSize : 50;\n\t}\n\n\tgetViewportRowBufferSize() : number {\n\t\tconst buffer= this.gridOptions.viewportRowBufferSize;\n\t\treturn buffer!=undefined ?  buffer : 20;\n\t}\n\n\tgetViewportColumnBufferSize() : number {\n\t\tconst buffer = this.gridOptions.viewportColumnBufferSize\n\t\treturn  buffer!=undefined ? buffer : 5;\n\t}\n\n\n\t//gantt\n\tgetProjectStartDate() : Date | string | number{\n\t\treturn this.gridOptions.projectStartDate\n\t}\n\tgetProjectEndDate():Date | string | number{\n\t\treturn this.gridOptions.projectEndDate\n\t}\n\n\tgetViewType():string{\n\t\treturn this.gridOptions.viewType ?? 'grid'\n\t}\n\n\tgetTimeLineViewType() : typeof VIEW_TYPE[keyof typeof VIEW_TYPE]{\n\t\treturn this.gridOptions.timeLineViewType ?? VIEW_TYPE.WEEK;\n\t}\n\tgetTimezone() : string | null{\n\t\treturn this.gridOptions.timelineSettings?.timezone ?? null\n\t}\n\n\thasFullTreeStructureProvided() : boolean {\n\t\treturn this.gridOptions.hasTreeFullStructureProvided ?? false;\n\t}\n\n\tgetTreeStructureData() : ITreeStructureData[] | null {\n\t\treturn this.gridOptions.treeStructureData ?? null;\n\t}\n\n\tgetActionRenderer() : (new() => IActionRenderer) {\n\t\treturn this.gridOptions.actionRenderer;\n\t}\n\n\tgetActionRendererParams() : Object | null {\n\t\treturn this.gridOptions.actionRendererParams ?? null;\n\t}\n\n\tgetNoRecordRenderer() : new () => IBaseComponent<any> {\n\t\treturn this.gridOptions.noRecordRenderer;\n\t}\n\n\tsuppressGroupHeaderCellFocus() : boolean {\n\t\treturn this.gridOptions.suppressGroupHeaderCellFocus ?? false\n\t}\n\n\tgetTreeLevelLeftMargins(level: number = 1): number {\n\t\tconst margins = this.gridOptions.treeLevelLeftMargins;\n\t\tif (!margins) return 0;\n\n\t\tlet total = 0;\n\t\tfor (let i = 0; i < level; i++) {\n\t\t\ttotal += margins[i] ?? 0;\n\t\t}\n\t\treturn total;\n\t}\n\n\tgetTreeLevelRightMargins(level: number = 1): number {\n\t\tconst margins = this.gridOptions.treeLevelRightMargins;\n\t\tif (!margins) return 0;\n\n\t\tlet total = 0;\n\t\tfor (let i = 0; i < level; i++) {\n\t\t\ttotal += margins[i] ?? 0;\n\t\t}\n\t\treturn total;\n\t}\n\nsuppressGroupToGroupRangeSelection() : boolean {\n\t\treturn this.gridOptions.suppressGroupToGroupRangeSelection ?? false;\n\t}\n\n\tisAutoUnpinnedColumns() : boolean {\n\t\treturn this.gridOptions.autoUnpinnedColumns ?? false;\n\t}\n\n\tisAutoRowHeight() : boolean {\n\t\treturn this.gridOptions?.rowHeights === 'auto';\n\t}\n\n\tgetMinRowAuto() : number | undefined {\n\t\tconst minRowAuto = this.gridOptions?.minRowAuto;\n\t\treturn typeof minRowAuto === 'number' && Number.isFinite(minRowAuto) ? minRowAuto : undefined;\n\t}\n\n\tgetMaxRowAuto() : number | undefined {\n\t\tconst maxRowAuto = this.gridOptions?.maxRowAuto;\n\t\treturn typeof maxRowAuto === 'number' && Number.isFinite(maxRowAuto) ? maxRowAuto : undefined;\n\t}\n\n\tisAutoColumnHeaderHeight() : boolean {\n\t\treturn this.gridOptions?.columnHeaderHeights === 'auto';\n\t}\n}\n\nexport { GridOptioHandler };\n ","import { IHookMeta } from \"../../../Interface/Hooks\";\n\nconst enum HookEventsName {\n\tonBeforeCellSelectionChange = 'onBeforeCellFocusChange',\n\tonAfterCellSelectionChange  = 'onAfterCellFocusChange',\n\tonBeforeColumnSelect        = 'onBeforeColumnSelect',\n\tonAfterColumnSelect         = 'onAfterColumnSelect',\n\tonScroll                    = 'onScroll',\n\tonAfterScroll               = 'onAfterScroll',\n\tonBeforeRangeSelect         = 'onBeforeRangeSelect',\n\tonAfterRangeSelect          = 'onAfterRangeSelect',\n\tonBeforeRangeDeselect       = 'onBeforeRangeDeselect',\n\tonAfterRangeDeselect        = 'onAfterRangeDeselect',\n\tonBeforeRowSelect           = 'onBeforeRowSelect',\n\tonAfterRowSelect            = 'onAfterRowSelect',\n\tonBeforeColumnDeselect      = 'onBeforeColumnDeselect',\n\tonAfterColumnDeselect       = 'onAfterColumnDeselect',\n\tonAfterRowDeselect          = 'onAfterRowDeselect',\n\tonBeforeRowDeselect         = 'onBeforeRowDeselect',\n\tonBeforeRowInsert           = 'onBeforeRowInsert',\n\tonAfterRowInsert            = 'onAfterRowInsert',\n\tonBeforeRowRemove           = 'onBeforeRowRemove',\n\tonAfterRowRemove            = 'onAfterRowRemove',\n\tonBeforeRowResize           = 'onBeforeRowResize',\n\tonAfterRowResize            = 'onAfterRowResize',\n\tonBeforeRowHide             = 'onBeforeRowHide',\n\tonAfterRowHide              = 'onAfterRowHide',\n\tonBeforeRowShow             = 'onBeforeRowShow',\n\tonAfterRowShow              = 'onAfterRowShow',\n\tonBeforeColumnInsert        = 'onBeforeColumnInsert',\n\tonAfterColumnInsert         = 'onAfterColumnInsert',\n\tonBeforeColumnRemove        = 'onBeforeColumnRemove',\n\tonAfterColumnRemove         = 'onAfterColumnRemove',\n\tonBeforeColumnResize        = 'onBeforeColumnResize',\n\tonAfterColumnResize         = 'onAfterColumnResize',\n\tonBeforeColumnHide          = 'onBeforeColumnHide',\n\tonAfterColumnHide           = 'onAfterColumnHide',\n\tonBeforeColumnShow          = 'onBeforeColumnShow',\n\tonAfterColumnShow           = 'onAfterColumnShow',\n\tonBeforeFloatingRowStarted  = 'onBeforeFloatingRowStarted',\n\tonAfterFloatingRowStarted   = 'onAfterFloatingRowStarted',\n\tonBeforeFloatingRowEnded    = 'onBeforeFloatingRowEnded',\n\tonAfterFloatingRowEnded     = 'onAfterFloatingRowEnded',\n\tonBeforeDataUpdate          = 'onBeforeDataUpdate',\n\tonAfterDataUpdate           = 'onAfterDataUpdate',\n\tonBeforeCellDeSelect        = 'onBeforeCellDeSelect',\n\tonAfterCellDeSelect         = 'onAfterCellDeSelect',\n\tonBeforeRowReorder          = 'onBeforeRowReorder',\n\tonAfterRowReorder           = 'onAfterRowReorder',\n\tonBeforeColumnReorder       = 'onBeforeColumnReorder',\n\tonAfterColumnReorder        = 'onAfterColumnReorder',\n\n\tonRangeSelectionChanged        = 'onRangeSelectionChanged',\n\tonBeforeRangeSelection         = 'onBeforeRangeSelection',\n\tonAfterRangeSelection          = 'onAfterRangeSelection',\n\tonBeforeColumnPinning          = \"onBeforeColumnPinning\",\n\tonAfterColumnPinning           = \"onAfterColumnPinning\",\n\tonBeforeColumnDefinitionUpdate = \"onBeforeColumnDefinitionUpdate\",\n\tonAfterColumnDefinitionUpdate  = \"onAfterColumnDefinitionUpdate\",\n\n    onBeforeRowSortApplied = \"onBeforeRowSortApplied\",\n    onAfterRowSortApplied  = \"onAfterRowSortApplied\",\n    onBeforeRowSortRemove  = \"onBeforeRowSortRemove\",\n    onAfterRowSortRemove   = \"onAfterRowSortRemove\",\n    \n\tonBeforeFilterApplied = \"onBeforeFilterApplied\",\n\tonAfterFilterApplied  = \"onAfterFilterApplied\",\n\tonBeforeFilterRemove  = \"onBeforeFilterRemove\",\n\tonAfterFilterRemove   = \"onAfterFilterRemove\",\n\t\t\n\tonAfterRowGroupingRemove   = \"onAfterRowGroupingRemove\",\n\tonBeforeRowGroupingApplied = \"onBeforeRowGroupingApplied\",\n\tonAfterRowGroupingApplied  = \"onAfterRowGroupingApplied\",\n\tonBeforeRowGroupingRemove  = \"onBeforeRowGroupingRemove\",\n\n\tonBeforeUserPresenceAdd = \"onBeforeUserPresenceAdd\",\n\tonAfterUserPresenceAdd  = \"onAfterUserPresenceAdd\",\n\n\tonBeforeUserPresenceRemove = \"onBeforeUserPresenceRemove\",\n\tonAfterUserPresenceRemove  = \"onAfterUserPresenceRemove\",\n\n\tonBeforeUserPresenceUpdate = \"onBeforeUserPresenceUpdate\",\n\tonAfterUserPresenceUpdate  = \"onAfterUserPresenceUpdate\",\n\n\tonBeforeCopyData  = \"onBeforeCopyData\",\n\tonAfterCopyData   = \"onAfterCopyData\",\n\tonBeforeCutData   = \"onBeforeCutData\",\n\tonAfterCutData    = \"onAfterCutData\",\n\tonBeforePasteData = \"onBeforePasteData\",\n\tonAfterPasteData  = \"onAfterPasteData\",\n\tonColumnResize    = \"onColumnResize\",\n\n\tonBeforeAllRowsCacheCleared = 'onBeforeAllRowsCacheCleared',\n\tonAfterAllRowsCacheCleared  = 'onAfterAllRowsCacheCleared',\n\tonBeforeFillSeries          = 'onBeforeFillSeries',\n\tonAfterFillSeries           = 'onAfterFillSeries',\n\n\t// Tree API hooks\n\tonBeforeGroupExpand = 'onBeforeGroupExpand',\n\tonAfterGroupExpand = 'onAfterGroupExpand',\n}\n\nfunction deleteHookMeta(hookMeta: IHookMeta): IHookMeta {\n\tdelete hookMeta.oldValues;\n\tdelete hookMeta.useAction;\n\tdelete hookMeta.useActionOldValues;\n\tdelete hookMeta.useApiCaller;\n\tdelete hookMeta.suppressEventTrigger;\n\n\treturn hookMeta;\n}\n\nconst HookEventsValues = [\n\tHookEventsName.onBeforeCellSelectionChange,\n\tHookEventsName.onAfterCellSelectionChange,\n\tHookEventsName.onBeforeColumnSelect,\n\tHookEventsName.onAfterColumnSelect,\n\tHookEventsName.onScroll,\n\tHookEventsName.onAfterScroll,\n\tHookEventsName.onBeforeRangeSelect,\n\tHookEventsName.onAfterRangeSelect,\n\tHookEventsName.onBeforeRowSelect,\n\tHookEventsName.onAfterRowSelect,\n\tHookEventsName.onBeforeColumnDeselect,\n\tHookEventsName.onAfterColumnDeselect,\n\tHookEventsName.onAfterRowDeselect,\n\tHookEventsName.onBeforeRowDeselect,\n\tHookEventsName.onBeforeCellDeSelect,\n\tHookEventsName.onAfterCellDeSelect,\n\tHookEventsName.onBeforeColumnSelect,\n\tHookEventsName.onAfterColumnSelect,\n\tHookEventsName.onBeforeRowRemove,\n\tHookEventsName.onAfterRowRemove,\n\tHookEventsName.onBeforeRowResize,\n\tHookEventsName.onAfterRowResize,\n\tHookEventsName.onBeforeRowHide,\n\tHookEventsName.onAfterRowHide,\n\tHookEventsName.onBeforeRowShow,\n\tHookEventsName.onAfterRowShow,\n\tHookEventsName.onBeforeColumnReorder,\n\tHookEventsName.onAfterColumnReorder,\n\tHookEventsName.onBeforeRowReorder,\n\tHookEventsName.onAfterRowReorder,\n\tHookEventsName.onBeforeColumnRemove,\n\tHookEventsName.onAfterColumnRemove,\n\tHookEventsName.onBeforeColumnResize,\n\tHookEventsName.onAfterColumnResize,\n\tHookEventsName.onColumnResize,\n\tHookEventsName.onBeforeColumnHide,\n\tHookEventsName.onAfterColumnHide,\n\tHookEventsName.onBeforeColumnShow,\n\tHookEventsName.onAfterColumnShow,\n\tHookEventsName.onBeforeFloatingRowStarted,\n\tHookEventsName.onAfterFloatingRowStarted,\n\tHookEventsName.onBeforeFloatingRowEnded,\n\tHookEventsName.onAfterFloatingRowEnded,\n\tHookEventsName.onAfterDataUpdate,\n\tHookEventsName.onBeforeDataUpdate,\n\tHookEventsName.onAfterRangeDeselect,\n\tHookEventsName.onBeforeRangeDeselect,\n\tHookEventsName.onBeforeRangeSelect,\n\tHookEventsName.onAfterRangeSelect,\n\tHookEventsName.onRangeSelectionChanged,\n\tHookEventsName.onBeforeRangeSelection,\n\tHookEventsName.onAfterRangeSelection,\n\tHookEventsName.onAfterUserPresenceAdd,\n\tHookEventsName.onAfterUserPresenceRemove,\n\tHookEventsName.onAfterUserPresenceUpdate,\n\tHookEventsName.onBeforeUserPresenceAdd,\n\tHookEventsName.onBeforeUserPresenceRemove,\n\tHookEventsName.onBeforeUserPresenceUpdate,\n\tHookEventsName.onBeforeCopyData,\n\tHookEventsName.onAfterCopyData,\n\tHookEventsName.onBeforeCutData,\n\tHookEventsName.onAfterCutData,\n\tHookEventsName.onBeforePasteData,\n\tHookEventsName.onAfterPasteData,\n\tHookEventsName.onBeforeRowInsert,\n\tHookEventsName.onAfterRowInsert,\n\tHookEventsName.onBeforeColumnInsert,\n\tHookEventsName.onAfterColumnInsert,\n\tHookEventsName.onBeforeColumnPinning,\n\tHookEventsName.onAfterColumnPinning,\n\tHookEventsName.onBeforeColumnDefinitionUpdate,\n\tHookEventsName.onAfterColumnDefinitionUpdate,\n\t\n\tHookEventsName.onBeforeRowSortApplied,\n\tHookEventsName.onAfterRowSortApplied,\n\n\tHookEventsName.onBeforeRowSortRemove,\n\tHookEventsName.onAfterRowSortRemove,\n\tHookEventsName.onBeforeFilterApplied,\n\tHookEventsName.onAfterFilterApplied,\n\tHookEventsName.onBeforeFilterRemove,\n\tHookEventsName.onAfterFilterRemove,\n\tHookEventsName.onAfterRowGroupingRemove,\n\tHookEventsName.onBeforeRowGroupingApplied,\n\tHookEventsName.onAfterRowGroupingApplied,\n\tHookEventsName.onBeforeRowGroupingRemove,\n\tHookEventsName.onBeforeUserPresenceAdd,\n\tHookEventsName.onAfterUserPresenceAdd,\n\tHookEventsName.onBeforeUserPresenceRemove,\n\tHookEventsName.onAfterUserPresenceRemove,\n\tHookEventsName.onBeforeUserPresenceUpdate,\n\tHookEventsName.onAfterUserPresenceUpdate,\n\tHookEventsName.onBeforeCopyData,\n\tHookEventsName.onAfterCopyData,\n\tHookEventsName.onBeforeCutData,\n\tHookEventsName.onAfterCutData,\n\tHookEventsName.onBeforePasteData,\n\tHookEventsName.onAfterPasteData,\n\tHookEventsName.onAfterFillSeries,\n\tHookEventsName.onBeforeFillSeries,\n\n\t// Tree API hooks\n\tHookEventsName.onBeforeGroupExpand,\n\tHookEventsName.onAfterGroupExpand,\n];\n\n\nconst mergemetas = (metas : Record<string, any>, hookMeta : Record<string, any>) : Record<string, any> => {\n    return {...metas, ...hookMeta};\n}\n\nexport { HookEventsName, deleteHookMeta, mergemetas, HookEventsValues };","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { HookEventsName, HookEventsValues } from \"./Constants/HookEventsName\";\nimport { IHookManager } from \"./Interface/IHookManager\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IAPIHandler } from \"../../Interface/IAPIHandler\";\n\n@Bean(GRID_BEAN_NAME.HOOK_MANAGER)\nclass HookManager extends EventEmitter implements IHookManager {\n    private hooks : Record<string, CallableFunction> = {};\n\n    @AutoWired(GRID_BEAN_NAME.API_HANDLER) apiHandler : IAPIHandler;\n\n    @PostConstruct()\n    init() {\n        const events = this.optionsHandler.getHookEvents();\n        const keys = Object.keys(events ?? {});\n        keys.forEach((key : HookEventsName)=>{\n            const callback = events[key];\n            this.addHook(key, callback);\n        })\n    }\n\n    removeHooks(hookNames: HookEventsName[]): void {\n        hookNames.forEach(hookName=>{\n            delete this.hooks[hookName];\n        });\n    }\n   \n    addHook(hookName : HookEventsName, callback : CallableFunction) {\n        // if (this.isValidHook(hookName)) {\n            this.hooks[hookName] = callback;\n        // }\n    }\n\n    hasHook(hookName : HookEventsName) : boolean {\n        return this.hooks[hookName] != undefined;\n    }\n\n    getHook(hookName : HookEventsName) : CallableFunction {\n        return this.hooks[hookName];\n    }\n \n    isValidHook(hookName : HookEventsName) : boolean {\n        return HookEventsValues.includes(hookName);\n    }\n\n    executeHook(beforeHook : HookEventsName, afterHook : HookEventsName, middleWare : CallableFunction, metas : Record<string, any>) : boolean {\n        const api = (args)=>{\n            middleWare(args);\n            return this.executeAfterHook(afterHook, args);\n        }\n        return this.executeBeforeHook(beforeHook, api, metas);\n\t}\n\n    executeOnHook(hookName : HookEventsName, middleWare : CallableFunction, metas : Record<string, any>) : boolean {\n        return this.executeBeforeHook(hookName, middleWare, metas);\n    }\n\n    executeBeforeHook(hookName : HookEventsName, middleWare : CallableFunction, metas : Record<string, any>) : boolean {\n        const isHookAvailble = this.hasHook(hookName);\n        if (isHookAvailble) {\n            metas.instanceAPI = this.apiHandler;\n            const hookCallback    = this.getHook(hookName);\n            const returnValue = hookCallback(metas);\n            if(returnValue == false) {\n                return false;\n            }\n            else if (typeof returnValue == 'object') {\n                metas = returnValue;\n            } \n            this.dispatchEvent({\n                type : hookName,\n                metas\n            })\n            middleWare(metas);\n            return true;\n        }\n        else{\n            this.dispatchEvent({\n                type : hookName,\n                metas\n            })\n            middleWare(metas);\n            return true;\n        }\n    }\n\n    executeAfterHook(hookName : HookEventsName, metas : Record<string, any>) : boolean {\n        const isHookAvailble = this.hasHook(hookName);\n        if (isHookAvailble) {\n            const hookCallback    = this.getHook(hookName);\n            hookCallback(metas);   \n        }\n        this.dispatchEvent({\n            type : hookName,\n            metas\n        })\n        return true;\n    }\n\n    executeAllHooks(beforeHookName: HookEventsName, onActionHookName: HookEventsName, afterHookName: HookEventsName, middleWare: CallableFunction, metas: Record<string, any>): boolean {\n        const isHookAvailble = this.hasHook(beforeHookName) || this.hasHook(afterHookName) || this.hasHook(onActionHookName);\n        if(isHookAvailble){\n            const beforeCallback = this.getHook(beforeHookName);\n            const returnValue    = beforeCallback?.(metas);\n            if(returnValue == false){\n                return false;\n            }\n            else if (typeof returnValue == 'object') {\n                metas = returnValue;\n            }\n            this.executeHook(onActionHookName, afterHookName, middleWare, metas);\n            return true;\n        }\n        else{\n            this.dispatchEvent({\n                type : beforeHookName,\n                metas\n            })\n            middleWare(metas);\n            return true;\n        }\n    }\n}\n\n\nexport{ HookManager };\n","import { ICellEditorComponent } from \"../../GridComponent/Interface/CellEditor/ICellEditorComponent\";\nimport { ICellRendererComponent } from \"../../GridComponent/Interface/CellRenderer/ICellRendererComponent\";\nimport { IHeaderCellRendererComponent } from \"../../GridComponent/Interface/HeaderCellRenderer/IHeaderCellRendererComponent\";\nimport { ILoadingCellRendererComponent } from \"../../GridComponent/Interface/LoadingCellRenderer/ILoadingCellRenderer\";\nimport { ISummaryCellRenderer } from \"../../GridComponent/Interface/SummaryCellRenderer/ISummaryCellRenderer\";\nimport { ICellRendererParams } from \"../../GridComponent/Interface/CellRenderer/ICellRendererParams\";\nimport { columnDataType, columnPinPositions, rowPinPositions } from \"../Constants/GridConfigurationConstants\";\nimport { CellEditorPopupPosition } from \"./IColumnNode\";\nimport { IColumnProperties } from \"../../ColumnProperties/IColumnProperties\";\nimport { IComponent } from \"@dg/corecomponent\";\nimport { DateTime } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/date-time\";\nimport { TimeLineViewType } from \"./IGridConfiguration\";\n// import { ICellComponent } from \"./IGridLayout\";\n\n// interface  IColumnHeader{\n//     renderer ?: ({columnIndex, columnID} : any)=>any,\n//     height ?: number\n// }\n\nexport interface ClassConstructorType<T> {\n\tnew (): T;\n  }\n \nexport type IColumnType = 'number' | 'percent' | 'currency' | 'text' | 'multiline' | 'link' |'date' | 'checkbox' |'rating' | 'multiselect' | 'singleselect' | 'phone_number'\n\nexport interface IHeaderEditableParams {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Unique identifier for the column. Used in APIs to reference this column.\"\n\t*\t})\n\t*/\n\t  columnId: string;\n}\n\nexport interface ColumnSpanParams {\n\tcolumnId      : string;\n\trowIndex      : number;\n\trowId         : string;\n\trowPinPosition: rowPinPositions;\n\tdata          : Record<string, any>;\n\tvalue         : any;\n}\n\n\nexport interface IColumnData {\n\tdate             : Date | string | DateTime;\n\tviewType         : TimeLineViewType;\n\ttotalDayInMonth  : number;\n\tdateUtilInstance : any;\n\ttopTierTitle     : string;\n\tbottomTierData   : string[];\n}\n\ninterface IColumnGroupDefinition {\n\tgroupId       ?: string;\n\theaderName    ?: string;\n\tchildren       : (IColumnDefinition | IColumnGroupDefinition)[];\n\n\t// Pinning\n\tpinPosition   ?: columnPinPositions;\n\n\t// Expand/collapse\n\topenByDefault ?: boolean;\n\tmarryChildren ?: boolean;\n\n\t// Rendering\n\theaderGroupCellRenderer       ?: any;\n\theaderGroupCellRendererParams ?: any;\n\n\t// Styling\n\theaderClass  ?: string | string[];\n\theaderStyle  ?: Record<string, string>;\n\n\t// Behavior\n\tsuppressStickyLabel    ?: boolean;\n\theaderTooltip          ?: string;\n\tenableSpanning         ?: boolean;\n}\n\ninterface IColumnDefinition {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Unique identifier for the column. Used in APIs to reference this column.\"\n\t*\t})\n\t*/\n  columnId?: string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"CRITICAL: Data field key that maps this column to a property in rowData objects. Without columnKey, no data will render in the column. Must match the property name in your row data objects. Example: if rowData is [{ name: 'Alice' }], then columnKey must be 'name' to display 'Alice'.\"\n\t*\t})\n\t*/\n\tcolumnKey?: string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Pin column to left, right, center (unpinned), or as a row header.\",\n\t*\t\"default\": \"center\"\n\t*\t})\n\t*/\n\t  pinPosition?: columnPinPositions;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Low-level data type for the column. Used by ColumnDataTypeHandler internally for data type operations like sorting, filtering, and comparisons. Distinct from 'type' which selects visual renderer.\",\n\t*\t\"note\": \"its not working now\"\n\t*\t})\n\t*/\n\t  dataType?: columnDataType;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Display text shown in the column header.\"\n\t*\t})\n\t*/\n\t  headerName?: string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, column cannot be resized, moved, or hidden by user.\"\n\t*\t})\n\t*/\n\t  locked?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, column is hidden initially.\"\n\t*\t})\n\t*/\n\t  hidden?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, column can be resized by the user.\"\n\t*\t})\n\t*/\n\t  resizable?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Data type of the column; used for formatting, editing, and selecting the appropriate built-in renderer. Internally mapped to cell rendering components (e.g., 'text' → dgTextCellRenderingComponent, 'checkbox' → dgCheckboxCellRenderingComponent).\",\n\t*\t\"note\": \"its not working now\"\n\t*\t})\n\t*/\n\t  type?: IColumnType;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"note\": \"its not working now\",\n\t*\t\"description\": \"Type-specific field properties (e.g., INumberProperties for numbers, IDateProperties for dates, IMultiselectProperties for multi-select). Controls formatting, validation, and field-specific behavior.\"\n\t*\t})\n\t*/\n\t  fieldProperties?: IColumnProperties;\n\tcolumnData     ?: IColumnData;\n\n    //width\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Width of the column in pixels. Internal default: 100px.\",\n\t*\t\"default\": \"100px\"\n\t*\t})\n\t*/\n\t  width?: number | 'auto';\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Minimum column width in pixels. Internal default: 30px.\",\n\t*\t\"default\": \"30px\"\n\t*\t})\n\t*/\n\t  minWidth?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Maximum column width in pixels. Internal default: Infinity.\",\n\t*\t\"default\": \"Infinity\"\n\t*\t})\n\t*/\n\t  maxWidth?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Flex factor for distributing available space among columns.\"\n\t*\t})\n\t*/\n\tflex?: number;\n\n\tmaxColumnAuto?: number;\n\n\n    //cell renderer\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom cell renderer class or registered component name.\",\n\t*\t\"note\": \"type string is not working now\"\n\t*\t})\n\t*/\n\t  cellRenderer?: ICellRendererComponent | string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters passed to the cell renderer. Can be a static object or a function that receives cell renderer params.it will passed to cellRenderer's init method\"\n\t*\t})\n\t*/\n\t  cellRendererParams?: CellRendererParamsFunction | Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to dynamically select a cell renderer based on row data. Returns { component, params } or undefined.\"\n\t*\t})\n\t*/\n\t  cellRendererSelector?: CellRendererSelectorFunction;\n\n    //header renderer\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom header cell renderer.\"\n\t*\t})\n\t*/\n      headerCellRenderer?: IHeaderCellRendererComponent | string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters passed to the header cell renderer.\"\n\t*\t})\n\t*/\n      headerCellRendererParams?: HeaderCellRendererParamsFunction | Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to dynamically select a header cell renderer.\"\n\t*\t})\n\t*/\n      headerCellRendererSelector?: HeaderCellRendererSelectorFunction;\n\n    //editor renderer\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom cell editor class or registered component name.\"\n\t*\t})\n\t*/\n\t  cellEditor?: ICellEditorComponent | string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters passed to the cell editor.\"\n\t*\t})\n\t*/\n\t  cellEditorParams?: CellEditorParamsFunction | Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to dynamically select a cell editor. Can return popup and popupPosition.\"\n\t*\t})\n\t*/\n\t  cellEditorSelector?: CellEditorSelectorFunction;\n\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Editor component for header cell editing.\"\n\t*\t})\n\t*/\n\t  headerCellEditorParams?: ICellEditorComponent;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom header cell editor params function for inline header editing.\"\n\t*\t})\n\t*/\n\t  headerCellEditor?: CellEditorParamsFunction;\n\n    //summary renderer\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Custom summary row cell renderer. Internally resolved by UserComponentHandler.getSummaryCellRendererDetails().\"\n\t*\t})\n\t*/\n      summaryCellRenderer?: ISummaryCellRenderer | string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Parameters passed to the summary cell renderer.\"\n\t*\t})\n\t*/\n      summaryCellRendererParams?: SummaryCellRendererParamsFunction | Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to dynamically select a summary cell renderer.\"\n\t*\t})\n\t*/\n      summaryCellRendererSelector?: SummaryCellRendererSelectorFunction;\n\n    //loading\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom loading cell renderer shown while data is being fetched.\"\n\t*\t})\n\t*/\n      loadingRenderer?: ILoadingCellRendererComponent | string;\n\tloadingRendererParams    ?: CellLoadingRendererParamsFunction | Object | null;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to dynamically select a loading cell renderer.\"\n\t*\t})\n\t*/\n\t  loadingRendererSelector?: CellLoadingRendererSelectorFunction;\n\n    //editor position\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, the editor renders as a popup overlay.\"\n\t*\t})\n\t*/\n      cellEditorPopup?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Position of the popup editor relative to the cell.\"\n\t*\t})\n\t*/\n\t  cellEditorPopupPosition?: CellEditorPopupPosition;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"CSS class(es) applied to cells in this column.\"\n\t*\t})\n\t*/\n\t  cellClass?: string | string[] | CallableFunction;\n\n\t//toolTip\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom tooltip renderer for the column header.\"\n\t*\t})\n\t*/\n      headerCellToolTipRenderer?: any;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters passed to the header tooltip renderer.\"\n\t*\t})\n\t*/\n      headerCellToolTipRendererParams?: any;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to dynamically select a header tooltip renderer.\"\n\t*\t})\n\t*/\n      headerCellToolTipRendererSelector?: any;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom tooltip renderer for cells in this column.\"\n\t*\t})\n\t*/\n      toolTipRenderer?: any;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters passed to the tooltip renderer.\"\n\t*\t})\n\t*/\n      toolTipRendererParams?: any;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to dynamically select a tooltip renderer.\"\n\t*\t})\n\t*/\n      toolTipRendererSelector?: any;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Show a message when user tries to edit a non-editable cell.\"\n\t*\t})\n\t*/\n\t  showNonEditableMessage?: boolean | ((params : any) => boolean);\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom non-editable message text.\"\n\t*\t})\n\t*/\n\t  nonEditableMessage?: string | ((params : any) => string);\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom component renderer for the non-editable message.\"\n\t*\t})\n\t*/\n\t  nonEditableMessageRenderer?: ClassConstructorType<IComponent<any>>;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters passed to the non-editable message renderer.\"\n\t*\t})\n\t*/\n\t  nonEditableMessageRendererParams?: {[key : string] : any};\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, keyboard navigation skips this column.\"\n\t*\t})\n\t*/\n\t  suppressNavigation?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, uses the value formatter when exporting (CSV).\"\n\t*\t})\n\t*/\n\t  useValueFormatterForExport?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true (or function returns true), column cells are editable.\"\n\t*\t})\n\t*/\n\t  editable?: boolean | ((params : any) => boolean);\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, the header text itself is editable. Params include { columnId }.\"\n\t*\t})\n\t*/\n\t  headerEditable?: boolean | ((params : IHeaderEditableParams) => boolean);\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, Enter key navigates vertically instead of editing (per-column override).\"\n\t*\t})\n\t*/\n\t  enterNavigatesVertically?:boolean;\n\t\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, Enter key navigates down after completing an edit (per-column override).\"\n\t*\t})\n\t*/\n \t  enterNavigatesVerticallyAfterEdit?:boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, the column can be reordered via drag.\"\n\t*\t})\n\t*/\n\t  draggable?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for grouped row cells in this column.\"\n\t*\t})\n\t*/\n\t  groupCellRenderer?: (new () => ICellRendererComponent);\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to dynamically select a group cell renderer.\"\n\t*\t})\n\t*/\n\t  groupCellRendererSelectors?: GroupCellRendererSelectorFunction;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters passed to the group cell renderer.\"\n\t*\t})\n\t*/\n\t  groupCellRendererParams?: GroupCellRendererParamsFunction | Object;\n\n\n\t// Nested header visibility / spanning\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, the column can be spanned by nested headers.\"\n\t*\t})\n\t*/\n\tcolumnGroupShow         ?: 'open' | 'closed' | null;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"columns\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, the height of the nested header is suppressed. this is used to hide the height of the nested header.\"\n\t*\t})\n\t*/\n\tsuppressSpanHeaderHeight?: boolean;\n}\n\ninterface IRecordHeaderColumnDefinitions {\n\tcolumnId                 ?: string;\n\tcolumnKey                ?: string;\n\thidden                   ?: boolean;\n\twidth                    ?: number;\n\tminWidth                 ?: number;\n\tmaxWidth                 ?: number;\n    //cell renderer\n\tcellRenderer             ?: ICellRendererComponent;\n\tcellRendererParams       ?: CellRendererParamsFunction | Object;\n\tcellRendererSelector     ?: CellRendererSelectorFunction;\n\n    //header renderer\n    headerCellRenderer        ?: IHeaderCellRendererComponent;\n    headerCellRendererParams  ?: HeaderCellRendererParamsFunction | Object;\n    headerCellRendererSelector?: HeaderCellRendererSelectorFunction;\n\n    //summary renderer\n    summaryCellRenderer        ?: ISummaryCellRenderer;\n    summaryCellRendererParams  ?: SummaryCellRendererParamsFunction | Object;\n    summaryCellRendererSelector?: SummaryCellRendererSelectorFunction;\n\n    //loading\n\tloadingRenderer        ?: ILoadingCellRendererComponent;\n\tloadingRendererParams  ?: CellLoadingRendererParamsFunction | Object | null;\n\tloadingRendererSelector?: CellLoadingRendererSelectorFunction;\n\n\t//toolTip\n    headerCellToolTipRenderer        ?: any;\n    headerCellToolTipRendererParams  ?: any;\n    headerCellToolTipRendererSelector?: any;\n    toolTipRenderer                  ?: any;\n    toolTipRendererParams            ?: any;\n    toolTipRendererSelector          ?: any;\n\teditorToolTipRenderer\t\t\t ?: any;\n\teditorToolTipRendererParams\t\t ?: any;\n\n\tgroupCellRenderer         ?: (new () => ICellRendererComponent);\n\tgroupCellRendererSelectors?: GroupCellRendererSelectorFunction;\n\tgroupCellRendererParams   ?: GroupCellRendererParamsFunction | Object;\n}\n\ninterface IColumnDefaults {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"defaults\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Maximum width for all columns (global default). Can be overridden per-column.\",\n\t*\t\"note\": \"From IColumnDefaults. Internal constant: defaultColumnMaxWidth = 500\"\n\t*\t})\n\t*/\n      maxColumnWidth?: number,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"defaults\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Minimum width for all columns (global default). Can be overridden per-column.\",\n\t*\t\"note\": \"From IColumnDefaults. Internal constant: defaultColumnMinWidth = 80\"\n\t*\t})\n\t*/\n      minColumnWidth?: number,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"defaults\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Default width for all columns (global default). Can be overridden per-column.\",\n\t*\t\"note\": \"From IColumnDefaults. Internal constant: defaultColumnWidth = 100\"\n\t*\t})\n\t*/\n      columnWidth?: number\n}\n\ninterface CellEditorSelectorFunction {\n    (params: any): CellEditorSelector | undefined;\n}\n\ninterface CellRendererSelectorFunction {\n    (params: any): CellRendererSelector | undefined;\n}\n\ninterface GroupCellRendererSelectorFunction {\n    (params: any): GroupCellRendererSelector | undefined;\n}\n\ninterface HeaderCellRendererSelectorFunction {\n\t(params: any): HeaderCellRendererSelector | undefined;\n}\n\ninterface SummaryCellRendererSelectorFunction {\n\t(params: any): SummaryCellRendererSelector | undefined;\n}\n\ninterface CellLoadingRendererSelectorFunction {\n\t(params: any): CellLoadingRendererSelector | undefined;\n}\n\ninterface CellRendererParamsFunction {\n    (params: ICellRendererParams): any;\n}\n\ninterface GroupCellRendererParamsFunction {\n    (params: ICellRendererParams): any;\n}\n\ninterface HeaderCellRendererParamsFunction {\n\t(params: any): any;\n}\n\ninterface SummaryCellRendererParamsFunction {\n\t(params: any): any;\n}\n\ninterface CellLoadingRendererParamsFunction {\n    (params : ICellRendererParams) : any;\n}\n\ninterface CellEditorParamsFunction {\n    (params : any) : any;\n}\n\ninterface CellEditorSelector {\n\tcomponent    ?: any;\n\tparams       ?: any;\n\tpopup        ?: boolean;\n\tpopupPosition?: 'over' | 'under';\n}\n\ninterface RendererSelector {\n    component?: any;\n    params   ?: any;\n}\n\n\ninterface CellRendererSelector  extends RendererSelector{\n\n}\n\ninterface GroupCellRendererSelector  extends RendererSelector{\n\n}\n\ninterface HeaderCellRendererSelector extends RendererSelector{\n\n}\n\ninterface SummaryCellRendererSelector extends RendererSelector{}\ninterface CellLoadingRendererSelector {\n    component?: any;\n    params   ?: any;\n}\n\ntype ColumnDefInput = IColumnDefinition | IColumnGroupDefinition;\n\nfunction isColumnGroup(def: ColumnDefInput): def is IColumnGroupDefinition {\n\treturn !!(def as any) && Array.isArray((def as any).children);\n}\n\nexport {\n\tIColumnDefinition,\n\tIColumnGroupDefinition,\n\tColumnDefInput,\n\tisColumnGroup,\n\tIRecordHeaderColumnDefinitions,\n\tIColumnDefaults,\n\tCellEditorSelectorFunction,\n\tCellEditorSelector,\n\tCellRendererParamsFunction,\n\tCellRendererSelector,\n\tCellRendererSelectorFunction,\n\tCellEditorParamsFunction,\n\tCellLoadingRendererParamsFunction,\n\tCellLoadingRendererSelector,\n\tCellLoadingRendererSelectorFunction,\n\tHeaderCellRendererParamsFunction,\n\tHeaderCellRendererSelectorFunction,\n\tHeaderCellRendererSelector,\n\tSummaryCellRendererSelectorFunction,\n\tSummaryCellRendererSelector,\n\tSummaryCellRendererParamsFunction,\n\tGroupCellRendererSelectorFunction,\n\tGroupCellRendererSelector,\n\tGroupCellRendererParamsFunction\n};\n","import { columnDataType, columnPinPositions, rowHeaderPosition } from \"../Constants/GridConfigurationConstants\";\nimport { CellEditorParamsFunction, CellEditorSelectorFunction, CellLoadingRendererParamsFunction, CellLoadingRendererSelectorFunction, CellRendererParamsFunction, CellRendererSelectorFunction, ClassConstructorType, GroupCellRendererParamsFunction, GroupCellRendererSelectorFunction, HeaderCellRendererParamsFunction, HeaderCellRendererSelectorFunction, IColumnDefinition, IHeaderEditableParams, SummaryCellRendererParamsFunction, SummaryCellRendererSelectorFunction } from \"./IColumnDefinition\";\nimport { ICellRendererComponent } from \"../../GridComponent/Interface/CellRenderer/ICellRendererComponent\";\nimport { IHeaderCellRendererComponent } from \"../../GridComponent/Interface/HeaderCellRenderer/IHeaderCellRendererComponent\";\nimport { ISummaryCellRenderer } from \"../../GridComponent/Interface/SummaryCellRenderer/ISummaryCellRenderer\";\nimport { ILoadingCellRendererComponent } from \"../../GridComponent/Interface/LoadingCellRenderer/ILoadingCellRenderer\";\nimport { ICellEditorComponent } from \"../../GridComponent/Interface/CellEditor/ICellEditorComponent\";\nimport { IRowNodeCore } from \"../../../DataStore/rownode.types\";\nimport { IColumnNodeHelper } from \"../Columns/ColumnNode\";\nimport { IComponent } from \"@dg/corecomponent\";\nimport { DateTime } from 'luxon';\n\n\ninterface IColumnNode {\n    getHeaderCellEditor(): any;\n    getHeaderCellEditorParams(): any;\n    // getter\n    getFlex() : number;\n    getID()                         : string ;\n    getPinnedPosition()             : columnPinPositions ;\n    getWidth()                      : number ;\n    isLocked()                      : boolean | null ;\n    getColumnKey()                   : string ;\n    getDataType()                   : columnDataType ;\n    getMinWidth()                   : number ;\n    getMaxWidth()                   : number ;\n    isResizable()                   : boolean ;\n    isDragging()                    : boolean | null ;\n    isSelected()                    : boolean | null ;\n    getFieldProperties():any\n    \n    getIndex()                      : number;\n    getLeft()                       : number;\n    getCellClass()                  : CallableFunction | string | string[] | null | undefined ;\n    \n   \n    getHeaderName()                 : string;\n    isHide()                        : boolean;\n\n    // cell renderer\n    getRenderer()            : ICellRendererComponent | string | null;\n    getCellRendererParams()  : CellRendererParamsFunction | Object | null;\n    getCellRendererSelector(): CellRendererParamsFunction | null;\n\n    // header cell renderer\n    getHeaderRenderer()            : IHeaderCellRendererComponent | string | null ;\n    getHeaderCellRendererParams()  : HeaderCellRendererParamsFunction | Object | null;\n    getHeaderCellRendererSelector(): HeaderCellRendererSelectorFunction;\n\n    // summary cell renderer\n    getSummaryRenderer()            : ISummaryCellRenderer | string | null ;\n    getSummaryCellRendererParams()  : SummaryCellRendererParamsFunction | Object | null;\n    getSummaryCellRendererSelector(): SummaryCellRendererSelectorFunction;\n\n    // loading cell renderer\n\n    getLoadingRenderer()        : ILoadingCellRendererComponent | string;\n    getLoadingRendererParams()  : CellLoadingRendererParamsFunction |Object |  null;\n    getLoadingRendererSelector(): CellLoadingRendererSelectorFunction | null;\n\n    // cellEditor\n    getCellEditor()             : any;\n    getCellEditorParams()       : CellEditorParamsFunction | Object | null;\n    getCellEditorSelector()     : CellEditorSelectorFunction | null;\n    isCellEditorPopup()         : boolean;\n    getCellEditorPopupPosition(): CellEditorPopupPosition;\n\n    getUserColumnDefinition() : IColumnDefinition;\n    updateUserDefinition(columnDefinition : IColumnDefinition) : void\n\n    //toolTip Renderer\n    getToolTipRenderer()        : any;\n    getToolTipRendererParams()  : any | Object | null;\n    getToolTipRendererSelector(): any;\n\n    getHeaderCellToolTipRenderer()        : any;\n    getHeaderCellToolTipRendererParams()  : any | Object | null;\n    getHeaderCellToolTipRendererSelector(): any;\n\n    hasHeaderCellToolTipRenderer():boolean;\n    hasToolTipRenderer():boolean;\n\n    \n    // setter\n    \n    updateFlex(flex : number)                      : void;\n    updatePinPosition(position: columnPinPositions): void ;\n    updateWidth(width : number)                    : void ;\n    updateLockedState(state: boolean)              : void ;\n    updateFieldKey()                               : string ;\n    updateDataType(dataType : columnDataType)      : void;\n    updateMinWidth(minWidth : number)              : void;\n    updateMaxWidth(maxWidth : number)              : void;\n    updateDraggingState(state: boolean)            : void;\n    updateSelectedState(state: boolean)            : void;\n    updateComputedWidth(width: number)             : void;\n    updateHide(hide : boolean)                     : void;\n    updateHeaderName(name : string)                : void;\n    onMouseLeave()                                 : void;\n    onMouseEnter()                                 : void;\n\n    // summary cell renderer\n    updateSummaryCellRenderer(summaryCellRenderer : ISummaryCellRenderer) : void;\n    updateSummaryCellRendererParams(summaryCellRendererParams : SummaryCellRendererParamsFunction): void;\n    updateSummaryCellRendererSelector(selector : SummaryCellRendererSelectorFunction) : void;\n\n    // header cell renderer\n    updateHeaderRender(headerRenderer : IHeaderCellRendererComponent)                          : void;\n    updateHeaderCellRendererParams(headerCellRendererParams : HeaderCellRendererParamsFunction): void;\n    updateHeaderCellRendererSelector(selector : HeaderCellRendererSelectorFunction)            : void;\n\n    // loading cell renderer\n    updateLoadingRenderer(renderer : any)                                                         : void;\n    updateLoadingRendererParams(params : CellLoadingRendererParamsFunction | null)                : void;\n    updateLoadingRendererSelector(selector :CellLoadingRendererSelectorFunction)                  : void;\n\n    // cell renderer\n    updateRenderer(renderer : ICellRendererComponent)                              : void;\n    updateCellRendererParams(cellRendererParams : CellRendererParamsFunction)      : void;\n    updateCellRendererSelector(cellRendererSelector : CellRendererSelectorFunction): void;\n\n    // cell editor\n    updateCellEditor(editor : ICellEditorComponent)                                 : void;\n    updateCellEditorParams(cellEditorParams : CellEditorParamsFunction)             : void;\n    updateCellEditorSelector(cellEditorSelector : CellEditorSelectorFunction)       : void;\n    updateCellEditorPopup(cellEditorPopup : boolean)                                : void;\n    updateCellEditorPopupPosition(cellEditorPopupPosition : CellEditorPopupPosition): void;\n\n\n    addEventListener(eventType: string, listener: EventListener, async?: boolean, options?: AddEventListenerOptions): void;\n    removeEventListener(eventType: string, listener: EventListener, async?: boolean, options?: AddEventListenerOptions): void;\n\n    isSuppressNavigation(rowNode : IRowNodeCore) : boolean;\n\n\tupdateHelper(helper : IColumnNodeHelper) : void;\n\n    isValueFormatterForExport() : boolean;\n\n    setHighlighted(position : ColumnHighlightPosition) : void;\n    getHighlight() : ColumnHighlightPosition | null;\n    isEditable(params : any) : boolean | null;\n    isHeaderEditable(params : IHeaderEditableParams) : boolean | null;\n\n    // non editable message starts\n\n    isNonEditableMessageEnabled(params : any) : boolean | ((params : any) => boolean);\n    getNonEditableMessage() : string | ((params : any) => string) | null;\n    getNonEditableMessageRenderer() : ClassConstructorType<IComponent<any>>;\n    getNonEditableMessageRendererParams() : {[key : string] : any} | null;\n\n\n    updateNonEditableMessageOption(showNonEditableMessage : boolean | ((params : any) => boolean)) : void;\n    updateNonEditableMessage(nonEditableMessage : string | ((params : any) => string) | null) : void;\n    updateNonEditableMessageRenderer(nonEditableMessageRenderer : ClassConstructorType<IComponent<any>>) : void;\n    updateNonEditableMessageRendererParams(nonEditableMessageRendererParams : {[key : string] : any}) : void;\n\n\n    //non editable message ends\n\n    //navaigation starts\n        updateEnterNavigatesVertically(enterNavigatesVertically : boolean ) : void;\n        isEnterNavigatesVertically() : boolean;\n\n        updateEnterNavigatesVertiallyAfterEdit(enterNavigatesVertiallyAfterEdit : boolean) : void;\n        isEnterNavigatesVertiallyAfterEdit() : boolean;\n    // navaigation ends\n\n    isDraggable() : boolean;\n\n\n    //Gantt\n    getTimeFrame():DateTime\n    getTimeFrameCount():number;\n    getWeekEnds():number[];\n    getWeekEnds(): number[];\n    getTopTierTitle():string\n\n\tgetBottomTierIndexByDate(date: Date): number;\n\n    getGroupHeaderCellRendererSelectors(): GroupCellRendererSelectorFunction;\n    getGroupHeaderCellRendererParams()   : GroupCellRendererParamsFunction | Object;\n    getGroupHeaderCellRenderer()         : (new () => ICellRendererComponent) | undefined;\n}\n\ntype CellEditorPopupPosition = 'under' | 'over'\n\n\ninterface IColumnNodeDS {\n    id        : string;\n    pinned    : columnPinPositions;\n    width     : number;\n    locked    : boolean | null;\n    fieldKey  : string;\n    dataType  : columnDataType;\n    minWidth  : number;\n    maxWidth  : number;\n    resizable : boolean;\n    headerName: string;\n    hide      : boolean;\n    type : string;\n    fieldProperties:any;\n\n    flex : number;\n\tdragging : boolean | null;\n\tselected : boolean | null;\n\tcellClass: CallableFunction | string | string[];\n    \n    // cell renderer\n    renderer            : ICellRendererComponent | string | null;\n    cellRendererParams  : CellRendererParamsFunction | Object;\n    cellRendererSelector: CellRendererSelectorFunction;\n\n\n    // summary cell renderer\n    summaryRenderer            : ISummaryCellRenderer | string | null;\n    summaryCellRendererParams  : SummaryCellRendererParamsFunction | Object;\n    summaryCellRendererSelector: SummaryCellRendererSelectorFunction;\n\n    // loading cell renderer\n    loadingRenderer        : ILoadingCellRendererComponent | string;\n    loadingRendererParams  : CellLoadingRendererParamsFunction | Object | null;\n    loadingRendererSelector: CellLoadingRendererSelectorFunction;\n\n\n    // header cell renderer\n    headerRenderer             : IHeaderCellRendererComponent | string | null;\n    headerCellRendererParams   : HeaderCellRendererParamsFunction | Object;\n    headerCellRendererSelector : HeaderCellRendererSelectorFunction;\n\n    // cell editor\n\n    cellEditor             : any;\n    cellEditorSelector     : CellEditorSelectorFunction;\n    cellEditorParams       : CellEditorParamsFunction | Object;\n    cellEditorPopup        : boolean;\n    cellEditorPopupPosition: CellEditorPopupPosition;\n\n    headerCellEditor           : any;\n    headerCellEditorParams     : CellEditorParamsFunction | Object;\n\n    //toolTip\n    headerCellToolTipRenderer        : any;\n    headerCellToolTipRendererParams  : any;\n    headerCellToolTipRendererSelector: any;\n    toolTipRenderer                  : any;\n    toolTipRendererParams            : any;\n    toolTipRendererSelector          : any;\n\n\n\tshowNonEditableMessage          : boolean | ((params : any) => boolean);\n\tnonEditableMessage              : string | ((params : any) => string);\n\tnonEditableMessageRenderer      : ClassConstructorType<IComponent<any>>;\n\tnonEditableMessageRendererParams: {[key : string] : any};\n\n    suppressNavigation : boolean | ((params : {node : IRowNodeCore, column : IColumnNode}) => boolean | undefined);\n    useValueFormatterForExport : boolean;\n\n    editable       : boolean | ((params : any) => boolean);\n    headerEditable : boolean | ((params : IHeaderEditableParams) => boolean);\n\n    enterNavigatesVertically         : boolean;\n    enterNavigatesVerticallyAfterEdit: boolean;\n\n    draggable : boolean;\n\n    groupCellRenderer         : (new () => ICellRendererComponent);\n    groupCellRendererSelectors: GroupCellRendererSelectorFunction;\n    groupCellRendererParams   : GroupCellRendererParamsFunction | Object;\n}\n\ninterface IRecordHeaderColumnNode {\n    id      : string;\n    pinned  : rowHeaderPosition;\n    hidden  : boolean;\n    fieldKey: string;\n\n    //width\n\twidth                     : number;\n\tminWidth                  : number;\n\tmaxWidth                  : number;\n\t\n\n    //cell renderer\n\trenderer            : ICellRendererComponent | null;\n\tcellRendererParams  : CellRendererParamsFunction | Object;\n\tcellRendererSelector: CellRendererSelectorFunction;\n\n    // loading renderer\n\tloadingRenderer        : ILoadingCellRendererComponent;\n\tloadingRendererParams  : CellLoadingRendererParamsFunction | Object | null;\n\tloadingRendererSelector: CellLoadingRendererSelectorFunction;\n\n    //header cell renderer\n\theaderRenderer            : IHeaderCellRendererComponent | null;\n    headerCellRendererParams  : HeaderCellRendererParamsFunction | Object;\n    headerCellRendererSelector: HeaderCellRendererSelectorFunction;\n\n    //summary cell renderer\n    summaryRenderer            : ISummaryCellRenderer | null;\n    summaryCellRendererParams  : SummaryCellRendererParamsFunction | Object;\n    summaryCellRendererSelector: SummaryCellRendererSelectorFunction;\n\n    //toolTip\n    headerCellToolTipRenderer        : any;\n    headerCellToolTipRendererParams  : any;\n    headerCellToolTipRendererSelector: any;\n    toolTipRenderer                  : any;\n    toolTipRendererParams            : any;\n    toolTipRendererSelector          : any;\n    editorToolTipRenderer\t\t\t ?: any;\n\teditorToolTipRendererParams\t\t ?: any;\n\n    groupCellRenderer         : (new () => ICellRendererComponent);\n    groupCellRendererSelectors: GroupCellRendererSelectorFunction;\n    groupCellRendererParams   : GroupCellRendererParamsFunction | Object;\n\n\n}\n\nexport type ColumnHighlightPosition  = \"left\" | \"right\"\n\n\nexport {\n\tIColumnNodeDS,\n\tIColumnNode,\n\tIRecordHeaderColumnNode,\n\tCellEditorPopupPosition,\n};","import { ColumnDefInput, IColumnDefaults, IColumnDefinition, IColumnGroupDefinition, IRecordHeaderColumnDefinitions } from './IColumnDefinition';\nimport { IFilterConfigurations } from './IFilterConfigurations';\nimport { IFetchParam, IRowDefaults, IRowDefinitions, IRowHeightsConfigFormat } from './IRowDefinitions';\nimport { IRowGroupingConfigurations } from './IRowGroupingConfigurations';\nimport { IRowNode } from './IRowNode';\nimport { ISortConfigurations } from './ISortConfigurations';\n\nimport { IRowNodeCore } from '../../../DataStore/rownode.types';\nimport { IColumnNode } from './IColumnNode';\nimport { IUserPresenceMeta } from './IUserPresenceMeta';\nimport { ShortcutParams } from '../actions/key-board-shortcut-registry';\nimport { IAPIHandler, IBaseComponent, IRowReoderParams } from '../../Main';\nimport { RowContainerType } from '../../GridComponent/GridBodyComponent/RowContainer/utils/type';\nimport { IRegisterRowSelection } from '../../GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController';\nimport { RowNodeCore } from '../../../DataStore/RowNodeCore';\nimport { rowPinPositions } from '../Constants/GridConfigurationConstants';\nimport { IActionRenderer, ITimelineSettings } from '../../../GanttModelClasses/IGanttConfiguration';\nimport { VIEW_TYPE } from '../Columns/FieldHandler';\nimport { HookEventsName } from '../Hooks/Constants/HookEventsName';\nimport { IHideRowsHookParams, IInsertRowsHookParams, IRemoveRowsHookParams, ISetRowsHeightHookParams, IRowDataChangeHookParamsWithoutAPI, IRowsCacheClearHookParams } from '../../API/RowAPI/Interface/IRowAPIHookParams.types';\nimport { IColumnsWidthUpdateHookParams, IHideColumnsHookParams, IInsertColumnsHookParams, IRemoveColumnsHookParams, IShowColumnsHookParams, IUpdateColumnsDefinitonHookParams } from '../../API/ColumnAPI/Interface/IColumnHookAction';\nimport { IDataUpdateHookParams } from '../../API/CellAPI/Interface/ICellHookAction';\nimport { IMoveColumnsHookParams, IMoveRowsHookParams } from '../../API/ReorderableAPI/Interface/IReorderableHookParams';\nimport { IScrollByHookParams, IScrollToHookParams } from '../../API/NavigationAPI/Interface/INavigationAPIHookAction';\nimport { IColumnPinningHookParams } from '../../API/PinningAPI/Interface/IPinningAPIHookParams.types';\nimport { ICommitAndUnFloatRowHookParams, IFloatRowHookParams } from '../../API/FloatingRowAPI/Interface/IFloatingRowAPIHookAction';\nimport { IAddSortHookParams, IRemoveSortHookParams } from '../../API/SortAPI/Interface/ISortHookHandler.types';\nimport { IAddFilterHookParam, IRemoveFilterHookParam } from '../../API/FilterAPI/Interface/IFilterHookHandler.types';\nimport { IAddRowGroupHookParams, IRemoveRowGroupHookParams } from '../../API/RowGroupingAPI/Interface/IRowGroupingHookHandler.types';\nimport { IAddUserPresenceHookParams, IRemoveUserPresenceHookParams, IUpdateUserPresenceHookParams } from '../../API/user-presence/user-presence-hooks.types';\nimport { IClipboardHookParams } from '../../API/ClipboardAPI/Interface/IClipboardHookParams.types';\nimport { ITreeExpandCollapseMetas } from '../../API/TreeAPI/Interface/ITreeApi';\nimport { HookInitiator } from '../../Interface/Hooks';\nimport { CellPositionType } from '../Navigation/cell-position.types';\nimport { CellRangeType } from '../../../rangeselection/range-selection-handler.types';\n\ntype IGenericHookEventParams = Record<string, any>;\ntype ICellSelectionChangeHookParams = {\n    previous: CellPositionType | null;\n    current: CellPositionType;\n    eventOrigin: HookInitiator;\n    event: Event | null;\n};\ntype IRowSelectionHookParams = {\n    eventOrigin: HookInitiator;\n    event: Event | null;\n    selectionModel: 'index' | 'id';\n    type: 'rowSelection';\n    values: number[] | string[];\n};\ntype IColumnSelectionHookParams = {\n    columnIds: string[];\n    eventOrigin: HookInitiator;\n    event: Event | null;\n};\ntype IRangeSelectionHookParams = {\n    cellRanges: CellRangeType[];\n    eventOrigin: 'api' | 'ui';\n};\ntype IFillSeriesHookParams = {\n    range: CellRangeType;\n    initialRange: CellRangeType;\n};\ntype ITreeExpandCollapseHookParams = {\n    metas: ITreeExpandCollapseMetas[];\n    eventOrigin?: HookInitiator;\n    event?: Event;\n    userParams?: any;\n};\n\ntype IGridHookEventParamsMap = {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a cell selection change.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeCellSelectionChange]: ICellSelectionChangeHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a cell selection change.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterCellSelectionChange]: ICellSelectionChangeHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnSelect]: IColumnSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnSelect]: IColumnSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a range selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRangeSelect]: IRangeSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a range selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRangeSelect]: IRangeSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a range deselection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRangeDeselect]: IRangeSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a range deselection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRangeDeselect]: IRangeSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowSelect]: IRowSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowSelect]: IRowSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column deselection.\"\n\t*\t})\n\t*/\n\t[HookEventsName.onBeforeColumnDeselect]: IColumnSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column deselection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnDeselect]: IColumnSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row deselection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowDeselect]: IRowSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row deselection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowDeselect]: IRowSelectionHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a cell deselection.\"\n\t*\t})\n\t*/\n\t[HookEventsName.onBeforeCellDeSelect]: ICellSelectionChangeHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a cell deselection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterCellDeSelect]: ICellSelectionChangeHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a range selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onRangeSelectionChanged]: CellRangeType;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a range selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRangeSelection]: CellRangeType;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a range selection.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRangeSelection]: CellRangeType;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before all rows cache is cleared.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeAllRowsCacheCleared]: IRowsCacheClearHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after all rows cache is cleared.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterAllRowsCacheCleared]: IRowsCacheClearHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row insertion.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowInsert]: IInsertRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row insertion.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowInsert]: IInsertRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowRemove]: IRemoveRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowRemove]: IRemoveRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row resize.\"\n\t*\t})\n\t*/\n\t\n    [HookEventsName.onBeforeRowResize]: ISetRowsHeightHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row resize.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowResize]: ISetRowsHeightHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row hide.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowHide]: IHideRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row hide.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowHide]: IHideRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row show.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowShow]: IHideRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row show.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowShow]: IHideRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column insertion.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnInsert]: IInsertColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column insertion.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnInsert]: IInsertColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnRemove]: IRemoveColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnRemove]: IRemoveColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column resize.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnResize]: IColumnsWidthUpdateHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column resize.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnResize]: IColumnsWidthUpdateHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called when a column is resized.\"\n\t*\t})\n\t*/\n    [HookEventsName.onColumnResize]: IColumnsWidthUpdateHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column hide.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnHide]: IHideColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column hide.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnHide]: IHideColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column show.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnShow]: IShowColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column show.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnShow]: IShowColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column reorder.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnReorder]: IMoveColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column reorder.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnReorder]: IMoveColumnsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row reorder.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowReorder]: IMoveRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row reorder.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowReorder]: IMoveRowsHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a data update.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeDataUpdate]: IRowDataChangeHookParamsWithoutAPI | IDataUpdateHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a data update.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterDataUpdate]: IRowDataChangeHookParamsWithoutAPI | IDataUpdateHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a scroll.\"\n\t*\t})\n\t*/\n    [HookEventsName.onScroll]: IScrollToHookParams | IScrollByHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a scroll.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterScroll]: IScrollToHookParams | IScrollByHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column pinning.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnPinning]: IColumnPinningHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column pinning.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnPinning]: IColumnPinningHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a column definition update.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeColumnDefinitionUpdate]: IUpdateColumnsDefinitonHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a column definition update.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterColumnDefinitionUpdate]: IUpdateColumnsDefinitonHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a floating row started.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeFloatingRowStarted]: IFloatRowHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a floating row started.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterFloatingRowStarted]: IFloatRowHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a floating row ended.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeFloatingRowEnded]: ICommitAndUnFloatRowHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a floating row ended.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterFloatingRowEnded]: ICommitAndUnFloatRowHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row sort applied.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowSortApplied]: IAddSortHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row sort applied.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowSortApplied]: IAddSortHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row sort removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowSortRemove]: IRemoveSortHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row sort removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowSortRemove]: IRemoveSortHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a filter applied.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeFilterApplied]: IAddFilterHookParam;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a filter applied.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterFilterApplied]: IAddFilterHookParam;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a filter removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeFilterRemove]: IRemoveFilterHookParam;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a filter removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterFilterRemove]: IRemoveFilterHookParam;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row grouping applied.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowGroupingApplied]: IAddRowGroupHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row grouping applied.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowGroupingApplied]: IAddRowGroupHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a row grouping removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeRowGroupingRemove]: IRemoveRowGroupHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a row grouping removal.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterRowGroupingRemove]: IRemoveRowGroupHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a user presence add.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeUserPresenceAdd]: IAddUserPresenceHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a user presence add.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterUserPresenceAdd]: IAddUserPresenceHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a user presence remove.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeUserPresenceRemove]: IRemoveUserPresenceHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a user presence remove.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterUserPresenceRemove]: IRemoveUserPresenceHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a user presence update.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeUserPresenceUpdate]: IUpdateUserPresenceHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a user presence update.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterUserPresenceUpdate]: IUpdateUserPresenceHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a copy data.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeCopyData]: IClipboardHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a copy data.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterCopyData]: IClipboardHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a cut data.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeCutData]: IClipboardHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a cut data.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterCutData]: IClipboardHookParams;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a paste data.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforePasteData]: IClipboardHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a paste data.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterPasteData]: IClipboardHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a fill series.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeFillSeries]: IFillSeriesHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a fill series.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterFillSeries]: IFillSeriesHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a group expand.\"\n\t*\t})\n\t*/\n    [HookEventsName.onBeforeGroupExpand]: ITreeExpandCollapseHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called after a group expand.\"\n\t*\t})\n\t*/\n    [HookEventsName.onAfterGroupExpand]: ITreeExpandCollapseHookParams;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Called before a group expand.\"\n\t*\t})\n\t*/\n};\n\ntype IGridHookEventParams<K extends HookEventsName> = K extends keyof IGridHookEventParamsMap\n    ? IGridHookEventParamsMap[K]\n    : IGenericHookEventParams;\n\nexport type IGridEventHandlers = Partial<{\n    [K in HookEventsName]: (params: IGridHookEventParams<K>) => boolean | void | Record<string, any>;\n}>;\nexport interface ITreeStructureData {\n    key: string;                      // Current node key/identifier\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Expand state of the node. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isExpanded() defaults to false\"\n\t*\t})\n\t*/\n    expanded?: boolean;               // Expand state (default: false)\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Total number of rows. Required for remote model to know expected row count. For local model, derived from rowData.length. If hasTreeFullStructureProvided is true, derived from treeStructureData length.\",\n\t*\t\"note\": \"GridOptionHandler.getRowCount() checks hasTreeFullStructureProvided first, then rowCount, then rowData.length\"\n\t*\t})\n\t*/\n\trowCount?: number;                // Row count (if expandable)\n    children?: ITreeStructureData[];  // Child nodes (if expandable)\n}\n\n// Draft Row Configuration\ninterface IDraftRowConfiguration {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Number of draft (editable placeholder) rows at the top. Default: 0.on submiting data on the draft row new row will be added to the grid with the data\",\n\t*\t\"default\": \"0\",\n\t*\t\"note\": \"GridOptionHandler.getTopDraftRowCount() defaults to 0\"\n\t*\t})\n\t*/\n\t  topDraftRowCount?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Number of draft (editable placeholder) rows at the bottom. Default: 0.on submiting data on the draft row new row will be added to the grid with the data\",\n\t*\t\"default\": \"0\",\n\t*\t\"note\": \"GridOptionHandler.getBottomDraftRowCount() defaults to 0\"\n\t*\t})\n\t*/\n\t  bottomDraftRowCount?: number;\n}\n\ninterface IGridOptions extends IRowDefaults, IColumnDefaults {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"If true, renders the grid in right-to-left direction. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isRTL() defaults to false. Also RTL (uppercase) exists in IGridOptions.\"\n\t*\t})\n\t*/\n\tRTL         ?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, enables fill-handle (drag to fill cells like Excel). Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isFillSeriesEnabled() defaults to false\"\n\t*\t})\n\t*/\n\t  fillSeries?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, highlights the column under the cursor. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  columnHover?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"If true, enables row hover styling. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  rowHover?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Array of user presence indicators to show which cells/rows are being viewed or edited by other users. Each entry has: { rowID?, columnID?, id?, color? }.\"\n\t*\t})\n\t*/\n\t  userPresenceMeta?: IUserPresenceMeta[];\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Number of extra rows to render outside the visible area. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  rowBufferSize?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Extra horizontal scrollable space in pixels. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  extraScrollableWidth?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Extra vertical scrollable space in pixels. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  extraScrollableHeight?: number;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, shows row headers. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  showRowHeader?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, shows column headers. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  showColumnHeader?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Number of rows per cache block for remote data. Default: 10, minimum: 5.\",\n\t*\t\"default\": \"10, minimum: 5\",\n\t*\t\"note\": \"GridOptionHandler.getCacheBlockSize() defaults to 10, enforces min of 5\"\n\t*\t})\n\t*/\n\t  cacheBlockSize?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, re-renders cells during column resize. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  renderOnColumnResize?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, re-renders cells during row resize. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  renderOnRowResize?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, columns can be reordered by dragging. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  columnReorderable?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"If true, rows can be reordered by dragging. From IGridOptions.\"\n\t*\t})\n\t*/\n\t  rowReorderable?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Default row height in pixels for all rows. From IGridOptions. Internal default: 42px.\",\n\t*\t\"default\": \"42px\"\n\t*\t})\n\t*/\n\t  rowHeight?: number;\n}\n\nexport interface GridReadyParams {\n\tinstanceAPI : IAPIHandler;\n}\n\ntype SuppressCallback = (meta) => boolean;\n\nexport type IAllowNavigationWithinCell = (meta: {\n    rowIndex: number | null;\n    columnIndex: number | null;\n\tpinPosition  : rowPinPositions;\n\tparentKeys : string[];\n}) => boolean;\n\nexport type IJson = Record<string, any>;\n\nexport type IRowModel = 'local' | 'remote' | 'viewport';\n\nexport interface ColumnHeaderHeightsParams {\n\trowIndex: number;\n\trowType: 'group' | 'leaf';\n\tlevel: number;\n\tmaxDepth: number;\n}\n\nexport interface RowMovedRendererParams {\n\tregisterTooltip : (element : HTMLElement) => void;\n}\n\nexport interface RowMovedRenderer  extends IBaseComponent<RowMovedRendererParams>{\n\n}\n\nexport interface FullWidthRendererParams {\n\tfullWidth           : boolean;\n\tdata                : IJson;\n\tnode                : IRowNodeCore;\n\tvalue               : number;\n\tvalueFormatted      : number;\n\trowIndex            : number;\n\tparentElement       : HTMLElement;\n\tpinned              : RowContainerType;\n\tregisterRowSelection: (params : IRegisterRowSelection) => void;\n\trowSelected         : boolean;\n\tregisterRowDrag     : (element  : HTMLElement) => void;\n\tapiHandler          : IAPIHandler;\n}\n\nexport interface FullWidthRenderer extends IBaseComponent<FullWidthRendererParams> {\n\n}\n\nexport interface GroupFullWidthRenderer extends FullWidthRenderer {\n\n}\ninterface IGridConfiguration extends IAddColumnButtonConfig, IAddRowButtonConfig, Omit<ICoreConfiguration ,'viewType'>, IColumnReorderConfig, IExtraRowConfiguration, IDraftRowConfiguration{\n\t\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Height of column headers. Can be a static number, array (for multi-row headers), or function. Internal default: 42px.\",\n\t*\t\"default\": \"42px\",\n\t*\t\"note\": \"GridOptionHandler.getColumnHeaderHeight() checks if function, number, or string. Used by HeaderRowController to set header height.\"\n\t*\t})\n\t*/\n   columnHeaderHeights?: number | number[] | ((params : ColumnHeaderHeightsParams) => number)|'auto';\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Default settings applied to ALL columns. Individual column definitions override these. Internally accessed via GridOptionHandler.getDefaultColumnDefinitions() and merged by ColumnHandler.\",\n\t*\t\"note\": \"Merged into every column definition by ColumnHandler; defaults to {} if not provided\"\n\t*\t})\n\t*/\n   defaultColumnDefinitions?: IColumnDefinition,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Array of row header column definitions. Row headers appear as fixed columns on the left side showing row-level info (like row numbers). Each definition supports columnId, columnKey, width, cellRenderer, headerCellRenderer, etc.\",\n\t*\t\"note\": \"GridOptionHandler.getRowHeader() returns these; default: []\"\n\t*\t})\n\t*/\n   rowHeaderDefinitions?: IRecordHeaderColumnDefinitions[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Data for summary rows at the bottom of the grid (e.g., totals, averages). Used with summaryCellRenderer on columns.\",\n\t*\t\"note\": \"Handled by RecordHandler which constructs a summaryHandler using this data\"\n\t*\t})\n\t*/\n   summaryRowData?: IJson[],\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Height of summary rows. Can be a static number, array, or function. Internal default: 42px.\",\n\t*\t\"default\": \"42px\",\n\t*\t\"note\": \"GridOptionHandler.getSummaryRowHeights() processes this similarly to rowHeights\"\n\t*\t})\n\t*/\n   summaryRowHeight?: number | number[] | (() => number);\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, hides row headers.\"\n\t*\t})\n\t*/\n   hideRowHeader?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, hides column headers.\"\n\t*\t})\n\t*/\n   hideColumnHeader?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, provides a column highlight indicator. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isColumnHoverHighlighter() defaults to false\"\n\t*\t})\n\t*/\n   columnHighlighter?: boolean,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Extra buffer width at the end of the horizontal scroll area in pixels.\"\n\t*\t})\n\t*/\n   endBufferWidth?: number,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Extra buffer height at the end of the vertical scroll area in pixels.\"\n\t*\t})\n\t*/\n   endBufferHeight?: number,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Buffer in pixels for floating record positioning. Default: -10.\",\n\t*\t\"default\": \"-10\",\n\t*\t\"note\": \"GridOptionHandler.getFloatingBufferPixel() defaults to -10. Used by FloatingRecordHandler.\"\n\t*\t})\n\t*/\n   floatingBufferPixel?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Custom renderer shown when a row is being moved/reordered. Must implement IBaseComponent<RowMovedRendererParams>. RowMovedRendererParams: { registerTooltip: (element: HTMLElement) => void }.\",\n\t*\t\"note\": \"GridOptionHandler.getRowMovedRenderer() returns this\"\n\t*\t})\n\t*/\n   rowMovedRenderer?: new () => RowMovedRenderer;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Parameters for the row moved renderer.\",\n\t*\t\"note\": \"GridOptionHandler.getRowMovedRendererParams() returns this\"\n\t*\t})\n\t*/\n   rowMovedRendererParams?: Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Map of named custom components (renderers, editors) that can be referenced by string name in column definitions. Registered by UserComponentRegistry.\",\n\t*\t\"note\": \"Processed by UserComponentRegistry which registers each entry as a user component\"\n\t*\t})\n\t*/\n   components?: { [key : string]: any};\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Function to determine if a row should span the full width of the grid (e.g., for detail panels or grouped row headers).\",\n\t*\t\"note\": \"GridOptionHandler.getFullWidthCallBack() returns this callback\"\n\t*\t})\n\t*/\n   isFullWidthRow?: (rowNode : IRowNode) => boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"Positioning mode for floating (pinned) records. 'relative' uses relative positioning within the grid flow; 'absolute' uses absolute positioning. Default: 'relative'.\",\n\t*\t\"default\": \"relative\",\n\t*\t\"note\": \"GridOptionHandler.getFloatingRecord() defaults to 'relative'. isRelativeFloatingRecord() checks this. Used by FloatingRecordController and RowRenderController.\"\n\t*\t})\n\t*/\n   floatingRecord?: 'absolute' | 'relative';\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, highlights the full row when any cell in it is being edited. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isFullRowHoverOnEdit() defaults to false\"\n\t*\t})\n\t*/\n   fullRowHoverOnEdit?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, shows column headers. Default: true.\",\n\t*\t\"default\": \"true\",\n\t*\t\"note\": \"GridOptionHandler.isColumnHeader() defaults to true\"\n\t*\t})\n\t*/\n   columnHeader?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"How groups are displayed. 'groupRows' renders groups as full-width rows using groupRowRenderer.\",\n\t*\t\"note\": \"GridOptionHandler.isGroupUseFullWidthRow() returns true only when groupDisplayType === 'groupRows'\"\n\t*\t})\n\t*/\n   groupDisplayType?: 'groupRows';\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Top margin for the grid content area in pixels. Default: 0.\",\n\t*\t\"default\": \"0\",\n\t*\t\"note\": \"GridOptionHandler.getMarginTop() defaults to 0\"\n\t*\t})\n\t*/\n   marginTop?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"Bottom margin for the grid content area in pixels. Default: 0.\",\n\t*\t\"default\": \"0\",\n\t*\t\"note\": \"GridOptionHandler.getMarginBottom() defaults to 0\"\n\t*\t})\n\t*/\n   marginBottom?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, allows only a single range at a time. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.suppressMultiRangeSelection() defaults to false\"\n\t*\t})\n\t*/\n   suppressMultiRangeSelection?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, enables cell range selection (like Excel). Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isRangeSelectionEnabled() defaults to false\"\n\t*\t})\n\t*/\n   enableRangeSelection?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, uses CSS transform for row positioning (better performance). Default: true.\",\n\t*\t\"default\": \"true\",\n\t*\t\"note\": \"GridOptionHandler.isRowTransform() defaults to true\"\n\t*\t})\n\t*/\n   rowTransform?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, Enter key moves focus down instead of editing. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isEnterNavigatesVertically() defaults to false\"\n\t*\t})\n\t*/\n   enterNavigatesVertically?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, Enter key moves focus down after completing an edit. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isEnterNavigatesVerticallyAfterEdit() defaults to false\"\n\t*\t})\n\t*/\n   enterNavigatesVerticallyAfterEdit?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, pressing Backspace starts editing and clears the cell. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isCellEditingOnBackspace() defaults to false\"\n\t*\t})\n\t*/\n   enableCellEditingOnBackspace?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Column selection mode. 'singleOrMultiCtrl' allows single click for single, Ctrl+click for multi. Default: 'none'.\",\n\t*\t\"default\": \"none\",\n\t*\t\"note\": \"GridOptionHandler.getColumnSelection() defaults to 'none'\"\n\t*\t})\n\t*/\n   columnSelection?: 'single' | 'multiple' | 'singleOrMultiCtrl' | \"none\";\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, allows selecting rows and columns simultaneously. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isAllowMultipleTypeSelection() defaults to false\"\n\t*\t})\n\t*/\n   allowMultipleTypeSelection?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, stops cell editing when focus leaves the grid. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isStopEditingWhenCellsLoseFocus() defaults to false\"\n\t*\t})\n\t*/\n   stopEditingWhenCellsLoseFocus?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, clears selection on right-click (unless allowMultipleTypeSelection is true). Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isClearSelectionOnCellRightClick() checks allowMultipleTypeSelection first\"\n\t*\t})\n\t*/\n   clearSelectionOnCellRightClick?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, focuses the cell when selected. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isCellFocusonSelection() defaults to false\"\n\t*\t})\n\t*/\n   cellFocusOnSelection?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, reverts column resize when user cancels. Default: true.\",\n\t*\t\"default\": \"true\",\n\t*\t\"note\": \"GridOptionHandler.getUndoResizeOnCancel() defaults to true\"\n\t*\t})\n\t*/\n   undoResizeOnCancel?: boolean,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, scrolls to focused cell when column is selected. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isCellFocusScrollOnColumnSelection() defaults to false\"\n\t*\t})\n\t*/\n   cellFocusScrollOnColumnSelection?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, automatically fills empty viewport space with rows. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isAutoFillRows() defaults to false\"\n\t*\t})\n\t*/\n   autoFillRows?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\", \"list\"],\n\t*\t\"description\": \"If true, excludes scrollbar width from pinned column calculations. Default: true.\",\n\t*\t\"default\": \"true\",\n\t*\t\"note\": \"GridOptionHandler.excludeScrollbarForPinning() defaults to true\"\n\t*\t})\n\t*/\n \t  excludeScrollbarForPinning?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Number of rows per viewport page. Default: 100.\",\n\t*\t\"default\": \"100\",\n\t*\t\"note\": \"GridOptionHandler.getViewportRowPageSize() defaults to 100\"\n\t*\t})\n\t*/\n\t  viewportRowPageSize?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Number of columns per viewport page. Default: 50.\",\n\t*\t\"default\": \"50\",\n\t*\t\"note\": \"GridOptionHandler.getViewportColumnPageSize() defaults to 50\"\n\t*\t})\n\t*/\n\t  viewportColumnPageSize?: number;\n\n\t// Gantt\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"gantt\",\n\t*\t\"viewType\": [\"gantt\"],\n\t*\t\"description\": \"Project start date.\",\n\t*\t\"default\": \"Date.now()\"\n\t*\t})\n\t*/\n\tprojectStartDate ?: Date | string | number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"gantt\",\n\t*\t\"viewType\": [\"gantt\"],\n\t*\t\"description\": \"Project end date.\",\n\t*\t\"default\": \"Date.now()\"\n\t*\t})\n\t*/\n\tprojectEndDate   ?: Date | string | number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"gantt\",\n\t*\t\"viewType\": [\"gantt\"],\n\t*\t\"description\": \"List-panel bridge: VIEW_TYPE constant object used when embedding grid/list next to Gantt. Not the Gantt timeline zoom — use IGanttConfiguration.timelineSettings.timelineViewMode for that (see MCP category timeline).\",\n\t*\t\"default\": \"day\"\n\t*\t})\n\t*/\n\ttimeLineViewType ?: typeof VIEW_TYPE[keyof typeof VIEW_TYPE];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"gantt\",\n\t*\t\"viewType\": [\"gantt\", \"grid\", \"list\", \"gallery\"],\n\t*\t\"description\": \"View type.\",\n\t*\t\"default\": \"grid\",\n\t*\t\"note\": \"if created component is is gantt then viewType  either grid or list only\"\n\t*\t})\n\t*/\n\tviewType         ?: \"grid\" | \"list\" | \"gallery\" | \"gantt\";\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"gantt\",\n\t*\t\"viewType\": [\"gantt\"],\n\t*\t\"description\": \"Timeline settings.\",\n\t*\t\"default\": \"{}\"\n\t*\t})\n\t*/\n\ttimelineSettings ?: ITimelineSettings;\n\t\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Viewport row buffer size. Default: 20.\",\n\t*\t\"default\": \"20\",\n\t*\t\"note\": \"GridOptionHandler.getViewportRowBufferSize() defaults to 20\"\n\t*\t})\n\t*/\n\t  viewportRowBufferSize?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Viewport column buffer size. Default: 5.\",\n\t*\t\"default\": \"5\",\n\t*\t\"note\": \"GridOptionHandler.getViewportColumnBufferSize() defaults to 5\"\n\t*\t})\n\t*/\n\t  viewportColumnBufferSize?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, range selection cannot span across groups. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.suppressGroupToGroupRangeSelection() defaults to false\"\n\t*\t})\n\t*/\n\t  suppressGroupToGroupRangeSelection?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, automatically unpins columns when they don't fit. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isAutoUnpinnedColumns() defaults to false\"\n\t*\t})\n\t*/\n\t  autoUnpinnedColumns?: boolean;\n\n\t// Nested headers (column groups)\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, enables nested headers. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.enableNestedHeader() defaults to false\"\n\t*\t})\n\t*/\n\tenableNestedHeader                ?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"layout\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Default column group definition.\",\n\t*\t\"default\": \"{}\"\n\t*\t})\n\t*/\n\tdefaultColGroupDef                ?: Partial<IColumnGroupDefinition>;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, enables resize cue. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.enableResizeCue() defaults to false\"\n\t*\t})\n\t*/\n\tenableResizeCue                   ?: boolean;\n\n}\n\nexport type TimeLineViewType = 'day' | 'month' | 'year' | 'week'\n\nexport interface IKeyBoardShortcutsParams {\n\tshortcut : string;\n\taction : string | ((params : ShortcutParams) => void);\n}\n\ninterface ICoreConfiguration extends IPluginConfiguration , ILocaleServiceConfig, IRowReorderConfig{\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Bottom margin per tree depth level (not cumulative).\",\n\t*\t\"note\": \"GridOptionHandler.getTreeLevelBottomMargins() returns margin at (level-1) index\"\n\t*\t})\n\t*/\n\t  treeLevelBottomMargins?: number[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Top margin per tree depth level (not cumulative). E.g., [10, 5] means level 1 gets 10px top margin.\",\n\t*\t\"note\": \"GridOptionHandler.getTreeLevelTopMargins() returns the margin at (level-1) index\"\n\t*\t})\n\t*/\n\t  treeLevelTopMargins?: number[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Cumulative left margin in pixels per tree depth level. E.g., [20, 20] means level 1 gets 20px, level 2 gets 40px total.\",\n\t*\t\"note\": \"GridOptionHandler.getTreeLevelLeftMargins() accumulates margins up to the given level\"\n\t*\t})\n\t*/\n\t  treeLevelLeftMargins?: number[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Cumulative right margin per tree depth level.\",\n\t*\t\"note\": \"GridOptionHandler.getTreeLevelRightMargins() accumulates margins\"\n\t*\t})\n\t*/\n\t  treeLevelRightMargins?: number[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, the full tree structure is provided upfront (no lazy loading). Default: false. When true, rowCount is derived from treeStructureData length.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.hasFullTreeStructureProvided() defaults to false\"\n\t*\t})\n\t*/\n\t  hasTreeFullStructureProvided?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Tree structure metadata. Each node: { key: string, expanded?: boolean, rowCount?: number, children?: ITreeStructureData[] }.\"\n\t*\t})\n\t*/\n\t  treeStructureData?: ITreeStructureData[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function that determines whether inner-cell navigation is allowed for a specific cell. Default returns false (no inner-cell navigation).\",\n\t*\t\"note\": \"GridOptionHandler.getInnerCellNavigation() defaults to () => false\"\n\t*\t})\n\t*/\n\t  shouldNavigateWithinCell?: IAllowNavigationWithinCell;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, suppresses cell focus when selection changes. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.suppressCellFocusOnSelection() defaults to false\"\n\t*\t})\n\t*/\n\t  suppressCellFocusOnSelection?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for group header rows. Must implement IBaseComponent<FullWidthRendererParams>.\",\n\t*\t\"note\": \"GridOptionHandler.getFullWidthGroupCellRenderer() returns this\"\n\t*\t})\n\t*/\n\t  groupRowRenderer?: new () => GroupFullWidthRenderer;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters for the group row renderer.\",\n\t*\t\"note\": \"GridOptionHandler.getGroupingFullWidthRendererParams() returns this\"\n\t*\t})\n\t*/\n\t  groupRowRendererParams?: Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, renders the grid in right-to-left direction. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isRTL() defaults to false. Also RTL (uppercase) exists in IGridOptions.\"\n\t*\t})\n\t*/\n\t  rtl?: boolean,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Master toggle for selection features.\"\n\t*\t})\n\t*/\n\t  selection?: boolean,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, enables undo/redo support.\"\n\t*\t})\n\t*/\n\t  undoRedo?: boolean,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Maximum number of undo/redo operations to store.\"\n\t*\t})\n\t*/\n\t  undoRedoStackSize?: number,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, highlights the hovered row. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isRowHoverHighlighter() defaults to false\"\n\t*\t})\n\t*/\n\t  rowHighlighter?: boolean,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Map of event/hook names to handler functions. Hooks follow naming patterns: onBefore<Event> (can return false to cancel), on<Event> (during), onAfter<Event> (after completion). Internally dispatched by GridOptionHandler.onBefore(), .on(), and .onAfter().\"\n\t*\t})\n\t*/\n\t  events?: IGridEventHandlers,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Number of extra rows/columns to render outside the viewport. Default: 10.\",\n\t*\t\"default\": \"10\",\n\t*\t\"note\": \"GridOptionHandler.getBufferSize() defaults to 10, min 0\"\n\t*\t})\n\t*/\n\t  buffer?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Callback to suppress specific key-down events.\"\n\t*\t})\n\t*/\n\t  suppressKeyDownEvent?: SuppressCallback;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Callback to suppress specific mouse-down events.\"\n\t*\t})\n\t*/\n\t  suppressMouseDownEvent?: SuppressCallback;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, enables internal logging for debugging.\"\n\t*\t})\n\t*/\n\t  showLogs?: boolean;\n\tcacheBlockSize                ?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Maximum number of cache blocks to keep in memory. Default: 3.\",\n\t*\t\"default\": \"3\",\n\t*\t\"note\": \"GridOptionHandler.getCacheBlockCount() defaults to 3\"\n\t*\t})\n\t*/\n\t  cacheBlockCount?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Row index offset to trigger the next data fetch before reaching the end. Default: 0.\",\n\t*\t\"default\": \"0\",\n\t*\t\"note\": \"GridOptionHandler.getFetchTriggerPoint() defaults to 0\"\n\t*\t})\n\t*/\n\t  fetchTriggerPoint?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Array of row indices that should always be kept in cache (never evicted). Useful for pinned/critical rows. Default: [].\",\n\t*\t\"default\": \"[]\",\n\t*\t\"note\": \"GridOptionHandler.getStaticCacheIndexes() defaults to []\"\n\t*\t})\n\t*/\n\t  staticCacheRowIndices?: number[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"CRITICAL: Must be provided in gridOptions for initial rendering. For LOCAL model: pass an array of JSON objects, e.g. rowData: [{ id: 1, name: 'Alice' }]. For REMOTE model: pass a callback function that receives IFetchParam with properties: startRowIndex, endRowIndex, onSuccess(data), onFailure(err), sortModel, filterModel, rowGroupingModel, parentKeys, pageNumber, rowPinPosition. Call fetchParams.onSuccess(dataArray) to supply data. Do NOT rely on grid.rowAPI.appendrows() for initial data — always pass rowData directly in gridOptions.\",\n\t*\t\"note\": \"Stored via GridOptionHandler.setRowData(). For remote model, RecordHandler constructs a remote record info handler.\"\n\t*\t})\n\t*/\n\t  rowData?: IJson[] | ((param: IFetchParam) => void);\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Data for rows pinned to the top of the grid. Always visible regardless of scrolling.\",\n\t*\t\"note\": \"Handled by RecordHandler which constructs a topHandler\"\n\t*\t})\n\t*/\n\t  pinnedTopRowData?: IJson[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Data for rows pinned to the bottom of the grid. Always visible regardless of scrolling.\",\n\t*\t\"note\": \"Handled by RecordHandler which constructs a bottomHandler\"\n\t*\t})\n\t*/\n\tpinnedBottomRowData?: IJson[];\n\tviewType                      ?: \"grid\" | \"gallery\" | \"list\" | \"gantt\";\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Number of rows in the grid. this is used in remote model to fetch the data.\",\n\t*\t\"default\": \"0\",\n\t*\t\"note\": \"GridOptionHandler.getRowCount() defaults to 0\"\n\t*\t})\n\t*/\n\trowCount                      ?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"License key for enterprise features.\"\n\t*\t})\n\t*/\n\t  licenseKey?: string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Per-row height configuration. Can be a static number or a function receiving { rowIndex, rowPinPosition, parentKeys, loaded }. Internal default: 42px.\",\n\t*\t\"default\": \"42px\",\n\t*\t\"note\": \"GridOptionHandler.getRowHeights() checks if it's a function or number. hasStaticRowHeight() returns false if it's a function.\"\n\t*\t})\n\t*/\n\t  rowHeights?: IRowHeightsConfigFormat;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Minimum row height for all rows. Internal default: 42px.\",\n\t*\t\"default\": \"42px\",\n\t*\t\"note\": \"GridOptionHandler.getMinRowAuto() defaults to 42px\"\n\t*\t})\n\t*/\n\t  minRowAuto                    ?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Maximum row height for all rows. Internal default: 42px.\",\n\t*\t\"default\": \"42px\",\n\t*\t\"note\": \"GridOptionHandler.getMaxRowAuto() defaults to 42px\"\n\t*\t})\n\t*/\n\t  maxRowAuto                    ?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"CRITICAL: Array of column definition objects. Each column MUST have columnId and columnKey. columnKey maps to rowData property names. Processed by ColumnHandler which applies defaultColumnDefinitions and handles data types.\",\n\t*\t\"note\": \"Processed by ColumnHandler.ts, defaults merged from defaultColumnDefinitions via GridOptionHandler.getDefaultColumnDefinitions()\"\n\t*\t})\n\t*/\n\tcolumnDefinitions             ?: ColumnDefInput[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function returning per-row definitions (rowId, locked, hidden, readonly, cssClasses, fullWidth, expand, childrenCount, expandableRow, expandableRowKey). Called for each row with { rowIndex, rowPinnedPosition, parentKeys, pageNumber, sortModel, filterModel, rowGroupingModel, data, isRowLoading }.\"\n\t*\t})\n\t*/\n\t  rowDefinitions?: IRowDefinitions;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, animates row insertions and removals. Default: true.\",\n\t*\t\"default\": \"true\",\n\t*\t\"note\": \"GridOptionHandler.getAnimateRow() defaults to true\"\n\t*\t})\n\t*/\n\t  animateRow?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for full-width rows. Must implement IBaseComponent<FullWidthRendererParams>. FullWidthRendererParams includes: { fullWidth, data, node, value, rowIndex, parentElement, pinned, registerRowSelection, rowSelected, registerRowDrag, apiHandler }.\"\n\t*\t})\n\t*/\n\t  fullWidthCellRenderer?: new () => FullWidthRenderer;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters for the full-width renderer.\"\n\t*\t})\n\t*/\n\t  fullWidthCellRendererParams?: Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"IMPORTANT: Determines how rowData is interpreted. 'local' = rowData is an array loaded entirely in memory; 'remote' = rowData is a callback function for server-side fetching (IFetchParam); 'viewport' = virtual scrolling. Must match the rowData type: use 'local' with array rowData, use 'remote' with callback rowData. Default is 'local' if omitted.\",\n\t*\t\"note\": \"Accessed via GridOptionHandler.getRowModelType(). Used in GridCoreComponent.initializeGrid() to select the correct bean class for data management.\"\n\t*\t})\n\t*/\n\t  rowModelType?: IRowModel;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Delay in ms before fetching remote data (for debouncing). Default: 0.\",\n\t*\t\"default\": \"0\",\n\t*\t\"note\": \"GridOptionHandler.getFetchDelay() defaults to 0\"\n\t*\t})\n\t*/\n\t  fetchDelay?: number;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for full-width loading rows (shown while remote data is being fetched). Internal default: 'dgFullWidthLoadingRenderer'.\",\n\t*\t\"default\": \"dgFullWidthLoadingRenderer\",\n\t*\t\"note\": \"GridOptionHandler.getFullWidthLoadingRenderer() defaults to 'dgFullWidthLoadingRenderer'\"\n\t*\t})\n\t*/\n\t  fullWidthLoadingRenderer?: new () => FullWidthRenderer;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters for the full-width loading renderer.\"\n\t*\t})\n\t*/\n\t  fullWidthLoadingRendererParams?: Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to suppress row navigation for specific rows. Receives row node and column.\",\n\t*\t\"note\": \"GridOptionHandler.isRowSuppressNavigation() only calls if it's a function\"\n\t*\t})\n\t*/\n\t  suppressRowNavigation?: ((params : {node : IRowNodeCore, column  : IColumnNode}) => boolean | undefined);\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, arrow navigation wraps to the next/previous row at edges. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isWrapNavigationToNextRow() defaults to false\"\n\t*\t})\n\t*/\n\t  wrapNavigationToNextRow?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, group rows do not stick to the top when scrolling. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.suppressGroupRowsSticky() defaults to false\"\n\t*\t})\n\t*/\n\t  suppressGroupRowsSticky?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Array of custom keyboard shortcut definitions. Each has { shortcut: string, action: string | ((params: ShortcutParams) => void) }.\"\n\t*\t})\n\t*/\n\t  keyBoardShortcuts?: IKeyBoardShortcutsParams[];\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, disables CSV export. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.suppressCsvExport() defaults to false\"\n\t*\t})\n\t*/\n\t  suppressCsvExport?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, copies cell values as plain strings. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.shouldCopyAsString() defaults to false\"\n\t*\t})\n\t*/\n\t  copyAsString?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, clears selection on mouse down. Default: true.\",\n\t*\t\"default\": \"true\",\n\t*\t\"note\": \"GridOptionHandler.clearSelectionOnMouseDown() defaults to true\"\n\t*\t})\n\t*/\n\t  clearSelectionOnMouseDown?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Whitelist specific built-in keyboard shortcuts to include. Default: [] (all included).\",\n\t*\t\"default\": \"[] (all included)\",\n\t*\t\"note\": \"GridOptionHandler.getIncludeKeyboardShortcuts() defaults to []\"\n\t*\t})\n\t*/\n\t  includeKeyboardShortcuts?: string[],\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Blacklist specific built-in keyboard shortcuts to exclude. Default: [] (none excluded).\",\n\t*\t\"default\": \"[] (none excluded)\",\n\t*\t\"note\": \"GridOptionHandler.getExcludeKeyboardShortcuts() defaults to []\"\n\t*\t})\n\t*/\n\t  excludeKeyboardShortcuts?: string[],\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Whether selection tracks by row index or by row ID.\"\n\t*\t})\n\t*\t/selectionModel?: 'index' | 'id',\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Row selection mode. Default: 'none'.\",\n\t*\t\"default\": \"none\"\n\t*\t})\n\t*/\n\t  rowSelection?: 'single' | 'multiple' | \"none\";\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, prevents default mousedown behavior on the grid. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.getShouldPreventGridMousedown() defaults to false\"\n\t*\t})\n\t*/\n\t  shouldPreventGridMousedown?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Minimum number of empty rows to maintain at the bottom. Default: 0.\",\n\t*\t\"default\": \"0\",\n\t*\t\"note\": \"GridOptionHandler.getMinSpareRows() defaults to 0\"\n\t*\t})\n\t*/\n\t  minSpareRows?: number;\n\t// minSpareColumns               ?: number;\n\tfillSeries                  ?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Direction(s) for fill handle. Default: 'xy'.\",\n\t*\t\"default\": \"xy\",\n\t*\t\"note\": \"GridOptionHandler.getFillSeriesDirection() defaults to 'xy'\"\n\t*\t})\n\t*/\n\t  fillSeriesDirection?: 'x' | 'y' | 'xy';\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"selection\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, does not clear cells when fill handle is dragged to reduce the selection. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isSuppressClearOnFillReduction() defaults to false\"\n\t*\t})\n\t*/\n\t  suppressClearOnFillReduction?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"rows\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, enables drag-and-drop row reordering. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.isRowDraggable() defaults to false\"\n\t*\t})\n\t*/\n\t  rowDraggable?: boolean;\n\texcludeScrollbarForPinning  ?: boolean;\n\tactionRenderer              ?: (new() => IActionRenderer);\n\tactionRendererParams        ?: Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer shown when the grid has no records (empty state). Must implement IBaseComponent. Internal default: NoRecordFoundRenderer.\",\n\t*\t\"default\": \"NoRecordFoundRenderer\",\n\t*\t\"note\": \"GridOptionHandler.getNoRecordRenderer() returns this. Resolved by UserComponentHandler.getNoRecordRendererDetails(). Default component is NoRecordFoundRenderer. GridController updates CSS class based on rowCount.\"\n\t*\t})\n\t*/\n\t  noRecordRenderer?: new () => IBaseComponent<any>;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"tree\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, prevents focusing on group header cells. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"GridOptionHandler.suppressGroupHeaderCellFocus() defaults to false\"\n\t*\t})\n\t*/\n\t  suppressGroupHeaderCellFocus?: boolean;\n}\n\ninterface IPluginConfiguration{\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Enable filtering. Pass true for defaults or a filter configuration object.\"\n\t*\t})\n\t*/\n\t  filter?: boolean | IFilterConfigurations,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Enable sorting. Pass true for defaults or a sort configuration object.\"\n\t*\t})\n\t*/\n\t  sort?: boolean | ISortConfigurations,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Enable row grouping. Pass true for defaults or a grouping configuration object.\"\n\t*\t})\n\t*/\n\t  rowGrouping?: boolean | IRowGroupingConfigurations\n}\n\nexport interface RowReorderRenderer extends IBaseComponent<IRowReoderParams> {\n\n}\n\nexport interface RowDropZoneType {\n\n}\n\ninterface IRowReorderConfig {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for the row reorder indicator/handle. Must implement IBaseComponent<IRowReoderParams>.\",\n\t*\t\"note\": \"From IRowReorderConfig. GridOptionHandler.getRowReoderRenderer() returns this\"\n\t*\t})\n\t*/\n\t  rowReorderRenderer?: new () => RowReorderRenderer;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters for the row reorder renderer.\",\n\t*\t\"note\": \"GridOptionHandler.getRowReorderRendererParams() returns this\"\n\t*\t})\n\t*/\n\t  rowReorderRendererParam?: Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Array of drop zone configurations for row drag-and-drop. Default: [].\",\n\t*\t\"default\": \"[]\",\n\t*\t\"note\": \"From IRowReorderConfig. GridOptionHandler.getRowDropZones() defaults to []\"\n\t*\t})\n\t*/\n\t  rowDropZones?: RowDropZoneType[];\n}\n\nexport interface ColumnReorderRendererParams {\n\tsourceColumnIds       : string[];\n\tisSourceColumnSelected: boolean;\n\tAPIs                  : IAPIHandler;\n}\n\nexport interface ColumnReorderRenderer extends IBaseComponent<ColumnReorderRendererParams> {\n\n}\ninterface IColumnReorderConfig {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for the column reorder indicator. Must implement IBaseComponent<ColumnReorderRendererParams>. Params: { sourceColumnIds, isSourceColumnSelected, APIs }.\",\n\t*\t\"note\": \"From IColumnReorderConfig. GridOptionHandler.getColumnReoderRenderer() returns this\"\n\t*\t})\n\t*/\n\t  columnReorderRenderer?: new () => ColumnReorderRenderer;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters for the column reorder renderer.\",\n\t*\t\"note\": \"From IColumnReorderConfig. GridOptionHandler.getColumnReorderRendererParams() returns this\"\n\t*\t})\n\t*/\n\t  columnReorderRendererParam?: Object;\n}\n\nexport interface ExtraRowRendererParams {\n\trowNode : RowNodeCore,\n\trowIndex: number,\n\tpaneType: RowContainerType,\n\tAPIs    : IAPIHandler,\n\telement : HTMLElement,\n}\nexport interface ExtraRowRenderer extends IBaseComponent<ExtraRowRendererParams> {\n\n}\n\n\n\ninterface IExtraRowConfiguration {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Height of extra rows. Can be a number or function. Default: 50.\",\n\t*\t\"default\": \"50\",\n\t*\t\"note\": \"From IExtraRowConfiguration. GridOptionHandler.getExtraRowHeight() defaults to 50\"\n\t*\t})\n\t*/\n\t  extraRowHeight?: () => number | number,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Number of extra rows to render. Default: 1.\",\n\t*\t\"default\": \"1\",\n\t*\t\"note\": \"From IExtraRowConfiguration. GridOptionHandler.getExtraRowCount() defaults to 1\"\n\t*\t})\n\t*/\n\t  extraRowCount?: number,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for extra rows (appended below data rows). Must implement IBaseComponent<ExtraRowRendererParams>. Params: { rowNode, rowIndex, paneType, APIs, element }. Internal default: GridExtraRowRenderer (if isExtraRow is true).\",\n\t*\t\"default\": \"GridExtraRowRenderer (if isExtraRow is true)\",\n\t*\t\"note\": \"From IExtraRowConfiguration. GridOptionHandler.getExtraRowRenderer() returns this or defaults to GridExtraRowRenderer if isExtraRow is true\"\n\t*\t})\n\t*/\n\t  extraRowRenderer?: new () => ExtraRowRenderer,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters for the extra row renderer.\",\n\t*\t\"note\": \"From IExtraRowConfiguration. GridOptionHandler.getExtraRowRendererParam() returns this\"\n\t*\t})\n\t*/\n\t  extraRowRendererParam?: Object,\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, enables extra row rendering. Default: false.\",\n\t*\t\"default\": \"false\",\n\t*\t\"note\": \"From IExtraRowConfiguration. GridOptionHandler.getIsExtraRow() defaults to false\"\n\t*\t})\n\t*/\n\t  isExtraRow?: boolean\n}\n\nexport interface AddColumnButtonRendererParams {\n\tinstanceAPI : IAPIHandler;\n}\n\nexport interface AddColumnButtonRenderer extends IBaseComponent<AddColumnButtonRendererParams> {\n\t\n}\n\nexport interface AddRowButtonRendererParams {\n\tinstanceAPI : IAPIHandler;\n}\n\nexport interface AddRowButtonRenderer extends IBaseComponent<AddRowButtonRendererParams> {\n\t\n}\n\ninterface IAddRowButtonConfig {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for the 'Add Row' button. Must implement IBaseComponent<AddRowButtonRendererParams>. Params: { instanceAPI }.\",\n\t*\t\"note\": \"From IAddRowButtonConfig\"\n\t*\t})\n\t*/\n\t  addRowButtonRenderer?: new () => AddRowButtonRenderer;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters for the add row button renderer.\"\n\t*\t})\n\t*/\n\t  addRowButtonRendererParams?: Object;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, shows an 'Add Row' button in the grid.\"\n\t*\t})\n\t*/\n\t  addRowButton?: boolean;\n}\n\ninterface IAddColumnButtonConfig {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"features\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"If true, shows an 'Add Column' button in the grid.\"\n\t*\t})\n\t*/\n\t  addColumnButton?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Custom renderer for the 'Add Column' button. Must implement IBaseComponent<AddColumnButtonRendererParams>. Params: { instanceAPI }.\",\n\t*\t\"note\": \"From IAddColumnButtonConfig\"\n\t*\t})\n\t*/\n\t  addColumnButtonRenderer?: new () => AddColumnButtonRenderer;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"renderers\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Parameters for the add column button renderer.\"\n\t*\t})\n\t*/\n\t  addColumnButtonRendererParams?: Object;\n}\n\nexport interface LocaleTextParams {\n\n}\ninterface ILocaleServiceConfig {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"locale\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Locale string for number/date formatting (e.g., 'en-US', 'de-DE', 'ja-JP').\"\n\t*\t})\n\t*/\n\t  locale?: string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"locale\",\n\t*\t\"viewType\": [\"grid\"],\n\t*\t\"description\": \"Function to provide localized text strings for grid UI elements (labels, messages, etc.).\"\n\t*\t})\n\t*/\n\t  localeText?: (param: LocaleTextParams) => string;\n}\n\nexport {\n\tIGridOptions,\n\tIGridConfiguration,\n\tSuppressCallback,\n\tICoreConfiguration,\n};\n","import { IGroupedRowNodeCore } from \"../../../DataStore/group-rownode.types\";\nimport { IRowInteracter, IRowNodeCore } from \"../../../DataStore/rownode.types\";\nimport { IRowMeta } from \"../../API/CommonAPIInterface\";\nimport { rowPinPositions } from \"../Constants/GridConfigurationConstants\"\nimport { IFullWidthType } from \"./IRowDefinitions\";\nimport { ICellData } from \"../../API/CellAPI/Interface/ICellAPIManager\";\n\ninterface IRowNodeDS<TData = ICellData> {\n    id       : string\n    pinned   : rowPinPositions,\n    height   : number,\n    readOnly : boolean | null,\n    locked   : boolean | null,\n\n\tdragging       : boolean | null,\n\tselected       : boolean | null,\n\tcomputedHeight : number  | null,\n\tdata           : TData,\n\tloadedState    : boolean,\n\tisRendered     : boolean,\n\tuserParams     : any;\n\tdefinition     : any;\n\thidden         : boolean;\n\tfullWidthRow   : IFullWidthType;\n\tisExpandable   : boolean;\n\tcssClasses     : string;\n}\n\ninterface IRowNodeHelper extends IRowInteracter {\n    getGroupHeight(id: string)                : number;\n    getRootNode()                             : IGroupedRowNodeCore;\n    getRelativeRowMeta(absoluteIndex: number) : IRowMeta;\n    dispatchRowHeightChange                   : (rowNodes: IRowNode[]) => void;\n    isExtraRow                                : (params : any) => boolean;\n    getUpcomingRowNodes                       : (index : number) => IRowNode[];\n    getRowNodeById                            : (id: string) => IRowNode | null;\n    isEndDatePrioritizedForMilestone          : () => boolean;\n    isFlexibleMilestone                       : () => boolean;\n}\n\ninterface IRowNode<TData = any> extends IRowNodeCore {\n\tkey: number;\n\n\tgetPinnedPosition(): rowPinPositions;\n\n\tgetUserParams() : any;\n\n\tisReadOnly() : boolean | null;\n\tisLocked()   : boolean | null;\n\tisDragging() : boolean | null;\n\tisSelected() : boolean | null;\n\n\tisLoaded(): boolean;\n\n\n\tisExtraRow() : boolean;\n\n\t// isEmbededFullWidth(params :any) : boolean;\n\n\n\tgetFullWidthType() : IFullWidthType;\n\n\tmodifyData(key: string, value: TData) : void;\n\tsetReadOnlyState(state: boolean)      : void;\n\tsetLockedState(state: boolean)        : void;\n\tsetDraggingState(state: boolean)      : void;\n\tsetSelectedState(state: boolean)      : void;\n\tonMouseEnter()                        : void;\n\tonMouseLeave()                        : void;\n\tonRowTopChange()                      : void;\n\tonRowIndexChange() : void;\n\tonRowHeightChange()                   : void\n\n\tupdateRendered(state: boolean): void;\n\n\tupdateUserParams(params: any): void;\n\n\taddEventListener(eventType: string, listener: EventListener, async?: boolean, options?: AddEventListenerOptions)    : void;\n\tremoveEventListener(eventType: string, listener: EventListener, async?: boolean, options?: AddEventListenerOptions) : void;\n\n\tgetAncestors()              : IGroupedRowNodeCore[];\n\tgetParentId()               : string;\n\tgetLevel()                  : number;\n\tupdateLevel(level : number) : void;\n\tisEditable()                : boolean | null;\n\tgetCssClasses()             : string;\n\tgetData()                   : any;\n\n}\n\n\ninterface IFieldHeaderRowNode<TData =any> {\n    id        : string\n    pinned    : rowPinPositions,\n    rowHeight : number,\n    readOnly  : boolean | null,\n    locked    : boolean | null,\n\n\tdragging       : boolean | null,\n\tselected       : boolean | null,\n\tcomputedHeight : number  | null,\n\tdata           : TData;\n\tuserParams     : any;\n}\n\nexport {\n    IRowNode,\n    IRowNodeDS,\n    IFieldHeaderRowNode,\n\tIRowNodeHelper\n}","interface IUserPresenceMeta {\n    rowID       ?: string,\n    columnID    ?: string,\n    id          ?: string,\n    color       ?: string,\n}\n\nexport {\n    IUserPresenceMeta\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { MinSpareHandlerType } from \"./min-spare-handler.types\";\nimport type { GridOptioHandler } from \"../GridOptionHandler\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IColumnAPIManager, IRowAPIManager } from \"../../Main\";\nimport { CellPositionType } from \"../Navigation/cell-position.types\";\n// import type { FieldHandler } from \"../Columns/FieldHandler\";\nimport type { RecordHandler } from \"../Rows/RecordHandler\";\nimport { INavigationHandler } from \"../Navigation/navigation-handler.types\";\n\n@Bean(\"minSpareHandler\")\nexport class MinSpareHandler extends EventEmitter implements MinSpareHandlerType {\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler : GridOptioHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_API) private rowAPI          : IRowAPIManager;\n    @AutoWired(GRID_BEAN_NAME.COLUMN_API)  columnAPI    : IColumnAPIManager;\n    // @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : RecordHandler;\n    @AutoWired(\"navigationService\") private navigationService : INavigationHandler;\n\n    @PostConstruct()\n    init() : void {\n        // this.addListener(this.eventHandler, 'EVENT_MIN_SPARE_UPDATE', (params) => this.onMinSpareUpdate(params.cellPosition, params.isNewValue));\n        // this.addListener(this.eventHandler, Events.EVENT_ROW_DATA_LOADED, (params) => {\n        //     if(params.initial) {\n        //         this.rowAPI.appendrows(this.optionHandler.getMinSpareRows());\n        //     }\n        // })\n\n        // this.addListener(this.eventHandler, Events.EVENT_COLUMN_INIT, () => {\n        //     // this.columnAPI.appendColumns()\n        //     // console.log(\"update columns\")\n        // })\n    }\n\n    onMinSpareUpdate(cellPosition : CellPositionType, isNewValue : boolean) : void {\n        // const minSpareColumns = this.optionHandler.getMinSpareColumns();\n        const minSpareRows    = this.optionHandler.getMinSpareRows();\n        const lastRow         = this.recordHandler.getMiddleSpanCount();\n        // const lastColumn      = this.fieldHandler.getCenterSpanCount();\n\n        // const centerFieldHandler = this.fieldHandler.getCenterHandler();\n        // const columnNode         = centerFieldHandler.getColumnNodeByID(cellPosition.columnID);\n        // const columnIndex        = columnNode.getIndex();\n\n\n        const remainingRows = (lastRow - ((cellPosition.rowIndex + 1) + minSpareRows)) * -1;\n        // const remainingColumns = (lastColumn - ((columnIndex + 1) + minSpareColumns)) * -1;\n\n        if(remainingRows > 0 && isNewValue) {\n            this.rowAPI.appendrows(remainingRows);\n        }else if (lastRow === (cellPosition.rowIndex + 1) && !isNewValue) {\n            this.rowAPI.appendrows(1);\n            cellPosition.rowIndex = cellPosition.rowIndex + 1;\n            this.navigationService.focusPosition(cellPosition, null, 'ui');\n        }\n\n        // if(remainingColumns > 0) {\n        //     console.log(\"update column \" , remainingColumns)\n        // }\n\n\n    }\n\n}","import { values } from \"@dg/corecomponent\";\nimport { IModule } from \"../../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\n\n// import { isValidModuleVersion } from \"../../../core/VersionValidation\";\n// import { dependencyVersion, moduleName } from \"../version.js\";\ntype globalModuleMap = { [name: string]: IModule };\ntype instanceModulesMap = { [instanceID: string]: { [name: string]: IModule } };\n\nexport class ModuleRegistry {\n\n    private static globalModulesMap: globalModuleMap      = {};\n    private static instanceModulesMap: instanceModulesMap = {};\n\n    public static register(module: IModule): void {\n        ModuleRegistry.__register(module, undefined);\n    }\n\n    public static registerModules(modules: IModule[]): void {\n        ModuleRegistry.__registerModules(modules, undefined);\n    }\n\n    public static __registerModules(modules: IModule[], instanceID: string | undefined): void {\n        if (!modules) {\n            return;\n        }\n        modules.forEach(module => ModuleRegistry.__register(module, instanceID));\n    }\n\n    public static __unRegisterInstanceModules(instanceID: string): void {\n        delete ModuleRegistry.instanceModulesMap[instanceID];\n    }\n\n    public static __getRegisteredModules(instanceID: string): IModule[] {\n        return [...values(ModuleRegistry.globalModulesMap), ...values(ModuleRegistry.instanceModulesMap[instanceID] || {})];\n    }\n\n    public static __isRegistered(moduleName: string, instanceID: string): boolean {\n        return !!ModuleRegistry.globalModulesMap[moduleName] || !!ModuleRegistry.instanceModulesMap[instanceID]?.[moduleName];\n    }\n\n    public static __getInstanceRegisteredModules(instanceID: string): IModule[] {\n        return values(ModuleRegistry.instanceModulesMap[instanceID] ?? {}) || [];\n    }\n\n    public static __assertRegistered(moduleName: string, reason: string, instanceID: string): boolean {\n        if (this.__isRegistered(moduleName, instanceID)) {\n            return true;\n        }\n\n        console.error(reason);\n\n        return false;\n    }\n\n    public static __register(module: IModule, instanceID: string | undefined): void {\n        // ModuleRegistry.runVersionChecks(module);\n\n        if (instanceID !== undefined) {\n            if (ModuleRegistry.instanceModulesMap[instanceID] === undefined) {\n                ModuleRegistry.instanceModulesMap[instanceID] = {};\n            }\n            ModuleRegistry.instanceModulesMap[instanceID][module.moduleName] = module;\n        } else {\n            ModuleRegistry.globalModulesMap[module.moduleName] = module;\n        }\n    }\n\n    // private static runVersionChecks(module: IModule) : void {\n    //     // if (!module.version) {\n    //     //     throw Error(`You are using incompatible versions of ${moduleName} modules. Major and minor versions should always match across modules. '${module.moduleName}' is incompatible. Please update all modules to the same version.`);\n    //     // } else if (!ModuleRegistry.isValidModuleVersion(module.version, dependencyVersion[module.moduleName])) {\n    //     //     throw Error(`You are using incompatible versions of ${moduleName} modules. Major and minor versions should always match across modules. '${module.moduleName}' is version ${module.version} but the other modules are version ${dependencyVersion[module.moduleName]}. Please update all modules to the same version.`);\n    //     // }\n    // }\n\n    // private static isValidModuleVersion(version : string, dependencyVersion : string) : boolean {\n    //     return isValidModuleVersion(version, dependencyVersion);\n    // }\n}\n\n","const KeyBoardEventKeys = {\n    BACKSPACE   : 'Backspace',\n    TAB         : 'Tab',\n    ENTER       : 'Enter',\n    SHIFT       : 'Shift',\n    CONTROL     : 'Control',\n    ALT         : 'Alt',\n    CAPS_LOCK   : 'CapsLock',\n    ESCAPE      : 'Escape',\n    SPACE       : ' ',\n    PAGE_UP     : 'PageUp',\n    PAGE_DOWN   : 'PageDown',\n    END         : 'End',\n    HOME        : 'Home',\n    ARROW_LEFT  : 'ArrowLeft',\n    ARROW_UP    : 'ArrowUp',\n    ARROW_RIGHT : 'ArrowRight',\n    ARROW_DOWN  : 'ArrowDown',\n    INSERT      : 'Insert',\n    DELETE      : 'Delete',\n    NUM_0       : '0',\n    NUM_1       : '1',\n};\n\n\nconst KeyBoardKeyCode = {\n    A: 'KeyA',\n    B: 'KeyB',\n    C: 'KeyC',\n    D: 'KeyD',\n    E: 'KeyE',\n    F: 'KeyF',\n    G: 'KeyG',\n    H: 'KeyH',\n    I: 'KeyI',\n    J: 'KeyJ',\n    K: 'KeyK',\n    L: 'KeyL',\n    M: 'KeyM',\n    N: 'KeyN',\n    O: 'KeyO',\n    P: 'KeyP',\n    Q: 'KeyQ',\n    R: 'KeyR',\n    S: 'KeyS',\n    T: 'KeyT',\n    U: 'KeyU',\n    V: 'KeyV',\n    W: 'KeyW',\n    X: 'KeyX',\n    Y: 'KeyY',\n    Z: 'KeyZ',\n\n    CtrlLeft    : 'ControlLeft',\n    ShiftLeft   : 'ShiftLeft',\n    CmdLeft     : 'MetaLeft',\n    AltLeft     : 'AltLeft',\n\n    CtrlRight   : 'ControlRight',\n    ShiftRight  : 'ShiftRight',\n    CmdRight    : 'MetaRight',\n    AltRight    : 'AltRight',\n\n    Enter       : 'Enter',\n    Tab         : 'Tab',\n    Escape      : 'Escape',\n    Space       : 'Space',\n    ArrowUp     : 'ArrowUp',\n    ArrowDown   : 'ArrowDown',\n    ArrowLeft   : 'ArrowLeft',\n    ArrowRight  : 'ArrowRight',\n\n    Home        : 'Home',\n    End         : 'End',\n    Delete      : 'Delete',\n    PageUp      : 'PageUp',\n    PageDown    : 'PageDown'\n};\n\n\nexport {\n    KeyBoardEventKeys,\n    KeyBoardKeyCode\n}","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { CellSelection, ColumnSelection, ISelectionInfo, RangeSelection, RowSelection, SELECTION_TYPE } from \"../../GridComponent/Interface/Selection/ISelectionInterface\";\nimport { RowRenderController } from \"../Rows/RowRenderController\";\nimport { SelectionInfoWithDeselect } from \"./SelectionInfoWithDeselect\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { FieldHandler } from \"../Columns/FieldHandler\";\nimport { ISelectionRange } from \"./SelectionInfoHandler\";\nimport { IRecordHandler } from \"../Rows/RecordHandler.types\";\n \n@Bean(GRID_BEAN_NAME.SELECTION_HANDLER)\nclass SelectionHandler extends EventEmitter {\n\t@AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler !: IRecordHandler;\n\t@AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler !: FieldHandler;\n\t@AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRendererController!: RowRenderController;\n\n\tprivate infoHandler: SelectionInfoWithDeselect;\n\tprivate staticCacheIndex: number;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.staticCacheIndex = null;\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tthis.infoHandler = this.createManagedBean(\n\t\t\tnew SelectionInfoWithDeselect(),\n\t\t);\n\t}\n\n\tstatic createSelectionInfo(): ISelectionInfo {\n\t\treturn {\n\t\t\tbackground: [],\n\t\t\tleft: [],\n\t\t\tright: [],\n\t\t\ttop: [],\n\t\t\tbottom: [],\n\t\t};\n\t}\n\n\tstatic getValidRange( startRow: number, startColumn: number, endRow: number, endColumn: number, ): RangeSelection {\n\t\tif (endRow < startRow) {\n\t\t\t[startRow, endRow] = [endRow, startRow];\n\t\t}\n\t\tif (endColumn < startColumn) {\n\t\t\t[startColumn, endColumn] = [endColumn, startColumn];\n\t\t}\n\n\t\treturn { startRow, startColumn, endRow, endColumn };\n\t}\n\n\tprivate paintCellSelection( startRow: number, startColumn: number, _paintBackground: boolean, endRow = startRow, endColumn = startColumn, ): void {\n\n\t\tfor (let row = startRow; row <= endRow; row++) {\n\t\t\tconst currentRowID = this.infoHandler.getRowIDByIndex(row);\n\t\t\tfor (let column = startColumn; column <= endColumn; column++) {\n\t\t\t\tconst currentColumnID =\n\t\t\t\t\tthis.infoHandler.getColumnIDByIndex(column);\n\t\t\t\tthis.onCellCreate(\n\t\t\t\t\tcurrentRowID,\n\t\t\t\t\tcurrentColumnID,\n\t\t\t\t\t(styleInfo) => {\n\t\t\t\t\t\tthis.rowRendererController.updateCellStyles( currentRowID, currentColumnID, styleInfo, );\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst rowHeaderColumnID = this.fieldHandler.getRowHeaderColumnID(0);\n\t\t\tthis.onCellCreate(currentRowID, rowHeaderColumnID, (styleInfo) => {\n\t\t\t\tthis.rowRendererController.updateHeaderCellStyles(\n\t\t\t\t\tcurrentRowID,\n\t\t\t\t\trowHeaderColumnID,\n\t\t\t\t\tstyleInfo,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tfor (let column = startColumn; column <= endColumn; column++) {\n\t\t\tconst currentColumnID = this.infoHandler.getColumnIDByIndex(column);\n\t\t\tconst columnHeaderID = this.recordHandler.getColumnHeaderID(0);\n\t\t\tthis.onCellCreate(columnHeaderID, currentColumnID, (styleInfo) => {\n\t\t\t\tthis.rowRendererController.updateColumnHeaderCellStyles(\n\t\t\t\t\tcolumnHeaderID,\n\t\t\t\t\tcurrentColumnID,\n\t\t\t\t\tstyleInfo,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate clearCellSelectionStyle(row: number, column): void {\n\t\tif (row != undefined && column != undefined) {\n\t\t\tconst rowID = this.infoHandler.getRowIDByIndex(row);\n\t\t\tconst columnID = this.infoHandler.getColumnIDByIndex(column);\n\n\t\t\tthis.rowRendererController.removeCellSelection(rowID, columnID);\n\t\t\tthis.onCellCreate(rowID, columnID, (styleInfo) => {\n\t\t\t\tthis.rowRendererController.updateCellStyles(\n\t\t\t\t\trowID,\n\t\t\t\t\tcolumnID,\n\t\t\t\t\tstyleInfo,\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate clearAllSelection(): void {\n\t\tthis.clearAllRowSelections();\n\t\tthis.clearAllColumnSelections();\n\t\tthis.clearAllRangeSelections();\n\t}\n\n\tprivate clearRangeSelectionStyle( startRow: number, startColumn, endRow: number, endColumn: number, ): void {\n\t\n\t\tfor (let row = startRow; row <= endRow; row++) {\n\t\t\tconst currentRowID = this.infoHandler.getRowIDByIndex(row);\n\t\t\tfor (let column = startColumn; column <= endColumn; column++) {\n\t\t\t\tconst currentColumnID =\n\t\t\t\t\tthis.infoHandler.getColumnIDByIndex(column);\n\t\t\t\tthis.rowRendererController.removeRangeSelection(\n\t\t\t\t\tcurrentRowID,\n\t\t\t\t\tcurrentColumnID,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst headerColumnID = this.fieldHandler.getRowHeaderColumnID(0);\n\t\t\tthis.rowRendererController.removeHeaderSelection(\n\t\t\t\tcurrentRowID,\n\t\t\t\theaderColumnID,\n\t\t\t);\n\t\t}\n\n\t\tfor (let column = startColumn; column <= endColumn; column++) {\n\t\t\tconst currentColumnID = this.infoHandler.getColumnIDByIndex(column);\n\t\t\tconst columnHeaderID = this.recordHandler.getColumnHeaderID(0);\n\t\t\tthis.rowRendererController.removeColumnHeaderSelection(\n\t\t\t\tcolumnHeaderID,\n\t\t\t\tcurrentColumnID,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate getCellStyleInfo( cellSelection, rowArray, columnArray, fillArray, rangeArray, rowID, columnID, ): ISelectionInfo {\n\t\tconst styleInfo = SelectionHandler.createSelectionInfo();\n\t\tthis.updateBackgroundInfo(styleInfo, rowID, columnID);\n\t\tif (styleInfo.background.length != 0) {\n\t\t\tthis.updateTopInfo( styleInfo, cellSelection, fillArray, rowArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateBottomInfo( styleInfo, cellSelection, fillArray, rowArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateLeftInfo( styleInfo, cellSelection, fillArray, columnArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateRightInfo( styleInfo, cellSelection, fillArray, columnArray, rangeArray, rowID, columnID, );\n\t\t}\n\t\treturn styleInfo;\n\t}\n\n\tprivate getRowHeaderCellStyleInfo( cellSelection, rowArray, columnArray, fillArray, rangeArray, rowID, columnID, ): ISelectionInfo {\n\t\tconst styleInfo = SelectionHandler.createSelectionInfo();\n\t\tthis.updateRowHeaderBackgroundInfo(styleInfo, rowID, columnID);\n\t\tif (styleInfo.background.length != 0) {\n\t\t\tthis.updateTopInfo( styleInfo, cellSelection, fillArray, rowArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateBottomInfo( styleInfo, cellSelection, fillArray, rowArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateLeftInfo( styleInfo, cellSelection, fillArray, columnArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateRightInfo( styleInfo, cellSelection, fillArray, columnArray, rangeArray, rowID, columnID, );\n\t\t}\n\n\t\treturn styleInfo;\n\t}\n\n\tprivate getColumnHeaderCellStyleInfo( cellSelection, rowArray, columnArray, fillArray, rangeArray, rowID, columnID, ): ISelectionInfo {\n\t\tconst styleInfo = SelectionHandler.createSelectionInfo();\n\t\tthis.updateColumnHeaderBackgroundInfo(styleInfo, rowID, columnID);\n\t\tif (styleInfo.background.length != 0) {\n\t\t\tthis.updateTopInfo( styleInfo, cellSelection, fillArray, rowArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateBottomInfo( styleInfo, cellSelection, fillArray, rowArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateLeftInfo( styleInfo, cellSelection, fillArray, columnArray, rangeArray, rowID, columnID, );\n\t\t\tthis.updateRightInfo( styleInfo, cellSelection, fillArray, columnArray, rangeArray, rowID, columnID, );\n\t\t}\n\n\t\treturn styleInfo;\n\t}\n\n\tprivate updateRowHeaderBackgroundInfo( styleInfo: ISelectionInfo, rowID: string, _columnID: string, ): void {\n\t\tconst row = this.infoHandler.getRowIndexByID(rowID);\n\t\tthis.infoHandler.isRowSelected(row) &&\n\t\t\tstyleInfo.background.push(SELECTION_TYPE.ROW);\n\t}\n\n\tprivate updateColumnHeaderBackgroundInfo( styleInfo: ISelectionInfo, _rowID: string, columnID: string, ): void {\n\t\tconst column = this.infoHandler.getColumnIndexByID(columnID);\n\t\tthis.infoHandler.isColumnSelected(column) &&\n\t\t\tstyleInfo.background.push(SELECTION_TYPE.COLUMN);\n\t}\n\n\tprivate updateBackgroundInfo( styleInfo: ISelectionInfo, rowID: string, columnID: string, ): void {\n\t\tconst row = this.infoHandler.getRowIndexByID(rowID);\n\t\tconst column = this.infoHandler.getColumnIndexByID(columnID);\n\t\tif (row != null && column != null) {\n\t\t\tthis.infoHandler.isCellSelected(row, column) &&\n\t\t\t\tstyleInfo.background.push(SELECTION_TYPE.CELL);\n\t\t\tthis.infoHandler.isRowSelected(row) &&\n\t\t\t\tstyleInfo.background.push(SELECTION_TYPE.ROW);\n\t\t\tthis.infoHandler.isColumnSelected(column) &&\n\t\t\t\tstyleInfo.background.push(SELECTION_TYPE.COLUMN);\n\t\t\tthis.infoHandler.isRangeSelected(row, column, row, column) &&\n\t\t\t\tstyleInfo.background.push(SELECTION_TYPE.RANGE);\n\t\t\t// this.infoHandler.isCellWithinFillRanges(rowID, columnID) && styleInfo.background.push(SELECTION_TYPE.FILL_SERIES);\n\t\t}\n\t}\n\n\tprivate updateTopInfo( styleInfo: ISelectionInfo, cellSelection: CellSelection, _fillArray: RangeSelection[] = [], rowArray: RowSelection[] = [], rangeArray: RangeSelection[] = [], rowID: string, columnID: string, ): void {\n\t\tconst row = this.infoHandler.getRowIndexByID(rowID);\n\t\tconst column = this.infoHandler.getColumnIndexByID(columnID);\n\t\tcellSelection &&\n\t\t\tcellSelection.row == row &&\n\t\t\tcellSelection.column == column &&\n\t\t\tstyleInfo.top.push(SELECTION_TYPE.CELL);\n\n\t\tfor (let i = 0; i < rowArray.length; i++) {\n\t\t\tconst range = rowArray[i];\n\t\t\tif (range.startRow == row) {\n\t\t\t\tstyleInfo.top.push(SELECTION_TYPE.ROW);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.infoHandler.isColumnSelected(column) &&\n\t\t\trowID == this.infoHandler.getRowIDByIndex(0) &&\n\t\t\tstyleInfo.top.push(SELECTION_TYPE.COLUMN);\n\n\t\tfor (let i = 0; i < rangeArray.length; i++) {\n\t\t\tconst range = rangeArray[i];\n\t\t\tif (\n\t\t\t\trange.startRow == row &&\n\t\t\t\trange.startColumn <= column &&\n\t\t\t\tcolumn <= range.endColumn\n\t\t\t) {\n\t\t\t\tstyleInfo.top.push(SELECTION_TYPE.RANGE);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateBottomInfo( styleInfo: ISelectionInfo, cellSelection: CellSelection, _fillArray: RangeSelection[] = [], rowArray: RowSelection[] = [], rangeArray: RangeSelection[] = [], rowID: string, columnID: string, ): void {\n\t\tconst lastRow = this.recordHandler.getTotalCount() - 1;\n\t\tconst row = this.infoHandler.getRowIndexByID(rowID);\n\t\tconst column = this.infoHandler.getColumnIndexByID(columnID);\n\t\tcellSelection &&\n\t\t\tcellSelection.row == row &&\n\t\t\tcellSelection.column == column &&\n\t\t\tstyleInfo.bottom.push(SELECTION_TYPE.CELL);\n\n\t\tfor (let i = 0; i < rowArray.length; i++) {\n\t\t\tconst range = rowArray[i];\n\t\t\tif (range.endRow == row) {\n\t\t\t\tstyleInfo.bottom.push(SELECTION_TYPE.ROW);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.infoHandler.isColumnSelected(column) &&\n\t\t\trowID == this.infoHandler.getRowIDByIndex(lastRow) &&\n\t\t\tstyleInfo.bottom.push(SELECTION_TYPE.COLUMN);\n\n\t\tfor (let i = 0; i < rangeArray.length; i++) {\n\t\t\tconst range = rangeArray[i];\n\t\t\tif (\n\t\t\t\trange.endRow == row &&\n\t\t\t\trange.startColumn <= column &&\n\t\t\t\tcolumn <= range.endColumn\n\t\t\t) {\n\t\t\t\tstyleInfo.bottom.push(SELECTION_TYPE.RANGE);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateLeftInfo( styleInfo: ISelectionInfo, cellSelection: CellSelection, _fillArray: RangeSelection[] = [], columnArray: ColumnSelection[] = [], rangeArray: RangeSelection[] = [], rowID: string, columnID: string, ): void {\n\t\tconst row = this.infoHandler.getRowIndexByID(rowID);\n\t\tconst column = this.infoHandler.getColumnIndexByID(columnID);\n\t\tcellSelection &&\n\t\t\tcellSelection.column == column &&\n\t\t\tcellSelection.row == row &&\n\t\t\tstyleInfo.left.push(SELECTION_TYPE.CELL);\n\n\t\tthis.infoHandler.isRowSelected(row) &&\n\t\t\tcolumnID == this.infoHandler.getColumnIDByIndex(0) &&\n\t\t\tstyleInfo.left.push(SELECTION_TYPE.ROW);\n\n\t\tfor (let i = 0; i < columnArray.length; i++) {\n\t\t\tconst range = columnArray[i];\n\t\t\tif (range.startColumn == column) {\n\t\t\t\tstyleInfo.left.push(SELECTION_TYPE.COLUMN);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < rangeArray.length; i++) {\n\t\t\tconst range = rangeArray[i];\n\t\t\tif (\n\t\t\t\trange.startColumn == column &&\n\t\t\t\trange.startRow <= row &&\n\t\t\t\trow <= range.endRow\n\t\t\t) {\n\t\t\t\tstyleInfo.left.push(SELECTION_TYPE.RANGE);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate updateRightInfo( styleInfo: ISelectionInfo, cellSelection: CellSelection, _fillArray: RangeSelection[] = [], columnArray: ColumnSelection[] = [], rangeArray: RangeSelection[] = [], rowID: string, columnID: string, ): void {\n\t\tconst row = this.infoHandler.getRowIndexByID(rowID);\n\t\tconst column = this.infoHandler.getColumnIndexByID(columnID);\n\t\tcellSelection &&\n\t\t\tcellSelection.column == column &&\n\t\t\tcellSelection.row == row &&\n\t\t\tstyleInfo.right.push(SELECTION_TYPE.CELL);\n\n\t\tfor (let i = 0; i < columnArray.length; i++) {\n\t\t\tconst range = columnArray[i];\n\t\t\tif (range.endColumn == column) {\n\t\t\t\tstyleInfo.right.push(SELECTION_TYPE.COLUMN);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst endColumn = this.fieldHandler.getTotalCount() - 1;\n\t\tthis.infoHandler.isRowSelected(row) &&\n\t\t\tcolumnID == this.infoHandler.getColumnIDByIndex(endColumn) &&\n\t\t\tstyleInfo.right.push(SELECTION_TYPE.ROW);\n\n\t\tfor (let i = 0; i < rangeArray.length; i++) {\n\t\t\tconst range = rangeArray[i];\n\t\t\tif (\n\t\t\t\trange.endColumn == column &&\n\t\t\t\trange.startRow <= row &&\n\t\t\t\trow <= range.endRow\n\t\t\t) {\n\t\t\t\tstyleInfo.right.push(SELECTION_TYPE.RANGE);\n\t\t\t}\n\t\t}\n\n\t\t// for(let i=0;i< fillArray.length; i++) {\n\t\t//     const range = rangeArray[i];\n\t\t//     const startIndex = this.recordHandler.getRelativeIndexByID(range.columnID);\n\t\t//     const lastIndex = startIndex + range.columnCount -1;\n\t\t//     const endID = this.infoHandler.getRowIDByIndex(lastIndex);\n\t\t//     if (endID == columnID){\n\t\t//         styleInfo.right.push(SELECTION_TYPE.FILL_SERIES);\n\t\t//     }\n\t\t// }\n\t}\n\n\tupdateColumnAxis(index: number, changeCount: number): void {\n\t\tthis.infoHandler.updateColumnAxis(index, changeCount);\n\t}\n\n\tupdateRowAxis(index: number, changeCount: number): void {\n\t\tthis.infoHandler.updateRowAxis(index, changeCount);\n\t}\n\n\tonCellCreate(rowID: string, columnID: string, callback): void {\n\t\tif (this.recordHandler.isInHeader(rowID)) {\n\t\t\tthis.onColumnHeaderCellCreate(rowID, columnID, callback);\n\t\t}\n\t\tif (this.fieldHandler.isInHeader(columnID)) {\n\t\t\tthis.onRowHeaderCellCreate(rowID, columnID, callback);\n\t\t}\n\t\tconst cellSelection = this.infoHandler.getActiveCell();\n\t\tlet fillArray;\n\t\tconst rowArray = this.infoHandler.getAllRowSelections();\n\t\tconst columnArray = this.infoHandler.getAllColumnSelections();\n\t\tconst rangeArray = this.infoHandler.getAllRangeSelections();\n\n\t\tconst styleInfo = this.getCellStyleInfo(\n\t\t\tcellSelection,\n\t\t\trowArray,\n\t\t\tcolumnArray,\n\t\t\tfillArray,\n\t\t\trangeArray,\n\t\t\trowID,\n\t\t\tcolumnID,\n\t\t);\n\t\tcallback?.(styleInfo);\n\t}\n\n\tonRowHeaderCellCreate(rowID, columnID, callback): void {\n\t\tlet cellSelection; // = this.infoHandler.getActiveCell();\n\t\tlet fillArray; //= fillSelection ? [fillSelection]: [];\n\t\tconst rowArray = this.infoHandler.getAllRowSelections();\n\t\tlet columnArray; // = this.infoHandler.getAllColumnSelections();\n\t\tlet rangeArray; //= this.infoHandler.getAllRangeSelections();\n\n\t\tconst styleInfo = this.getRowHeaderCellStyleInfo( cellSelection, rowArray, columnArray, fillArray, rangeArray, rowID, columnID, );\n\t\tcallback?.(styleInfo);\n\t}\n\n\tonColumnHeaderCellCreate(rowID, columnID, callback): void {\n\t\tlet cellSelection; // = this.infoHandler.getActiveCell();\n\t\tlet fillArray; //= fillSelection ? [fillSelection]: [];\n\t\tlet rowArray; //= this.infoHandler.getAllRowSelections();\n\t\tconst columnArray = this.infoHandler.getAllColumnSelections();\n\t\tlet rangeArray; //= this.infoHandler.getAllRangeSelections();\n\n\t\tconst styleInfo = this.getColumnHeaderCellStyleInfo( cellSelection, rowArray, columnArray, fillArray, rangeArray, rowID, columnID, );\n\t\tcallback?.(styleInfo);\n\t}\n\n\tgetInfoHandler() {\n\t\treturn this.infoHandler;\n\t}\n\n\tplaceCellSelection(row: number, column: number): void {\n\t\tconst paintBackground = false;\n\t\tconst middleHandler = this.recordHandler.getMiddleHandler();\n\t\tconst cellSelection = this.infoHandler.getActiveCell();\n\n\t\tlet previousIndex = cellSelection ? cellSelection.row : null;\n\t\tlet currentIndex = row;\n\t\tpreviousIndex = previousIndex != -1 ? previousIndex : null;\n\t\tcurrentIndex = currentIndex != -1 ? currentIndex : null;\n\n\t\tthis.removeCellSelection();\n\t\tif ( previousIndex != null && this.staticCacheIndex != null) {\n\t\t\t// if(!(middleHandler.isInSameBlock([previousIndex, currentIndex]))){\n\t\t\t\tthis.staticCacheIndex = null;\n\t\t\t\tthis.rowRendererController.removeFromStaticCache(previousIndex);\n\t\t\t// }\n\t\t}\n\n\t\tthis.infoHandler.placeCellSelection(row, column);\n\t\tthis.paintCellSelection(row, column, paintBackground);\n\n\t\tif (\n\t\t\tcurrentIndex != null &&\n\t\t\tthis.staticCacheIndex == null &&\n\t\t\t!(middleHandler.isInStaticCache(currentIndex))\n\t\t) {\n\t\t\tconst isInMiddle = this.recordHandler.isInMiddlePane(currentIndex);\n\t\t\tif (isInMiddle) {\n\t\t\t\tthis.staticCacheIndex =\n\t\t\t\t\tthis.recordHandler.convertToAbsoluteIndex(currentIndex);\n\t\t\t\tthis.rowRendererController.addToStaticCache(\n\t\t\t\t\tthis.staticCacheIndex,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.staticCacheIndex = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveCellSelection(): void {\n\n\t\tconst cellSelection = this.infoHandler.getActiveCell();\n\t\tthis.infoHandler.clearCellSelection();\n\t\tcellSelection &&\n\t\t\tthis.clearCellSelectionStyle(\n\t\t\t\tcellSelection.row,\n\t\t\t\tcellSelection.column,\n\t\t\t);\n\t}\n\n\tremoveRowSelection( startRow: number, startColumn: number = 0, endRow: number = startRow, endColumn: number ): void {\n\n\t\tthis.infoHandler.clearRowSelection(\n\t\t\tstartRow,\n\t\t\tendRow,\n\t\t\tstartColumn,\n\t\t\tendColumn,\n\t\t);\n\t\tthis.clearRowSelectionStyle({\n\t\t\tstartRow,\n\t\t\tstartColumn,\n\t\t\tendRow,\n\t\t\tendColumn,\n\t\t});\n\n\t}\n\n\tremoveColumnSelection( startColumn: number, endColumn = startColumn, startRow?: number, endRow?: number, ): void {\n\t\tconst lastRow = this.recordHandler.getTotalCount();\n\t\tstartRow = startRow ?? 0;\n\t\tendRow = endRow ?? lastRow;\n\n\t\tthis.infoHandler.clearColumnSelection(\n\t\t\tstartRow,\n\t\t\tstartColumn,\n\t\t\tendRow,\n\t\t\tendColumn,\n\t\t);\n\t\tthis.clearColumnSelectionStyle({\n\t\t\tstartRow,\n\t\t\tstartColumn,\n\t\t\tendRow,\n\t\t\tendColumn,\n\t\t});\n\t}\n\n\tremoveRangeSelection( _startRow: number, _endRow: number, _startColumn: number, _endColumn: number, ): void {\n\t\t\n\t}\n\n\tplaceAllRowSelection(): void {\n\t\tconst lastRow = this.recordHandler.getTotalCount() - 1;\n\t\tthis.clearAllSelection();\n\t\tthis.placeRowSelection(0, lastRow);\n\t}\n\n\tplaceAllRangeSelection(): void {\n\t\tconst lastRow = this.recordHandler.getTotalCount();\n\t\tconst lastColumn = this.fieldHandler.getTotalCount();\n\t\tthis.clearAllSelection();\n\t\tthis.placeRangeSelection(0, 0, lastRow, lastColumn);\n\t}\n\n\tplaceRowSelection( startRow: number, endRow = startRow, startColumn?: number, endColumn?: number, ): void {\n\t\tstartColumn = startColumn ?? 0;\n\t\tendColumn = endColumn ?? this.fieldHandler.getTotalCount() - 1;\n\t\t\n\t\tconst paintBackground = true;\n\t\tconst range = SelectionHandler.getValidRange( startRow, startColumn, endRow, endColumn, );\n\t\tstartRow = range.startRow;\n\t\tstartColumn = range.startColumn;\n\t\tendRow = range.endRow;\n\t\tendColumn = range.endColumn;\n\t\tthis.infoHandler.placeRowSelection( startRow, startColumn, endRow, endColumn, );\n\t\tthis.paintCellSelection( startRow, startColumn, paintBackground, endRow, endColumn, );\n\t}\n\n\ttoggleRowSelection(_row: number) {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\ttoggleColumnSelection(_column: number) {\n\t\tthrow new Error('Method not implemented.');\n\t}\n\n\tprivate clearRowSelectionStyle(range): void {\n\t\t// const rowSelection = this.getAllRowSelections();\n\t\t// const length = rowSelection.length;\n\t\t// for (let index = 0; index < length; index++) {\n\t\tconst { startRow, startColumn, endRow, endColumn } = range;\n\t\t// const { startRow, startColumn, endRow, endColumn } = this.infoHandler.getRowSelectionAsRange( rowRange.startRow, rowRange.endRow);\n\t\tthis.clearRangeSelectionStyle(startRow, startColumn, endRow, endColumn);\n\t\t// }\n\t}\n\n\tprivate clearColumnSelectionStyle(range): void {\n\t\t// const columnSelection = this.getAllColumnSelections();\n\t\t// const length = columnSelection.length;\n\t\t// for (let index = 0; index < length; index++) {\n\t\tconst { startRow, startColumn, endRow, endColumn } = range;\n\t\t// const { startRow, startColumn, endRow, endColumn } = this.infoHandler.getColumnSelectionAsRange( columnRange.startColumn, columnRange.endColumn);\n\t\tthis.clearRangeSelectionStyle(startRow, startColumn, endRow, endColumn);\n\t\t// }\n\t}\n\n\tclearRangeSelection(range): void {\n\t\tconst { startRow, startColumn, endRow, endColumn } = range;\n\t\t// const rangeSelections = this.infoHandler.getAllRangeSelections();\n\t\t// rangeSelections.forEach(({startRow, startColumn, endRow, endColumn}) => {\n\t\t\tthis.infoHandler.clearRangeSelection(startRow, startColumn, endRow, endColumn);\n\t\t\tthis.clearRangeSelectionStyle(startRow, startColumn, endRow, endColumn);\n\t\t// });\n\t}\n\n\tclearAllRowSelections(): void {\n\t\tconst rowSelections = this.getAllRowSelections();\n\t\tconst count = rowSelections.length;\n\t\tfor (let index = 0; index < count; index++) {\n\t\t\tconst { startRow, startColumn, endRow, endColumn } =\n\t\t\t\trowSelections[0];\n\t\t\tthis.removeRowSelection(startRow, startColumn, endRow, endColumn);\n\t\t}\n\t}\n\n\tclearAllColumnSelections(): void {\n\t\tconst columnSelections = this.getAllColumnSelections();\n\t\tcolumnSelections.forEach((range) => {\n\t\t\tthis.removeColumnSelection( range.startColumn, range.endColumn, range.startRow, range.endRow, );\n\t\t});\n\t}\n\n\tclearAllRangeSelections(): void {\n\t\tconst rangeSelections = this.getAllRangeSelections();\n\t\trangeSelections.forEach(\n\t\t\t({ startRow, startColumn, endRow, endColumn }) => {\n\t\t\t\tthis.clearRangeSelectionStyle( startRow, startColumn, endRow, endColumn, );\n\t\t\t},\n\t\t);\n\t\tthis.infoHandler.clearAllRangeSelections();\n\t}\n\n\tplaceColumnSelection( startColumn: number, endColumn = startColumn, startRow?: number, endRow?: number, ): void {\n\t\tconst lastRow = this.recordHandler.getTotalCount();\n\t\tstartRow = startRow ?? 0;\n\t\tendRow = endRow ?? lastRow;\n\n\t\tconst paintBackground = true;\n\t\tconst range = SelectionHandler.getValidRange( startRow, startColumn, endRow, endColumn, );\n\t\tstartRow = range.startRow;\n\t\tstartColumn = range.startColumn;\n\t\tendRow = range.endRow;\n\t\tendColumn = range.endColumn;\n\t\tthis.infoHandler.placeColumnSelection( startRow, startColumn, endRow, endColumn, );\n\t\tthis.paintCellSelection( startRow, startColumn, paintBackground, endRow, endColumn, );\n\t}\n\n\tplaceRangeSelection( startRow: number, startColumn: number, endRow = startRow, endColumn = startColumn, ): void {\n\n\t\tconst paintBackground = true;\n\t\tconst range = SelectionHandler.getValidRange( startRow, startColumn, endRow, endColumn, );\n\t\tstartRow = range.startRow;\n\t\tstartColumn = range.startColumn;\n\t\tendRow = range.endRow;\n\t\tendColumn = range.endColumn;\n\n\t\tthis.infoHandler.placeRangeSelection( startRow, startColumn, endRow, endColumn, );\n\t\tthis.paintCellSelection( startRow, startColumn, paintBackground, endRow, endColumn, );\n\n\t}\n\n\tgetCellSelection(): CellSelection {\n\t\treturn this.infoHandler.getActiveCell();\n\t}\n\n\tgetAllSelection(): RangeSelection[] {\n\t\treturn this.infoHandler.getAllSelection();\n\t}\n\n\tgetAllRowSelections(): RangeSelection[] {\n\t\tconst rowSelections = this.infoHandler.getAllRowSelections();\n\t\treturn rowSelections;\n\t}\n\n\tgetAllColumnSelections(): RangeSelection[] {\n\t\tconst columnSelection = this.infoHandler.getAllColumnSelections();\n\t\treturn columnSelection;\n\t}\n\n\tclearAllSelections(): void {\n\t\tthis.clearAllSelection();\n\t\tthis.infoHandler.clearAllSelections();\n\t}\n\n\tgetActiveSelection(): { type: SELECTION_TYPE; range: ISelectionRange } {\n\t\treturn this.infoHandler.getActiveSelection();\n\t}\n\n\tgetSelectedRows(): number[] {\n\t\treturn this.infoHandler?.getSelectedRows() || [];\n\t}\n\n\tgetSelectedColumns(): number[] {\n\t\treturn this.infoHandler?.getSelectedColumns() || [];\n\t}\n\n\tgetSelectedRowsCount(): number {\n\t\treturn this.infoHandler.getSelectedRowsCount();\n\t}\n\tgetSelectedColumnsCount(): number {\n\t\treturn this.infoHandler.getSelectedColumnsCount();\n\t}\n\n\t// getSelectionByActiveCell(): RangeSelection {\n\t// \treturn this.infoHandler.getSelectionByActiveCell();\n\t// }\n\n\tremoveActiveSelection(): void {\n\t\tconst activeSelection = this.infoHandler.getActiveSelection();\n\t\tif (activeSelection) {\n\t\t\tswitch (activeSelection.type) {\n\t\t\t\tcase SELECTION_TYPE.ROW:\n\t\t\t\t\tthis.clearRowSelectionStyle(activeSelection.range);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SELECTION_TYPE.COLUMN:\n\t\t\t\t\tthis.clearColumnSelectionStyle(activeSelection.range);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SELECTION_TYPE.RANGE:\n\t\t\t\t\tthis.clearRangeSelection(activeSelection.range);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.infoHandler.clearActiveSelection();\n\t}\n\n\tscrollCellIntoView(row: number, column: number): void {\n\t\tconst rowID = this.infoHandler.getRowIDByIndex(row);\n\t\tconst columnID = this.infoHandler.getColumnIDByIndex(column);\n\t\tthis.rowRendererController.scrollCellIntoView(rowID, columnID);\n\t}\n\n\tgetAllRangeSelections(): RangeSelection[] {\n\t\treturn this.infoHandler.getAllRangeSelections();\n\t}\n\n\tisCellSelected(row, column): boolean {\n\t\treturn this.infoHandler?.isCellSelected(row, column);\n\t}\n\n\tisRowSelected(row: number): boolean {\n\t\treturn this.infoHandler?.isRowSelected(row);\n\t}\n\n\tisColumnSelected(column: number): boolean {\n\t\treturn this.infoHandler?.isColumnSelected(column);\n\t}\n\n\tisRowFocused(row: number): boolean {\n\t\treturn this.infoHandler?.isRowFocused(row);\n\t}\n} \n\nexport {\n    SelectionHandler\n}\n\n\n\n// Data needed for Key and Mouse events\n\n// *   Event : MouseEvent | KeyEvent\n// *   SelectionStyle : {\n//     top : color\n//     bottom : color\n//     left : color\n//     right : color\n//     fillseries : boolean\n// }\n// // *   target : RowHeader | ColumnHeader | Cell | FillSeriesCue | ColumnResizeCue | SelectAll\n// *   isFillSeriesEnabled();\n// *   isColumnMergeEnabled();\n// *   getColumnMergeInfo();\n// // *   rowIndex, columnIndex\n// *   isFillSeriesDragging();\n// *   setFillSeriesDragging();\n// *   isColumnResizing();\n// *   isColumnDragging();\n// *   isRowDragging();\n// *   isColumnLocked(column)\n// *   isRowLocked(row)\n// *   isCellLocked(row, column);\n// *   sequence of cell ids and current Index","import { AutoWired } from \"@dg/corecomponent\";\nimport {  SELECTION_TYPE } from \"../../GridComponent/Interface/Selection/ISelectionInterface\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\n\ninterface ISelectionRange {\n    startRow: number;\n    startColumn: number;\n    endRow: number;\n    endColumn: number;\n}\n  \n//   const enum SELECTION_TYPE {\n//     FILL_SERIES = 'fillSeries',\n//     RANGE = 'range',\n//     CELL = 'cell',\n//     ROW = 'row',\n//     COLUMN = 'column',\n//   }\n  \n  interface CellSelection {\n    row: number;\n    column: number;\n  }\n  \nclass SelectionInfoHandler {\n    private rowCount = 0;\n    private columnCount = 0;\n    private rowSelections: ISelectionRange[] = [];\n    private columnSelections: ISelectionRange[] = [];\n    private rangeSelections: ISelectionRange[] = [];\n    private activeSelections: { type: SELECTION_TYPE; range: ISelectionRange }[] = [];\n    private activeCell: CellSelection = null;\n\n    private targetIndex = null;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler: any;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler: any;\n\n\n    getRowIDByIndex(index : number) :string {\n        return this.recordHandler.getAbsoluteID(index);\n    }\n\n    getColumnIDByIndex(index : number) :string {\n        return this.fieldHandler.getAbsoluteID(index);\n    }\n\n    getRowIndexByID(id : string) :number {\n        return this.recordHandler.getRelativeIndexByID(id);\n    }\n\n    getColumnIndexByID(id : string) :number {\n        return this.fieldHandler.getIndexById(id);\n    }\n\n    \n\n    //to use is commonly\n    private isRangePlacedInSelection(selections: ISelectionRange[], newRange: ISelectionRange): boolean {\n        return selections.some((selection) => this.isOverlapping(selection, newRange));\n    }\n\n    private sortSelections(selections: ISelectionRange[]): void {\n        selections.sort((a, b) => {\n            // Sort by starting row first  \n            if (a.startRow !== b.startRow) {\n            return a.startRow - b.startRow;\n            }\n\n            // If starting rows are the same, sort by starting column\n            return a.startColumn - b.startColumn;\n        });\n    }\n\n    private findSelectionIndex(selections: ISelectionRange[], range: ISelectionRange): number {\n        return selections.findIndex((selection) =>\n            this.isOverlapping(selection, range)\n        );\n    }\n\n    private findActiveSelectionIndex(range: ISelectionRange): number {\n        return this.activeSelections.findIndex(\n            (selection) => this.isOverlapping(selection.range, range)\n        );\n        }\n\n    private isOverlapping(selection: ISelectionRange, newRange: ISelectionRange): boolean {\n        return (\n            selection.startRow <= newRange.startRow &&\n            selection.endRow >= newRange.endRow &&\n            selection.startColumn <= newRange.startColumn &&\n            selection.endColumn >= newRange.endColumn\n        );\n    }\n\n    private addSelections(type: SELECTION_TYPE, range: ISelectionRange): void {\n        let selection = [];\n        switch (type) {\n            case SELECTION_TYPE.ROW:\n                selection = this.rowSelections;\n                break;\n            case SELECTION_TYPE.COLUMN:\n                selection = this.columnSelections;\n                break;\n            case SELECTION_TYPE.RANGE:\n                selection = this.rangeSelections;\n                break;\n        }\n\n        this.activeSelections.push({type, range});\n        this.targetIndex = this.activeSelections.length-1;\n\n        selection.push(range);\n        this.sortSelections(selection);\n    }\n        \n    private removeSelections(type: SELECTION_TYPE, range: ISelectionRange): void {\n        let selection = [];\n        switch (type) {\n            case SELECTION_TYPE.ROW:\n            selection = this.rowSelections;\n            break;\n            case SELECTION_TYPE.COLUMN:\n            selection = this.columnSelections;\n            break;\n            case SELECTION_TYPE.RANGE:\n            selection = this.rangeSelections;\n            break;\n        }\n\n        const activeSelectionIndex = this.findActiveSelectionIndex(range);\n        const selectionIndex = this.findSelectionIndex(selection, range);\n\n        (activeSelectionIndex != -1) && this.activeSelections.splice(activeSelectionIndex, 1); \n        (selectionIndex != -1) && selection.splice(selectionIndex, 1); \n\n        this.targetIndex = this.activeSelections.length-1;\n    }\n\n    updateRowAxis(index : number, changeCount : number) : void{\n        //activeSelection holds actual reference of the selections if activeSelection change its also affect selections too;\n        this.activeSelections.forEach(({range})=>{\n            if(index == range.startRow && index == range.endRow){\n                this.clearRowSelection(range.startRow, range.endRow, range.startColumn, range.endColumn);\n            }\n            else{\n                if(index <= range.startRow) {\n                    if(changeCount < 0){\n                        range.startRow= Math.max(index, range.startRow + changeCount);\n                    }\n                    else{\n                        range.startRow= range.startRow + changeCount;\n                    }\n                }\n                if(index <= range.endRow) {\n                    if(changeCount < 0){\n                        range.endRow= range.endRow + changeCount;\n                    }\n                    else{\n                        range.endRow= range.endRow + changeCount;                    \n                    }\n                }\n            }\n        });\n\n        //\n        const cellRow = this.activeCell && this.activeCell.row;\n        if((cellRow != undefined) && (index <= cellRow)) {\n            this.activeCell.row = cellRow + changeCount;\n        }\n    }\n\n    updateColumnAxis(index : number, changeCount : number) : void{\n        //activeSelection holds actual reference of the selections if activeSelection change its also affect selections too;\n        this.activeSelections.forEach(({range})=>{\n            if(index == range.startColumn && index == range.endColumn){\n                this.clearColumnSelection(range.startColumn, range.endColumn, range.startColumn, range.endColumn);\n            }\n            else{\n                if(index <= range.startColumn) {\n                    if(changeCount < 0){\n                        range.startColumn = Math.max(index, range.startColumn + changeCount);\n                    }\n                    else{\n                        range.startColumn = range.startColumn + changeCount;\n                    }\n                }\n                if(index <= range.endColumn) {\n                    if(changeCount < 0){\n                        range.endColumn= range.endColumn + changeCount;\n                    }\n                    else{\n                        range.endColumn= range.endColumn + changeCount;                    \n                    }\n                }\n            }\n        });\n\n        //\n        const cellColumn = this.activeCell && this.activeCell.column;\n        if((cellColumn != undefined) && (index <= cellColumn)) {\n            this.activeCell.column = cellColumn + changeCount;\n        }\n    }\n\n    //count\n    setRowCount(rowCount: number): void {\n        this.rowCount = rowCount;\n    }\n\n    setColumnCount(columnCount: number): void {\n        this.columnCount = columnCount;\n    }\n\n    getRowCount(): number {\n        return this.rowCount;\n    }\n\n    getColumnCount(): number {\n        return this.columnCount;\n    }\n\n\n    //placeSelection\n    placeCellSelection(row: number, column: number): void {\n        this.activeCell = { row, column };\n    }\n\n    placeRowSelection(startRow: number, startColumn: number, endRow: number, endColumn: number): void {\n        const range = { startRow, endRow, startColumn, endColumn };\n        // const isInRange = this.isRangePlacedInSelection(this.rowSelections, range);\n        // !isInRange && this.addSelections(SELECTION_TYPE.ROW, range);\n\n        const selections = this.getRowSelectionArray();\n        const result = insertRange(selections, [startRow, endRow]);\n\n        const selectedRowRanges = this.generateRowRange(result, startColumn, endColumn);\n        this.rowSelections = selectedRowRanges;\n        this.activeSelections.push({\n            type : SELECTION_TYPE.ROW,\n            range : range\n        });\n        this.targetIndex = this.activeSelections.length - 1;\n        this.sortSelections(this.rowSelections);\n        \n    }\n\n    private getRowSelectionArray() : number[][] {\n        const rowSelections = this.getAllRowSelections();\n        const rowSelectionsArray = [];\n        for(let i = 0; i < rowSelections.length; i++) {\n            const rowSelection = [rowSelections[i].startRow, rowSelections[i].endRow];\n            rowSelectionsArray.push(rowSelection);\n        }\n        return rowSelectionsArray;\n    }\n\n    private generateRowRange(rowSelectionsArray, startColumn : number, endColumn : number) : any[] {\n        const ranges = [];\n        const n = rowSelectionsArray.length;\n        for(let i = 0; i < n; i++) {\n            const range = {\n                startRow : rowSelectionsArray[i][0],\n                startColumn : startColumn,\n                endRow : rowSelectionsArray[i][1],\n                endColumn : endColumn\n            }\n            ranges.push(range);\n        }\n        return ranges;\n    }\n\n\n\n    placeColumnSelection(startRow: number, startColumn: number, endRow: number, endColumn: number): void {\n        const range = { startRow, endRow, startColumn, endColumn };\n        const isInRange = this.isRangePlacedInSelection(this.columnSelections, range);\n        !isInRange && this.addSelections(SELECTION_TYPE.COLUMN, range);\n    }\n\n    placeRangeSelection(startRow: number, startColumn: number, endRow: number, endColumn: number): void {\n        const range = { startRow, endRow, startColumn, endColumn };\n        const isInRange = this.isRangePlacedInSelection(this.rangeSelections, range);\n        !isInRange && this.addSelections(SELECTION_TYPE.RANGE, range);\n    }\n\n\n    //removeSelection\n    clearCellSelection(): void {\n        this.activeCell = null;\n    }\n\n    clearRowSelection(startRow: number, endRow: number, startColumn: number, endColumn: number): void {\n        // const range = { startRow, endRow, startColumn, endColumn };\n        // const isInRange = this.isRangePlacedInSelection(this.rowSelections, range);\n        // isInRange && this.removeSelections(SELECTION_TYPE.ROW, range);\n\n        const selections = this.getRowSelectionArray();\n        const result = insertRange(selections, [startRow, endRow]);\n        const existingRangeIndex = result.findIndex(subArr => subArr[0] === startRow && subArr[1] === endRow);\n        (existingRangeIndex != -1) && result.splice(existingRangeIndex, 1);\n        const selectedRowRanges = this.generateRowRange(result, startColumn, endColumn);\n        this.rowSelections = selectedRowRanges;\n        this.targetIndex = this.activeSelections.length - 1;\n        this.sortSelections(this.rowSelections);\n    }\n    \n\n    clearColumnSelection(startColumn: number, endColumn: number, startRow: number, endRow: number): void {\n        const range = { startRow, endRow, startColumn, endColumn };\n        const isInRange = this.isRangePlacedInSelection(this.columnSelections, range);\n        isInRange && this.removeSelections(SELECTION_TYPE.COLUMN, range);\n    }\n\n    clearRangeSelection(startRow: number, startColumn: number, endRow: number, endColumn: number): void {\n        const range = { startRow, endRow, startColumn, endColumn };\n        const isInRange = this.isRangePlacedInSelection(this.rangeSelections, range);\n        isInRange && this.removeSelections(SELECTION_TYPE.RANGE, range);\n    }\n\n    clearAllRowSelections() {\n        const selectionCount = this.rowSelections.length;\n        for(let i=selectionCount-1;i>=0;i--){\n            const {startRow, startColumn, endRow, endColumn} = this.rowSelections[i];\n            this.clearRowSelection(startRow, endRow, startColumn, endColumn);\n        }\n\t}\n\n    clearAllColumnSelections() {\n        const selectionCount = this.columnSelections.length;\n        for(let i=selectionCount-1;i>=0;i--){\n            const {startRow, startColumn, endRow, endColumn} = this.columnSelections[i];\n            this.clearColumnSelection(startColumn, endColumn, startRow, endRow);\n        } \n\t}\n\n    clearAllRangeSelections() {\n        const selectionCount = this.rangeSelections.length;\n        for(let i=selectionCount-1;i>=0;i--){\n            const {startRow, startColumn, endRow, endColumn} = this.rangeSelections[i];\n            this.clearRangeSelection(startRow, startColumn, endRow, endColumn);\n        } \n\t}\n\n    clearActiveSelection() {\n        const activeSelection = this.getActiveSelection();\n        activeSelection && this.removeSelections(activeSelection.type, activeSelection.range);\n\t}\n\n\n    //toggle selection\n    toggleRowSelection(startRow: number, endRow: number, startColumn: number, endColumn: number): void {\n        const range = { startRow, endRow, startColumn, endColumn };\n        const isInRange = this.isRangePlacedInSelection(this.rowSelections, range);\n        isInRange ? this.addSelections(SELECTION_TYPE.ROW, range) : this.removeSelections(SELECTION_TYPE.ROW, range);\n    }\n\n    toggleColumnSelection(startColumn: number, endColumn: number, startRow: number, endRow: number): void {\n        const range = { startRow, endRow, startColumn, endColumn };\n        const isInRange = this.isRangePlacedInSelection(this.rowSelections, range);\n        isInRange ? this.addSelections(SELECTION_TYPE.ROW, range) : this.removeSelections(SELECTION_TYPE.COLUMN, range);\n    }\n\n    toggleRangeSelection(startRow: number, startColumn: number, endRow: number, endColumn: number): void {\n        const range = { startRow, endRow, startColumn, endColumn };\n        const isInRange = this.isRangePlacedInSelection(this.rowSelections, range);\n        isInRange ? this.addSelections(SELECTION_TYPE.ROW, range) : this.removeSelections(SELECTION_TYPE.RANGE, range);\n    }\n\n\n    //isSelected\n\n    isCellSelected(row, column) : boolean{\n        return this.activeCell && (row == this.activeCell.row && column == this.activeCell.column);\n    }\n\n    isRowSelected(row : number) : boolean {\n        return this.rowSelections.some((selection) => selection.startRow<=row && row <= selection.endRow);\n    }\n\n    isColumnSelected(column : number) : boolean {\n        return this.columnSelections.some((selection) => selection.startColumn<=column && column <= selection.endColumn);\n    }\n\n    isRangeSelected(startRow, startColumn, endRow, endColumn) : boolean {\n        return this.isRangePlaced(SELECTION_TYPE.RANGE, {startRow, startColumn, endRow, endColumn});\n    }\n\n    isRangePlaced(type: SELECTION_TYPE, range: ISelectionRange): boolean {\n        switch (type) {\n        case SELECTION_TYPE.ROW:\n            return this.isRangePlacedInSelection(this.rowSelections, range);\n        case SELECTION_TYPE.COLUMN:\n            return this.isRangePlacedInSelection(this.columnSelections, range);\n        case SELECTION_TYPE.RANGE:\n            return this.isRangePlacedInSelection(this.rangeSelections, range);\n        default:\n            return false;\n        }\n    }\n\n    //getters\n\n    getActiveCell(): CellSelection {\n        return this.activeCell;\n    }\n\n    getAllRowSelections(){\n\t\treturn this.rowSelections;\n\t}\n\n    getAllColumnSelections() {\n\t\treturn this.columnSelections;\n\t}\n\n    getAllRangeSelections() {\n\t\treturn this.rangeSelections;\n\t}\n\n    getSelectedRows() : number[] {\n        const rowSelection : number[] = [];\n        for(let i = 0; i < this.activeSelections.length; i++) {\n            if(this.activeSelections[i].type == SELECTION_TYPE.ROW) {\n                const range = this.activeSelections[i].range;\n                for(let i = range.startRow; i <= range.endRow; i++) {\n                    rowSelection.push(i);\n                }\n            }\n        }\n\n        return rowSelection;\n    }\n\n    getSelectedColumns() : number[] {\n        const columnSelection = [];\n        for(let i = 0; i < this.activeSelections.length; i++) {\n            if(this.activeSelections[i].type == SELECTION_TYPE.COLUMN) {\n                const range = this.activeSelections[i].range;\n                for(let i = range.startColumn; i <= range.endColumn; i++) {\n                    columnSelection.push(i);\n                }\n            }\n        }\n\n        return columnSelection;\n    }\n\n    getSelectedRowsCount() : number {\n        let rowCount = 0;\n        for(let i = 0; i < this.rowSelections.length; i++) {\n                const range = this.rowSelections[i];\n                rowCount += (range.endRow - range.startRow) + 1;\n        }\n        return rowCount;\n    }\n\n    getSelectedColumnsCount() : number {\n        let columnCount = 0;\n        for(let i = 0; i < this.activeSelections.length; i++) {\n            if(this.activeSelections[i].type == SELECTION_TYPE.COLUMN) {\n                const range = this.activeSelections[i].range;\n                columnCount += (range.endColumn - range.startColumn) + 1;\n            }\n        }\n        return columnCount;\n    }\n\n    getActiveSelection(): { type: SELECTION_TYPE; range: ISelectionRange } {\n        const length =this.activeSelections.length;\n        return this.activeSelections[length-1];\n    }\n\n    getHorizontalTraversePosition(moves : number) : CellSelection{\n        const {row, column} = this.activeCell;\n        let targetColumn = column;\n        let targetRow = row;\n        let targetSelection = this.activeSelections[this.targetIndex]?.range;\n        const activeSelectionsCount = this.activeSelections.length;\n\n        const startColumnIndex = targetSelection.startColumn;\n        const endColumnIndex = targetSelection.endColumn;\n        const currentColumn =  column;\n\n        if(0 < moves){\n            if(currentColumn + moves <= endColumnIndex){\n                targetColumn =  currentColumn + moves;\n            }\n            else{\n                const endRowIndex = targetSelection.endRow;\n                const currentRow = row;\n\n                const diff = (currentColumn + moves) - endColumnIndex;\n                const targetIndex = startColumnIndex + (diff - 1);\n                targetColumn =  targetIndex;\n\n                //findNextRow\n                if(currentRow == endRowIndex){\n                    this.targetIndex = (this.targetIndex+1)%activeSelectionsCount;\n                    targetSelection = this.activeSelections[this.targetIndex]?.range;\n\n                    targetRow = targetSelection.startRow;\n                    targetColumn = targetSelection.startColumn;\n                }\n                else{\n                    targetRow = currentRow + 1;\n                }\n            }\n        }\n        else {\n            moves = Math.abs(moves);\n            if(startColumnIndex <= currentColumn - moves){\n                targetColumn = currentColumn - moves;\n            }\n            else{\n                const startRowIndex = targetSelection.startRow;\n                const currentRow = row;\n\n                const diff = startColumnIndex - (currentColumn - moves);\n                const targetIndex = endColumnIndex - (diff - 1);\n                targetColumn = targetIndex;\n                \n                //findPreviousRow\n                if(currentRow == startRowIndex){\n                    this.targetIndex = this.targetIndex == 0 ? activeSelectionsCount-1 : this.targetIndex-1;\n                    targetSelection = this.activeSelections[this.targetIndex]?.range;\n\n                    targetRow = targetSelection.endRow; \n                    targetColumn = targetSelection.endColumn;\n                }\n                else{\n                    targetRow = currentRow - 1;\n                }\n            }\n        }\n        return {row : targetRow, column : targetColumn};\n    }\n\n    getVerticalTraversePosition(moves : number) : CellSelection{\n        const {row, column} = this.activeCell;\n        let targetColumn = column;\n        let targetRow = row;\n        let targetSelection = this.activeSelections[this.targetIndex]?.range;\n        const activeSelectionsCount = this.activeSelections.length;\n\n        const startRowIndex = targetSelection.startRow;\n        const endRowIndex = targetSelection.endRow;\n        const currentRow = row;\n    \n        if(0 < moves){\n            if(currentRow + moves <= endRowIndex){\n                targetRow = currentRow + moves;\n            }\n            else{\n                const endColumnIndex = targetSelection.endColumn;\n                const currentColumn = column;\n\n                const diff = (currentRow + moves) - endRowIndex;\n                const targetIndex = startRowIndex + (diff - 1);\n                targetRow = targetIndex;\n\n                //findNextColumn\n                if(currentColumn == endColumnIndex){\n                    this.targetIndex = (this.targetIndex+1)%activeSelectionsCount;\n                    targetSelection = this.activeSelections[this.targetIndex]?.range;\n\n\n                    targetRow = targetSelection.startRow;\n                    targetColumn = targetSelection.startColumn;\n                }\n                else{\n                    targetColumn = currentColumn + 1;\n                }\n            }\n        }\n        else {\n            moves = Math.abs(moves);\n            if(startRowIndex <= currentRow - moves){\n                targetRow = currentRow - moves;\n            }\n            else{\n                const startColumnIndex = targetSelection.startColumn;\n                const currentColumn = column;\n\n                const diff = startRowIndex - (currentRow - moves);\n                const targetIndex = endRowIndex - (diff - 1);\n                targetRow = targetIndex;\n                \n                //findPreviousColumn\n                if(currentColumn == startColumnIndex){\n                    this.targetIndex = this.targetIndex == 0 ? activeSelectionsCount-1 : this.targetIndex-1;\n                    targetSelection = this.activeSelections[this.targetIndex]?.range;\n\n                    targetRow = targetSelection.endRow; \n                    targetColumn = targetSelection.endColumn;\n                }\n                else{\n                    targetColumn = currentColumn - 1;\n                }\n            }\n        }\n        return {row : targetRow, column : targetColumn};\n    }\n\n    getAllSelection(): ISelectionRange[] {\n\t\treturn this.rowSelections.concat(this.columnSelections, this.rangeSelections);\n\t}\n\n    isAnyCellInRange(row, column) : boolean {\n        return this.isRowSelected(row) ||  this.isColumnSelected(column) || this.isRangeSelected(row, column, row, column); \n    }\n\n    clearAllSelections(): void {\n        this.rowSelections = [];\n        this.columnSelections = [];\n        this.rangeSelections = [];\n        this.activeSelections = [];\n        this.targetIndex = null;\n    }\n\n    isRowFocused(rowIndex : number) : boolean {\n        return this.activeCell && (this.activeCell.row === rowIndex);\n    }\n}\n  \n\n\nexport {\n    SelectionInfoHandler\n}\n\nfunction insertRange(arr, input) {\n\n    const index = arr.findIndex(subArr => subArr[0] === input[0] && subArr[1] === input[1]);\n    if(index != -1) {\n        return arr;\n    }\n    let newArr = [];\n    let isInArr = false;\n    for(let i = 0; i < arr.length; i++) {\n        \n        let start = input[0];\n        let end = input[1];\n        let isModified = false;\n        \n        // start element inside case\n        if(arr[i][0] <= start && arr[i][1] >= start) {\n            isModified = true;\n            isInArr = true;\n            (start-1) >= arr[i][0] && (newArr.push([arr[i][0], start-1]));\n            // (start!=end) && newArr.push([input[0],input[1]]); //need to add boolean to insert or not the new range\n            end+1 <= arr[i][1] && newArr.push([end+1, arr[i][1]]);\n        } \n    \n        // end element inside case\n        if(arr[i][0] <= end && end <= arr[i][1] && start!=end  && (end > arr[i][1])/*from same interval case [1,3]*/) {\n            isModified = true;\n            isInArr = true;\n            !(start < arr[i][0]) && arr[i][0] <= end-1 && newArr.push([arr[i][0], end - 1]);\n            end+1 <= arr[i][1] && newArr.push([end+1, arr[i][1]]);\n        }\n        \n        if(!isModified && !(start < arr[i][0] && arr[i][1] < end)) {\n            newArr.push(arr[i]);\n        }\n    }\n    if(!isInArr) {\n        newArr.push(input);\n    }\n    newArr.sort((a, b) => a[0] - b[0]);\n    return newArr;\n}\n\n\nexport{\n    ISelectionRange\n}","// import { CellSelection, ColumnSelection, RangeSelection, RowSelection, SELECTION_TYPE } from \"../../GridComponent/Interface/ISelectionInterface\";\n// import { FieldHandler } from \"../Columns/FieldHandler\";\n// import { BEAN_NAME } from \"../Constants/BeanName\";\n// import { RecordHandler } from \"../Rows/RecordHandler\";\n\nimport { SelectionInfoHandler } from \"./SelectionInfoHandler\";\n\n\n\n// class SelectionInfoWithDeselect {\n//     static wirePropertiesStack = [BEAN_NAME.RECORD_HANDLER, BEAN_NAME.FIELD_HANDLER];\n\n//     private fieldHandler : FieldHandler;\n//     private recordHandler : RecordHandler;\n\n//     private activeCell : CellSelection;\n\n//     private rangeSelectionArray: Array<RangeSelection>;\n//     private rowSelectionArray  : Array<RowSelection>;\n//     private columnSelectionArray : Array<ColumnSelection>;\n\n//     private activeSelection : RangeSelection;\n\n//     private selectionStack : Array<RangeSelection>;\n//     private activeSelectionType : SELECTION_TYPE;\n\n//     constructor() {\n//         this.rowSelectionArray = [];\n//         this.columnSelectionArray = [];\n//         this.rangeSelectionArray = [];\n//         this.selectionStack = [];\n//         this.activeSelectionType = null; \n//     }\n\n//     getActiveType() : SELECTION_TYPE{\n//         return this.activeSelectionType;\n//     }\n\n//     getRowIDByIndex(index : number) :string {\n//         return this.recordHandler.getAbsoluteID(index);\n//     }\n\n//     getColumnIDByIndex(index : number) :string {\n//         return this.fieldHandler.getAbsoluteID(index);\n//     }\n\n//     getRowIndexByID(id : string) :number {\n//         return this.recordHandler.getRelativeIndexByID(id);\n//     }\n\n//     getColumnIndexByID(id : string) :number {\n//         return this.fieldHandler.getIndexById(id);\n//     }\n\n//     wireProperties(lookupBeanInstance: (bean: string, restrictBeanNames: string[], optional?: boolean | undefined) => any): void {\n//         this.recordHandler = lookupBeanInstance(BEAN_NAME.RECORD_HANDLER, SelectionInfoWithDeselect.wirePropertiesStack);\n//         this.fieldHandler = lookupBeanInstance(BEAN_NAME.FIELD_HANDLER, SelectionInfoWithDeselect.wirePropertiesStack);\n//     }\n\n//     placeCellSelection(row : number, column : number) : void {\n//         this.activeCell = {row, column}; \n//     }\n\n//     getCellSelection() : CellSelection {\n//         return this.activeCell;\n//     }\n\n//     getCellSelectionInID() : {rowID : string, columnID : string} {\n//         return {\n//             rowID : this.getRowIDByIndex(this.activeCell?.row),\n//             columnID : this.getColumnIDByIndex(this.activeCell?.column)\n//         };\n//     }\n\n//     isCellSelected(row : number, column : number) : boolean {\n//         if(this.activeCell){\n//            return  this.activeCell.row == row && this.activeCell.column == column;\n//         }\n//         return false\n//     }\n\n//     isCellWithinRange(cellSelection : CellSelection , range : RangeSelection) : boolean{\n//         const cellRowIndex = cellSelection.row;\n//         const cellColumnIndex = cellSelection.column;\n\n//         if(!(range.startRow <= cellRowIndex) || !(cellRowIndex <= range.endRow)){\n//             return false;\n//         }\n//         if(!(range.startColumn <= cellColumnIndex) || !(cellColumnIndex <= range.endColumn)){\n//             return false;\n//         }\n//         return true;\n//     }\n\n//     removeCellSelection() : void {\n//         this.activeCell = null;\n//     }\n\n//     placeRowSelection(startRow : number, endRow = startRow) : void {\n//         const rowSelectionRange = {startRow : Math.min(startRow, endRow), endRow :  Math.max(startRow, endRow)};\n//         // this.rowSelectionArray.push(rowSelectionRange);\n\n//         // const isInSameRange = this.isStartEndRowInSameRange(startRow, endRow);\n\n//         // if(isInSameRange) {\n//         //     const index = this.findRowSelectionIndex(startRow);\n//         //     const range = this.rowSelectionArray[index];\n\n//         //     const R1startRow  = range.startRow;\n//         //     const R1endRow = this.recordHandler.getPreviousLoadedID(rowSelectionRange.startRow);\n\n//         //     const R2startRow = this.recordHandler.getNextLoadedID(rowSelectionRange.endRow);\n//         //     const R2endRow = range.endRow;\n//         //     const ranges : RowSelection[] = [];\n//         //     if(this.isValid(R1startRow, R1endRow)) {\n//         //         ranges.push({startRow : R1startRow, endRow : R1endRow});\n//         //     }\n//         //     if(this.isValid(R2startRow, R2endRow)) {\n//         //         ranges.push({startRow : R2startRow, endRow : R2endRow});\n//         //     }\n//         //     if(range[0] !== undefined && ranges[1]!== undefined) {\n//         //         this.rowSelectionArray.splice(index, 1, ranges[0], ranges[1]);\n//         //     } else if(ranges[0]!== undefined) {\n//         //         this.rowSelectionArray.splice(index, 1, ranges[0]);\n//         //     } else if(ranges[1] !== undefined) {\n//         //         this.rowSelectionArray.splice(index, 1, ranges[1]);\n//         //     }\n//         // }\n//         // else {\n//             this.rowSelectionArray.push(rowSelectionRange);\n//             this.activeSelection = this.getRowSelectionAsRange(rowSelectionRange.startRow, rowSelectionRange.endRow);\n//             this.activeSelectionType = SELECTION_TYPE.ROW ;\n//             this.selectionStack.push(this.activeSelection);\n//         // }\n//     }\n\n//     getRowSelectionAsRange(startRow : number, endRow : number) : RangeSelection {\n//         const columnID = this.fieldHandler.getAbsoluteID(0);\n//         const endColumn = this.fieldHandler.getTotalCount() - 1;\n//         const endColumnID = this.fieldHandler.getAbsoluteID(endColumn);\n\n//         const rowSelectionAsRange = {startRow , startColumn : 0, endRow, endColumn};\n//         return rowSelectionAsRange;\n//     }\n\n//     getColumnSelectionAsRange(startColumn : number, endColumn : number) : RangeSelection {\n//         const rowID = this.recordHandler.getAbsoluteID(0);\n//         const endRow = this.recordHandler.getTotalCount() - 1;\n//         const endRowID = this.recordHandler.getAbsoluteID(endRow);\n\n//         const columnSelectionAsRange = {startRow : 0, startColumn, endRow, endColumn};\n//         return columnSelectionAsRange;\n//     }\n//     private isValid(row1 : string, row2 : string) : boolean {\n//         const r1 = this.recordHandler.getRelativeIndexByID(row1);\n//         const r2 = this.recordHandler.getRelativeIndexByID(row2);\n\n//         return r1 <= r2;\n\n//     }\n\n//     placeColumnSelection(startColumn : number, endColumn = startColumn) : void {\n//         const columnSelectionRange = {startColumn : Math.min(startColumn, endColumn), endColumn : Math.max(startColumn, endColumn)};\n//         // this.rowSelectionArray.push(rowSelectionRange);\n\n//         // const startColumn = this.fieldHandler.getIndexById(startColumnID);\n//         // const endColumn = this.fieldHandler.getIndexById(endColumnID);\n\n//         const isInSameRange = this.isStartEndColumnInSameRange(startColumn, endColumn);\n\n//         // if(isInSameRange) {\n//         //     const index = this.findColumnSelectionIndex(startColumn);\n//             // if(this.rowSelectionArray[index].startRowID != startRowID || this.rowSelectionArray[index].endRowID != endRowID) {\n//             //     this.rowSelectionArray.splice(index, 1);\n//             //     splitAndAddRanges(startRow, endRow);\n//             // }\n//         // }\n//         // else {\n//             this.columnSelectionArray.push(columnSelectionRange);\n//             this.activeSelection = this.getColumnSelectionAsRange(columnSelectionRange.startColumn, columnSelectionRange.endColumn);\n//             this.activeSelectionType = SELECTION_TYPE.COLUMN;\n//             this.selectionStack.push(this.activeSelection);\n//         // }\n//     }\n\n//     removeRowSelectionByID(rowID : string) {\n//         const row = this.getRowIndexByID(rowID);\n//         const SR = this.findRowSelectionIndex(row);\n//         SR!= -1 && this.rowSelectionArray.splice(SR, 1);\n//         if(this.activeSelectionType == SELECTION_TYPE.ROW){\n//             this.activeSelection = null;\n//             this.activeSelectionType = null;\n//         }\n//     }\n\n//     removeRowRangeSelection(startRow : number, endRow : number) : void {\n//         const actualStartRow = Math.min(startRow, endRow);\n//         const actualEndRow = Math.max(startRow, endRow);\n//         const index = this.findExactRowRangeIndex(actualStartRow , actualEndRow);\n\n//         // const startRow = this.recordHandler.getRelativeIndexByID(startRowID);\n//         // const endRow = this.recordHandler.getRelativeIndexByID(endRowID);\n//         // (startRow > endRow) && ([startRow, endRow] = [endRow, startRow]);\n        \n//        index!==-1 && this.rowSelectionArray.splice(index, 1);\n\n//         if(this.activeSelectionType == SELECTION_TYPE.ROW){\n//             this.activeSelection = null;\n//             this.activeSelectionType = null;\n//         }\n//     }\n\n//     removeColumnRangeSelection(startColumn : number, endColumn : number) : void {\n//         const actualStartColumn = Math.min(startColumn, endColumn);\n//         const actualEndColumn = Math.max(startColumn, endColumn);\n//         const index = this.findExactColumnRangeIndex(actualStartColumn , actualEndColumn);\n\n//         // const startColumn = this.fieldHandler.getIndexById(startColumnID);\n//         // const endColumn = this.fieldHandler.getIndexById(endColumnID);\n//         // (startColumn > endColumn) && ([startColumn, endColumn] = [endColumn, startColumn]);\n        \n//        index!==-1 && this.columnSelectionArray.splice(index, 1);\n\n//         if(this.activeSelectionType == SELECTION_TYPE.COLUMN){\n//             this.activeSelection = null;\n//             this.activeSelectionType = null;\n//         }\n//     }\n\n//     removeCellRangeSelection(startRow : number, startColumn : number, endRow : number, endColumn : number) : void {\n//         // const startRow = this.recordHandler.getRelativeIndexByID(startRowID);\n//         // const endRow = this.recordHandler.getRelativeIndexByID(endRowID);\n//         (startRow > endRow) && ([startRow, endRow] = [endRow, startRow]);\n\n//         const index = this.findExactRangeIndex(startRow, startColumn, endRow, endColumn);\n//         index !== -1 && this.rangeSelectionArray.splice(index, 1);\n\n//         if(this.activeSelectionType == SELECTION_TYPE.RANGE){\n//             this.activeSelection = null;\n//             this.activeSelectionType = null;\n//         }\n//     }\n\n//     private findExactRangeIndex(startRow : number, startColumn : number, endRow : number, endColumn : number) : number { \n//         const n = this.rangeSelectionArray.length;\n//         for(let i = 0; i < n; i++) {\n//             const range = this.rangeSelectionArray[i];\n//             if(range.startRow == startRow && range.startColumn == startColumn && range.endRow == endRow && range.endColumn == endColumn) {\n//                 return i;\n//             }\n//         }\n//         return -1;\n//     }\n\n//     private findExactRowRangeIndex(startRow : number, endRow : number) : number {\n//         const n = this.rowSelectionArray.length;\n//         for(let i = 0; i < n; i++) {\n//             const range = this.rowSelectionArray[i];\n//             if(range.startRow == startRow && range.endRow == endRow) {\n//                 return i;\n//             }\n//         }\n//         return -1;\n//     }\n\n//     private findExactColumnRangeIndex(startColumn : number, endColumn : number) : number {\n//         const n = this.columnSelectionArray.length;\n//         for(let i = 0; i < n; i++) {\n//             const range = this.columnSelectionArray[i];\n//             if(range.startColumn == startColumn && range.endColumn == endColumn) {\n//                 return i;\n//             }\n//         }\n//         return -1;\n//     }\n\n//     isRowSelected(row : number) : boolean {\n//         return this.findRowSelectionIndex(row) != -1;\n//     }\n//     isColumnSelected(column : number) : boolean {\n//         return this.findColumnSelectionIndex(column) != - 1;\n//     }\n\n//     // private findRowSelectionIndex(rowID : string) : number {\n//     //     const rowIDIndex = this.recordHandler.getRelativeIndexByID(rowID);\n//     //     const n = this.rowSelectionArray.length;\n//     //     for(let i = 0; i < n; i++) {\n//     //         const range = this.rowSelectionArray[i];\n//     //         const startRow = this.recordHandler.getRelativeIndexByID(range.startRowID);\n//     //         const endRow = this.recordHandler.getRelativeIndexByID(range.endRowID);\n\n//     //         if(startRow <= rowIDIndex && rowIDIndex <= endRow) {\n//     //             return i;\n//     //         }\n//     //     }\n//     //     return -1;\n//     // }\n\n//     // private findColumnSelectionIndex(columnID : string) : number {\n//     //     const columnIDIndex = this.recordHandler.getRelativeIndexByID(columnID);\n//     //     const n = this.columnSelectionArray.length;\n//     //     for(let i = 0; i < n; i++) {\n//     //         const range = this.columnSelectionArray[i];\n//     //         const startColumn = this.recordHandler.getRelativeIndexByID(range.startColumnID);\n//     //         const endColumn = this.recordHandler.getRelativeIndexByID(range.endColumnID);\n\n//     //         if(startColumn <= columnIDIndex && columnIDIndex <= endColumn) {\n//     //             return i;\n//     //         }\n//     //     }\n//     //     return -1;\n//     // }\n\n//     private findRowSelectionIndex(row : number) : number {\n//         const n = this.rowSelectionArray.length;\n//         for(let i = 0; i < n; i++) {\n//             const range = this.rowSelectionArray[i];\n//             const startRow = range.startRow;\n//             const endRow = range.endRow;\n\n//             if(startRow <= row && row <= endRow) {\n//                 return i;\n//             }\n//         }\n//         return -1;\n//     }\n\n//     private findColumnSelectionIndex(column : number) : number {\n//         const n = this.columnSelectionArray.length;\n//         for(let i = 0; i < n; i++) {\n//             const range = this.columnSelectionArray[i];\n//             const startColumn = range.startColumn;\n//             const endColumn = range.endColumn;\n\n//             if(startColumn <= column && column <= endColumn) {\n//                 return i;\n//             }\n//         }\n//         return -1;\n//     }\n\n//     private findRangeSelectionIndex(rowID : string, columnID : string) : number{\n//         const n = this.rangeSelectionArray.length;\n//         const row = this.recordHandler.getRelativeIndexByID(rowID);\n//         const column = this.fieldHandler.getIndexById(columnID);\n\n//         for(let i = 0; i < n; i++) {\n//             const range = this.rangeSelectionArray[i];\n//             // const startRow = this.recordHandler.getRelativeIndexByID(this.rangeSelectionArray[i].startRowID);\n//             // const startColumn = this.fieldHandler.getIndexById(this.rangeSelectionArray[i].startColumnID);\n//             // const endRow = this.recordHandler.getRelativeIndexByID(this.rangeSelectionArray[i].endRowID);\n//             // const endColumn = this.fieldHandler.getIndexById(this.rangeSelectionArray[i].endColumnID);\n\n//             if(range.startRow <= row && row <= range.endRow && range.startColumn <= column && column <= range.endColumn) {\n//                 return i;\n//             }\n//         }\n//         return -1;\n//     }\n\n//     private isStartEndRowInSameRange(startRowID, endRowID) : boolean {\n//         const startRow = this.recordHandler.getRelativeIndexByID(startRowID);\n//         const endRow = this.recordHandler.getRelativeIndexByID(endRowID);\n//         (startRow > endRow) && ([startRowID, endRowID] = [endRowID, startRowID]);\n//         const SR = this.findRowSelectionIndex(startRowID);\n//         const ER = this.findRowSelectionIndex(endRowID);\n\n//         return (SR === ER && SR != -1);\n//     }\n\n//     private isStartEndColumnInSameRange(startColumnID, endColumnID) : boolean {\n//         const startColumn = this.recordHandler.getRelativeIndexByID(startColumnID);\n//         const endColumn = this.recordHandler.getRelativeIndexByID(endColumnID);\n//         (startColumn > endColumn) && ([startColumnID, endColumnID] = [endColumnID, startColumnID]);\n//         const SC = this.findColumnSelectionIndex(startColumnID);\n//         const EC = this.findColumnSelectionIndex(endColumnID);\n\n//         return (SC === EC && SC != -1);\n//     }\n\n//     removeRowSelection() : void {\n//         this.rowSelectionArray = [];\n//         if(this.activeSelectionType == SELECTION_TYPE.ROW){\n//             this.activeSelection = null;\n//             this.activeSelectionType = null;\n//         }\n//     }\n//     removeRangeSelection() : void {\n//         this.rangeSelectionArray = [];\n//         if(this.activeSelectionType == SELECTION_TYPE.RANGE){\n//             this.activeSelection = null;\n//             this.activeSelectionType = null;\n//         }\n//     }\n//     removeColumnSelection() : void {\n//         this.columnSelectionArray = [];\n//         if(this.activeSelectionType == SELECTION_TYPE.COLUMN){\n//             this.activeSelection = null;\n//             this.activeSelectionType = null;\n//         }\n//     }\n\n//     placeRangeSelection(startRow: number, startColumn : number, endRow = startRow, endColumn = startColumn) : void {\n\n//         // const startRow = this.recordHandler.getRelativeIndexByID(startRowID);\n//         // const endRow = this.recordHandler.getRelativeIndexByID(endRowID);\n//         // (startRow > endRow) && ([startRowID, endRowID] = [endRowID, startRowID]);\n//         // const startColumn = this.fieldHandler.getIndexById(startColumnID);\n//         // const endColumn = this.fieldHandler.getIndexById(endColumnID);\n//         // (startColumn > endColumn) && ([startColumnID, endColumnID] = [endColumnID, startColumnID]);\n\n//         // const selection = {\n//         //     startRowID : startRowID, \n//         //     endRowID : endRowID,\n//         //     startColumnID : startColumnID,\n//         //     endColumnID : endColumnID\n//         // }\n\n\n//         this.activeSelection = {\n//             startRow : Math.min(startRow, endRow),\n//             startColumn : Math.min(startColumn, endColumn),\n//             endRow : Math.max(startRow, endRow),\n//             endColumn : Math.max(startColumn, endColumn)\n//         }\n//         this.activeSelectionType = SELECTION_TYPE.RANGE;\n//         this.rangeSelectionArray.push(this.activeSelection);\n//         this.selectionStack.push(this.activeSelection);\n//     }\n\n//     isCellWithinCellRanges(row : number, column : number) : boolean {\n//         const n = this.rangeSelectionArray.length;\n\n//         for(let i = 0; i < n; i++) {\n//             const range = this.rangeSelectionArray[i];\n\n//             // const startRow = this.recordHandler.getRelativeIndexByID(this.rangeSelectionArray[i].startRowID);\n//             // const startColumn = this.fieldHandler.getIndexById(this.rangeSelectionArray[i].startColumnID);\n//             // const endRow = this.recordHandler.getRelativeIndexByID(this.rangeSelectionArray[i].endRowID);\n//             // const endColumn = this.fieldHandler.getIndexById(this.rangeSelectionArray[i].endColumnID);\n\n//             if(range.startRow <= row && row <= range.endRow && range.startColumn <= column && column <= range.endColumn) {\n//                 return true;\n//             }\n//         }\n//         return false;\n//     }\n\n//     getSelectionByActiveCell() : RangeSelection{\n//         // const rowID = this.activeCell.row;\n//         // const columnID = this.activeCell.column;\n//         const row = this.activeCell.row;\n//         const column = this.activeCell.column;\n//         const selection = this.getAllSelection();\n//         let selectionRange = null;\n//         selection.forEach(range => {\n//             // const startRow = this.recordHandler.getRelativeIndexByID(range.startRowID);\n//             // const startColumn = this.fieldHandler.getIndexById(range.startColumnID);\n//             // const endRow = this.recordHandler.getRelativeIndexByID(range.endRowID);\n//             // const endColumn = this.fieldHandler.getIndexById(range.endColumnID);\n\n//             if(range.startRow <= row && row <= range.endRow && range.startColumn <= column && column <= range.endColumn) {\n//                 selectionRange = range;\n//             }\n//         });\n//         return selectionRange as RangeSelection;\n\n//     }\n\n//     getSelectionStack() : RangeSelection[] {\n//         return this.selectionStack;\n//     }\n\n//     getLastSelection() : RangeSelection {\n//         const n = this.selectionStack.length;\n//         if(n > 0) {\n//             return this.selectionStack[n - 1];\n//         }\n//         return null;\n//     }\n    \n//     getAllRowSelectionArray() : RowSelection[] {\n//         return this.rowSelectionArray;\n//     }\n\n//     getAllRangeSelectionArray() : RangeSelection[] {\n//         return this.rangeSelectionArray;\n//     }\n\n//     getAllColumnSelectionArray() : ColumnSelection[] {\n//         return this.columnSelectionArray;\n//     }\n\n//     getAllSelection() : RangeSelection[] {\n//         const allSelection = [];\n\n//         //Row Selection\n//         const columnID = this.fieldHandler.getAbsoluteID(0);\n//         const columnCount = this.fieldHandler.getTotalCount() - 1;\n//         const endColumnID = this.fieldHandler.getAbsoluteID(columnCount)\n\n//         this.rowSelectionArray.forEach(rowSelection => {\n//             const rowSelectionAsRange = this.getRowSelectionAsRange(rowSelection.startRow, rowSelection.endRow);\n//             allSelection.push(rowSelectionAsRange);\n//         });\n\n//         this.rangeSelectionArray.forEach( rangeSelection => {\n//             allSelection.push(rangeSelection);\n//         })\n\n//         const rowID = this.recordHandler.getAbsoluteID(0);\n//         const maxRow = this.recordHandler.getTotalRows();\n//         const endRowID = this.recordHandler.getAbsoluteID(maxRow);\n\n//         this.columnSelectionArray.forEach( columnSelection => {\n//             const columnSelectionAsRange = this.getColumnSelectionAsRange(columnSelection.startColumn, columnSelection.endColumn);\n//             allSelection.push(columnSelectionAsRange);\n//         })\n\n//         return allSelection;\n//     }\n\n\n//     removeAllSelection() : void {\n//         this.removeRowSelection();\n//         this.removeRangeSelection();\n//         this.removeColumnSelection();\n\n//         this.activeSelection = null;\n//         this.activeSelectionType = null;\n//         this.selectionStack = [];\n//     }\n\n//     setActiveSelection(startRow : number, startColumn : number, endRow : number, endColumn : number) : void {\n//         // const startRow = this.recordHandler.getRelativeIndexByID(startRowID);\n//         // const endRow = this.recordHandler.getRelativeIndexByID(endRowID);\n\n//         // (startRow > endRow) && ([startRowID, endRowID] = [endRowID, startRowID]);\n  \n//         // const startColumn = this.fieldHandler.getIndexById(startColumnID);\n//         // const endColumn = this.fieldHandler.getIndexById(endColumnID);\n\n//         // (startColumn > endColumn) && ([startColumnID, endColumnID] = [endColumnID, startColumnID]);\n\n//         // this.activeSelection = {\n//         //     startRowID : startRowID,\n//         //     startColumnID :startColumnID,\n//         //     endRowID : endRowID,\n//         //     endColumnID : endColumnID\n//         // };\n\n\n//         this.activeSelection = {\n//             startRow : Math.min(startRow, endRow),\n//             startColumn : Math.min(startColumn, endColumn),\n//             endRow : Math.max(startRow, endRow),\n//             endColumn : Math.max(startColumn, endColumn)\n//         }\n//     }\n\n//     setActiveRowSelection(startRow : number, endRow : number) : void {\n//         const startColumnID = this.fieldHandler.getAbsoluteID(0);\n//         const endColumn = this.fieldHandler.getTotalCount() - 1;\n//         // const endColumnID = this.fieldHandler.getAbsoluteID(endColumn);\n\n//         // const startRow = this.recordHandler.getRelativeIndexByID(startRowID);\n//         const startColumn = this.getColumnIndexByID(startColumnID);\n//         // const endRow = this.recordHandler.getRelativeIndexByID(endRowID);\n//         (startRow > endRow) && ([startRow, endRow] = [endRow, startRow]);\n\n//         this.setActiveSelection(startRow, startColumn, endRow, endColumn);\n//     }\n\n//     setActiveColumnSelection(startColumn : number, endColumn : number) : void {\n//         const startRowID = this.recordHandler.getAbsoluteID(0);\n//         const endRow = this.recordHandler.getTotalCount() - 1;\n//         // const endRowID = this.recordHandler.getAbsoluteID(endRow);\n\n//         const startRow = this.recordHandler.getRelativeIndexByID(startRowID);\n//         // const startColumn = this.fieldHandler.getIndexById(startColumnID);\n//         // const endColumn = this.fieldHandler.getIndexById(endColumnID);\n//         (startColumn > endColumn) && ([startColumn, endColumn] = [endColumn, startColumn]);\n\n//         this.setActiveSelection(startRow, startColumn, endRow, endColumn);\n//     }\n\n//     getActiveSelection() : RangeSelection {\n//         return this.activeSelection;\n//     }\n\n//     removeActiveSelection() : void {\n//         this.activeSelection = null;\n//     }\n\n//     getHorizontalTraversePosition(moves : number) : CellSelection{\n//         const {row, column} = this.activeCell;\n//         let targetColumn = column;\n//         let targetRow = row;\n//         const activeSelection = this.activeSelection;\n\n//         const startColumnIndex = activeSelection.startColumn;\n//         const endColumnIndex = activeSelection.endColumn;\n//         const currentColumn =  column;\n\n//         if(0 < moves){\n//             if(currentColumn + moves <= endColumnIndex){\n//                 targetColumn =  currentColumn + moves;\n//             }\n//             else{\n//                 const startRowIndex = activeSelection.startRow;\n//                 const endRowIndex = activeSelection.endRow;\n//                 const currentRow = row;\n\n//                 const diff = (currentColumn + moves) - endColumnIndex;\n//                 const targetIndex = startColumnIndex + (diff - 1);\n//                 targetColumn =  targetIndex;\n\n//                 //findNextRow\n//                 if(currentRow == endRowIndex){\n//                     targetRow = startRowIndex;\n//                 }\n//                 else{\n//                     targetRow = currentRow + 1;\n//                 }\n//             }\n//         }\n//         else {\n//             moves = Math.abs(moves);\n//             if(startColumnIndex <= currentColumn - moves){\n//                 targetColumn = currentColumn - moves;\n//             }\n//             else{\n//                 const startRowIndex = activeSelection.startRow;\n//                 const endRowIndex = activeSelection.endRow;\n//                 const currentRow = row;\n\n//                 const diff = startColumnIndex - (currentColumn - moves);\n//                 const targetIndex = endColumnIndex - (diff - 1);\n//                 targetColumn = targetIndex;\n                \n//                 //findPreviousRow\n//                 if(currentRow == startRowIndex){\n//                     targetRow = endRowIndex;\n//                 }\n//                 else{\n//                     targetRow = currentRow - 1;\n//                 }\n//             }\n//         }\n//         return {row : targetRow, column : targetColumn};\n//     }\n\n//     getVerticalTraversePosition(moves : number) : CellSelection{\n//         const {row, column} = this.activeCell;\n//         let targetColumn = column;\n//         let targetRow = row;\n//         const activeSelection = this.activeSelection;\n\n//         const startRowIndex = activeSelection.startRow;\n//         const endRowIndex = activeSelection.endRow;\n//         const currentRow = row;\n    \n//         if(0 < moves){\n//             if(currentRow + moves <= endRowIndex){\n//                 targetRow = currentRow + moves;\n//             }\n//             else{\n//                 const startColumnIndex = activeSelection.startColumn;\n//                 const endColumnIndex = activeSelection.endColumn;\n//                 const currentColumn = column;\n\n//                 const diff = (currentRow + moves) - endRowIndex;\n//                 const targetIndex = startRowIndex + (diff - 1);\n//                 targetRow = targetIndex;\n\n//                 //findNextColumn\n//                 if(currentColumn == endColumnIndex){\n//                     targetColumn = startColumnIndex;\n//                 }\n//                 else{\n//                     targetColumn = currentColumn + 1;\n//                 }\n//             }\n//         }\n//         else {\n//             moves = Math.abs(moves);\n//             if(startRowIndex <= currentRow - moves){\n//                 targetRow = currentRow - moves;\n//             }\n//             else{\n//                 const startColumnIndex = activeSelection.startColumn;\n//                 const endColumnIndex = activeSelection.endColumn;\n//                 const currentColumn = column;\n\n//                 const diff = startRowIndex - (currentRow - moves);\n//                 const targetIndex = endRowIndex - (diff - 1);\n//                 targetRow = targetIndex;\n                \n//                 //findPreviousColumn\n//                 if(currentColumn == startColumnIndex){\n//                     targetColumn = endColumnIndex;\n//                 }\n//                 else{\n//                     targetColumn = currentColumn - 1;\n//                 }\n//             }\n//         }\n//         return {row : targetRow, column : targetColumn};\n//     }\n\n// }\n \n// export {\n//     SelectionInfoWithDeselect,\n// }\n\nexport {\n    SelectionInfoHandler as SelectionInfoWithDeselect\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { Events } from \"../Constants/Events\";\nimport { CellFocusParams, focusedCellPosition, FocusedHeaderCellPosition, IFocusHandler } from \"./focus-handler.types\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { RowRenderController } from \"../Rows/RowRenderController\";\nimport { CellPositionType, RowPositionType } from \"./cell-position.types\";\nimport { HookEventsName } from \"../Hooks/Constants/HookEventsName\";\nimport { ICellNavigationHooksWrapper } from \"./navigation-handler.types\";\nimport { IHookManager } from \"../Hooks/Interface/IHookManager\";\nimport { areArraysEqual } from \"../utils/Object\";\nimport { ICellInnerNavigationController } from \"../../GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellInnerNavigationController\";\nimport { IRecordHandler } from \"../Rows/RecordHandler.types\";\nimport { IGridCellEditorHandler } from \"Grid/GridComponent/Editor/GridCellEditorHandler\";\n\n@Bean('focusHandler')\nexport class FocusHandler extends EventEmitter  implements IFocusHandler{\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRenderController: RowRenderController;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) hookManager : IHookManager;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    \n    private focusedCellPosition: focusedCellPosition | null = null;\n    private focusedHeaderPosition : FocusedHeaderCellPosition | null = null;\n    private previousFocusedCellPosition: focusedCellPosition | null = null;\n\n    private gridFocus : boolean = false;\n\n\n    private cellNavigationHooksWrapper : ICellNavigationHooksWrapper;\n    private cellInnerNavigationController :ICellInnerNavigationController;            \n    @PostConstruct()\n    init() {\n        this.cellNavigationHooksWrapper = new FocusHandler.CellNavigationHooksWrapper(this.hookManager, this);\n        this.addDestroyFunc(() => {\n            this.cellNavigationHooksWrapper = null;\n        })\n        this.cellInnerNavigationController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CELL_INNER_NAVIGATION_CONTROLLER) as ICellInnerNavigationController;\n    }\n\n    isFocusedCellEditing() : boolean {\n        const editorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as IGridCellEditorHandler;\n        if(editorHandler) {\n            const cellPosition = editorHandler.getCellPosition();\n            if(cellPosition) {\n                return this.isCellFocused(cellPosition);\n            }\n        }\n        return false;\n    }\n\n    public setGridFocus(focus : boolean) : void {\n        this.gridFocus = focus;\n    }\n\n    public isGridFocus() : boolean {\n        return this.gridFocus;\n    }\n    \n    public clearFocusedCell(): void {\n        if (!this.focusedCellPosition) { return; }\n        this.focusedCellPosition = null;\n    }\n\n    public setFocusedCell(params: CellFocusParams, scrollOnFocus : boolean = true, focus : boolean = true): boolean {\n\n        const suppressCellFocusOnSelection = this.optionsHandler.suppressCellFocusOnSelection();\n        const suppressGroupHeaderCellFocus = this.optionsHandler.suppressGroupHeaderCellFocus();\n\n        if(suppressCellFocusOnSelection) {\n            return false;\n        }\n\n        const rowNode = this.recordHandler.getRowNodeByMeta(params);\n\n        if(suppressGroupHeaderCellFocus && rowNode &&rowNode.isGroupRow()) {\n            return false;\n        }\n        \n        const callBack = (cellPosition : CellPositionType) => {\n            const restoreFocusedCellPosition = this.focusedCellPosition;\n            \n            this.previousFocusedCellPosition = this.focusedCellPosition;\n            this.cellInnerNavigationController.onBeforeCellSelection(params);\n\n            this.clearFocusedCell();\n    \n            const { columnID, rowIndex, pinPosition, parentKeys } = cellPosition;\n    \n            if (rowIndex !== null) {\n                focus && this.setGridFocus(true);\n                this.focusedCellPosition = { rowIndex, columnID, pinPosition, parentKeys };\n            } else {\n                this.focusedCellPosition = null;\n            }\n    \n            this.dispatchEvent({\n                type: Events.EVENT_CELL_FOCUSED,\n                restoreFocusedCellPosition,\n                focusedCellPosition: this.getFocusEventParams(),\n                scrollOnFocus,\n                focus\n            });\n        }\n\n        return this.cellNavigationHooksWrapper.onCellSelectionChanged(params, callBack, params);\n    }\n\n    private getFocusEventParams(restoreFocusedCellPosition ?: focusedCellPosition): CellFocusParams {\n        const { rowIndex, pinPosition, columnID, parentKeys } = restoreFocusedCellPosition ?? this.focusedCellPosition ?? {};\n\n        const rowCtrl = rowIndex !== undefined && pinPosition !== undefined && parentKeys !== undefined ? this.rowRenderController.getRowByPosition({ rowIndex, pinPosition, parentKeys }) : null;\n\n        return {\n            rowIndex   : rowIndex,\n            pinPosition: pinPosition,\n            columnID   : columnID,\n            parentKeys : parentKeys,\n            isFullWidth: rowCtrl?.isFullWidth() ?? false\n        };\n    }\n\n    public isCellFocused(cellPosition : CellPositionType) : boolean {\n        if(this.focusedCellPosition === null) return false;\n\n        const colsMatch        = cellPosition.columnID    === this.focusedCellPosition.columnID;\n        const floatingMatch    = cellPosition.pinPosition === this.focusedCellPosition.pinPosition;\n        const indexMatch       = cellPosition.rowIndex    === this.focusedCellPosition.rowIndex;\n        const isParentKeyMatch = areArraysEqual(cellPosition.parentKeys, this.focusedCellPosition.parentKeys)\n        return colsMatch && floatingMatch && indexMatch && isParentKeyMatch;\n    }\n\n    public isRowFocused(rowPosition : RowPositionType) : boolean {\n        if(this.focusedCellPosition === null) return false;\n\n        const floatingMatch = rowPosition.pinPosition === this.focusedCellPosition.pinPosition;\n        const indexMatch    = rowPosition.rowIndex  === this.focusedCellPosition.rowIndex;\n        const isParentKeyMatch = areArraysEqual(rowPosition.parentKeys, this.focusedCellPosition.parentKeys)\n        return floatingMatch && indexMatch && isParentKeyMatch;\n    }\n\n    public getFocusedCellPosition() : focusedCellPosition | null {\n        return this.focusedCellPosition ?? null;\n    }\n\n    public getPreviousFocusedCellPosition() : focusedCellPosition | null {\n        return this.previousFocusedCellPosition ?? null;\n    }\n\n    public getFocusedHeaderCellPosition(): FocusedHeaderCellPosition | null {\n        return this.focusedHeaderPosition;\n    }\n\n    public hasAnyCellFocused(): boolean {\n        return !!this.focusedCellPosition;\n    }\n\n    public isGroupHeaderFocused(cellPosition: CellPositionType): boolean {\n        if(this.focusedCellPosition === null) return false;\n\n        const rowNode = this.recordHandler.getRowNodeByMeta(cellPosition);\n        if(!rowNode) return false;\n\n        const groupKeys = rowNode.getGroupValues();\n\n        if(areArraysEqual(groupKeys, this.focusedCellPosition.parentKeys)) {\n            return true;\n        }\n        return false;\n    }\n\n    /** @internal */\n    static CellNavigationHooksWrapper = class implements ICellNavigationHooksWrapper {\n        constructor(private hookManager: IHookManager, private focusHandler: IFocusHandler) {}\n        onCellSelectionChanged(cellPosition: CellPositionType, callBack: (cellPosition: CellPositionType) => void, params : any): boolean {\n            const hookParams = this.createCellSelectionParams(cellPosition, params);\n            const api = (params : any) => {\n                callBack(params.current);\n            }\n\n            return this.hookManager.executeHook(HookEventsName.onBeforeCellSelectionChange, HookEventsName.onAfterCellSelectionChange, api, hookParams);\n        }\n\n        private createCellSelectionParams(cellPosition : CellPositionType, params : any) : any {\n            const previousCell = this.focusHandler.getFocusedCellPosition();\n            return {\n                previous : previousCell,\n                current  : cellPosition,\n                eventOrigin: params.eventOrigin,\n                event    : params.event\n            }\n        }\n    }\n}\n","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GridController } from \"../GridComponent/GridController\";\nimport {  GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { IControllerHandler, IPaneControllerParam } from \"./Interface/IControllerHandler\";\nimport { IRect, getAbsoluteHeight, getAbsoluteWidth, getElementRectWithOffset } from \"./utils/Dom\";\nimport { setAriaLabel, setAriaRole } from \"./utils/aria\";\n\nexport interface IPosition {\n    x : number;\n    y : number;\n}\n\nenum DIRECTION {\n\tvertical,\n\thorizontal,\n}\n\n\nexport interface PopupPositionParams {\n\tpopUpElement        : HTMLElement;\n\tgapX             ?: number;\n\tgapY             ?: number;\n\tposition           ?: 'over' | 'under';\n\talignSide          ?: 'left' | 'right';\n\tkeepWithinBounds   ?: boolean;\n\tupdatePosition     ?: () => IPosition;\n}\n\n\nexport const enum  Position  {\n    under = \"under\",\n    above = \"above\",\n    over  = \"over\",\n    left  = \"left\",\n    right = \"right\"\n}\n\nexport interface AfterGuiAttachedParams {\n\thidePopup?: () => void;\n\tsuppressFocus?: boolean;\n}\n\nexport interface PopupComponentPositionParams extends PopupPositionParams {\n    sourceElement: HTMLElement;\n}\n\nexport interface Popup {\n\telement         : HTMLElement;\n\twrapper         : HTMLElement;\n\thideFunction    : () => void;\n\tinstanceId      : number;\n\talignedToElement: HTMLElement;\n}\n\nexport interface AddPopupParams {\n    modal           ?: boolean;\n    childElement     : HTMLElement;\n    closedCallback  ?: (e?: MouseEvent | TouchEvent | KeyboardEvent) => void;\n    afterGuiAttached?: (params: AfterGuiAttachedParams) => void;\n    positionCallback?: () => void;\n    ariaLabel        : string;\n    anchorToElement ?: HTMLElement;\n}\n\nexport interface AddPopupOutput {\n\thideFunction: () => void;\n}\n\n\nlet instanceId = 0;\n\n\n@Bean(GRID_BEAN_NAME.POPUP_HANDLER)\nexport class PopupHandler extends EventEmitter {\n\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\tprivate gridController: GridController;\n\n\tprivate popupList: Popup[] = [];\n\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tconst controller = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tcontroller.onAfterGridReady((param: IPaneControllerParam) => {\n\t\t\tthis.gridController = param.gridController;\n\t\t});\n\t}\n\n    positionPopupByComponent( params:PopupComponentPositionParams ) : void {\n\t\tconst { popUpElement, gapX, gapY, keepWithinBounds, sourceElement, alignSide = 'left', position = 'over'} = params;\n\n\t\tconst sourceRect = sourceElement.getBoundingClientRect();\n\t\tconst parentRect = this.getParentRect() as DOMRect;\n\n\t\tconst popupIndex = this.getPopupIndex(popUpElement);\n\n\t\tif (popupIndex !== -1) {\n\t\t\tconst popup = this.popupList[popupIndex];\n\t\t\tpopup.alignedToElement = sourceElement;\n\t\t}\n\n\t\tconst updatePosition = () => {\n\t\t\tlet x = sourceRect.left - parentRect.left;\n\t\t\tif (alignSide === 'right') {\n\t\t\t\tx -= popUpElement.offsetWidth - sourceRect.width;\n\t\t\t}\n\n\t\t\tlet y = 0;\n\n\t\t\tif (position === 'over') {\n\t\t\t\ty = sourceRect.top - parentRect.top;\n\t\t\t\tthis.setAlignedStyles(popUpElement, Position.over);\n\t\t\t} else {\n\t\t\t\tconst alignSide = this.calculatePopupPosition( popUpElement, sourceRect, parentRect, params.gapY || 0, );\n\t\t\t\tif (alignSide === Position.under) {\n\t\t\t\t\ty = sourceRect.top - parentRect.top + sourceRect.height;\n\t\t\t\t} else {\n\t\t\t\t\ty = sourceRect.top - popUpElement.offsetHeight - (gapY || 0) * 2 - parentRect.top;\n\t\t\t\t}\n\t\t\t\tthis.setAlignedStyles(popUpElement, Position.under);\n\t\t\t}\n\n\t\t\treturn { x, y };\n\t\t};\n\n\t\tthis.positionPopup({\n\t\t\tpopUpElement,\n\t\t\tgapX,\n\t\t\tgapY,\n\t\t\tkeepWithinBounds,\n\t\t\tupdatePosition,\n\t\t});\n\t}\n\n    positionPopup(params: PopupPositionParams): void {\n\t\tconst { popUpElement, keepWithinBounds, gapX, gapY, updatePosition, } = params;\n\t\tconst lastSize = { width: 0, height: 0 };\n\n\t\tconst updatePopupPosition = () => {\n\t\t\tlet { x, y } = updatePosition!();\n\n\t\t\tif ( popUpElement.clientWidth === lastSize.width && popUpElement.clientHeight === lastSize.height ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlastSize.width = popUpElement.clientWidth;\n\t\t\tlastSize.height = popUpElement.clientHeight;\n\n\t\t\tif (gapX) {\n\t\t\t\tx += gapX;\n\t\t\t}\n\t\t\tif (gapY) {\n\t\t\t\ty += gapY;\n\t\t\t}\n\n\t\t\tif (keepWithinBounds) {\n\t\t\t\tx = this.ensureXYBoundaries( popUpElement, x, DIRECTION.horizontal);\n\t\t\t\ty = this.ensureXYBoundaries( popUpElement, y, DIRECTION.vertical);\n\t\t\t}\n\n\t\t\tpopUpElement.style.left = `${x}px`;\n\t\t\tpopUpElement.style.top = `${y}px`;\n\t\t};\n\n\t\tupdatePopupPosition();\n\t}\n\n    addPopup(params: AddPopupParams): AddPopupOutput { \n        const documentElement = this.optionsHandler.getDocument();\n        const { childElement, ariaLabel , positionCallback, anchorToElement, afterGuiAttached } = params;\n\n        const popupParentElement = this.getPopupParent();\n\n        if (!documentElement) {\n            return { hideFunction: () => { } };\n        }\n\n        const popupIndex = this.getPopupIndex(childElement);\n\n        if (popupIndex !== -1) {\n            const popup = this.popupList[popupIndex];\n            return { hideFunction: popup.hideFunction };\n        }\n\n        this.initialisePopupPosition(childElement);\n\n        const wrapperElement = this.createPopupWrapper(childElement, ariaLabel);\n        const removePopup    = () => {\n\t\t\tconst popupIndex = this.getPopupIndex(childElement);\n\t\t\tif(popupIndex !== -1) {\n\t\t\t\tif(popupParentElement) {\n\t\t\t\t\tpopupParentElement.removeChild(wrapperElement);\n\t\t\t\t\tthis.removePopupFromPopupList(childElement);\n\t\t\t\t}\n\t\t\t}\n            \n        }\n\n        if(afterGuiAttached) {\n            afterGuiAttached({\n\t\t\t    hidePopup: removePopup,\n\t\t    })\n        }\n\n        this.popupList.push({\n\t\t\telement         : childElement,\n\t\t\twrapper         : wrapperElement,\n\t\t\thideFunction    : removePopup,\n\t\t\tinstanceId      : instanceId++,\n\t\t\talignedToElement: anchorToElement,\n\t\t});\n\n\n        if (positionCallback) {\n            positionCallback();\n        }\n\n        \n\n        return {\n\t\t\thideFunction: removePopup,\n\t\t};\n    }\n\n    getPopupParent(): HTMLElement {\n\t\tconst popupParentElement = this.optionsHandler.getPopupParent();\n\n\t\tif (popupParentElement) {\n\t\t\treturn popupParentElement;\n\t\t}\n\n\t\treturn this.gridController.getGui();\n\t}\n\n    private setAlignedStyles(popupElement: HTMLElement, positioned: Position) {\n        const popupIndex = this.getPopupIndex(popupElement);\n\n        if (popupIndex === -1) { return; }\n\n        const popup = this.popupList[popupIndex];\n\n        const { alignedToElement } = popup;\n\n        if (!alignedToElement) { return; }\n\n        const positions = [Position.above, Position.left, Position.right, Position.under, Position.over];\n\n        positions.forEach(position => {\n            alignedToElement.classList.remove(`ZG-has-popup-positioned-${position}`)\n            popupElement.classList.remove(`ZG-popup-positioned-${position}`);\n        });\n\n        if (!positioned) { return; }\n\n        alignedToElement.classList.add(`ZG-has-popup-positioned-${positioned}`);\n        popupElement.classList.add(`ZG-popup-positioned-${positioned}`);\n    }\n\n\n    private getPopupIndex(element: HTMLElement): number {\n        return this.popupList.findIndex((popup) => popup.element === element);\n    }\n\n\tprivate initialisePopupPosition(element: HTMLElement): void {\n\t\tconst popupParentElement = this.getPopupParent();\n\t\tconst popupParentElementRect = popupParentElement.getBoundingClientRect();\n\n        if(element) {\n            element.style.top = `${popupParentElementRect.top * -1}px`;\n            element.style.left = `${popupParentElementRect.left * -1}px`;\n        }\n\t}\n\n\tprivate calculatePopupPosition( popupElement: HTMLElement, targetRect: DOMRect, parentRect: DOMRect, gapY: number, ): Position {\n        const spaceBelowTarget      = parentRect.bottom - targetRect.bottom;\n        const spaceAboveTarget      = targetRect.top - parentRect.top;\n        const spaceNeeded           = popupElement.offsetHeight + gapY;\n        const isSpaceAvailibleUnder = spaceBelowTarget > spaceNeeded;\n        const isSpaceAvailibleAbove = spaceAboveTarget > spaceNeeded || spaceAboveTarget > spaceBelowTarget\n\n\t\tif (isSpaceAvailibleUnder) {\n\t\t\treturn Position.under;\n\t\t}\n\n\t\tif ( isSpaceAvailibleAbove ) {\n\t\t\treturn Position.above;\n\t\t}\n\n\t\treturn Position.under;\n\t}\n\n    calculateLeftOrRightPopupPosition( popupElement: HTMLElement, targetRect: DOMRect, parentRect: DOMRect, gapX: number, ): Position {\n        const spaceBelowTarget      = parentRect.right - targetRect.right;\n        const spaceAboveTarget      = targetRect.left - parentRect.left;\n        const spaceNeeded           = popupElement.offsetWidth + gapX;\n        const isSpaceAvailibleUnder = spaceBelowTarget > spaceNeeded;\n        const isSpaceAvailibleAbove = spaceAboveTarget > spaceNeeded || spaceAboveTarget > spaceBelowTarget\n\n\t\tif (isSpaceAvailibleUnder) {\n\t\t\treturn Position.left;\n\t\t}\n\n\t\tif ( isSpaceAvailibleAbove ) {\n\t\t\treturn Position.right;\n\t\t}\n\n\t\treturn Position.under;\n\t}\n\tprivate ensureXYBoundaries( popUpElement: HTMLElement, position: number, direction: DIRECTION, ): number {\n\t\tconst isVertical             = direction === DIRECTION.vertical;\n\t\tconst sizeProperty           = isVertical ? 'clientHeight' : 'clientWidth';\n\t\tconst anchorProperty         = isVertical ? 'top' : 'left';\n\t\tconst offsetProperty         = isVertical ? 'offsetHeight' : 'offsetWidth';\n\t\tconst scrollPositionProperty = isVertical ? 'scrollTop' : 'scrollLeft';\n\n\t\tconst documentElement = this.optionsHandler.getDocument();\n\t\tconst docElement      = documentElement.documentElement;\n\t\tconst popupParent     = this.getPopupParent();\n\t\tconst parentRect      = popupParent.getBoundingClientRect();\n\t\tconst documentRect    = documentElement.documentElement.getBoundingClientRect();\n\n\n\t\tconst isBody          = popupParent === documentElement.body;\n\n\t\tconst offsetSize = popUpElement[offsetProperty];\n\t\tconst getSize    = isVertical ? getAbsoluteHeight : getAbsoluteWidth;\n\n\t\tlet sizeOfParent = isBody ? getSize(docElement) + docElement[scrollPositionProperty] : popupParent[sizeProperty];\n\n\t\tif (isBody) {\n\t\t\tsizeOfParent -= Math.abs( documentRect[anchorProperty] - parentRect[anchorProperty]);\n\t\t}\n\n\t\tconst max = sizeOfParent - offsetSize;\n\n\t\treturn Math.min(Math.max(position, 0), Math.abs(max));\n\t}\n\n\tprivate getParentRect(): IRect {\n\t\tconst documentElement = this.optionsHandler.getDocument();\n\t\tlet popupParent = this.getPopupParent();\n\n\t\tif (popupParent === documentElement.body) {\n\t\t\tpopupParent = documentElement.documentElement;\n\t\t} else if (this.isPopUpElementIsStatic(popupParent)) {\n\t\t\tpopupParent = popupParent.offsetParent as HTMLElement;\n\t\t}\n\n\t\treturn getElementRectWithOffset(popupParent);\n\t}\n\n\tprivate isPopUpElementIsStatic(element: HTMLElement): boolean {\n\t\treturn getComputedStyle(element).position === 'static';\n\t}\n\n    private createPopupWrapper(element: HTMLElement, ariaLabel: string): HTMLElement {\n        const popupParentElement = this.getPopupParent();\n        const wrapperElement     = document.createElement('div');\n        wrapperElement.classList.add('ZG-popup');\n        wrapperElement.classList.add('ZG-grid-popup');\n\n        // element.setAttribute('dir', this.optionsHandler.isRTL() ? 'rtl' : 'ltr');\n\t\tconst isRTL = this.optionsHandler.isRTL();\n\t\tisRTL ? document.documentElement.setAttribute('dir', 'rtl') : document.documentElement.setAttribute('dir', 'ltr');\n        element.classList.add('ZG-popup-child');\n\n        if (!element.hasAttribute('role')) {\n            setAriaRole(element, 'dialog');\n        }\n\n        setAriaLabel(element, ariaLabel);\n\n        wrapperElement.appendChild(element);\n        popupParentElement.appendChild(wrapperElement);\n\n        return wrapperElement;\n    }\n\n     private removePopupFromPopupList(element: HTMLElement): void {\n        this.setAlignedStyles(element, null);\n        this.popupList = this.popupList.filter(popup => popup.element !== element);\n    }\n\n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { IRequestAnimationFrameTaskList, TaskItem } from \"./IRequestAnimationFrameTaskList\";\nimport { RequestAnimationFrameTaskList } from \"./RequestAnimationTaskList\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\n\nexport const enum Priority {\n    high = 'high',\n    low  = 'low'\n}\n\n@Bean(GRID_BEAN_NAME.REQUESTANIMATIONFRAME)\nexport class RequestAnimationFrameHandler extends EventEmitter {\n\n    private highPriority: IRequestAnimationFrameTaskList = new RequestAnimationFrameTaskList();\n    private lowPriority: IRequestAnimationFrameTaskList  = new RequestAnimationFrameTaskList();\n\n    private ticking = false;\n\n\n    private destroyTasks: (() => void)[] = [];\n\n\n    private scrollingDown = true;\n\n    private lastScrollTop = 0;\n\n    private taskCount = 0;\n\n    private cancelledTasks = new Set();\n\n    setScrollTop(scrollTop: number): void {\n        this.scrollingDown = scrollTop >= this.lastScrollTop;\n        this.lastScrollTop = scrollTop;\n    }\n\n\n    createTask(task: () => void, index: number, list: Priority) {\n        const taskItem: TaskItem = {\n            task,\n            index, \n            order: ++this.taskCount\n        };\n\n        const taskList = this.getTaskList(list);\n        taskList.addTaskToList(taskItem);\n        this.schedule();\n    }\n\n    schedule(): void {\n        if (!this.ticking) {\n            this.ticking = true;\n            this.requestFrame();\n        }\n    }\n\n    flushAllFrames(): void {\n        this.executeFrame(-1);\n    }\n\n    isQueueEmpty(): boolean {\n        return !this.ticking;\n    }\n\n    addDestroyTask(task: () => void): void {\n        this.destroyTasks.push(task);\n        this.schedule();\n    }\n\n    debounce(func: () => void) {\n        let pending = false;\n        const callBack = () => {\n            if (pending) {\n                return;\n            }\n            pending = true;\n            this.addDestroyTask(() => {\n                pending = false;\n                func();\n            });\n        };\n        return callBack;\n    }\n\n    cancelTask(task: () => void) {\n        this.cancelledTasks.add(task);\n    }\n\n    sortTaskList(taskList : IRequestAnimationFrameTaskList) {\n        const scrollDirection = this.scrollingDown ? 1 : -1;\n        taskList.sortTaskList(scrollDirection);\n    }\n\n    requestAnimationFrame(callback: any) {\n        if ((window ?? globalThis).requestAnimationFrame) {\n            (window ?? globalThis).requestAnimationFrame(callback);\n        }else {\n            (window ?? globalThis).setTimeout(callback, 0);\n        }\n    }\n\n    private getTaskList(list : Priority) : IRequestAnimationFrameTaskList {\n        switch(list) {\n            case Priority.high:\n                return this.highPriority;\n            case Priority.low:\n                return this.lowPriority;\n            default:\n                return this.lowPriority;\n        }\n    }\n\n    private requestFrame(): void {\n        const callback = this.executeFrame.bind(this, 60);\n        this.requestAnimationFrame(callback);\n    }\n\n    private executeFrame(millis: number): void {\n\n        const highPriortyTask = this.highPriority.getList();\n        const lowPriortyTask  = this.lowPriority.getList();\n\n        const destroyTasks = this.destroyTasks;\n\n        // Use performance.now() instead of Date.getTime() for better performance\n        const frameStart = performance.now();\n        let   duration   = 0;\n\n        const noMaxMillis = millis <= 0;\n\n        // Sort high priority tasks once before the loop\n        if (highPriortyTask.length && !this.highPriority.getSorted()) {\n            this.sortTaskList(this.highPriority);\n        }\n\n        // Sort low priority tasks once before the loop\n        if (lowPriortyTask.length && !this.lowPriority.getSorted()) {\n            this.sortTaskList(this.lowPriority);\n        }\n\n        while (noMaxMillis || duration < millis) {\n\n            let task: () => void;\n            if (highPriortyTask.length) {\n                task = highPriortyTask.pop()!.task;\n            } else if (lowPriortyTask.length) {\n                task = lowPriortyTask.pop()!.task;\n            } else if (destroyTasks.length) {\n                task = destroyTasks.pop()!;\n            } else {\n                this.cancelledTasks.clear();\n                break;\n            }\n\n            if (!this.cancelledTasks.has(task)) {\n                task();\n            }\n\n            // Only recalculate duration if we have a time limit\n            if (!noMaxMillis) {\n                duration = performance.now() - frameStart;\n            }\n        }\n\n        if (highPriortyTask.length || lowPriortyTask.length || destroyTasks.length) {\n            this.requestFrame();\n        } else {\n            this.ticking = false\n        }\n    }\n\n\n    protected destroy(): void {\n        //destroy all\n        this.highPriority = new RequestAnimationFrameTaskList();\n        this.lowPriority = new RequestAnimationFrameTaskList();\n        this.flushAllFrames();\n    }\n}","import { IRequestAnimationFrameTaskList, TaskItem } from \"./IRequestAnimationFrameTaskList\";\n\nexport class RequestAnimationFrameTaskList implements IRequestAnimationFrameTaskList {\n    private list  : TaskItem[] = [];\n    private sorted: boolean = false;\n    private lastScrollDirection: number | null = null;\n\n    addTaskToList(task: TaskItem): void {\n        this.list.push(task);\n        // Only mark as unsorted if we have more than one task\n        // Single task doesn't need sorting\n        if (this.list.length > 1) {\n            this.sorted = false;\n        }\n    }\n\n    getList() : TaskItem[] {\n        return this.list;\n    }\n\n    getSorted() : boolean {\n        return this.sorted;\n    }\n\n    sortTaskList(scrollDirection : number) : void {\n        // Skip sorting if already sorted with the same direction\n        if (this.sorted && this.lastScrollDirection === scrollDirection) {\n            return;\n        }\n\n        // Skip sorting if list is empty or has only one item\n        if (this.list.length <= 1) {\n            this.sorted = true;\n            this.lastScrollDirection = scrollDirection;\n            return;\n        }\n\n        const direction = scrollDirection ? 1 : -1;\n\n        const compartor = (a, b) => {\n            return a.index === b.index ?  b.order - a.order : direction * (b.index - a.index);\n        }\n\n        this.list.sort(compartor);\n        this.sorted = true;\n        this.lastScrollDirection = scrollDirection;\n    }\n\n    \n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { ResizeObserverPolyfill } from \"./ResizeObserverPolyfill\";\nimport { ResizeObserverType } from \"./Interface/resize-observer.types\";\n\n@Bean('ResizeObserver')\nexport class ResizeObserverHandler extends EventEmitter implements ResizeObserverType {\n    private polyfillFunctions: (() => void)[] = [];\n    private polyfillScheduled: boolean;\n\n    public observeResize(element: HTMLElement, callback: () => void): () => void {\n\n        const resizeObserverExists = !!ResizeObserver;\n        let observer = null;\n        if (resizeObserverExists) {\n            observer = new ResizeObserver(callback);\n        }else {\n            observer = new ResizeObserverPolyfill(callback, this.enqueuePolyfillFunction.bind(this));\n        }\n\n        observer.observe(element);\n\t\treturn () => observer.disconnect();\n    }\n\n    private enqueuePolyfillFunction(func: () => void): void {\n        this.polyfillFunctions.push(func);\n        this.runPolyfillQueue();\n    }\n\n    private runPolyfillQueue(): void {\n        if (this.polyfillScheduled) { return; }\n\n        const executeAllFuncs = () => {\n            const funcs = this.polyfillFunctions;\n\n            this.polyfillScheduled = false;\n            this.polyfillFunctions = [];\n\n            funcs.forEach(f => f());\n        };\n\n        this.polyfillScheduled = true;\n        setTimeout(executeAllFuncs, 50);\n    }\n}\n","import { offsetHeight, offsetWidth } from \"./utils/Dom\";\n\nexport class ResizeObserverPolyfill {\n    private element: HTMLElement;\n    private callback: () => void;\n    private widthLastTime: number;\n    private heightLastTime: number;\n    private running: boolean = true;\n    private enqueuePolyfillFunction: (func: () => void) => void;\n\n    constructor(callback: () => void, enqueuePolyfillFunction: (func: () => void) => void) {\n        this.callback           = callback;\n        this.enqueuePolyfillFunction = enqueuePolyfillFunction;\n    }\n\n    observe(element : HTMLElement) : void {\n        this.element = element;\n        this.widthLastTime = offsetWidth(element);\n\t\tthis.heightLastTime = offsetHeight(element);\n        this.checkElementSizeChanges();\n    }\n\n    private checkElementSizeChanges(): void {\n        if (this.running) {\n            const newWidth = offsetWidth(this.element);\n            const newHeight = offsetHeight(this.element);\n            const changed = newWidth !== this.widthLastTime || newHeight !== this.heightLastTime;\n\n            if (changed) {\n                this.widthLastTime = newWidth;\n                this.heightLastTime = newHeight;\n                this.callback();\n            }\n\n            this.enqueuePolyfillFunction(() => this.checkElementSizeChanges());\n        }\n    }\n\n    public disconnect(): void {\n        this.running = false;\n    }\n}\n","import { Bean, EventEmitter } from '@dg/corecomponent';\nimport { GRID_BEAN_NAME } from './Constants/BeanName';\nimport { IRowNode } from '../Core/Interface/IRowNode';\n\n@Bean(GRID_BEAN_NAME.ROW_HOVER_HANDLER)\nexport class RowHoverHandler extends EventEmitter {\n\n\tprivate selectedRows: IRowNode | null;\n\n\tpublic setMouseOver(rows: IRowNode): void {\n\t\tif(this.isHovered(rows)) {\n\t\t\treturn;\n\t\t}\n\t\tthis.clearMouseOver(rows);\n\t\tthis.selectedRows = rows;\n\t\tthis.selectedRows.onMouseEnter();\n\t\tthis.optionsHandler.on('rowEnter',this.getRowMetas(rows))\n\n\t}\n\n\tpublic clearMouseOver(_row : IRowNode): void {\n\t\tthis.selectedRows && this.selectedRows.onMouseLeave();\n\t\tthis.selectedRows && this.optionsHandler.on('rowLeave',this.getRowMetas(this.selectedRows));\n\t\tthis.selectedRows = null;\n\t}\n\n\tpublic isHovered(row: IRowNode): boolean {\n\t\treturn (\n\t\t\t!!this.selectedRows && this.selectedRows === row\n\t\t);\n\t}\n\n\tprivate getRowMetas(rows) : any {\n\t\tconst rowMeta = rows.getRowMeta();\n\t\treturn {\n\t\t\trowIndex   : rowMeta.rowIndex,\n\t\t\tpinPosition: rowMeta.pinPosition,\n\t\t\tparentKeys : rowMeta.parentKeys,\n\t\t\trowId      : rows.getId()\n\t\t}\n\t}\n}\n","import { IRowBlockRowDeleteMeta, IRowBlockRowInsertMeta } from \"../../../DataStore/rowblock-handler.types\";\nimport { MovePosition } from \"../../Main\";\nimport { IFieldHeaderRowPinnedDefinition } from \"../Interface/IRowDefinitions\";\nimport { IRecordAxis } from \"./IRecordAxis.types\";\nimport { RecordAxis } from \"./RecordAxis\";\nimport { FieldHeaderRowNode } from \"./RowNode\";\n\ntype IRowHeaderDefinitionFunction = (rowIndex : number)=> IFieldHeaderRowPinnedDefinition;\n\n\nclass FieldHeaderInfoHandler {\n\tprivate recordAxis       : IRecordAxis;\n\tprivate IDsOrder         : string[];\n\tprivate rowNodeMapping   : Record<string, FieldHeaderRowNode>;\n\tprivate hiddenRecordMap  : Record<string, number>;\n\tprivate getID: (\n\t\tdefinition: IFieldHeaderRowPinnedDefinition,\n\t\tindex: number,\n\t) => string;\n\tprivate getRowDefinitions: CallableFunction;\n\n\tprotected paneType: string;\n\tdefaultRowHeight: any;\n\n\tconstructor(_paneType: string) {\n\t\tthis.reset();\n\t\tthis.getID = (_definition, index: number) => `FieldHeader-${index}`;\n\t}\n\n\tisValidRow() : boolean{\n\t\treturn true;\n\t}\n\n\treset(){\n\t\tthis.recordAxis = new RecordAxis();\n\t\tthis.IDsOrder = [];\n\t\tthis.rowNodeMapping = {};\n\t\tthis.getRowDefinitions = () => {};\n\t\tthis.hiddenRecordMap = {};\n\t}\n\n\tprivate createRowNode( id: string, index: number, definition: IFieldHeaderRowPinnedDefinition, rowHeight?: number ): void {\n\t\tconst rowNodeHelper = {\n\t\t\tgetRowHeight : (id: string)=>this.getRowHeight(id)\n\t\t};\n\t\tconst node = new FieldHeaderRowNode(rowNodeHelper, id, definition);\n\n\t\tthis.IDsOrder.splice(index, 0, id);\n\t\tthis.rowNodeMapping[id] = node;\n\t\tthis.recordAxis.insertAtIndex(index, rowHeight ?? this.defaultRowHeight);\n\t}\n\n\tconstructRows( rowDefinitions: IRowHeaderDefinitionFunction, getID: ( definition: IFieldHeaderRowPinnedDefinition, index: number, ) => string, count: number, optionsHandler : any) {\n\t\tthis.getRowDefinitions = rowDefinitions;\n\t\tthis.getID = getID;\n\t\tthis.defaultRowHeight = optionsHandler.getColumnHeaderHeight({ rowIndex: 0, rowType: count > 1 ? 'group' : 'leaf', level: 0, maxDepth: count });\n\t\tthis.reset();\n\t\tfor (let index = 0; index < count; index++) {\n\t\t\tconst definition = this.getRowDefinitions(index);\n\t\t\tconst id = this.getID(definition, index);\n\t\t\tconst rowType = index < count - 1 ? 'group' : 'leaf';\n\t\t\tconst rowHeight = optionsHandler.getColumnHeaderHeight({ rowIndex: index, rowType, level: index, maxDepth: count });\n\t\t\tthis.createRowNode(id, index, definition, rowHeight);\n\t\t}\n\t}\n\n\tgetWidth() : number{\n\t\treturn null;\n\t}\n\n\tdeleteRow(id: string): void {\n\t\tconst index = this.getIndexById(id);\n\t\tdelete this.rowNodeMapping[id];\n\t\tthis.IDsOrder.splice(index, 1);\n\t\tthis.recordAxis.deleteHeight(index);\n\t}\n\n\tshiftRow(sourceID: string, targetID: string): void {\n\t\tconst sourceIndex = this.IDsOrder.indexOf(sourceID);\n\t\tconst targetIndex = this.IDsOrder.indexOf(targetID);\n\t\tif (sourceIndex != -1 && targetIndex != -1) {\n\t\t\tif (sourceIndex < targetIndex) {\n\t\t\t\tthis.IDsOrder.splice(sourceIndex, 1);\n\t\t\t\tthis.IDsOrder.splice(targetIndex + 1, 0, sourceID);\n\t\t\t} else {\n\t\t\t\tthis.IDsOrder.splice(sourceIndex, 1);\n\t\t\t\tthis.IDsOrder.splice(targetIndex, 0, sourceID);\n\t\t\t}\n\t\t}\n\t}\n\n    insertRowsAtIndexes(_rowInsertMetas : IRowBlockRowInsertMeta[], _insertPosition ?: MovePosition) : void{\n\n\t} \n\n    removeRows(_rowDeleteMetas : IRowBlockRowDeleteMeta[]) : void{\n\t\t\n\t}\n\n\tinsertRowBefore( index: number, definition: IFieldHeaderRowPinnedDefinition, ): void {\n\t\tconst id = this.getID(definition, index);\n\t\tthis.createRowNode(id, index, definition);\n\t}\n\n\tinsertRowAfter( index: number, definition: IFieldHeaderRowPinnedDefinition, ): void {\n\t\tconst id = this.getID(definition, index + 1);\n\t\tthis.createRowNode(id, index + 1, definition);\n\t}\n\n\tFieldHeaderRowNode(index: number): FieldHeaderRowNode {\n\t\tlet id = this.IDsOrder[index];\n\t\tif (!id) {\n\t\t\tconst definition = this.getRowDefinitions(index);\n\t\t\tconst newID = this.getID(definition, index);\n\t\t\tthis.createRowNode(newID, index, definition);\n\t\t}\n\t\tid = this.IDsOrder[index];\n\t\treturn this.rowNodeMapping[id];\n\t}\n\n\tgetIdByIndex(index: number): string | null {\n\t\tconst node = this.FieldHeaderRowNode(index);\n\t\treturn node?.getId() ?? null;\n\t}\n\n\tgetIndexById(id: string): number {\n\t\treturn this.IDsOrder.indexOf(id);\n\t}\n\n\tgetPreviousID(id: string): string | null {\n\t\tconst index = this.getIndexById(id);\n\t\tlet nextID = null;\n\t\tif (index != -1) {\n\t\t\tnextID = this.getIdByIndex(index - 1);\n\t\t}\n\t\treturn nextID;\n\t}\n\n\tgetNextID(id: string): string | null {\n\t\tconst index = this.getIndexById(id);\n\t\tlet nextID = null;\n\t\tif (index != -1) {\n\t\t\tnextID = this.getIdByIndex(index + 1);\n\t\t}\n\t\treturn nextID;\n\t}\n\n\tgetRowTop(id: string): number | null {\n\t\tconst index = this.getIndexById(id);\n\t\treturn index != -1 ? this.recordAxis.getTop(index) : null;\n\t}\n\n\tgetRowHeight(_id: string): number | null {\n\t\tconst index : number = 0;\n\t\treturn index != -1 ? this.recordAxis.getHeight(index) : null;\n\t}\n\n\tsetAutoMeasuredHeaderRowHeight(rowIndex: number, height: number): boolean {\n\t\tconst validIndex = rowIndex >= 0 && rowIndex < this.recordAxis.getTotalCount();\n\t\tif (!validIndex || !Number.isFinite(height)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst nextHeight = Math.max(1, Math.ceil(height));\n\t\tconst previousHeight = this.recordAxis.getHeight(rowIndex);\n\t\tif (Math.round(previousHeight) === Math.round(nextHeight)) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.recordAxis.updateHeight(rowIndex, nextHeight);\n\t\tthis.defaultRowHeight = nextHeight;\n\t\treturn true;\n\t}\n\n\tgetRowCount(): number {\n\t\treturn this.IDsOrder.length;\n\t}\n\n\tgetTotalHeight(): number {\n\t\treturn this.recordAxis.getTotalHeight();\n\t}\n\n\thideRow(id: string): void {\n\t\tconst index = this.getIndexById(id);\n\t\tif (index != -1) {\n\t\t\tconst height = this.getRowHeight(id) as number;\n\t\t\tthis.recordAxis.updateHeight(index, 0);\n\t\t\tthis.hiddenRecordMap[id] = height;\n\t\t}\n\t}\n\n\tunHideRow(id: string): void {\n\t\tconst index = this.getIndexById(id);\n\t\tif (index != -1) {\n\t\t\tconst height = this.hiddenRecordMap[id];\n\t\t\tthis.recordAxis.updateHeight(index, height);\n\t\t}\n\t}\n\n\tgetPinPosition(): string {\n\t\treturn this.paneType;\n\t}\n\n\tgetRowNode(index: number): FieldHeaderRowNode | null {\n\t\tconst id = this.getIdByIndex(index);\n\t\treturn id != null ? this.getRowNodeById(id) : null;\n\t}\n\n\tgetRowNodeById(id: string): FieldHeaderRowNode {\n\t\treturn this.rowNodeMapping[id] ?? null;\n\t}\n}\n\n\nexport {\n    FieldHeaderInfoHandler\n}","import { Axis } from \"../../../DataStore/RowAxis/Axis\";\nimport { IAxis } from \"../../../DataStore/RowAxis/IAxis.types\";\nimport { IRecordAxis } from \"./IRecordAxis.types\";\n\n//axis is only for dynamic Height\nclass RecordAxis implements IRecordAxis{\n    private axis                : IAxis;\n    private relativeTopPosition : number;\n    private relativeTopIndex    : number;\n    constructor(){\n        this.axis                = new Axis();\n        this.relativeTopIndex    = 0;\n        this.relativeTopPosition = 0;\n    }\n    private convertToAbsoluteIndex(relativeIndex : number) : number{\n        return relativeIndex - this.relativeTopIndex;\n    }\n    private convertToRelativeIndex(absoluteIndex : number) : number{\n        return absoluteIndex + this.relativeTopIndex;\n    }\n    private convertToAbsolutePosition(relativePosition : number) : number{\n        return relativePosition - this.relativeTopPosition;\n    }\n    private convertToRelativePosition(absolutePosition : number) : number{\n        return absolutePosition + this.relativeTopPosition;\n    }\n    getRelativeTopIndex(): number {\n        return this.relativeTopIndex;\n    }\n    setRelativeTopIndex(relativeTopIndex): void {\n        this.relativeTopIndex = relativeTopIndex;\n    }\n\n    getRelativeTopPosition(): number {\n        return this.relativeTopPosition;\n    }\n    setRelativeTopPosition(relativeTopIndex): void {\n        this.relativeTopPosition = relativeTopIndex;\n    }\n\n    resetAxis() : void {\n        this.axis.resetAxis();\n    }\n    \n    appendHeight(_height : number) : void{\n        // this.axis.append(height);\n    }\n    appendMultipleHeights(_count : number, _getHeightCallback : (index : number)=>number) : void{\n        // this.axis.appendSizes(count, getHeightCallback);\n    }\n    insertAtIndex(index : number, height : number) : void{\n        index = this.convertToAbsoluteIndex(index);\n        this.axis.insertAtIndex(index , height)\n    }\n    deleteHeight(index : number) : void{\n        index = this.convertToAbsoluteIndex(index);\n        this.axis.removeIndex(index);\n    }\n    getTop(index : number) : number {\n        index = this.convertToAbsoluteIndex(index);\n        const absoluteIndex = this.axis.getPosition(index);\n        return this.convertToRelativePosition(absoluteIndex);\n    }\n    getIndexByPosition(position : number) : number {\n        position = this.convertToAbsolutePosition(position);\n        const absoluteIndex = this.axis.getIndexByPosition(position);\n        return this.convertToRelativeIndex(absoluteIndex);\n    }\n    getHeight(index : number) : number{\n        index = this.convertToAbsoluteIndex(index);\n        return this.axis.getSize(index);\n    }\n    updateHeight(index : number, size : number) : void{\n        index = this.convertToAbsoluteIndex(index);\n        this.axis.resize(index, size);\n    }\n    getTotalHeight() : number{\n        return this.axis.getTotalSize();\n    }\n    getTotalCount(): number {\n        return this.axis.getTotalCount();\n    }\n}\n\nexport{\n    RecordAxis\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { Events } from \"../Constants/Events\";\nimport { ROW_PANE_TYPE, rowPinPositions } from \"../Constants/GridConfigurationConstants\";\nimport { VERTICAL_PANE } from \"../ControllerHandler/ControllerHandler\";\nimport { IGridConfiguration } from \"../Interface/IGridConfiguration\";\nimport { IFieldHeaderRowPinnedDefinition } from \"../Interface/IRowDefinitions\";\nimport { IRowNode } from \"../Interface/IRowNode\";\nimport { FieldHeaderInfoHandler } from \"./FieldHeaderInfoHandler\";\nimport { MovePosition } from \"../../API/ReorderableAPI/Interface/IReorderableAPI\";\nimport { ClientBlockHandler } from \"../../../DataStore/Local/ClientDataBlock\";\nimport { IRowNodeCore } from \"../../../DataStore/rownode.types\";\nimport { RowNodeHolder } from \"../../../DataStore/RowNodeHolder\";\nimport { IRowNodeHolder } from \"../../../DataStore/rowNodeHolder.types\";\nimport { IRowBlockHandler } from \"../../../DataStore/rowblock-handler.types\";\nimport { IClientBlockHandler } from \"../../../DataStore/Local/client-rowblock-handler.types\";\nimport { IRemoteBlockHandler } from \"../../../DataStore/Remote/remote-rowblock-handler.types\";\nimport { IGroupModel } from \"../Interface/IRowGroupingConfigurations\";\nimport { IFilterModel } from \"../Interface/IFilterConfigurations\";\nimport { ISortModel } from \"../Interface/ISortConfigurations\";\nimport { TreeGridRemoteDataBlock } from \"../../../DataStore/Remote/TreeGridRemoteDataBlock\";\nimport { RemoteDataBlock } from \"../../../DataStore/Remote/RemoteDataBlock\";\nimport { IRecordHandler, IRowDeleteMeta, IRowInsertMeta } from \"./RecordHandler.types\";\nimport { IRowMeta } from \"../../API/CommonAPIInterface\";\nimport { IAPIErrorHandler } from \"../../API/APIErrorHandler\";\nimport { IColumnAutofitHandler } from \"../../../Autofit/ColumnAutofit/column-autofitHandler.types\";\nimport { IFloatingRecordHandler } from \"Grid/FloatingRecords/Interface/IFloatingRecordHandler\";\nimport type { ColumnTreeModel } from \"../../../nested-header/column-tree-model\";\n\n\n@Bean(GRID_BEAN_NAME.RECORD_HANDLER)\nclass RecordHandler extends EventEmitter implements IRecordHandler{\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controlHandler           : any;\n    @AutoWired(BEAN_NAME.BEANS) getBeanInstanceByBeanName !                        : getBeanInstanceByBeanName\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRenderController   : any;\n    @AutoWired(GRID_BEAN_NAME.ERROR_HANDLER) private errorHandler                  : IAPIErrorHandler;\n    @AutoWired(GRID_BEAN_NAME.COLUMN_AUTOFIT_HANDLER) private columnAutofitHandler : IColumnAutofitHandler;\n    @AutoWired(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) private floatingRecordHandler : IFloatingRecordHandler;\n\n\n    private topHandler       : IClientBlockHandler;\n    private middleHandler    : IRowBlockHandler;\n    private bottomHandler    : IClientBlockHandler;\n    private headerHandler    : FieldHeaderInfoHandler;\n    private summaryHandler   : IClientBlockHandler;\n    private rowNodeHolder    : IRowNodeHolder;\n    rowGroupingModel : IGroupModel[];\n    private filterModel      : IFilterModel;\n    private sortModel        : ISortModel[];\n    private pageNumber       : number;\n    private paneTypeOrder: string[];\n\n    constructor(){\n        super();\n        this.sortModel        = null;\n        this.rowGroupingModel = null;\n        this.filterModel      = null;\n        this.pageNumber       = 0;\n        this.paneTypeOrder   = [ROW_PANE_TYPE.HEADER,ROW_PANE_TYPE.TOP,ROW_PANE_TYPE.TOP_DRAFT_ROW,ROW_PANE_TYPE.MIDDLE,ROW_PANE_TYPE.BOTTOM_DRAFT_ROW,ROW_PANE_TYPE.BOTTOM,ROW_PANE_TYPE.SUMMARY];\n    }\n    \n\n    private getUpcomingRowNodes(startIndex : number) : IRowNode[] {\n        const upcomingRows = this.rowRenderController.getUpcomingRows(startIndex);\n        const positionUpdatedRowNodes = [];\n        upcomingRows.forEach(index=>{\n            const rowNode = this.getRowNodeByIndex(index);\n            positionUpdatedRowNodes.push(rowNode);\n        })\n        return positionUpdatedRowNodes;\n    }\n\n    private dispatchRowChange(rowNodes : IRowNode[], action : 'height' | 'insert' | 'delete') : void{\n        (rowNodes ?? []).forEach(rowNode=>{\n            rowNode?.onRowTopChange();\n            if(action === 'insert' || action === 'delete') {\n                rowNode?.onRowIndexChange();\n            }\n        });\n        if (action === 'height' && this.rowRenderController?.syncMiddlePaneScrollGeometry) {\n            this.rowRenderController.syncMiddlePaneScrollGeometry();\n        }\n    }\n\n    private getPaneByPinPosition(pinPosition : rowPinPositions){\n        switch(pinPosition){\n            case 'top':\n                return this.topHandler;\n            case 'bottom':\n                return this.bottomHandler;\n            case 'columnHeader':\n                return this.headerHandler;\n            case 'summary' :\n                return this.summaryHandler;\n            default:\n                return this.middleHandler;\n        }\n    }\n\n    getAllRowNodes(): IRowNodeCore[] {   //temporary function\n        return Object.values(this.rowNodeHolder.getAllRows());\n    }\n\n    isInHeader(id) : boolean{\n        return this.headerHandler.getIndexById(id) != -1;\n    } \n\n    convertToAbsoluteIndex(relativeIndex : number) : number{\n        const paneHandler   = this.getRecordPaneByIndex(relativeIndex);\n        const relativeCount = this.getRelativeCount(paneHandler);\n        return relativeIndex-relativeCount;\n    }\n\n    getRowNodeById(id : string) : IRowNodeCore | null{\n        return this.rowNodeHolder.get(id);\n        // const index = this.getRelativeIndexByID(id);\n        // return this.getRowNodeByIndex(index);\n    }\n\n    getRowNodeByIndex(index : number) : IRowNodeCore | null{\n        if(index != null){\n            const paneHandler = this.getRecordPaneByIndex(index);\n            const absoluteIndex = this.convertToAbsoluteIndex(index);\n            return paneHandler.getRowNode(absoluteIndex);\n        }\n        return null;\n    }\n\n    isRowLoaded(index : number) : boolean {\n        const node = this.getRowNodeByIndex(index);\n        return node ? node.isLoaded() : false;\n    }\n\n    @PostConstruct()\n    init() : void {\n        const classRegistry      = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY);\n        const DynamicRowAxisClass = classRegistry.getDynamicRowAxis();\n\n        this.rowNodeHolder = new RowNodeHolder();\n        \n        const rowModel             = this.optionsHandler.getRowModelType();\n        const heightFetcher        = (param)=>this.optionsHandler.getRowHeights(param);\n        const summaryHeightFetcher = (_param)=>this.optionsHandler.getSummaryRowHeights();\n\n        const definitionFetcher = (param)=>this.optionsHandler.getRowDefinitions(param);\n\n\n        this.headerHandler     = this.createManagedBean(new FieldHeaderInfoHandler(ROW_PANE_TYPE.HEADER));\n        this.topHandler        = this.createManagedBean(new ClientBlockHandler('top', heightFetcher, definitionFetcher, DynamicRowAxisClass));\n        this.bottomHandler     = this.createManagedBean(new ClientBlockHandler('bottom', heightFetcher, definitionFetcher, DynamicRowAxisClass));\n        this.summaryHandler    = this.createManagedBean(new ClientBlockHandler('summary', summaryHeightFetcher, definitionFetcher, DynamicRowAxisClass));\n        this.middleHandler     = rowModel == 'local' ? this.createClientMiddleHandler(heightFetcher, definitionFetcher) : this.createRemoteMiddleHandler(heightFetcher, definitionFetcher);\n        // globalThis.infoHandler = this.middleHandler;\n        \n        //temprory\n        const rowNodeHelper = this.middleHandler.getRowNodeHelper();\n        if(rowNodeHelper){\n            rowNodeHelper.getUpcomingRowNodes     = (index : number)=>this.getUpcomingRowNodes(index);\n            rowNodeHelper.dispatchRowHeightChange = (rowNodes) => this.dispatchRowChange(rowNodes, 'height');\n            rowNodeHelper.onDataUpdate = (rowNode : IRowNodeCore, key : string, oldValue : any) => {\n                const rowId = rowNode.getId();\n                if (this.middleHandler.isDraftRow(rowId)) {\n                    const draftRowData = rowNode.getRowData();\n                    draftRowData[key] = oldValue;  //to revert to its original value\n                    const {rowIndex : parseIndex, pinPosition, parentKeys} = rowNode.getRowMeta();\n                    const rowData = Array(parseIndex + 1).fill({});\n                    rowData[parseIndex] = rowNode.getRowData();\n                    const rowApi = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_API);\n                    const rowInsertMetas = [{\n                        rowIndex     : 0,\n                        rowData      : rowData,\n                        rowDefinition: Array(rowData.length).fill(null),\n                        count        : rowData.length,\n                        pinPosition  : this.middleHandler.getPinPosition(),\n                        parentKeys   : parentKeys,\n                    }];\n\n                    const hookMeta = {\n                        eventOrigin : 'draftRow',\n                    }\n                    let forceOptionalConfig;\n                    if(pinPosition == 'topDraftRow'){\n                        rowInsertMetas[0].rowIndex = 0;\n                        rowApi.insertRows(rowInsertMetas, 'before', forceOptionalConfig, hookMeta);\n                    }\n                    else if(pinPosition == 'bottomDraftRow'){\n                        const meta = this.getRelativeRowMeta({rowIndex : 0, pinPosition, parentKeys}, -1);\n                        rowInsertMetas[0].rowIndex = meta ? meta.rowIndex : 0;\n                        rowApi.insertRows(rowInsertMetas, 'after', forceOptionalConfig, hookMeta);\n                    }\n                }\n            }\n        }\n\n        this.setRowNodeHolder();\n    }\n\n    private createRemoteMiddleHandler(heightFetcher, definitionFetcher) : IRowBlockHandler {\n        const classRegistry   = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY);\n        const hasStaticHeight = this.optionsHandler.hasStaticRowHeight();\n        const hasFullTreeStructure = this.optionsHandler.hasFullTreeStructureProvided();\n        const RowAxisClass    = (hasStaticHeight || hasFullTreeStructure) ? classRegistry.getStaticRowAxis() : classRegistry.getDynamicRowAxis();\n        const pinPosition     = 'middle';\n        const self            = this;\n        const blockConfig     = {\n            blockCount          : this.optionsHandler.getCacheBlockCount(),\n            blockSize           : this.optionsHandler.getCacheBlockSize(),\n            fetchTriggerPoint   : this.optionsHandler.getFetchTriggerPoint(),\n            staticCaches        : this.optionsHandler.getStaticCacheIndexes(),\n            rowCount            : this.optionsHandler.getRowCount(),\n            fetchParam          : {\n                get sortModel() : ISortModel[] {\n                    return self.getSortModel();\n                },\n                get filterModel() : IFilterModel {\n                    return self.getFilterModel();\n                },\n                get rowGroupingModel() : IGroupModel[] {\n                    return self.getRowGroupingModel();\n                },\n                get pageNumber() : number {\n                    return self.getPageNumber();\n                },\n                rowPinPosition   : pinPosition\n            },\n            fetchCallback       : (arg)=>{\n                const onSuccess = arg.onSuccess;\n                const onFailure = arg.onFailure;\n                const fetcher = this.optionsHandler.getRowData();\n                arg.onSuccess = (...args)=>{\n                    if(arg.shouldFetchRange()){\n                        onSuccess(...args);\n                        this.dispatchEvent({\n                            type        : Events.EVENT_ROW_DATA_LOADED,\n                            recycleRows : true,\n                            onlyBody    : true,\n                            floating    : true\n                        });\n                    }\n                }\n                arg.onFailure = (...args)=>{\n                    onFailure(...args);\n                    this.dispatchEvent({\n                        type       : Events.EVENT_ROW_DATA_LOADED,\n                        recycleRows: true,\n                        onlyBody   : true,\n                        floating   : true\n                    });\n                }\n                fetcher(arg);\n            },\n            fetchDelay          : this.optionsHandler.getFetchDelay(),\n        }\n        const RemoteDataBlockClass = this.optionsHandler.hasFullTreeStructureProvided() ? TreeGridRemoteDataBlock : RemoteDataBlock;\n        const remoteBlockHandler = this.createManagedBean(new RemoteDataBlockClass(pinPosition, heightFetcher, definitionFetcher, blockConfig, RowAxisClass));\n        return remoteBlockHandler;\n    }\n    getRowGroupingModel() : IGroupModel[] {\n        return this.middleHandler?.getGroupModel() ?? [];\n    }\n    getFilterModel() : IFilterModel {\n        return this.filterModel;\n    }\n    getPageNumber() : number {\n        return this.pageNumber;\n    }\n    getSortModel() : ISortModel[] {\n        return this.sortModel;\n    }\n\n    private createClientMiddleHandler(heightFetcher, definitionFetcher) : IRowBlockHandler {\n        const classRegistry      = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY);\n        const hasStaticHeight    = this.optionsHandler.hasStaticRowHeight();\n        const hasFullTreeStructure = this.optionsHandler.hasFullTreeStructureProvided();\n        // Dynamic height grids need ListGroupedRowAxis so RowGroupingHandler can call createBlock / insertBlock;\n        // inner blocks use ListDynamicBlockAxis when hasStaticRowHeight() is false (see ListGroupedRowAxis).\n        const RowAxisClass       = hasStaticHeight ? classRegistry.getStaticRowAxis() : classRegistry.getDynamicRowAxis(hasFullTreeStructure);\n        // const RowAxisClass       = hasStaticHeight ? classRegistry.getStaticRowAxis() : classRegistry.getDynamicRowAxis(true);\n        const clientBlockHandler = this.createManagedBean(new ClientBlockHandler('middle', heightFetcher, definitionFetcher, RowAxisClass));\n        return clientBlockHandler;\n    }\n\n    private setRowNodeHolder() : void {\n        // this.headerHandler?.setRowNodeHolder(this.rowNodeHolder);\n        this.topHandler?.setRowNodeHolder(this.rowNodeHolder);\n        this.middleHandler?.setRowNodeHolder(this.rowNodeHolder);\n        this.bottomHandler?.setRowNodeHolder(this.rowNodeHolder);\n        this.summaryHandler?.setRowNodeHolder(this.rowNodeHolder);\n    }\n\n    findRowbyPosition(y : number) : number {\n        const type = this.controlHandler.getVerticalPaneType(y);\n        const paneRelatedY = this.controlHandler.getPaneRelativeCoordinatesY(type, y);\n        let index : number;\n        switch(type) {\n            case VERTICAL_PANE.TOP:\n                {const relativeCount = this.getRelativeCount(this.topHandler);\n                index = this.topHandler.getRowByPosition(paneRelatedY) + relativeCount;\n                break;}\n            case VERTICAL_PANE.MIDDLE:{\n                const middlePane = this.getMiddleHandler();\n                const relativeCount = this.getRelativeCount(middlePane);\n                index = this.middleHandler.getRowByPosition(paneRelatedY) + relativeCount;\n                break;}\n            case VERTICAL_PANE.BOTTOM:\n                {const relativeCount = this.getRelativeCount(this.bottomHandler);\n                index = this.bottomHandler.getRowByPosition(paneRelatedY) + relativeCount;\n                break;}\n            default:\n                index = -1;\n        }\n        return index;\n    }\n\n    findY(row : number) : number {\n        const recordPane = this.getRecordPaneByIndex(row);\n        let height = this.headerHandler.getTotalHeight();\n        if(recordPane == this.topHandler) {\n            const rowNode = this.getRowNodeByIndex(row);\n            height += rowNode?.getTop();\n        } \n        else if(recordPane == this.middleHandler) {\n            height += this.topHandler.getTotalHeight();\n            \n        }\n        else if(recordPane == this.bottomHandler) {\n            height += this.topHandler.getTotalHeight() + this.middleHandler.getTotalHeight();\n        }\n        const rowNode = this.getRowNodeByIndex(row);\n        height += rowNode?.getTop();\n        return height;\n    }\n    \n    constructRecordInfoHandler( gridConfigurations : IGridConfiguration ) {\n        \n        const pinnedTopRowData      = gridConfigurations.pinnedTopRowData ?? [];\n        const pinnedBottomRowData   = gridConfigurations.pinnedBottomRowData ?? [];\n        const summaryRowData        = gridConfigurations.summaryRowData ?? [];\n        const treeModel = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_TREE_MODEL) as ColumnTreeModel | undefined;\n        const hasGroups = this.optionsHandler.hasColumnGroups?.();\n        const ColumnHeaderRowCount = (hasGroups && treeModel) ? treeModel.getMaxDepth() : 1;\n\n        const rowModelType = this.optionsHandler.getRowModelType();\n\n        const getHeaderID = (definition : IFieldHeaderRowPinnedDefinition = {}, index : number) : string=>{\n            const relativeIndex = index;\n            return definition.rowId ?? `FieldHeaderRow ${relativeIndex}`;\n        }\n \n        const getHeaderDefinition = () => {return {}}; \n\n        this.headerHandler.constructRows(getHeaderDefinition, getHeaderID, ColumnHeaderRowCount, this.optionsHandler);\n\n        if(rowModelType == 'local') {\n            const data = this.optionsHandler.getRowData();\n            const middleHandler = this.middleHandler as IClientBlockHandler;\n            middleHandler.constructData(data);\n        }\n        else{\n            const middleHandler = this.middleHandler as IRemoteBlockHandler;\n            this.addEventListener(Events.EVENT_VIEWPORT_CHANGED, ({from, to, viewportType}) => {\n                if(viewportType == 'row') {\n                    middleHandler.updateViewPort({startRow : from, endRow : to});\n                }\n            })\n            this.addEventListener(Events.EVENT_ROW_EXPANDED, () => {\n                const startRow  = this.rowRenderController.firstRenderIndex;\n                const endRow = this.rowRenderController.lastRenderIndex;\n                middleHandler.updateViewPort({startRow, endRow});\n            });\n            this.addEventListener(Events.EVENT_ROW_COLLAPSED, () => {\n                const startRow  = this.rowRenderController.firstRenderIndex;\n                const endRow = this.rowRenderController.lastRenderIndex;\n                middleHandler.updateViewPort({startRow, endRow});\n            });\n            middleHandler.constructData();\n        }\n\n\n        //dataPassing\n\n        this.topHandler.constructData(pinnedTopRowData);\n        this.bottomHandler.constructData(pinnedBottomRowData);\n        this.summaryHandler.constructData(summaryRowData);\n\n        this.middleHandler.insertDraftRows();\n\n        this.dispatchEvent({\n            type: Events.EVENT_PINNED_ROW_DATA_CHANGED\n        });\n    }\n \n\n    getAbsoluteIndex(relativeIndex : number) : number{\n        if(relativeIndex == undefined){\n            return null;\n        }\n        const topCount = this.topHandler.getRowCount();\n        const middleCount = this.middleHandler.getRowCount();\n        const recordPaneHandler = this.getRecordPaneByIndex(relativeIndex);\n\n        let absoluteIndex = relativeIndex;\n        if(recordPaneHandler == this.middleHandler){\n            absoluteIndex -= topCount;\n        }\n        else if(recordPaneHandler == this.bottomHandler){\n            absoluteIndex -= (topCount+middleCount);\n        } \n        \n        return absoluteIndex;\n    }\n\n    getAbsoluteID(relativeIndex : number) : string{\n        if(relativeIndex == undefined){\n            return null;\n        }\n        const topCount = this.topHandler.getRowCount();\n        const middleCount = this.middleHandler.getRowCount();\n        const recordPaneHandler = this.getRecordPaneByIndex(relativeIndex);\n\n        let absoluteIndex = relativeIndex;\n        if(recordPaneHandler == this.middleHandler){\n            absoluteIndex -= topCount;\n        }\n        else if(recordPaneHandler == this.bottomHandler){\n            absoluteIndex -= (topCount+middleCount);\n        } \n        return recordPaneHandler.getIdByIndex(absoluteIndex);\n    }\n\n    getTopSpanCount() : number {\n        return this.topHandler.getRowCount();\n    }\n\n    getMiddleSpanCount() : number {\n        return this.middleHandler.getRowCount();\n    }\n\n    getBottomSpanCount() : number {\n        return this.bottomHandler.getRowCount();\n    }\n\n    getMiddleSpanLastIndex() : number {\n        return this.getTopSpanCount() + this.getMiddleSpanCount() - 1;\n    }\n\n    getSummaryCount() : number {\n        return this.bottomHandler.getRowCount();\n    }\n\n    getTotalCount(pinPosition ?: rowPinPositions) : number {\n        const paneHandler = this.getPaneByPinPosition(pinPosition);\n        return paneHandler.getRowCount();\n    }\n\n    getTotalRows() : number {\n        return this.getTopSpanCount() + this.getMiddleSpanCount() + this.getBottomSpanCount();\n    }\n\n    getTotalRowHeight() : number {\n        const height = this.topHandler.getTotalHeight() + this.middleHandler.getTotalHeight() + this.bottomHandler.getTotalHeight();\n        return height;\n    }\n\n    getHeightByIndex(index : number) : number {\n        const paneHandler   = this.getRecordPaneByIndex(index);\n        const absoluteIndex = this.convertToAbsoluteIndex(index);\n        return paneHandler.getHeight(absoluteIndex);\n    }\n\n    private seperateMetaByPinPosition(metas : {pinPosition ?: rowPinPositions}[]) : Record<rowPinPositions, any[]> {\n        const paneMetaMapping = {};\n        metas.forEach((meta) => {\n            const rowPinnedPosition = meta.pinPosition ?? 'middle';\n            paneMetaMapping[rowPinnedPosition] = paneMetaMapping[rowPinnedPosition] ?? [];\n            paneMetaMapping[rowPinnedPosition].push(meta);\n        })\n\n        return paneMetaMapping as Record<rowPinPositions, any[]>;\n    }\n\n    insertRowsAtIndexes(rowInsertMetas: IRowInsertMeta[], insertPosition ?: MovePosition): void {\n        this.dispatchEvent({\n            type : \"EVENT_BEFORE_RECORD_INSERTED\"\n        })\n        const paneMetaMapping = this.seperateMetaByPinPosition(rowInsertMetas);\n        let   minIndex        = this.getTotalCount();\n\n        Object.keys(paneMetaMapping).forEach((pinPosition) => {\n            const insertMetas : IRowInsertMeta[]= paneMetaMapping[pinPosition];\n            minIndex = insertMetas.reduce((minIndex, meta) => Math.min(minIndex, meta.rowIndex), minIndex);\n            const DataBlock = this.getPaneByPinPosition(pinPosition as rowPinPositions);\n            DataBlock.insertRowsAtIndexes(insertMetas, insertPosition);\n            const upcomingRowNodes = this.getUpcomingRowNodes(minIndex);\n            this.dispatchRowChange(upcomingRowNodes, \"insert\");\n        })\n\n        this.dispatchEvent({\n            type            : \"EVENT_RECORD_INSERTED\",\n            rowInsertMetas,\n        })\n    }\n\n    removeRows(rowDeleteMetas : IRowDeleteMeta[]) : void{\n        this.dispatchEvent({\n            type : \"EVENT_BEFORE_RECORD_REMOVED\"\n        })\n        const paneMetaMapping = {};\n        let   minIndex        = this.getTotalCount();\n        rowDeleteMetas.forEach((meta) => {\n            const {pinPosition = 'middle', rowIndex}   = meta;\n            paneMetaMapping[pinPosition] = paneMetaMapping[pinPosition] ?? [];\n            paneMetaMapping[pinPosition].push(meta);\n            minIndex = Math.min(minIndex, rowIndex);\n        })\n\n        Object.keys(paneMetaMapping).forEach((pinPosition) => {\n            const DataBlock = this.getPaneByPinPosition(pinPosition as rowPinPositions);\n            DataBlock.removeRows(paneMetaMapping[pinPosition]);\n            const upcomingRowNodes = this.getUpcomingRowNodes(minIndex);\n            this.dispatchRowChange(upcomingRowNodes, 'delete');\n        })\n\n        this.dispatchEvent({\n            type    : \"EVENT_RECORD_REMOVED\",\n            rowMetas: rowDeleteMetas\n        })\n    }\n\n    duplicateRows(_rowIndexes : number[]) : void {\n\n    }\n\n    setRowHeight(index : number | 'all', height : number, rowPinnedPosition : rowPinPositions = 'middle') : void {\n        let startIndex = 0;\n        const paneHandler = this.getPaneByPinPosition(rowPinnedPosition) as IRowBlockHandler;\n        if(index == 'all'){\n            paneHandler.setAllHeightTo(height);\n        }\n        else{\n            paneHandler.setHeight(index, height as number);\n            startIndex = index;\n        }\n        const upcomingRowNodes = this.getUpcomingRowNodes(startIndex);\n        this.dispatchRowChange(upcomingRowNodes, 'height');\n    }\n\n    setRowHeightByID(id : string, height : number) : void{\n        const index = this.getRelativeIndexByID(id);\n        if(index != null){\n            this.setRowHeight(index, height);\n        }\n    }\n\n    getRelativeCount(paneHandler : IRowBlockHandler) : number {\n        let count = 0;\n        const topCount = this.topHandler.getRowCount();\n        const middleCount = this.middleHandler.getRowCount();\n        const middleHandler = this.getMiddleHandler();\n        if(paneHandler == middleHandler){\n            count = topCount;\n        }\n        else if(paneHandler == this.bottomHandler){\n            count = topCount + middleCount;\n        } \n        return count;\n    }\n\n    getRelativeIndexByID(id : string) : number | null{\n        if(id == undefined){\n            return null;\n        }\n        // const tempArr = [this.topHandler, this.bottomHandler, this.summaryHandler, this.middleHandler];\n        const tempArr = [this.topHandler, this.bottomHandler, this.middleHandler];\n        let relativeIndex = null;\n        for(let i=0; i< tempArr.length; i++){\n            const paneHandler = tempArr[i];\n            const index = paneHandler.getIndexById(id);\n\n            if(index != -1){\n                const relativeCount = this.getRelativeCount(paneHandler);\n                relativeIndex = index + relativeCount;\n                break\n            }\n        }\n        return relativeIndex;\n    }\n\n    getRecordPaneByIndex(absoluteIndex : number) {\n        const topCount = this.topHandler.getRowCount();\n        const middleCount = this.middleHandler.getRowCount();\n        // const bottomCount = this.bottomHandler.getRowCount();\n\n        if(absoluteIndex < topCount){\n            return this.topHandler;\n        }\n        else if(absoluteIndex < topCount+middleCount){\n            return this.middleHandler;\n        }\n        // else if(absoluteIndex < topCount+middleCount+bottomCount){\n        //     return this.bottomHandler;\n        // }\n        // else{\n        //     return this.summaryHandler;\n        // }\n         else{\n            return this.bottomHandler;\n        }\n    }\n\n    getColumnHeaderID(index : number) : string {\n        return this.headerHandler.getIdByIndex(index);\n    }\n\n    getColumnHeaderHeight() : number {\n        return this.headerHandler.getTotalHeight();\n    }\n\n    getPreviousID(id : string) : string | null{\n        const index = this.getRelativeIndexByID(id);\n        return index != null ? this.getAbsoluteID(index-1) : null;\n    }\n\n    getNextID(id : string) : string | null{\n        const index = this.getRelativeIndexByID(id);\n        return index != null ? this.getAbsoluteID(index+1) : null;\n    }\n    \n    getPreviousLoadedID(id : string) : string | null{\n        const index = this.getRelativeIndexByID(id);\n        const node = this.getRowNodeByIndex(index-1);\n        if(node != null && node.isLoaded()){\n            return node.getId();\n        }\n        return null;\n    }\n\n    getNextLoadedID(id : string) : string | null{\n        const index = this.getRelativeIndexByID(id);\n        const node = this.getRowNodeByIndex(index+1);\n        if(node != null && node.isLoaded()){\n            return node.getId();\n        }\n        return null;\n    }\n\n    createExtraRowNode() {\n        const extraRowNode = {\n            getTop : () => {\n                this.middleHandler.getTotalHeight()\n            },\n            getRowHeight : () => {\n                this.optionsHandler.getExtraRowHeight();\n            },\n            \n        }\n        return extraRowNode;\n    }\n\n    getTopHandler() : IClientBlockHandler {\n        return this.topHandler;\n    } \n    getMiddleHandler() : IRowBlockHandler {\n        return this.middleHandler;\n    }\n    getBottomHandler() : IClientBlockHandler {\n        return this.bottomHandler;\n    } \n\n    getHeaderHandler() : any {\n        return this.headerHandler;\n    }\n    getSummaryHandler() : IClientBlockHandler {\n        return this.summaryHandler;\n    } \n\n    getFieldHeaderHandler() {\n        return this.headerHandler;\n    }\n\n    getMiddleRowIDByY(y : number) : string{\n        const row = this.middleHandler.getRowByPosition(y);\n        const rowID = this.middleHandler.getIdByIndex(row);\n        return rowID;\n    }\n\n    isInTopPane(index : number) : boolean {\n        const infoHandler = this.getRecordPaneByIndex(index);\n        return (infoHandler.getPinPosition() == ROW_PANE_TYPE.TOP);\n    }\n\n    isInMiddlePane(index : number) : boolean {\n        const infoHandler = this.getRecordPaneByIndex(index);\n        return (infoHandler.getPinPosition() == ROW_PANE_TYPE.MIDDLE);\n    }\n\n    isInBottomPane(index : number) : boolean {\n        const infoHandler = this.getRecordPaneByIndex(index);\n        return (infoHandler.getPinPosition() == ROW_PANE_TYPE.BOTTOM);\n    }\n\n    moveRows(sourceIndexes : IRowMeta[], targetIndex : IRowMeta, movePosition : MovePosition = 'after') : void {\n        this.middleHandler.moveRows(sourceIndexes, targetIndex, movePosition);\n    }\n\n    getDisplayIndexByPosition(top: number, left?: number): number {\n        return this.middleHandler.getDisplayIndexByPosition(top, left);\n    }\n\n    getSequenceRowNodesById(startId : string, endId : string) : (IRowNode | null)[] {\n        const startMeta  = this.getIndexMetaById(startId);\n        const endMeta    = this.getIndexMetaById(endId);\n        return this.getSequenceRowNodes(startMeta, endMeta);\n    }\n\n    \n    getSequenceRowsById(startId : string, endId : string) : string[] | null {\n        const rowNodeArr = this.getSequenceRowNodesById(startId, endId);\n        return rowNodeArr.map(rowNode => rowNode?.getId() ?? null);\n    }\n\n    getId(index : number, pinPosition : rowPinPositions = 'middle', parentKeys : string[] = []) : string{\n        if(index == null || index == undefined){\n            return null;\n        }\n        const paneHandler   = this.getPaneByPinPosition(pinPosition) as IRowBlockHandler;\n        const absoluteIndex = this.getIndexByMeta(index, pinPosition, parentKeys);\n        const relativeCount = this.getRelativeCount(paneHandler);\n        if(absoluteIndex == null){\n            this.errorHandler.throwError('row index does not exist : ' + index);\n            return null;\n        }\n        return paneHandler.getIdByIndex(absoluteIndex - relativeCount);\n    }\n\n    resetSort() : void {\n        this.middleHandler.resetSort?.();\n    }\n    applySort(sortKeys) : void{\n        this.middleHandler.applySort?.(sortKeys);\n    }\n    resetFilter():void {\n        this.middleHandler.resetFilter?.();\n    }\n    applyFilter(filterKeys: any) :void{\n        this.middleHandler.applyFilter?.(filterKeys);\n    }\n    resetGroup():void {\n        this.middleHandler.resetRowGrouping?.();\n    }\n    applyGroupBy(groupModel: any) :void{\n        this.middleHandler.applyGroupBy?.(groupModel)\n    }\n    getIndexMetaById(id : string, original : boolean = false) : IRowMeta {\n        const rowNode = this.floatingRecordHandler.isFloatingRecord(id) ? this.floatingRecordHandler.getFloatingRowNode() : this.getRowNodeById(id) as IRowNode;\n        if(!rowNode){\n            //this.errorHandler.throwError('row id does not exist : ' + id);\n            return null;\n        }\n        return rowNode.getRowMeta(original);\n        // const parentId   = rowNode.getParentId();\n        // let   parentKeys = [];\n        // let   rowIndex   = rowNode.getIndex();\n        // if(parentId && parentId != 'root'){\n        //     const parentNode = this.getRowNodeById(parentId) as IRowNodeCore;\n        //     rowIndex = parentNode.getChildIndexById(id);\n        //     parentKeys = parentNode ? parentNode.getGroupValues() : [];\n        // }\n        // return {\n        //     rowIndex,\n        //     pinPosition : rowNode.getPinnedPosition(),\n        //     parentKeys\n        // }\n    }\n\n    getRelativeRowMeta({rowIndex, pinPosition, parentKeys,absoluteRowIndex} : IRowMeta, added = 0) : IRowMeta {\n        // const absoluteIndex = this.getIndexByMeta(rowIndex, pinPosition, parentKeys) + added;\n        let absoluteIndex;\n        if (pinPosition === 'FloatingRecord') {\n            absoluteIndex = absoluteRowIndex + added;\n        } else {\n            absoluteIndex = this.getIndexByMeta(rowIndex, pinPosition, parentKeys) + added;\n        }\n        \n        const paneHandler   = this.getRecordPaneByIndex(absoluteIndex);\n        const relativeCount = this.getRelativeCount(paneHandler);\n        const targetIndex   = absoluteIndex - relativeCount;\n        const isInRange     = paneHandler.getRowCount() > 0 && (targetIndex >= 0 && targetIndex < this.getTotalCount());\n        return isInRange ? paneHandler.getRelativeRowMeta(targetIndex) : null;\n    }\n\n    getMetaByAbsoluteIndex(index : number) : IRowMeta {\n        const paneHandler   = this.getRecordPaneByIndex(index);\n        const relativeCount = this.getRelativeCount(paneHandler);\n        const absoluteIndex = index - relativeCount;\n        return paneHandler.getRelativeRowMeta(absoluteIndex);\n    }\n\n    getIndexByMeta(index : number, pinPosition : rowPinPositions = 'middle', parentKeys : string[] = []) : number {\n        const paneHandler   = this.getPaneByPinPosition(pinPosition) as IRowBlockHandler;\n        let absoluteIndex = paneHandler.getAbsoluteIndex(index, parentKeys, pinPosition);\n        // absoluteIndex = paneHandler.parseToDraftIndex(absoluteIndex, pinPosition);\n        const relativeCount = this.getRelativeCount(paneHandler);\n        return absoluteIndex != null ? absoluteIndex + relativeCount : null; \n    }\n\n    setAllRowHeightAs(height: number, pinPosition: rowPinPositions) : void {\n        const paneHandler = this.getPaneByPinPosition(pinPosition) as IRowBlockHandler;\n        paneHandler.setAllHeightTo(height);\n        const upcomingRowNodes = this.getUpcomingRowNodes(0);\n        this.dispatchRowChange(upcomingRowNodes, \"height\");\n    }\n\n    isRowPinned(rowId: string): boolean {\n        const rowNode = this.getRowNodeById(rowId) as IRowNode;\n        const pinPosition = rowNode.getPinnedPosition();\n        return pinPosition == ROW_PANE_TYPE.TOP || pinPosition == ROW_PANE_TYPE.BOTTOM;\n    }\n    \n    getTopPinnedIds(): string[] {\n        return this.topHandler.getIdsOrder();\n    }\n    getBottomPinnedIds(): string[] {\n        return this.bottomHandler.getIdsOrder();\n    }\n \n    private getSequence<T>(startMeta: IRowMeta, endMeta: IRowMeta, getItem: (paneHandler: IRowBlockHandler, index: number) => T): T[] {\n        let countingStarted = false;\n        let paneStartMeta = startMeta;\n        const items = [];\n        const startPinPos = startMeta.pinPosition;\n        const endPinPos = endMeta.pinPosition;\n        if (this.paneTypeOrder.indexOf(startPinPos) > this.paneTypeOrder.indexOf(endPinPos) || (startPinPos == endPinPos && startMeta.rowIndex > endMeta.rowIndex)) {\n            [startMeta, endMeta] = [endMeta, startMeta];\n        }\n\n        const callback = (paneHandler: IRowBlockHandler, loopIndex: number, totalArr) => {\n            let continueLoop = true;\n            const panePinPosition = paneHandler.getPinPosition();\n            if (!countingStarted && ((panePinPosition == startMeta.pinPosition) || (panePinPosition == 'middle' && (startMeta.pinPosition == 'middle' || startMeta.pinPosition == \"topDraftRow\" || startMeta.pinPosition == \"bottomDraftRow\")))) {\n                countingStarted = true;\n                paneStartMeta   = startMeta;\n            }\n            if (countingStarted) {\n                let paneEndMeta = endMeta;\n                if (panePinPosition != endMeta.pinPosition && (panePinPosition == \"middle\" && (endMeta.pinPosition != \"topDraftRow\" && endMeta.pinPosition != \"bottomDraftRow\"))) {\n                    paneEndMeta = {\n                        rowIndex: paneHandler.getLastRow(),\n                        pinPosition: panePinPosition\n                    };\n                } else {\n                    continueLoop = false;\n                }\n                const startIndex = paneHandler.getAbsoluteIndex(paneStartMeta.rowIndex, paneStartMeta.parentKeys, paneStartMeta.pinPosition);\n                const endIndex = paneHandler.getAbsoluteIndex(paneEndMeta.rowIndex, paneEndMeta.parentKeys, paneEndMeta.pinPosition);\n                const minIndex = Math.min(startIndex, endIndex);\n                const maxIndex = Math.max(startIndex, endIndex);\n                for (let i = minIndex; i <= maxIndex; i++) {\n                    const item = getItem(paneHandler, i);\n                    items.push(item);\n                }\n            }\n            paneStartMeta = { rowIndex: 0, parentKeys: [], pinPosition: totalArr[loopIndex]?.getPinPosition() };\n            return continueLoop;\n        };\n\n        this.loopThroughPinning(callback);\n        return items;\n    }\n\n    getSequenceRowNodes(startMeta: IRowMeta, endMeta: IRowMeta): IRowNode[] {\n        const getRowNode = (paneHandler: IRowBlockHandler, index: number) => paneHandler.getRowNode(index);\n        return this.getSequence(startMeta, endMeta, getRowNode) as IRowNode<any>[];\n    }\n\n    getSequenceRowMetas(startMeta: IRowMeta, endMeta: IRowMeta): IRowMeta[] {\n        const getRowMeta = (paneHandler: IRowBlockHandler, index: number) => paneHandler.getRelativeRowMeta(index);\n        return this.getSequence(startMeta, endMeta, getRowMeta);\n    }\n\n    loopThroughPinning(callback) : void {\n        const paneArr = [this.topHandler, this.middleHandler, this.bottomHandler];\n        for(let i = 0; i < paneArr.length; i++){\n            const pane         = paneArr[i];\n            const continueLoop = callback(pane, i, paneArr);\n            if(continueLoop == false) break;\n        }\n    }\n\n    getCountIncludePinned() : number {\n        return this.topHandler.getRowCount() + this.middleHandler.getRowCount() + this.bottomHandler.getRowCount();\n    }\n\n    getFirstIndexMeta(includeDraftRows : boolean = false) : IRowMeta {\n        const pinPosition = this.topHandler.getRowCount() > 0 ? 'top' :  this.middleHandler.getRowCount() > 0 ? 'middle' : 'bottom';\n        const paneHandler = this.getPaneByPinPosition(pinPosition) as IRowBlockHandler;\n        const rowMeta     = paneHandler.getFirstRowMeta(includeDraftRows);\n        return {rowIndex : rowMeta.rowIndex, pinPosition : rowMeta.pinPosition, parentKeys : rowMeta.parentKeys};\n    }\n    getLastIndexMeta(includeDraftRows : boolean = false) : IRowMeta {\n        const pinPosition = this.bottomHandler.getRowCount() > 0 ? 'bottom' : this.middleHandler.getRowCount() > 0 ?  'middle' : 'top';\n        const paneHandler = this.getPaneByPinPosition(pinPosition) as IRowBlockHandler;\n        const rowMeta     = paneHandler.getLastRowMeta(includeDraftRows);\n        return {rowIndex : rowMeta.rowIndex, pinPosition : rowMeta.pinPosition, parentKeys : rowMeta.parentKeys};\n    }\n\n    addStaticRow(index : number, parentKeys : string[] = []) : void{\n        const absoluteIndex = this.middleHandler.getAbsoluteIndex(index, parentKeys);\n        this.middleHandler.addStaticIndex(absoluteIndex);\n    }\n\n    removeStaticRow(index : number, parentKeys : string[] = []) : void {\n        const absoluteIndex = this.middleHandler.getAbsoluteIndex(index, parentKeys);\n        this.middleHandler.removeStaticIndex(absoluteIndex);\n    }\n\n    addStaticRowById(id : string) : void {\n        this.middleHandler.addStaticRowById(id);\n    }\n\n    removeStaticRowById(id : string) : void {\n        this.middleHandler.removeStaticRowById(id);\n    }\n\n    isValidRowMeta({pinPosition, parentKeys, rowIndex} : IRowMeta): boolean {\n        const paneHandler = this.getPaneByPinPosition(pinPosition);\n        return paneHandler.isValidRow(rowIndex, parentKeys, pinPosition);\n    }\n\n    resetRowCaches(rowCount ?: number)  : void{\n        const rowModelType  = this.optionsHandler.getRowModelType();\n        const middleHandler = this.getMiddleHandler() as IRemoteBlockHandler;\n        if(rowModelType == 'remote'){\n            const startRow = this.rowRenderController.firstRenderIndex;\n            const endRow   = this.rowRenderController.lastRenderIndex;\n            middleHandler.resetRowCaches(rowCount);\n            middleHandler.insertDraftRows();\n            middleHandler.updateViewPort({ startRow , endRow });\n\n            this.dispatchEvent({\n                type : 'EVENT_RECORD_UPDATED'\n            })\n        }\n    }\n\n    getChildCount(index : number, parentKeys : string[]) : number {\n        return this.middleHandler.getChildCount(index, parentKeys);\n    }\n\n    getWidth({rowIndex, pinPosition, parentKeys} : IRowMeta) : number {\n        const paneHandler = this.getPaneByPinPosition(pinPosition);\n        const absoluteIndex = this.getIndexByMeta(rowIndex, pinPosition, parentKeys);\n        return paneHandler.getWidth(absoluteIndex);\n    }\n\n    getRowsInDataCache() : number[] {\n        return this.middleHandler.getRowsInDataCache();\n    }\n\n    getVisibleIndexesByPosition(firstPixel: number, lastPixel: number, lastPixelLeft: number): number[] {\n        const isInColumnAutoFitExecution = this.columnAutofitHandler.getAutofitProgressState();\n        if(isInColumnAutoFitExecution){\n            return this.columnAutofitHandler.getMiddleRowsToBeProcessed();\n        }\n        return this.middleHandler.getVisibleIndexesByPosition(firstPixel, lastPixel, lastPixelLeft);\n    }\n\n    getRowNodeByMeta(rowMeta : IRowMeta) : IRowNodeCore | null {\n        if(rowMeta.pinPosition === \"columnHeader\") {\n            return null;\n        }\n        if(rowMeta.pinPosition === \"FloatingRecord\") {\n            return this.floatingRecordHandler.getFloatingRowNode();\n        }\n        const paneHandler = this.getPaneByPinPosition(rowMeta.pinPosition) as IRowBlockHandler;\n        return paneHandler.getRowNodeByRowMeta(rowMeta);\n    }\n\n    getGroupFirstRow(rowMeta : IRowMeta) : IRowMeta | null {\n        const rowNode = this.getRowNodeByMeta(rowMeta);\n\n        if(rowNode) {\n            const parentRowNode = rowNode.getParentNode();\n            if(parentRowNode) {\n                const index = 0;\n                return {\n                    rowIndex : index,\n                    parentKeys : rowMeta.parentKeys,\n                    pinPosition : rowMeta.pinPosition\n                }\n            }\n        }\n\n        return null;\n    }\n\n    getGroupLastRow(rowMeta : IRowMeta, includeDraftRows: boolean = true) : IRowMeta | null {\n        const parentLength = rowMeta.parentKeys.length;\n        const rootRowNode = this.middleHandler.getRootNode();\n        const parentId = parentLength > 0 ? rowMeta.parentKeys[parentLength - 1] : rootRowNode.getId();\n        if(!parentId) {\n            return null;\n        }\n        if((this.middleHandler as any).getLastRowInGroup){\n            const lastRowIndex = (this.middleHandler as any).getLastRowInGroup(parentId, includeDraftRows);\n            return  this.getMetaByAbsoluteIndex(lastRowIndex);\n        }\n        return this.middleHandler.getLastRowMeta(includeDraftRows);\n    }\n\n    getFirstLeafRowMeta(includeDraftRows: boolean = true) : IRowMeta {\n        const pinPosition = this.topHandler.getRowCount() > 0 ? 'top' :  this.middleHandler.getRowCount() > 0 ? 'middle' : 'bottom';\n        const paneHandler = this.getPaneByPinPosition(pinPosition) as IRowBlockHandler;\n        const rowMeta     = pinPosition === \"middle\" ? (paneHandler as any).getFirstLeafRowMeta(includeDraftRows) : paneHandler.getFirstRowMeta(includeDraftRows);\n        return {rowIndex : rowMeta.rowIndex, pinPosition : rowMeta.pinPosition, parentKeys : rowMeta.parentKeys};\n    }\n\n    getLastLeafRowMeta(includeDraftRows: boolean = true) : IRowMeta {\n        const pinPosition = this.bottomHandler.getRowCount() > 0 ? 'bottom' : this.middleHandler.getRowCount() > 0 ?  'middle' : 'top';\n        const paneHandler = this.getPaneByPinPosition(pinPosition) as IRowBlockHandler;\n        const rowMeta     = pinPosition === \"middle\" ? (paneHandler as any).getLastLeafRowMeta(includeDraftRows) : paneHandler.getLastRowMeta(includeDraftRows);\n        return {rowIndex : rowMeta.rowIndex, pinPosition : rowMeta.pinPosition, parentKeys : rowMeta.parentKeys};\n    }\n\n\n    getDeepestFirstLeaf(infoHandler, startRowMeta) {\n        let current = infoHandler.getRowNodeByRowMeta(startRowMeta);\n\n        while (current && current.isGroupRow()) {\n            current = infoHandler.getRowNodeByRowMeta({ rowIndex : 0, pinPosition : \"middle\", parentKeys : current.getGroupValues()});\n        }\n\n        return current.getRowMeta();\n    }\n\n    getTotalDraftCount() : number {\n        return this.middleHandler.getTotalDraftRowCount();\n    }\n\n    refreshDraftRows() : void {\n        this.middleHandler.refreshDraftRows();\n    }\n}\n\nexport { \n    RecordHandler\n}\n\n","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Constants/BeanName\";\nimport { Events } from \"../Constants/Events\";\nimport { IControllerHandler } from \"../Interface/IControllerHandler\";\nimport { IRecordHandler } from \"./RecordHandler.types\";\n\n@Bean(GRID_BEAN_NAME.ROW_MODEL)\nclass RowModel extends EventEmitter{\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler !: IRecordHandler;\n    \n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    // private dataFetcher: IDataFetcher;\n    \n    @PostConstruct()\n    init() {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        controllerHandler.onAfterGridReady(() => {\n            // const gridModelProvider = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_MODEL_PROVIDER);\n            // this.dataFetcher = gridModelProvider.getDataFetcher();\n        })\n    }\n\n    setRowData(configuration: any) : void {\n        this.recordHandler.constructRecordInfoHandler(configuration);\n\n        // const middleHandler = this.recordHandler.getMiddleHandler();\n        // this.dataFetcher.init(middleHandler);\n\n        this.eventHandler.dispatchEvent({\n            type          : Events.EVENT_ROW_DATA_LOADED,\n            initial       : true,\n            viewPortChange: true\n        } as any)\n    }\n}\n\n\nexport {\n    RowModel\n}","import { EventHandler } from \"@dg/corecomponent\";\nimport { ROW_NODE_EVENTS } from \"../Constants/Events\";\nimport { defaultRowHeight, rowPinPositions } from \"../Constants/GridConfigurationConstants\";\nimport { IFieldHeaderRowPinnedDefinition, IFullWidthType, IRowDefinition } from \"../Interface/IRowDefinitions\";\nimport { IFieldHeaderRowNode, IRowNode, IRowNodeDS, IRowNodeHelper } from \"../Interface/IRowNode\";\nimport { findValueByKey } from \"../utils/Generic\";\nimport { RowNodeCore } from \"../../../DataStore/RowNodeCore\";\nimport { IRowMeta } from \"../../API/CommonAPIInterface\";\nimport { ITaskData } from \"../../../GanttModelClasses/IGanttConfiguration\";\n \nconst headerPosition : rowPinPositions = 'columnHeader';\nclass RowNode extends RowNodeCore implements IRowNode {\n    public    rowData        : IRowNodeDS;\n    public    helper         : IRowNodeHelper;\n   \n    public    key            : number\n    protected parentId       : string;\n    level: number;\n\n    \n\n    constructor(helper : IRowNodeHelper, id : string, definition ?: (IRowDefinition & {pinPosition ?: rowPinPositions}), data ?: any) {\n        super(helper, id, definition, data);\n        this.helper = helper;\n        this.rowData = RowNode.constructNode(id, definition, data);\n        Object.seal(this.rowData);\n    } \n    \n    static constructNode(id : string,sourceData ?: IRowDefinition & {pinPosition ?: rowPinPositions}, data ?: any) : IRowNodeDS {\n        return {\n            id,\n            pinned          : sourceData?.pinPosition ?? 'middle',\n            height          : defaultRowHeight,\n            readOnly        : sourceData?.readonly ?? null,\n            locked          : sourceData?.locked ?? null,\n\n            dragging        : null,\n            selected        : null,\n            computedHeight  : null,\n            data,\n            loadedState     : false,\n            isRendered      : false,\n            userParams      : sourceData?.userParams ?? {},\n            definition      : sourceData,\n            hidden          : sourceData?.hidden ?? false,\n            fullWidthRow    : sourceData?.fullWidth ?? 'none',\n            isExpandable    : sourceData?.expandableRow ?? false,\n            cssClasses      : sourceData?.cssClasses ?? '',\n        }\n    }\n\n\n    updateDefinition(definition: IRowDefinition, force = false) : void {\n\n        const constructedDefinition = {\n            readOnly        : definition?.readonly ?? null,\n            locked          : definition?.locked ?? null,\n            userParams      : definition?.userParams ?? {},\n            definition      : definition,\n            hidden          : definition?.hidden ?? false,\n            fullWidthRow    : definition?.fullWidth ?? 'none',\n            isExpandable    : definition?.expandableRow ?? false,\n            cssClasses      : definition?.cssClasses ?? '',\n        };\n\n        if(!force){\n            Object.keys(constructedDefinition).forEach(key => {\n                (definition[key] == undefined) && (delete constructedDefinition[key]);\n            });\n        }\n        this.rowData = {\n            ...this.rowData,\n            ...constructedDefinition\n        }\n    }\n\n    isEndDatePrioritizedForMilestone() : boolean {\n        return this.helper.isEndDatePrioritizedForMilestone();\n    }\n\n    isFlexibleMilestone() : boolean {\n        return this.helper.isFlexibleMilestone();\n    }\n\n    getStartDate() : Date | number | null{\n        const rowData = this.getRowData();\n\n        if(this.isMilestone() && this.isEndDatePrioritizedForMilestone()){\n            if(rowData.startDate && rowData.endDate){\n                return rowData.endDate;\n            }else {\n                return null\n            }\n        }\n        return rowData.startDate;\n    }\n\n    getEndDate() : Date {\n        const rowData = this.getRowData();\n        // if(this.isMilestone() && !this.isEndDatePrioritizedForMilestone()){\n        //     return rowData.startDate;\n        // } \n        return rowData.endDate;\n    }\n\n\n    getGroupHeight() : number {\n        return this.getHeight();\n    }\n\n    isMilestone() : boolean {\n        const rowData = this.getRowData();\n        return rowData.milestone;\n    }\n    \n    hasTask() : boolean {\n        const rowData = this.getRowData();\n        return rowData.startDate || rowData.endDate;\n    }\n\n    getDependencies() : ITaskData['dependencies'] {\n        const rowData = this.getRowData();\n        return rowData.dependencies;\n    }\n\n    isTaskRendered():boolean{\n        const rowData = this.getRowData();\n        if(rowData.milestone){\n            if(rowData.endDate){\n                return true;\n            }\n\n        }\n        if(rowData.startDate && rowData.endDate && rowData.startDate < rowData.endDate){\n            return true;\n        }\n        return false;\n    }\n\n    getCssClasses() : string {\n        return this.rowData.cssClasses;\n    }\n\n    getLevel() : number {\n        return this.level ?? 0;\n    }\n\n    updateLevel(level : number) : void {\n        this.level = level;\n    }\n  \n    \n    updateHeight(height: number): void {\n        const index             = this.getIndex();\n        const updatedRowNodes   = this.helper.getUpcomingRowNodes(index);\n        this.helper.setHeight(index, height);\n        this.helper.dispatchRowHeightChange(updatedRowNodes);\n    }\n\n    setParentId(id : string) {\n        this.parentId = id;\n    }\n\n    getParentId() : string {\n        return this.parentId;\n    }\n\n    // getParentNode() {\n    //     return this.helper.getRowNodeById(this.parentId);\n    // }\n\n    getAncestors(): any[] {\n        let parent = this.helper.getRowNodeById(this.parentId);\n        const ancestors = [];\n        while(parent?.getLevel() > 0){\n            ancestors.push(parent);\n            const parentId = parent.getParentId();\n            parent = this.helper.getRowNodeById(parentId);\n        }\n        return ancestors;\n    }\n\n    isExist() : boolean {\n        return this.helper.getRowNodeById(this.getId()) !== null;\n    }\n\n    getRowMeta(original : boolean = false) : IRowMeta {\n        const isFloatingRecord = this.isRecordFloating();\n        if(!original && isFloatingRecord){\n            return {\n                pinPosition : 'FloatingRecord',\n                rowIndex    : 0,\n                parentKeys  : []\n            }\n        }\n        const absoluteIndex = this.getIndex();\n        return this.helper.getRelativeRowMeta(absoluteIndex);\n    }\n    //getters\n    \n    \n    getPinnedPosition() : rowPinPositions{\n        return this.rowData.pinned;\n    }\n\n    isReadOnly() : boolean | null{\n        return this.rowData.readOnly;\n    }\n    isLocked() : boolean | null{\n        return this.rowData.locked;\n    }\n    isEditable() : boolean | null{\n        return !this.isReadOnly()  && !this.isLocked();\n    }\n    isDragging() : boolean | null{\n        return this.rowData.dragging;\n    } \n    isSelected() : boolean | null{\n        return this.rowData.selected;\n    } \n\n    getUserParams() : any {\n        return this.rowData.userParams;\n    }\n\n    getData() {\n        return this.rowData.data;\n    }\n\n    getDataByKey(key : string) {\n        const data = this.getData();\n        return findValueByKey(data, key);\n    }\n\n    isRendered() : boolean {\n        return this.rowData.isRendered;\n    }\n \n    isFullWidthRow(): boolean {\n        return this.getFullWidthType() !== 'none';\n    }\n\n    isExtraRow() : boolean {\n       return this.helper.isExtraRow(this.rowData.id);\n    }\n\n    getFullWidthType() : IFullWidthType {\n        return this.rowData.fullWidthRow;\n    }\n    \n    updateRendered(state : boolean) : void {\n        this.rowData.isRendered = state;\n    }\n\n    setPinnedPosition(pinPosition : rowPinPositions) : void{\n        this.rowData.pinned = pinPosition;\n    }\n    \n    modifyData(key : string, value : any) : void {\n        this.rowData.data[key] = value\n    } \n    setReadOnlyState(state : boolean) : void{\n        this.rowData.readOnly = state;\n    }\n    setLockedState(state : boolean) : void{\n        this.rowData.locked = state;\n    }\n    setDraggingState(state : boolean) : void{\n        this.rowData.dragging = state;\n        this.dispatchEvent({\n            type : \"EVENT_ROW_DRAGGING\"\n        })\n    }\n    setSelectedState(state : boolean) : void{\n        this.rowData.selected = state;\n    }\n    \n    updateUserParams(params : any) : void {\n        this.rowData.userParams = params;\n    }\n\n    \n\n    // event\n\n    addEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.addEventListener(eventType, listener, async);\n    }\n    removeEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.removeEventListener(eventType, listener, async);\n    }\n    onMouseEnter() {\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENT_MOUSE_ENTER\n        })\n    }\n    onMouseLeave() {\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENT_MOUSE_LEAVE\n        })\n    }\n    onRowTopChange() {\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENT_ROW_TOP_CHANGE\n        })\n    }\n    onRowHeightChange() {\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENT_ROW_HEIGHT_CHANGE\n        })\n    }\n\n    onRowIndexChange(): void {\n        this.dispatchEvent({\n            type : ROW_NODE_EVENTS.EVENT_ROW_INDEX_CHANGE\n        })\n    }\n}\n\nclass FieldHeaderRowNode {\n    private headerData     : IFieldHeaderRowNode;\n    helper: any;\n\n    constructor(helper : any, id : string, data ?: IFieldHeaderRowPinnedDefinition){\n        this.helper = helper;\n        this.headerData = FieldHeaderRowNode.constructNode(id, data);\n        Object.seal(this.headerData);\n    }\n    \n\n    static constructNode(id : string,sourceData ?: IFieldHeaderRowPinnedDefinition) : IFieldHeaderRowNode{\n        return {\n            id,\n            pinned            : sourceData?.pinned ?? headerPosition,\n            rowHeight         : defaultRowHeight,\n            readOnly          : sourceData?.readonly ?? null,\n            locked            : sourceData?.locked ?? null,\n\n            dragging      : null,\n            selected      : null,\n            computedHeight: null,\n            data          : {},\n            userParams    : sourceData?.userParams ?? {}\n        }\n    }\n\n    // private dispatchEvent(event : DGEvent) {\n    //     if (this.eventHandler) {\n    //         this.eventHandler.dispatchEvent(event);\n    //     }\n    // }\n\n    //getters\n\n    getIndex() : number {\n        return 0;\n    }\n\n    getTop() : number {\n        return 0;\n    }\n\n    getHeight() : number {\n        return  this.helper.getRowHeight(this.headerData.id);\n    }\n\n    isLoaded() : boolean {\n        return true;\n    }\n\n    getLevel() : number {\n        return 0;\n    }\n\n    isGroupRow() : boolean {\n        return false;\n    }\n\n    getRowMeta(): IRowMeta {\n        return {\n            pinPosition : null,\n            rowIndex    : 0,\n            parentKeys  : []\n        }\n    }\n\n    getDataByKey() {\n        return null;\n    }\n\n    isEditable() {\n        return null;\n    }\n\n    getRowData() {\n        return null;\n    }\n    \n    getId() : string {      //no setter\n        return this.headerData.id;\n    }\n    getPinnedPosition() : rowPinPositions{\n        return this.headerData.pinned;\n    } \n    // getSelectable() : boolean | null{\n    //     return this.headerData.selectable;\n    // }\n    isReadOnly() : boolean | null{\n        return this.headerData.readOnly;\n    }\n    isLocked() : boolean | null{\n        return this.headerData.locked;\n    }\n    isDragging() : boolean | null{\n        return this.headerData.dragging;\n    } \n    isSelected() : boolean | null{\n        return this.headerData.selected;\n    }\n    // getComputedHeight() : number | null{\n    //     return this.headerData.computedHeight;\n    // }\n\n    getData() {\n        return this.headerData.data;\n    }\n\n\tgetUserParams() : any {\n        return this.headerData.userParams;\n    }\n\n    //setters\n\n    modifyData(key : string, value : any) : void {\n        this.headerData.data[key] = value\n    }\n    // setData<TData>(data : TData) : void {\n    //     this.headerData.data = data;\n    // }\n    // setRowHeight(height : number) : void{\n    //     this.headerData.rowHeight = height;\n    // }\n    setReadOnlyState(state : boolean) : void{\n        this.headerData.readOnly = state;\n    }\n    setLockedState(state : boolean) : void{\n        this.headerData.locked = state;\n    }\n    setDraggingState(state : boolean) : void{\n        this.headerData.dragging = state;\n    }\n    setSelectedState(state : boolean) : void{\n        this.headerData.selected = state;\n    }\n    setPinnedPosition(pinPosition : rowPinPositions) : void{\n        this.headerData.pinned = pinPosition;\n    }\n    // setComputedHeight(height : number) : void{\n    //     this.headerData.computedHeight = height;\n    // }\n\n    updateUserParams(userParams : any) : void {\n        this.headerData.userParams = userParams;\n    }\n\n    \n}\n\n\nexport {\n    FieldHeaderRowNode,\n    RowNode\n}","import { CellController } from '../../GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController';\nimport { RowController } from '../../GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController';\nimport { GRID_BEAN_NAME } from '../Constants/BeanName';\nimport { Events, ROW_REORDER_EVENT } from '../Constants/Events';\nimport { IControllerHandler } from '../Interface/IControllerHandler';\nimport { SummaryRowController } from '../../GridComponent/GridBodyComponent/RowContainer/Rendering/Row/Summary/SummaryRowController';\nimport { traverseObject } from '../utils/Generic';\nimport { IRowNode } from '../Interface/IRowNode';\nimport { ControllerHandler } from '../ControllerHandler/ControllerHandler';\nimport { ROW_PANE_TYPE, defaultRowHeight, rowPinPositions } from '../Constants/GridConfigurationConstants';\nimport { COLUMN_PANE_TYPE, FieldHandler } from '../Columns/FieldHandler';\nimport { IUserPresenceEventParams } from '../UserPresence/Interface/IUserPresenceEventParams';\nimport { FloatingRecordHandler } from '../../FloatingRecords/FloatingRecordHandler';\nimport { IFloatingRecordHandler } from '../../FloatingRecords/Interface/IFloatingRecordHandler';\nimport { RequestAnimationFrameHandler, Priority } from '../RequestAnimationFrame/RequestAnimationFrameHandler';\nimport { AutoWired, BEAN_NAME, Bean, EventEmitter, Optional, PostConstruct, getBeanInstanceByBeanName } from '@dg/corecomponent';\nimport { HeaderCellController } from '../../GridComponent/Header/Cell/HeaderCellController';\nimport { IRowMeta, RefreshCellParams } from '../../API/CommonAPIInterface';\nimport { IColumnNode } from '../Interface/IColumnNode';\nimport { RowBufferHandler } from '../Buffer/row/RowBufferHandler';\nimport { IRowBlockHandler } from '../../../DataStore/rowblock-handler.types';\nimport { StickyRowRenderer } from '../../../sticky-row/sticky-row-renderer';\nimport { IRowRendererWrapper } from '../../../sticky-row/sticky-row-renderer.types';\nimport { IRowNodeCore } from '../../../DataStore/rownode.types';\nimport { CellPositionType } from '../Navigation/cell-position.types';\nimport { ICellEditorComponent, ICellRendererComponent, IGridConfiguration, IRefreshColumn } from '../../Main';\nimport { IGridCellEditorHandler } from '../../GridComponent/Editor/GridCellEditorHandler';\n// import { IFocusHandler } from '../Navigation/focus-handler.types';\nimport { IRecordHandler } from './RecordHandler.types';\nimport { NavigationService } from '../../../Navigation/navigation-handler';\nimport { executeOncePerAnimationFrame } from '../utils/GridUtilities';\nimport { RowHoverHandler } from '../RowHoverHandler';\nimport { CoreStateHandler } from '../CoreStateHandler';\nimport { GridOptioHandler } from '../GridOptionHandler';\n\n\ninterface RowControllerMap {\n\t[key: string]: RowController;\n}\ninterface IRefreshParam {\n\trecycleRows      ?: boolean;\n\tanimate          ?: boolean;\n\tsuppressKeepFocus?: boolean;\n\tonlyBody         ?: boolean;\n\tnewData          ?: boolean;\n\tnewPage          ?: boolean;\n\tdomLayoutChanged ?: boolean;\n\tfloating         ?: boolean;\n\tfocus            ?: boolean;\n\trefreshCells     ?: boolean;\n\tviewPortChange ?: boolean;\n}\n@Bean(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER)\nclass RowRenderController extends EventEmitter {\n\t@AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler! : IRecordHandler;\n\t@AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler    : FieldHandler;\n\t@Optional ('stickyRowRenderer') private stickyRowRenderer        : StickyRowRenderer;\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!   : getBeanInstanceByBeanName;\n\t@AutoWired(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) private gridCellEditorHandler! : IGridCellEditorHandler\n\t@AutoWired(GRID_BEAN_NAME.REQUESTANIMATIONFRAME) private rafHandler: RequestAnimationFrameHandler;\n\n\tprivate        topRowCtrls: RowController[]     = [];\n\tprivate        bottomRowCtrls: RowController[]  = [];\n\tcenterRowCtrls: RowController[]                 = [];\n\tprivate        summaryRowCtrls: RowController[] = [];\n\n\tprivate rowControllerByIndex: RowControllerMap = {};\n\n\tprivate refreshTaskIndex : number = 0;\n\tprivate animationFrameId: number | null = null;\n\n\t\n\n\tprivate firstRenderIndexMeta : IRowMeta = {rowIndex : null, parentKeys : [], pinPosition : null};\n\tprivate lastRenderIndexMeta  : IRowMeta = {rowIndex : null, parentKeys : [], pinPosition : null};\n\tprivate firstRenderIndex     : number;\n\tprivate lastRenderIndex      : number;\n\n\tprivate firstPixel : number;\n\tprivate lastPixel  : number;\n\n\tprivate firstVisiblePixel : number;\n\tprivate lastVisiblePixel  : number;\n\n\tprivate totalHeight : number = 0;\n\n\n\tpublic  editorState   : { rowID: string; columnID: string , rowNode : IRowNode, columnNode : IColumnNode};\n\tprivate middleHandler : IRowBlockHandler;\n\tlastPixelLeft: number;\n\n\t@PostConstruct()\n\tinit() {\n\t\tconst controller = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER, ) as ControllerHandler;\n\n\t\tcontroller.onAfterGridReady(() => {\n\t\t\tconst recordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER );\n\t\t\tthis.middleHandler = recordHandler.getMiddleHandler();\n\t\t\tthis.rowInit();\n\t\t});\n\n\t\tif(this.stickyRowRenderer) {\n\t\t\tconst wrapper = new RowRenderController.StickyRowRendererWrapper(this);\n\t\t\tthis.stickyRowRenderer.init(wrapper);\n\t\t}\n\t}\n\n\tprivate load(param) {\n\t\tlet params = {\n\t\t\trecycleRows   : param.recycleRows,\n\t\t\tonlyBody      : param.onlyBody,\n\t\t\tfocus         : param.focus,\n\t\t\trefreshCells  : false,\n\t\t\tviewPortChange: param.viewPortChange\n\t\t};\n\t\tif (param.floating) {\n\t\t\tconst floatingRecordRenderer = this.isFloatingRecordRendered();\n\t\t\tif (floatingRecordRenderer) {\n\t\t\t\tparams = { ...params, ...{ floating: true }, };\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.refreshAfterModelUpdate(params);\n\t}\n\tprivate onScrollRefresh(): void {\n\t\tthis.rafHandler.createTask(() => {\n\t\t\tthis.refresh({});\n\t\t}, this.refreshTaskIndex++, Priority.high);\n\t}\n\n\tprivate rowInit(): void {\n\t\tthis.addListener( this.eventHandler, Events.EVENT_VERTICAL_SCROLL, this.onScrollRefresh.bind(this)  ); \n\t\tconst requestAnimationFrameLoadMethod = executeOncePerAnimationFrame((param: any)=>{\n\t\t\tif(this.isAlive()) {\n\t\t\t\tthis.load(param);\n\t\t\t}\n\t\t}) as any;\n\t\tthis.addListener( this.eventHandler, Events.EVENT_VERTICAL_SCROLL, this.refresh.bind(this) );\n\t\tthis.addListener( this.eventHandler, Events.EVENT_ROW_DATA_LOADED, (param)=>{\n\t\t\tthis.animationFrameId = requestAnimationFrameLoadMethod({immediateRender : false, ...param});\n\t\t}) as any;\n\t\tthis.addListener(this.eventHandler, ROW_REORDER_EVENT.EVENT_ROW_REORDERED,(params) => {\n\t\t\tthis.refreshAfterModelUpdate(params);\n\t\t\tconst editingCell = this.gridCellEditorHandler.getCellPosition();\n\t\t\tif(editingCell) {\n\t\t\t\t(this.getBeanInstanceByBeanName('navigationService') as NavigationService).ensureCellVisible(editingCell);\n\t\t\t\t// (this.getBeanInstanceByBeanName('navigationService') as NavigationService).focusPosition(editingCell, null, 'api');\n\t\t\t}\n\t\t})\n\t\tthis.refreshAfterModelUpdate();\n\n\t\tthis.addListener( this.eventHandler, Events.EVENT_USER_PRESENCE_UPADTED, this.onUserPresenceUpdated.bind(this), );\n\t\tthis.addListener( this.eventHandler, Events.EVENT_FLOATING_RECORD_ADDED, (params) => {\n\t\t\tthis.refreshCells({newData : true, force : true})\n\t\t\tthis.refreshAfterModelUpdate(params);\n\t\t});\n\t\tthis.addListener( this.eventHandler, Events.EVENT_FLOATING_RECORD_REMOVED, (params) => {\n\t\t\tthis.refreshCells({newData : true, force : true})\n\t\t\tthis.refreshAfterModelUpdate(params);\n\t\t} );\n\t\tthis.addListener( this.eventHandler, Events.EVENT_FLOATING_RECORD_CHANGED,(params) => {\n\t\t\tthis.refreshCells({newData : true, force : true})\n\t\t\tthis.refreshAfterModelUpdate(params);\n\t\t} );\n\n\t\tthis.addListener(this.eventHandler, 'columnResized', this.refreshColumnAfterModelUpdate.bind(this));\n\t\tthis.addListener(this.eventHandler, 'cellFocused', this.onCellFocused.bind(this));\n\t\tthis.addListener(this.eventHandler, 'cellFocusCleared', this.onCellFocused.bind(this));\n\t\tthis.addListener(this.eventHandler, Events.EVENT_RANGE_SELECTION_CHANGED, this.onRangeSelectionChanged.bind(this))\n\t\tthis.addListener(this.eventHandler, 'rowSelectionChanged', this.onRowSelected.bind(this));\n\t\tthis.addListener(this.eventHandler, 'columnSelectionChanged', this.onColumnSelectionChanged.bind(this));\n\t\tthis.addListener(this.eventHandler, Events.EVENT_COLUMN_REFRESH,this.refreshColumnAfterModelUpdate.bind(this))\n\t\tthis.addListener(this.eventHandler, Events.EVENT_AUTO_UNPINNED_LEFT_COLUMNS_REFRESH,this.refreshColumnAfterModelUpdate.bind(this))\n        this.addListener(this.eventHandler, Events.EVENT_CELL_REFRESH, this.refreshCells.bind(this));\n\t\tthis.addListener(this.eventHandler, Events.EVENT_GRID_REFRESH, this.load.bind(this));\n\t\tthis.addListener(this.eventHandler, Events.EVENT_HEADER_ROW_CELL_REFRESH, this.refreshHeaderRowCells.bind(this));\n\t\tthis.addListener(this.eventHandler, Events.EVENT_ROW_COLLAPSED, (_params : any) => {\n\t\t\tthis.getAllRowControllers().forEach(rowController => {\n\t\t\t\trowController.expandCollapseRow();\n\t\t\t})\n\t\t\t\t\n\t\t})\n\t\tthis.addListener(this.eventHandler, Events.EVENT_ROW_EXPANDED, (_params : any) => {\n\t\t\tthis.getAllRowControllers().forEach(rowController => {\n\t\t\t\trowController.expandCollapseRow();\n\t\t\t})\n\t\t})\n\n\t\tconst recordInsertLoad = executeOncePerAnimationFrame((params: any)=>{\n\t\t\tthis.refreshAfterModelUpdate(params);\n\t\t\tconst editingCell = this.gridCellEditorHandler.getCellPosition();\n\t\t\tif(editingCell) {\n\t\t\t\t(this.getBeanInstanceByBeanName('navigationService') as NavigationService).ensureCellVisible(editingCell);\n\t\t\t\t(this.getBeanInstanceByBeanName('navigationService') as NavigationService).focusPosition(editingCell, null, 'api', true, true, false);\n\t\t\t}\n\t\t}) as any;\n\t\tthis.addListener(this.eventHandler, 'RECORD_INSERT', (params ) => {\n\t\t\trecordInsertLoad(params);\n\t\t})\n\n\t\tthis.addListener(this.eventHandler, 'RECORD_DELETE', (params ) => {\n\t\t\tthis.refreshAfterModelUpdate(params);\n\t\t\tconst editingCell = this.gridCellEditorHandler.getCellPosition();\n\t\t\tif(editingCell) {\n\t\t\t\t(this.getBeanInstanceByBeanName('navigationService') as NavigationService).ensureCellVisible(editingCell);\n\t\t\t\t(this.getBeanInstanceByBeanName('navigationService') as NavigationService).focusPosition(editingCell, null, 'api', true, true, false);\n\t\t\t}\n\t\t})\n\n\t\tthis.addListener(this.eventHandler, Events.EVENT_GRID_DIMENSION_CHANGED, this.refresh.bind(this));\n\t\tthis.addListener(this.eventHandler, Events.EVENT_GRID_CONFIGURATION_UPDATED, this.onGridConfigurationUpdated.bind(this));\n\n\t\tthis.dispatchEvent(\n\t\t\t{\n\t\t\t\ttype : Events.EVENT_ON_ZERO_ROWS\n\t\t\t}\n\t\t)\n\n}\n\n\tprivate onGridConfigurationUpdated(event : any) {\n\t\tconst configuration : IGridConfiguration = event.configuration;\n\t\tif(configuration.rowHighlighter != undefined && configuration.rowHighlighter == false){\n\t\t\tconst rowHoverHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_HOVER_HANDLER) as RowHoverHandler;\n\t\t\trowHoverHandler.clearMouseOver(null);\n\t\t}\n\t}\n\n\tprivate isFloatingRecordRendered(): boolean {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\treturn floatingRecordHandler.isFloatingRecordRendered();\n\t}\n\n\tprivate refreshExtraRow() : void {\n\t\tconst extraRowHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.EXTRA_RECORD_HANDLER);\n\t\textraRowHandler.createExtraRowController();\n\t}\n\n\tprivate refreshPinnedRowComponent( rowControllers: RowController[], infoHandler: IRowBlockHandler ): void {\n\t\tfor (let i = 0; i < rowControllers.length; i++) {\n\t\t\trowControllers[i].destroy();\n\t\t}\n\n\t\trowControllers.length = 0;\n\n\t\tif (!infoHandler) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( let index = infoHandler.getFirstRow(); index < infoHandler.getRowCount(); index++ ) {\n\t\t\tconst rowNode = infoHandler.getRowNode(index) as IRowNode;\n\t\t\tif (rowNode != null) {\n\t\t\t\tconst rowCtrl = this.createRowController(rowNode);\n\t\t\t\trowControllers.push(rowCtrl);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate refreshSummaryRowComponent( rowControllers: RowController[], summaryInfoHandler: IRowBlockHandler ): void {\n\t\tfor (let i = 0; i < rowControllers.length; i++) {\n\t\t\trowControllers[i].destroy();\n\t\t}\n\n\t\trowControllers.length = 0;\n\n\t\tif (!summaryInfoHandler) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( let index = summaryInfoHandler.getFirstRow(); index < summaryInfoHandler.getRowCount(); index++ ) {\n\t\t\tconst rowNode = summaryInfoHandler.getRowNode(index) as IRowNode;\n\t\t\tif (rowNode != null) {\n\t\t\t\tconst rowCtrl = this.createSummaryRowController(rowNode);\n\t\t\t\trowControllers.push(rowCtrl);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate refreshFloatingRowComponent( rowControllers: RowControllerMap, middleHandler: IRowBlockHandler ): void {\n\n\t\tconst rowControllerValues = Object.values(rowControllers);\n\t\tfor (let i = 0; i < rowControllerValues.length; i++) {\n\t\t\trowControllerValues[i].destroy();\n\t\t}\n\n\t\tif (!middleHandler) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\n\t\tfloatingRecordHandler.emptyFloatingRecordController();\n\n\t\tconst isRelativeFloatingRecord = this.optionsHandler.isRelativeFloatingRecord();\n\t\tif (isRelativeFloatingRecord) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst floatingRowNode = floatingRecordHandler.getFloatingRowNode() as IRowNode;\n\t\tif (floatingRowNode) {\n\t\t\tif (floatingRowNode.isLoaded()) {\n\t\t\t\tconst rowCtrl = this.createRowController(floatingRowNode);\n\t\t\t\tfloatingRecordHandler.setFloatingRecordController(rowCtrl);\n\t\t\t}\n\t\t}\n\t}\n\tprivate getRowBufferInPixels() {\n\t\tconst rowsToBuffer = this.optionsHandler.getBufferSize();\n\t\t// const defaultRowHeight = this.optionsHandler.getRowHeightForNode();\n\n\t\treturn rowsToBuffer * defaultRowHeight;\n\t}\n\n\trefresh(params : IRefreshParam) {\n\t\tif (!this.isAlive() || !this.middleHandler) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst previousFirstRenderIndexMeta = this.firstRenderIndexMeta;\n\t\tconst previousLastRenderIndexMeta = this.lastRenderIndexMeta;\n\n\t\tthis.findFirstAndLastRowsToRender();\n\n\t\tlet hasStickyRowChanged = true;\n\t\tconst suppressGroupRowsSticky=  this.optionsHandler.suppressGroupRowsSticky()\n\t\tif (this.stickyRowRenderer && !suppressGroupRowsSticky) {\n            hasStickyRowChanged = this.stickyRowRenderer.updateStickyRows();\n\t\t}\n\n\t\t\n\t\tconst viewPortchange = (this.firstRenderIndexMeta.rowIndex !== previousFirstRenderIndexMeta.rowIndex) || (this.firstRenderIndexMeta.parentKeys.toString() !== previousFirstRenderIndexMeta.parentKeys.toString()) ||\n\t\t\t\t\t\t\t\t(this.lastRenderIndexMeta.rowIndex !== previousLastRenderIndexMeta.rowIndex) || (this.lastRenderIndexMeta.parentKeys.toString() !== previousLastRenderIndexMeta.parentKeys.toString());\n\t\tif (!hasStickyRowChanged && !viewPortchange) {\n\t\t\treturn;\n\t\t}\n\n\t\t\n\n\t\t// this.middleHandler.onViewportChange(\n\t\t// \tthis.firstRenderIndex,\n\t\t// \tthis.lastRenderIndex,\n\t\t// );\n\n\t\tthis.recycleRows(null, params);\n\n\t\tthis.dispatchDisplayedRowsChanged();\n\t}\n\n\tprivate removeRowComponents(indexesToDraw: number[]): void {\n\t\tconst indexesToDrawMap: { [index: string]: boolean } = {};\n\t\tfor (let i = 0; i < indexesToDraw.length; i++) {\n\t\t\tindexesToDrawMap[indexesToDraw[i]] = true;\n\t\t}\n\n\t\tconst existingIndexes = Object.keys(this.rowControllerByIndex);\n\t\tconst indexesNotToDraw: string[] = existingIndexes.filter(\n\t\t\t(index) => !indexesToDrawMap[index],\n\t\t);\n\n\t\tthis.removeRowControllers(indexesNotToDraw);\n\t}\n\n\tprivate removeRowControllers(rowsToRemove: any[]) {\n\t\tconst controllersToDestroy: RowController[] = [];\n\t\t\n\t\tfor (let i = 0; i < rowsToRemove.length; i++) {\n\t\t\tconst indexToRemove = rowsToRemove[i];\n\t\t\tconst rowController = this.rowControllerByIndex[indexToRemove];\n\t\t\tif(rowController){\n\t\t\t\tcontrollersToDestroy.push(rowController);\n\t\t\t}\n\t\t\tdelete this.rowControllerByIndex[indexToRemove];\n\t\t}\n\n\t\tif (controllersToDestroy.length > 0) {\n\t\t\tthis.rafHandler.createTask(() => {\n\t\t\t\tfor (let i = 0; i < controllersToDestroy.length; i++) {\n\t\t\t\t\tconst controller = controllersToDestroy[i];\n\t\t\t\t\tif (controller) {\n\t\t\t\t\t\tcontroller.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontrollersToDestroy.length = 0;\n\t\t\t}, 0, Priority.low);\n\t\t}\n\t}\n\n\tprivate onHeightChanged() {\n\t\tthis.dispatchEvent({\n\t\t\ttype: Events.EVENT_ROW_CONTAINER_HEIGHT_CHANGED,\n\t\t});\n\t}\n\n\t/** After row-axis height changes (e.g. auto row height), sync scroll spacers without waiting for scroll. */\n\tsyncMiddlePaneScrollGeometry(): void {\n\t\tconst centerHandler = this.recordHandler.getMiddleHandler();\n\t\tconst centerHandlerHeight = centerHandler.getTotalHeight();\n\t\tif (this.totalHeight !== centerHandlerHeight) {\n\t\t\tthis.totalHeight = centerHandlerHeight;\n\t\t\tthis.onHeightChanged();\n\t\t}\n\t}\n\n\trefreshColumnAfterModelUpdate(\n\t\tparams : { force ?: boolean; fromColumnResize ?: boolean; type ?: string } = {},\n\t) {\n\t\tconst fromColumnResize =\n\t\t\tparams.fromColumnResize === true || params.type === 'columnResized';\n\t\tthis.onLeftChanged();\n\t\tthis.onWidthChanged();\n\t\tthis.eventHandler.dispatchEvent({ type: Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED });\n\n\t\tthis.eventHandler.dispatchEvent({\n\t\t\ttype : Events.EVENT_DISPLAYED_COLUMNS_CHANGED,\n\t\t\tforce : params.force ?? false,\n\t\t\tfromColumnResize,\n\t\t} as any);\n\n\t\tthis.eventHandler.dispatchEvent( { type : Events.EVENT_LEFT_CHANGED })\n\n\t\tthis.dispatchEvent({ type : Events.EVENT_WIDTH_CHANGED })\n\t}\n\n\tgetViewportStart(): IRowMeta {\n\t\treturn this.firstRenderIndexMeta;\n\t}\n\n\tgetViewportEnd(): IRowMeta {\n\t\treturn this.lastRenderIndexMeta;\n\t}\n\n\taddToStaticCache(index: number): void {\n\t\tthis.middleHandler.addStaticIndex(index);\n\t}\n\n\tremoveFromStaticCache(index: number): void {\n\t\tthis.middleHandler.removeStaticIndex(index);\n\t}\n\n\tgetUpcomingRows(startIndex : number) : number[] {\n\t\tconst upcomingRows: number[] = [];\n\t\tObject.keys(this.rowControllerByIndex).forEach((key) => {\n\t\t\tconst index = Number(key);\n\t\t\tif (index >= startIndex) {\n\t\t\t\tupcomingRows.push(index);\n\t\t\t}\n\t\t});\n\t\treturn upcomingRows;\n\t}\n \n\tgetCenterControllers(): RowController[] {\n\t\tconst centerRowControllers =  Object.values(this.rowControllerByIndex);\n\t\tconst extraRowHandeler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.EXTRA_RECORD_HANDLER);\n\t\tif (!extraRowHandeler) {\n\t\t\treturn centerRowControllers;\n\t\t}\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst extraRowController = extraRowHandeler.getRowController();\n\t\tconst isExtraRow = optionHandler?.getIsExtraRow();\n\t\textraRowController != undefined && isExtraRow  && centerRowControllers.push(extraRowController);\n\t\treturn centerRowControllers;\n\t\t\n\t}\n\n\tgetRowControllerByIndex(index: number): RowController | null {\n\t\treturn this.rowControllerByIndex[index] || null;\n\t}\n\n\tgetTopControllers(): RowController[] {\n\t\treturn this.topRowCtrls;\n\t}\n\n\tgetBottomControllers(): RowController[] {\n\t\treturn this.bottomRowCtrls;\n\t}\n\n\tgetSummaryControllers(): RowController[] {\n\t\treturn this.summaryRowCtrls;\n\t}\n\n\tsetEditorState(rowNode : IRowNode, column : IColumnNode): void {\n\t\tthis.editorState = {\n\t\t\trowID : rowNode?.getId(),\n\t\t\tcolumnID : column?.getID(),\n\t\t\trowNode : rowNode,\n\t\t\tcolumnNode : column\n\t\t};\n\t}\n\n\tgetEditorState(): any {\n\t\treturn this.editorState;\n\t}\n\n\tcloseEditor(event?: KeyboardEvent, suppressNavigation = true): void {\n\t\tconst rowID = this.editorState?.rowID;\n\n\t\tconst columnID = this.editorState?.columnID;\n\t\t\n\t\t// const centerHandler = this.recordHandler.getMiddleHandler();\n\n\t\t// const rowIndex = centerHandler.getIndexById(rowID);\n\n\t\t// const floatingRecord = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\n\t\t// const floatingRecordControllers = floatingRecord.getAllRowControllersByIndex();\n\n\t\tif (rowID && columnID) {\n\t\t\t// const cellController = this.getCellController(\n\t\t\t// \t{...this.rowControllerByIndex, ...floatingRecordControllers},\n\t\t\t// \trowIndex,\n\t\t\t// \tcolumnID,\n\t\t\t// );\n\t\t\t// cellController.stopEditing(false, event, suppressNavigation);\n\t\t\tthis.gridCellEditorHandler.stopEditing(false, event, suppressNavigation);\n\t\t}\n\t}\n\n\topenCellEditor(rowIndex : number, columnIndex : number): void {\n\t\tif(this.editorState) {\n\t\t\tthis.closeEditor();\n\t\t}\n\n\t\tconst centerHandler      = this.recordHandler.getMiddleHandler();\n\t\tconst centerFieldHandler = this.fieldHandler.getCenterHandler();\n\n\t\tconst rowID              = centerHandler.getIdByIndex(rowIndex);\n\t\tconst columnID           = centerFieldHandler.getIdByIndex(columnIndex);\n\n\t\tconst floatingRecord = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\n\t\tconst floatingRecordControllers = floatingRecord.getAllRowControllersByIndex();\n\n\t\tif (rowID && columnID) {\n\t\t\tconst cellController = this.getCellController(\n\t\t\t\t{...this.rowControllerByIndex, ...floatingRecordControllers},\n\t\t\t\trowIndex,\n\t\t\t\tcolumnID,\n\t\t\t);\n\t\t\t// cellController.startEditing();\n\t\t\tthis.gridCellEditorHandler.startEditing(cellController);\n\t\t}\n\t}\n\n\tgetAllCellCtrls(): CellController[] {\n\t\tconst cellControllers: CellController[] = [];\n\t\tconst rowCtrls = this.getAllRowControllers();\n\t\tconst rowCtrlsLength = rowCtrls.length;\n\n\t\tfor (let i = 0; i < rowCtrlsLength; i++) {\n\t\t\tconst cellCtrls = rowCtrls[i].getAllCellControllers(false);\n\t\t\tconst cellCtrlsLength = cellCtrls.length;\n\n\t\t\tfor (let j = 0; j < cellCtrlsLength; j++) {\n\t\t\t\tcellControllers.push(cellCtrls[j]);\n\t\t\t}\n\t\t}\n\n\t\treturn cellControllers;\n\t}\n\n\tgetAllRowControllers(): RowController[] {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\tconst rowController = [\n\t\t\t...this.topRowCtrls,\n\t\t\t...this.bottomRowCtrls,\n\t\t\t...this.summaryRowCtrls,\n\t\t\t...Object.values(this.rowControllerByIndex),\n\t\t\t...floatingRecordHandler.getAllRowControllers(),\n\t\t];\n\t\treturn rowController;\n\t}\n\n\tgetCellControll(rowID: string, columnID: string): CellController | null {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\tconst isSameTargetRow       = floatingRecordHandler.getTargetRowId() == rowID;\n\t\tif(isSameTargetRow){\n\t\t\tconst floatingRowControllers = floatingRecordHandler.getAllRowControllersByIndex();\n\t\t\tconst floatingRowController = Object.values(floatingRowControllers)[0];\n\t\t\treturn floatingRowController.getCellController(columnID);\n\t\t}\n\n\t\tconst index = this.recordHandler.getRelativeIndexByID(rowID);\n\t\tconst recordPane = this.recordHandler.getRecordPaneByIndex(index);\n\t\tconst recordIndex = recordPane.getIndexById(rowID);\n\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\treturn this.getCellController( this.rowControllerByIndex, recordIndex, columnID, );\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\treturn this.getCellController( this.topRowCtrls, recordIndex, columnID, );\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\treturn this.getCellController( this.bottomRowCtrls, recordIndex, columnID, );\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tgetCellHeaderControll(rowID: string, columnID: string): CellController | null {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\tconst isSameTargetRow       = floatingRecordHandler.getTargetRowId() == rowID;\n\t\tif(isSameTargetRow){\n\t\t\tconst floatingRowControllers = floatingRecordHandler.getAllRowControllersByIndex();\n\t\t\tconst floatingRowController = Object.values(floatingRowControllers)[0];\n\t\t\treturn floatingRowController.getHeaderCellController(columnID);\n\t\t}\n\t\treturn null;\n\t}\n\n\trefreshCells(params : RefreshCellParams) : void {\n\t\tconst rows = this.getAllRowControllers();\n\t\tfor (let i = 0; i < rows.length; i++) {\n\t\t\tconst row = rows[i];\n\t\t\tif(row.isFullWidth()){\n\t\t\t\trow.refreshFullWidth();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cells = row.getAllCellControllers(false);\n\t\t\tfor (let j = 0; j < cells.length; j++) {\n\t\t\t\tcells[j].refreshCell(params);\n\t\t\t}\n\t\t}\n\n\t\t//  rows height updation after content modified through api\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif (optionHandler && typeof optionHandler.isAutoRowHeight === 'function' && optionHandler.isAutoRowHeight()) {\n\t\t\tfor (let i = 0; i < rows.length; i++) {\n\t\t\t\trows[i].refreshAutoRowHeight();\n\t\t\t}\n\t\t}\n\t}\n\n\trefreshHeaderRowCells(params : RefreshCellParams) : void {\n\t\tconst controllers = this.getHeaderCellControllers();\n\t\tfor (let i = 0; i < controllers.length; i++) {\n\t\t\tcontrollers[i].refreshCell(params);\n\t\t}\n\t}\n\n\tgetHeaderCellControllers() : CellController[] {\n\t\tconst cellControllers: CellController[] = [];\n\t\tconst rowCtrls = this.getAllRowControllers();\n\t\tconst rowCtrlsLength = rowCtrls.length;\n\n\t\tfor (let i = 0; i < rowCtrlsLength; i++) {\n\t\t\tconst cellCtrls = rowCtrls[i].getHeaderCellControllers();\n\t\t\tconst cellCtrlsLength = cellCtrls.length;\n\n\t\t\tfor (let j = 0; j < cellCtrlsLength; j++) {\n\t\t\t\tcellControllers.push(cellCtrls[j]);\n\t\t\t}\n\t\t}\n\n\t\treturn cellControllers;\n\t}\n\n\trefreshCell(rowId : string, columnId : string, params : RefreshCellParams) : void {\n\t\tconst cellController = this.getCellControll(rowId, columnId);\n\t\tcellController && cellController.refreshCell(params);\n\t}\n\n\trefreshHeaderCell(rowId : string, columnId : string, params : RefreshCellParams) : void {\n\t\tconst cellController = this.getCellHeaderControll(rowId, columnId);\n\t\tcellController && cellController.refreshCell(params);\n\t}\n\n\tupdateCellStyles(rowID: string, columnID: string, meta: any): void {\n\t\tconst index       = this.recordHandler.getRelativeIndexByID(rowID);\n\t\tconst recordPane  = this.recordHandler.getRecordPaneByIndex(index);\n\t\tconst recordIndex = recordPane.getIndexById(rowID);\n\t\tthis.onFullWidthFocused(rowID);\n\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getCellController( this.rowControllerByIndex, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getCellController( this.topRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getCellController( this.bottomRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateColumnHeaderCellStyles( _rowID: string, columnID: string, meta: any, ): void {\n\t\tconst index        = this.fieldHandler.getIndexById(columnID);\n\t\tconst fieldPane    = this.fieldHandler.getFieldPaneByIndex(index);\n\t\tconst controller   = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n\t\tswitch (fieldPane.getPinPosition()) {\n\t\t\tcase COLUMN_PANE_TYPE.CENTER: {\n\t\t\t\tconst columnRowHeaderController = controller.getCenterRowHeaderContainerController();\n\t\t\t\tconst headerRowController       = columnRowHeaderController.getColumnHeaderRowController();\n\t\t\t\tconst headerCellController      = headerRowController ? headerRowController.getCellController(columnID) : null;\n\t\t\t\theaderCellController && headerCellController.updateCellStyles && headerCellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase COLUMN_PANE_TYPE.LEFT: {\n\t\t\t\tconst columnRowHeaderController = controller.getLeftRowHeaderContainerController();\n\t\t\t\tconst headerRowController       = columnRowHeaderController.getColumnHeaderRowController();\n\t\t\t\tconst headerCellController      = headerRowController ? headerRowController.getCellController(columnID) : null;\n\t\t\t\theaderCellController && headerCellController.updateCellStyles && headerCellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase COLUMN_PANE_TYPE.RIGHT: {\n\t\t\t\tconst columnRowHeaderController = controller.getRightRowHeaderContainerController();\n\t\t\t\tconst headerRowController       = columnRowHeaderController.getColumnHeaderRowController();\n\t\t\t\tconst headerCellController      = headerRowController ? headerRowController.getCellController(columnID) : null;\n\t\t\t\theaderCellController && headerCellController.updateCellStyles && headerCellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateHeaderCellStyles(rowID: string, columnID: string, meta: any): void {\n\t\tconst index         = this.recordHandler.getRelativeIndexByID(rowID);\n\t\tconst recordPane    = this.recordHandler.getRecordPaneByIndex(index);\n\t\tconst recordIndex   = recordPane.getIndexById(rowID);\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getHeaderCellController( this.rowControllerByIndex, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getHeaderCellController( this.topRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getHeaderCellController( this.bottomRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.updateCellStyles(meta);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveCellSelection(rowID: string, columnID: string): void {\n\t\tconst index         = this.recordHandler.getRelativeIndexByID(rowID);\n\t\tconst recordPane    = this.recordHandler.getRecordPaneByIndex(index);\n\t\tconst recordIndex   = recordPane.getIndexById(rowID);\n\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getCellController( this.rowControllerByIndex, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeCellSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getCellController( this.topRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeCellSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getCellController( this.bottomRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeCellSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveRangeSelection(rowID: string, columnID: string): void {\n\t\tconst index         = this.recordHandler.getRelativeIndexByID(rowID);\n\t\tconst recordPane    = this.recordHandler.getRecordPaneByIndex(index);\n\t\tconst recordIndex   = recordPane.getIndexById(rowID);\n\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getCellController( this.rowControllerByIndex, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getCellController( this.topRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getCellController( this.bottomRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveHeaderSelection(rowID: string, columnID: string): void {\n\t\tconst index         = this.recordHandler.getRelativeIndexByID(rowID);\n\t\tconst recordPane    = this.recordHandler.getRecordPaneByIndex(index);\n\t\tconst recordIndex   = recordPane.getIndexById(rowID);\n\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getHeaderCellController( this.rowControllerByIndex, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getHeaderCellController( this.topRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getHeaderCellController( this.bottomRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && cellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveColumnHeaderSelection(_rowID: string, columnID: string): void {\n\t\tconst index        = this.fieldHandler.getIndexById(columnID);\n\t\tconst fieldPane    = this.fieldHandler.getFieldPaneByIndex(index);\n\t\tconst controller   = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n\t\tswitch (fieldPane.getPinPosition()) {\n\t\t\tcase COLUMN_PANE_TYPE.CENTER: {\n\t\t\t\tconst columnRowHeaderController = controller.getCenterRowHeaderContainerController();\n\t\t\t\tconst headerRowController       = columnRowHeaderController.getColumnHeaderRowController();\n\t\t\t\tconst headerCellController      = headerRowController ? headerRowController.getCellController(columnID) : null;\n\t\t\t\theaderCellController && headerCellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase COLUMN_PANE_TYPE.LEFT: {\n\t\t\t\tconst columnRowHeaderController = controller.getLeftRowHeaderContainerController();\n\t\t\t\tconst headerRowController       = columnRowHeaderController.getColumnHeaderRowController();\n\t\t\t\tconst headerCellController      = headerRowController ? headerRowController.getCellController(columnID) : null;\n\t\t\t\theaderCellController && headerCellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase COLUMN_PANE_TYPE.RIGHT: {\n\t\t\t\tconst columnRowHeaderController = controller.getRightRowHeaderContainerController();\n\t\t\t\tconst headerRowController       = columnRowHeaderController.getColumnHeaderRowController();\n\t\t\t\tconst headerCellController      = headerRowController ? headerRowController.getCellController(columnID) : null;\n\t\t\t\theaderCellController && headerCellController.removeRangeSelectionStyle();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tscrollCellIntoView(rowID: string, columnID: string): void {\n\t\tconst index         = this.recordHandler.getRelativeIndexByID(rowID);\n\t\tconst recordPane    = this.recordHandler.getRecordPaneByIndex(index);\n\t\tconst recordIndex   = recordPane.getIndexById(rowID);\n\t\tlet cellController = null;\n\t\tthis.onFullWidthFocused(rowID);\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tcellController = this.getCellController( this.rowControllerByIndex, recordIndex, columnID, );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tcellController = this.getCellController( this.topRowCtrls, recordIndex, columnID, );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tcellController = this.getCellController( this.bottomRowCtrls, recordIndex, columnID, );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tcellController?.focus();\n\t\tcellController?.setFocusInOnEditor();\n\t}\n\n\tprivate getCellController( controller: { [key: number]: RowController }, rowIndex: number, columnID: string, ): CellController | null {\n\t\tconst rowController = controller[rowIndex];\n\t\tif (rowController) {\n\t\t\treturn rowController.getCellController(columnID);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprivate getHeaderCellController( controller: { [key: number]: RowController }, rowIndex: number, columnID: string, ) {\n\t\tconst rowController = controller[rowIndex];\n\t\tif (rowController) {\n\t\t\treturn rowController.getHeaderCellController(columnID);\n\t\t}\n\t\treturn null;\n\t}\n\n\trefreshAfterModelUpdate(params: IRefreshParam = {}) {\n\t\tif (!this.isAlive() || !this.middleHandler) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst recycleRows: boolean = !params.domLayoutChanged && params.recycleRows;\n\n\t\tconst rowsToRecycle = recycleRows ? this.getRowsToRecycle() : null;\n\n\n\n\t\tif (!recycleRows) {\n\t\t\tthis.removeAllRowComponents();\n\t\t}\n\n\t\tthis.findFirstAndLastRowsToRender(params.viewPortChange);\n\n\t\tif (this.stickyRowRenderer) {\n            this.stickyRowRenderer.updateStickyRows();\n\t\t}\n\t\t// this.middleHandler.onViewportChange( this.firstRenderIndex, this.lastRenderIndex, );\n\n\n\t\tthis.recycleRows(rowsToRecycle, params);\n\n\t\tif (!params.onlyBody) {\n\t\t\t\n\t\t\tconst topPinnedRowHandler = this.recordHandler.getTopHandler();\n\n\t\t\tconst bottomPinnedRowHandler = this.recordHandler.getBottomHandler();\n\n\t\t\tthis.refreshPinnedRowComponent( this.topRowCtrls, topPinnedRowHandler, );\n\n\t\t\tthis.refreshPinnedRowComponent( this.bottomRowCtrls, bottomPinnedRowHandler, );\n\n\t\t\tconst summaryRowHandler = this.recordHandler.getSummaryHandler();\n\n\t\t\tthis.refreshSummaryRowComponent( this.summaryRowCtrls, summaryRowHandler, );\n\t\t\tthis.refreshExtraRow();\n\t\t}\n\n\t\tif (params.floating) {\n\n\t\t\tconst floatingRowHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FLOATING_RECORD_HANDLER ) as IFloatingRecordHandler;\n\n\t\t\tconst floatingRowControllers = floatingRowHandler.getAllRowControllersByIndex();\n\t\t\tconst centerHandler          = this.recordHandler.getMiddleHandler();\n\t\t\tthis.refreshFloatingRowComponent( floatingRowControllers, centerHandler );\n\t\t}else {\n\t\t\tconst floatingRowHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FLOATING_RECORD_HANDLER ) as IFloatingRecordHandler;\n\n\t\t\tif(!floatingRowHandler) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfloatingRowHandler.refreshFloatingRecord();\n\t\t}\n\n\t\t\n\n\t\tthis.dispatchDisplayedRowsChanged();\n\t}\n\n\tprivate recycleRows(rowsToRecycle?: RowControllerMap | null, params ?: IRefreshParam): void {\n\t\tconst indexesToDraw = this.findIndexesToDraw(rowsToRecycle);\n\t\tthis.removeRowComponents(indexesToDraw);\n\n\t\tfor (let i = 0; i < indexesToDraw.length; i++) {\n\t\t\tthis.createOrUpdateRowController(indexesToDraw[i], rowsToRecycle, params);\n\t\t}\n\n\t\tif (rowsToRecycle) {\n\t\t\tthis.destroyRowCtrls(rowsToRecycle);\n\t\t}\n\t}\n\n\tprivate destroyRowCtrls( rowCtrlsMap: RowControllerMap | null | undefined, ): void {\n\t\tif (!rowCtrlsMap) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst controllersToDestroy: RowController[] = [];\n\t\tconst rowControllers = Object.values(rowCtrlsMap);\n\t\tfor (let i = 0; i < rowControllers.length; i++) {\n\t\t\tconst rowController = rowControllers[i];\n\t\t\tif (rowController) {\n\t\t\t\tcontrollersToDestroy.push(rowController);\n\t\t\t}\n\t\t}\n\t\t\n\t\tconst keys = Object.keys(rowCtrlsMap);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tdelete rowCtrlsMap[keys[i]];\n\t\t}\n\t\t\n\t\tif (controllersToDestroy.length > 0) {\n\t\t\tfor (let i = 0; i < controllersToDestroy.length; i++) {\n\t\t\t\tconst controller = controllersToDestroy[i];\n\t\t\t\tif (controller) {\n\t\t\t\t\tcontroller.destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontrollersToDestroy.length = 0;\n\t\t}\n\t}\n\n\tprivate createOrUpdateRowController( rowIndex: number, rowsToRecycle: | { [key: string]: RowController | null } | null | undefined, params : IRefreshParam = {refreshCells : true}): RowController | null | undefined {\n\t\tparams = {...{refreshCells : true}, ...params};\n\t\tlet rowNode: IRowNode | undefined;\n\t\tlet rowController: RowController | null = this.rowControllerByIndex[rowIndex];\n\n\t\t// const middleHandler = this.recordHandler.getMiddleHandler() as StaticRecordPaneInfoHandler;\n\t\tif (!rowController) {\n\t\t\trowNode = this.middleHandler.getRowNodeByVisibleIndex(rowIndex);\n\t\t\tif ( rowNode && rowsToRecycle?.[rowNode.getId()!] && rowNode.isRendered() ) {\n\t\t\t\tconst id = rowNode.getId();\n\t\t\t\trowController = rowsToRecycle[id!];\n\t\t\t\trowsToRecycle[id!] = null;\n\t\t\t\tparams.refreshCells && (rowController as RowController).refreshCells(params.focus);\n\t\t\t}\n\t\t}\n\n\t\tif (!rowController) {\n\t\t\tif (!rowNode) {\n\t\t\t\trowNode = this.middleHandler.getRowNodeByVisibleIndex(rowIndex);\n\t\t\t}\n\n\t\t\tif (rowNode) {\n\t\t\t\trowController = this.createRowController(rowNode);\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif (rowNode) {\n\t\t\trowNode.updateRendered(true);\n\t\t}\n\n\t\t// Clean up any existing controller at this index before assigning new one to prevent memory leaks\n\t\tconst existingController = this.rowControllerByIndex[rowIndex];\n\t\tif (existingController && existingController !== rowController) {\n\t\t\t// Schedule destruction to prevent blocking\n\t\t\tthis.rafHandler.createTask(() => {\n\t\t\t\tif (existingController) {\n\t\t\t\t\texistingController.destroy();\n\t\t\t\t}\n\t\t\t}, 0, Priority.low);\n\t\t}\n\t\t\n\t\tthis.rowControllerByIndex[rowIndex] = rowController!;\n\n\t\treturn rowController;\n\t}\n\n\tprivate createRowController(rowNode: IRowNode): RowController {\n\t\treturn new RowController(rowNode, this.getBeanInstanceByBeanName);\n\t}\n\n\tprivate createSummaryRowController(rowNode: IRowNode): RowController {\n\t\treturn new SummaryRowController(rowNode, this.getBeanInstanceByBeanName);\n\t}\n\n\t// private findIndexbyId(id: string): number | null {\n\t// \tconst centerHandler = this.recordHandler.getMiddleHandler();\n\t// \treturn centerHandler.getIndexById(id);\n\t// }\n\n\tprivate findIndexesToDraw(rowsToRecycle?: RowControllerMap | null) {\n\t\tconst centerHandler = this.recordHandler.getMiddleHandler();\n\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as FloatingRecordHandler;\n\n\t\tconst indexesViewportToDraw = this.recordHandler.getVisibleIndexesByPosition(this.firstPixel, this.lastPixel, this.lastPixelLeft);\n\t\tconst ignoreHidden = true;\n\t\tconst staticCacheIndexes = centerHandler.getStaticCacheIndexes(ignoreHidden);\n\n\t\tconst indexesToDrawSet = new Set<number>();\n\t\tfor (let i = 0; i < indexesViewportToDraw.length; i++) {\n\t\t\tindexesToDrawSet.add(indexesViewportToDraw[i]);\n\t\t}\n\t\tfor (let i = 0; i < staticCacheIndexes.length; i++) {\n\t\t\tindexesToDrawSet.add(staticCacheIndexes[i]);\n\t\t}\n\t\tconst checkRowsToDraw = ( _indexStr: string, rowController: RowController, ) => {\n\t\t\tconst rowNode = rowController.getRowNode();\n\t\t\tconst index = rowNode.getIndex();\n\n\t\t\tif (index == null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (index < this.firstRenderIndex || index > this.lastRenderIndex) {\n\t\t\t\tif (this.KeepRowVirtualized(index ,rowController) && !rowNode.isHidden()) {\n\t\t\t\t\tindexesToDrawSet.add(index);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\ttraverseObject(this.rowControllerByIndex, checkRowsToDraw);\n\n\t\ttraverseObject(rowsToRecycle, checkRowsToDraw);\n\t\t\n\t\tconst indexesToDraw = Array.from(indexesToDrawSet);\n\n\t\tindexesToDraw.sort((a: number, b: number) => a - b);\n\n\t\tconst rowIndex: number[] = [];\n\t\tconst rowIndexSet = new Set<number>();\n\n\t\tfor (let i = 0; i < indexesToDraw.length; i++) {\n\t\t\tconst currentRow = indexesToDraw[i];\n\t\t\tconst rowNode = this.middleHandler.getRowNode(currentRow);\n\t\t\tif(rowNode == null || rowNode?.isHidden() || rowNode?.isSticky()){\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isRelativeFloatingRecord = this.optionsHandler.isRelativeFloatingRecord();\n\t\t\tconst isFloatingRecord = floatingRecordHandler.isFloatingRecord(rowNode?.getId());\n\t\t\tif(!rowNode.isHidden()){\n\t\t\t\tlet parentRowNode = rowNode?.getParentNode();\n\t\t\t\tconst isRootRowNode = centerHandler.getRootNode().getId() == parentRowNode.getId();\n\t\t\t\twhile(parentRowNode && !isRootRowNode){\n\t\t\t\t\tconst index = parentRowNode.getIndex();\n\t\t\t\t\tif(rowIndexSet.has(index)) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\trowIndexSet.add(index);\n\t\t\t\t\trowIndex.push(index);\n\t\t\t\t\tparentRowNode = parentRowNode?.getParentNode();\n\t\t\t\t}\n\t\t\t} \n\t\t\tif (isRelativeFloatingRecord) {\n\t\t\t\tif (!rowIndexSet.has(currentRow)) {\n\t\t\t\t\trowIndexSet.add(currentRow);\n\t\t\t\t\trowIndex.push(currentRow);\n\t\t\t\t}\n\t\t\t}else if(!isFloatingRecord) {\n\t\t\t\tif (!rowIndexSet.has(currentRow)) {\n\t\t\t\t\trowIndexSet.add(currentRow);\n\t\t\t\t\trowIndex.push(currentRow);\n\t\t\t\t}\n\t\t\t} else if (!rowNode.isLoaded()) {\n\t\t\t\tif (!rowIndexSet.has(currentRow)) {\n\t\t\t\t\trowIndexSet.add(currentRow);\n\t\t\t\t\trowIndex.push(currentRow);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn rowIndex;\n\t}\n\tprivate KeepRowVirtualized( _index : number, rowController: RowController): boolean {\n\n\t\tconst coreStateHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CORE_STATE_HANDLER) as CoreStateHandler;\n\t\treturn coreStateHandler.keepRowVirtualised(_index, rowController);\n\t\t// const rowHasFocus = this.focusHandler.isRowFocused(rowController.getRowFocusedPosition());\n\n\t\t// if(!rowHasFocus) {\n\t\t// \treturn false;\n\t\t// }\n\n\t\t// const rownode = this.recordHandler.getRowNodeById(rowController.getRowNode().getId());\n\t\t// return rownode ? true : false;\n\t}\n\tpublic removeAllRowComponents(animationFrame : boolean = true): void {\n\t\tconst allControllers = Object.values(this.rowControllerByIndex);\n\t\t\n\t\tconst keys = Object.keys(this.rowControllerByIndex);\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tdelete this.rowControllerByIndex[keys[i]];\n\t\t}\n\t\t\n\t\tif (allControllers.length > 0) {\n\t\t\tif(animationFrame) {\n\t\t\t\tthis.rafHandler.createTask(() => {\n\t\t\t\t\tfor (let i = 0; i < allControllers.length; i++) {\n\t\t\t\t\t\tconst controller = allControllers[i];\n\t\t\t\t\t\tif (controller) {\n\t\t\t\t\t\t\tcontroller.destroy();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tallControllers.length = 0;\n\t\t\t\t}, 0, Priority.low);\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < allControllers.length; i++) {\n\t\t\t\t\tconst controller = allControllers[i];\n\t\t\t\t\tif (controller) {\n\t\t\t\t\t\tcontroller.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tallControllers.length = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate getRowsToRecycle(): RowControllerMap {\n\t\tconst stubNodeIndexes: string[] = [];\n\t\tfor (const [index, rowComp] of Object.entries(\n\t\t\tthis.rowControllerByIndex,\n\t\t)) {\n\t\t\tconst node = rowComp.getRowNode();\n\t\t\tconst stubNode = node.isLoaded();\n\t\t\tif (!stubNode) {\n\t\t\t\tstubNodeIndexes.push(index);\n\t\t\t}\n\t\t}\n\n\t\tthis.removeRowControllers(stubNodeIndexes);\n\n\t\tconst controllersByIDMap: RowControllerMap = {};\n\t\tfor (const [_index, rowComp] of Object.entries(\n\t\t\tthis.rowControllerByIndex,\n\t\t)) {\n\t\t\tconst rowNode = rowComp.getRowNode();\n\t\t\tconst id = rowNode.getId();\n\t\t\tcontrollersByIDMap[id] = rowComp;\n\t\t}\n\n\t\tthis.rowControllerByIndex = {};\n\n\t\treturn controllersByIDMap;\n\t}\n\n\tprivate findFirstAndLastRowsToRender(viewPortChange : boolean = false): void {\n\t\tconst centerHandler  = this.recordHandler.getMiddleHandler();\n\t\tconst centerHandlerHeight = centerHandler.getTotalHeight();\n\n\t\tif(this.totalHeight != centerHandlerHeight) {\n\t\t\tthis.totalHeight = centerHandlerHeight;\n\t\t\tthis.onHeightChanged();\n\t\t}\n\t\t\n\t\tconst bufferPixels       = this.getRowBufferInPixels();\n\t\tconst controllerHandler  = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER ) as IControllerHandler;\n\t\tconst bodyController     = controllerHandler.getBodyController();\n\t\tif (!bodyController) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst scrollPosition = bodyController.getVScrollPosition();\n\n\n\t\tconst rowPlusHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_BUFFER_HANDLER) as RowBufferHandler;\n\t\tconst rowPlusItem    = rowPlusHandler.getrowBufferItem();\n\n\t\tconst rowPlusHeight = rowPlusItem.getHeight() ?? 0;\n\n\t\tconst firstPixel = Math.max(scrollPosition.top - bufferPixels, 0);\n\t\tconst lastPixel  = Math.min( scrollPosition.bottom + bufferPixels, centerHandlerHeight);\n\n\t\tthis.firstVisiblePixel = Math.max(scrollPosition.top, 0);\n\t\tthis.lastVisiblePixel  = Math.min(scrollPosition.bottom, centerHandlerHeight + rowPlusHeight);\n\n\t\tconst lastPixelLeft = scrollPosition.right;\n\n\t\t// console.log( scrollPosition.bottom + bufferPixels, centerHandlerHeight + rowPlusHeight)\n\n\t\tconst pageFirstRow = centerHandler.getFirstRow();\n\t\tconst pageLastRow  = centerHandler.getLastRow();\n\n\n\t\tlet firstRowIndex = centerHandler.getDisplayIndexByPosition(firstPixel);\n\t\tlet lastRowIndex  = centerHandler.getDisplayIndexByPosition(lastPixel, lastPixelLeft);\n\n\t\tif (firstRowIndex < pageFirstRow) {\n\t\t\tfirstRowIndex = pageFirstRow;\n\t\t}\n\n\t\tif (lastRowIndex > pageLastRow) {\n\t\t\tlastRowIndex = pageLastRow;\n\t\t}\n\n\t\tconst firstRowIndexMeta = centerHandler.getRelativeRowMeta(firstRowIndex);\n\t\tconst lastRowIndexMeta = centerHandler.getRelativeRowMeta(lastRowIndex);\n\t\tconst firstDiffers = (firstRowIndex != this.firstRenderIndex) ||  (firstRowIndexMeta.rowIndex !== this.firstRenderIndexMeta.rowIndex) || (firstRowIndexMeta.parentKeys.toString() !== this.firstRenderIndexMeta.parentKeys.toString());\n\t\tconst lastDiffers  = (lastRowIndex != this.lastRenderIndex) || (lastRowIndexMeta.rowIndex !== this.lastRenderIndexMeta.rowIndex) || (lastRowIndexMeta.parentKeys.toString() !== this.lastRenderIndexMeta.parentKeys.toString());\n\n\t\tif (firstDiffers || lastDiffers) {\n\t\t\tthis.firstRenderIndexMeta = firstRowIndexMeta;\n\t\t\tthis.lastRenderIndexMeta  = lastRowIndexMeta;\n\t\t\tthis.firstRenderIndex     = firstRowIndex;\n\t\t\tthis.lastRenderIndex      = lastRowIndex;\n\t\t}\n\n\t\tthis.firstPixel    = firstPixel;\n\t\tthis.lastPixel     = lastPixel;\n\t\tthis.lastPixelLeft = lastPixelLeft;\n\n\t\tif(viewPortChange || firstDiffers || lastDiffers) {\n\t\t\tthis.dispatchViewPortChangeEvent();\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype : Events.EVENT_ROW_CHANGED\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate dispatchDisplayedRowsChanged(): void {\n\t\tconst event = { type: Events.EVENT_DISPLAYED_ROWS_CHANGED };\n\t\tthis.eventHandler.dispatchEvent(event);\n\t}\n\n\tprivate dispatchViewPortChangeEvent(): void {\n\t\tconst isValidViewport = this.firstRenderIndex >= 0 && this.lastRenderIndex >= 0;\n\t\tisValidViewport && this.dispatchEvent({\n\t\t\ttype     : Events.EVENT_VIEWPORT_CHANGED,\n\t\t\tfrom     : this.firstRenderIndex,\n\t\t\tto       : this.lastRenderIndex,\n\t\t\tfromMeta : this.firstRenderIndexMeta,\n\t\t\ttoMeta   : this.lastRenderIndexMeta,\n\t\t\tapi      : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER),\n\t\t\tviewportType : 'row'\t\n\t\t});\n\t}\n\n\tprivate onLeftChanged(): void {\n\t\tthis.getAllCellCtrls().forEach((controller) => {\n\t\t\tcontroller.onLeftChanged();\n\t\t});\n\t}\n\n\tprivate onWidthChanged(): void {\n\t\tthis.getAllCellCtrls().forEach((controller) => {\n\t\t\tcontroller.onWidthChanged();\n\t\t});\n\t}\n\n\tprivate onUserPresenceUpdated(params: IUserPresenceEventParams): void {\n\t\tconst rowNode = this.recordHandler.getRowNodeById(params.row);\n\t\tif(!rowNode) {\n\t\t\treturn;\n\t\t}\n\t\tconst recordPane    = this.recordHandler.getRecordPaneByIndex(rowNode.getIndex());\n\t\tconst rowID         = rowNode.getId();\n\t\tconst recordIndex   = recordPane.getIndexById(rowID);\n\n\t\t// const fieldPane = this.fieldHandler.getFieldPaneByIndex(params.column);\n\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getCellController( this.rowControllerByIndex, recordIndex, params.column );\n\t\t\t\tcellController && cellController.setUserPresence(params);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getCellController( this.topRowCtrls, recordIndex, params.column );\n\t\t\t\tcellController && cellController.setUserPresence(params);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getCellController( this.bottomRowCtrls, recordIndex, params.column );\n\t\t\t\tcellController && cellController.setUserPresence(params);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tgetCellComponent(row : number, column : number) : any {\n\t\tconst recordPane    = this.recordHandler.getRecordPaneByIndex(row);\n\t\tconst rowNode       = this.recordHandler.getRowNodeByIndex(row);\n\t\tconst rowID         = rowNode.getId();\n\t\tconst recordIndex   = recordPane.getIndexById(rowID);\n\n\t\tconst columnNode    = this.fieldHandler.getColumnNode(column);\n\t\t// const columnNode   = fieldPane.getColumnNode(column);\n\t\tconst columnID     = columnNode.getID();\n\n\t\tlet cellRenderer = null;\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getCellController( this.rowControllerByIndex, recordIndex, columnID, );\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getCellController( this.topRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getCellController( this.bottomRowCtrls, recordIndex, columnID, );\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cellRenderer;\n\t}\n\n\tgetColumnHeaderCellController(column : number) : HeaderCellController {\n\t\tconst columnNode    = this.fieldHandler.getColumnNode(column);\n\t\tconst columnID    \t= columnNode.getID();\n\t\tconst controller = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tlet columnRowHeaderController = null;\n\t\tswitch (columnNode.getPinnedPosition()) {\n\t\t\tcase COLUMN_PANE_TYPE.CENTER: {\n\t\t\t\tcolumnRowHeaderController = controller.getCenterRowHeaderContainerController();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase COLUMN_PANE_TYPE.LEFT: {\n\t\t\t\tcolumnRowHeaderController = controller.getLeftRowHeaderContainerController();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase COLUMN_PANE_TYPE.RIGHT: {\n\t\t\t \tcolumnRowHeaderController = controller.getRightRowHeaderContainerController();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!columnRowHeaderController) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst headerRowController  = columnRowHeaderController.getColumnHeaderRowController();\n\t\tconst headerCellController = headerRowController.getCellController(columnID);\n\n\t\treturn headerCellController;\n\t}\n\n\n\tgetRowCellController(recordId: string, fieldId : string) : CellController {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\tconst isFloating = floatingRecordHandler.getTargetRowId() === recordId;\n\t\tif(isFloating) {\n\t\t\tconst floatingRowController = floatingRecordHandler.getAllRowControllers()[0];\n\t\t\treturn floatingRowController.getHeaderCellController(fieldId);\n\t\t}\n\t\tconst rowNode       = this.recordHandler.getRowNodeById(recordId);\n\t\tconst recordIndex   = rowNode.getIndex();\n\n\n\t\tlet cellController = null;\n\t\tswitch (rowNode.getPinnedPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tcellController = this.getHeaderCellController( this.rowControllerByIndex, recordIndex, fieldId );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tcellController = this.getHeaderCellController( this.topRowCtrls, recordIndex, fieldId );\n\t\t\t\tbreak;\n\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tcellController = this.getHeaderCellController( this.bottomRowCtrls, recordIndex, fieldId );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif(!cellController) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn cellController;\n\t}\n\t\n\tgetRowHeaderCellController(fieldId : string) : HeaderCellController {\n\t\tconst controller   = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n\t\tconst columnRowHeaderController = controller.getHeaderRowHeaderContainerController();\n\n\t\tconst headerRowController  = columnRowHeaderController.getColumnHeaderRowController();\n\n\t\tconst headerCellController = headerRowController.getCellController(fieldId);\n\n\t\treturn headerCellController;\n\t}\n\n\n\tgetSummaryRowCellRendererInstance(row : number, column : number) : any {\n\t\tconst fieldHeaderHandler = this.fieldHandler.getHeaderHandler();\n\n\t\tconst columnID = fieldHeaderHandler.getIdByIndex(column);\n\n\t\tconst cellController = this.getHeaderCellController( this.summaryRowCtrls, row, columnID);\n\n\t\treturn cellController ? cellController.getCellRenderer() : null;\n\t}\n\n\n\tgetLastScrollPixel() : number {\n\t\treturn this.lastPixel;\n\t}\n\n\tgetFirstScrollPixel() : number {\n\t\treturn this.firstPixel;\n\t}\n\n\tonFullWidthFocused(rowID : string) {\n\t\tconst index         = this.recordHandler.getRelativeIndexByID(rowID);\n\t\tconst recordPane    = this.recordHandler.getRecordPaneByIndex(index);\n\t\tconst recordIndex   = recordPane.getIndexById(rowID);\n\t\tlet rowController = null;\n\t\tswitch (recordPane.getPinPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\trowController = this.rowControllerByIndex[recordIndex]\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\trowController = this.topRowCtrls[recordIndex];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\trowController = this.bottomRowCtrls[recordIndex];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\trowController?.focus();\n\t\trowController?.onRowFocused();\n\t}\n\n\tgetCellControllerByIndex(rowIndex : number, columnIndex : number) : CellController {\n\t\tconst rowID = this.recordHandler.getAbsoluteID(rowIndex);\n\t\tconst columnID = this.fieldHandler.getAbsoluteID(columnIndex);\n\n\t\treturn this.getCellControll(rowID, columnID);\n\t}\n\n    getCellComponentByPosition(row : number, column : number, position : rowPinPositions = \"middle\") : any {\n\t\tconst columnNode    = this.fieldHandler.getColumnNode(column);\n\n\t\tconst columnID     = columnNode.getID();\n\n\t\tlet cellRenderer = null;\n\t\tswitch (position) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getCellController( this.rowControllerByIndex, row, columnID, );\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getCellController( this.topRowCtrls, row, columnID, );\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getCellController( this.bottomRowCtrls, row, columnID, );\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cellRenderer;\n\t}\n\n\tpublic getRowByPosition(rowPosition: {rowIndex : number, pinPosition : rowPinPositions, parentKeys : string[]}): RowController | null {\n        let rowCtrl: RowController | null;\n\t\tconst {pinPosition}    = rowPosition ?? {};\n\t\tconst relativeRowIndex = this.recordHandler.getIndexByMeta(rowPosition.rowIndex, rowPosition.pinPosition, rowPosition.parentKeys);\n\t\tconst rowIndex         = this.recordHandler.getAbsoluteIndex(relativeRowIndex);\n        switch (pinPosition) {\n            case 'top':\n                rowCtrl = this.topRowCtrls[rowIndex];\n                break;\n            case 'bottom':\n                rowCtrl = this.bottomRowCtrls[rowIndex];\n                break;\n\t\t\tcase 'summary':\n\t\t\t\trowCtrl = this.summaryRowCtrls[rowIndex];\n\t\t\t\tbreak;\n\t\t\tcase 'FloatingRecord':{\n\t\t\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\t\t\tconst floatingRowControllers = floatingRecordHandler.getAllRowControllersByIndex();\n\t\t\t\trowCtrl = Object.values(floatingRowControllers)[0];\n                break;\n\t\t\t}\n            default:\n\t\t\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n                rowCtrl = this.rowControllerByIndex[rowIndex];\n\n\t\t\t\tif(!rowCtrl && floatingRecordHandler) {\n\t\t\t\t\tconst floatingRowControllers = floatingRecordHandler.getAllRowControllersByIndex();\n\t\t\t\t\trowCtrl = floatingRowControllers[rowIndex];\n\t\t\t\t}\n                break;\n        }\n\n        return rowCtrl;\n    }\n\n\tprivate onCellFocused(cellFocusParams : any) : void {\n\n\n\t\tconst callBack = (cellPosition : CellPositionType) => {\n\t\t\tif(!cellPosition) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet rowNode = null;\n\t\t\tif(cellPosition.pinPosition === \"FloatingRecord\") {\n\t\t\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\t\t\trowNode = floatingRecordHandler.getFloatingRowNode();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst rowId   = this.recordHandler.getId(cellPosition.rowIndex, cellPosition.pinPosition, cellPosition.parentKeys);\n\t\t\t\trowNode = this.recordHandler.getRowNodeById(rowId);\n\t\t\t}\n\t\t\t\n\t\t\tif(!rowNode) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tconst rowCtrl = this.getRowByPosition(cellPosition);\n\t\t\tif (!rowCtrl) {\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\trowCtrl.onRowFocused();\n\t\n\t\t\tconst cellCtrl = rowCtrl.getCellController(cellPosition.columnID);\n\t\n\t\t\tcellCtrl && cellCtrl.onCellFocused(true, cellFocusParams.scrollOnFocus, cellFocusParams.focus, 'ui');\n\t\n\t\t\tthis.onFullWidthFocus(cellPosition);\n\t\t}\n\t\tcallBack(cellFocusParams.focusedCellPosition);\n\t\tcallBack(cellFocusParams.restoreFocusedCellPosition);\n\t\t\n\t}\n\n\tpublic highlightFindCell(previous: CellPositionType | null, current: CellPositionType | null): void {\n\t\tconst update = (cellPosition: CellPositionType | null, active: boolean) => {\n\t\t\tif (!cellPosition) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst rowCtrl = this.getRowByPosition(cellPosition);\n\t\t\tif (!rowCtrl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trowCtrl.setFindActiveForCell(cellPosition, active);\n\t\t};\n\n\t\tupdate(previous, false);\n\t\tupdate(current, true);\n\t}\n\n\tpublic setFindMatchedForCell(cellPosition: CellPositionType, matched: boolean): void {\n\t\tif (!cellPosition) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst rowCtrl = this.getRowByPosition(cellPosition);\n\t\tif (!rowCtrl) {\n\t\t\treturn;\n\t\t}\n\n\t\trowCtrl.setFindMatchedForCell(cellPosition, matched);\n\t}\n\n\tprivate onFullWidthFocus(cellPosition : CellPositionType) : void {\n\t\tconst rowCtrl = this.getRowByPosition({ rowIndex : cellPosition.rowIndex,  pinPosition : cellPosition.pinPosition,parentKeys : cellPosition.parentKeys});\n\t\tif (!rowCtrl) {\n\t\t\treturn;\n\t\t}\n\t\trowCtrl.onFullWidthRowFocused();\n\t}\n\n\tprivate onRangeSelectionChanged(_params : any) : void {\n\t\tthis.getAllCellCtrls().forEach(cellCtrl => cellCtrl.onRangeSelectionChanged());\n\t}\n\n\t\n\tprivate onRowSelected() : void {\n\t\tconst rowCtrls = this.getAllRowControllers();\n\t\trowCtrls.forEach((rowCtrl) => {\n\t\t\trowCtrl.onRowSelected();\n\t\t})\n\t}\n\n\tprivate onColumnSelectionChanged() : void {\n\t\tconst cellCtrls = this.getAllCellCtrls();\n\t\tcellCtrls.forEach((cellCtrl) => {\n\t\t\tcellCtrl.onColumnSelectionChanged();\n\t\t});\n\t}\n\n\tpublic getFirstVisiblePosition() : number {\n\t\treturn this.firstVisiblePixel;\n\t}\n\n\tpublic getLastVisiblePosition() : number {\n\t\treturn this.lastVisiblePixel\n\t}\n\n\tpublic getStickyRowControllers(): RowController[] {\n        if (!this.stickyRowRenderer) {\n            return [];\n        }\n\n        return this.stickyRowRenderer.getStickyRowControllers();\n    }\n\n\tpublic getCellRendererInstance(recordId : string, fieldId : string) : ICellRendererComponent | null {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\tconst isSameTargetRow = floatingRecordHandler.getTargetRowId() == recordId;\n\t\tif(isSameTargetRow) {\n\t\t\tconst floatingRowControllers = floatingRecordHandler.getAllRowControllersByIndex();\n\t\t\tconst floatingRowController = Object.values(floatingRowControllers)[0];\n\t\t\treturn floatingRowController.getCellController(fieldId)?.getCellRenderer() ?? null;\n\t\t}\n\n\t\tconst rowNode = this.recordHandler.getRowNodeById(recordId);\n\t\tconst recordIndex = rowNode.getIndex();\n\n\t\tlet cellRenderer = null;\n\t\tswitch (rowNode.getPinnedPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getCellController( this.rowControllerByIndex, recordIndex, fieldId);\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getCellController( this.topRowCtrls, recordIndex, fieldId);\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getCellController( this.bottomRowCtrls, recordIndex, fieldId);\n\t\t\t\tcellController && (cellRenderer  = cellController.getCellRenderer());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cellRenderer;\n\n\t}\n\n\t// getColumnHeaderCellController(columnId : string) : HeaderRowController | null {\n\t// \tconst columnNode                = this.fieldHandler.getColumnNodeByID(columnId);\n\t// \tconst controller                = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t// \tlet   columnRowHeaderController = null;\n\t// \tswitch (columnNode.getPinnedPosition()) {\n\t// \t\tcase COLUMN_PANE_TYPE.CENTER: {\n\t// \t\t\tcolumnRowHeaderController = controller.getCenterRowHeaderContainerController();\n\t// \t\t\tbreak;\n\t// \t\t}\n\n\t// \t\tcase COLUMN_PANE_TYPE.LEFT: {\n\t// \t\t\tcolumnRowHeaderController = controller.getLeftRowHeaderContainerController();\n\t// \t\t\tbreak;\n\t// \t\t}\n\t// \t\tcase COLUMN_PANE_TYPE.RIGHT: {\n\t// \t\t \tcolumnRowHeaderController = controller.getRightRowHeaderContainerController();\n\t// \t\t\tbreak;\n\t// \t\t}\n\t// \t}\n\n\t// \tif(!columnRowHeaderController) {\n\t// \t\treturn null;\n\t// \t}\n\n\t// \treturn columnRowHeaderController.getColumnHeaderRowController();\n\t// }\n\t\n\tpublic getColumnHeaderCellRendererInstance(columnId : string) : ICellRendererComponent | null {\n\t\tconst column               = this.fieldHandler.getIndexById(columnId);\n\t\tconst headerCellController = this.getColumnHeaderCellController(column);\n\n\t\treturn headerCellController ? headerCellController.getCellComponent() : null;\n\t}\n\n\tpublic getColumnHeaderElement(columnId : string) : HTMLElement | null {\n\t\tconst column               = this.fieldHandler.getIndexById(columnId);\n\t\tconst headerCellController = this.getColumnHeaderCellController(column);\n\n\t\treturn headerCellController ? headerCellController.getElement() : null;\n\t}\n\n\tpublic getRowHeaderCellRendererInstance(recordId : string, fieldId :string) : ICellRendererComponent | null {\n\t\tconst headerCellController = this.getRowCellController(recordId, fieldId);\n\t\treturn headerCellController ? headerCellController.getCellRenderer() : null;\n\t}\n\n\tpublic getRowHeaderColumnHeaderCellRendererInstance(fieldId : string) : ICellRendererComponent | null {\n\t\tconst headerCellController = this.getRowHeaderCellController(fieldId);\n\t\treturn headerCellController ? headerCellController.getCellComponent() : null;\n\t}\n\n\tpublic getSummaryHeaderCellRendererInstance(recordId: string, fieldId: string): ICellRendererComponent | null {\n\t\tconst summaryHandler = this.recordHandler.getSummaryHandler();\n\t\tconst rowNode        = summaryHandler.getRowNodeById(recordId);\n\t\tconst recordIndex    = rowNode.getIndex();\n\t\tconst cellController = this.getHeaderCellController(this.summaryRowCtrls, recordIndex ,fieldId);\n\n\t\treturn cellController ? cellController.getCellRenderer() : null;\n\t}\n\n\tpublic getSummaryCellRendererInstance(recordId: string, fieldId: string): ICellRendererComponent | null {\n\t\tconst summaryHandler = this.recordHandler.getSummaryHandler();\n\t\tconst rowNode        = summaryHandler.getRowNodeById(recordId);\n\t\tconst recordIndex    = rowNode.getIndex();\n\t\tconst cellController = this.getCellController(this.summaryRowCtrls, recordIndex ,fieldId);\n\n\t\treturn cellController ? cellController.getCellRenderer() : null;\n\t}\n\n\tpublic getTopRowNodeOfView() : IRowNodeCore {\n\t\tconst centerHandler     = this.recordHandler.getMiddleHandler();\n\t\tconst firstVisibleIndex = this.recordHandler.getDisplayIndexByPosition(this.firstVisiblePixel);\n\t\tlet rowNode             = centerHandler.getRowNode(firstVisibleIndex);\n\t\tif (!this.optionsHandler.suppressGroupHeaderCellFocus()) {\n\t\t\treturn rowNode;\n\t\t}\n\n\t\tlet rowMeta = rowNode?.getRowMeta();\n\t\twhile (rowNode?.isGroupRow() && rowMeta) {\n\t\t\trowMeta = this.recordHandler.getRelativeRowMeta(rowMeta, 1);\n\t\t\trowNode = rowMeta ? this.recordHandler.getRowNodeByMeta(rowMeta) : null;\n\t\t}\n\n\t\treturn rowNode;\n\t}\n\n\tpublic getBottomRowNodeOfView() : IRowNodeCore {\n\t\tconst centerHandler    = this.recordHandler.getMiddleHandler();\n\t\tconst lastVisibleIndex = this.recordHandler.getDisplayIndexByPosition(this.lastVisiblePixel);\n\t\tlet rowNode            = centerHandler.getRowNode(lastVisibleIndex);\n\t\tif (!this.optionsHandler.suppressGroupHeaderCellFocus()) {\n\t\t\treturn rowNode;\n\t\t}\n\n\t\tlet rowMeta = rowNode?.getRowMeta();\n\t\twhile (rowNode?.isGroupRow() && rowMeta) {\n\t\t\trowMeta = this.recordHandler.getRelativeRowMeta(rowMeta, -1);\n\t\t\trowNode = rowMeta ? this.recordHandler.getRowNodeByMeta(rowMeta) : null;\n\t\t}\n\n\t\treturn rowNode;\n\t}\n\n\tpublic getCellEditorInstance(recordId : string, fieldId : string) : ICellEditorComponent | null {\n\t\tconst rowNode     = this.recordHandler.getRowNodeById(recordId);\n\t\tconst recordIndex = rowNode.getIndex();\n\n\t\tlet cellEditor = null;\n\t\tswitch (rowNode.getPinnedPosition()) {\n\t\t\tcase ROW_PANE_TYPE.MIDDLE: {\n\t\t\t\tconst cellController = this.getCellController( this.rowControllerByIndex, recordIndex, fieldId);\n\t\t\t\tcellController && (cellEditor  = cellController.getCellEditor());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.TOP: {\n\t\t\t\tconst cellController = this.getCellController( this.topRowCtrls, recordIndex, fieldId);\n\t\t\t\tcellController && (cellEditor  = cellController.getCellEditor());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ROW_PANE_TYPE.BOTTOM: {\n\t\t\t\tconst cellController = this.getCellController( this.bottomRowCtrls, recordIndex, fieldId);\n\t\t\t\tcellController && (cellEditor  = cellController.getCellEditor());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn cellEditor;\n\t}\n\n\tpublic refreshColumn(refreshColumns : IRefreshColumn[]) : void {\n\t\tconst allRowControllers   = this.getAllRowControllers();\n\t\trefreshColumns.forEach(columnMeta => {\n\t\t\tconst column              = this.fieldHandler.getIndexById(columnMeta.columnID);\n\t\t\tconst headerCellController = this.getColumnHeaderCellController(column);\n\t\t\tallRowControllers.forEach((rowController) => {\n\t\t\t\trowController.refreshCell(columnMeta.columnID, columnMeta.refreshParams);\n\t\t\t})\n\n\t\t\theaderCellController.refreshCell(columnMeta.refreshParams);\n\t\t});\n\t\t\n\t}\n\n\n\tpublic refreshRow(rowIds: string[]) : void {\n\t\trowIds.forEach(rowId => {\n\t\t\tconst rowNode = this.recordHandler.getRowNodeById(rowId);\n\t\t\tif(rowNode){\n\t\t\t\tconst index = rowNode.getIndex();\n\t\t\t\tconst rowController = this.rowControllerByIndex[index];\n\t\t\t\trowController?.destroy();\n\t\t\t\tdelete this.rowControllerByIndex[index];\n\t\t\t\tthis.createOrUpdateRowController(index, null);\n\t\t\t}\n\t\t});\n\t\t\n\t\tthis.dispatchDisplayedRowsChanged();\n\t}\n\n\tpublic getViewportAbsoluteStart() : number {\n\t\treturn this.firstRenderIndex;\n\t}\n\n\tpublic getViewportAbsoluteEnd() : number {\n\t\treturn this.lastRenderIndex;\n\t}\n\n\tprotected destroy(): void {\n\t\tthis.animationFrameId && cancelAnimationFrame(this.animationFrameId);\n\t\tthis.animationFrameId = null;\n\t\tsuper.destroy();\n\t}\n\n\tpublic refreshGroupCells(_refreshParams?: RefreshCellParams): void {\n\t\tthis.getAllCellCtrls().forEach(cellCtrl => cellCtrl.isGroupCell() && cellCtrl.refreshCell({force : true, newData : true}));\n\t}\n\n\tstatic StickyRowRendererWrapper = class implements IRowRendererWrapper {\n\t\tconstructor(public rowRendererController : RowRenderController){}\n\t\tcreateRowController(rowNode: IRowNodeCore): RowController {\n\t\t\treturn this.rowRendererController.createRowController(rowNode as any);\n\t\t}\n\t\tdestroyRowCtrls(rowCtrls: RowControllerMap): void {\n\t\t\tthis.rowRendererController.destroyRowCtrls(rowCtrls);\n\t\t}\n\t\t\n\t}\n}\n\nexport { RowControllerMap, IRefreshParam, RowRenderController };\n","import { Bean, EventEmitter } from '@dg/corecomponent';\nimport { GRID_BEAN_NAME } from './Constants/BeanName';\n\ntype IClassStyles = { [name: string]: boolean };\n@Bean(GRID_BEAN_NAME.STYLING_HANDLER)\nexport class StylingHandler extends EventEmitter {\n\n\tpublic applyRulesToClasses( classRules: { [cssClassName: string]: Function | string } | undefined, params: any, executeOnApplicable: (className: string) => void, executeOnNotApplicable?: (className: string) => void, ) {\n\t\tif (classRules == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst classNames = Object.keys(classRules!);\n\t\tconst classesToApply: IClassStyles = {};\n\t\tconst classesToRemove: IClassStyles = {};\n\n\t\tfor (let i = 0; i < classNames.length; i++) {\n\t\t\tconst className = classNames[i];\n\t\t\tconst rule = classRules![className];\n\n\t\t\tlet conditionalResult: any;\n\n\t\t\tif (typeof rule === 'function') {\n\t\t\t\tconditionalResult = rule(params);\n\t\t\t}\n\n\t\t\tconst applyClasses = (className : string) => {\n\t\t\t\tif (className == null || className.trim() == '') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconditionalResult ? (classesToApply[className] = true) : (classesToRemove[className] = true);\n\t\t\t};\n\n\t\t\tclassName.split(' ').forEach(applyClasses);\n\t\t}\n\n\t\texecuteOnNotApplicable && Object.keys(classesToRemove).forEach(executeOnNotApplicable);\n\n\t\texecuteOnApplicable && Object.keys(classesToApply).forEach(executeOnApplicable);\n\t}\n\n\tpublic applyClassesToFixedCells( classStyles: CallableFunction | string | string[], params: any, executeOnApplicable: (className: string) => void, ) {\n\t\tconst targetClasses = this.getStaticCellClasses(classStyles, params);\n\n\t\ttargetClasses.forEach(executeOnApplicable);\n\t}\n\n\tpublic getStaticCellClasses( classStyles: CallableFunction | string | string[], params: any, ): string[] {\n\t\tif (!classStyles) {\n\t\t\treturn [];\n\t\t}\n\n\t\tlet targetClasses: string | string[] | null | undefined;\n\n\t\tif (typeof classStyles === 'function') {\n\t\t\tconst classStyleFunction = classStyles;\n\t\t\ttargetClasses = classStyleFunction(params);\n\t\t} else {\n\t\t\ttargetClasses = classStyles;\n\t\t}\n\n\t\tif (typeof targetClasses === 'string') {\n\t\t\ttargetClasses = [targetClasses];\n\t\t}\n\n\t\treturn targetClasses || [];\n\t}\n}\n","import {IUserPresence, IUserPresenceItem} from '../../../../userpresence/core/src/DataHandler/Interface/IUserPresenceConfig' // need to change with npm module\nimport { UserPresenceItem } from \"./UserPresenceItem\";\nimport { IUserPresenceEventParams } from \"./Interface/IUserPresenceEventParams\";\nimport { Events } from \"../Constants/Events\";\nimport { IUserPresenceHandler } from \"./Interface/IUserPresenceHandler\";\nimport { Bean, EventEmitter } from '@dg/corecomponent';\nimport { GRID_BEAN_NAME } from '../Constants/BeanName';\n@Bean(GRID_BEAN_NAME.USER_PRESENCE_HANDLER)\nexport class UserPresenceHandler extends EventEmitter implements IUserPresenceHandler {\n\n    private userPresences : {[key : string]: UserPresenceItem} = {};\n\n    addUserPresence(row : string, column : string, userPresence : IUserPresence) : void {\n        const key = this.convertToIDByRowColumn(row, column);\n        const userPresenceItem = new UserPresenceItem(row, column, {\n            removeUserPresense : (rowId :string, columnId : string) => this.removeUserPresence(rowId, columnId)\n        });\n        userPresenceItem.updatePresence(userPresence);\n        this.userPresences[key] = userPresenceItem;\n\n        const userPresenceEventParams = this.createUserPresenceUpdated(row, column);\n        this.dispatchUserPresence({...userPresenceEventParams, ...{ forceNewRenderer : true }});\n    }\n\n    removeUserPresence(row : string, column : string) : void {\n        const key = this.convertToIDByRowColumn(row, column);\n        const userPresence = this.userPresences[key];\n        delete this.userPresences[key];\n        userPresence.destroy()\n\n    }\n\n    updateUserPresence(row : string, column : string, userPresence : IUserPresence) : void {\n        const key = this.convertToIDByRowColumn(row, column);\n        const userPresenceItem = this.userPresences[key];\n        userPresenceItem && userPresenceItem.updatePresence(userPresence);\n    }\n\n    hasUserPresence(row : string, column : string) : boolean {\n        const key = this.convertToIDByRowColumn(row, column);\n        return this.userPresences[key] != null;\n    }\n\n    hasUserPresenceItem(recordId : string, fieldId : string, itemId : string) : boolean {\n        const userpresence = this.getUserPresence(recordId, fieldId);\n         return userpresence ? userpresence.hasItem(itemId) : false   \n    }\n\n    getUserPresence(row : string, column : string) : UserPresenceItem {\n        const key = this.convertToIDByRowColumn(row, column);\n\t\treturn this.userPresences[key];\n    }\n\n    removeUserPresenceItem(id : string) : void {\n        const userPresenceItems = Object.values(this.userPresences);\n\n        userPresenceItems.forEach((presenceItem) => {\n            presenceItem.removeItemByID(id);\n        })\n    }\n\n    hasAnyUserPresenceForRow(row : string) : boolean {\n        const userPresences = Object.values(this.userPresences);\n        for (let i = 0; i < userPresences.length; i++) {\n            if (row === userPresences[i].getRow()) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    updateUserPresenceItems(recordId : string, fieldId : string, userPresenceItems : IUserPresenceItem[]) : void {\n        const id = this.convertToIDByRowColumn(recordId, fieldId);\n        const userPresenceItem = this.userPresences[id];\n\n        userPresenceItem && userPresenceItem.updateItems(userPresenceItems);\n    }\n\n    removeUserPresenceItems(recordId : string, fieldId : string, ids : string[]) : void {\n        const id = this.convertToIDByRowColumn(recordId, fieldId);\n        const userPresenceItem = this.userPresences[id];\n\n        userPresenceItem && userPresenceItem.removeItems(ids);\n    }\n\n    addUserPresenceItems(recordId : string, fieldId : string, userPresenceItems : IUserPresenceItem[]) : void {\n        const id = this.convertToIDByRowColumn(recordId, fieldId);\n        const userPresenceItem = this.userPresences[id];\n\n        userPresenceItem && userPresenceItem.addItems(userPresenceItems);\n    }\n\n    getAllUserPresence() : {recordId : string, fieldId : string}[] {\n        return Object.keys(this.userPresences).map((key) => {\n            const [row, column] = key.split('-:-');\n            return {recordId : row, fieldId : column};\n        });\n    }\n    private convertToIDByRowColumn(row : string, column : string) : string {\n        return `${row}-:-${column}`;;\n    }\n\n    private dispatchUserPresence(event : IUserPresenceEventParams) : void {\n        this.dispatchEvent(event);\n    }\n\n    private createUserPresenceUpdated(row : string, column : string, destroy : boolean = false, refresh : boolean = false) : IUserPresenceEventParams {\n        return {\n            row,\n            column,\n            type : Events.EVENT_USER_PRESENCE_UPADTED,\n            destroy,\n            refresh\n        }\n    }\n}","import { EventHandler, IEventEmitter } from \"@dg/corecomponent\";\nimport { IUserPresence, IUserPresenceItem, SortType } from \"../../../../userpresence/core/src/DataHandler/Interface/IUserPresenceConfig\";\nimport { UserPresenceItemInterface } from \"../../../../userpresence/core/src/DataHandler/Interface/IUserPresenceItem\";\nimport {  GRID_USER_PRESENCE_EVENTS } from \"../Constants/Events\";\nimport { UserPresenceHandlerWrapper } from \"./Interface/IUserPresenceHandler\";\n\nexport class UserPresenceItem implements IEventEmitter {\n    private items           : IUserPresenceItem[];\n    private priorityID      : string;\n    private sortType        : SortType;\n    private customComparator: ((a: UserPresenceItemInterface, b: UserPresenceItemInterface) => number);\n\n    private eventHandler : EventHandler;\n\n    constructor(private row : string, private column : string,private wrapper : UserPresenceHandlerWrapper) {\n        \n    }\n\n    getRow() : string {\n        return this.row;\n    }\n\n    getColumn() : string {\n        return this.column;\n    }\n\n    addItems(items : IUserPresenceItem[]) : void {\n        this.items.push(...items);\n        this.dispatchUserPresenceUpdated();\n    }\n\n    removeItems(ids: string[]): void {\n        this.items = this.items.filter(item => !ids.includes(item.id));\n        if (this.items.length === 0) {\n            this.wrapper.removeUserPresense(this.row, this.column);\n        } else {\n            this.destroy();\n            this.dispatchUserPresenceUpdated();\n        }\n    }\n\n    updateItems(userPresenceItems : IUserPresenceItem[]) : void {\n        userPresenceItems.forEach(userPresenceItem => {\n            const item                    = this.items.find(item => userPresenceItem.id === item.id);\n            if(item) {\n                item.color              = userPresenceItem.color ?? item.color;\n                item.dropDownRenderer   = userPresenceItem.dropDownRenderer ?? item.dropDownRenderer;\n                item.editing            = userPresenceItem.editing ?? item.editing;\n                item.imageURL           = userPresenceItem.imageURL ?? item.imageURL;\n                item.name               = userPresenceItem.name ?? item.name;\n                item.renderer           = userPresenceItem.renderer ?? item.renderer;\n                item.userRendererParams = userPresenceItem.userRendererParams ?? item.userRendererParams;\n            }\n        });\n        this.dispatchUserPresenceUpdated();\n    }\n\n\n    setPriorityID(priorityID : string) {\n        this.priorityID = priorityID;\n    }\n\n    setSortType(sortType : SortType) {\n        this.sortType = sortType;\n    }\n\n    setCustomComparator(customComparator : (a: UserPresenceItemInterface, b: UserPresenceItemInterface) => number) {\n        this.customComparator = customComparator;\n    }\n\n    setItems(items : IUserPresenceItem[]): void {\n        this.items = items;\n    }\n\n    getItems() : IUserPresenceItem[] {\n        return this.items ?? [];\n    }\n\n    removeItemByID(id : string) : void {\n        this.items = this.items.filter((item) => item.id != id );\n        this.dispatchUserPresenceRemoved(id);\n    }\n\n    getPriorityID() : string {\n        return this.priorityID;\n    }\n\n    getSortType() : SortType {\n        return this.sortType;\n    }\n\n    getCustomComparator() : (a: UserPresenceItemInterface, b: UserPresenceItemInterface) => number {\n        return this.customComparator;\n    }\n\n    updatePresence(userPresence : IUserPresence) : void {\n        if(userPresence) {\n            let userPresenceStatus = {\n                items           : false,\n                sortType        : false,\n                priorityID      : false,\n                customComparator: false,\n            }\n            if(userPresence.items && this.getItems() != userPresence.items) {\n                this.setItems(userPresence.items);\n                userPresenceStatus.items = true;\n            }\n\n            if(userPresence.customComparator && this.getCustomComparator() != userPresence.customComparator ) {\n                this.setCustomComparator(userPresence.customComparator);\n                userPresenceStatus.customComparator = true;\n            }\n\n            if(userPresence.sortType && this.getSortType() != userPresence.sortType) {\n                this.setSortType(userPresence.sortType);\n                userPresenceStatus.sortType = true;\n            }\n\n            if(userPresence.priorityID && this.getPriorityID() != userPresence.priorityID) {\n                this.setPriorityID(userPresence.priorityID);\n                userPresenceStatus.priorityID = true;\n            }\n\n            if(userPresenceStatus.customComparator || userPresenceStatus.items || userPresenceStatus.priorityID || userPresenceStatus.sortType) {\n                this.dispatchUserPresenceUpdated();\n            }\n        }\n\t}\n\n    addEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.addEventListener(eventType, listener, async);\n    }\n    \n    removeEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.removeEventListener(eventType, listener, async);\n    }\n\n    private dispatchEvent(event : any) : void {\n        if (this.eventHandler) {\n            this.eventHandler.dispatchEvent(event);\n        }\n    }\n\n    private dispatchUserPresenceUpdated() : void {\n        this.dispatchEvent({\n            type   : GRID_USER_PRESENCE_EVENTS.EVENTS_ITEM_REFRESHED,\n            refresh: true\n        })\n    }\n\n    destroy() : void {\n        this.dispatchEvent({\n            type : GRID_USER_PRESENCE_EVENTS.EVENTS_ITEM_DESTROYED,\n            destroy : true\n        })\n    }\n\n    hasItem(itemId : string) : boolean {\n        for(let i =0; i< this.items.length;i++) {\n            const item = this.items[i];\n            if(item.id === itemId) {\n                return true\n            }\n        }\n\n        return false;\n    }\n\n    private dispatchUserPresenceRemoved(id : string) : void {\n        this.dispatchEvent({\n            type   : GRID_USER_PRESENCE_EVENTS.EVENTS_ITEM_REFRESHED,\n            removed: true,\n            id\n        })\n    }\n}","import { Bean, EventEmitter, PostConstruct, AutoWired, BEAN_NAME , getBeanInstanceByBeanName} from '@dg/corecomponent'\nimport { GRID_BEAN_NAME } from './Constants/BeanName';\nimport { Events } from './Constants/Events';\nimport { IViewPort } from 'Grid/Main';\nimport { IRecordHandler } from './Rows/RecordHandler.types';\nimport { IRowMeta } from '../API/CommonAPIInterface';\nimport { RowRenderController } from './Rows/RowRenderController';\nimport { executeOncePerAnimationFrame } from './utils/GridUtilities';\n\n@Bean(GRID_BEAN_NAME.VIEWPORT_RANGE_REGISTRY)\nexport class ViewportRangeRegistry extends EventEmitter {\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!   : getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRendererController : RowRenderController;\n\n    private currentRowStart = -1;\n    private currentRowEnd = -1;\n\n    private currentColStart = -1;\n    private currentColEnd = -1;\n\n    // Cache for rowCount === 0 case to prevent continuous triggering\n    private zeroRowCountActualStartRow = -1;\n    private zeroRowCountActualEndRow = -1;\n    private zeroRowCountActualStartCol = -1;\n    private zeroRowCountActualEndCol = -1;\n    private isZeroRowCountState = false;\n\n    private lastRowCount = -1;\n\n    private rowPageSize !: number; //= 100;\n    private rowBufferSize !: number; //= 5;\n\n    private colPageSize  !: number;//= 50;\n    private colBufferSize !: number;// = 20;\n\n  \t@PostConstruct()\n\t  init() {\n      const requestAnimationFrameLoadMethod = executeOncePerAnimationFrame(this.loadViewport.bind(this)) as any;\n      this.addListener( this.eventHandler, Events.EVENT_ROW_CHANGED, this.updateViewport.bind(this) );\n      this.addListener( this.eventHandler, Events.EVENT_COLUMN_CHANGED, this.updateViewport.bind(this) );\n      this.addListener(this.eventHandler, Events.EVENT_ROW_RESETED_VIEWPORT, ()=>{\n        requestAnimationFrameLoadMethod();\n      });\n\n      this.addListener(this.eventHandler, Events.EVENT_ON_ZERO_ROWS, this.triggerViewportEmptyGrid.bind(this));\n\n    //   this.addListener(this.eventHandler, Events.EVENT_ROW_COLLAPSED, ()=>{\n    //     requestAnimationFrameLoadMethod();\n    //   });\n    //   this.addListener(this.eventHandler, Events.EVENT_ROW_EXPANDED, ()=>{\n    //     requestAnimationFrameLoadMethod();\n    //   });\n\n      const gridOptionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\n      this.rowPageSize = gridOptionHandler.getViewportRowPageSize();\n      this.rowBufferSize = gridOptionHandler.getViewportRowBufferSize();\n      \n      this.colPageSize = gridOptionHandler.getViewportColumnPageSize();\n      this.colBufferSize = gridOptionHandler.getViewportColumnBufferSize()\n    }\n\n    resetViewport() : void {\n      this.currentRowStart = -1;\n      this.currentRowEnd = -1;\n      this.currentColStart = -1;\n      this.currentColEnd = -1;\n      this.zeroRowCountActualStartRow = -1;\n      this.zeroRowCountActualEndRow = -1;\n      this.zeroRowCountActualStartCol = -1;\n      this.zeroRowCountActualEndCol = -1;\n      this.isZeroRowCountState = false;\n      this.lastRowCount = -1;\n    }\n\n    private loadViewport() : void {\n      this.resetViewport();\n      this.updateViewport(null);\n    }\n\n    triggerViewportEmptyGrid() : void {\n        const rowAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_API);\n        if(rowAPI.getRowCount() === 0) {\n          this.updateViewport(null);\n        }\n    }\n\n    updateViewport(_params : any): ViewportUpdateResult | null {\n        const gridAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_API);\n        const viewport : IViewPort = gridAPI.getViewPort();\n\n        const rowAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_API);\n        const rowCount = rowAPI.getRowCount();\n        const rowCountChanged = this.lastRowCount !== rowCount;\n\n        const absoluteStartRow = this.rowRendererController.getViewportAbsoluteStart();\n        const absoluteEndRow = this.rowRendererController.getViewportAbsoluteEnd();\n\n        // Early return if no rows and viewport is invalid (but allow when rowCount is 0)\n        if((absoluteStartRow === -1 || absoluteEndRow === -1) && rowCount > 0) {\n          return null;  \n        }\n\n        const columnAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_API);\n        const columnCount = columnAPI.getColumnCount();\n\n        const pinAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.PINNING_API);\n        const leftPinnedCount = pinAPI.getLeftPinnedColumns().length;\n        const topPinnedCount = pinAPI.getTopPinnedRows().length;\n\n        const view: ViewportInput = {\n            firstRow : absoluteStartRow,\n            lastRow : absoluteEndRow,\n            firstCol : viewport.startColumn,\n            lastCol : viewport.endColumn,\n            totalRows : rowCount,\n            totalCols : columnCount\n        }\n\n        let newRowStart: number;\n        let newRowEnd: number;\n        let actualStartRow: number;\n        let actualEndRow: number;\n\n        if (rowCount === 0) {\n            newRowStart = -1;\n            newRowEnd = -1;\n      \n            const viewportStartRowIndex = viewport.startRow?.rowIndex ?? topPinnedCount;\n        \n            const effectivePage = Math.max(this.rowPageSize, 1);\n            const normalizedStart = Math.max(viewportStartRowIndex - this.rowBufferSize, topPinnedCount);\n            const stride = Math.max(Math.floor(effectivePage / 2), 1);\n            const blockIndex = Math.floor((normalizedStart - topPinnedCount) / stride);\n            const candidateStart = blockIndex * stride + topPinnedCount;\n            actualStartRow = candidateStart;\n            actualEndRow = candidateStart + effectivePage - 1;\n        } else {\n            const rowRangeResult = calculateRowRange( view.firstRow, view.lastRow, this.rowBufferSize, this.rowPageSize, topPinnedCount, view.totalRows - 1 );\n            newRowStart = rowRangeResult.startRow;\n            newRowEnd = rowRangeResult.endRow;\n            actualStartRow = rowRangeResult.actualStartRow;\n            actualEndRow = rowRangeResult.actualEndRow;\n        }\n\n        let newColStart: number;\n        let newColEnd: number;\n        let actualStartCol: number;\n        let actualEndCol: number;\n\n        if (rowCount === 0) {\n            newColStart = -1;\n            newColEnd = -1;\n\n            const colRangeResult = calculateColumnRange( view.firstCol, view.lastCol, this.colBufferSize, this.colPageSize, leftPinnedCount, view.totalCols - 1 );\n            actualStartCol = colRangeResult.actualStartCol;\n            actualEndCol = colRangeResult.actualEndCol;\n        } else {\n            const colRangeResult = calculateColumnRange( view.firstCol, view.lastCol, this.colBufferSize, this.colPageSize, leftPinnedCount, view.totalCols - 1 );\n            newColStart = colRangeResult.startCol;\n            newColEnd = colRangeResult.endCol;\n            actualStartCol = colRangeResult.actualStartCol;\n            actualEndCol = colRangeResult.actualEndCol;\n        }\n        \n        // For rowCount === 0, check if actual values have changed using separate cache\n        if (rowCount === 0) {\n            const actualRowChanged = \n                this.zeroRowCountActualStartRow !== actualStartRow ||\n                this.zeroRowCountActualEndRow !== actualEndRow;\n            \n            const actualColChanged = \n                this.zeroRowCountActualStartCol !== actualStartCol ||\n                this.zeroRowCountActualEndCol !== actualEndCol;\n            \n            // If we're already in zero-row state and nothing changed, return null\n            if (this.isZeroRowCountState && !actualRowChanged && !actualColChanged) {\n                return null;\n            }\n            \n            // Update zero-row cache\n            this.zeroRowCountActualStartRow = actualStartRow;\n            this.zeroRowCountActualEndRow = actualEndRow;\n            this.zeroRowCountActualStartCol = actualStartCol;\n            this.zeroRowCountActualEndCol = actualEndCol;\n            this.isZeroRowCountState = true;\n        } else {\n            // Reset zero-row state when rowCount > 0\n            if (this.isZeroRowCountState) {\n                this.isZeroRowCountState = false;\n                this.zeroRowCountActualStartRow = -1;\n                this.zeroRowCountActualEndRow = -1;\n                this.zeroRowCountActualStartCol = -1;\n                this.zeroRowCountActualEndCol = -1;\n            }\n            \n            const rowChanged =\n                this.currentRowStart !== newRowStart ||\n                this.currentRowEnd !== newRowEnd;\n\n            const colChanged =\n                this.currentColStart !== newColStart ||\n                this.currentColEnd !== newColEnd;\n\n            if (!rowChanged && !colChanged && !rowCountChanged) {\n                return null;\n            }\n        }\n\n        const gridOptionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const model = gridOptionHandler.getRowModelType();\n\n        if(model === 'viewport' && rowCount > 0) {\n            for(let rowIndex = this.currentRowStart; rowIndex <= this.currentRowEnd; rowIndex++) {\n                if(rowIndex >= 0) {\n                    const rowNode = this.recordHandler.getMiddleHandler().getRowNodeByVisibleIndex(rowIndex);\n                    if(rowNode) {\n                        rowNode.updateRowData({});\n                    }\n                }\n            }\n        }\n\n        this.currentRowStart = newRowStart;\n        this.currentRowEnd = newRowEnd;\n        this.currentColStart = newColStart;\n        this.currentColEnd = newColEnd;\n        this.lastRowCount = rowCount;\n        \n        // Handle leaf nodes\n        let startRowLeaf: IRowMeta | null = null;\n        let endRowLeaf: IRowMeta | null = null;\n        let actualStartRowMeta: IRowMeta | null = null;\n        let actualEndRowMeta: IRowMeta | null = null;\n        let leafChildCountInViewport = 0;\n        let expandedGroupCount = 0;\n        let collapsedGroupCount = 0;\n\n        if (rowCount === 0) {\n            // When rowCount is 0, return objects with rowIndex -1 and empty parentKeys\n            startRowLeaf = {\n                rowIndex: -1,\n                parentKeys: []\n            };\n            endRowLeaf = {\n                rowIndex: -1,\n                parentKeys: []\n            };\n            actualStartRowMeta = {\n                rowIndex: -1,\n                parentKeys: []\n            };\n            actualEndRowMeta = {\n                rowIndex: -1,\n                parentKeys: []\n            };\n            leafChildCountInViewport = 0;\n        } else if (viewport.startRow != null && viewport.endRow != null) {\n            const leafChilds = this.getLeafNodesFromViewport(viewport.startRow, viewport.endRow);\n            // Event metas must never point to draft rows.\n            startRowLeaf = this.resolveStartRowLeafMetaForDraftRows(leafChilds, newRowStart);\n            endRowLeaf = this.resolveEndRowLeafMetaForDraftRows(leafChilds, newRowEnd);\n            leafChildCountInViewport = this.getLeafChildCountByLeafMetas(startRowLeaf, endRowLeaf, absoluteStartRow, absoluteEndRow);\n            if (leafChildCountInViewport === 0) {\n                // No real leaf records in range -> leaf metas must indicate absence via -1.\n                startRowLeaf = { rowIndex: -1, parentKeys: [], pinPosition: 'middle' };\n                endRowLeaf = { rowIndex: -1, parentKeys: [], pinPosition: 'middle' };\n            }\n            const leafGroupCounts = this.getGroupExpandedCollapsedCountsInViewport(absoluteStartRow, absoluteEndRow);\n            expandedGroupCount = leafGroupCounts.expandedGroupCount;\n            collapsedGroupCount = leafGroupCounts.collapsedGroupCount;\n\n            const effectivePage = Math.max(this.rowPageSize, 1);\n            const middleHandler: any = this.recordHandler.getMiddleHandler();\n            const isGroupingApplied = middleHandler?.isRowGroupingApplied?.() ?? false;\n            const hasGroupedMetaContext =\n                ((startRowLeaf?.parentKeys?.length ?? 0) > 0) ||\n                ((endRowLeaf?.parentKeys?.length ?? 0) > 0) ||\n                (expandedGroupCount + collapsedGroupCount > 0);\n            const shouldUseGroupedRemainingCount = isGroupingApplied || hasGroupedMetaContext;\n            // Base count: rows that exist inside the calculated buffered range.\n            let rowsCountForRemaining = Math.max(\n                this.getLeafChildCountInViewport(newRowStart, newRowEnd),\n                leafChildCountInViewport,\n                0\n            );\n            const startEmptyGroupMeta = this.findExpandedEmptyGroupVirtualMetaInViewport(absoluteStartRow, absoluteEndRow, 'start');\n            // End virtual meta should prefer the last expanded empty group in the trailing range,\n            // not just within the currently rendered viewport slice.\n            const endEmptyGroupMeta = this.findExpandedEmptyGroupVirtualMetaInViewport(\n                absoluteEndRow,\n                Math.max(rowCount - 1, absoluteEndRow),\n                'end'\n            );\n\n            if (startEmptyGroupMeta) {\n                actualStartRowMeta = {\n                    rowIndex: 0,\n                    parentKeys: startEmptyGroupMeta.parentKeys ?? [],\n                    pinPosition: 'middle'\n                };\n            } else if (startRowLeaf) {\n                const normalizedStartMeta = this.isDraftRowPinPosition(startRowLeaf.pinPosition)\n                    ? this.getFirstNonGroupMetaFromAbsoluteStartRow(newRowStart)\n                    : startRowLeaf;\n                actualStartRowMeta = {\n                    rowIndex: normalizedStartMeta.rowIndex,\n                    parentKeys: normalizedStartMeta.parentKeys ?? [],\n                    pinPosition: normalizedStartMeta.pinPosition\n                };\n            }\n\n            // For grouped virtual end meta, remaining page span should be counted from\n            // actualStartRowMeta (when available) up to calculated end.\n            if (shouldUseGroupedRemainingCount && actualStartRowMeta) {\n                const rowsFromActualStartMeta = Math.max(\n                    this.getLeafChildCountFromMetaToAbsoluteEnd(actualStartRowMeta, newRowEnd),\n                    0\n                );\n                // Keep baseline count when actualStartRowMeta cannot be resolved to a usable range.\n                if (rowsFromActualStartMeta > 0) {\n                    rowsCountForRemaining = rowsFromActualStartMeta;\n                }\n            }\n            const remainingCount = Math.max(effectivePage - rowsCountForRemaining, 0);\n            const remainingIndexSpan = Math.max(remainingCount - 1, 0);\n\n            if (endEmptyGroupMeta) {\n                actualEndRowMeta = {\n                    rowIndex: remainingIndexSpan,\n                    parentKeys: endEmptyGroupMeta.parentKeys ?? [],\n                    pinPosition: 'middle'\n                };\n            } else if (endRowLeaf) {\n                const groupedEndIndex = endRowLeaf.rowIndex + remainingIndexSpan;\n                actualEndRowMeta = {\n                    // Grouped contexts: last leaf index in end group + remaining span.\n                    // Flat contexts: send buffered end row of the current page window.\n                    rowIndex: shouldUseGroupedRemainingCount ? groupedEndIndex : endRowLeaf.rowIndex,\n                    parentKeys: endRowLeaf.parentKeys ?? [],\n                    pinPosition: endRowLeaf.pinPosition\n                };\n            }\n        }\n        \n        const finalViewport = {\n            startRow: newRowStart,\n            endRow: newRowEnd,\n            startColumn: newColStart,\n            endColumn: newColEnd,\n            actualStartRow,\n            actualEndRow,\n            actualStartColumn: actualStartCol,\n            actualEndColumn: actualEndCol,\n            startRowLeaf,\n            endRowLeaf,\n            actualStartRowMeta,\n            actualEndRowMeta,\n            leafChildCountInViewport,\n            expandedGroupCount,\n            collapsedGroupCount\n        };\n        const api = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER);\n        this.dispatchEvent({\n            type : Events.EVENT_VIEWPORT_RANGE_UPDATED,\n            range: finalViewport,\n            api  : api\n        })\n        return finalViewport;\n    }\n\n    // --- Draft row: logical end leaf for viewport range (not top/bottom draft when data exists) ---\n\n    resolveStartRowLeafMetaForDraftRows(leafMetas: IRowMeta[], bufferedStartRowIndex: number): IRowMeta {\n        const fromLeafList = this.resolveStartRowLeafFromLeafListForDraftRows(leafMetas);\n        if (fromLeafList != null) {\n            return fromLeafList;\n        }\n        return this.getFirstNonGroupMetaFromAbsoluteStartRow(bufferedStartRowIndex);\n    }\n\n    resolveEndRowLeafMetaForDraftRows(leafMetas: IRowMeta[], bufferedEndRowIndex: number): IRowMeta {\n        const fromLeafList = this.resolveEndRowLeafFromLeafListForDraftRows(leafMetas);\n        if (fromLeafList != null) {\n            return fromLeafList;\n        }\n        return this.getLastNonDraftNonGroupMetaFromAbsoluteEndRow(bufferedEndRowIndex);\n    }\n\n    resolveStartRowLeafFromLeafListForDraftRows(leafMetas: IRowMeta[]): IRowMeta | null {\n        if (leafMetas.length === 0) {\n            return null;\n        }\n        for (let i = 0; i < leafMetas.length; i++) {\n            const meta = leafMetas[i];\n            if (!this.isDraftRowPinPosition(meta?.pinPosition)) {\n                return meta;\n            }\n        }\n        return null;\n    }\n\n    getLastNonDraftNonGroupMetaFromAbsoluteEndRow(endRowIndex: number): IRowMeta {\n        const rh = this.recordHandler as any;\n        const getMeta = (idx: number) => rh.getMetaByAbsoluteIndex(idx) as IRowMeta | undefined;\n        const endMeta = getMeta(endRowIndex);\n        if (!this.isDraftRowPinPosition(endMeta?.pinPosition) && !this.isGroupMeta(endMeta)) {\n            return endMeta as IRowMeta;\n        }\n        for (let idx = endRowIndex - 1; idx >= 0; idx--) {\n            const adjusted = getMeta(idx);\n            if (!this.isDraftRowPinPosition(adjusted?.pinPosition) && !this.isGroupMeta(adjusted)) {\n                return adjusted as IRowMeta;\n            }\n        }\n        // If no non-group leaf exists in range, still never return a draft meta.\n        for (let idx = endRowIndex; idx >= 0; idx--) {\n            const adjusted = getMeta(idx);\n            if (!this.isDraftRowPinPosition(adjusted?.pinPosition)) {\n                return adjusted as IRowMeta;\n            }\n        }\n        return {\n            rowIndex: -1,\n            parentKeys: [],\n            pinPosition: 'middle'\n        };\n    }\n\n    getFirstNonGroupMetaFromAbsoluteStartRow(startRowIndex: number): IRowMeta {\n        const rh = this.recordHandler as any;\n        const rowAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_API);\n        const rowCount = rowAPI.getRowCount();\n        for (let idx = Math.max(startRowIndex, 0); idx < rowCount; idx++) {\n            const meta = rh.getMetaByAbsoluteIndex(idx) as IRowMeta | undefined;\n            if (meta && !this.isDraftRowPinPosition(meta.pinPosition) && !this.isGroupMeta(meta)) {\n                return meta;\n            }\n        }\n        const fallbackMeta = rh.getMetaByAbsoluteIndex(startRowIndex) as IRowMeta | undefined;\n        if (fallbackMeta && !this.isDraftRowPinPosition(fallbackMeta.pinPosition)) {\n            return fallbackMeta;\n        }\n        return {\n            rowIndex: -1,\n            parentKeys: [],\n            pinPosition: 'middle'\n        };\n    }\n\n    isGroupMeta(meta: IRowMeta | undefined): boolean {\n        if (!meta) {\n            return false;\n        }\n        const absoluteIndex = this.recordHandler.getIndexByMeta(\n            meta.rowIndex,\n            meta.pinPosition as any,\n            meta.parentKeys || []\n        );\n        if (absoluteIndex == null || absoluteIndex < 0) {\n            return false;\n        }\n        const middleHandler: any = this.recordHandler.getMiddleHandler();\n        const rowNode = middleHandler?.getRowNodeByVisibleIndex?.(absoluteIndex);\n        return !!rowNode?.isGroupRow?.();\n    }\n\n    /**\n     * Leaf metas from `getLeafChildrenExcludingCollapsed` (visual order): prefer last non-draft\n     * in the same group, else last non-draft of the previous expanded group in the list.\n     */\n    resolveEndRowLeafFromLeafListForDraftRows(leafMetas: IRowMeta[]): IRowMeta | null {\n        if (leafMetas.length === 0) {\n            return null;\n        }\n        const last = leafMetas[leafMetas.length - 1];\n        if (!this.isDraftRowPinPosition(last?.pinPosition)) {\n            return last;\n        }\n        const targetKeys = last.parentKeys ?? [];\n        for (let i = leafMetas.length - 2; i >= 0; i--) {\n            const m = leafMetas[i];\n            if (this.isDraftRowPinPosition(m?.pinPosition)) {\n                continue;\n            }\n            if (this.sameLeafGroupParentKeys(m.parentKeys, targetKeys)) {\n                return m;\n            }\n        }\n        for (let i = leafMetas.length - 2; i >= 0; i--) {\n            const m = leafMetas[i];\n            if (this.isDraftRowPinPosition(m?.pinPosition)) {\n                continue;\n            }\n            if (this.sameLeafGroupParentKeys(m.parentKeys, targetKeys)) {\n                continue;\n            }\n            return m;\n        }\n        return null;\n    }\n\n    isDraftRowPinPosition(pinPosition: string | undefined): boolean {\n        return pinPosition === 'topDraftRow' || pinPosition === 'bottomDraftRow';\n    }\n\n    sameLeafGroupParentKeys(a: string[] | undefined, b: string[] | undefined): boolean {\n        const aa = a ?? [];\n        const bb = b ?? [];\n        if (aa.length !== bb.length) {\n            return false;\n        }\n        return aa.every((k, i) => k === bb[i]);\n    }\n\n    getLeafNodesFromViewport(startRowMeta: IRowMeta, endRowMeta: IRowMeta): any[] {\n        const startAbsoluteIndex = this.recordHandler.getIndexByMeta(\n            startRowMeta.rowIndex,\n            startRowMeta.pinPosition as any,\n            startRowMeta.parentKeys || []\n        );\n        const endAbsoluteIndex = this.recordHandler.getIndexByMeta(\n            endRowMeta.rowIndex,\n            endRowMeta.pinPosition as any,\n            endRowMeta.parentKeys || []\n        );\n        \n        const rowAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_API);\n        const rowCount = rowAPI.getRowCount();\n        const pinAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.PINNING_API);\n        const topPinnedCount = pinAPI.getTopPinnedRows().length;\n        \n        const { startRow: bufferedStartIndex, endRow: bufferedEndIndex } = calculateRowRange(\n            startAbsoluteIndex,\n            endAbsoluteIndex,\n            this.rowBufferSize,\n            this.rowPageSize,\n            topPinnedCount,\n            rowCount - 1\n        );\n        \n        const bufferedStartRowMeta = (this.recordHandler as any).getMetaByAbsoluteIndex(bufferedStartIndex);\n        const bufferedEndRowMeta = (this.recordHandler as any).getMetaByAbsoluteIndex(bufferedEndIndex);\n        \n        let finalStartRowMeta = bufferedStartRowMeta;\n        let finalEndRowMeta = bufferedEndRowMeta;\n        \n        if (!finalStartRowMeta) {\n            finalStartRowMeta = this.recordHandler.getFirstLeafRowMeta();\n        }\n        const middleHandler = this.recordHandler.getMiddleHandler();\n        \n        if (!finalEndRowMeta) {\n            const lastIndexMeta = this.recordHandler.getLastIndexMeta();\n            if (lastIndexMeta) {\n                finalEndRowMeta = (middleHandler as any).getLastLeafRowMeta(lastIndexMeta);\n                if (!finalEndRowMeta) {\n                    finalEndRowMeta = lastIndexMeta;\n                }\n            } else {\n                finalEndRowMeta = finalStartRowMeta;\n            }\n        }\n        \n        const leafChilds = finalStartRowMeta && finalEndRowMeta \n            ? (middleHandler as any).getLeafChildrenExcludingCollapsed?.(finalStartRowMeta, finalEndRowMeta)\n            : [];\n        \n        return leafChilds ?? [];\n    }\n\n    /**\n     * Leaf rows in the viewport range via `getLeafChildrenExcludingCollapsed` (array length); otherwise non-group visible row count.\n     */\n    private getLeafChildCountInViewport(absoluteStartRow: number, absoluteEndRow: number): number {\n        if (absoluteStartRow < 0 || absoluteEndRow < absoluteStartRow) {\n            return 0;\n        }\n\n        const recordHandler: any = this.recordHandler;\n        const startMeta = recordHandler.getMetaByAbsoluteIndex?.(absoluteStartRow) as IRowMeta | undefined;\n        const endMeta = recordHandler.getMetaByAbsoluteIndex?.(absoluteEndRow) as IRowMeta | undefined;\n        const middleHandler: any = this.recordHandler.getMiddleHandler();\n\n        // Preferred path: let row-model provide leaf metas for the absolute range.\n        const leafChildren = middleHandler?.getLeafChildrenExcludingCollapsed?.(startMeta, endMeta);\n        if (Array.isArray(leafChildren)) {\n            return leafChildren.filter((meta: IRowMeta) => !this.isDraftRowPinPosition(meta?.pinPosition)).length;\n        }\n\n        // Fallback path: visible-row scan.\n        let leafChildCount = 0;\n        for (let rowIndex = absoluteStartRow; rowIndex <= absoluteEndRow; rowIndex++) {\n            const rowNode = middleHandler?.getRowNodeByVisibleIndex?.(rowIndex);\n            if (!rowNode) {\n                continue;\n            }\n            if (this.isDraftRowPinPosition(rowNode.getPinnedPosition?.())) {\n                continue;\n            }\n            if (rowNode.isGroupRow?.()) {\n                // Include nested group leaf descendants as requested.\n                leafChildCount += this.getLeafDescendantCountForGroupNode(rowNode);\n                // Skip traversing rows inside this group in the outer loop to avoid double counting.\n                const groupEndIndex = rowNode.getLastRowInGroup?.();\n                if (typeof groupEndIndex === 'number' && groupEndIndex > rowIndex) {\n                    rowIndex = Math.min(groupEndIndex, absoluteEndRow);\n                }\n                continue;\n            }\n            leafChildCount++;\n        }\n        return leafChildCount;\n    }\n\n    private getLeafChildCountByLeafMetas( startRowLeaf: IRowMeta | null, endRowLeaf: IRowMeta | null, absoluteStartRow: number, absoluteEndRow: number ): number {\n        if (!startRowLeaf || !endRowLeaf) {\n            return this.getLeafChildCountInViewport(absoluteStartRow, absoluteEndRow);\n        }\n        const middleHandler: any = this.recordHandler.getMiddleHandler();\n        const leafChildren = middleHandler?.getLeafChildrenExcludingCollapsed?.(startRowLeaf, endRowLeaf);\n        if (Array.isArray(leafChildren)) {\n            return leafChildren.filter((meta: IRowMeta) => !this.isDraftRowPinPosition(meta?.pinPosition)).length;\n        }\n        return this.getLeafChildCountInViewport(absoluteStartRow, absoluteEndRow);\n    }\n\n    private getLeafDescendantCountForGroupNode(rowNode: any): number {\n        const allChildren = rowNode?.getAllChildren?.();\n        if (!Array.isArray(allChildren)) {\n            return 0;\n        }\n        const countLeafs = (node: any): number => {\n            if (!node || this.isDraftRowPinPosition(node?.getPinnedPosition?.())) {\n                return 0;\n            }\n            if (!node?.isGroupRow?.()) {\n                return 1;\n            }\n            const children = node?.getAllChildren?.();\n            if (!Array.isArray(children) || children.length === 0) {\n                return 0;\n            }\n            let total = 0;\n            for (const child of children) {\n                total += countLeafs(child);\n            }\n            return total;\n        };\n        let leafCount = 0;\n        for (const childNode of allChildren) {\n            leafCount += countLeafs(childNode);\n        }\n        return leafCount;\n    }\n\n    private getLeafChildCountFromMetaToAbsoluteEnd(startMeta: IRowMeta, absoluteEndRow: number): number {\n        if (!startMeta || absoluteEndRow < 0) {\n            return 0;\n        }\n        const startAbsoluteIndex = this.recordHandler.getIndexByMeta(\n            startMeta.rowIndex,\n            (startMeta.pinPosition ?? 'middle') as any,\n            startMeta.parentKeys || []\n        );\n        if (startAbsoluteIndex == null || startAbsoluteIndex < 0 || startAbsoluteIndex > absoluteEndRow) {\n            return 0;\n        }\n        return this.getLeafChildCountInViewport(startAbsoluteIndex, absoluteEndRow);\n    }\n\n    private findExpandedEmptyGroupVirtualMetaInViewport(\n        absoluteStartRow: number,\n        absoluteEndRow: number,\n        side: 'start' | 'end'\n    ): IRowMeta | null {\n        if (absoluteStartRow < 0 || absoluteEndRow < absoluteStartRow) {\n            return null;\n        }\n\n        const middleHandler: any = this.recordHandler.getMiddleHandler();\n        const readAt = (rowIndex: number): IRowMeta | null => {\n            const rowNode = middleHandler?.getRowNodeByVisibleIndex?.(rowIndex);\n            if (!rowNode?.isGroupRow?.() || rowNode?.isCollapsed?.()) {\n                return null;\n            }\n            const isLeafGroup = rowNode?.isLeafGroup?.() ?? false;\n            if (!isLeafGroup) {\n                return null;\n            }\n            const leafDescCount = this.getLeafDescendantCountForGroupNode(rowNode);\n            if (leafDescCount !== 0) {\n                return null;\n            }\n            return {\n                rowIndex: 0,\n                parentKeys: rowNode?.getGroupValues?.() ?? [],\n                pinPosition: 'middle'\n            };\n        };\n\n        if (side === 'start') {\n            for (let rowIndex = absoluteStartRow; rowIndex <= absoluteEndRow; rowIndex++) {\n                const meta = readAt(rowIndex);\n                if (meta) {\n                    return meta;\n                }\n            }\n            return null;\n        }\n\n        for (let rowIndex = absoluteEndRow; rowIndex >= absoluteStartRow; rowIndex--) {\n            const meta = readAt(rowIndex);\n            if (meta) {\n                return meta;\n            }\n        }\n        return null;\n    }\n\n    /**\n     * Every visible group row (`isGroupRow`), using `isCollapsed()` which already treats a node as collapsed\n     * when an ancestor group is collapsed (so nested groups match UI even if their own `expanded` flag is true).\n     */\n    private getGroupExpandedCollapsedCountsInViewport(\n        absoluteStartRow: number,\n        absoluteEndRow: number\n    ): { expandedGroupCount: number; collapsedGroupCount: number } {\n        const empty = { expandedGroupCount: 0, collapsedGroupCount: 0 };\n        if (absoluteStartRow < 0 || absoluteEndRow < absoluteStartRow) {\n            return empty;\n        }\n\n        const middleHandler: any = this.recordHandler.getMiddleHandler();\n        let expandedGroupCount = 0;\n        let collapsedGroupCount = 0;\n        for (let rowIndex = absoluteStartRow; rowIndex <= absoluteEndRow; rowIndex++) {\n            const rowNode = middleHandler?.getRowNodeByVisibleIndex?.(rowIndex);\n            if (!rowNode?.isGroupRow?.()) {\n                continue;\n            }\n            if (rowNode.isCollapsed?.()) {\n                collapsedGroupCount++;\n            } else {\n                expandedGroupCount++;\n            }\n        }\n        return { expandedGroupCount, collapsedGroupCount };\n    }\n\n}\n\nexport interface BlockRange {\n  startRow: number;\n  endRow: number;\n  startCol: number;\n  endCol: number;\n}\n\nexport interface ViewportInput {\n  firstRow: number;\n  lastRow: number;\n\n  firstCol: number;\n  lastCol: number;\n\n  totalRows: number;\n  totalCols: number;\n}\n\nexport interface ViewportUpdateResult {\n  startRow: number;\n  endRow: number;\n\n  startColumn: number;\n  endColumn: number;\n\n  actualStartRow: number;\n  actualEndRow: number;\n  actualStartColumn: number;\n  actualEndColumn: number;\n  startRowLeaf: IRowMeta | null;\n  endRowLeaf: IRowMeta | null;\n  actualStartRowMeta: IRowMeta | null;\n  actualEndRowMeta: IRowMeta | null;\n  leafChildCountInViewport: number;\n  expandedGroupCount: number;\n  collapsedGroupCount: number;\n}\n\n\nfunction calculateColumnRange( firstRenderedCol: number, lastRenderedCol: number, buffer: number, pageSize: number, pinCount: number, max: number ) {\n  if (lastRenderedCol === -1) {\n    return { startCol: pinCount, endCol: -1, actualStartCol: pinCount, actualEndCol: -1 };\n  }\n\n  const effectivePage = Math.max(pageSize, 1);\n  const stride = Math.max(Math.floor(effectivePage / 2), 1);\n\n  const normalizedStart = Math.max(firstRenderedCol - buffer, pinCount);\n  const maxStart = Math.max(max - (effectivePage - 1), pinCount);\n\n  const blockIndex = Math.floor((normalizedStart - pinCount) / stride);\n  const candidateStart = blockIndex * stride + pinCount;\n  const boundedStart = Math.min(Math.max(candidateStart, pinCount), maxStart);\n\n  const candidateEnd = candidateStart + effectivePage - 1;\n  const boundedEnd = Math.min(boundedStart + effectivePage - 1, max);\n\n  return { startCol: boundedStart, endCol: boundedEnd, actualStartCol: candidateStart, actualEndCol: candidateEnd };\n}\n\n\nfunction calculateRowRange( firstRenderedRow: number, lastRenderedRow: number, buffer: number, pageSize: number, pinCount: number, max: number ) {\n  if (lastRenderedRow === -1) {\n    return { startRow: pinCount, endRow: -1, actualStartRow: pinCount, actualEndRow: -1 };\n  }\n\n  const effectivePage = Math.max(pageSize, 1);\n  const stride = Math.max(Math.floor(effectivePage / 2), 1);\n\n  const normalizedStart = Math.max(firstRenderedRow - buffer, pinCount);\n  const maxStart = Math.max(max - (effectivePage - 1), pinCount);\n\n  const blockIndex = Math.floor((normalizedStart - pinCount) / stride);\n  const candidateStart = blockIndex * stride + pinCount;\n  const boundedStart = Math.min(Math.max(candidateStart, pinCount), maxStart);\n\n  const candidateEnd = candidateStart + effectivePage - 1;\n  const boundedEnd = Math.min(boundedStart + effectivePage - 1, max);\n\n  return { startRow: boundedStart, endRow: boundedEnd, actualStartRow: candidateStart, actualEndRow: candidateEnd };\n}\n","import { Bean, EventEmitter } from '@dg/corecomponent';\nimport { IActionRegistry } from './action-registry.types';\n\n@Bean('actionRegistry')\nexport class ActionRegistry<T = any> extends EventEmitter implements IActionRegistry<T> {\n  private actions: Record<string, (params : T) => void> = {};\n\n  /**\n   * Registers a new action.\n   * @param actionName - The name of the action.\n   * @param actionCallback - The function to execute for this action.\n   */\n  registerAction(actionName: string, actionCallback: (params : T) => void): void {\n    if (typeof actionCallback !== 'function') {\n      throw new Error('Action callback must be a function.');\n    }\n    this.actions[actionName] = actionCallback;\n  }\n\n  /**\n   * Unregisters an existing action.\n   * @param actionName - The name of the action to unregister.\n   */\n  unregisterAction(actionName: string): void {\n    if (this.actions[actionName]) {\n      delete this.actions[actionName];\n    } else {\n      console.warn(`Action ${actionName} not found.`);\n    }\n  }\n\n  /**\n   * Retrieves an action by its name.\n   * @param actionName - The name of the action to retrieve.\n   * @returns The action function, or undefined if not found.\n   */\n  getAction(actionName: string): ((params : T) => void) | undefined {\n    return this.actions[actionName];\n  }\n\n  /**\n   * Executes an action by its name.\n   * @param actionName - The name of the action to execute.\n   */\n  executeAction(actionName: string, params : T): void {\n    const action = this.getAction(actionName);\n    if (action) {\n      action(params);\n    } else {\n      console.error(`Action ${actionName} not found.`);\n    }\n  }\n}","import { AutoWired, Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { IActionRegistry } from \"./action-registry.types\";\n\nexport interface ShortcutParams {\n    event: KeyboardEvent;\n    [key: string]: any;\n}\n\ninterface ShortcutAction {\n    action: string | ((params: ShortcutParams) => void);\n}\n\n@Bean('keyBoardShortCutRegistry')\nexport class KeyboardShortcutRegistry extends EventEmitter {\n    private registry: Map<string, ShortcutAction>;\n    @AutoWired('actionRegistry') private actionRegistry: IActionRegistry<ShortcutParams>;\n\n    constructor() {\n        super();\n        this.registry = new Map();\n    }\n\n    /**\n     * Registers a new keyboard shortcut.\n     * @param keyCombo - The key combination for the shortcut (e.g., \"Ctrl+ArrowLeft\").\n     * @param action - The action to perform, either a string (action name) or a callback function.\n     */\n    registerShortcut(keyCombo: string, action: string | ((params: ShortcutParams) => void)): void {\n        this.registry.set(keyCombo.toUpperCase(), { action });\n    }\n\n    /**\n     * Unregisters a keyboard shortcut.\n     * @param keyCombo - The key combination for the shortcut to be removed.\n     */\n    unregisterShortcut(keyCombo: string): void {\n        this.registry.delete(keyCombo.toUpperCase());\n    }\n\n    /**\n     * Executes the action associated with a keyboard shortcut.\n     * @param keyCombo - The key combination for the shortcut to execute.\n     * @param params - Parameters to pass to the action callback, typically including the event.\n     */\n    executeShortcut(keyCombo: string, params: ShortcutParams): boolean {\n        const shortcutAction = this.registry.get(keyCombo.toUpperCase());\n        if (shortcutAction) {\n            const { action } = shortcutAction;\n            if (typeof action === 'string') {\n                this.actionRegistry.executeAction(action, params);\n                return true;\n            } else if (typeof action === 'function') {\n                action(params);\n                return true;\n            }\n        }\n        return false;\n    }\n}","import { IGenericDataStore } from \"./generic-data-store.types\";\n\nexport class GenericDataStore<T> implements IGenericDataStore<T> {\n    private dataMap: Map<string, T>;\n    private order: string[];\n  \n    constructor() {\n      this.dataMap = new Map();\n      this.order = [];\n    }\n  \n    /**\n     * Add a new data item to the store.\n     * @param id - Unique identifier for the data item.\n     * @param data - Data item to store.\n     */\n    addData(id: string, data: T): void {\n      if (!this.dataMap.has(id)) {\n        this.dataMap.set(id, data);\n        this.order.push(id);\n      }\n    }\n  \n    /**\n     * Retrieve a data item by its ID.\n     * @param id - The ID of the data item.\n     */\n    getData(id: string): T | undefined {\n      return this.dataMap.get(id);\n    }\n  \n    /**\n     * Remove a data item by its ID.\n     * @param id - The ID of the data item to remove.\n     * @returns True if the data was removed, false otherwise.\n     */\n    removeData(id: string): boolean {\n      if (this.dataMap.has(id)) {\n        this.dataMap.delete(id);\n        this.order = this.order.filter((orderId) => orderId !== id);\n        return true;\n      }\n      return false;\n    }\n  \n    /**\n     * Check if a data item exists in the store.\n     * @param id - The ID to check.\n     */\n    hasData(id: string): boolean {\n      return this.dataMap.has(id);\n    }\n  \n    /**\n     * Get all data items in order.\n     */\n    getAllData(): T[] {\n      return this.order.map((id) => this.dataMap.get(id)!) as T[];\n    }\n  \n    /**\n     * Insert a new data item after an existing one.\n     * @param existingId - The ID of the existing data item.\n     * @param newId - The ID of the new data item.\n     * @param newData - The new data item.\n     */\n    insertDataAfterId(existingId: string, newId: string, newData: T): boolean {\n      const index = this.order.indexOf(existingId);\n      if (index === -1 || this.dataMap.has(newId)) {\n        return false;\n      }\n  \n      this.order.splice(index + 1, 0, newId);\n      this.dataMap.set(newId, newData);\n      return true;\n    }\n  \n    /**\n     * Insert a new data item before an existing one.\n     * @param existingId - The ID of the existing data item.\n     * @param newId - The ID of the new data item.\n     * @param newData - The new data item.\n     */\n    insertDataBeforeId(existingId: string, newId: string, newData: T): boolean {\n      const index = this.order.indexOf(existingId);\n      if (index === -1 || this.dataMap.has(newId)) {\n        return false;\n      }\n  \n      this.order.splice(index, 0, newId);\n      this.dataMap.set(newId, newData);\n      return true;\n    }\n  \n    /**\n     * Delete all data items after a specific ID.\n     * @param id - The ID after which data items should be deleted.\n     */\n    deleteDataAfterId(id: string): void {\n      const index = this.order.indexOf(id);\n      if (index !== -1 && index < this.order.length - 1) {\n        const idsToDelete = this.order.splice(index + 1);\n        idsToDelete.forEach((deleteId) => this.dataMap.delete(deleteId));\n      }\n    }\n  \n    /**\n     * Delete all data items before a specific ID.\n     * @param id - The ID before which data items should be deleted.\n     */\n    deleteDataBeforeId(id: string): void {\n      const index = this.order.indexOf(id);\n      if (index !== -1 && index > 0) {\n        const idsToDelete = this.order.splice(0, index);\n        idsToDelete.forEach((deleteId) => this.dataMap.delete(deleteId));\n      }\n    }\n  \n    /**\n     * Retrieve data items within a range of indices.\n     * @param fromIndex - The start index (inclusive).\n     * @param toIndex - The end index (inclusive).\n     */\n    getDataInRange(fromIndex: number, toIndex: number): T[] {\n      if (fromIndex < 0 || toIndex >= this.order.length || fromIndex > toIndex) {\n        return [];\n      }\n  \n      const idsInRange = this.order.slice(fromIndex, toIndex + 1);\n      return idsInRange.map((id) => this.dataMap.get(id)!) as T[];\n    }\n\n    getNextId(id: string): string | null {\n        let index = this.order.findIndex((existingId) => existingId === id);\n    \n        if (index !== -1) {\n            \n            if (index + 1 < this.order.length) {\n                return this.order[index + 1]; \n            }\n        }\n    \n        return null; \n    }\n\n    getPreviousId(id: string): string | null {\n        let index = this.order.findIndex((existingId) => existingId === id);\n    \n        if (index > 0) {\n            return this.order[index - 1]; \n        }\n    \n        return null; \n    }\n\n    getFirstId(): string | null {\n        if (this.order.length > 0) {\n            return this.order[0]; \n        }\n    \n        return null; \n    }\n\n    getLastId(): string | null {\n        if (this.order.length > 0) {\n            return this.order[this.order.length - 1]; \n        }\n    \n        return null; \n    }\n\n    getOrders(): string[] {\n      return this.order ?? [];\n    }\n  }\n  ","import { IKeyBoardShortcutsParams } from \"../Main\";\nexport const KeyboardShortcuts: IKeyBoardShortcutsParams[] = [\n    { shortcut: 'arrowup', action: 'navigateToCellUp' },\n    { shortcut: 'arrowdown', action: 'navigateToCellDown' },\n    { shortcut: 'arrowleft', action: 'navigateToCellLeft' },\n    { shortcut: 'arrowright', action: 'navigateToCellRight' },\n    { shortcut: 'ctrl+arrowup', action: 'navigateToFirstCellInColumn' },\n    { shortcut: 'ctrl+arrowdown', action: 'navigateToLastCellInColumn' },\n    { shortcut: 'ctrl+arrowleft', action: 'navigateToFirstCellInRow' },\n    { shortcut: 'ctrl+arrowright', action: 'navigateToLastCellInRow' },\n    { shortcut: 'tab', action: 'navigateNextToFocus' },\n    { shortcut: 'shift+tab', action: 'navigatePreviousToFocus' },\n    { shortcut: 'ctrl+shift+arrowright', action: 'extendToLastCellInRow' },\n    { shortcut: 'ctrl+shift+arrowleft', action: 'extendToFirstCellInRow' },\n    { shortcut: 'ctrl+shift+arrowup', action: 'extendToFirstCellInColumn' },\n    { shortcut: 'ctrl+shift+arrowdown', action: 'extendToLastCellInColumn' },\n    { shortcut: 'shift+arrowright', action: 'extendCellToRight' },\n    { shortcut: 'shift+arrowleft', action: 'extendCellToLeft' },\n    { shortcut: 'shift+arrowup', action: 'extendCellToTop' },\n    { shortcut: 'shift+arrowdown', action: 'extendCellToBottom' },\n    { shortcut: 'enter', action: 'openEditorAndNavigate' },\n    { shortcut: 'shift+enter', action: 'openEditorAndNavigate' },\n    { shortcut: 'backspace', action: 'dataEditOrClear' },\n    { shortcut: 'ctrl+c', action: 'gridCopy' },\n    { shortcut: 'ctrl+x', action: 'gridCut' },\n    { shortcut: 'ctrl+v', action: 'gridPaste' },\n    { shortcut: 'ctrl+a', action: 'gridSelectAll' },\n    { shortcut: 'control+space', action: 'selectColumnAsRange' },\n    { shortcut: 'shift+space', action: 'selectRowAsRange' },\n    { shortcut: 'ctrl+end', action: 'navigateToLastRowLastColumn' },\n    { shortcut: 'ctrl+home', action: 'navigateToFirstRowFirstColumn' },\n    { shortcut: 'pageup', action: 'navigateToTopOfColumnInView' },\n    { shortcut: 'pagedown', action: 'navigateToBottomOfColumnInView' },\n    { shortcut: 'home', action: 'navigateToFirstCellInRow' },\n    { shortcut: 'end', action: 'navigateToLastCellInRow' },\n    { shortcut: 'delete', action: 'dataClearOnBackspace' },\n    { shortcut: 'escape', action: 'handleGridEscape' },\n    // { shortcut: 'escape', action: 'stopEditing' },\n    { shortcut: 'F2', action : 'openEditorAndNavigate' },\n    { shortcut: 'ctrl+f', action: 'openGridFind' }\n];\n","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { areArraysEqual } from \"./utils/Object\";\nimport { IStateHandler } from \"./Interface/IStateHandler\";\nimport { GRID_BEAN_NAME } from \"./Constants/BeanName\";\nimport { RowRenderController } from \"./Rows/RowRenderController\";\nimport { CellPositionType } from \"./Navigation/cell-position.types\";\nimport { Events } from \"./Constants/Events\";\n\ninterface ActiveStateConfig {\n    cellPosition: CellPositionType | null;\n    clearMethod: (cellCtrl: any) => void;\n    clearStateMethod: () => void;\n}\n\n@Bean('stateHandler')\nexport class StateHandler extends EventEmitter implements IStateHandler {\n    private userPresenceActive : CellPositionType | null = null;\n    private editorTooltipActive : CellPositionType | null = null;\n\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRenderController : RowRenderController;\n\n    @PostConstruct()\n    init() {\n        const handleScroll = () => this.handleScrollEvent();\n        this.addListener(this.eventHandler, Events.EVENT_VERTICAL_SCROLL, handleScroll);\n        this.addListener(this.eventHandler, Events.EVENT_HORIZONTAL_SCROLL, handleScroll);\n        this.addListener(this.eventHandler, 'destroyEditorTooltip', this.handleEditorTooltipEvent.bind(this));\n    }\n\n    private handleScrollEvent() {\n        const activeStates: ActiveStateConfig[] = [\n            {\n                cellPosition: this.userPresenceActive,\n                clearMethod: (cellCtrl) => cellCtrl.clearUserPresenceDropdown(),\n                clearStateMethod: () => this.clearUserPresenceActive()\n            },\n            {\n                cellPosition: this.editorTooltipActive,\n                clearMethod: (cellCtrl) => cellCtrl.clearEditorTooltip(),\n                clearStateMethod: () => this.clearEditorTooltipActive()\n            }\n        ];\n\n        activeStates.forEach(state => {\n            if (state.cellPosition) {\n                this.clearActiveState(state.cellPosition, state.clearMethod, state.clearStateMethod);\n            }\n        });\n    }\n\n    private handleEditorTooltipEvent() {\n        const activeStates: ActiveStateConfig[] = [\n            {\n                cellPosition: this.editorTooltipActive,\n                clearMethod: (cellCtrl) => cellCtrl.clearEditorTooltip(),\n                clearStateMethod: () => this.clearEditorTooltipActive()\n            }\n        ];\n\n        activeStates.forEach(state => {\n            if (state.cellPosition) {\n                this.clearActiveState(state.cellPosition, state.clearMethod, state.clearStateMethod);\n            }\n        });\n    }\n\n    private clearActiveState(\n        cellPosition: CellPositionType,\n        clearCellMethod: (cellCtrl: any) => void,\n        clearStateMethod: () => void\n    ) {\n        const rowCtrl = this.rowRenderController.getRowByPosition(cellPosition);\n        if (!rowCtrl) {\n            return;\n        }\n\n        const cellCtrl = rowCtrl.getCellController(cellPosition.columnID);\n        if (!cellCtrl) {\n            return;\n        }\n\n        clearCellMethod(cellCtrl);\n        clearStateMethod();\n    }\n\n    private areCellPositionsEqual(position1: CellPositionType, position2: CellPositionType): boolean {\n        return position1.columnID === position2.columnID &&\n               position1.rowIndex === position2.rowIndex &&\n               position1.pinPosition === position2.pinPosition &&\n               areArraysEqual(position1.parentKeys, position2.parentKeys);\n    }\n\n    setUserPresenceActive(cellPosition : CellPositionType) {\n        this.userPresenceActive = cellPosition;\n    }\n\n    setEditorTooltipActive(cellPosition : CellPositionType) {\n        this.editorTooltipActive = cellPosition;\n    }\n\n    getUserPresenceActive() : CellPositionType | null {\n        return this.userPresenceActive;\n    }\n\n    getEditorTooltipActive() : CellPositionType | null {\n        return this.editorTooltipActive;\n    }\n\n    clearUserPresenceActive() {\n        this.userPresenceActive = null;\n    }\n    \n    clearEditorTooltipActive() {\n        this.editorTooltipActive = null;\n    }\n\n    isUserPresenceActive(cellPosition : CellPositionType) : boolean {\n        return this.userPresenceActive !== null && \n               this.areCellPositionsEqual(this.userPresenceActive, cellPosition);\n    }\n\n    isEditorTooltipActive(cellPosition : CellPositionType) : boolean {\n        return this.editorTooltipActive !== null && \n               this.areCellPositionsEqual(this.editorTooltipActive, cellPosition);\n    }\n\n    clearAllActive() {\n        this.userPresenceActive = null;\n        this.editorTooltipActive = null;\n    }\n\n    destroy() {\n        this.clearAllActive();\n    }\n}","import { GridOptioHandler } from \"../GridOptionHandler\";\nimport { setAriaHidden } from \"./aria\";\nconst supports: { [key: string]: boolean } = {};\n\nexport interface IElementSize {\n\theight           : number;\n\twidth            : number;\n\tborderTopWidth   : number;\n\tborderRightWidth : number;\n\tborderBottomWidth: number;\n\tborderLeftWidth  : number;\n\tpaddingTop       : number;\n\tpaddingRight     : number;\n\tpaddingBottom    : number;\n\tpaddingLeft      : number;\n\tmarginTop        : number;\n\tmarginRight      : number;\n\tmarginBottom     : number;\n\tmarginLeft       : number;\n\tboxSizing        : string;\n} \n\nfunction setDisplayed(element: Element, displayed: boolean, options: { skipAriaHidden?: boolean } = {}) {\n    const  { skipAriaHidden } = options;\n    element.classList.toggle('ZG-hidden', !displayed);\n    if (!skipAriaHidden) {\n        setAriaHidden(element, !displayed);\n    }\n}\n\nfunction setVisible(element: HTMLElement, visible: boolean, options: { skipAriaHidden?: boolean } = {}) {\n    const  { skipAriaHidden } = options;\n    element.classList.toggle('ZG-invisible', !visible);\n    if (!skipAriaHidden) {\n        setAriaHidden(element, !visible);\n    }\n}\n\nfunction setDisabled(element: HTMLElement, disabled: boolean) {\n    const attributeName = 'disabled';\n    const addOrRemoveDisabledAttribute = disabled ? (e: HTMLElement) => e.setAttribute(attributeName, '') : (e: HTMLElement) => e.removeAttribute(attributeName);\n\n    addOrRemoveDisabledAttribute(element);\n\n    forEachNodeInList(element.querySelectorAll('input'), input => addOrRemoveDisabledAttribute(input));\n}\n\nfunction forEachNodeInList<T extends Node>(nodeList: NodeListOf<T> | null, action: (value: T) => void): void {\n    if (nodeList == null) { return; }\n\n    for (let i = 0; i < nodeList.length; i++) {\n        action(nodeList[i]);\n    }\n}\n\nfunction cloneNodeList(nodeList: NodeListOf<Node> | null): Node[] {\n    if (nodeList == null) { return []; }\n\n    const result: Node[] = [];\n\n    forEachNodeInList(nodeList, node => result.push(node));\n\n    return result;\n}\n\nfunction forEachAttributeInMap(map: NamedNodeMap, callback: (key: string, value: string) => void): void {\n    if (!map) { return; }\n\n    for (let i = 0; i < map.length; i++) {\n        const attr = map[i];\n        callback(attr.name, attr.value);\n    }\n}\n\nfunction toggleAttribute(element: HTMLElement, name: string, value: any) {\n    if (value == null) {\n        element.removeAttribute(name);\n    } else {\n        element.setAttribute(name, value.toString());\n    }\n}\n\nfunction forEachAttributeInNamedNodeMap(map: NamedNodeMap, callback: (key: string, value: string) => void): void {\n    if (!map) { return; }\n\n    for (let i = 0; i < map.length; i++) {\n        const attr = map[i];\n        callback(attr.name, attr.value);\n    }\n}\n\nfunction isNodeOrHTMLElement(o: any) {\n    return o instanceof Node || o instanceof HTMLElement;\n}\n\nfunction clearElement(el: HTMLElement): void {\n    while (el?.firstChild) {\n        el.firstChild.remove();\n    }\n}\n\nfunction setElementWidth(element: HTMLElement, width: string | number) {\n    if (width === 'flex') {\n        element.style.removeProperty('width');\n        element.style.removeProperty('minWidth');\n        element.style.removeProperty('maxWidth');\n        element.style.flex = '1 1 auto';\n    } else {\n        setFixedWidth(element, width);\n    }\n}\n\nfunction setFixedWidth(element: HTMLElement, width: string | number) {\n    width = formatSize(width);\n    element.style.width = width.toString();\n    element.style.maxWidth = width.toString();\n    element.style.minWidth = width.toString();\n}\n\nfunction formatSize(size: number | string) {\n    if (typeof size === 'number') {\n        return `${size}px`;\n    }\n\n    return size;\n}\n\nfunction addOrRemoveAttribute(element: HTMLElement, name: string, value: any) {\n    if (value == null) {\n        element.removeAttribute(name);\n    } else {\n        element.setAttribute(name, value.toString());\n    }\n}\n\nfunction ensureDomOrder(ContainerElement: HTMLElement, childElement: HTMLElement, ChildElementBefore?: HTMLElement | null): void {\n    if (ChildElementBefore && ChildElementBefore.nextSibling === childElement) {\n        return;\n    }\n\n    if (ChildElementBefore) {\n        if (ChildElementBefore.nextSibling) {\n            ContainerElement.insertBefore(childElement, ChildElementBefore.nextSibling);\n        } else {\n            ContainerElement.appendChild(childElement);\n        }\n    } else {\n        if (ContainerElement.firstChild && ContainerElement.firstChild !== childElement) {\n            ContainerElement.insertAdjacentElement('afterbegin', childElement);\n        }\n    }\n}\n\nfunction insertWithDomOrder( containerElement: HTMLElement, elementTOInsert: HTMLElement, childElementBefore: HTMLElement | null ): void {\n    if (childElementBefore) {\n        childElementBefore.insertAdjacentElement('afterend', elementTOInsert);\n    } else {\n        if (containerElement.firstChild) {\n            containerElement.insertAdjacentElement('afterbegin', elementTOInsert);\n        } else {\n            containerElement.appendChild(elementTOInsert);\n        }\n    }\n}\n\nfunction setFixedHeight(element: HTMLElement, height: string | number) {\n    height = formatSize(height);\n    element.style.height = height.toString();\n    element.style.maxHeight = height.toString();\n    element.style.minHeight = height.toString();\n}\n\nfunction setFixedTop(element: HTMLElement, top: string | number) {\n    top = formatSize(top);\n    element.style.top = top.toString();\n}\n\n\nfunction setFixedLeft(element: HTMLElement, left: string | number) {\n\tleft = formatSize(left);\n\telement.style.left = left.toString();\n}\n\nfunction getControllerFromTargetElement<T>(optionHandler: GridOptioHandler, targetElement: EventTarget | null, type: string): T | null {\n    let sourceElement = targetElement as HTMLElement;\n\n    while (sourceElement) {\n        const component = optionHandler.getDomData(sourceElement, type);\n\n        if (component) {\n            return component as T;\n        }\n\n        sourceElement = sourceElement.parentElement!;\n    }\n\n    return null;\n}\n\nexport function getElementSize(element: HTMLElement): IElementSize{\n\tconst { height, width, borderTopWidth, borderRightWidth, borderBottomWidth, borderLeftWidth, paddingTop, paddingRight, paddingBottom, paddingLeft, marginTop, marginRight, marginBottom, marginLeft, boxSizing, } = window.getComputedStyle(element);\n\n\treturn {\n\t\theight           : parseFloat(height),\n\t\twidth            : parseFloat(width),\n\t\tborderTopWidth   : parseFloat(borderTopWidth),\n\t\tborderRightWidth : parseFloat(borderRightWidth),\n\t\tborderBottomWidth: parseFloat(borderBottomWidth),\n\t\tborderLeftWidth  : parseFloat(borderLeftWidth),\n\t\tpaddingTop       : parseFloat(paddingTop),\n\t\tpaddingRight     : parseFloat(paddingRight),\n\t\tpaddingBottom    : parseFloat(paddingBottom),\n\t\tpaddingLeft      : parseFloat(paddingLeft),\n\t\tmarginTop        : parseFloat(marginTop),\n\t\tmarginRight      : parseFloat(marginRight),\n\t\tmarginBottom     : parseFloat(marginBottom),\n\t\tmarginLeft       : parseFloat(marginLeft),\n\t\tboxSizing,\n\t};\n}\n\nexport interface IRect {\n\ttop: number;\n\tleft: number;\n\tright: number;\n\tbottom: number;\n}\n\nexport function getElementRectWithOffset(element: HTMLElement): IRect {\n\tconst offsetElementRect = element.getBoundingClientRect();\n\tconst { borderTopWidth, borderLeftWidth, borderRightWidth, borderBottomWidth} = getElementSize(element);\n\n\treturn {\n\t\ttop   : offsetElementRect.top + (borderTopWidth ?? 0),\n\t\tleft  : offsetElementRect.left + (borderLeftWidth ?? 0),\n\t\tright : offsetElementRect.right + (borderRightWidth ?? 0),\n\t\tbottom: offsetElementRect.bottom + (borderBottomWidth ?? 0),\n\t};\n}\n\nexport function getAbsoluteHeight(element: HTMLElement): number {\n\tconst size = getElementSize(element);\n\tconst marginRight = size.marginBottom + size.marginTop;\n\n\treturn Math.ceil(element.offsetHeight + marginRight);\n}\n\nexport function getAbsoluteWidth(element: HTMLElement): number {\n\tconst size = getElementSize(element);\n\tconst marginWidth = size.marginLeft + size.marginRight;\n\n\treturn Math.ceil(element.offsetWidth + marginWidth);\n}\n\nexport function removeFromParent(node: Element | null) {\n\tif (node?.parentNode) {\n        node.remove();\n    }\n}\n\nexport function loadTemplate(template: string): HTMLElement {\n\tconst tempDiv = document.createElement('div');\n\ttempDiv.innerHTML = (template || '').trim();\n\n\treturn tempDiv.firstChild as HTMLElement;\n}\n\nexport function offsetHeight(element: HTMLElement) {\n\treturn element && element.clientHeight ? element.clientHeight : 0;\n}\n\nexport function offsetWidth(element: HTMLElement) {\n\treturn element && element.clientWidth ? element.clientWidth : 0;\n}\n\nexport function isVisible(element: HTMLElement) {\n    return element.offsetParent !== null;\n}\n\nexport function getInnerHeight(el: HTMLElement): number {\n    const size = getElementSize(el);\n\n    if (size.boxSizing === 'border-box') {\n        return size.height - size.paddingTop - size.paddingBottom;\n    }\n\n    return size.height;\n}\n\nexport function getInnerWidth(el: HTMLElement): number {\n    const size = getElementSize(el);\n\n    if (size.boxSizing === 'border-box') {\n        return size.width - size.paddingLeft - size.paddingRight;\n    }\n\n    return size.width;\n}\n\nexport function getBodyWidth(): number {\n    return document.body?.clientWidth ?? (window.innerHeight || document.documentElement?.clientWidth || -1);\n}\n\nexport function getBodyHeight(): number {\n    return document.body?.clientHeight ?? (window.innerHeight || document.documentElement?.clientHeight || -1);\n}\n\nexport function selectRange(container : HTMLElement) {\n    const range = document.createRange();\n\n    range.setStart(container, 0);\n    range.setEnd(container, container.childElementCount);\n\n    // apply the selection, explained later\n    document.getSelection().removeAllRanges();\n    document.getSelection().addRange(range);\n}\n\nexport function getWrapperTemplate(className : string): HTMLElement {\n\tconst div = document.createElement('div');\n\tdiv.classList.add(className);\n\treturn div;\n}\n\nexport const isEventSupported = (eventName: any) => {\n    const tags = {\n        select: 'input',\n        change: 'input',\n        submit: 'form',\n        reset: 'form',\n        error: 'img',\n        load: 'img',\n        abort: 'img',\n    } as any;\n\n\n    if (typeof supports[eventName] === 'boolean') {\n        return supports[eventName];\n    }\n\n    const el = document.createElement(tags[eventName] || 'div');\n    eventName = 'on' + eventName;\n\n    return (supports[eventName] = eventName in el);\n}\n\nexport function isInDOM(element: HTMLElement): boolean {\n    return !!element.offsetParent;\n}\n\n\n\n\nexport {\n\tsetDisplayed,\n\tsetVisible,\n\tsetDisabled,\n\tforEachNodeInList,\n\tcloneNodeList,\n\tforEachAttributeInMap,\n\ttoggleAttribute,\n\tforEachAttributeInNamedNodeMap,\n\tisNodeOrHTMLElement,\n\tclearElement,\n\tsetElementWidth,\n\tsetFixedWidth,\n\tformatSize,\n\taddOrRemoveAttribute,\n\tensureDomOrder,\n\tinsertWithDomOrder,\n\tsetFixedHeight,\n\tsetFixedTop,\n\tsetFixedLeft,\n\tgetControllerFromTargetElement\n};","function values<T>(object: { [key: string]: T; } | Set<T> | Map<any, T>): T[] {\n    if (object instanceof Set || object instanceof Map) {\n        const arr: T[] = [];\n\n        object.forEach((value: T) => arr.push(value));\n\n        return arr;\n    }\n\n    return Object.values(object);\n}\n\nfunction exists(value: any, allowEmptyString = false): boolean {\n    return value != null && (value !== '' || allowEmptyString);\n}\n\nfunction toStringOrNull(value: any): string | null {\n    return value != null && typeof value.toString === 'function' ? value.toString() : null;\n}\n\nfunction createArrayOfNumbers(first: number, last: number): number[] {\n    const result: number[] = [];\n\n    for (let i = first; i <= last; i++) {\n        result.push(i);\n    }\n\n    return result;\n}\n\nfunction traverseObject<T>(object: { [p: string]: T; } | T[] | null | undefined, callback: (key: string, value: T) => void) {\n    if (object == null) { return; }\n\n    if (Array.isArray(object)) {\n        for (let i = 0; i < object.length; i++) {\n            callback(i.toString(), object[i]);\n        }\n        return;\n    }\n\n    for (const key in object) {\n        if (object.hasOwnProperty(key)) {\n            callback(key, object[key]);\n        }\n    }\n}\n\nexport function escapeString(toEscape?: string | null, skipHtmlChars?: boolean): string | null {\n\n\t const escapeMap: { [key: string]: string } = {\n\t\t\t'&': '&amp;',\n\t\t\t'<': '&lt;',\n\t\t\t'>': '&gt;',\n\t\t\t'\"': '&quot;',\n\t\t\t\"'\": '&#39;', \n\t\t};\n\n    if (toEscape == null) {\n        return null;\n    }\n\n    const stringResult = toEscape.toString().toString();\n\n    if (skipHtmlChars) {\n\t\treturn stringResult;\n\t}\n\n    return stringResult.replace(/[&<>\"']/g, (chr) => escapeMap[chr]);\n}\n\nexport function findValueByKey(data : Record<any, any>, key : string) {\n    const fieldNames = key.split('.');\n    let value = data;\n\n    for (const field of fieldNames) {\n        if (value && value.hasOwnProperty(field)) {\n            value = value[field];\n        } else {\n            return undefined;\n        }\n    }\n\n    return value;\n}\n\nfunction checkNumber(value) {\n  if (typeof value === 'number' && !isNaN(value)) {\n    return true;\n  } else if (value === undefined || value === null) {\n    return false;\n  } else {\n    return false;\n  }\n}\n\n\n\nexport function removeFromUnorderedArray<T>(array: T[], object: T) {\n\tconst index = array.indexOf(object);\n\n\tif (index >= 0) {\n\t\tarray[index] = array[array.length - 1];\n\t\tarray.pop();\n\t}\n}\n\nexport function removeFromArray<T>(array: T[], object: T) {\n\tconst index = array.indexOf(object);\n\n\tif (index >= 0) {\n\t\tarray.splice(index, 1);\n\t}\n}\n\nexport function removeAllFromUnorderedArray<T>(array: T[], toRemove: T[]) {\n\tfor (let i = 0; i < toRemove.length; i++) {\n\t\tremoveFromUnorderedArray(array, toRemove[i]);\n\t}\n}\n\nexport function removeAllFromArray<T>(array: T[], toRemove: T[]) {\n\tfor (let i = 0; i < toRemove.length; i++) {\n\t\tremoveFromArray(array, toRemove[i]);\n\t}\n}\n\nexport function _isEventFromPrintableCharacter(event: KeyboardEvent): boolean {\n    if (event.altKey || event.ctrlKey || event.metaKey) {\n        return false;\n    }\n    const printableCharacter = event.key.length === 1;\n\n    return printableCharacter;\n}\n\nexport function _compose<T>(...fns: ((...args: T[]) => T)[]) {\n    return (arg: T) => fns.reduce<T>((composed, f) => f(composed), arg);\n}\n\nexport function download(fileName: string, content: Blob) {\n    const win = document.defaultView || window;\n\n    if (!win) {\n        return;\n    }\n\n    const element = document.createElement('a');\n    const url = win.URL.createObjectURL(content);\n    element.setAttribute('href', url);\n    element.setAttribute('download', fileName);\n    element.style.display = 'none';\n    document.body.appendChild(element);\n\n    element.dispatchEvent(\n        new MouseEvent('click', {\n            bubbles: false,\n            cancelable: true,\n            view: win,\n        })\n    );\n\n    document.body.removeChild(element);\n\n    win.setTimeout(() => {\n        win.URL.revokeObjectURL(url);\n    }, 0);\n}\n\nexport function flattenArray(arrayOfArrays: any[]): any[] {\n    return [].concat.apply([], arrayOfArrays);\n}\n\nexport function makeNull<T>(value?: T): T | null {\n    if (value == null || value === '') {\n        return null;\n    }\n    return value;\n}\n\nexport {\n\tvalues,\n\texists,\n\ttoStringOrNull,\n\tcreateArrayOfNumbers,\n\ttraverseObject,\n\tcheckNumber\n};","function debounce(func, delay) {\n    let timeoutId;\n  \n    return function () {\n        const context = this;\n        const args = arguments;\n    \n        clearTimeout(timeoutId);\n    \n        timeoutId = setTimeout(function () {\n            func.apply(context, args);\n        }, delay);\n    };\n}\n\nfunction throttle(func, delay) {\n    let lastCallTime = 0;\n  \n    return function () {\n        const now = Date.now();\n    \n        if (now - lastCallTime >= delay) {\n            func.apply(this, arguments);\n            lastCallTime = now;\n        }\n    };\n}\n\nexport function executeOncePerAnimationFrame(func) {\n    let rafId = null;\n\n    return (...args) => {\n        const immediateRender = args[0]?.immediateRender;\n        if(immediateRender) {\n            func(...args);\n            return null;\n        }\n        if (rafId === null) {\n            if(!immediateRender) {\n                rafId = requestAnimationFrame(() => {\n                    func(...args);\n                    rafId = null;\n                });\n\n                return rafId;\n            }\n        }\n    }\n}\n\nexport function isPrintableCharacter(purePrintableCharacter) {\n    // Check if purePrintableCharacter is a single printable character\n    const PRINTABLE_CHAR_REGEX = /^[\\x20-\\x7E]$/;\n    return PRINTABLE_CHAR_REGEX.test(purePrintableCharacter);\n}\n\n\nexport function computeLeastSquaresLine(values: number[]) {\n    const len = values.length;\n    let maxDecimals = 0;\n\n    if (len <= 1) {\n        return values;\n    }\n\n    for (let i = 0; i < values.length; i++) {\n        const value = values[i];\n        const splitExponent = value.toString().split('e-');\n\n        if (splitExponent.length > 1) {\n            maxDecimals = Math.max(maxDecimals, parseInt(splitExponent[1], 10));\n            continue;\n        }\n\n        if (Math.floor(value) === value) {\n            continue;\n        }\n\n        maxDecimals = Math.max(maxDecimals, value.toString().split('.')[1].length);\n    }\n\n    let sum_x = 0;\n    let sum_y = 0;\n    let sum_xy = 0;\n    let sum_xx = 0;\n\n    let y = 0;\n\n    for (let x = 0; x < len; x++) {\n        y = values[x];\n        sum_x += x;\n        sum_y += y;\n        sum_xx += x * x;\n        sum_xy += x * y;\n    }\n\n    const m = (len * sum_xy - sum_x * sum_y) / (len * sum_xx - sum_x * sum_x);\n    const b = sum_y / len - (m * sum_x) / len;\n\n    const result: number[] = [];\n\n    for (let x = 0; x <= len; x++) {\n        result.push(parseFloat((x * m + b).toFixed(maxDecimals)));\n    }\n\n    return result;\n}\n\n\nexport { \n    throttle,\n    debounce\n}\n\n","export function deepMerge<T extends Record<string, any>>(target: T, ...sources: T[]): T {\n  if (!sources.length) return target;\n\n  const source = sources.shift();\n\n  if (isObject(target) && isObject(source)) {\n    for (const key in source) {\n      if (isObject(source[key])) {\n        if (!target[key]) Object.assign(target, { [key]: {} });\n        deepMerge(target[key], source[key]);\n      } else {\n        Object.assign(target, { [key]: source[key] });\n      }\n    }\n  } else if (isMap(target) && isMap(source)) {\n    source.forEach((value, key) => {\n      if (isMap(value)) {\n        if (!target.has(key)) target.set(key, new Map());\n        deepMerge(target.get(key), value);\n      } else {\n        target.set(key, value);\n      }\n    });\n  } else if (Array.isArray(target) && Array.isArray(source)) {\n    source.forEach((item, index) => {\n      if (target.length <= index) {\n        target.push(item);\n      } else {\n        if (isObject(target[index]) && isObject(item)) {\n          deepMerge(target[index], item);\n        } else {\n          target[index] = item;\n        }\n      }\n    });\n  } else if (isSet(target) && isSet(source)) {\n    source.forEach(value => target.add(value));\n  }\n\n  return deepMerge(target, ...sources);\n}\n\nfunction isObject(item: any): boolean {\n  if (!item || typeof item !== \"object\") return false;\n  if (Array.isArray(item) || item instanceof Map || item instanceof Set) return false;\n\n  const proto = Object.getPrototypeOf(item);\n  return proto === Object.prototype || proto === null;\n}\n\nfunction isMap(item: any): boolean {\n  return item instanceof Map;\n}\n\nfunction isSet(item: any): boolean {\n  return item instanceof Set;\n}\n\n// Utility function for comparing two arrays\nexport function areArraysEqual(arr1: string[], arr2: string[]): boolean {\n  if (arr1.length !== arr2.length) {\n      return false;\n  }\n\n  for (let i = 0; i < arr1.length; i++) {\n      if (arr1[i] !== arr2[i]) {\n          return false;\n      }\n  }\n\n  return true;\n}\n","export function ariaAttributeName(attribute: string) {\n    return `aria-${attribute}`;\n}\n\nexport function toggleAriaAttribute(element: Element, attribute: string, value?: number | boolean | string | null) {\n    if (value == null || (typeof value === 'string' && value === '')) {\n        removeAriaAttribute(element, attribute);\n    } else {\n        addAriaAttribute(element, attribute, value);\n    }\n}\n\nexport function addAriaAttribute(element: Element, attribute: string, value: number | boolean | string): void {\n    element.setAttribute(ariaAttributeName(attribute), value.toString());\n}\n\nexport function removeAriaAttribute(element: Element, attribute: string): void {\n    element.removeAttribute(ariaAttributeName(attribute));\n}\n\nexport function setAriaRole(element: Element, role?: string | null) {\n    if (role) {\n        element.setAttribute('role', role);\n    } else {\n        element.removeAttribute('role');\n    }\n}\n\nexport function setAriaActiveDescendant(element: Element, descendantId: string | null): void {\n    toggleAriaAttribute(element, 'activedescendant', descendantId);\n}\n\n\nexport function setAriaAtomic(element: Element, atomic: boolean): void {\n    toggleAriaAttribute(element, 'atomic', atomic);\n}\n\nexport function setAriaAutocomplete(element : Element, autocomplete :  'inline' | 'list' | 'both' | 'none') : void {\n    toggleAriaAttribute(element, \"autocomplete\", autocomplete);\n}\n\nexport function setAriaBraillelabel(element : Element, braillelabel : string) : void {\n    toggleAriaAttribute(element, 'braillelabel', braillelabel);\n}\n\nexport function setAriaBrailleroledescription(element : Element, brailleroledescription : string) : void {\n    toggleAriaAttribute(element, 'brailleroledescription', brailleroledescription);\n}\n\nexport function setAriaBusy(element : Element, busy : boolean) : void {\n    toggleAriaAttribute(element, 'busy', busy);\n}\n\nexport function setAriaChecked(element : Element, checked : boolean) : void {\n    toggleAriaAttribute(element, 'checked', checked);\n}\n\nexport function setAriaColCount(element : Element, colcount : string | number) : void {\n    toggleAriaAttribute(element, 'colcount', colcount);\n}\n\nexport function setAriaColIndex(element : Element, colindex : number | string) : void {\n    toggleAriaAttribute(element, 'colindex', colindex);\n}\n\nexport function setAriaColIndexText(element : Element, colindextext : string) : void {\n    toggleAriaAttribute(element, 'colindextext', colindextext);\n}\n\nexport function setAriaColSpan(element :Element, colspan : string | number) : void {\n    toggleAriaAttribute(element, 'colspan', colspan);\n}\n\n\nexport function setAriaControls(element : Element, controls : string) : void {\n    toggleAriaAttribute(element, 'controls', controls);\n}\n\n\nexport function setAriaCurrent(element : Element, current : string) : void {\n    toggleAriaAttribute(element, 'current', current);\n}\n\nexport function setAriaDescribedBy(element : Element, describedby : string) : void {\n    toggleAriaAttribute(element, 'describedby', describedby);\n} \n\nexport function setAriaDescription(element : Element, description : string) : void {\n    toggleAriaAttribute(element, 'description', description);\n}\n\nexport function setAriaDetails(element : Element,details : string ) : void {\n    toggleAriaAttribute(element, 'details', details);\n}\n\nexport function setAriaDisabled(element : Element, disabled : boolean) : void {\n    toggleAriaAttribute(element, 'disabled', disabled);\n}\n\nexport function setAriaErrorMessage(element : Element, errormessage : string) : void {\n    toggleAriaAttribute(element, 'errormessage', errormessage);\n}\n\nexport function setAriaExpanded(element : Element, expanded : boolean | string) : void {\n    toggleAriaAttribute(element, 'expanded', expanded);\n}\n\nexport function setAriaFlowTo(element : Element, flowto : number | string) : void {\n    toggleAriaAttribute(element, 'flowto', flowto);\n}\n\nexport function setAriaHasPopUp(element : Element, haspopup : boolean) : void {\n    toggleAriaAttribute(element, 'haspopup', haspopup);\n}\n\nexport function setAriaHidden(element : Element, hidden : string |boolean) : void {\n    toggleAriaAttribute(element, 'hidden', hidden);\n}\n\nexport function setAriaInvalid(element : Element, invalid : boolean | string) : void {\n    toggleAriaAttribute(element, 'invalid', invalid);\n}\n\n\nexport function setAriaKeyShortCuts(element : Element, keyshortcuts : string ) : void {\n    toggleAriaAttribute(element, 'keyshortcuts', keyshortcuts);\n}\n\nexport function setAriaLabel(element : Element, label : string | null | undefined) : void {\n    toggleAriaAttribute(element, 'label', label);\n}\n\nexport function setAriaLabelledBy(element : Element, labelledby : string) : void {\n    toggleAriaAttribute(element, 'labelledby', labelledby);\n}\n\nexport function setAriaLevel(element : Element, level : number) : void {\n    toggleAriaAttribute(element, 'level', level);\n}\n\nexport function setAriaLive(element: Element, live?: 'polite' | 'assertive' | 'off' | null) {\n    toggleAriaAttribute(element, 'live', live);\n}\n\nexport function setAriaModal(element : Element, modal : boolean) : void {\n    toggleAriaAttribute(element, 'modal', modal);\n}\n\nexport function setAriaMultiLine(element : Element, multiline : boolean) : void {\n    toggleAriaAttribute(element, 'multiline', multiline);\n}\n\nexport function setAriaMultiSelectable(element : Element, multiselectable : boolean) : void {\n    toggleAriaAttribute(element, 'multiselectable', multiselectable);\n}\n\n\nexport function setAriaOrientation(element : Element, orientation : string) : void {\n    toggleAriaAttribute(element, 'orientation', orientation);\n}\n\nexport function setAriaPlaceHolder(element : Element, placeholder : string) : void {\n    toggleAriaAttribute(element, 'placeholder', placeholder);\n}\n\nexport function setAriaPosInSet(element :Element, posinset : number) : void {\n    toggleAriaAttribute(element, 'posinset', posinset);\n}\n\nexport function setAriaPressed(element : Element, pressed : boolean) : void {\n    toggleAriaAttribute(element, 'pressed', pressed);\n}\n\n\nexport function setAriaReadOnly(element : Element, readonly :boolean) : void {\n    toggleAriaAttribute(element, 'readonly', readonly);\n}\n\nexport function setAriaRelevant(element : Element, relevant : \"additions\" | \"all\" | \"removals\" | \"text\" | string) : void {\n    toggleAriaAttribute(element, 'relevant', relevant);\n}\n\nexport function setAriaRequired(element : Element, required: boolean) : void {\n    toggleAriaAttribute(element, 'required', required);\n}\n\n\nexport function setAriaRoleDescription(element : Element, roledescription : string) : void {\n    toggleAriaAttribute(element, 'roledescription', roledescription);\n}\n\nexport function setAriaRowCount(element : Element, rowcount: number) : void {\n    toggleAriaAttribute(element, 'rowcount', rowcount);\n}\n\nexport function setAriaRowIndex(element : Element, rowindex : number) : void {\n    toggleAriaAttribute(element, 'rowindex', rowindex);\n}\n\nexport function setAriaRowIndexText(element : Element, rowindextext : string) : void {\n    toggleAriaAttribute(element ,\"rowindextext\", rowindextext);\n}\n\nexport function setAriaRowSpan(element : Element, rowspan : number) : void {\n    toggleAriaAttribute(element, 'rowspan', rowspan); \n}\n\nexport function setAriaSelected(element : Element, selected :boolean) : void {\n    toggleAriaAttribute(element, 'selected', selected);\n}\n\nexport function setAriaSetSize(element : Element, setsize : number) : void {\n    toggleAriaAttribute(element, 'setsize', setsize);\n}\n\nexport function setAriaSort(element : Element, sort : string ) : void {\n    toggleAriaAttribute(element, 'sort', sort);\n}\n\nexport function setAriaValueMax(element : Element, valuemax : number) : void {\n    toggleAriaAttribute(element, 'valuemax', valuemax);\n}\n\nexport function setAriaValueMin(element : Element, valuemin : number) : void {\n    toggleAriaAttribute(element, 'valuemin', valuemin);\n}\n\nexport function setAriaValueNow(element :Element, valuenow : number) : void {\n    toggleAriaAttribute(element, 'valuenow', valuenow);\n}\n\nexport function setAriaValueText(element : Element, valuetext : string) : void {\n    toggleAriaAttribute(element, 'valuetext', valuetext);\n}","\nimport { Checkbox } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/checkbox\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/Checkbox_new/checkbox.css\";\n\nclass CheckEditorRenderer implements ICellEditorComponent<any> {\n\n\tprivate div: HTMLElement;\n\tprivate checkboxComp\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst config = \tgetFieldEditorConfiguration(FIELD_TYPE.CHECKBOX, param, this.div);\n\t\tthis.checkboxComp = new Checkbox(config);\n\n\t}\n\tgetValue() {\n\t\t// return this.checkboxComp.api.getValue();\n\t\treturn true;\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n\t\tthis.checkboxComp.api.focus();\n\n\t}\n\tblur?(): void {\n\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\t\n\t}\n\t\n}\n\nexport {\n    CheckEditorRenderer\n}\n\n","import { Checkbox } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Checkbox/checkbox\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/Checkbox_new/checkbox.css\";\n\nclass CheckboxRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst config = \tgetFieldConfigurationByType(FIELD_TYPE.CHECKBOX, this.param, this.div);\n\t\tconst checkbox = new Checkbox(config);\n\t\treturn checkbox.api.getElement();\n\t}\n}\n\nexport {\n    CheckboxRenderer\n}","import { CurrencyModule } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/CurrencyModule\";\nimport { NumberComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/number\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/number/number.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\nclass CurrencyEditorRenderer implements ICellEditorComponent<any> {\n\tprivate numberComp;\n\tprivate div: HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst currencyConfig = getFieldEditorConfiguration(FIELD_TYPE.CURRENCY, param, this.div);\n\t\tthis.numberComp = new NumberComponent(currencyConfig, { modules: [CurrencyModule]});\n\t}\n\tgetValue() {\n\t\treturn this.numberComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n\t\tthis.numberComp.api.focus();\n\n\t}\n\tblur?(): void {\n\t\t\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\t\n\t}\n\t\n}\n\nexport {\n    CurrencyEditorRenderer\n}\n\n","import { CurrencyModule } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/CurrencyModule\";\nimport { RenderingNumberComponent  } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/number\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/number/number.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nclass CurrencyRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst userCurrencyConfig = this.param.columnNode.getUserColumnDefinition().fieldProperties;\n\t\tconst defaultCurrencyConfig = \tgetFieldConfigurationByType(FIELD_TYPE.CURRENCY, this.param, this.div)\n\t\tconst mergedCurrencyConfig = { ...defaultCurrencyConfig, ...userCurrencyConfig };\n\t\tnew RenderingNumberComponent(mergedCurrencyConfig, { modules: [CurrencyModule] });\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    CurrencyRenderer\n}","\n// import { AutoWired } from \"@dg/corecomponent\";\nimport {DateTime} from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/date-time\"\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n// import { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\n\nclass DateEditorRenderer implements ICellEditorComponent<any> {\n\tprivate dateComp;\n\tprivate div: HTMLElement;\n\tprivate\tparam: any\n\n\t// @AutoWired(GRID_BEAN_NAME.GRID_DIV_ELEMENT) private elem : HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.param = param;  \n\t\tthis.div = document.createElement(\"div\");\n\t\tconst config = getFieldEditorConfiguration(FIELD_TYPE.DATE, this.param, this.div);;\n\t\tthis.dateComp = new DateTime(config);\n\t}\n\tgetValue() {\n\t\treturn this.dateComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n\t\tthis.dateComp.api.focus();\n\n\t}\n\tblur?(): void {\n\t\t\n\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\tthis.dateComp.api.destroy();\t\n\t}\n\t\n}\n\nexport {\n    DateEditorRenderer\n}\n\n","// import { Datepicker } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/date-picker/src/datepicker\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nimport {DateTimeReadonlyComponent} from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/date-time-field/src/date-time\"\n\nclass DateRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst config = \tgetFieldConfigurationByType(FIELD_TYPE.DATE, this.param, this.div);\n\t\tnew DateTimeReadonlyComponent(config);\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    DateRenderer\n}","import { MultilineComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/multiline\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\nclass EmailEditorRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tprivate emailComponent;\n\tinit(param) {\n\t\tthis.param = param;\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst emailConfig = getFieldEditorConfiguration(FIELD_TYPE.EMAIL, this.param, this.div);\n\t\tthis.emailComponent = new MultilineComponent(emailConfig);\n\t}\n\n\tgetElement():HTMLElement {\n\t\t// this.div = document.createElement(\"div\");\n\t\t// const emailConfig = getFieldEditorConfiguration(FIELD_TYPE.EMAIL, this.param, this.div);\n\t\t// new Link(emailConfig);\n\t\treturn this.div;\n\t}\n\n\tfocus(): void {\n\t\tthis.emailComponent?.api?.focus();\n\t}\n\tblur(): void {\n\t\tthis.emailComponent?.api?.blur();\n\t}\n\tgetValue() {\n\t\treturn this.emailComponent?.api?.getValue();\n\t}\n}\n\nexport {\n    EmailEditorRenderer\n};;","import { Link } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/link/link\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nclass EmailRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tprivate emailRenderer;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst emailConfig = getFieldConfigurationByType(FIELD_TYPE.EMAIL, this.param, this.div);\n\t\tthis.emailRenderer = new Link(emailConfig);\n\t\treturn this.div;\n\t}\n\n\tfocus(){\n\t\tthis.emailRenderer.api.focus();\n\n\t}\t\n\n\tgetValue() {\n        return this.emailRenderer.api.getValue();\n    }\n}\n\nexport {\n    EmailRenderer\n};","import { MultilineComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/multiline\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\nclass MultilineEditorRenderer implements ICellEditorComponent<any> {\n\tprivate multiLineComp;\n\tprivate div: HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst textConfig = getFieldEditorConfiguration(FIELD_TYPE.MULTILINE, param, this.div);\n\t\tthis.multiLineComp = new MultilineComponent(textConfig);\n\t}\n\tgetValue() {\n\t\treturn this.multiLineComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus(): void {\n\t\tthis.multiLineComp.api.focus();\n\t}\n\tblur(): void {\n\t\tthis.multiLineComp.api.blur();\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\tthis.multiLineComp.api.destroy();\n\t}\n\t\n}\n\nexport {\n    MultilineEditorRenderer\n}\n\n","import { RenderMultilineComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/multiline\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/Multiline_new/multiline.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nclass MultilineTextRenderer {\n\t\n\tprivate multiLineComp;\n\tprivate div: HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst multiLineConfig = getFieldConfigurationByType(FIELD_TYPE.MULTILINE, param, this.div);\n\n\t\tthis.multiLineComp = new RenderMultilineComponent(multiLineConfig, {});\n\t}\n\n\tgetValue() {\n\t\treturn this.multiLineComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n\t\tthis.multiLineComp.api.onFocus();\n\t}\n\tblur?(): void {\n\t\tthis.multiLineComp.api.onBlur();\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\t\n\t}\n}\n\nexport {\n    MultilineTextRenderer\n}\n","\nimport { Select } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/select/select\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/select/select.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/chip/chip.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport { colorsArray } from \"./MultiSelectRenderer\";\n\n\nclass MultiSelectEditorRenderer implements ICellEditorComponent<any> {\n\tprivate multiSelectComp;\n\tprivate div: HTMLElement;\n\tparam: any;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.param = param;  // this is the context of the cell editor component.  It has access to the grid API, cell data, etc.  It's passed into the init method as a parameter.  This allows the cell editor component to interact with the grid in a way that is convenient and secure.  For example, it could fetch data from the server to populate the dropdown options, or it could perform validation on the cell data before it is committed to the grid.\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst multiSelectConfig = getFieldEditorConfiguration(FIELD_TYPE.MultiSelect, param, this.div);\n        const transformedOptions = multiSelectConfig.options.map((option, index) => ({ value: option, color : colorsArray[index], id : option}));\n\t\tmultiSelectConfig.options = transformedOptions;\n\t\tmultiSelectConfig.onClose = () =>{\n\t\t\tthis.blur();\n\t\t}\n        this.multiSelectComp = new Select(multiSelectConfig);\n\n\t}\n\tgetValue() {\n\t\treturn this.multiSelectComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n        this.multiSelectComp.api.focus();\n\t\tthis.multiSelectComp.api.openDropdown();\n\t}\n\tblur?(): void {\n\t\tthis.param.api.getGridAPI().closeEditor();\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div;\n\t}\n\tdestroy?(): void {\n\t\tthis.multiSelectComp.api.destroy();\n\t}\n\t\n}\n\nexport {\n    MultiSelectEditorRenderer\n}\n\n","import { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\nimport {Select} from '../../../../Sub_Components/src/fieldcomponents/dg-base/src/select/select'; \nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/select/select.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/chip/chip.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\n\nexport const colorsArray = [\n    \"rgb(255, 245, 238)\", // Seashell\n    \"rgb(240, 255, 255)\", // Azure\n    \"rgb(250, 250, 210)\", // Light Goldenrod Yellow\n    \"rgb(240, 248, 255)\", // Alice Blue\n    \"rgb(245, 245, 220)\", // Beige\n    \"rgb(255, 239, 213)\", // Papaya Whip\n    \"rgb(255, 228, 225)\", // Misty Rose\n    \"rgb(240, 255, 240)\", // Honeydew\n    \"rgb(253, 245, 230)\", // Old Lace\n    \"rgb(255, 250, 250)\", // Snow\n    \"rgb(255, 248, 220)\", // Cornsilk\n    \"rgb(245, 255, 250)\", // Mint Cream\n    \"rgb(255, 240, 245)\", // Lavender Blush\n    \"rgb(255, 245, 238)\", // Seashell\n    \"rgb(255, 235, 205)\", // Blanched Almond\n    \"rgb(255, 228, 196)\", // Bisque\n    \"rgb(255, 240, 245)\", // Lavender Blush\n    \"rgb(245, 222, 179)\", // Wheat\n    \"rgb(240, 230, 140)\", // Khaki\n    \"rgb(255, 250, 205)\"  // Lemon Chiffon\n];\n\n\n\n// export function getRandomLightColor() {\n//     const randomIndex = Math.floor(Math.random() * colorsArray.length);\n//     return colorsArray[randomIndex];\n// }\n\nclass MultiSelectRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n        const multiSelectConfig = getFieldConfigurationByType(FIELD_TYPE.MultiSelect, this.param,this.div);\n\t\tconst transformedOptions = multiSelectConfig.options.map((option, index) => ({ value: option, color : colorsArray[index], id : option}));\n\t\tmultiSelectConfig.options = transformedOptions;\n\t\tmultiSelectConfig.useElipses = true;\n\t\tnew Select(multiSelectConfig);\n\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    MultiSelectRenderer\n}","import { DecimalModule } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/DecimalModule\";\nimport { NumberComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/number\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/number/number.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\nclass NumberEditorRenderer implements ICellEditorComponent<any> {\n\tprivate numberComp;\n\tprivate div: HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst percentConfig = getFieldEditorConfiguration(FIELD_TYPE.NUMBER, param, this.div);\n\t\tthis.numberComp = new NumberComponent(percentConfig, { modules: [DecimalModule]});\n\t\tthis.numberComp.api.focus();\n\t}\n\tgetValue() {\n\t\treturn this.numberComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n\t\tthis.numberComp.api.focus();\n\n\t}\n\tblur?(): void {\n\t\tthis.numberComp.api.blur();\n\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\tthis.numberComp.api.destroy();\n\t\t\n\t}\n\t\n}\n\nexport {\n    NumberEditorRenderer\n}\n\n","import { DecimalModule } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/DecimalModule\";\nimport { RenderingNumberComponent  } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/number\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/number/number.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nclass NumberRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst numberConfig = getFieldConfigurationByType(FIELD_TYPE.NUMBER, this.param, this.div);\n\t\tconst numberComp = new RenderingNumberComponent(numberConfig,\n\t\t\t{\n\t\t\t\tmodules: [DecimalModule],\n\t\t\t},\n\t\t);\n\t\treturn numberComp.api.getElement();\n\t}\n}\n\nexport {\n    NumberRenderer\n}\n","import { PercentageModule } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/PercentageModule\";\nimport { NumberComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/number\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\nclass PercentEditorRenderer implements ICellEditorComponent<any> {\n\tprivate numberComp;\n\tprivate percentConfig\n\tprivate div: HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tthis.percentConfig = getFieldEditorConfiguration(FIELD_TYPE.PERCENT, param, this.div);\n\t\tthis.numberComp = new NumberComponent(this.percentConfig, { modules: [PercentageModule]});\n\t}\n\tgetValue() {\n\t\tconst precision = this.percentConfig.precision ?? 2\n\t\tconst value = Math.pow(10, precision);\n\t\treturn (this.numberComp.api.getValue() * value);\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n\t\tthis.numberComp.api.focus();\n\n\t}\n\tblur?(): void {\n\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\t\n\t}\n\t\n}\n\nexport {\n    PercentEditorRenderer\n}\n\n","import { PercentageModule } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/core/modules/PercentageModule\";\nimport { RenderingNumberComponent  } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/number-input/src/number\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/number/number.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nclass PercentRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement() {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst userPercentConfig = this.param.columnNode.getUserColumnDefinition().fieldProperties;\n\t\tconst defaultPercentConfig = getFieldConfigurationByType(FIELD_TYPE.PERCENT, this.param, this.div);\n\t\tconst mergedCurrencyConfig = { ...defaultPercentConfig, ...userPercentConfig };\n\t\tnew RenderingNumberComponent(mergedCurrencyConfig, { modules: [PercentageModule], }, );\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    PercentRenderer\n}","import { MultilineComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/multiline\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\nclass PhoneNumberEditorRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tprivate phoneNumberComponent;\n\tinit(param) {\n\t\tthis.param = param;\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst linkConfiguration = getFieldEditorConfiguration(FIELD_TYPE.PHONE_NUMBER, this.param, this.div);\n\t\tthis.phoneNumberComponent = new MultilineComponent(linkConfiguration);\n\t}\n\n\tgetElement():HTMLElement {\n\t\treturn this.div;\n\t}\n\n\tfocus(): void {\n\t\tthis.phoneNumberComponent?.api?.focus();\n\t}\n\tblur(): void {\n\t\tthis.phoneNumberComponent?.api?.blur();\n\t}\n\tgetValue() {\n\t\treturn this.phoneNumberComponent?.api?.getValue();\n\t}\n\n}\n\nexport {\n    PhoneNumberEditorRenderer\n}","import { Link } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/link/link\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nclass PhoneNumberRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst linkConfiguration = getFieldConfigurationByType(FIELD_TYPE.PHONE_NUMBER, this.param, this.div);\n\t\tnew Link(linkConfiguration);\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    PhoneNumberRenderer\n}","\nimport { RatingComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/rating\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/radio/css/radio.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/rating/rating.css\";\n\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\nclass RatingEditorRenderer implements ICellEditorComponent<any> {\n\tprivate ratingComp;\n\tprivate div: HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst ratingConfig = getFieldEditorConfiguration(FIELD_TYPE.RATING, param, this.div);\n        this.ratingComp = new RatingComponent(ratingConfig);\n\n\t}\n\tgetValue() {\n\t\treturn this.ratingComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n\t\tthis.ratingComp.api.focus();\n\n\t}\n\tblur?(): void {\n\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\t\n\t}\n\t\n}\n\nexport {\n    RatingEditorRenderer\n}\n\n","import { RatingComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/rating-component/src/rating\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/radio/css/radio.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/rating/rating.css\";\n\n\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nclass RatingRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst ratingConfiguration = getFieldConfigurationByType(FIELD_TYPE.RATING, this.param, this.div)\n\t\tnew RatingComponent(ratingConfiguration);\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    RatingRenderer\n}","export class CheckboxRenderingComponent {\n    private static CHECKBOX_WRAP_CLASS = 'dg-checkbox__root';\n    private static CHECKBOX_INPUT_WRAP_CLASS = 'dg-checkbox__input-wrapper';\n    private static CHECKBOX_INPUT_CLASS = 'dg-checkbox__input';\n    private static CHECKBOX_INPUT_CUSTOM_CLASS = 'dg-checkbox__input--custom';\n\tprivate static CELL_ELEMENT_CLASS = 'dg-field--render-state';\n    private param: any | null = null;\n    private inputElement : HTMLInputElement | null = null;\n\tprivate labelElement : HTMLElement | null = null;\n\n\tprivate addDestroyFunc : CallableFunction[] = [];\n\t\n    init(param: any) {\n        this.param = param;\n    }\n\n    getElement(): HTMLElement | null {\n\t\tthis.resetState();\n        const {parentElement : cellValueElement, iconRenderer, checkedIcon, uncheckedIcon, cellElement, readOnly} = this.param;\n\t\tcellValueElement.classList.add(CheckboxRenderingComponent.CHECKBOX_WRAP_CLASS);\n\t\tcellElement.classList.add(CheckboxRenderingComponent.CELL_ELEMENT_CLASS);\n\t\tthis.labelElement = document.createElement('label');\n\t\tthis.labelElement.classList.add(CheckboxRenderingComponent.CHECKBOX_INPUT_WRAP_CLASS, 'dg-field__input-wrapper');\n\n\t\t//checkbox input\n\t\tthis.inputElement = document.createElement('input');\n\t\tthis.inputElement.type = 'checkbox';\n\t\tthis.inputElement.classList.add(CheckboxRenderingComponent.CHECKBOX_INPUT_CLASS);\n\t\tthis.inputElement.setAttribute('role', 'checkbox');\n\t\tthis.inputElement.setAttribute('aria-disabled', 'false');\n\t\tthis.labelElement.appendChild(this.inputElement);\n\n\t\tthis.inputElement.checked = this.param.value == true;\n\t\tthis.inputElement.setAttribute('aria-checked', this.param.value == true ? 'true' : 'false');\n\n\t\t!readOnly && this.addEventListener(this.inputElement!, 'change', (e)=>{\n\t\t\tconst {checked} = e.target as HTMLInputElement;\n\t\t\tthis.param.onChange({state : checked});\n\t\t});\n\n\n\t\t//checkbox icon\n\t\tconst iconElement = document.createElement('span');\n\t\ticonElement.classList.add(CheckboxRenderingComponent.CHECKBOX_INPUT_CUSTOM_CLASS);\n\t\tthis.labelElement.appendChild(iconElement);\n\n\t\tif(iconRenderer){\n\t\t\tconst iconRendererElement = iconRenderer(cellValueElement);\n\t\t\ticonRendererElement && iconElement.appendChild(iconRendererElement);\n\t\t}\n\t\telse{\n\t\t\tconst icon = this.param.value == true ? checkedIcon : uncheckedIcon;\n\t\t\ticon && iconElement.appendChild(icon);\n\t\t}\n\n        cellValueElement.appendChild(this.labelElement);\n        return null;\n    }\n\n\tisChecked(){\n\t\treturn this.inputElement.checked;\n\t}\n\n\tsetChecked(checked : boolean){\n\t\tthis.inputElement.checked = checked;\n\t\tthis.inputElement.setAttribute('aria-checked', checked ? 'true' : 'false');\n\t}\n\n\tprivate addEventListener(element : HTMLElement, eventName : string, callback : EventListener) : void {\n        element.addEventListener(eventName, callback);\n        this.addDestroyFunc.push(()=>{\n            element.removeEventListener(eventName, callback);\n        })\n    }\n\n\tprivate resetState() : void {\n \t\tconst {parentElement : cellValueElement, cellElement} = this.param;\n        cellValueElement.textContent = '';\n        cellValueElement.classList.remove(CheckboxRenderingComponent.CHECKBOX_WRAP_CLASS);\n\t\tcellElement.classList.remove(CheckboxRenderingComponent.CELL_ELEMENT_CLASS);\n\t}\n\n\tdestroy(){\n\t\tconst {parentElement : cellValueElement} = this.param;\n\t\tcellValueElement.removeChild(this.labelElement);\n\t\tthis.addDestroyFunc.forEach(func => func());\n        this.resetState();\n\t\tthis.addDestroyFunc = [];\n\t\tthis.labelElement = null;\n\t\tthis.param = null;\n        this.inputElement = null;\n    }\n}","export class ChipRenderingComponent {\n    private static CHIP_WRAP_CLASS = 'dg-multiselect__root';\n    private static CHIP_CLASS = 'dg-chip__root';\n    private static CHIP_PREFIX_CLASS = 'dg-chip__prefix-elem';\n    private static CHIP_LABEL_CLASS = 'dg-chip__label';\n    private static CELL_ELEMENT_CLASS = 'dg-field--render-state';\n    private param: any;\n\n    private chipElements: HTMLElement[] = [];\n    \n    init(param: any) {\n        this.param = param;\n    }\n\n    getElement(): HTMLElement | null {\n        const {parentElement : cellValueElement, options, cellElement, isMultiple = true} = this.param;\n        isMultiple && cellValueElement.classList.add(ChipRenderingComponent.CHIP_WRAP_CLASS);\n        cellElement.classList.add(\"dg-field__chip-active\");\n        cellElement.classList.add(ChipRenderingComponent.CELL_ELEMENT_CLASS);\n        \n        options.forEach((option)=>{\n            const chipElement = document.createElement('div');\n            chipElement.classList.add(ChipRenderingComponent.CHIP_CLASS);\n\n            chipElement.style.backgroundColor = option.color;\n            option.strokeColor && chipElement.style.setProperty('--ZG-chip-stroke-color', option.strokeColor);\n            \n            if(option.prefix){\n                const prefixElement = document.createElement('div');\n                prefixElement.classList.add(ChipRenderingComponent.CHIP_PREFIX_CLASS);\n                prefixElement.appendChild(option.prefix);\n                chipElement.appendChild(prefixElement);\n            }\n\n            if(option.renderer){\n                const rendererElement = option.renderer(option.label);\n                rendererElement && chipElement.appendChild(rendererElement);\n            }\n            else{\n                const labelElement = document.createElement('div');\n                labelElement.classList.add(ChipRenderingComponent.CHIP_LABEL_CLASS);\n                labelElement.textContent = option.label;\n                chipElement.appendChild(labelElement);\n            }\n\n            cellValueElement.appendChild(chipElement);\n            this.chipElements.push(chipElement);\n        })\n\n        return null;\n    }\n\n    destroy() : void {\n        const {parentElement : cellValueElement, cellElement, isMultiple = true} = this.param;\n        this.chipElements.forEach(chipElement => {\n            if (chipElement.parentNode === cellValueElement) {\n                cellValueElement.removeChild(chipElement);\n            }\n        });\n        cellValueElement.innerHTML = '';\n        this.chipElements = [];\n        isMultiple && cellValueElement.classList.remove(ChipRenderingComponent.CHIP_WRAP_CLASS);\n        cellElement.classList.remove(ChipRenderingComponent.CELL_ELEMENT_CLASS);\n        cellElement.classList.remove(\"dg-field__chip-active\");\n        this.param = null;\n    }\n\n}","export class ImageRenderingComponent {\n    private static IMAGE_WRAP_CLASS = 'zt-attachment__root';\n    private static IMAGE_CLASS = 'ZF-attachmentOption';\n    private static CELL_ELEMENT_CLASS = 'dg-field--render-state';\n    private param: any | null = null;\n    private imageWrapperElements: HTMLElement[] = [];\n    private addDestroyFunc : CallableFunction[] = [];\n    init(param: any) {\n        this.param = param;\n    }\n\n    getElement(): HTMLElement | null {\n        const {parentElement : cellValueElement, cellData, cellElement} = this.param;\n        cellValueElement.classList.add(ImageRenderingComponent.IMAGE_WRAP_CLASS);\n        cellElement.classList.add(ImageRenderingComponent.CELL_ELEMENT_CLASS);\n\n        const fallbackURL = this.param.fallbackURL;\n\n        if(cellData){\n            cellData.forEach((item: any)=>{\n                const imageWrapper = document.createElement('div');\n                imageWrapper.classList.add('ZF-optionText');\n                imageWrapper.classList.add(ImageRenderingComponent.IMAGE_CLASS);\n                const img = document.createElement('img');\n                img.src = item.url;\n                imageWrapper.appendChild(img);\n                cellValueElement.appendChild(imageWrapper);\n                this.imageWrapperElements.push(imageWrapper);\n                fallbackURL && this.addEventListener(img, \"error\", function onError() {\n                    img.removeEventListener(\"error\", onError);\n                    img.src = fallbackURL;\n                });\n            })\n        }\n        return null;\n    }\n\n\n    destroy(){\n        if (this.param == null) {\n            return;\n        }\n        const {parentElement : cellValueElement, cellElement} = this.param;\n        this.imageWrapperElements.forEach(imageWrapper => {\n            if (imageWrapper.parentNode === cellValueElement) {\n                cellValueElement.removeChild(imageWrapper);\n            }\n        });\n        this.imageWrapperElements = [];\n        cellValueElement.classList.remove(ImageRenderingComponent.IMAGE_WRAP_CLASS);\n        cellElement.classList.remove(ImageRenderingComponent.CELL_ELEMENT_CLASS);\n        this.addDestroyFunc.forEach(func => func());\n        this.addDestroyFunc = [];\n        this.param = null;\n    }\n\n    private addEventListener(element : HTMLElement, eventName : string, callback : EventListener) : void {\n        element.addEventListener(eventName, callback);\n        this.addDestroyFunc.push(()=>{\n            element.removeEventListener(eventName, callback);\n        })\n    }\n}","export class RatingRenderingComponent {\n    private param: any | null = null;\n    private static HOVER_CLASS = 'dg-rating__input-hover';\n    private static CELL_ELEMENT_CLASS = 'dg-field--render-state';\n    private labelArray : HTMLElement[] = [];\n    private addDestroyFunc : CallableFunction[] = [];\n\n    init(param: any) {\n        this.param = param;\n    }\n\n    getElement(): HTMLElement {\n        this.resetState();\n        const {parentElement : cellValueElement, checkedIcon, uncheckedIcon, onChange, maxCount, cellElement, readOnly } = this.param;\n        const cellData = this.param.cellData ? parseInt(this.param.cellData) : 0;\n        const inputsArray = [];\n        this.labelArray = [];\n        cellValueElement.classList.add('dg-rating__root');\n        cellElement.classList.add(RatingRenderingComponent.CELL_ELEMENT_CLASS);\n\n        for (let i = 0; i < maxCount; i++) {\n            const label = document.createElement('label');\n            const input = document.createElement('input');\n            label.classList.add('dg-radio__input-wrapper');\n            label.setAttribute('value', `${i + 1}`);\n\n            input.setAttribute('type', 'radio');\n            input.setAttribute('role', 'radio');\n            input.classList.add('dg-radio__input');\n\n            inputsArray.push(input);\n            label.appendChild(input);\n            const isSelected = i + 1 <= cellData;\n            let icon;\n            const iconHolder = document.createElement('span');\n            iconHolder.classList.add('dg-radio__input--custom');\n            if(isSelected){\n                label.classList.add('dg-rating__input-checked');\n                icon = checkedIcon.cloneNode(true);\n                input.checked = true;\n            }\n            else{\n                icon = uncheckedIcon.cloneNode(true);\n                input.checked = false;\n            }\n            iconHolder.appendChild(icon);\n            label.appendChild(iconHolder);\n            cellValueElement.appendChild(label);\n            this.labelArray.push(label);\n        }\n\n        !readOnly && inputsArray.forEach(input => {\n            input.addEventListener('change', () => {\n                onChange(input.checked);\n            });\n        });\n\n        !readOnly && this.labelArray.forEach(label => {\n            this.addEventListener(label, 'mouseenter', (e) => {\n                const {target} = e;\n                const index = this.labelArray.indexOf(target as HTMLElement);\n                for(let i = 0; i <= index; i++){\n                    this.labelArray[i].classList.add(RatingRenderingComponent.HOVER_CLASS);\n                }\n            });\n\n            this.addEventListener(label, 'mouseleave', (e) => {\n                const {target} = e;\n                const index = this.labelArray.indexOf(target as HTMLElement);\n                for(let i = 0; i <= index; i++){\n                    this.labelArray[i].classList.remove(RatingRenderingComponent.HOVER_CLASS);\n                }\n            });\n        });\n\n        return this.param.element;\n    }\n\n    getIcons() : HTMLElement[] {\n        return this.labelArray;\n    }\n\n    private resetState() {\n        const {parentElement : cellValueElement, cellElement} = this.param;\n        cellValueElement.textContent = '';\n        cellValueElement.classList.remove('dg-rating__root');\n        cellElement.classList.remove(RatingRenderingComponent.CELL_ELEMENT_CLASS);\n    }\n\n\n    destroy(){\n        const {parentElement : cellValueElement} = this.param;\n        this.addDestroyFunc.forEach(func => func());\n        this.addDestroyFunc = [];\n        this.labelArray.forEach(label => {\n            cellValueElement.removeChild(label);\n        });\n        this.resetState();\n        this.param = null;\n       \n        this.labelArray = [];\n    }\n\n    private addEventListener(element : HTMLElement, eventName : string, callback : EventListener) : void {\n        element.addEventListener(eventName, callback);\n        this.addDestroyFunc.push(()=>{\n            element.removeEventListener(eventName, callback);\n        })\n    }\n}","import { CheckboxRenderingComponent } from \"./CheckboxRenderingComponent\";\nimport { ChipRenderingComponent } from \"./ChipRenderingComponent\";\nimport { ImageRenderingComponent } from \"./ImageRenderingComponent\";\nimport { RatingRenderingComponent } from \"./RatingRenderingComponent\";\n\nexport class TextRenderingComponent {\n    private static MULTILINE_WRAP_CLASS = 'dg-textarea__root';\n    private static SINGLELINE_WRAP_CLASS = 'dg-text__root';\n\tprivate static PREFIX_CLASS = 'dg-text__prefix-elem';\n\tprivate static SUFFIX_CLASS = 'dg-text__suffix-elem';\n\tprivate static CELL_ELEMENT_CLASS = 'dg-field--render-state';\n\tprivate static TEXT_CLASS = 'dg-text__input';\n\n\tprivate elementArray : HTMLElement[] = [];\n    private addDestroyFunc : CallableFunction[] = [];\n    private param: any | null = null;\n    init(param: any){\n        this.param = param;\n    }\n\n    getElement(): HTMLElement | null{\n\t\tthis.resetState();\n\t\tconst {parentElement : cellValueElement, wrap, prefix, renderer, hyperlinkDetector, suffix, cellData, cellElement} = this.param;\n\n\t\tthis.elementArray = [];\n\t\t//wrap \n\t\tconst wrapClass = wrap==true ? TextRenderingComponent.MULTILINE_WRAP_CLASS : TextRenderingComponent.SINGLELINE_WRAP_CLASS;\n\t\tcellValueElement.classList.add(wrapClass);\n\t\tcellElement.classList.add(TextRenderingComponent.CELL_ELEMENT_CLASS);\n\t\t//prefix renderer\n\t\tif(prefix){\n\t\t\tconst prefixElement = document.createElement('div');\n\t\t\tprefixElement.classList.add(TextRenderingComponent.PREFIX_CLASS);\n\t\t\tprefixElement.append(prefix);\n\t\t\tcellValueElement.appendChild(prefixElement);\n\t\t}\n\n\t\tif(renderer){\n\t\t\tconst userRenderer = renderer(cellData);\n\t\t\tif(userRenderer){\n\t\t\t\tcellValueElement.appendChild(userRenderer);\n\t\t\t\tthis.elementArray.push(userRenderer);\n\t\t\t}\n\t\t}\n\t\telse if(hyperlinkDetector){\n\t\t\tconst detectedChunks = hyperlinkDetector(cellData);\n\t\t\tdetectedChunks.forEach(({displayText, href})=>{\n\t\t\t\tif(href){\n\t\t\t\t\tconst linkElement = document.createElement('a');\n\t\t\t\t\tlinkElement.target = '_blank';\n\t\t\t\t\tlinkElement.classList.add(TextRenderingComponent.TEXT_CLASS);\n\t\t\t\t\tlinkElement.classList.add('dg-field__input');\n\t\t\t\t\tlinkElement.href = href;\n\t\t\t\t\tlinkElement.textContent = displayText;\n\t\t\t\t\tcellValueElement.appendChild(linkElement);\n\t\t\t\t\tthis.elementArray.push(linkElement);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tconst textElement = document.createElement('span');\n\t\t\t\t\ttextElement.classList.add(TextRenderingComponent.TEXT_CLASS);\n\t\t\t\t\ttextElement.classList.add('dg-field__input');\n\t\t\t\t\ttextElement.textContent = displayText;\n\t\t\t\t\tcellValueElement.appendChild(textElement);\n\t\t\t\t\tthis.elementArray.push(textElement);\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\telse if(cellData !== undefined && cellData !== null && cellData !== ''){\n\t\t\tconst rendererElement = document.createElement('span');\n\t\t\trendererElement.classList.add(TextRenderingComponent.TEXT_CLASS);\n\t\t\trendererElement.classList.add('dg-field__input');\n\t\t\trendererElement.textContent = cellData;\n\t\t\tcellValueElement.appendChild(rendererElement);\n\t\t\tthis.elementArray.push(rendererElement);\n\t\t}\n\n\t\tif(suffix){\n\t\t\tconst suffixElement = document.createElement('div');\n\t\t\tsuffixElement.classList.add(TextRenderingComponent.SUFFIX_CLASS);\n\t\t\tsuffixElement.append(suffix);\n\t\t\tcellValueElement.appendChild(suffixElement);\n\t\t}\n\n        return null;\n\t}\n\n\tgetAllElements() : HTMLElement[] {\n\t\treturn this.elementArray;\n\t}\n\n\tresetState() {\n\t\tconst {parentElement : cellValueElement, wrap, cellElement} = this.param;\n\t\tconst wrapClass = wrap==true ? TextRenderingComponent.MULTILINE_WRAP_CLASS : TextRenderingComponent.SINGLELINE_WRAP_CLASS;\n\t\tcellValueElement.textContent = '';\n\t\tcellValueElement.classList.remove(wrapClass);\n\t\tcellElement.classList.remove(TextRenderingComponent.CELL_ELEMENT_CLASS);\n\t}\n\n\tdestroy(){\n\t\tconst {parentElement : cellValueElement, wrap, cellElement} = this.param;\n\t\tconst wrapClass = wrap==true ? TextRenderingComponent.MULTILINE_WRAP_CLASS : TextRenderingComponent.SINGLELINE_WRAP_CLASS;\n\t\tcellValueElement.classList.remove(wrapClass);\n\t\tcellElement.classList.remove(TextRenderingComponent.CELL_ELEMENT_CLASS);\n\n\t\tthis.elementArray.forEach(element => {\n\t\t\tcellValueElement.removeChild(element);\n\t\t});\n\t\tthis.elementArray = [];\n\t\tthis.addDestroyFunc.forEach(func => func());\n\t\tthis.addDestroyFunc = [];\n\t\tthis.param = null;\n\t}\n}\n\nsetTimeout(() => {\n\tif(!globalThis.DataGrid) {\n\t\tglobalThis.DataGrid = {};\n\t}\n\tglobalThis.DataGrid.TextRenderingComponent     = TextRenderingComponent;\n\tglobalThis.DataGrid.ChipRenderingComponent     = ChipRenderingComponent;\n\tglobalThis.DataGrid.ImageRenderingComponent    = ImageRenderingComponent;\n\tglobalThis.DataGrid.CheckboxRenderingComponent = CheckboxRenderingComponent;\n\tglobalThis.DataGrid.RatingRenderingComponent   = RatingRenderingComponent;\n});","\nimport { Select } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/select/select\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { colorsArray } from \"../MultiSelect/MultiSelectRenderer\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\n\nclass SingleSelectEditorRenderer implements ICellEditorComponent<any> {\n\tprivate singleSelectComp;\n\tprivate div: HTMLElement;\n\tparam: any;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.param = param;\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst SingleSelectConfig = getFieldEditorConfiguration(FIELD_TYPE.SingleSelect, param, this.div);\n        const transformedOptions = SingleSelectConfig.options.map((option, index)=> ({ value: option, color : colorsArray[index], id : option }));\n\t\tSingleSelectConfig.options = transformedOptions;\n\t\tSingleSelectConfig.onClose = () =>{\n\t\t   this.blur();\n\t\t}\n        this.singleSelectComp = new Select(SingleSelectConfig);\n\t}\n\tgetValue() {\n\t\treturn this.singleSelectComp.api.getValue()[0];\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus?(): void {\n\t\t this.singleSelectComp.api.focus();\n\t\t this.singleSelectComp.api.openDropdown();\n\t}\n\tblur?(): void {\n\t\tthis.param.api.getGridAPI().closeEditor();\n\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\tdestroy?(): void {\n\t\tthis.singleSelectComp.api.destroy();\n\t}\n\t\n}\n\nexport {\n    SingleSelectEditorRenderer\n}\n\n","import { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\nimport {Select} from '../../../../Sub_Components/src/fieldcomponents/dg-base/src/select/select'; \nimport { colorsArray } from \"../MultiSelect/MultiSelectRenderer\";\n\n\n\n\nclass SingleSelectRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n        const singleSelectConfig = getFieldConfigurationByType(FIELD_TYPE.SingleSelect, this.param,this.div);\n\t\tconst transformedOptions =singleSelectConfig.options.map((option, index)=> ({ value: option, color : colorsArray[index], id : option }));\n\t\tsingleSelectConfig.options = transformedOptions;\n\t\tnew Select(singleSelectConfig);\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    SingleSelectRenderer\n}","import { TextComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/text/text.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\nclass TextEditorRenderer implements ICellEditorComponent<any> {\n\tprivate textComp;\n\tprivate div: HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst textConfig = getFieldEditorConfiguration(FIELD_TYPE.TEXT, param, this.div);\n\t\tthis.textComp = new TextComponent(textConfig, {});\n\t}\n\tgetValue() {\n\t\treturn this.textComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus(): void {\n\t\tthis.textComp.api.focus();\n\t}\n\tblur(): void {\n\t\tthis.textComp.api.blur();\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\n\tdestroy?(): void {\n\t\tthis.textComp.api.destroy();\n\t\t\n\t}\n\t\n}\n\nexport {\n    TextEditorRenderer\n}\n\n","import { RenderingTextComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/text/text.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/base-style.css\";\nimport \"../../../../Sub_Components/src/fieldcomponents/dg-base/demo/styles/rtl-style.css\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nclass TextRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst textConfiguration = getFieldConfigurationByType(FIELD_TYPE.TEXT, this.param, this.div)\n\t\tnew RenderingTextComponent(textConfiguration );\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    TextRenderer\n}","import { MultilineComponent } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/Multiline/src/multiline\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { ICellEditorComponent } from \"../../Main\";\nimport { getFieldEditorConfiguration } from \"../ValueHolder\";\n\n\nclass URLEditorRenderer implements ICellEditorComponent<any> {\n\tprivate linkComp;\n\tprivate div: HTMLElement;\n\tinit?(param: any): void | Promise<void> {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst textConfig = getFieldEditorConfiguration(FIELD_TYPE.LINK, param, this.div);\n\t\t// this.linkComp = new Link(textConfig, {});\n\t\tthis.linkComp = new MultilineComponent(textConfig);\n\t}\n\tgetValue() {\n\t\treturn this.linkComp.api.getValue();\n\t}\n\tafterElementAttached?(): void {\n\t\t\n\t}\n\t\n\tfocus(): void {\n\t\tthis.linkComp.api.focus();\n\t}\n\tblur(): void {\n\t\tthis.linkComp.api.blur();\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.div\n\t}\n\n\tdestroy?(): void {\n\t\t\n\t}\n\t\n}\n\nexport {\n    URLEditorRenderer\n}\n\n","import { Link } from \"../../../../Sub_Components/src/fieldcomponents/dg-base/src/link/link\";\nimport { FIELD_TYPE } from \"../../Core/Columns/ColumnDataTypeHandler\";\nimport { getFieldConfigurationByType } from \"../ValueHolder\";\n\nclass URLRenderer {\n\tprivate param: any;\n\tprivate div: HTMLElement;\n\tinit(param) {\n\t\tthis.param = param;\n\t}\n\n\tgetElement():HTMLElement {\n\t\tthis.div = document.createElement(\"div\");\n\t\tconst linkConfiguration = getFieldConfigurationByType(FIELD_TYPE.LINK, this.param, this.div);\n\t\tnew Link(linkConfiguration);\n\t\treturn this.div;\n\t}\n}\n\nexport {\n    URLRenderer\n}","import { FIELD_TYPE, FieldTypes } from \"../Core/Columns/ColumnDataTypeHandler\";\n\ntype IFieldComponentType = any;\ntype IRendererParam = any;\n\n\n\nfunction getFieldConfigurationByType(fieldType : FieldTypes, param : IRendererParam, parentDiv : any) : IFieldComponentType {\n    let fieldConfiguration = {};\n\tconst fieldData = param.data[param.columnNode.getColumnKey()];\n    // const  gridDivElement  =  param.apis.getGridAPI().optionsHandler.gridDivElement;\n    // const  gridDivElement  =  param.apis.getGridAPI().optionsHandler.getGridContainer();\n\n    switch(fieldType) {\n        case FIELD_TYPE.CHECKBOX: \n        {\n            const columnNode = param.columnNode;\n            const fieldProperties = columnNode.getFieldProperties()\n            const fieldData = param.data[param.columnNode.getColumnKey()];\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                defaultValue : fieldData,\n                readonly : false,\n                checkedBorderColor : fieldProperties.checkboxBorder,\n                uncheckedBorderColor : fieldProperties.checkboxBorder,\n                checkedFillColor : fieldProperties.checkboxCheckedBackground,\n                uncheckedboxFillColor : fieldProperties.checkboxBackground,\n                ariaLabel : columnNode.getColumnKey() +\" : \"+ fieldData,\n                onclick : (event) => {\n                    const isChecked = event.target.checked;\n                    param.apis.getCellAPI().setData(param.rowIndex, param.columnIndex, isChecked);\n                }\n            }\n            break;\n        }\n\n        case FIELD_TYPE.CURRENCY : \n        {\n            fieldConfiguration = {\n                value: fieldData,\n                keepWithinRange: false,\n                invalid: false,\n                currency: '$',\n                locale : \"en-US\",\n                readonly       : true,\n                useCurrencyCode: false,\n                currencyCode: 'USD',\n                appendTo: parentDiv,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.DATE : \n        {\n            fieldConfiguration = {\n                value  : fieldData,\n                format        : \"M/D/YYYY\",\n                readonly      : true,\n                appendTo      : parentDiv,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.NUMBER : \n        {\n            fieldConfiguration = {\n                value: fieldData,\n                readonly       : true,\n                appendTo: parentDiv\n            }\n            break;\n        }\n\n        case FIELD_TYPE.PERCENT : \n        {\n            fieldConfiguration = {\n                value: fieldData/100,\n                readonly       : true,\n                appendTo: parentDiv,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.RATING : \n        {\n            fieldConfiguration = {\n                appendTo    : parentDiv,\n\t\t\t\tvalue: fieldData,\n\t\t\t\tmaxValue         : 5,\n\t\t\t\treadonly    : true,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.TEXT : \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                ariaLabel :'read_only',\n                disabled :   false,\n                readOnly :  true,\n                value : fieldData\n            }\n            break;\n        }\n        case FIELD_TYPE.MULTILINE: \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                ariaLabel :'read_only',\n                disabled :   false,\n                readOnly :  true,\n                value : fieldData\n            }\n            break;\n        }\n        case FIELD_TYPE.PHONE_NUMBER : \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                anchorText : fieldData,\n                href : \"tel:\"+fieldData,\n                value: fieldData,\n                openInNewTab : true,\n                ariaLabel : fieldData,\n                linkType : 'telephone',\n                onclick : ()=>{}\n            }\n            break;\n        }\n        case FIELD_TYPE.EMAIL : \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                anchorText : fieldData,\n                href : \"mailto:\"+fieldData,\n                value : fieldData,\n                openInNewTab : true,\n                ariaLabel : fieldData,\n                type : 'mail',\n                onclick : ()=>{}\n            }\n            break;\n        }\n        case FIELD_TYPE.LINK : \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                anchorText : fieldData,\n                href : fieldData,\n                value : fieldData,\n                openInNewTab : true,\n                ariaLabel : fieldData,\n                linkType : '',\n                onclick : ()=>{}\n            }\n            break;\n        }\n        case FIELD_TYPE.SingleSelect : {\n            const columnNode = param.columnNode;\n            const fieldProperties = columnNode.getFieldProperties()\n            const data = [fieldData];\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                dropdownAppendTo : document.querySelector('.ZG-rootWrapperBody'),\n                options : fieldProperties.sourceData,\n                selectedIndex : [fieldProperties.sourceData.indexOf(data[0])],\n                multiple: false,\n                readonly : true,\n                searchable : true,\n                optionAsChip : true,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.MultiSelect : {\n            const columnNode = param.columnNode;\n            const fieldProperties = columnNode.getFieldProperties()\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                dropdownAppendTo : document.querySelector('.ZG-rootWrapperBody'),\n                options : fieldProperties.sourceData,\n                selectedIndex : fieldData.map(element => fieldProperties.sourceData.indexOf(element)),\n                multiple: true,\n                readonly : true,\n                searchable : true,\n                // virtualList : true,\n                optionAsChip : true,\n            }\n            break;\n        }\n\n    }\n\n    return fieldConfiguration;\n\n}\n\nfunction getFieldEditorConfiguration(fieldType : FieldTypes, param : IRendererParam, parentDiv : HTMLElement) : IFieldComponentType {\n    let fieldConfiguration = {};\n\tconst fieldData = param.data[param.columnNode.getColumnKey()]\n    const  gridDivElement  =  param.api.getGridAPI().optionsHandler.getGridContainer();\n\n    // const  gridDivElement  =  param.api.getGridAPI().optionsHandler.getDocument();\n\n    switch(fieldType) {\n        case FIELD_TYPE.CHECKBOX: \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                defaultValue : fieldData,\n                readonly : false,\n            }\n            break;\n        }\n        case FIELD_TYPE.MULTILINE :\n            {\n                fieldConfiguration ={\n                    appendTo :  parentDiv,\n                    value : fieldData,\n                    ariaLabel :'read_only',\n                    disabled :   false,\n                    readOnly :  false,\n                    // onKeydown : (_ev) =>{\n                    //     console.log('keyDwonm multi');\n                        \n                    // },\n                    // onBlur : (_ev) => {\n                    //     console.log('onbLur multi');\n                        \n                    // },\n                    // onInput :(ev)=>{\n                    //     console.log(ev);\n                    //     console.log('onInput multi');\n                        \n                    // }\n                }\n                break;\n            }\n\n\n        case FIELD_TYPE.TEXT : \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                ariaLabel :'read_only',\n                disabled :   false,\n                readOnly :  false,\n                value : fieldData,\n                // onKeydown : () =>{\n                //     console.log('keyDwonm text');\n                    \n                // },\n                // onBlur : () => {\n                //     console.log('onbLur text');\n                    \n                // },\n                // onInput :(ev)=>{\n                //     if(ev.inputType == 'insertLineBreak'){\n\n                //     }\n                //     // console.log(ev);\n                //     // console.log('onInput text');\n                    \n                // }\n            }\n            break;\n        }\n\n        case FIELD_TYPE.CURRENCY : \n        {\n            fieldConfiguration = {\n                value: fieldData,\n                readOnly: false,\n                currency: '$',\n                step:1,\n                useCurrencyCode: false,\n                currencyCode: 'USD',\n                appendTo: parentDiv,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.DATE : \n        {\n            fieldConfiguration = {\n                value  : fieldData,\n                format        : \"M/D/YYYY\",\n                readOnly      : false,\n                appendTo      : parentDiv,\n                datePickerAppendTo : gridDivElement\n            }\n            break;\n        }\n\n        case FIELD_TYPE.NUMBER : \n        {\n            fieldConfiguration = {\n                value: fieldData,\n                readOnly: false,\n                step:1,\n                appendTo: parentDiv\n            }\n            break;\n        }\n\n        case FIELD_TYPE.PERCENT : \n        {\n            fieldConfiguration = {\n                value: fieldData/100,\n                step: 0.1,\n                readOnly: false,\n                appendTo: parentDiv,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.RATING : \n        {\n            fieldConfiguration = {\n                appendTo    : parentDiv,\n\t\t\t\tvalue: fieldData,\n\t\t\t\tmaxValue         : 5,\n\t\t\t\treadonly    : true,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.PHONE_NUMBER : \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                // anchorText : fieldData,\n                href : \"+91\"+fieldData,\n                value: +fieldData,\n                ariaLabel : fieldData,\n                openInNewTab : true,\n                linkType : 'telephone',\n                onclick : ()=>{}\n            }\n            break;\n        }\n\n        case FIELD_TYPE.LINK : \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                anchorText : fieldData,\n                href : \"\"+fieldData,\n                value: \"\"+fieldData,\n                ariaLabel : fieldData,\n                openInNewTab : true,\n                onclick : ()=>{}\n            }\n            break;\n        }\n        case FIELD_TYPE.EMAIL : \n        {\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                // anchorText : fieldData,\n                href : fieldData,\n                value :fieldData,\n                openInNewTab : true,\n                ariaLabel : fieldData,\n                linkType : 'mail',\n                onclick : ()=>{}\n            }\n            break;\n        }\n\n        case FIELD_TYPE.SingleSelect : {\n            const columnNode = param.columnNode;\n            const fieldProperties = columnNode.getFieldProperties()\n            const data = [fieldData];\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                dropdownAppendTo     :document.querySelector('.ZG-rootWrapperBody'),\n                options : fieldProperties.sourceData,\n                selectedIndex : [fieldProperties.sourceData.indexOf(data[0])],\n                multiple: false,\n                searchable : true,\n                optionAsChip : true,\n                closeOnSelect :  true,\n            }\n            break;\n        }\n\n        case FIELD_TYPE.MultiSelect : {\n            const columnNode = param.columnNode;\n            const fieldProperties = columnNode.getFieldProperties()\n            fieldConfiguration = {\n                appendTo : parentDiv,\n                dropdownAppendTo :document.querySelector('.ZG-rootWrapperBody'),\n                options : fieldProperties.sourceData,\n                selectedIndex : fieldData.map(element => fieldProperties.sourceData.indexOf(element)),\n                multiple: true,\n                searchable : true,\n                optionAsChip : true,\n            }\n            break;\n        }\n\n\n    }\n    return fieldConfiguration;\n}\n\nexport {\n    getFieldConfigurationByType,\n    getFieldEditorConfiguration\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Core/Constants/BeanName\";\nimport { IEscapeHandler } from \"../../../Sub_Components/src/Utilities/EscapeHandler.types\";\nimport { IFloatingRecordHandler } from \"./Interface/IFloatingRecordHandler\";\nimport { IFloatingRecordBehaviourHandler } from \"./Interface/FloatingRecordBehaviourHandler.types\";\nimport { HookEventsName } from \"../Core/Hooks/Constants/HookEventsName\";\nimport { IGridCellEditorHandler } from \"../GridComponent/Editor/GridCellEditorHandler\";\nimport { CellController } from \"../GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { IFloatingRowAPI, IHideRowsHookParams, IHideShowColumnsHookParamsWithoutAPI, IInsertRowsHookParams, IMoveRowsHookParams, INavigationAPI, IRemoveRowsHookParams, ISetRowsHeightHookParams } from \"../Main\";\n// import { IRowSelectionHandler } from \"../../Selection/row-selection-handler.types\";\n\nexport type IFloatingTriggerAction = 'rowInsert' | 'rowRemove' | 'rowReorder' | 'rowVisiblityChange' | 'rowResize' | 'rowCachesClear' | 'api';\n\nexport class FloatingRecordBehaviourHandler extends EventEmitter implements IFloatingRecordBehaviourHandler {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler;\n    @AutoWired(GRID_BEAN_NAME.FLOATING_ROW_API) private floatingRowAPI : IFloatingRowAPI;\n    \n    private onEscape                 : () => void;\n    private gridEscapeHandler        : IEscapeHandler;\n    private floatingRecordHandler    : IFloatingRecordHandler;\n    private escapeActionId           : string;\n    private cellEditorHandler        : IGridCellEditorHandler;\n    private onCellSelectionChange    : (params: any) => void;\n    private onBeforeRowInsert        : (params : IInsertRowsHookParams) => void;\n    private onBeforeRowRemove        : (params : IRemoveRowsHookParams) => void;\n    private onBeforeRowReorder       : (params : IMoveRowsHookParams) => void;\n    private onBeforeRowHideShow      : (params : IHideRowsHookParams) => void;\n    private onBeforeRowResize        : (params: ISetRowsHeightHookParams) => void;\n    private onBeforeColumnHideDelete : (params : IHideShowColumnsHookParamsWithoutAPI) => void;\n    private onBeforeRowsCacheCleared : () => void;\n    navigationApi            : INavigationAPI;\n    private updateFloatingAboveAndBelowRecordsClassName: () => void;\n    private onAfterAllRowsCacheCleared: () => void;\n    // private rowSelectionHandler        : IRowSelectionHandler;\n\n    @PostConstruct()\n    init() : void {\n        this.gridEscapeHandler     = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_ESCAPE_HANDLER);\n        this.floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER);\n        this.cellEditorHandler     = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER);\n        this.navigationApi     = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.NAVIGATION_API);\n        // this.rowSelectionHandler = this.getBeanInstanceByBeanName(\"RowSelectionHandler\") as IRowSelectionHandler;\n        this.onEscape = () : void => {\n            this.floatingRecordHandler.discardFloatingRecord();\n        }\n\n        this.onBeforeRowInsert = (dispatchedParam : any) : void => {\n            const metas            = dispatchedParam.metas as IInsertRowsHookParams;\n            const insertIndexMetas = metas.metas;\n            const initialMeta      = this.cellEditorHandler.getInitialMeta();\n            if(initialMeta){\n                for(let loopIndex = 0; loopIndex < insertIndexMetas.length; loopIndex++){\n                    let {rowIndex : insertIndex, insertPosition} = insertIndexMetas[loopIndex];\n                    if(insertPosition == 'before'){\n                        insertIndex--;\n                    }\n                    if(insertIndex < initialMeta.rowIndex){\n                        this.floatRow('rowInsert');\n                        break;\n                    }\n                }\n            }\n        }\n\n        this.onBeforeRowRemove = (dispatchedParam : any) : void => {\n            const metas = dispatchedParam.metas as IRemoveRowsHookParams;\n            const deleteIndexMetas = metas.metas;\n            const initialMeta = this.cellEditorHandler.getInitialMeta();\n            if (initialMeta) {\n                for (let loopIndex = 0; loopIndex < deleteIndexMetas.length; loopIndex++) {\n                    let { rowIndex: removeIndex } = deleteIndexMetas[loopIndex];\n                    if (removeIndex <= initialMeta.rowIndex) {\n                        this.floatRow('rowRemove');\n                        break;\n                    }\n                    else{\n                        this.floatingRecordHandler.commitAndUnFloatRow();\n                    }\n                }\n            }\n        }\n\n        this.onBeforeRowReorder = (dispatchedParam : any) : void => {\n            const metas = dispatchedParam.metas as IMoveRowsHookParams;\n            const reorderIndexMetas = metas.metas;\n            const initialMeta = this.cellEditorHandler.getInitialMeta();\n            if (initialMeta) {\n                const {targetRow, sourceRows} = reorderIndexMetas;\n                if( targetRow.rowIndex <= initialMeta.rowIndex ){\n                    return this.floatRow('rowReorder');\n                }\n                for (let loopIndex = 0; loopIndex < sourceRows.length; loopIndex++) {\n                    const sourceIndex = sourceRows[loopIndex];\n                    if (sourceIndex.rowIndex <= initialMeta.rowIndex) {\n                        return this.floatRow('rowReorder');\n                    }\n                }\n            }\n        }\n\n        this.onBeforeRowHideShow = (dispatchedParam : any) : void => {\n            const metas          = dispatchedParam.metas as IHideRowsHookParams;\n            const hideIndexMetas = metas.metas;\n            const initialMeta    = this.cellEditorHandler.getInitialMeta();\n            if (initialMeta) {\n                for (let loopIndex = 0; loopIndex < hideIndexMetas.length; loopIndex++) {\n                    let { rowIndex: hideIndex } = hideIndexMetas[loopIndex];\n                    if (hideIndex < initialMeta.rowIndex) {\n                        this.floatRow('rowVisiblityChange');\n                        break;\n                    }\n                }\n            }\n        }\n\n        this.onBeforeRowResize = (dispatchedParam : any) : void => {\n            const metas            = dispatchedParam.metas as ISetRowsHeightHookParams;\n            const resizeIndexMetas = metas.metas;\n            const initialMeta      = this.cellEditorHandler.getInitialMeta();\n            if (initialMeta) {\n                for (let loopIndex = 0; loopIndex < resizeIndexMetas.length; loopIndex++) {\n                    let { rowIndex: resizeIndex, height } = resizeIndexMetas[loopIndex];\n                    const heightIndex = resizeIndex == 'all' ? 0 : resizeIndex;\n                    const existingHeight = this.recordHandler.getHeightByIndex(heightIndex); \n                    if ((existingHeight != height) && (resizeIndex == 'all' || resizeIndex < initialMeta.rowIndex)) {\n                        this.floatRow('rowResize');\n                        break;\n                    }\n                }\n            }\n        }\n\n        this.onBeforeRowsCacheCleared = () : void => {\n            const initialMeta = this.cellEditorHandler.getInitialMeta();\n            if (initialMeta) {\n                this.floatRow('rowCachesClear');\n            }\n        }\n\n        this.onBeforeColumnHideDelete = (dispatchedParam : any) : void => {\n            const metas = dispatchedParam.metas as IHideShowColumnsHookParamsWithoutAPI;\n            const hideIndexMetas = metas.metas;\n            const initialMeta = this.cellEditorHandler.getInitialMeta();\n            if (initialMeta) {\n                for (let loopIndex = 0; loopIndex < hideIndexMetas.length; loopIndex++) {\n                    let { columnId } = hideIndexMetas[loopIndex];\n                    if(columnId == initialMeta.columnId){\n                        this.floatingRecordHandler.commitAndUnFloatRow();\n                        break;\n                    }\n                }\n            }\n        }\n\n        this.onCellSelectionChange = ({metas}) : void => {\n            // const floatingTargetIndex = this.floatingRecordHandler.getTargetIndex();\n            const currentSelection = metas.current;\n            // const isIndexChanged      = floatingTargetIndex !== currentSelection.rowIndex;\n            const isFloatigRecord     = currentSelection.pinPosition == 'FloatingRecord';\n\n            if(!isFloatigRecord){\n                // const rowNode = this.floatingRecordHandler.getFloatingRowNode();\n                // const rowMeta = rowNode.getRowMeta();\n                // this.rowSelectionHandler.setRowSelected({\n                //     values     : [{rowID : rowNode.getId(), ...rowMeta}],\n                //     selected   :  false,\n                //     source     : 'ui',\n                //     rangeSelect: false\n                // });\n                this.floatingRecordHandler.commitAndUnFloatRow();\n            }\n        }\n\n        this.updateFloatingAboveAndBelowRecordsClassName = () => {\n            this.floatingRecordHandler.updateFloatingAboveAndBelowRecordsClassName();\n        }\n\n        this.onAfterAllRowsCacheCleared = () => {\n            const floatingRowNode = this.floatingRowAPI.getFloatingRowNode();\n            if(floatingRowNode){\n                const floatingId = floatingRowNode.getId();\n                this.recordHandler.getRowNodeById(floatingId)?.setRecordFloating(true);\n            }\n            this.updateFloatingAboveAndBelowRecordsClassName();\n        }\n    } \n\n    private floatRow(triggerAction : IFloatingTriggerAction) : void{\n        const cellController      = this.cellEditorHandler.getCellController() as CellController;\n        const rowNode             = cellController.getRowNode();\n        const rowId               = rowNode.getId();\n        this.floatingRowAPI.floatRowById(rowId, {triggerAction});\n    }\n \n    observeFloatEvent(): void {\n        this.addEventListener(HookEventsName.onBeforeRowInsert, this.onBeforeRowInsert);\n        this.addEventListener(HookEventsName.onBeforeRowRemove, this.onBeforeRowRemove);\n        this.addEventListener(HookEventsName.onBeforeRowReorder, this.onBeforeRowReorder);\n        this.addEventListener(HookEventsName.onBeforeRowHide, this.onBeforeRowHideShow);\n        this.addEventListener(HookEventsName.onBeforeRowShow, this.onBeforeRowHideShow);\n        this.addEventListener(HookEventsName.onBeforeRowResize, this.onBeforeRowResize);\n        this.addEventListener(HookEventsName.onBeforeAllRowsCacheCleared, this.onBeforeRowsCacheCleared);\n        this.addEventListener(HookEventsName.onBeforeColumnRemove, this.onBeforeColumnHideDelete);\n        this.addEventListener(HookEventsName.onBeforeColumnHide, this.onBeforeColumnHideDelete);\n\n\n        this.addEventListener(HookEventsName.onAfterRowInsert, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.addEventListener(HookEventsName.onAfterRowRemove, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.addEventListener(HookEventsName.onAfterRowReorder, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.addEventListener(HookEventsName.onAfterRowHide, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.addEventListener(HookEventsName.onAfterRowShow, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.addEventListener(HookEventsName.onAfterRowResize, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.addEventListener(HookEventsName.onAfterAllRowsCacheCleared, this.onAfterAllRowsCacheCleared);\n        this.addEventListener(HookEventsName.onAfterColumnRemove, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.addEventListener(HookEventsName.onAfterColumnHide, this.updateFloatingAboveAndBelowRecordsClassName);\n    }\n\n    unObserveFloatEvent(): void {\n        this.removeEventListener(HookEventsName.onBeforeRowInsert, this.onBeforeRowInsert);\n        this.removeEventListener(HookEventsName.onBeforeRowRemove, this.onBeforeRowRemove);\n        this.removeEventListener(HookEventsName.onBeforeRowReorder, this.onBeforeRowReorder);\n        this.removeEventListener(HookEventsName.onBeforeRowHide, this.onBeforeRowHideShow);\n        this.removeEventListener(HookEventsName.onBeforeRowShow, this.onBeforeRowHideShow);\n        this.removeEventListener(HookEventsName.onBeforeRowResize, this.onBeforeRowResize);\n        this.removeEventListener(HookEventsName.onBeforeAllRowsCacheCleared, this.onBeforeRowsCacheCleared);\n        this.removeEventListener(HookEventsName.onBeforeColumnRemove, this.onBeforeColumnHideDelete);\n        this.removeEventListener(HookEventsName.onBeforeColumnHide, this.onBeforeColumnHideDelete);\n\n        this.removeEventListener(HookEventsName.onAfterRowInsert, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.removeEventListener(HookEventsName.onAfterRowRemove, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.removeEventListener(HookEventsName.onAfterRowReorder, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.removeEventListener(HookEventsName.onAfterRowHide, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.removeEventListener(HookEventsName.onAfterRowShow, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.removeEventListener(HookEventsName.onAfterRowResize, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.removeEventListener(HookEventsName.onAfterAllRowsCacheCleared, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.removeEventListener(HookEventsName.onAfterColumnRemove, this.updateFloatingAboveAndBelowRecordsClassName);\n        this.removeEventListener(HookEventsName.onAfterColumnHide, this.updateFloatingAboveAndBelowRecordsClassName);\n    }\n\n    observeDiscardEvent(): void {\n        this.escapeActionId = this.gridEscapeHandler.addAction(this.onEscape);\n    }\n\n    unObserveDiscardEvent(): void {\n        this.gridEscapeHandler.removeAction(this.escapeActionId);\n    }\n\n    observeUnFloatEvent(): void {\n        this.addEventListener(HookEventsName.onAfterCellSelectionChange, this.onCellSelectionChange);\n    }\n\n    unObserveUnFloatEvent(): void {\n        this.removeEventListener(HookEventsName.onAfterCellSelectionChange, this.onCellSelectionChange);\n    }\n    \n}\n","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { Events } from \"../Core/Constants/Events\";\nimport { RowController } from \"../GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { IFloatingRecord, IFloatingRecordHandler } from \"./Interface/IFloatingRecordHandler\";\nimport { GRID_BEAN_NAME } from \"../Core/Constants/BeanName\";\nimport { IGridAPI, INavigationAPI, IReorderableAPI } from \"../Main\";\nimport { IRecordHandler } from \"../Core/Rows/RecordHandler.types\";\nimport { IRowNodeCore } from \"../../DataStore/rownode.types\";\nimport { RowControllerMap, RowRenderController } from \"../Core/Rows/RowRenderController\";\nimport { FloatingRecordBehaviourHandler } from \"./FloatingRecordBehaviourHandler\";\nimport { IFloatingRecordBehaviourHandler } from \"./Interface/FloatingRecordBehaviourHandler.types\";\nimport { IGridCellEditorHandler } from \"../GridComponent/Editor/GridCellEditorHandler\";\nimport { IRowSelectionHandler } from \"Selection/row-selection-handler.types\";\n\n\n\ninterface IFloatingMeta{\n    top           : number;\n    height        : number;\n    rowNode       : IRowNodeCore;\n}\n\n\nconst FLOATING_RECORD_PRESENT_ABOVE = \"ZG-FloatingRecordPresentAbove\";\nconst FLOATING_RECORD_PRESENT_BELOW = \"ZG-FloatingRecordPresentBelow\";\n\n@Bean(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER)\nexport class FloatingRecordHandler extends EventEmitter implements IFloatingRecordHandler {\n    private floatingRecordRendered    : boolean  = false;\n    \n    private floatingMeta                   : IFloatingMeta = null;\n    private targetRowId                    : string = null;\n    private floatingRecordControllers      : { [key : string] : RowController} = {}\n    private floatingRecordBehaviourHandler : IFloatingRecordBehaviourHandler;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.NAVIGATION_API) private navigationApi : INavigationAPI;\n    \n    @PostConstruct()\n    init() : void {\n        this.floatingRecordBehaviourHandler = this.createManagedBean(new FloatingRecordBehaviourHandler());\n\n        this.addEventListener(Events.EVENT_ROW_CONTAINER_HEIGHT_CHANGED, ()=>{\n            this.updateFloatingRecordHeight();\n        })\n    }\n\n    updateFloatingRecordHeight() : void {\n        const floatingRecordController = this.floatingRecordControllers[this.getTargetIndex()];\n        if(floatingRecordController) {\n            floatingRecordController.setRowHeight();\n        }\n    }\n\n    observeFloat() : void {\n        this.floatingRecordBehaviourHandler.observeFloatEvent();\n    }\n\n    unObserveFloat() : void {\n        this.floatingRecordBehaviourHandler.unObserveFloatEvent();\n    }\n\n    updateFloatingRecordMovedLabel(label : string) : void {\n        const floatingRecordController = this.floatingRecordControllers[this.getTargetIndex()];\n        if(floatingRecordController) {\n            floatingRecordController.updateFloatingRecordMovedLabel(label);\n        }\n    }\n\n    updateFloatingAboveAndBelowRecordsClassName() : void {\n        const recordHandler    = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n        const floatingRecordId = this.getTargetRowId();\n        const rowIdAbove       = recordHandler.getPreviousID(floatingRecordId);\n        const rowIdBelow       = recordHandler.getNextID(floatingRecordId);\n        const rowControllers = rowRenderController.getAllRowControllers();\n        \n        rowControllers.forEach((rowController) => {\n            const rowNode   = rowController.getRowNode();\n            const rowId     = rowNode.getId();\n            const allRowGui = rowController.getAllRowElement();\n\n            const isFloatingRecordExistsAbove = rowIdAbove &&  rowId === rowIdBelow;\n            const isFloatingRecordExistsBelow = rowIdBelow && rowId === rowIdBelow;\n            if(isFloatingRecordExistsAbove){\n                allRowGui.forEach(({component}) => {\n                    component.addOrRemoveCssClass(FLOATING_RECORD_PRESENT_ABOVE, true);\n                });\n            }\n            if(isFloatingRecordExistsBelow){\n                allRowGui.forEach(({component}) => {\n                    component.addOrRemoveCssClass(FLOATING_RECORD_PRESENT_BELOW, true);\n                });\n            }\n        });\n\t}\n    \n    floatRow(rowId : string) : void {\n        const isSourceIndexInCenterHandler = this.isRowInCenterHandler(rowId);\n        const gridAPI                      = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_API) as IGridAPI;\n        const cellEditorHandler            = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as IGridCellEditorHandler;\n        if(isSourceIndexInCenterHandler && this.getTargetRowId() != rowId) {\n            if(this.hasAnyRecordFloating()) {\n                this.commitAndUnFloatRow();\n            }\n            \n            const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n            const middleHandler = recordHandler.getMiddleHandler();\n            const rowNode       = middleHandler.getRowNodeById(rowId);\n\n            const editingCellController = cellEditorHandler.getCellController();\n            let editingRowId, editingColumnId;\n            let editorData = null;\n            if(editingCellController){\n                editingColumnId = editingCellController.getColumn().getID();\n                editingRowId    = editingCellController.getRowNode().getId();\n                const columnKey = editingCellController.getColumn().getColumnKey();\n                const beforeData = rowNode.getDataByKey(columnKey);\n                cellEditorHandler.stopEditing(null, null, false, true, false);\n                const afterData = rowNode.getDataByKey(columnKey);\n                editorData = afterData;\n                rowNode.updateDataByKey(columnKey, beforeData);\n            }\n\n            const record: IFloatingRecord = {\n\t\t\t\tsourceId : rowId,\n\t\t\t\ttargetId : rowId,\n\t\t\t};\n\n            \n            this.floatingMeta = {\n                top    : rowNode.getTop(),\n                height : rowNode.getHeight(),\n                rowNode,\n            }\n            this.targetRowId = rowId;\n\n            rowNode.setRecordFloating(true);\n\n            this.dispatchAddEvent(record);\n            const focusedCellPosition = this.navigationApi.getFocusedCell();\n\n            focusedCellPosition.pinPosition = 'FloatingRecord';\n            focusedCellPosition.rowIndex    = 0;\n            this.navigationApi.setFocusToCell(focusedCellPosition, {\n                scrollOnFocus: false,\n                range: true,\n                focus: true\n            });\n\n            editingCellController && gridAPI.startCellEditing(editingRowId, editingColumnId, null, editorData);\n\n            this.updateFloatingAboveAndBelowRecordsClassName();\n        }\n    }\n\n    discardFloatingRecord() : void {\n        const sourceId = this.getSourceFloatingRow();\n        if (sourceId) {\n            const focusedCellPosition = this.navigationApi.getFocusedCell();\n             const rowSelectionHandler = this.getBeanInstanceByBeanName(\"RowSelectionHandler\") as IRowSelectionHandler;\n             const rowNode = this.getFloatingRowNode();\n             const rowMeta = rowNode.getRowMeta();\n             rowSelectionHandler.setRowSelected({\n\t\t\t\tvalues     : [{rowID : rowNode.getId(), ...rowMeta}],\n\t\t\t\tselected   :  false,\n\t\t\t\tsource     : 'ui',\n\t\t\t\trangeSelect: false\n\t\t\t});\n            this.commitAndUnFloatRow(sourceId);\n            this.navigationApi.setFocusToCellById(sourceId, focusedCellPosition.columnID);\n        }\n    }\n\n    commitAndUnFloatRow( targetId : string = this.getTargetRowId()): void {\n        const rowSelectionHandler = this.getBeanInstanceByBeanName(\"RowSelectionHandler\") as IRowSelectionHandler;\n        const rowNode = this.getFloatingRowNode();\n        if(rowNode) {\n            rowSelectionHandler.setRowSelected({\n                values     : [{rowID : rowNode.getId(), ...rowNode.getRowMeta()}],\n                selected   :  false,\n                source     : 'ui',\n                rangeSelect: false\n            });\n        }\n        const isSourceIndexInCenterHandler = this.isRowInCenterHandler(targetId);\n        const cellEditorHandler            = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as IGridCellEditorHandler;\n        if( this.floatingMeta ) {\n            const sourceId                 = this.getSourceFloatingRow();\n            const reordableApi             = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.REORDERABLE_API) as IReorderableAPI;\n            const record : IFloatingRecord = { sourceId, targetId };\n            const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n            const floatingRecordId = this.getFloatingRowNode().getId();\n\n            const floatingRowNode = recordHandler.getMiddleHandler().getRowNodeById(floatingRecordId);\n            floatingRowNode?.setRecordFloating(false);\n\n            this.floatingRecordRendered = false;\n            this.floatingMeta           = null;\n            this.targetRowId            = null;\n            // this.floatingRecordControllers = {};\n\n            isSourceIndexInCenterHandler && reordableApi.moveRowById(sourceId, targetId);\n\n            cellEditorHandler.stopEditing();\n            this.updateFloatingAboveAndBelowRecordsClassName();\n            this.dispatchRemoveEvent(record);\n        }\n    }\n\n    moveRowTemporarily(targetId : string)    : void {\n        const reorderableApi               = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.REORDERABLE_API) as IReorderableAPI;\n        const isSourceIndexInCenterHandler = this.isRowInCenterHandler(targetId);\n        const sourceId                     = this.getSourceFloatingRow();\n\n        if(isSourceIndexInCenterHandler && sourceId != targetId) {\n            this.targetRowId = targetId;\n            reorderableApi.moveRowById(sourceId, targetId);\n            const record: IFloatingRecord = {\n\t\t\t\tsourceId,\n\t\t\t\ttargetId,\n\t\t\t};\n            this.floatingRecordRendered = false;\n            this.dispatchMoveEvent(record);\n        }\n    }\n\n    getTargetRowId() : string | null {\n        return this.targetRowId;\n    }\n\n    isFloatingRecord(rowId : string) : boolean {\n        if(rowId == null || rowId === undefined) {\n            return false;\n        }\n        return this.getSourceFloatingRow() == rowId;\n    }\n\n    hasAnyRecordFloating() : boolean {\n        return this.getSourceFloatingRow() != null;\n    }\n\n    getAllRowControllersByIndex() : RowControllerMap {  //return type direct usage for rowRenderController\n        return this.floatingRecordControllers;\n    }\n\n    getAllRowControllers(): RowController[] {   //return type direct usage for rowContainerController\n        return Object.values(this.floatingRecordControllers);\n    }\n\n    setFloatingRecordController(controller: RowController): void {\n        const rowIndex = controller.getRowNode().getIndex();\n        this.floatingRecordControllers[rowIndex] = controller;\n    }\n\n\n    setFloatingRecordRendered(rendered : boolean) : void {\n        this.floatingRecordRendered = rendered;\n    }\n\n\n    isFloatingRecordRendered() : boolean {\n        if (this.hasAnyRecordFloating()) {\n            return this.floatingRecordRendered;\n        }\n        return false;\n    }\n\n    private isRelativeFloatingRecord() : boolean {\n        const floatingRecord = this.optionsHandler.getFloatingRecord();\n        return floatingRecord === \"relative\";\n    }\n\n    private dispatchRemoveEvent(record : IFloatingRecord) : void {\n        this.dispatchEvent({\n\t\t\ttype       : Events.EVENT_FLOATING_RECORD_REMOVED,\n\t\t\tfloating   : true,\n            sourceId   : record.sourceId,\n            targetId   : record.targetId\n\t\t});\n        this.floatingRecordBehaviourHandler.unObserveUnFloatEvent();\n        this.floatingRecordBehaviourHandler.unObserveDiscardEvent();\n    }\n\n    private dispatchAddEvent(record : IFloatingRecord) : void {\n        this.dispatchEvent({\n            type       : Events.EVENT_FLOATING_RECORD_ADDED,\n            floating   : true,\n            recycleRows: true,\n            sourceId   : record.sourceId,\n            targetId   : record.targetId\n        });\n\n        this.floatingRecordBehaviourHandler.observeUnFloatEvent();\n        this.floatingRecordBehaviourHandler.observeDiscardEvent();\n\n    }\n\n    private dispatchMoveEvent(record : IFloatingRecord) : void {\n        this.dispatchEvent({\n\t\t\ttype       : Events.EVENT_FLOATING_RECORD_CHANGED,\n\t\t\tfloating   : true,\n\t\t\trecycleRows: true,\n\t\t\tsourceId   : record.sourceId,\n\t\t\ttargetId   : record.targetId,\n\t\t});\n    }\n\n    private isRowInCenterHandler(row : string) : boolean {\n        const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        const centerHandler = recordHandler.getMiddleHandler();\n\t\treturn !!centerHandler.getRowNodeById(row);\n    }\n\n    emptyFloatingRecordController(): void {\n        this.floatingRecordControllers = {}\n    }\n\n    getFloatingRecordSorceTop() : number {\n        const isRelativeFloatingRecord = this.isRelativeFloatingRecord();\n        if (!isRelativeFloatingRecord && this.floatingRecordRendered) {\n            return 0;\n\t\t}\n        \n        const floatingRecordBuffer = this.optionsHandler.getFloatingBufferPixel();\n         \n        const activeFloatingTop = this.floatingMeta.top;\n        const floatingRecordSourceTopWithBuffer = Math.max(0, activeFloatingTop + floatingRecordBuffer);\n\n        if(isRelativeFloatingRecord) {\n            return floatingRecordSourceTopWithBuffer;\n        }\n\n        return activeFloatingTop;\n    }\n\n    getFloatingRecordHeight() : number {\n        if(!this.hasAnyRecordFloating()){\n            return null;\n        } \n        const activeRowNode = this.floatingMeta.rowNode;\n        const height        = activeRowNode.getHeight();\n        if(height){\n            this.floatingMeta.height = height;\n        }\n        return height ?? this.floatingMeta.height;\n    }\n\n    getSourceFloatingRow() : string {\n        const meta = this.floatingMeta ?? {} as any;\n        return meta.rowNode?.getId();\n    }\n\n    getTargetIndex() : number {\n        const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n        const middleHandler = recordHandler.getMiddleHandler();\n        return middleHandler.getIndexById(this.targetRowId);\n    }\n\n    getFloatingRowNode(): IRowNodeCore {\n        return this.floatingMeta?.rowNode;\n    }\n\n    refreshFloatingRecord(): void {\n        const rowIndex = this.getTargetIndex();\n        const controllers = Object.values(this.floatingRecordControllers);\n        this.emptyFloatingRecordController();\n        if(controllers.length > 0) {\n            this.floatingRecordControllers[rowIndex] = controllers[0];\n        }\n    }\n}","import { FloatingRecordController } from \"./FloatingRecordController\";\nimport { IFloatingRecordControllerComp } from \"./Interface/IFloatingRecordController\";\nimport { IFloatingRecordComponent } from \"./Interface/IFloatingRecordComponent\";\nimport { Component, PostConstruct } from \"@dg/corecomponent\";\n\nexport class FloatingRecordComponent extends Component implements IFloatingRecordComponent {\n\tstatic getTemplate: () => HTMLElement;\n\n\tconstructor() {\n\t\tsuper(FloatingRecordComponent.getTemplate());\n\t}\n\n    @PostConstruct()\n    init() : void {\n        const componeht : IFloatingRecordControllerComp = {\n            getGui : () => this.getGui(),\n            addOrRemoveClassName : (className : string, force : boolean = true) => this.addOrRemoveCssClass(className, force)\n        }\n        const floatingRecordController = this.createManagedBean(new FloatingRecordController());\n        floatingRecordController.setComponent(componeht);\n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { AbsolutePositionHandler } from \"../../Core/AbosultePositionHandler\";\nimport { Events } from \"../../Core/Constants/Events\";\nimport { IControllerHandler } from \"../../Core/Interface/IControllerHandler\";\nimport { setDisplayed, setFixedHeight, setFixedTop, setFixedWidth } from \"../../Core/utils/Dom\";\nimport { IFloatingRecordHandler } from \"../Interface/IFloatingRecordHandler\";\nimport { IFloatingRecordController, IFloatingRecordControllerComp } from \"./Interface/IFloatingRecordController\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../Core/Rows/RecordHandler.types\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\n\nexport class FloatingRecordController extends EventEmitter implements IFloatingRecordController {\n    private component : IFloatingRecordControllerComp;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    @PostConstruct()\n    init() : void {\n        this.addListener(this.eventHandler, Events.EVENT_FLOATING_RECORD_ADDED, this.onFloatingRecordChanged.bind(this))\n        this.addListener(this.eventHandler, Events.EVENT_FLOATING_RECORD_REMOVED, this.onFloatingRecordChanged.bind(this))\n        this.addListener(this.eventHandler, Events.EVENT_FLOATING_RECORD_CHANGED, this.onFloatingRecordChanged.bind(this))\n        this.addListener(this.eventHandler, Events.EVENT_ROW_DATA_LOADED, this.onFloatingRecordChanged.bind(this))\n        this.addListener(this.eventHandler, HookEventsName.onAfterRowResize, this.onFloatingRecordResize.bind(this))\n\n    }\n\n    private isRelativeFloatingRecord() : boolean {\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        return optionHandler.isRelativeFloatingRecord();\n    }\n\n    private onFloatingRecordResize(dispatchedParams : any) : void {\n        const floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n        const metas                 = dispatchedParams.metas;\n        const resizeIndexMetas      = metas.metas;\n        const floatingTargetIndex   = floatingRecordHandler.getTargetIndex();\n        const element               = this.component.getGui();\n\n        for (let loopIndex = 0; loopIndex < resizeIndexMetas.length; loopIndex++) {\n            let { rowIndex: resizeIndex, height } = resizeIndexMetas[loopIndex];\n            if (resizeIndex == 'all' || resizeIndex == floatingTargetIndex) {\n                const heightInPixel =  height != null ? `${height}px` : '';\n                setFixedHeight(element, heightInPixel);\n                break;\n            }\n        }\n    }\n\n    private onFloatingRecordChanged() : void {\n        const isRelativeFloatingRecord = this.isRelativeFloatingRecord();\n        if(isRelativeFloatingRecord) {\n            return;\n        }\n\n        const floatingRecordHandler   = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n        const absolutePositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ABSOLUTE_POSITION_HANDLER) as AbsolutePositionHandler;\n        const recordHandler           = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n\n        const centerHandler = recordHandler.getMiddleHandler();\n\n        const floatingTargetId = floatingRecordHandler.getTargetRowId();\n\n        const floatingRecordRenderer = floatingRecordHandler.isFloatingRecordRendered();\n\n        const hasAnyRecordFloating = floatingRecordHandler.hasAnyRecordFloating();\n\n        const element = this.component.getGui();\n        \n\n        if(floatingTargetId && !floatingRecordRenderer && hasAnyRecordFloating) {\n            const rowNode = centerHandler.getRowNodeById(floatingTargetId);\n            \n            if(!rowNode.isLoaded()) {\n                return;\n            }\n            \n            const sourceTop = floatingRecordHandler.getFloatingRecordSorceTop();\n            const absoluteTop = absolutePositionHandler.findAbsoluteTopByRelativeTopInCenterHandler(sourceTop);\n\n            const height = rowNode?.getHeight();\n\n            let top = this.getFloatingBufferPixelWithTop(absoluteTop);\n\n            top = this.keepWithinBoundRect(top, height);\n\n\t\t\tconst topInPixel = top != null ? `${top}px` : '';\n\n            const heightInPixel =  height != null ? `${height}px` : '';\n\n            setFixedTop(element, topInPixel);\n\n            setFixedHeight(element, heightInPixel);\n\n            setFixedWidth(element, `100%`)\n\n            this.component.addOrRemoveClassName('ZG-rowPopover', !!floatingTargetId);\n\n        }\n\n\n\t\tif (element) {\n\t\t\tsetDisplayed(element, !!floatingTargetId);\n            if(!!floatingTargetId) {\n                const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n                const bodyController    = controllerHandler.getBodyController();\n                const scrollHandler     = bodyController.getScrollHandler();\n                const centerHandler     = controllerHandler.getFloatingRecordCenterRowContainerController();\n                centerHandler.setScrollLeft(scrollHandler.getScrollLeft());\n            }\n            \n\t\t}\n\n        if(floatingTargetId != null && !floatingRecordRenderer) {\n            floatingRecordHandler.setFloatingRecordRendered(true);\n        }\n    }\n\n    setComponent(component : IFloatingRecordControllerComp) : void {\n        this.component = component;\n\n        this.registerController();\n        this.onFloatingRecordChanged();\n\n        const element = this.component.getGui();\n\t\tif (element) {\n\t\t\tsetDisplayed(element, false);\n\t\t}\n    }\n\n    private registerController() : void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler\n        controllerHandler.registerFloatingRecordController(this);\n    }\n\n    private getFloatingBufferPixelWithTop(top : number) : number {\n        const floatingBufferPixel = this.optionsHandler.getFloatingBufferPixel();\n        return top + floatingBufferPixel;\n    }\n\n    private keepWithinBoundRect(top : number , height : number) : number {\n        const absolutePositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ABSOLUTE_POSITION_HANDLER) as AbsolutePositionHandler;\n\n        const paneBoundRect = absolutePositionHandler.findMiddlePaneBoundRect();\n\n        const parentRect = absolutePositionHandler.getParentRect();\n        \n        const paneTop = paneBoundRect.top - parentRect.top\n\n        const max = paneBoundRect.top + paneBoundRect.height - height - parentRect.top;\n\n        return Math.min(Math.max(top, paneTop), Math.abs(max));\n    }\n}","import { AutoWired, BEAN_NAME, Component, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { clearElement, removeFromParent } from \"../../../Core/utils/Dom\";\nimport { FloatingRecordMovedController } from \"./FloatingRecordMovedController\";\nimport { IFloatingRecordMovedComponent } from \"./Interface/IFloatingRecordMovedComponent\";\n\nexport class FloatingRecordMovedComponent extends Component {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    static getTemplate: ()=> HTMLElement;\n\n    private itemRenderer : any;\n\n    private itemRendererElement : HTMLElement | null;\n\n    private componentClass : any;\n\n    constructor() {\n        super(FloatingRecordMovedComponent.getTemplate())\n    }\n\n    @PostConstruct()\n    init() : void {\n        const component : IFloatingRecordMovedComponent = {\n            getGui              : () => this.getGui(),\n            setRendererDetails  : (componentDetails : any, forceNewRendererInstance : boolean) => this.setRendererDetails(componentDetails, forceNewRendererInstance),\n            destroyRenderer     : () => this.destroyRenderer(),\n            updateRowMovedLabel : (label : string) => this.updateRowMovedLabel(label)\n        }\n\n        const controller = this.createManagedBean(new FloatingRecordMovedController());\n        controller.setComponent(component)\n    }\n\n   private setRendererDetails(componentDetails :any , forceNewRendererInstance = false): void {\n        if (componentDetails) {\n            const refreshInstance = forceNewRendererInstance ? false : this.refreshRenderer(componentDetails);\n            if(!refreshInstance) {\n                this.destroyRenderer();\n                this.createRendererInstance(componentDetails);\n            }\n\t\t}\n    }\n\n    private refreshRenderer(componentDetails : any) : boolean {\n        if (this.itemRenderer == null || this.itemRenderer.refresh == null) { return false; }\n\n        if (this.componentClass !== componentDetails.componentClass) { return false}\n\n        const result = this.itemRenderer.refresh(componentDetails.params);\n\n        return result === true || result === undefined;\n    }\n\n    private afterRenderer(componentClass : any, itemRenderer : any) : void {\n        if (!this.isAlive()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.itemRenderer = itemRenderer;\n\t\tthis.itemRendererElement = itemRenderer.getGui();\n\n\t\tif (this.itemRendererElement) {\n\t\t\tclearElement(this.getGui());\n\t\t\tthis.appendChild(this.itemRendererElement);\n\t\t}\n\n        this.componentClass = componentClass;\n    }\n\n     private destroyRenderer() : void {\n        const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n\n        this.itemRenderer = context.destroyBean(this.itemRenderer);\n        removeFromParent(this.itemRendererElement);\n        this.itemRendererElement = null;\n\n        this.componentClass = null;\n\n    }\n\n    private createRendererInstance(componentDetails : any ) : void {\n        const component = componentDetails.newInstance();\n        const callBack = this.afterRenderer.bind(this, componentDetails.componentClass);\n        if (component) {\n            component.then(callBack);\n        }\n    }\n\n    updateRowMovedLabel(label : string) : void {\n        if(this.itemRenderer) {\n            this.itemRenderer.updateRowMovedLabel(label);\n        }\n    }\n}","import { IControllerHandler } from \"../../../Core/Interface/IControllerHandler\";\nimport { IFloatingRecordRendererDetails } from \"../../Interface/IFloatingRecordRendererDetails\";\nimport { IFloatingRecordMovedComponent } from \"./Interface/IFloatingRecordMovedComponent\";\nimport { IFloatingRecordMovedController } from \"./Interface/IFloatingRecordMovedController\";\nimport { Tooltip } from '../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Tooltip' // need to import with npm module\nimport { GridController } from \"../../../GridComponent/GridController\";\nimport { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { GridUserComponentHandler } from \"../../../Core/Components/UserComponentHandler\";\nimport { IFloatingRecordHandler } from \"../../Interface/IFloatingRecordHandler\";\n\nexport class FloatingRecordMovedController extends EventEmitter implements IFloatingRecordMovedController {\n    private component : IFloatingRecordMovedComponent;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n\n    private tooltipComponent  : Tooltip;\n\n    private gridController : GridController;\n\n    setComponent(component : IFloatingRecordMovedComponent) : void {\n        this.component = component;\n        this.registerController();\n        this.registerFloatingRecordDetails();\n    }\n\n    registerFloatingRecordDetails() : void {\n        const floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n        const isFloatingRecord        = floatingRecordHandler.hasAnyRecordFloating();\n        // const sourceId              = floatingRecordHandler.getSourceFloatingRow();\n\n        // const sourceIndex = floatingRecordHandler.getFloatingIndexById(sourceId);\n        // const targetIndex = floatingRecordHandler.getFloatingIndexById(floatingRecord);\n        this.onFloatingRecordMoved({\n\t\t\t// sourceIndex,\n\t\t\t// targetIndex,\n\t\t\tisFloatingRecord,\n\t\t});\n    }\n\n    @PostConstruct()\n    init(): void {\n        const controllerHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tcontrollerHandler.onAfterGridReady((params) => {\n            this.gridController = params.gridController;\n\t\t});\n    }\n\n    private registerController()  : void {\n        const controllerHanlder = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        controllerHanlder.registerFloatingRecordMovedController(this);\n    }\n\n    private onFloatingRecordMoved(params : any) : void {\n        // const sourceIndex            = params.sourceIndex;\n        // const targetIndex            = params.targetIndex;\n\n        if(params.isFloatingRecord) {\n            \n            const componentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as GridUserComponentHandler;\n\n            const params = this.createRowMovedParams();\n\n            const itemDetails : IFloatingRecordRendererDetails = {\n                getRenderer : ()=> this.optionsHandler.getRowMovedRenderer(),\n                getUserRendererParams : () => this.optionsHandler.getRowMovedRendererParams()\n            }\n            const componentDetails = componentHandler.getRowMovedRendererDetails(itemDetails, params);\n\n            this.component.setRendererDetails(componentDetails);\n        }else {\n            this.component.destroyRenderer();\n        }\n    }\n\n    private createRowMovedParams() : any {\n        return {\n            // sourceIndex : sourceIndex,\n            // targetIndex : targetIndex,\n            registerTooltip : this.registerTooltipComponent.bind(this)\n        }\n    }\n\n    private registerTooltipComponent(element : HTMLElement) : void {\n        if(this.tooltipComponent) {\n            this.tooltipComponent.api.destroy();\n            this.tooltipComponent = null;\n        }\n\n        this.tooltipComponent = new Tooltip(element, {\n            tooltipValue     : 'This row will move to its new position when you select another row',\n            popupParent      : this.getPopupParant(),\n            documentElement  : this.optionsHandler.getDocument(),\n            tooltipShowDelay : 0,\n            shouldShowTooltip: () => true,\n            tooltipHideDelay : 3000\n        });\n    }\n\n    private getPopupParant() : HTMLElement {\n        const popupParentElement = this.optionsHandler.getPopupParent();\n        \n        if(popupParentElement) {\n            return popupParentElement;\n        }\n\n        return this.gridController.getGui();\n    }\n\n}\n","import { GridCoreComponent } from \"./Core/GridCoreComponent\";\nimport { IGridAPI } from \"./Interface/IGridAPI\";\nexport { copyAttributesToOptions } from './ComponentUtils';\nimport { IExperimentalAPI } from \"./Interface/IGridExperimentalAPI\";\nimport { GRID_BEAN_NAME } from \"./Core/Constants/BeanName\";\nimport { Context } from \"@dg/corecomponent\";\nimport { IRowAPIManager } from \"./API/RowAPI/Interface/IRowAPI\";\nimport { IColumnAPIManager } from './API/ColumnAPI/Interface/IColumnAPI';\nimport { IFloatingRowAPI } from \"./API/FloatingRowAPI/Interface/IFloatingRowAPI\";\nimport { IReorderableAPI } from \"./API/ReorderableAPI/Interface/IReorderableAPI\";\nimport '@dg/contextmenu/dist/contextMenu.css';\nimport { IGridConfiguration } from \"../Grid/Core/Interface/IGridConfiguration\";\nimport { IUserParams } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text-core-component\";\nimport { ModuleRegistry } from \"./Core/ModuleRegistry\";\nimport {  GridModule } from \"./grid-module\";\nimport { GridFindModule } from \"../find/find-module\";\nimport { ICellAPIManager, UserPresenceAPIType } from \"./Main\";\nimport { ISortApiManager } from \"./API/SortAPI/Interface/ISortApiManager.types\";\nimport { IFilterApiManager } from \"./API/FilterAPI/Interface/IFilterApiManager.types\";\nimport { IRowGroupingApiManager } from \"./API/RowGroupingAPI/Interface/IRowGroupingApiManager.types\";\nimport { INavigationAPI } from \"./API/navigation/navigation-api.types\";\nimport { IColumnSelectionAPI, IRowSelectionAPI } from \"./API/selection/selection-api.types\";\nimport { IPinningAPIManager } from \"./API/PinningAPI/Interface/IPinningAPIManager.types\";\nimport { IRangeSelectionAPI } from \"./API/RangeSelectionAPI/range-selection-api.types\";\nimport { IClipboardApiManager } from \"./API/ClipboardAPI/Interface/IClipboardApiManager.types\";\nimport { GridCellEditorModule } from \"./grid-cell-editor-module\";\nimport { GridCellRendererModule } from \"./grid.cell-renderer-module\";\nimport { ITreeAPIInteracter } from \"./API/TreeAPI/TreeAPIInteracter\";\nimport { LayoutModule } from \"./LayoutModule\";\nimport { GridFindHandler } from \"../find/find-handler\";\nimport { VerticalCalendar } from \"../VerticalCalendar/vertical-calendar\";\nimport type { IColumnGroupAPI } from \"../nested-header/column-group-api.types\";\n\nModuleRegistry.registerModules([GridModule, GridCellEditorModule, GridCellRendererModule, GridFindModule]);\nclass GridMain {\n\tpublic api                : IGridAPI;\n\tpublic experimentalAPI    : IExperimentalAPI;\n\tpublic rowAPI             : IRowAPIManager;\n\tpublic cellAPI            : ICellAPIManager;\n\tpublic columnAPI          : IColumnAPIManager;\n\tpublic columnGroupAPI     : IColumnGroupAPI | null;\n\tpublic rowSelectionAPI    : IRowSelectionAPI;\n\tpublic columnSelectionAPI : IColumnSelectionAPI;\n\tpublic floatingRowAPI     : IFloatingRowAPI;\n\tpublic reorderableAPI     : IReorderableAPI;\n\tpublic sortAPI            : ISortApiManager;\n\tpublic filterAPI          : IFilterApiManager;\n\tpublic rowGroupingAPI     : IRowGroupingApiManager;\n\tpublic navigationAPI      : INavigationAPI;\n\tpublic pinningAPI         : IPinningAPIManager;\n\tpublic rangeSelectionAPI  : IRangeSelectionAPI;\n\tpublic userPresenceAPI    : UserPresenceAPIType;\n\tpublic clipBoardAPI       : IClipboardApiManager;\n\tpublic treeAPI            : ITreeAPIInteracter;\n\tpublic findAPI            : GridFindHandler;\n\tconstructor(gridContainer : HTMLElement, gridOptions : IGridConfiguration, params : IUserParams, getContext : (context : Context) => void = () => {}) {\n\t\tconst setContextAPI = (context : Context) => {\n\t\t\tthis.api                = context.getBean(GRID_BEAN_NAME.GRID_API);\n\t\t\tthis.experimentalAPI   = context.getBean(GRID_BEAN_NAME.GRID_EXPERIMENTAL_API);\n\t\t\tthis.rowAPI             = context.getBean(GRID_BEAN_NAME.ROW_API);\n\t\t\tthis.cellAPI            = context.getBean(GRID_BEAN_NAME.CELL_API);\n\t\t\tthis.columnAPI          = context.getBean(GRID_BEAN_NAME.COLUMN_API);\n\t\t\ttry {\n\t\t\t\tthis.columnGroupAPI = context.getBean(GRID_BEAN_NAME.COLUMN_GROUP_API) as IColumnGroupAPI;\n\t\t\t} catch {\n\t\t\t\tthis.columnGroupAPI = null;\n\t\t\t}\n\t\t\tthis.pinningAPI         = context.getBean(GRID_BEAN_NAME.PINNING_API);\n\t\t\tthis.rowSelectionAPI    = context.getBean('rowSelectionAPI');\n\t\t\tthis.columnSelectionAPI = context.getBean('columnSelectionAPI');\n\t\t\tthis.floatingRowAPI     = context.getBean(GRID_BEAN_NAME.FLOATING_ROW_API);\n\t\t\tthis.reorderableAPI     = context.getBean(GRID_BEAN_NAME.REORDERABLE_API);\n\t\t\tthis.sortAPI            = context.getBean(GRID_BEAN_NAME.SORT_API);\n\t\t\tthis.filterAPI          = context.getBean(GRID_BEAN_NAME.FILTER_API);\n\t\t\tthis.rowGroupingAPI     = context.getBean(GRID_BEAN_NAME.ROW_GROUPING_API);\n\t\t\tthis.navigationAPI      = context.getBean('navigationAPI');\n\t\t\tthis.rangeSelectionAPI  = context.getBean('rangeSelectionAPI');\n\t\t\tthis.userPresenceAPI    = context.getBean('userPresenceAPI');\n\t\t\tthis.clipBoardAPI       = context.getBean('clipBoardAPI');\n\t\t\tthis.treeAPI  \t\t\t= context.getBean(GRID_BEAN_NAME.TREE_API)\n\t\t\tthis.findAPI  \t\t\t= context.getBean('findApi');\n\t\t\tgetContext(context);\n\t\t};\n\t\tnew GridCoreComponent().initializeGrid(gridContainer, gridOptions, 'grid', setContextAPI, params);\n\t}\n\n}\n\n\nexport {\n    GridMain,\n    LayoutModule,\n    VerticalCalendar\n}\n","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IEscapeHandler } from \"../../../../Sub_Components/src/Utilities/EscapeHandler.types\";\nimport { IRowNodeCore } from \"../../../DataStore/rownode.types\";\nimport { CellPositionType } from \"../../Core/Navigation/cell-position.types\";\nimport { HookEventsName } from \"../../Core/Hooks/Constants/HookEventsName\";\n\n\nexport interface IGridCellEditorHandler{\n    startEditing(cellController : any, key ?: string | null, event ?: KeyboardEvent | MouseEvent | null, value ?: any)    : void;\n    stopEditing(cancel ?: boolean, ev ?: KeyboardEvent, shiftKey ?: boolean, suppressNavigation ?: boolean, dataupdate ?: boolean) : boolean;\n    getCellController()                                                                                     : any;\n    getInitialMeta()                                                                                        : any;\n    getCellPosition() : CellPositionType | null;\n    getCachedValue() : any;\n}\n\n@Bean(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER)\nexport class GridCellEditorHandler extends EventEmitter implements IGridCellEditorHandler{\n    @AutoWired(GRID_BEAN_NAME.GRID_ESCAPE_HANDLER) private escapeHandler ! : IEscapeHandler;\n\n    private cellController ! : any;\n    private initialMeta      : any;\n    static  actionID         : string;\n\n    private cachedValue : any = null;\n\n    @PostConstruct()\n    init(){\n        const updateCellDimension = () => {\n            if(this.cellController){\n                this.cellController.updateCellEditorDimensions();\n            }\n        }\n        this.addEventListener(HookEventsName.onAfterRowResize, updateCellDimension);\n        this.addEventListener(HookEventsName.onAfterColumnResize, updateCellDimension);\n    }\n\n    startEditing(cellController: any, key: string | null = null, event: KeyboardEvent | MouseEvent | null = null, value : any = null){\n        if(cellController === this.cellController){\n            return;\n        }\n        this.cachedValue = null;\n        this.stopEditing(false, null, false, true);\n        const actionStopped = cellController.startEditing(key, event, value);\n\n        if(actionStopped) {\n            const columnNode          = cellController.getColumn();\n            const rowNode             = cellController.getRowNode() as IRowNodeCore;\n    \n            this.cellController            = cellController;\n            this.initialMeta = {\n                rowIndex    : rowNode.getIndex(),\n                columnIndex : columnNode.getIndex(),\n                top         : rowNode.getTop(),\n                height      : rowNode.getHeight(),\n                columnId    : columnNode.getID(),\n            }\n            const [cancel, eventArg, shiftKey, suppressNavigation] = [true, null, false, true];\n            GridCellEditorHandler.actionID = this.escapeHandler.addAction(this.stopEditing.bind(this, cancel, eventArg, shiftKey, suppressNavigation));\n        }\n\n       \n    }\n\n    getCellController() {\n        return this.cellController;\n    }\n\n    getInitialMeta() : any {\n        return this.initialMeta;\n    }\n\n    stopEditing(cancel = false, ev : KeyboardEvent = null, shiftKey : boolean = false, suppressNavigation = false, dataupdate : boolean = true) : boolean{\n        if(!this.cellController) {\n            return false;\n        }\n        const {editing, isNewValue, value} = this.cellController?.stopEditing(cancel, ev, shiftKey, suppressNavigation, dataupdate);\n\n        if(!dataupdate) {\n            this.cachedValue = value;\n        }\n         if(editing) {\n            const cellPosition = this.cellController?.getCellPosition();\n            cellPosition && this.dispatchEvent({\n                type : \"EVENT_MIN_SPARE_UPDATE\",\n                cellPosition : cellPosition,\n                isNewValue\n            })\n        }\n        this.cellController = null;\n        this.initialMeta    = null;\n        this.escapeHandler.removeAction(GridCellEditorHandler.actionID);\n       \n        return editing;\n    }\n\n    getCellPosition(): CellPositionType {\n        if(!this.cellController) {\n            return null;\n        }\n        return  this.cellController.getCellPosition();\n    }\n\n    getCachedValue() : any {\n        return this.cachedValue;\n    }\n}","import { Component, PostConstruct } from \"@dg/corecomponent\";\nimport { setFixedHeight, setFixedLeft, setFixedTop, setFixedWidth } from \"../../Core/utils/Dom\";\nimport { GridFloatingEditorController, IFloatiogEditorComponent, IRect } from \"./GridFloatingEditorController\";\n\nexport class GridFloatingEditorComponent extends Component {\n\tstatic getTemplate: () => HTMLElement;\n\n\tconstructor() {\n\t\tsuper(GridFloatingEditorComponent.getTemplate());\n\t}\n\n    @PostConstruct()\n    init() : void {\n        const component  : IFloatiogEditorComponent = {\n            setPosition : (position : IRect) => this.setPosition(position)\n        }\n\n        const controller = this.createManagedBean(new GridFloatingEditorController());\n        controller.setComponent(component);\n    }\n\n    private setPosition(position : IRect) : void {\n        setFixedTop(this.getGui(), position.top);\n        setFixedLeft(this.getGui(), position.left);\n        setFixedWidth(this.getGui(), position.width);\n        setFixedHeight(this.getGui(), position.height);\n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IControllerHandler } from \"../../Core/Interface/IControllerHandler\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\n\nexport interface IFloatiogEditorComponent {\n\tsetPosition(position: IRect): void;\n}\n\nexport interface IRect {\n    top   : number,\n    left  : number,\n    width : number,\n    height: number\n}\nexport class GridFloatingEditorController extends EventEmitter {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n    private component         : IFloatiogEditorComponent;\n\n    setComponent(component : IFloatiogEditorComponent): void {\n        this.component = component;\n        this.registerController();\n    }\n\n    private registerController() : void {\n        const controller = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\n        controller.registerFloatingEditorController(this);\n    }\n\n\n    setPosition(position : IRect) : void {\n        this.component.setPosition(position)\n    }\n\n\n}","import { Component, PostConstruct } from \"@dg/corecomponent\";\nimport { CurrentTimeIndicatorController } from \"./CurrentTimeIndicatorController\";\nimport { ICurrentTimeIndicatorCommunicationHandler } from \"./ICurrentTimeIndicatorCommunicationHandler\";\n\n\n\nexport class CurrentTimeIndicatorComponent extends Component {\n    private controller           : CurrentTimeIndicatorController;\n    static  getTemplate          : () => HTMLElement;\n    private communicationHandler : ICurrentTimeIndicatorCommunicationHandler;\n\n    constructor(communicationHandler: ICurrentTimeIndicatorCommunicationHandler){\n        super();\n        this.setTemplate(CurrentTimeIndicatorComponent.getTemplate());\n        this.communicationHandler = communicationHandler;\n    }\n\n    @PostConstruct()\n    init(): void {\n        const controller = this.createManagedBean(new CurrentTimeIndicatorController());\n        this.controller = controller;\n        this.controller.setComponent(this);\n    }\n\n    appendTo(container: HTMLElement): void {\n        container.appendChild(this.getGui());\n    }\n\n    getCommunicationHandler(): ICurrentTimeIndicatorCommunicationHandler {\n        return this.communicationHandler;\n    }\n\n    appendChild(newChild: Component | HTMLElement, _container?: HTMLElement | undefined, ): void {\n        super.appendChild(newChild, this.getGui());\n    }\n \n    setLeftPosition(left: number): void {\n        this.getGui().style.left = left + 'px';\n    }\n\n    setTopPosition(top: number): void {\n        this.getGui().style.top = top + 'px';\n    }\n\n    hide(): void {\n        this.getGui().style.display = 'none';\n    }\n\n    show(): void {\n        this.getGui().style.display = 'block';\n    }\n  \n    destroy(): void {\n        this.controller.destroy();\n        super.destroy();\n    }\n}\n\n","import { EventEmitter } from \"@dg/corecomponent\";\nimport { CurrentTimeIndicatorComponent } from \"./CurrentTimeIndicatorComponent\";\nimport { DateTime } from 'luxon';\nimport { ICurrentTimeIndicatorCommunicationHandler } from \"./ICurrentTimeIndicatorCommunicationHandler\";\nimport { IRenderer, ITimelineCustomRenderParams } from \"../../../../GanttModelClasses/IGanttConfiguration\";\nimport { GANTT_CLASS_NAMES } from \"../../../Core/Constants/CSSClassNameContants\";\n\ntype IFrequencyUnit = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month';\n\nconst frequencyUnitToMilliseconds: { [key in IFrequencyUnit]: number } = {\n    second : 1000,\n    minute : 60000,\n    hour   : 3600000,\n    day    : 86400000,\n    week   : 604800000,\n    month  : 2592000000,\n};\n\nclass LineRenderer {\n    init(_params: ITimelineCustomRenderParams): void {\n    }\n    getElement(): HTMLElement {\n        const element = document.createElement('div');\n        element.classList.add(GANTT_CLASS_NAMES.GANTT_TIMELINE_INDICATOR_LINE_TODAY);\n        return element;\n    }\n    destroy(): void {\n    }\n}\n\nexport class CurrentTimeIndicatorController extends EventEmitter {\n    private component            : CurrentTimeIndicatorComponent;\n    private intervalId           : number | null = null;\n    private updateFrequencyMs    : number = 60000;                             // Update every minute by default\n    private communicationHandler : ICurrentTimeIndicatorCommunicationHandler;\n    private lineRenderer         : IRenderer;\n    \n    setComponent(component: CurrentTimeIndicatorComponent): void {\n        this.component            = component;\n        this.communicationHandler = component.getCommunicationHandler();\n        this.createIndicatorElements();\n        \n        // Start auto-update immediately with default frequency (minute)\n        this.setUpdateFrequency('minute',3);\n    }\n\n    private createIndicatorElements(): void {\n        // Create the vertical line\n        const lineRendererClass = this.communicationHandler.getCurrentTimeIndicatorRenderer() ?? LineRenderer;\n        this.lineRenderer = new lineRendererClass();\n        const params            = this.createLineRendererParams();\n        this.lineRenderer.init(params);\n        const element = this.lineRenderer.getElement();\n        if(element){\n            this.component.appendChild(element);\n        }\n    }\n\n    private createLineRendererParams(): any {\n        return {\n            parentElement: this.component.getGui(),\n        };\n    }\n\n    setUpdateFrequency(frequencyUnit: IFrequencyUnit, unitCount : number = 1): void {\n        this.updateFrequencyMs = frequencyUnitToMilliseconds[frequencyUnit] * unitCount;\n\n        const now            = DateTime.now();\n        const nextUpdateTime = now.endOf(frequencyUnit).plus({ millisecond: 1 });\n        const difference     = nextUpdateTime.diff(now).as('milliseconds');\n\n        setTimeout(() => {\n        this.component?.show();\n        this.updatePosition();\n        }, 0);\n\n        //temporary settimeout\n        const timer = setTimeout(() => {\n            this.startAutoUpdate();\n            clearTimeout(timer);\n        }, difference);\n    }\n\n    updatePosition(): void {\n        if (!this.component) {\n            return;\n        }\n\n        const now = DateTime.utc().toMillis();\n        const hasReachedLimit = this.communicationHandler.hasReachedLimit(now);\n        if (hasReachedLimit) {\n            this.stopAutoUpdate();\n            this.component.hide();\n            return;\n        }\n        const leftPosition = this.communicationHandler.getLeftPositionByDate(now);\n        const topPosition = this.communicationHandler.getTopPositionByDate(now);\n        \n        leftPosition !== null && this.component.setLeftPosition(leftPosition);\n        topPosition !== null && this.component.setTopPosition(topPosition);\n\n        this.communicationHandler.onCurrentTimeIndicatorUpdate();\n    }\n\n    /**\n     * Starts the auto-update timer\n     */\n    startAutoUpdate(): void {\n        // Clear any existing interval\n        this.stopAutoUpdate();\n\n\n        // Update immediately\n        this.updatePosition();\n\n        // Set up recurring updates\n        this.intervalId = window.setInterval(() => {\n            this.updatePosition();\n        }, this.updateFrequencyMs);\n    }\n\n    /**\n     * Stops the auto-update timer\n     */\n    stopAutoUpdate(): void {\n        if (this.intervalId !== null) {\n            window.clearInterval(this.intervalId);\n            this.intervalId = null;\n        }\n    }\n\n    /**\n     * Manually triggers a position update\n     */\n    refresh(): void {\n        this.updatePosition();\n    }\n\n    /**\n     * Destroys the controller and cleans up resources\n     */\n    destroy(): void {\n        this.stopAutoUpdate();\n        this.lineRenderer?.destroy();\n        this.component = null as any;\n    }\n}\n\n","import { GANTT_CLASS_NAMES } from \"../../../Core/Constants/CSSClassNameContants\";\n\nexport function getCurrentTimeIndicatorTemplate() {\n    return function getTemplate(): HTMLElement {\n        const template = `<div class=\"${GANTT_CLASS_NAMES.GANTT_CURRENT_TIME_INDICATOR}\"></div>`;\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}","import { IDependencyMarkType } from \"../../../../GanttModelClasses/IGanttConfiguration\";\n\n/**\n * Represents a single dependency relationship\n */\nexport interface IDependencyRelation {\n    sourceTaskId: string;\n    targetTaskId: string;\n    connectionType: string; // 'FS', 'SS', 'FF', 'SF'\n    type: IDependencyMarkType; // 'valid', 'invalid', 'critical'\n}\n\n/**\n * Internal storage structure for a dependency entry\n */\ninterface IDependencyEntry {\n    sourceTaskId: string;\n    targetTaskId: string;\n    connectionType: string;\n    type: IDependencyMarkType;\n}\n\n/**\n * Bidirectional Map (BiMap) for efficient dependency management\n * \n * Features:\n * - Forward lookup: sourceTaskId → [dependencies]\n * - Reverse lookup: targetTaskId → [dependencies pointing to it]\n * - O(1) add/remove operations\n * - Efficient CRUD operations\n * - Automatic cleanup\n * \n * Usage:\n * ```typescript\n * const bimap = new DependencyBimap();\n * \n * // Add dependency: Task A depends on Task B\n * bimap.add('A', 'B', 'FS', 'valid');\n * \n * // Find all dependencies FROM Task A\n * const fromA = bimap.getFrom('A'); // [{targetTaskId: 'B', ...}]\n * \n * // Find all dependencies TO Task B\n * const toB = bimap.getTo('B'); // [{sourceTaskId: 'A', ...}]\n * \n * // Remove dependency\n * bimap.remove('A', 'B', 'FS');\n * \n * // Clear all dependencies for a task\n * bimap.removeAllForTask('A');\n * ```\n */\nexport class DependencyBimap {\n    /**\n     * Forward map: sourceTaskId → Set of dependency entries\n     * Used for: Finding dependencies FROM a task\n     */\n    private forwardMap: Map<string, Set<IDependencyEntry>> = new Map();\n\n    /**\n     * Reverse map: targetTaskId → Set of dependency entries\n     * Used for: Finding dependencies TO a task\n     */\n    private reverseMap: Map<string, Set<IDependencyEntry>> = new Map();\n\n    /**\n     * Composite key map for O(1) lookup: \"source-target-connectionType\" → entry\n     * Used for: Fast existence checks and updates\n     */\n    private keyMap: Map<string, IDependencyEntry> = new Map();\n\n    /**\n     * Generate composite key for a dependency\n     */\n    private generateKey(sourceTaskId: string, targetTaskId: string, connectionType: string): string {\n        return `${sourceTaskId}-${targetTaskId}-${connectionType}`;\n    }\n\n    /**\n     * Add a dependency relationship\n     * \n     * @param sourceTaskId - The task that has the dependency\n     * @param targetTaskId - The task being depended upon\n     * @param connectionType - Connection type ('FS', 'SS', 'FF', 'SF')\n     * @param type - Dependency type ('valid', 'invalid', 'critical')\n     * @returns true if added, false if already exists (and updated type if different)\n     */\n    add(\n        sourceTaskId: string,\n        targetTaskId: string,\n        connectionType: string,\n        type: IDependencyMarkType\n    ): boolean {\n        // Prevent self-dependencies\n        if (sourceTaskId === targetTaskId) {\n            console.warn(`Self-dependency detected: ${sourceTaskId} → ${sourceTaskId}. Skipping.`);\n            return false;\n        }\n\n        const key = this.generateKey(sourceTaskId, targetTaskId, connectionType);\n        \n        // Check if already exists\n        const existing = this.keyMap.get(key);\n        if (existing) {\n            // Update type if different\n            if (existing.type !== type) {\n                existing.type = type;\n            }\n            return false;\n        }\n\n        const entry: IDependencyEntry = {\n            sourceTaskId,\n            targetTaskId,\n            connectionType,\n            type\n        };\n\n        // Add to forward map (source → target)\n        if (!this.forwardMap.has(sourceTaskId)) {\n            this.forwardMap.set(sourceTaskId, new Set());\n        }\n        this.forwardMap.get(sourceTaskId)!.add(entry);\n\n        // Add to reverse map (target → source)\n        if (!this.reverseMap.has(targetTaskId)) {\n            this.reverseMap.set(targetTaskId, new Set());\n        }\n        this.reverseMap.get(targetTaskId)!.add(entry);\n\n        // Add to key map for fast lookup\n        this.keyMap.set(key, entry);\n\n        return true;\n    }\n\n    /**\n     * Remove a specific dependency\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @param connectionType - Connection type\n     * @returns true if removed, false if not found\n     */\n    remove(sourceTaskId: string, targetTaskId: string, connectionType: string): boolean {\n        const key = this.generateKey(sourceTaskId, targetTaskId, connectionType);\n        const entry = this.keyMap.get(key);\n\n        if (!entry) {\n            return false;\n        }\n\n        // Remove from forward map\n        const forwardSet = this.forwardMap.get(sourceTaskId);\n        if (forwardSet) {\n            forwardSet.delete(entry);\n            if (forwardSet.size === 0) {\n                this.forwardMap.delete(sourceTaskId);\n            }\n        }\n\n        // Remove from reverse map\n        const reverseSet = this.reverseMap.get(targetTaskId);\n        if (reverseSet) {\n            reverseSet.delete(entry);\n            if (reverseSet.size === 0) {\n                this.reverseMap.delete(targetTaskId);\n            }\n        }\n\n        // Remove from key map\n        this.keyMap.delete(key);\n\n        return true;\n    }\n\n    /**\n     * Remove all dependencies for a specific task (both as source and target)\n     * Useful when a task is deleted\n     * \n     * @param taskId - Task ID to remove all dependencies for\n     * @returns Number of dependencies removed\n     */\n    removeAllForTask(taskId: string): number {\n        let removedCount = 0;\n        const keysToRemove: string[] = [];\n\n        // Remove all dependencies FROM this task\n        const forwardSet = this.forwardMap.get(taskId);\n        if (forwardSet) {\n            forwardSet.forEach(entry => {\n                const key = this.generateKey(entry.sourceTaskId, entry.targetTaskId, entry.connectionType);\n                keysToRemove.push(key);\n            });\n        }\n\n        // Remove all dependencies TO this task\n        const reverseSet = this.reverseMap.get(taskId);\n        if (reverseSet) {\n            reverseSet.forEach(entry => {\n                const key = this.generateKey(entry.sourceTaskId, entry.targetTaskId, entry.connectionType);\n                if (!keysToRemove.includes(key)) {\n                    keysToRemove.push(key);\n                }\n            });\n        }\n\n        // Remove all collected dependencies\n        keysToRemove.forEach(key => {\n            const entry = this.keyMap.get(key);\n            if (entry) {\n                this.remove(entry.sourceTaskId, entry.targetTaskId, entry.connectionType);\n                removedCount++;\n            }\n        });\n\n        return removedCount;\n    }\n\n    /**\n     * Get all dependencies FROM a task (forward lookup)\n     * \n     * @param sourceTaskId - Source task ID\n     * @returns Array of dependency relations\n     */\n    getFrom(sourceTaskId: string): IDependencyRelation[] {\n        const entries = this.forwardMap.get(sourceTaskId);\n        if (!entries) {\n            return [];\n        }\n\n        return Array.from(entries).map(entry => ({\n            sourceTaskId: entry.sourceTaskId,\n            targetTaskId: entry.targetTaskId,\n            connectionType: entry.connectionType,\n            type: entry.type\n        }));\n    }\n\n    /**\n     * Get all dependencies TO a task (reverse lookup)\n     * \n     * @param targetTaskId - Target task ID\n     * @returns Array of dependency relations\n     */\n    getTo(targetTaskId: string): IDependencyRelation[] {\n        const entries = this.reverseMap.get(targetTaskId);\n        if (!entries) {\n            return [];\n        }\n\n        return Array.from(entries).map(entry => ({\n            sourceTaskId: entry.sourceTaskId,\n            targetTaskId: entry.targetTaskId,\n            connectionType: entry.connectionType,\n            type: entry.type\n        }));\n    }\n\n    /**\n     * Get all dependencies involving a task (both FROM and TO)\n     * \n     * @param taskId - Task ID\n     * @returns Object with 'from' and 'to' arrays\n     */\n    getAllForTask(taskId: string): { from: IDependencyRelation[]; to: IDependencyRelation[] } {\n        return {\n            from: this.getFrom(taskId),\n            to: this.getTo(taskId)\n        };\n    }\n\n    /**\n     * Check if a dependency exists\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @param connectionType - Connection type\n     * @returns true if exists\n     */\n    has(sourceTaskId: string, targetTaskId: string, connectionType: string): boolean {\n        const key = this.generateKey(sourceTaskId, targetTaskId, connectionType);\n        return this.keyMap.has(key);\n    }\n\n    /**\n     * Get a specific dependency\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @param connectionType - Connection type\n     * @returns Dependency relation or null\n     */\n    get(sourceTaskId: string, targetTaskId: string, connectionType: string): IDependencyRelation | null {\n        const key = this.generateKey(sourceTaskId, targetTaskId, connectionType);\n        const entry = this.keyMap.get(key);\n        \n        if (!entry) {\n            return null;\n        }\n\n        return {\n            sourceTaskId: entry.sourceTaskId,\n            targetTaskId: entry.targetTaskId,\n            connectionType: entry.connectionType,\n            type: entry.type\n        };\n    }\n\n    /**\n     * Update dependency type\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @param connectionType - Connection type\n     * @param newType - New dependency type\n     * @returns true if updated, false if not found\n     */\n    updateType(\n        sourceTaskId: string,\n        targetTaskId: string,\n        connectionType: string,\n        newType: IDependencyMarkType\n    ): boolean {\n        const key = this.generateKey(sourceTaskId, targetTaskId, connectionType);\n        const entry = this.keyMap.get(key);\n\n        if (!entry) {\n            return false;\n        }\n\n        entry.type = newType;\n        return true;\n    }\n\n    /**\n     * Get all task IDs that have dependencies (as sources)\n     * \n     * @returns Array of task IDs\n     */\n    getAllSourceTaskIds(): string[] {\n        return Array.from(this.forwardMap.keys());\n    }\n\n    /**\n     * Get all task IDs that are depended upon (as targets)\n     * \n     * @returns Array of task IDs\n     */\n    getAllTargetTaskIds(): string[] {\n        return Array.from(this.reverseMap.keys());\n    }\n\n    /**\n     * Get all unique task IDs involved in dependencies\n     * \n     * @returns Set of task IDs\n     */\n    getAllTaskIds(): Set<string> {\n        const taskIds = new Set<string>();\n        this.forwardMap.forEach((_, sourceId) => taskIds.add(sourceId));\n        this.reverseMap.forEach((_, targetId) => taskIds.add(targetId));\n        return taskIds;\n    }\n\n    /**\n     * Get total count of dependencies\n     * \n     * @returns Number of dependencies\n     */\n    size(): number {\n        return this.keyMap.size;\n    }\n\n    /**\n     * Check if bimap is empty\n     * \n     * @returns true if empty\n     */\n    isEmpty(): boolean {\n        return this.keyMap.size === 0;\n    }\n\n    /**\n     * Clear all dependencies\n     */\n    clear(): void {\n        this.forwardMap.clear();\n        this.reverseMap.clear();\n        this.keyMap.clear();\n    }\n\n    /**\n     * Bulk add dependencies from row node dependencies array\n     * Useful for initializing from existing data\n     * \n     * @param sourceTaskId - Source task ID\n     * @param dependencies - Array of dependencies from row node\n     */\n    addFromRowDependencies(\n        sourceTaskId: string,\n        dependencies: Array<{ taskID: string; connectionType: string; type: IDependencyMarkType }>\n    ): void {\n        if (!dependencies || dependencies.length === 0) {\n            return;\n        }\n\n        dependencies.forEach(dep => {\n            this.add(sourceTaskId, dep.taskID, dep.connectionType, dep.type);\n        });\n    }\n\n    /**\n     * Get all dependencies for multiple tasks (batch operation)\n     * Useful for viewport optimization\n     * \n     * @param taskIds - Array of task IDs\n     * @returns Map of taskId → {from: [], to: []}\n     */\n    getBatchForTasks(taskIds: string[]): Map<string, { from: IDependencyRelation[]; to: IDependencyRelation[] }> {\n        const result = new Map<string, { from: IDependencyRelation[]; to: IDependencyRelation[] }>();\n        \n        taskIds.forEach(taskId => {\n            result.set(taskId, this.getAllForTask(taskId));\n        });\n\n        return result;\n    }\n\n    /**\n     * Find all dependencies where source is in sourceTaskIds OR target is in targetTaskIds\n     * Useful for viewport optimization - finding dependencies that touch viewport\n     * \n     * @param sourceTaskIds - Source task IDs to check\n     * @param targetTaskIds - Target task IDs to check (optional, defaults to sourceTaskIds)\n     * @returns Array of all matching dependencies\n     */\n    findDependenciesTouching(\n        sourceTaskIds: Set<string>,\n        targetTaskIds?: Set<string>\n    ): IDependencyRelation[] {\n        const result: IDependencyRelation[] = [];\n        const targetSet = targetTaskIds || sourceTaskIds;\n        const seen = new Set<string>();\n\n        // Find dependencies FROM sourceTaskIds\n        sourceTaskIds.forEach(sourceId => {\n            const fromDeps = this.getFrom(sourceId);\n            fromDeps.forEach(dep => {\n                const key = this.generateKey(dep.sourceTaskId, dep.targetTaskId, dep.connectionType);\n                if (!seen.has(key)) {\n                    seen.add(key);\n                    result.push(dep);\n                }\n            });\n        });\n\n        // Find dependencies TO targetTaskIds\n        targetSet.forEach(targetId => {\n            const toDeps = this.getTo(targetId);\n            toDeps.forEach(dep => {\n                const key = this.generateKey(dep.sourceTaskId, dep.targetTaskId, dep.connectionType);\n                if (!seen.has(key)) {\n                    seen.add(key);\n                    result.push(dep);\n                }\n            });\n        });\n\n        return result;\n    }\n\n    /**\n     * Check for circular dependencies (detects if adding this dependency would create a cycle)\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @returns true if circular dependency detected\n     */\n    hasCircularDependency(sourceTaskId: string, targetTaskId: string): boolean {\n        // Check if target depends on source (directly or indirectly)\n        const visited = new Set<string>();\n        \n        const checkPath = (currentId: string): boolean => {\n            if (visited.has(currentId)) {\n                return false; // Already checked this path\n            }\n            if (currentId === sourceTaskId) {\n                return true; // Found circular path\n            }\n            \n            visited.add(currentId);\n            const deps = this.getFrom(currentId);\n            \n            // Check all dependencies from current task\n            for (const dep of deps) {\n                if (checkPath(dep.targetTaskId)) {\n                    return true;\n                }\n            }\n            \n            return false;\n        };\n        \n        return checkPath(targetTaskId);\n    }\n\n    /**\n     * Remove dependencies that reference non-existent tasks\n     * Useful for cleanup after tasks are deleted\n     * \n     * @param validTaskIds - Set of valid task IDs\n     * @returns Number of dependencies removed\n     */\n    cleanupInvalidDependencies(validTaskIds: Set<string>): number {\n        let removedCount = 0;\n        const keysToRemove: string[] = [];\n\n        this.keyMap.forEach((entry, key) => {\n            if (!validTaskIds.has(entry.sourceTaskId) || !validTaskIds.has(entry.targetTaskId)) {\n                keysToRemove.push(key);\n            }\n        });\n\n        keysToRemove.forEach(key => {\n            const entry = this.keyMap.get(key);\n            if (entry) {\n                this.remove(entry.sourceTaskId, entry.targetTaskId, entry.connectionType);\n                removedCount++;\n            }\n        });\n\n        return removedCount;\n    }\n}\n","import { Component, PostConstruct } from \"@dg/corecomponent\";\nimport { GanttDependencyMarkContainerController } from \"./GanttDependencyMarkContainerController\";\n\nexport class GanttDependencyMarkContainerComponent extends Component {\n    static getTemplate :() => HTMLElement;\n    private svgHolder : SVGElement;\n\n    constructor() {\n        super();\n        this.setTemplate(GanttDependencyMarkContainerComponent.getTemplate());\n        this.svgHolder = this.getGui().querySelector('svg') as SVGElement;\n    }\n\n    getSvgHolder() : SVGElement {\n        return this.svgHolder;\n    }\n\n    appendChild(newChild: Component | HTMLElement, _container?: HTMLElement | undefined, ): void {\n        super.appendChild(newChild, this.getGui());\n    }\n\n    @PostConstruct()\n    postConstruct() {\n        const IndicatorHolderController = this.createManagedBean(new GanttDependencyMarkContainerController());\n        IndicatorHolderController.setUpComponent(this);\n    }\n\n    setLeftPosition(left : number) : void {\n        this.getGui().style.left = left + 'px';\n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GanttDependencyMarkContainerComponent } from \"./GanttDependencyMarkContainerComponent\";\nimport { Events } from \"../../../Core/Constants/Events\";\nimport { ColumnVisibleHandler } from \"../../../Core/Columns/column-visible-handler\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { convertPathIntoCurvyPath, DependencyMarkMeta, findPath, IDependencyMarkPath, pathRenderingMetaPoint } from \"./dependencyMarkUtil\";\nimport { RowRenderController } from \"../../../Core/Rows/RowRenderController\";\nimport { RecordHandler } from \"../../../Core/Rows/RecordHandler\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\nimport { GANTT_CLASS_NAMES } from \"../../../Core/Constants/CSSClassNameContants\";\nimport { IDependencyMarkType, timestamp } from \"../../../../GanttModelClasses/IGanttConfiguration\";\nimport { IGanttRowNodeCore } from \"../../../../DataStore/gantt-rownode.types\";\nimport { GanttController } from \"../../../../GanttModelClasses/Core/GanttComponent/GanttController\";\nimport { GanttOptionsHandler } from \"../../../../GanttModelClasses/Core/OptionsHandler/GanttOptionsHandler\";\nimport { IGanttDateComputationEngine } from \"../../../../GanttModelClasses/Core/GanttDateComputationEngine/IGanttDateComputationEngine\";\nimport { GANTT_BEAN_NAME } from \"../../../../GanttModelClasses/Constant/GanttBeanNameConstant\";\nimport { DependencyBimap, IDependencyRelation } from \"./DependencyBimap\";\n\nconst offsetWidth = 55;\nexport class GanttDependencyMarkContainerController extends EventEmitter {\n    @AutoWired(GRID_BEAN_NAME.COLUMN_VISIBLE_HANDLER) columnVisibleHandler : ColumnVisibleHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) rowRenderController   : RowRenderController;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler                : RecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) fieldHandler                  : FieldHandler;\n    // @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n    private ganttOptionHandler : GanttOptionsHandler;\n    private ganttDateComputationEngine : IGanttDateComputationEngine;\n\n\n    static getDependencyMarkClassName(type : IDependencyMarkType) : string {\n        switch(type){\n            case 'invalid':\n                return GANTT_CLASS_NAMES.GANTT_DEPENDENCY_MARK_INVALID;\n            case 'critical':\n                return GANTT_CLASS_NAMES.GANTT_DEPENDENCY_MARK_CRITICAL;\n            default:\n                return GANTT_CLASS_NAMES.GANTT_DEPENDENCY_MARK_VALID;\n        }\n    }\n\n    private component               : GanttDependencyMarkContainerComponent;\n    private dependencyMarkCache     : { [key: string]: SVGGElement } = {};\n    /**\n     * Bidirectional map for efficient dependency management\n     * - Forward lookup: sourceTaskId → [dependencies]\n     * - Reverse lookup: targetTaskId → [dependencies pointing to it]\n     * - Enables efficient viewport optimization and CRUD operations\n     */\n    private dependencyBimap         : DependencyBimap = new DependencyBimap();\n    /**\n     * Flag to prevent race conditions during rebuild\n     */\n    private isRebuilding             : boolean = false;\n    /**\n     * Track previous row viewport to detect if it actually changed\n     * Used to prevent updating dependencies on horizontal scroll\n     */\n    private previousRowViewportStartKey: string = '';\n    private previousRowViewportEndKey  : string = '';\n    \n    public setUpComponent( component: GanttDependencyMarkContainerComponent ): void {\n        this.ganttOptionHandler = GanttController.getGanttBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        this.ganttDateComputationEngine = GanttController.getGanttBeanInstanceByBeanName(GANTT_BEAN_NAME.GANTT_DATE_COMPUTATION_ENGINE);\n        this.component               = component;\n    }\n\n    @PostConstruct()\n    init(): void {\n        this.addEventListeners();\n        // Initial cleanup of invalid dependencies (in case of stale data)\n        // Use requestAnimationFrame instead of setTimeout for faster initialization\n        requestAnimationFrame(() => {\n            this.cleanupInvalidDependencies();\n        });\n    }\n\n    private addEventListeners(): void {\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayedDataChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_DATA_LOADED, this.onRowDataLoaded.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_EXPANDED, (_param: any) => this.onRowDataLoaded(true));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_COLLAPSED, (_param: any) => this.onRowDataLoaded(true));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_CONTAINER_HEIGHT_CHANGED, (_param: any) => this.onRowDataLoaded(true));\n        this.addListener(this.eventHandler, \"onAfterDataUpdate\", this.onAfterDataUpdate.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_VIEWPORT_CHANGED, this.onViewportChanged.bind(this));\n        \n        // Listen to dependency CRUD events\n        this.addListener(this.eventHandler, Events.EVENT_DEPENDENCY_ADDED, this.onDependencyAdded.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_DEPENDENCY_REMOVED, this.onDependencyRemoved.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_DEPENDENCY_UPDATED, this.onDependencyUpdated.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_DEPENDENCY_TYPE_CHANGED, this.onDependencyTypeChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_TASK_DEPENDENCIES_CLEARED, this.onTaskDependenciesCleared.bind(this));\n\n        // Listen to task bar position changes (drag, resize, schedule)\n        // so dependency lines are recalculated at the new task positions\n        this.addListener(this.eventHandler, Events.EVENT_TASK_BAR_GRAB_ENDED, () => this.invalidateAndRefreshAllMarks());\n        this.addListener(this.eventHandler, Events.EVENT_TASK_BAR_RESIZE_ENDED, () => this.invalidateAndRefreshAllMarks());\n        this.addListener(this.eventHandler, Events.EVENT_TASK_BAR_SCHEDULE_ENDED, () => this.invalidateAndRefreshAllMarks());\n\n        // Listen to API-driven task position changes (date updates via taskApi)\n        this.addListener(this.eventHandler, Events.EVENT_TASK_POSITIONS_CHANGED, () => this.updateViewportDependencies());\n    }\n\n    /**\n     * Clear all cached dependency marks and re-render at current positions.\n     * Called when task positions change (drag/resize/schedule) since the\n     * cached SVG paths contain stale coordinates.\n     */\n    private invalidateAndRefreshAllMarks(): void {\n        Object.keys(this.dependencyMarkCache).forEach(key => {\n            const element = this.dependencyMarkCache[key];\n            if (element && element.parentNode) {\n                element.parentNode.removeChild(element);\n            }\n        });\n        this.dependencyMarkCache = {};\n        this.updateViewportDependencies();\n    }\n\n    /**\n     * Remove cached dependency marks that involve a specific task,\n     * so they are re-created with fresh coordinates on the next render pass.\n     */\n    private invalidateMarksForTask(taskId: string): void {\n        const keysToRemove: string[] = [];\n        Object.keys(this.dependencyMarkCache).forEach(key => {\n            if (key.startsWith(`${taskId}-`) || key.includes(`-${taskId}-`)) {\n                keysToRemove.push(key);\n            }\n        });\n        keysToRemove.forEach(key => {\n            const element = this.dependencyMarkCache[key];\n            if (element && element.parentNode) {\n                element.parentNode.removeChild(element);\n            }\n            delete this.dependencyMarkCache[key];\n        });\n    }\n\n    /**\n     * Handle data updates - sync bimap for changed rows\n     */\n    private onAfterDataUpdate(params?: any): void {\n        if (params && params.payload && params.payload.rowData) {\n            const rowId = params.payload.rowData.taskID || params.payload.rowData.id;\n            if (rowId) {\n                this.syncBimapForRow(rowId);\n                // Invalidate cached marks so they pick up new positions/dates\n                this.invalidateMarksForTask(rowId);\n            }\n        }\n        this.updateViewportDependencies();\n    }\n\n    /**\n     * Handle dependency added event\n     */\n    private onDependencyAdded(params: {\n        sourceTaskId: string;\n        targetTaskId: string;\n        connectionType: string;\n        type?: IDependencyMarkType;\n    }): void {\n        this.addDependency(\n            params.sourceTaskId,\n            params.targetTaskId,\n            params.connectionType,\n            params.type || 'valid'\n        );\n    }\n\n    /**\n     * Handle dependency removed event\n     */\n    private onDependencyRemoved(params: {\n        sourceTaskId: string;\n        targetTaskId: string;\n        connectionType: string;\n    }): void {\n        this.removeDependency(\n            params.sourceTaskId,\n            params.targetTaskId,\n            params.connectionType\n        );\n    }\n\n    /**\n     * Handle dependency updated event (general update)\n     */\n    private onDependencyUpdated(params: {\n        sourceTaskId: string;\n        targetTaskId: string;\n        connectionType: string;\n        type?: IDependencyMarkType;\n    }): void {\n        // Sync bimap for source row\n        this.syncBimapForRow(params.sourceTaskId);\n        // Update viewport\n        this.updateViewportDependencies();\n    }\n\n    /**\n     * Handle dependency type changed event\n     */\n    private onDependencyTypeChanged(params: {\n        sourceTaskId: string;\n        targetTaskId: string;\n        connectionType: string;\n        newType: IDependencyMarkType;\n    }): void {\n        this.updateDependencyType(\n            params.sourceTaskId,\n            params.targetTaskId,\n            params.connectionType,\n            params.newType\n        );\n    }\n\n    /**\n     * Handle task dependencies cleared event (when task is deleted)\n     */\n    private onTaskDependenciesCleared(params: {\n        taskId: string;\n    }): void {\n        this.removeAllDependenciesForTask(params.taskId);\n    }\n\n    private updateRows(rowNodes: IGanttRowNodeCore[]) : void {\n        const middleHandler  = this.recordHandler.getMiddleHandler();\n        const milestoneWidth = this.ganttOptionHandler.getMilestoneWidth();\n        const isAllDayFillMode = this.ganttOptionHandler.isAllDayFillMode();\n        rowNodes.forEach(rowNode => {\n            if(!rowNode){\n                return \n            }\n            const isLoaded = rowNode.isLoaded();\n            const isHidden = middleHandler.isRowHidden(rowNode.getIndex());\n            if(!isLoaded || isHidden){\n                return;\n            }\n            \n            // Validate row has valid position (might not be positioned yet during scroll)\n            const rowTop = rowNode.getTop();\n            if (rowTop === undefined || rowTop === null || isNaN(rowTop) || rowTop < 0) {\n                // Row not positioned yet, but still process dependencies\n                // They will be positioned correctly when rendered\n                // Don't skip - let the rendering handle invalid positions\n            }\n            const rowId         = rowNode.getId();\n            const startDate     = rowNode.getStartDate() as timestamp;\n            const endDate       = rowNode.getEndDate() as timestamp;\n            const isMilestone = rowNode.isMilestone();\n\n            let isRootModified = false;\n\n            // invalid if start or end missing\n            if (!startDate || !endDate) {\n                return;\n            }\n\n            // milestone allows same start & end, but not start > end\n            if (isMilestone && startDate > endDate) {\n                return;\n            }\n\n            if(!isMilestone && !isAllDayFillMode){\n                if(startDate > endDate){\n                    return;\n                }\n            }else if(isAllDayFillMode && !isMilestone){\n                if(startDate > endDate){\n                    return;\n                }\n            }\n\n            const dependencies  = rowNode.getDependencies();\n            const offsetHeight  = rowNode.getHeight() / 2;\n            const rootTopPoint  = rowNode.getTop() + offsetHeight;\n            // const rootStartLeft = this.fieldHandler.getLeftByDate(startDate);\n            // const rootEndLeft   = this.fieldHandler.getRightByDate(endDate);\n            const isEndDatePrioritizedForMilestone = rowNode.isEndDatePrioritizedForMilestone();\n\n            let rootStartLeft,rootEndLeft;\n\n            if(isMilestone){\n                if(isEndDatePrioritizedForMilestone){\n                    rootStartLeft   = this.ganttDateComputationEngine.getRightPositionByDate(endDate);\n                    rootEndLeft = rootStartLeft + (milestoneWidth/2 );\n                }\n                else{\n                    rootStartLeft = this.ganttDateComputationEngine.getLeftPositionByDate(startDate);\n                    rootEndLeft   = rootStartLeft + milestoneWidth;\n                }\n            }\n            else{\n                rootStartLeft = this.ganttDateComputationEngine.getLeftPositionByDate(startDate);\n                rootEndLeft   = this.ganttDateComputationEngine.getRightPositionByDate(endDate);\n            }\n            \n            \n\n            dependencies?.forEach(dependency => {\n                const dependentTaskId    = dependency.taskID;\n                const relationType       = dependency.connectionType;\n                \n                // Validate target task exists before adding to bimap\n                const dependentTaskNode  = this.recordHandler.getRowNodeById(dependentTaskId) as IGanttRowNodeCore;\n                if( dependentTaskNode && dependentTaskNode.hasTask() ) {\n                    // Add to bimap (validated dependency)\n                    this.dependencyBimap.add(rowId, dependentTaskId, relationType, dependency.type);\n\n                    // Validate dependent task has valid position\n                    const dependentTop = dependentTaskNode.getTop();\n                    if (dependentTop === undefined || dependentTop === null || isNaN(dependentTop) || dependentTop < 0) {\n                        // Dependent task not positioned yet, but still process dependency\n                        // It will be positioned correctly when rendered\n                        // Don't skip - let the rendering handle invalid positions\n                    }\n\n                    const dependentStartDate = dependentTaskNode.getStartDate() as timestamp;\n                    const dependentEndDate   = dependentTaskNode.getEndDate() as timestamp;\n\n                    const isDependentMilestone = dependentTaskNode.isMilestone();\n                   \n\n                    if (!dependentStartDate || !dependentEndDate) {\n                        return;\n                    }\n        \n                    if (isDependentMilestone && dependentStartDate > dependentEndDate) {\n                        return;\n                    }\n        \n                    if(!isDependentMilestone && !isAllDayFillMode){\n                        if(dependentStartDate > dependentEndDate){\n                            return;\n                        }\n                    }else if(isAllDayFillMode && !isDependentMilestone){\n                        if(dependentStartDate > dependentEndDate){\n                            return;\n                        }\n                    }\n                    const dependentTopPoint  = dependentTaskNode.getTop() + offsetHeight;\n                    // const dependentStartLeft = this.fieldHandler.getLeftByDate(dependentStartDate);\n                    // const dependentEndLeft   = this.fieldHandler.getRightByDate(dependentEndDate);  \n                    \n                    let dependentStartLeft,dependentEndLeft;\n                    if(dependentTaskNode.isMilestone()){\n                        if(dependentTaskNode.isEndDatePrioritizedForMilestone()){\n                            let dependentEndDateLeft;\n                            if(isAllDayFillMode){\n                                dependentEndDateLeft = this.ganttDateComputationEngine.getRightPositionByDate(dependentEndDate,true);\n                            }else{\n                                dependentEndDateLeft = this.ganttDateComputationEngine.getLeftPositionByDate(dependentEndDate);\n                            }\n                            dependentStartLeft = dependentEndDateLeft - (milestoneWidth/2);\n                            dependentEndLeft =  dependentEndDateLeft  + (milestoneWidth/2)\n\n                        }\n                        else{\n                            dependentStartLeft = this.ganttDateComputationEngine.getLeftPositionByDate(dependentStartDate);\n                            dependentEndLeft   = dependentStartLeft + milestoneWidth;\n                        }\n                    }\n                    else{\n                        dependentStartLeft = this.ganttDateComputationEngine.getLeftPositionByDate(dependentStartDate);\n                        dependentEndLeft   = this.ganttDateComputationEngine.getRightPositionByDate(dependentEndDate);\n                    }\n\n                    if(isMilestone && !isRootModified){\n                        rootStartLeft = relationType.endsWith('S') ? rootStartLeft - (milestoneWidth/2) : rootStartLeft\n                        isRootModified = true;\n                        // rootStartLeft = relationType == 'SS' ? rootStartLeft - (milestoneWidth/2) : rootStartLeft\n                        // rootStartLeft = relationType == 'SF' ? rootStartLeft + milestoneWidth : rootStartLeft\n                        // rootEndLeft = relationType == 'SF' ? rootEndLeft + (milestoneWidth/2) + 3 : rootEndLeft\n                    }\n\n                    if(isAllDayFillMode && isDependentMilestone){\n                        // dependentEndLeft = relationType.startsWith('F') ? (dependentStartLeft + (milestoneWidth/2)) +  (milestoneWidth) : dependentEndLeft\n                        // dependentStartLeft = relationType.startsWith('S') ? dependentStartLeft  + (milestoneWidth) : dependentStartLeft\n                    }\n\n                    \n                    const rootMarkPoint : DependencyMarkMeta = {\n                        x             : relationType.endsWith('S') ? rootStartLeft : rootEndLeft,\n                        y             : rootTopPoint,\n                        pointPosition : relationType.endsWith('S') ? 'start' : 'end',\n                        taskID        : rowId,\n                    }\n                    \n                    const dependentMarkPoint : DependencyMarkMeta = {\n                        x             : relationType.startsWith('F') ? dependentEndLeft : dependentStartLeft,\n                        y             : dependentTopPoint,\n                        pointPosition : relationType.startsWith('F') ? 'end' : 'start',\n                        taskID        : dependentTaskId,\n                    }\n\n                    const pathClassName = GanttDependencyMarkContainerController.getDependencyMarkClassName(dependency.type);\n                    this.addDependencyMark(dependentMarkPoint, rootMarkPoint, dependency.type, offsetHeight, pathClassName);\n                }\n            })\n        });\n    }\n\n    private onRowDataLoaded(resetDependencyMarks: boolean = false): void {\n        if(resetDependencyMarks){\n            this.dependencyMarkCache = {};\n            this.component.getSvgHolder().textContent = '';\n            // Rebuild bimap from all row data\n            this.rebuildDependencyBimap();\n            \n            // For initial load, render dependencies immediately without waiting for bimap\n            // This ensures dependencies appear right away, even if bimap is still building\n            // The bimap will be used for subsequent updates\n            requestAnimationFrame(() => {\n                this.updateViewportDependencies();\n            });\n        } else {\n            // Cleanup invalid dependencies on regular updates\n            this.cleanupInvalidDependencies();\n            // Update viewport for non-reset updates\n            this.updateViewportDependencies();\n        }\n    }\n\n    private onViewportChanged(): void {\n        // Only update dependencies if row viewport actually changed (vertical scroll)\n        // Ignore horizontal scroll (column viewport changes)\n        \n        const currentViewportStart = this.rowRenderController.getViewportStart();\n        const currentViewportEnd   = this.rowRenderController.getViewportEnd();\n        \n        // Check if row viewport actually changed\n        // Compare rowIndex and parentKeys to detect vertical scroll\n        const currentStartKey = `${currentViewportStart.rowIndex}-${currentViewportStart.parentKeys?.join(',') || ''}`;\n        const currentEndKey = `${currentViewportEnd.rowIndex}-${currentViewportEnd.parentKeys?.join(',') || ''}`;\n        \n        const rowViewportChanged = \n            currentStartKey !== this.previousRowViewportStartKey ||\n            currentEndKey !== this.previousRowViewportEndKey;\n        \n        if (rowViewportChanged) {\n            // Update previous viewport state BEFORE updating dependencies\n            // This prevents multiple updates if updateViewportDependencies triggers another viewport change\n            this.previousRowViewportStartKey = currentStartKey;\n            this.previousRowViewportEndKey   = currentEndKey;\n            \n            // Update dependencies when row viewport changes (vertical scroll)\n            // Call directly for faster updates (no requestAnimationFrame delay)\n            // The updateViewportDependencies method already handles timing internally\n            this.updateViewportDependencies();\n        }\n        // If row viewport didn't change, it was likely a horizontal scroll (column change)\n        // Don't update dependencies in that case\n    }\n\n    /**\n     * Rebuild the dependency bimap from all row nodes\n     * Uses incremental build for large datasets to avoid blocking UI\n     * Called when data is reset or loaded\n     */\n    private rebuildDependencyBimap(): void {\n        if (this.isRebuilding) {\n            // Prevent concurrent rebuilds\n            return;\n        }\n\n        this.isRebuilding = true;\n        this.dependencyBimap.clear();\n        \n        const allRowNodes = this.recordHandler.getAllRowNodes() as unknown as IGanttRowNodeCore[];\n        const totalRows = allRowNodes.length;\n        \n        // For large datasets, use incremental build\n        if (totalRows > 1000) {\n            this.rebuildDependencyBimapIncremental(allRowNodes);\n        } else {\n            // For smaller datasets, build synchronously\n            this.rebuildDependencyBimapSync(allRowNodes);\n            this.isRebuilding = false;\n            // Note: updateViewportDependencies is called from onRowDataLoaded\n            // to ensure it happens even if rebuild completes before onRowDataLoaded finishes\n        }\n    }\n\n    /**\n     * Synchronous rebuild for smaller datasets\n     */\n    private rebuildDependencyBimapSync(allRowNodes: IGanttRowNodeCore[]): void {\n        allRowNodes.forEach(rowNode => {\n            if (!rowNode || !rowNode.isLoaded()) {\n                return;\n            }\n            \n            const dependencies = rowNode.getDependencies();\n            if (!dependencies || dependencies.length === 0) {\n                return;\n            }\n\n            const sourceTaskId = rowNode.getId();\n            dependencies.forEach(dep => {\n                // Validate target exists before adding\n                const targetNode = this.recordHandler.getRowNodeById(dep.taskID) as IGanttRowNodeCore;\n                if (targetNode && targetNode.hasTask()) {\n                    this.dependencyBimap.add(sourceTaskId, dep.taskID, dep.connectionType, dep.type);\n                }\n            });\n        });\n    }\n\n    /**\n     * Incremental rebuild for large datasets (prevents UI blocking)\n     */\n    private rebuildDependencyBimapIncremental(allRowNodes: IGanttRowNodeCore[]): void {\n        const chunkSize = 100;\n        let index = 0;\n        \n        const processChunk = () => {\n            const end = Math.min(index + chunkSize, allRowNodes.length);\n            \n            for (let i = index; i < end; i++) {\n                const rowNode = allRowNodes[i];\n                if (!rowNode || !rowNode.isLoaded()) {\n                    continue;\n                }\n                \n                const dependencies = rowNode.getDependencies();\n                if (!dependencies || dependencies.length === 0) {\n                    continue;\n                }\n\n                const sourceTaskId = rowNode.getId();\n                dependencies.forEach(dep => {\n                    // Validate target exists before adding\n                    const targetNode = this.recordHandler.getRowNodeById(dep.taskID) as IGanttRowNodeCore;\n                    if (targetNode && targetNode.hasTask()) {\n                        this.dependencyBimap.add(sourceTaskId, dep.taskID, dep.connectionType, dep.type);\n                    }\n                });\n            }\n            \n            index = end;\n            \n            if (index < allRowNodes.length) {\n                // Continue processing next chunk\n                requestAnimationFrame(processChunk);\n            } else {\n                // Finished rebuilding\n                this.isRebuilding = false;\n                // Note: updateViewportDependencies is called from onRowDataLoaded\n                // The initial call happens immediately, and this ensures bimap is ready for subsequent updates\n            }\n        };\n        \n        processChunk();\n    }\n\n    /**\n     * Sync bimap for a specific row with its current dependencies\n     * Removes dependencies that no longer exist, adds new ones\n     * \n     * @param rowId - Row ID to sync\n     */\n    private syncBimapForRow(rowId: string): void {\n        const rowNode = this.recordHandler.getRowNodeById(rowId) as IGanttRowNodeCore;\n        if (!rowNode || !rowNode.isLoaded()) {\n            return;\n        }\n\n        const currentDeps = rowNode.getDependencies() || [];\n        const bimapDeps = this.dependencyBimap.getFrom(rowId);\n        \n        // Create a map of current dependencies for quick lookup\n        const currentDepMap = new Map<string, { taskID: string; connectionType: string; type: IDependencyMarkType }>();\n        currentDeps.forEach(dep => {\n            const key = `${dep.taskID}-${dep.connectionType}`;\n            currentDepMap.set(key, dep);\n        });\n        \n        // Remove dependencies that no longer exist in row data\n        bimapDeps.forEach(bimapDep => {\n            const key = `${bimapDep.targetTaskId}-${bimapDep.connectionType}`;\n            if (!currentDepMap.has(key)) {\n                // Dependency removed from row data, remove from bimap\n                this.dependencyBimap.remove(rowId, bimapDep.targetTaskId, bimapDep.connectionType);\n            }\n        });\n        \n        // Add/update dependencies that exist in row data\n        currentDeps.forEach(dep => {\n            // Validate target exists\n            const targetNode = this.recordHandler.getRowNodeById(dep.taskID) as IGanttRowNodeCore;\n            if (targetNode && targetNode.hasTask()) {\n                this.dependencyBimap.add(rowId, dep.taskID, dep.connectionType, dep.type);\n            }\n        });\n    }\n\n    /**\n     * Cleanup invalid dependencies (references to non-existent tasks)\n     * Called periodically or when tasks are deleted\n     */\n    private cleanupInvalidDependencies(): void {\n        const allRowNodes = this.recordHandler.getAllRowNodes() as unknown as IGanttRowNodeCore[];\n        const validTaskIds = new Set<string>();\n        \n        allRowNodes.forEach(rowNode => {\n            if (rowNode && rowNode.isLoaded() && rowNode.hasTask()) {\n                validTaskIds.add(rowNode.getId());\n            }\n        });\n        \n        const removedCount = this.dependencyBimap.cleanupInvalidDependencies(validTaskIds);\n        if (removedCount > 0) {\n            console.log(`Cleaned up ${removedCount} invalid dependencies`);\n        }\n    }\n\n    /**\n     * Optimized method to update dependencies only for visible viewport rows.\n     * \n     * PERFORMANCE OPTIMIZATION WITH BIMAP:\n     * Uses DependencyBimap for efficient bidirectional lookups:\n     * - Processes dependencies FROM viewport rows (source in viewport)\n     * - Processes dependencies TO viewport rows (target in viewport, source can be outside)\n     * - Only renders dependencies that touch the viewport\n     * - Dramatically reduces DOM operations for large datasets\n     * \n     * How it works:\n     * 1. Gets viewport rows using getViewportStart()/getViewportEnd()\n     * 2. Uses bimap.findDependenciesTouching() to find ALL dependencies that touch viewport:\n     *    - Dependencies FROM viewport rows (even if target is outside)\n     *    - Dependencies TO viewport rows (even if source is outside) ← NEW!\n     * 3. Removes dependencies that are completely outside viewport\n     * 4. Updates on vertical scroll (row viewport change) only, NOT on horizontal scroll\n     */\n    private updateViewportDependencies(): void {\n        const viewportStart = this.rowRenderController.getViewportStart();\n        const viewportEnd   = this.rowRenderController.getViewportEnd();\n        // Type assertion: Gantt row nodes implement IGanttRowNodeCore interface\n        // This is safe because we're in a Gantt context where all rows are Gantt rows\n        if(viewportStart.rowIndex === -1 || viewportEnd.rowIndex === -1){\n            return;\n        }\n        const viewportRowNodes = this.recordHandler.getSequenceRowNodes(viewportStart, viewportEnd) as unknown as IGanttRowNodeCore[];\n        \n        // Create set of viewport task IDs for efficient lookup\n        const viewportTaskIds = new Set<string>();\n        viewportRowNodes.forEach(rowNode => {\n            if (rowNode && rowNode.isLoaded()) {\n                viewportTaskIds.add(rowNode.getId());\n            }\n        });\n        \n        // Use bimap to find ALL dependencies touching viewport (both FROM and TO)\n        // If bimap is still building or empty, we'll fall back to processing viewport rows directly\n        // This ensures dependencies render immediately even if bimap isn't ready\n        const dependenciesTouchingViewport = (!this.isRebuilding && this.dependencyBimap.size() > 0)\n            ? this.dependencyBimap.findDependenciesTouching(viewportTaskIds)\n            : [];\n        \n        \n        // Process all dependencies touching viewport FIRST (before cleanup)\n        // Need to get row nodes for both source and target (they might be outside viewport)\n        const allTaskIdsInvolved = new Set<string>();\n        dependenciesTouchingViewport.forEach(dep => {\n            allTaskIdsInvolved.add(dep.sourceTaskId);\n            allTaskIdsInvolved.add(dep.targetTaskId);\n        });\n        \n        // Get row nodes for all involved tasks\n        const rowNodesToProcess: IGanttRowNodeCore[] = [];\n        allTaskIdsInvolved.forEach(taskId => {\n            const rowNode = this.recordHandler.getRowNodeById(taskId) as IGanttRowNodeCore;\n            if (rowNode && rowNode.isLoaded()) {\n                rowNodesToProcess.push(rowNode);\n            }\n        });\n        \n        // Update rows FIRST to render dependencies\n        // Process ALL rows involved in dependencies (both viewport and outside viewport)\n        // This ensures dependencies TO viewport rows are also rendered\n        const allRowsToProcess = new Map<string, IGanttRowNodeCore>();\n        \n        // Add viewport rows\n        viewportRowNodes.forEach(rowNode => {\n            if (rowNode && rowNode.isLoaded()) {\n                allRowsToProcess.set(rowNode.getId(), rowNode);\n            }\n        });\n        \n        // Add rows involved in dependencies (source rows for dependencies TO viewport)\n        rowNodesToProcess.forEach(rowNode => {\n            if (rowNode && rowNode.isLoaded()) {\n                allRowsToProcess.set(rowNode.getId(), rowNode);\n            }\n        });\n        \n        // Process all rows FIRST - this will add dependencies to DOM and cache\n        if (allRowsToProcess.size > 0) {\n            this.updateRows(Array.from(allRowsToProcess.values()));\n        }\n        \n        // Collect visible dependency keys from ACTUAL ROW DATA (the source of truth).\n        // The bimap is used above only to discover which rows to process, but the\n        // authoritative set of \"what should remain visible\" comes from row data.\n        // Using bimap entries here would keep stale marks alive after dependency removal.\n        const visibleDependencyKeys = new Set<string>();\n        \n        viewportRowNodes.forEach(rowNode => {\n            if (!rowNode || !rowNode.isLoaded()) return;\n            if (!this.isTaskRenderable(rowNode)) return;\n            const dependencies = rowNode.getDependencies();\n            if (!dependencies) return;\n            \n            dependencies.forEach(dep => {\n                const targetNode = this.recordHandler.getRowNodeById(dep.taskID) as IGanttRowNodeCore;\n                if (!targetNode || !targetNode.isLoaded()) return;\n                if (!this.isTaskRenderable(targetNode)) return;\n                \n                // Use consistent key generation\n                const key = this.generateDependencyKey(rowNode.getId(), dep.taskID, dep.connectionType);\n                visibleDependencyKeys.add(key);\n            });\n        });\n        \n        // Also collect keys from rows we just processed (to catch any dependencies that were rendered)\n        // This is a safety net to ensure we don't remove dependencies that were just added\n        Array.from(allRowsToProcess.values()).forEach(rowNode => {\n            if (!rowNode || !rowNode.isLoaded()) return;\n            if (!this.isTaskRenderable(rowNode)) return;\n            const dependencies = rowNode.getDependencies();\n            if (!dependencies) return;\n            \n            dependencies.forEach(dep => {\n                const targetNode = this.recordHandler.getRowNodeById(dep.taskID) as IGanttRowNodeCore;\n                if (!targetNode || !targetNode.isLoaded()) return;\n                if (!this.isTaskRenderable(targetNode)) return;\n                \n                // Use consistent key generation\n                const key = this.generateDependencyKey(rowNode.getId(), dep.taskID, dep.connectionType);\n                visibleDependencyKeys.add(key);\n            });\n        });\n        \n        // Cleanup: Remove dependencies that are no longer visible\n        // (both source and target are outside viewport)\n        const keysToRemove: string[] = [];\n        Object.keys(this.dependencyMarkCache).forEach(key => {\n            if(!visibleDependencyKeys.has(key)){\n                keysToRemove.push(key);\n            }\n        });\n        \n        // Remove from DOM and cache\n        keysToRemove.forEach(key => {\n            const element = this.dependencyMarkCache[key];\n            if(element && element.parentNode){\n                element.parentNode.removeChild(element);\n            }\n            delete this.dependencyMarkCache[key];\n        });\n    }\n\n    private onDisplayedDataChanged(): void {\n        // const centerColumns = this.columnVisibleHandler.getCenterColumns();\n    }\n\n    private createDependencyMark(key : string, startMarkPoint: DependencyMarkMeta, endMarkPoint: DependencyMarkMeta, dependencyType : IDependencyMarkType, offsetHeight ?: number, pathClassName ?: string): void {\n        const svgNamespace = 'http://www.w3.org/2000/svg';\n        const svgHolder    = this.component?.getSvgHolder();\n        \n        // Validate SVG holder exists\n        if (!svgHolder) {\n            console.warn('SVG holder not found, cannot create dependency mark', {\n                component: this.component,\n                key,\n                startTaskId: startMarkPoint.taskID,\n                endTaskId: endMarkPoint.taskID\n            });\n            return;\n        }\n        \n        const gElement     = document.createElementNS(svgNamespace, 'g');\n        const path         = document.createElementNS(svgNamespace, 'path');\n\n        path.setAttribute('d', this.getDependencyMarkPath(startMarkPoint, endMarkPoint, offsetWidth, offsetHeight));        \n        path.setAttribute('fill', 'none');\n        if (pathClassName) {\n            gElement.classList.add(pathClassName);\n        }\n        gElement.appendChild(path);\n\n        const arrowPath = this.createArrow(endMarkPoint);\n        gElement.appendChild(arrowPath);\n\n        // Add to cache BEFORE appending to DOM\n        this.dependencyMarkCache[key] = gElement;\n\n        // Append or prepend to SVG holder\n        try {\n            if(dependencyType === 'critical' || dependencyType === 'invalid'){\n                svgHolder.appendChild(gElement);\n            }else{\n                svgHolder.prepend(gElement);\n            }\n        } catch (error) {\n            console.error('Failed to append/prepend dependency mark to SVG holder', {\n                error,\n                key,\n                dependencyType,\n                svgHolder,\n                gElement\n            });\n            // Remove from cache if append failed\n            delete this.dependencyMarkCache[key];\n        }\n    }\n\n    private createArrow(endMarkPoint: DependencyMarkMeta): SVGPathElement {\n        const svgNamespace = 'http://www.w3.org/2000/svg';\n        const arrowPath = document.createElementNS(svgNamespace, 'path');\n        const arrowSize = 5;\n        let arrowD = '';\n        let arrowX = endMarkPoint.x;\n        let arrowY = endMarkPoint.y;\n\n        if (endMarkPoint.pointPosition === 'start') {\n            // Arrow pointing right (→)\n            arrowD = `M ${arrowX - arrowSize} ${arrowY - arrowSize/2} L ${arrowX - 1} ${arrowY} L ${arrowX - arrowSize} ${arrowY + arrowSize/2} Z`;\n        } else {\n            // Arrow pointing left (←) \n            arrowD = `M ${arrowX + arrowSize} ${arrowY - arrowSize/2} L ${arrowX +1} ${arrowY} L ${arrowX + arrowSize} ${arrowY + arrowSize/2} Z`;\n        }\n\n        arrowPath.setAttribute('d', arrowD);            \n        return arrowPath;\n    }\n\n    private getDependencyMarkPath(startMarkPoint: DependencyMarkMeta, endMarkPoint: DependencyMarkMeta, offsetWidth: number, offsetHeight: number) : string {\n        const drawPoints = findPath(startMarkPoint, endMarkPoint, offsetWidth, offsetHeight);\n        const radius = 5;\n       \n        const curvyPathMeta = convertPathIntoCurvyPath(drawPoints, radius);\n        let path = '';\n        curvyPathMeta.forEach((meta : pathRenderingMetaPoint) => {\n            if(meta.action === 'curveTo'){\n                const points = meta.points;\n                path += ` ${meta.syntax}`;\n                points.forEach((point : IDependencyMarkPath) => {\n                    path += ` ${point.x},${point.y}`;\n                });\n            }\n            else{\n                path += ` ${meta.syntax} ${meta.x},${meta.y}`;\n            }\n        });\n        return path;\n    }\n\n    getComponent(): GanttDependencyMarkContainerComponent {\n        return this.component;\n    }\n\n    /**\n     * Check whether a task node has valid dates for rendering a task bar.\n     * Mirrors the same checks in updateRows() so that visibleDependencyKeys\n     * stays in sync with what updateRows() will actually render.\n     */\n    private isTaskRenderable(rowNode: IGanttRowNodeCore): boolean {\n        const startDate = rowNode.getStartDate() as timestamp;\n        const endDate   = rowNode.getEndDate() as timestamp;\n        if (!startDate || !endDate) return false;\n\n        const isMilestone      = rowNode.isMilestone();\n        const isAllDayFillMode = this.ganttOptionHandler.isAllDayFillMode();\n\n        if (isMilestone && startDate > endDate) return false;\n        if (!isMilestone && !isAllDayFillMode && startDate > endDate) return false;\n        if (isAllDayFillMode && !isMilestone && startDate > endDate) return false;\n\n        return true;\n    }\n\n    /**\n     * Generate dependency key consistently\n     * This ensures keys match between addDependencyMark and updateViewportDependencies\n     * \n     * @param sourceTaskId - Source task ID (root)\n     * @param targetTaskId - Target task ID (dependent)\n     * @param connectionType - Connection type ('FS', 'SS', 'FF', 'SF')\n     * @returns Dependency key string\n     */\n    private generateDependencyKey(sourceTaskId: string, targetTaskId: string, connectionType: string): string {\n        // Calculate pointPosition the same way as in updateRows\n        const rootPointPosition = connectionType.endsWith('S') ? 'start' : 'end';\n        const dependentPointPosition = connectionType.startsWith('F') ? 'end' : 'start';\n        \n        // Generate key the same way as addDependencyMark\n        // Note: addDependencyMark takes (dependentMarkPoint, rootMarkPoint)\n        // So startMarkPoint = dependent, endMarkPoint = root\n        const startRelation = dependentPointPosition == 'start' ? 'S' : 'F';\n        const endRelation   = rootPointPosition == 'start' ? 'S' : 'F';\n        \n        // Key format: targetTaskId-sourceTaskId-startRelation-endRelation\n        return `${targetTaskId}-${sourceTaskId}-${startRelation}-${endRelation}`;\n    }\n\n    addDependencyMark(startMarkPoint: DependencyMarkMeta, endMarkPoint: DependencyMarkMeta, dependencyType : IDependencyMarkType,offsetHeight ?: number, pathClassName ?: string): void {\n        const startRelation = startMarkPoint.pointPosition == 'start' ? 'S' : 'F';\n        const endRelation   = endMarkPoint.pointPosition   == 'start' ? 'S' : 'F';\n\n        const key = `${startMarkPoint.taskID}-${endMarkPoint.taskID}-${startRelation}-${endRelation}`;\n        if(this.hasDependencyMark(key)){\n            this.updateExistingMark(key, startMarkPoint, endMarkPoint, dependencyType, offsetHeight, pathClassName);\n            return;\n        }\n        this.createDependencyMark(key, startMarkPoint, endMarkPoint, dependencyType, offsetHeight, pathClassName);\n    }\n\n    private static readonly DEPENDENCY_TYPE_CLASSES = [\n        GANTT_CLASS_NAMES.GANTT_DEPENDENCY_MARK_VALID,\n        GANTT_CLASS_NAMES.GANTT_DEPENDENCY_MARK_INVALID,\n        GANTT_CLASS_NAMES.GANTT_DEPENDENCY_MARK_CRITICAL,\n    ];\n\n    /**\n     * Update an existing dependency mark's SVG path coordinates, type class,\n     * and DOM order (rendering priority) in place.\n     */\n    private updateExistingMark(key: string, startMarkPoint: DependencyMarkMeta, endMarkPoint: DependencyMarkMeta, dependencyType: IDependencyMarkType, offsetHeight?: number, pathClassName?: string): void {\n        const gElement = this.dependencyMarkCache[key];\n        if (!gElement) return;\n\n        const svgHolder = this.component?.getSvgHolder();\n\n        if (pathClassName) {\n            gElement.classList.remove(...GanttDependencyMarkContainerController.DEPENDENCY_TYPE_CLASSES);\n            gElement.classList.add(pathClassName);\n        }\n\n        // Reorder in SVG so paint priority matches the type:\n        // valid → prepend (painted first, behind), invalid/critical → append (painted last, on top)\n        if (svgHolder && gElement.parentNode === svgHolder) {\n            if (dependencyType === 'critical' || dependencyType === 'invalid') {\n                svgHolder.appendChild(gElement);\n            } else {\n                svgHolder.prepend(gElement);\n            }\n        }\n\n        const paths = gElement.querySelectorAll('path');\n        if (paths.length >= 1) {\n            paths[0].setAttribute('d', this.getDependencyMarkPath(startMarkPoint, endMarkPoint, offsetWidth, offsetHeight));\n        }\n        if (paths.length >= 2) {\n            const arrowSize = 5;\n            const arrowX = endMarkPoint.x;\n            const arrowY = endMarkPoint.y;\n            let arrowD: string;\n            if (endMarkPoint.pointPosition === 'start') {\n                arrowD = `M ${arrowX - arrowSize} ${arrowY - arrowSize/2} L ${arrowX - 1} ${arrowY} L ${arrowX - arrowSize} ${arrowY + arrowSize/2} Z`;\n            } else {\n                arrowD = `M ${arrowX + arrowSize} ${arrowY - arrowSize/2} L ${arrowX + 1} ${arrowY} L ${arrowX + arrowSize} ${arrowY + arrowSize/2} Z`;\n            }\n            paths[1].setAttribute('d', arrowD);\n        }\n    }\n\n    removeDependencyMark(startTaskId: string, endTaskId: string, relationType: string): void {\n        const key = `${startTaskId}-${endTaskId}-${relationType}`;\n        const element = this.dependencyMarkCache[key];\n        if (element && element.parentNode) {\n            element.parentNode.removeChild(element);\n        }\n        delete this.dependencyMarkCache[key];\n    }\n\n    getDependencyMark(key: string): SVGGElement {\n        return this.dependencyMarkCache[key];\n    }\n\n    hasDependencyMark(key: string): boolean {\n        return this.dependencyMarkCache[key] !== undefined;\n    }\n\n    /**\n     * ============================================\n     * CRUD OPERATIONS USING BIMAP\n     * ============================================\n     */\n\n    /**\n     * Add a dependency relationship\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @param connectionType - Connection type ('FS', 'SS', 'FF', 'SF')\n     * @param type - Dependency type ('valid', 'invalid', 'critical')\n     */\n    addDependency(\n        sourceTaskId: string,\n        targetTaskId: string,\n        connectionType: string,\n        type: IDependencyMarkType = 'valid'\n    ): void {\n        // Validate target exists\n        const targetNode = this.recordHandler.getRowNodeById(targetTaskId) as IGanttRowNodeCore;\n        if (!targetNode || !targetNode.hasTask()) {\n            console.warn(`Cannot add dependency: Target task ${targetTaskId} not found`);\n            return;\n        }\n\n        // Check for circular dependency\n        if (this.dependencyBimap.hasCircularDependency(sourceTaskId, targetTaskId)) {\n            console.warn(`Circular dependency detected: ${sourceTaskId} → ${targetTaskId}. Skipping.`);\n            return;\n        }\n\n        const wasAdded = this.dependencyBimap.add(sourceTaskId, targetTaskId, connectionType, type);\n        \n        if (wasAdded) {\n            // Dispatch event for dependency added\n            this.dispatchEvent({\n                type: Events.EVENT_DEPENDENCY_ADDED,\n                sourceTaskId,\n                targetTaskId,\n                connectionType,\n                // type\n            });\n            \n            // Update viewport if either task is visible\n            this.updateViewportDependencies();\n        }\n    }\n\n    /**\n     * Remove a dependency relationship\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @param connectionType - Connection type\n     */\n    removeDependency(\n        sourceTaskId: string,\n        targetTaskId: string,\n        connectionType: string\n    ): void {\n        // Always remove from bimap (may already have been removed by syncBimapForRow)\n        this.dependencyBimap.remove(sourceTaskId, targetTaskId, connectionType);\n        \n        // Always attempt DOM cleanup regardless of bimap state\n        const key = this.generateDependencyKey(sourceTaskId, targetTaskId, connectionType);\n        const element = this.dependencyMarkCache[key];\n        if (element && element.parentNode) {\n            element.parentNode.removeChild(element);\n        }\n        delete this.dependencyMarkCache[key];\n        \n        this.updateViewportDependencies();\n    }\n\n    /**\n     * Remove all dependencies for a task (both as source and target)\n     * Useful when a task is deleted\n     * \n     * @param taskId - Task ID\n     */\n    removeAllDependenciesForTask(taskId: string): void {\n        const removedCount = this.dependencyBimap.removeAllForTask(taskId);\n        \n        if (removedCount > 0) {\n            // Remove all related marks from DOM\n            const keysToRemove: string[] = [];\n            Object.keys(this.dependencyMarkCache).forEach(key => {\n                if (key.startsWith(`${taskId}-`) || key.includes(`-${taskId}-`)) {\n                    keysToRemove.push(key);\n                }\n            });\n            \n            keysToRemove.forEach(key => {\n                const element = this.dependencyMarkCache[key];\n                if (element && element.parentNode) {\n                    element.parentNode.removeChild(element);\n                }\n                delete this.dependencyMarkCache[key];\n            });\n            \n            // Dispatch event for task dependencies cleared\n            this.dispatchEvent({\n                type: Events.EVENT_TASK_DEPENDENCIES_CLEARED,\n                taskId\n            });\n            \n            // Update viewport\n            this.updateViewportDependencies();\n        }\n    }\n\n    /**\n     * Update dependency type\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @param connectionType - Connection type\n     * @param newType - New dependency type\n     */\n    updateDependencyType(\n        sourceTaskId: string,\n        targetTaskId: string,\n        connectionType: string,\n        newType: IDependencyMarkType\n    ): void {\n        const wasUpdated = this.dependencyBimap.updateType(sourceTaskId, targetTaskId, connectionType, newType);\n        \n        if (wasUpdated) {\n            const key = this.generateDependencyKey(sourceTaskId, targetTaskId, connectionType);\n            \n            const oldElement = this.dependencyMarkCache[key];\n            if (oldElement && oldElement.parentNode) {\n                oldElement.parentNode.removeChild(oldElement);\n            }\n            delete this.dependencyMarkCache[key];\n            \n            this.updateViewportDependencies();\n        }\n    }\n\n    /**\n     * Get all dependencies FROM a task\n     * \n     * @param taskId - Task ID\n     * @returns Array of dependency relations\n     */\n    getDependenciesFrom(taskId: string): IDependencyRelation[] {\n        return this.dependencyBimap.getFrom(taskId);\n    }\n\n    /**\n     * Get all dependencies TO a task\n     * \n     * @param taskId - Task ID\n     * @returns Array of dependency relations\n     */\n    getDependenciesTo(taskId: string): IDependencyRelation[] {\n        return this.dependencyBimap.getTo(taskId);\n    }\n\n    /**\n     * Get all dependencies for a task (both FROM and TO)\n     * \n     * @param taskId - Task ID\n     * @returns Object with 'from' and 'to' arrays\n     */\n    getAllDependenciesForTask(taskId: string): { from: IDependencyRelation[]; to: IDependencyRelation[] } {\n        return this.dependencyBimap.getAllForTask(taskId);\n    }\n\n    /**\n     * Check if a dependency exists\n     * \n     * @param sourceTaskId - Source task ID\n     * @param targetTaskId - Target task ID\n     * @param connectionType - Connection type\n     * @returns true if exists\n     */\n    hasDependency(sourceTaskId: string, targetTaskId: string, connectionType: string): boolean {\n        return this.dependencyBimap.has(sourceTaskId, targetTaskId, connectionType);\n    }\n\n    /**\n     * Get the bimap instance (for advanced operations)\n     * \n     * @returns DependencyBimap instance\n     */\n    getBimap(): DependencyBimap {\n        return this.dependencyBimap;\n    }\n}","export type TaskPosition = 'start' | 'end';\n\n\nexport interface DependencyMarkMeta extends IDependencyMarkPath {\n    pointPosition : TaskPosition,\n    taskID        : string,\n}\n\nexport interface pathRenderingMetaPoint extends Partial<IDependencyMarkPath> {\n    action : 'moveTo' | 'lineTo' | 'curveTo',\n    syntax : 'M' | 'L' | 'C',\n    points ?: IDependencyMarkPath[],\n}\n\nexport interface IDependencyMarkPath {\n    x : number,\n    y : number,\n}\n\n\nfunction equalizeX(x2 : number, initialY : number, predecessorPosition : TaskPosition, offsetWidth : number, currentPath : IDependencyMarkPath, drawPoints : IDependencyMarkPath[]) : void {\n    const x1     = currentPath.x;\n    if( (initialY == currentPath.y) && ((predecessorPosition == 'start' && x1 < x2) || (predecessorPosition == 'end' && x1 > x2))){\n        const direction = predecessorPosition == 'start' ? -1 : 1;\n        currentPath.x = x1 + (offsetWidth * direction);\n    }\n    else {\n        currentPath.x = x2\n    }\n    drawPoints.push({x : currentPath.x, y : currentPath.y});\n}\n\n\nfunction equalizeY(x2 : number, y2 : number, _predecessorPosition : TaskPosition, successorMarkPoint : DependencyMarkMeta, offsetHeight : number, currentPath : IDependencyMarkPath, drawPoints : IDependencyMarkPath[],_offsetWidth : number) : void {\n    const x1 = currentPath.x;\n    const y1 = currentPath.y;\n    // const otherConditionForFullY = (predecessorPosition == 'start' && x1 < x2) || (predecessorPosition == 'end' && x1 > x2);\n    const conditionForFullY = (successorMarkPoint.pointPosition == 'start' && x1 < x2) || (successorMarkPoint.pointPosition == 'end' && x1 > x2);\n    \n    // const otherCondition = Math.abs(currentPath.x-x2) > offsetWidth ;\n\n   \n\n    // if(otherCondition && currentPath.y !== y2){\n    //     currentPath.y = y2;\n    // }\n    if(conditionForFullY){\n        currentPath.y = y2;\n    }\n    else if(currentPath.x !== x2){\n        const adder = y1 < y2 ? -offsetHeight : offsetHeight;\n        y2 += adder;\n    }\n    currentPath.y = y2;\n    drawPoints.push({x : currentPath.x, y : currentPath.y});\n}\n\n\nfunction checkDestinationReached(currentPath: IDependencyMarkPath, x2: number, y2: number): boolean {\n    return currentPath.x === x2 && currentPath.y === y2;\n}\n\n\nexport function findPath(predecessorMarkPoint : DependencyMarkMeta, successorMarkPoint : DependencyMarkMeta, offsetWidth : number, offsetHeight : number){\n    let   {x : x2, y : y2, pointPosition : successorPosition}  = successorMarkPoint;\n    let   {x : x1, y : y1, pointPosition : predecessorPosition} = predecessorMarkPoint;\n\n    const currentPath = {x : x1, y : y1};\n    const drawPoints  = [{x : x1, y : y1}];\n    const initialY    = y1;\n    const adder       = successorPosition === 'start' ? -offsetWidth : offsetWidth;\n          x2         += adder;\n\n    let isDestinationReached = false;\n    while(!isDestinationReached){\n        equalizeX(x2, initialY, predecessorPosition, offsetWidth, currentPath, drawPoints);\n        isDestinationReached = checkDestinationReached(currentPath, x2, y2);\n        if(!isDestinationReached){\n            equalizeY(x2, y2, predecessorPosition, successorMarkPoint, offsetHeight, currentPath, drawPoints,offsetWidth);\n            isDestinationReached = checkDestinationReached(currentPath, x2, y2);\n        }\n    }\n    drawPoints.push({x : x2 - adder, y : y2});\n    return drawPoints;\n}\n\nfunction createSplitPoint(currentPoint : IDependencyMarkPath, comparatorPoint : IDependencyMarkPath, offsetSize : number) : IDependencyMarkPath {\n    const splitPoint = {x : currentPoint.x, y : currentPoint.y};\n    if(currentPoint.x !== comparatorPoint.x){\n        splitPoint.x =  comparatorPoint.x < currentPoint.x ? currentPoint.x - offsetSize : currentPoint.x + offsetSize;\n    }\n    else if(currentPoint.y !== comparatorPoint.y){\n        splitPoint.y = comparatorPoint.y < currentPoint.y ? currentPoint.y - offsetSize : currentPoint.y + offsetSize;\n    }\n    return splitPoint;\n}\n\nexport function convertPathIntoCurvyPath(drawPoints : IDependencyMarkPath[], radius : number) : pathRenderingMetaPoint[] {\n    const curvyPath : pathRenderingMetaPoint[] = [];\n    drawPoints.forEach((currentPoint, loopIndex) => {\n        const isFirstPoint = loopIndex === 0;\n        const isLastPoint = loopIndex === drawPoints.length - 1;\n        if(isFirstPoint){\n            curvyPath.push({\n                action : 'moveTo',\n                syntax : 'M',\n                ...currentPoint\n            });\n        }\n        else if(isLastPoint){\n            curvyPath.push({\n                action : 'lineTo',\n                syntax : 'L',\n                ...currentPoint\n            });\n        }\n        else{\n            const previousPoint = drawPoints[loopIndex - 1];\n            const nextPoint     = drawPoints[loopIndex + 1];\n            const firstSplitPoint = createSplitPoint(currentPoint, previousPoint, radius);\n            const secondSplitPoint = createSplitPoint(currentPoint, nextPoint, radius);\n            curvyPath.push({\n                action : 'lineTo',\n                syntax : 'L',\n                ...firstSplitPoint\n            });\n            curvyPath.push({\n                action : 'curveTo',\n                syntax : 'C',\n                points : [firstSplitPoint, currentPoint, secondSplitPoint]\n            });\n            curvyPath.push({\n                action : 'lineTo',\n                syntax : 'L',\n                ...secondSplitPoint\n            });\n        }\n    });\n\n    return curvyPath;\n}","import { Component, PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { GanttTimelineHolderController } from \"./GanttTimelineHolderController\";\n\n\n\n\nexport class GanttTimelineHolderComponent extends Component {\n    \n    @queryAssignedNodes('ganttTimelineScroller') private ganttTimelineScroller : HTMLElement;\n    static getTemplate :() => HTMLElement;\n\n    constructor() {\n        super();\n\t\tthis.setTemplate(GanttTimelineHolderComponent.getTemplate());\n    }\n\n    getGanttTimelineScroller() : HTMLElement {\n        return this.ganttTimelineScroller;\n    }\n\n    setScrollLeft(scrollLeft: number): void {\n        this.getGui().scrollLeft = scrollLeft;\n    }\n\n    setWidth(width: number) {\n        this.ganttTimelineScroller.style.width = width + 'px';\n    }\n\n    appendChild(newChild: Component | HTMLElement, _container?: HTMLElement | undefined, ): void {\n        super.appendChild(newChild, this.getGanttTimelineScroller());\n    }\n\n    @PostConstruct()\n    postConstruct() {\n        const IndicatorHolderController = this.createManagedBean(new GanttTimelineHolderController());\n        IndicatorHolderController.setUpComponent(this, this.getGanttTimelineScroller());\n    }\n\n    setLeftPosition(left : number) : void {\n        this.getGui().style.left = left + 'px';\n    }\n}","import { AutoWired, BEAN_NAME, Component, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { Events } from \"../../../Core/Constants/Events\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { ColumnVisibleHandler } from \"../../../Core/Columns/column-visible-handler\";\nimport { IColumnNode } from \"../../../Core/Interface/IColumnNode\";\nimport { TimelineIndicatorController } from \"../TimelineIndicator/TimelineIndicatorController\";\nimport { TimeLineIndicatorComponent } from \"../TimelineIndicator/TimeLineIndicatorComponent\";\nimport { GanttTimelineHolderComponent } from \"./GanttTimelineHolderComponent\";\nimport { IGanttOptionsHandler } from \"../../../../GanttModelClasses/Core/OptionsHandler/IGanttOptionsHandler\";\nimport { GanttController } from \"../../../../GanttModelClasses/Core/GanttComponent/GanttController\";\nimport { ICurrentTimeIndicatorCommunicationHandler } from \"../CurrentTimeIndicator/ICurrentTimeIndicatorCommunicationHandler\";\nimport { CurrentTimeIndicatorComponent } from \"../CurrentTimeIndicator/CurrentTimeIndicatorComponent\";\nimport { GANTT_BEAN_NAME } from \"../../../../GanttModelClasses/Constant/GanttBeanNameConstant\";\nimport { GANTT_CLASS_NAMES } from \"../../../Core/Constants/CSSClassNameContants\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\nimport { DateTime } from 'luxon';\nimport { ControllerHandler } from \"../../../../GanttModelClasses/Core/Contoller/GanttControllerHandler\";\n\n\n\nexport class GanttTimelineHolderController extends Component {\n    @AutoWired(GRID_BEAN_NAME.COLUMN_VISIBLE_HANDLER) private columnVisibleHandler : ColumnVisibleHandler;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!                 : getBeanInstanceByBeanName;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) optionHandler!                            : IGanttOptionsHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler!                 : FieldHandler;\n\n\n    private controllerHandler             : ControllerHandler;\n    private component                     : GanttTimelineHolderComponent;\n    private timelineContainer             : HTMLElement;\n    private ganttOptionHandler            : IGanttOptionsHandler;\n    private timeLineIndicators            : { [id: string]: TimeLineIndicatorComponent } = {};\n    public  currentTimeIndicatorComponent : CurrentTimeIndicatorComponent;\n\n    public setUpComponent( component: GanttTimelineHolderComponent, timelineContainer: HTMLElement ): void {\n        this.component                     = component;\n        this.ganttOptionHandler            = GanttController.getGanttBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        this.timelineContainer             = timelineContainer;\n        const communicationHandler         = this.createCurrentTimeIndicatorCommunicator();\n        this.currentTimeIndicatorComponent = this.createManagedBean(new CurrentTimeIndicatorComponent(communicationHandler));\n        this.currentTimeIndicatorComponent.appendTo(this.component.getGanttTimelineScroller())\n        this.addEventListeners();\n\n        this.controllerHandler = GanttController.getGanttBeanInstanceByBeanName(GANTT_BEAN_NAME.CONTROLLER_HANDLER);\n        this.controllerHandler.setGanttTimelineHolderController(this);\n    }\n\n    private createCurrentTimeIndicatorCommunicator(): ICurrentTimeIndicatorCommunicationHandler {\n        const fieldHandler  = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        const paginaitonApi = GanttController.getGanttBeanInstanceByBeanName(GANTT_BEAN_NAME.PAGINATION_API);\n        return {\n            getLeftPositionByDate           : (date: DateTime) => {\n                return Math.ceil(fieldHandler.getExactLeftByDate(date))\n            },\n            hasReachedLimit                 : (date: DateTime) => !paginaitonApi.isInCurrentProjectRange(date),\n            getTopPositionByDate            : () => null,\n            getCurrentTimeIndicatorRenderer : () => this.ganttOptionHandler.getCurrentTimeIndicatorRenderer(),\n            onCurrentTimeIndicatorUpdate    : () => {\n                this.updateCurrentTimelineCss();\n            }\n        }\n    }\n\n    updateCurrentTimelineCss(): void {\n        const gridApi                    = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_API);\n        const containerController        = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER);\n        const bodyElement                = containerController.gridController.getGui();\n        const currentTimeHeaderElement   = bodyElement.querySelector(`.${GANTT_CLASS_NAMES.GANTT_ACTIVE_COLUMN_HEADER_LABEL_CONTAINER}`);\n        const currentTimeTimelineElement = bodyElement.querySelector(`.${GANTT_CLASS_NAMES.GANTT_ACTIVE_TIMELINE_INDICATOR_LINE}`);\n\n        currentTimeHeaderElement?.classList.remove(GANTT_CLASS_NAMES.GANTT_ACTIVE_COLUMN_HEADER_LABEL_CONTAINER);\n        currentTimeTimelineElement?.classList.remove(GANTT_CLASS_NAMES.GANTT_ACTIVE_TIMELINE_INDICATOR_LINE);\n\n        const dateLeft             = this.fieldHandler.getLeftByDate(DateTime.now());\n        const columnID             = this.fieldHandler.getCenterColumnIDByX(dateLeft);\n        const bottomTierLabelIndex = this.findCurrentTimelineIndex();\n\n        if(bottomTierLabelIndex === -1){\n            return;\n        }\n\n        const timeLineIndicatorComponent = this.findCurrentTimelineComponent();\n        const headerCellComponent        = gridApi.getColumnHeaderCellRendererInstance(columnID);\n        \n        const bottomTierLabelController = headerCellComponent?.getBottomTierLabelContainerControllerByIndex(bottomTierLabelIndex);\n        const currentTimeline           = timeLineIndicatorComponent.getTimelineByIndex(bottomTierLabelIndex);\n\n        currentTimeline?.classList.add(GANTT_CLASS_NAMES.GANTT_ACTIVE_TIMELINE_INDICATOR_LINE);\n        bottomTierLabelController?.addCssClass(GANTT_CLASS_NAMES.GANTT_ACTIVE_COLUMN_HEADER_LABEL_CONTAINER);\n    }\n\n    private findCurrentTimelineIndex(): number {\n        const now                        = DateTime.now();\n        const currentLeft                = this.fieldHandler.getLeftByDate(now);\n        const timeLineIndicatorComponent = this.findCurrentTimelineComponent();\n        return timeLineIndicatorComponent?.getTimelineIndexByLeft(currentLeft) ?? -1;\n    }\n\n    private findCurrentTimelineComponent(): TimeLineIndicatorComponent {\n        const now         = DateTime.now();\n        const currentLeft = this.fieldHandler.getLeftByDate(now);\n        const columnID    = this.fieldHandler.getCenterColumnIDByX(currentLeft);\n        return this.getTimeLineIndicator(columnID);\n    }\n\n    private lazyLoadTimelineIndicators(): void {\n        //virtualiztion code for timeline indicators\n    }\n\n    getContainer(): HTMLElement {\n        return this.timelineContainer;\n    }\n\n    getComponent(): GanttTimelineHolderComponent {\n        return this.component;\n    }\n\n    hasTimeLineIndicator(id : string) : boolean {\n        return this.timeLineIndicators[id] !== undefined;\n    }\n\n    getTimeLineIndicator(id : string) : TimeLineIndicatorComponent {\n        return this.timeLineIndicators[id];\n    }\n\n    setTimeLineIndicator(id : string, timeLineIndicator : TimeLineIndicatorComponent) : void {\n        this.timeLineIndicators[id] = timeLineIndicator;\n    }\n\n    private addEventListeners(): void {\n        this.addListener(this.eventHandler, Events.EVENT_ROW_DATA_LOADED, (_params: any) => {\n            this.onWidthChanged({width: this.fieldHandler.getBodyContainerWidth()});\n        });\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayedDataChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_HORIZONTAL_SCROLL, this.onHorizontalScroll.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_WIDTH_CHANGED, (params)=>this.onWidthChanged({...params, width: this.fieldHandler.getBodyContainerWidth()}));\n    }\n\n    private onHorizontalScroll(params : any): void {\n        const scrollLeft = params.scrollLeft;\n        this.component.setScrollLeft(scrollLeft);\n    }\n\n    private onWidthChanged(params: any): void {\n        const width = params.width;\n        this.component.setWidth(width);\n    }\n\n    private onDisplayedDataChanged(): void {\n        const gridLines = this.ganttOptionHandler.getGridLines();\n        if(gridLines === 'vertical' || gridLines === 'both') {\n            const centerColumns = this.columnVisibleHandler.getCenterColumns();\n            this.renderDayHighlighter(centerColumns);\n        }\n    }\n\n    private renderDayHighlighter(columnNodes : IColumnNode[]) : void {\n        this.lazyLoadTimelineIndicators();\n\n        const now             = DateTime.now();\n        const currentLeft     = this.fieldHandler.getLeftByDate(now);\n        const currentColumnID = this.fieldHandler.getCenterColumnIDByX(currentLeft);\n        \n        columnNodes.forEach((columnNode) => {\n            const id = columnNode.getID();\n            const hasCurrentTimeline = id === currentColumnID;\n            if(this.hasTimeLineIndicator(id)) {\n                return;\n            }\n            this.createNewTimeLineIndicator(columnNode, hasCurrentTimeline);\n        });\n    }\n\n    private createNewTimeLineIndicator(columnNode : IColumnNode, hasCurrentTimeline : boolean = false) : void {\n        const timeLineIndicatorController = new TimelineIndicatorController(columnNode, this.getBeanInstanceByBeanName);\n        const timeLineIndicatorComponent  = new TimeLineIndicatorComponent(timeLineIndicatorController,this.getBeanInstanceByBeanName);\n        timeLineIndicatorController.createIndicators(timeLineIndicatorComponent);\n\n        if(hasCurrentTimeline) {\n            const containerController        = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER);\n            const bodyElement                = containerController.gridController.getGui();\n            const currentTimeTimelineElement = bodyElement.querySelector(`.${GANTT_CLASS_NAMES.GANTT_ACTIVE_TIMELINE_INDICATOR_LINE}`);\n\n            currentTimeTimelineElement?.classList.remove(GANTT_CLASS_NAMES.GANTT_ACTIVE_TIMELINE_INDICATOR_LINE);\n\n            const index    = columnNode.getBottomTierIndexByDate(new Date());\n            const timeline = timeLineIndicatorComponent.getTimelineByIndex(index);\n            timeline?.classList.add(GANTT_CLASS_NAMES.GANTT_ACTIVE_TIMELINE_INDICATOR_LINE);\n        }\n\n        const id                          = timeLineIndicatorController.getId();\n        this.component.appendChild(timeLineIndicatorComponent);\n        timeLineIndicatorController.afterGuiAttached();\n        this.setTimeLineIndicator(id, timeLineIndicatorComponent);\n    }\n}\n","import { Component, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { TimelineIndicatorController } from \"./TimelineIndicatorController\";\nimport {GANTT_CLASS_NAMES } from \"../../../Core/Constants/CSSClassNameContants\";\nimport { IDateRange } from \"../../../../GanttModelClasses/Core/TimelineHeaderComponent/TopTeirComponent/ITopTierComponent\";\n\nfunction getGanttTimelineHolderTemplate() : HTMLElement {\n    const indicator =  document.createElement('div');\n    indicator.classList.add(GANTT_CLASS_NAMES.GANTT_TIMELINE_INDICATOR_HOLDER);\n    return indicator;\n}\n\nexport class TimeLineIndicatorComponent extends Component {\n    controller                : TimelineIndicatorController;\n    getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    constructor(controller : TimelineIndicatorController, getBeanInstanceByBeanName : getBeanInstanceByBeanName) {\n        super();\n        this.controller                = controller;\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n        this.setTemplate(getGanttTimelineHolderTemplate());\n        this.controller.setComponent(this);\n    }\n\n    afterGuiAttached() {\n\n    }\n\n    setLeftPosition(left : number) : void {\n        this.getGui().style.left = left + 'px';\n    }\n\n    setWidth(width : number) : void {\n        this.getGui().style.width = width + 'px';\n    }\n\n    createIndicators(lineCount : number, weekEnds : number[] = [0,6], bottomTierData : IDateRange[]) : void {\n        for(let i = 0; i < lineCount; i++) {\n            const dateRange = bottomTierData[i];\n            const indicator = document.createElement('div');\n            indicator.classList.add(GANTT_CLASS_NAMES.GANTT_TIMELINE_INDICATOR_LINE);\n            if(dateRange.isToday){\n                indicator.classList.add(GANTT_CLASS_NAMES.GANTT_ACTIVE_TIMELINE_INDICATOR_LINE);\n            }\n            this.getGui().appendChild(indicator);\n            if(weekEnds.includes(i)) {\n                indicator.classList.add(GANTT_CLASS_NAMES.GANTT_TIMELINE_INDICATOR_LINE_WEEKEND);\n            }\n        }\n    }\n\n\n    getTimelineWidth() : number {\n        return this.controller.getTimelineWidth();\n    }\n\n    getTimelineByIndex(index : number) : HTMLElement {\n        return this.getGui().children[index] as HTMLElement;\n    }\n\n    getTimelineByLeft(dateLeft : number) : HTMLElement | null {\n        return this.controller.getTimelineByLeft(dateLeft);\n    }\n\n    getTimelineIndexByLeft(dateLeft : number) : number {\n        return this.controller.getTimelineIndexByLeft(dateLeft);\n    }\n}","import { EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IColumnNode } from \"../../../Core/Interface/IColumnNode\";\nimport { TimeLineIndicatorComponent } from \"./TimeLineIndicatorComponent\";\nimport { DateTime } from 'luxon';\n\n\nexport class TimelineIndicatorController extends EventEmitter {\n    \n    private columnNode                : IColumnNode;\n            getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    private component                 : TimeLineIndicatorComponent;\n    \n    constructor(columnNode : IColumnNode, getBeanInstanceByBeanName : getBeanInstanceByBeanName) {\n        super();\n        this.columnNode                = columnNode;\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n    }\n\n    setComponent(component : TimeLineIndicatorComponent) {\n        this.component = component;\n    }\n\n    afterGuiAttached() {\n        const left  = this.columnNode.getLeft();\n        const width = this.columnNode.getWidth();\n        this.component.setLeftPosition(left);\n        this.component.setWidth(width);\n    }\n\n    getTimeFrame() : DateTime {\n        return this.columnNode.getTimeFrame();\n        // return '';\n    }\n\n    getTimeFrameCount() : number {\n        return this.columnNode.getTimeFrameCount();\n    }\n\n    getTimelineWidth() : number {\n        return this.columnNode.getWidth() / this.getTimeFrameCount();\n    }\n\n    getTimelineByLeft(dateLeft : number) : HTMLElement | null {\n        const timelineIndex = this.getTimelineIndexByLeft(dateLeft);\n        return this.component.getTimelineByIndex(timelineIndex);\n    }\n\n    getTimelineIndexByLeft(dateLeft : number) : number {\n        const columnLeft = this.columnNode.getLeft();\n        const timelineWidth = this.getTimelineWidth();\n        const timelineIndex = ((dateLeft - columnLeft) / timelineWidth);\n        return timelineIndex;\n    }\n\n    getWeekEnds() : number[] {\n        return this.columnNode.getWeekEnds();\n    }\n\n    getId() : string {\n        return this.columnNode.getID();\n    }\n\n    createIndicators(component : TimeLineIndicatorComponent) : void {\n        const timeFrameCount = this.getTimeFrameCount();\n        const weekEnds       = this.getWeekEnds();\n        component.createIndicators(timeFrameCount, weekEnds,  (this.columnNode as any).bottomTierData);\n    }\n\n}\n","\nimport { AutoWired, BEAN_NAME, Component, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { clearElement, removeFromParent } from \"../../../../Core/utils/Dom\";\nimport { ColumnBufferContinerController } from './ColumnBufferContainerController';\nimport { IColumnBufferContainerComponent, IColumnBufferContainerComponentWrapper } from \"./Interface/IColumnBufferContainerComponent\";\n\nexport class ColumnBufferContainerComponent extends Component implements IColumnBufferContainerComponent {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n\tstatic getTemplate: () => HTMLElement;\n\n    private columnButtonRenderer : any;\n\n    private columnButtonRendererElement : HTMLElement | null;\n\n    componentClass : any;\n\n    constructor() {\n        super();\n\n        this.setTemplate(ColumnBufferContainerComponent.getTemplate());\n    }\n\n    @PostConstruct()\n    init() : void {\n        const component : IColumnBufferContainerComponentWrapper = {\n            getGui            : () => this.getGui(),\n            setLeftInPixels   : (left : string) => this.setLeftInPixel(left),\n            setWidthInPixel   : (width : string) => this.setWidthInPixel(width),\n            setRendererDetails: (componentDetails : any) => this.setRendererDetails(componentDetails),\n            getRenderer       : () => this.columnButtonRenderer\n        }\n\n        const columnButtonContainerController = this.createManagedBean(new ColumnBufferContinerController());\n        columnButtonContainerController.setComponent(component);\n    }\n\n    private setLeftInPixel(left : string) : void {\n        const element = this.getGui();\n        if(element) {\n            element.style.left = left;\n        }\n    }\n\n    private setWidthInPixel(width : string) : void {\n        const element = this.getGui();\n        if(element) {\n            element.style.width = width;\n        }\n    }\n\n    private setRendererDetails(componentDetails : any) : void {\n        if (componentDetails) {\n            this.destroyRenderer();\n            this.cretaeRendererInstance(componentDetails);\n\t\t}\n    }\n\n    private destroyRenderer() : void {\n        const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n\n        this.columnButtonRenderer = context.destroyBean(this.columnButtonRenderer);\n        removeFromParent(this.columnButtonRendererElement);\n        this.columnButtonRendererElement = null;\n\n        this.componentClass = null\n    }\n\n    private afterRenderer(componentClass : any, columnButtonRenderer : any) : void {\n        if (!this.isAlive()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.columnButtonRenderer = columnButtonRenderer;\n\t\tthis.columnButtonRendererElement = columnButtonRenderer.getElement();\n\n\t\tif (this.columnButtonRendererElement) {\n\t\t\tclearElement(this.getGui());\n\t\t\tthis.appendChild(this.columnButtonRendererElement);\n\t\t}\n\n        this.componentClass = componentClass;\n    }\n\n     private cretaeRendererInstance(componentDetails : any ) : void {\n        const componentInstance = componentDetails.newInstance();\n        const callBack = this.afterRenderer.bind(this, componentDetails.componentClass);\n        if (componentInstance) {\n            componentInstance.then(callBack);\n        }\n    }\n}","import { Events } from \"../../../../Core/Constants/Events\";\nimport { IControllerHandler } from \"../../../../Core/Interface/IControllerHandler\";\nimport { IColumnBufferContainerComponentWrapper } from \"./Interface/IColumnBufferContainerComponent\";\nimport { IColumnBufferContainerController } from \"./Interface/IColumnBufferContainerController\";\nimport { ColumnBufferHandler } from \"../../../../Core/Buffer/column/ColumnBufferHandler\";\nimport { FieldHandler } from \"../../../../Core/Columns/FieldHandler\";\nimport { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../../../Core/Constants/BeanName\";\nimport { GridUserComponentHandler } from \"../../../../Core/Components/UserComponentHandler\";\nimport { AddColumnButtonRenderer } from \"../../../../Main\";\n\nexport class ColumnBufferContinerController extends EventEmitter implements IColumnBufferContainerController {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    private component: IColumnBufferContainerComponentWrapper;\n\n    setComponent(component : IColumnBufferContainerComponentWrapper) {\n        this.component = component;\n        this.registerController();\n        this.addRowPlusListner();\n\n        this.onLeftChanged();\n        this.onWidthChanged();\n    }\n\n    private addRowPlusListner() : void {\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_BUFFER_CONTAINER_WIDTH_CHANGED, this.onWidthChanged.bind(this))\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_BUFFER_RENDERER_CHANGED, this.onRendererChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, this.onLeftChanged.bind(this));\n    }\n\n    private onLeftChanged() : void {\n        const fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n        const left       = fieldHandler.getBodyContainerWidth();\n        let leftInPixel   = left != null ? `${left}px` : ``;\n        const isRTL = this.optionsHandler.isRTL();\n        isRTL ? leftInPixel ='0px' : null;\n        this.component.setLeftInPixels(leftInPixel);\n    }\n\n    private onWidthChanged() : void {\n        const columnBufferHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_BUFFER_HANDLER) as ColumnBufferHandler;\n        const columnBufferItem = columnBufferHandler.getColumnBufferItem();\n\n        const width = columnBufferItem.getWidth();\n\n        const widthInPixel = width != null ? `${width}px` : ``;\n\n        this.component.setWidthInPixel(widthInPixel);\n    }\n\n\n    private registerController() : void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        controllerHandler.registerColumnBufferContainerController(this);\n    }\n\n    private onRendererChanged() : void {\n        const columnBufferHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_BUFFER_HANDLER) as ColumnBufferHandler;\n\n        const columnBufferItems = columnBufferHandler.getColumnBufferItem();\n\n        const isAddColumnButton = columnBufferHandler.getAddColumnButton();\n\n        if(!isAddColumnButton) {\n            return;\n        }\n\n        const componentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as GridUserComponentHandler;\n\n        const params = this.createAddColumnButtonRendererParams();\n\n        const componentDetails = componentHandler.getColumnPlusRendererDetails(columnBufferItems, params);\n\n        this.component.setRendererDetails(componentDetails);\n    }\n\n\n    private createAddColumnButtonRendererParams() {\n        return {\n            instanceAPI : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER)\n        }\n    }\n\n    getRenderer() : AddColumnButtonRenderer {\n        return this.component.getRenderer();\n    }\n}","\nimport { AutoWired, BEAN_NAME, Component, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { clearElement, removeFromParent } from \"../../../../Core/utils/Dom\";\nimport { IRowBufferContainerComponent, IRowBufferContainerComponentWrapper } from \"./Interface/IRowBufferContainerComponent\";\nimport { RowBufferContinerController } from \"./RowBufferContainerController\";\n\nexport class RowBufferContainerComponent extends Component implements IRowBufferContainerComponent {\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n\tstatic getTemplate: () => HTMLElement;\n\n    private rowBufferRenderer : any;\n\n    private rowBufferRendererElement : HTMLElement | null;\n\n    componentClass : any;\n\n    constructor() {\n        super();\n\n        this.setTemplate(RowBufferContainerComponent.getTemplate());\n    }\n\n    @PostConstruct()\n    init() : void {\n        const component : IRowBufferContainerComponentWrapper = {\n            getGui            : () => this.getGui(),\n            setTopInPixels    : (top : string) => this.setTopInPixel(top),\n            setHeightInPixel  : (height : string) => this.setHeightInPixel(height),\n            setRendererDetails: (componentDetails : any) => this.setRendererDetails(componentDetails),\n            getRenderer       : () => this.rowBufferRenderer\n        }\n\n        const rowBufferContainerController = this.createManagedBean(new RowBufferContinerController());\n        rowBufferContainerController.setComponent(component);\n    }\n\n    private setTopInPixel(top : string) : void {\n        const element = this.getGui();\n        if(element) {\n            element.style.top = top;\n        }\n    }\n\n    private setHeightInPixel(height : string) : void {\n        const element = this.getGui();\n        if(element) {\n            element.style.height = height;\n        }\n    }\n\n    private setRendererDetails(componentDetails : any) : void {\n        if (componentDetails) {\n            this.destroyRenderer();\n            this.cretaeRendererInstance(componentDetails);\n\t\t}\n    }\n\n    private destroyRenderer() : void {\n        const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n\n        this.rowBufferRenderer = context.destroyBean(this.rowBufferRenderer);\n        removeFromParent(this.rowBufferRendererElement);\n        this.rowBufferRendererElement = null;\n\n        this.componentClass = null\n    }\n\n    private afterRenderer(componentClass : any, rowBufferRenderer : any) : void {\n        if (!this.isAlive()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.rowBufferRenderer = rowBufferRenderer;\n\t\tthis.rowBufferRendererElement = rowBufferRenderer.getElement();\n\n\t\tif (this.rowBufferRendererElement) {\n\t\t\tclearElement(this.getGui());\n\t\t\tthis.appendChild(this.rowBufferRendererElement);\n\t\t}\n\n        this.componentClass = componentClass;\n    }\n\n     private cretaeRendererInstance(componentDetails : any ) : void {\n        const componentInstance = componentDetails.newInstance();\n        const callBack = this.afterRenderer.bind(this, componentDetails.componentClass);\n        if (componentInstance) {\n            componentInstance.then(callBack);\n        }\n    }\n}","import { Events } from \"../../../../Core/Constants/Events\";\nimport { IControllerHandler } from \"../../../../Core/Interface/IControllerHandler\";\nimport { RowBufferHandler } from \"../../../../Core/Buffer/row/RowBufferHandler\";\nimport { IRowBufferContainerComponentWrapper } from \"./Interface/IRowBufferContainerComponent\";\nimport { IRowBufferContainerController } from \"./Interface/IRowBufferContainerController\";\nimport { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../../../Core/Constants/BeanName\";\nimport { GridUserComponentHandler } from \"../../../../Core/Components/UserComponentHandler\";\nimport { AddRowButtonRenderer } from \"../../../../Main\";\n\nexport class RowBufferContinerController extends EventEmitter implements IRowBufferContainerController {\n\n    private component: IRowBufferContainerComponentWrapper;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    setComponent(component : IRowBufferContainerComponentWrapper) {\n        this.component = component;\n        this.registerController();\n        this.addRowPlusListner();\n\n        this.onTopChanged();\n        this.onHeightChanged();\n    }\n\n\n\n    private addRowPlusListner() : void {\n        this.addListener(this.eventHandler, Events.EVENT_ROW_CONTAINER_HEIGHT_CHANGED, this.onTopChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_EXTRA_ROW_HEIGHT_CHANGED, this.onTopChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_PLUS_CONTAINER_HEIGHT_CHANGED, this.onHeightChanged.bind(this))\n        this.addListener(this.eventHandler, Events.EVENT_ROW_PLUS_RENDERER_CHANGED, this.onRendererChanged.bind(this));\n    }\n\n    private onTopChanged() : void {\n        const recordHandler    = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        const extraRowHandler  = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.EXTRA_RECORD_HANDLER);\n        const centerRowHandler = recordHandler.getMiddleHandler();\n        const height           = centerRowHandler.getTotalHeight() ?? 0;\n        const extraRowHeight   = this.optionsHandler.getIsExtraRow() ? extraRowHandler.getRowHeight() : 0;\n        const overAllHeight    = height + extraRowHeight;\n        const topInPixel       = overAllHeight != null ? `${overAllHeight}px` : ``;\n\n        this.component.setTopInPixels(topInPixel);\n    }\n\n    private onHeightChanged() : void {\n        const rowPlusHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_BUFFER_HANDLER) as RowBufferHandler;\n        const rowPlusItem         = rowPlusHandler.getrowBufferItem();\n\n        const height = rowPlusItem.getHeight();\n\n        const heightInPixel = height != null ? `${height}px` : ``;\n\n        this.component.setHeightInPixel(heightInPixel);\n    }\n\n\n    private registerController() : void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        controllerHandler.registerRowBufferContainerController(this);\n    }\n\n    private onRendererChanged() : void {\n        const rowPlusHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_BUFFER_HANDLER) as RowBufferHandler;\n\n        const rowPlusItems = rowPlusHandler.getrowBufferItem();\n\n        const isAddRowButton = rowPlusHandler.getAddRowButton();\n\n        if(!isAddRowButton) {\n            return;\n        }\n\n        const componentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as GridUserComponentHandler;\n\n        const params = this.createRowPlusRendererParams();\n\n        const componentDetails = componentHandler.getRowPlusRendererDetails(rowPlusItems, params);\n\n        this.component.setRendererDetails(componentDetails);\n    }\n\n\n    private createRowPlusRendererParams() {\n        return {\n            instanceAPI : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER)\n        }\n    }\n\n    getRenderer() : AddRowButtonRenderer {\n        return this.component.getRenderer();\n    }\n}","import { Component, PostConstruct } from \"@dg/corecomponent\";\nimport { queryAssignedNodes } from \"../../Core/Decorator/ReferenceSelector\";\nimport { FloatingRecordComponent } from \"../../FloatingRecords/UIHandler/FloatingRecordComponent\";\nimport { GridHeader } from \"../Header/GridHeader\";\nimport { GridBodyController, IGridBodyComponent } from \"./GridBodyController\";\nimport { Events } from \"../../Core/Constants/Events\";\nexport class GridBodyComponent extends Component {\n    static getTemplate: () => HTMLElement;\n\n    @queryAssignedNodes('gridHeader') private readonly headerComp !            : GridHeader;\n    @queryAssignedNodes('eTopContainer') private readonly eTopContainer !      : HTMLElement;\n    // @queryAssignedNodes('eTopViewPort') private readonly eTopViewPort !        : HTMLElement;\n    @queryAssignedNodes('eBodyConatiner') private readonly eBodyConatiner!          : HTMLElement;\n    @queryAssignedNodes('eBodyViewPort') private readonly eBodyViewPort !           : HTMLElement;\n    @queryAssignedNodes('eBottomConatiner') private readonly eBottomConatiner !     : HTMLElement;\n    @queryAssignedNodes('eSummaryContainer') private readonly eSummaryConatiner !   : HTMLElement;\n    @queryAssignedNodes('eFloatingContainer') private readonly floatingRecordComp ! : FloatingRecordComponent;\n    @queryAssignedNodes('eStickyTop') private readonly stickyTop !                  : HTMLElement;\n\n    private gridBodyWidth  : number;\n    private gridBodyHeight : number;\n    private gridBodyResizeObserver: ResizeObserver;\n\n    // @queryAssignedNodes('eBottomViewport') private readonly eBottomViewport !  : HTMLElement;\n    \n    constructor() {\n        super(GridBodyComponent.getTemplate());\n    }\n\n    @PostConstruct()\n    init() {\n        const comp : IGridBodyComponent = {\n            observeResize              : () => this.observeResize(),\n            getBodyContainer           : () =>  this.eBodyConatiner,\n            getBottomContainer         : () => this.eBottomConatiner,\n            getBodyViewPortContainer   : () => this.eBodyViewPort,\n            getTopContainer            : () => this.eTopContainer,\n            getSummaryContainer        : () => this.eSummaryConatiner,\n            getGui                     : () => this.getGui(),\n            getHeaderComponent         : () => this.headerComp,\n            getFloatingRecordContainer : () => this.floatingRecordComp.getGui(),\n            getStickyTopContainer      : () => this.stickyTop,\n            getOffsetWidth             : () => this.gridBodyWidth,\n            getOffsetHeight            : () => this.gridBodyHeight\n        }\n\n        const gridBodyController = this.createManagedBean(new GridBodyController());\n        gridBodyController.setComponent(comp);\n\n        this.updateGridBodySize();\n        this.gridBodyResizeObserver = new ResizeObserver(() => {\n            requestAnimationFrame(() => {\n                this.updateGridBodySize();\n            });\n        });\n    }\n\n    updateGridBodySize() {\n        this.gridBodyWidth = this.eBodyViewPort.offsetWidth;\n        this.gridBodyHeight = this.eBodyViewPort.offsetHeight;\n        this.dispatchEvent({\n            type : Events.EVENT_GRID_DIMENSION_CHANGED\n        })\n    }\n\n    observeResize() {\n        this.updateGridBodySize();\n        this.unobserveResize();\n        this.gridBodyResizeObserver.observe(this.eBodyConatiner);\n    }\n\n    unobserveResize() {\n        this.gridBodyResizeObserver.unobserve(this.eBodyConatiner);\n    }\n}\n","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, setAriaColCount, setAriaRowCount } from '@dg/corecomponent';\nimport { Events } from '../../Core/Constants/Events';\nimport { GridBodyScrollHandler } from '../../Core/GridBodyScrollHandler';\nimport { IControllerHandler } from '../../Core/Interface/IControllerHandler';\nimport { GridHeader } from '../Header/GridHeader';\nimport { GRID_BEAN_NAME } from '../../Core/Constants/BeanName';\nimport { DragAndDropHandler } from '../../../DragAndDrop-handler/dragAndDrop-handler';\nimport { RowDragHandler } from '../../../row-drag-handler/row-drag-handler';\nimport { IRecordHandler } from '../../Core/Rows/RecordHandler.types';\nimport { BodyRowDragger } from '../../../row-drag-handler/body-row-dragger';\nimport { FieldHandler } from '../../Core/Columns/FieldHandler';\n\nexport interface IGridBodyComponent {\n\tobserveResize()              : void;\n\tgetTopContainer()            : HTMLElement;\n\tgetBottomContainer()         : HTMLElement;\n\tgetBodyContainer()           : HTMLElement;\n\tgetBodyViewPortContainer()   : HTMLElement;\n\tgetSummaryContainer()        : HTMLElement;\n\tgetGui()                     : HTMLElement;\n\tgetHeaderComponent()         : GridHeader;\n\tgetFloatingRecordContainer() : HTMLElement;\n\tgetStickyTopContainer()      : HTMLElement;\n\tgetOffsetWidth()             : number;\n\tgetOffsetHeight()            : number;\n}\n\nexport class GridBodyController extends EventEmitter {\n\t@AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler!: IRecordHandler;\n\t@AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler!: FieldHandler;\n\t@AutoWired('dragAndDropHandler') private dragAndDropHandler : DragAndDropHandler<any>\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\tprivate rowDragHandler : RowDragHandler;\n\n\tprivate eTopConatiner!: HTMLElement;\n\tprivate eBottomContainer!: HTMLElement;\n\t// private eBodyContainer !        : HTMLElement;\n\tprivate eBodyViewPortContainer!: HTMLElement;\n\n\tprivate component: IGridBodyComponent;\n\n\tprivate bodyScrollHandler : GridBodyScrollHandler;\n\n\tprivate stickyTopHeight : number = 0;\n\tgridScrollHolder: HTMLElement;\n\n\n\tprivate registerController() {\n\t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tcontrollerHandler.registerBodyController(this);\n\t}\n\tsetComponent(comp: IGridBodyComponent): void {\n\t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tcontrollerHandler.onAfterGridReady(() => {\n\t\t\tconst gridController = controllerHandler.getGridController();\n\t\t\tthis.gridScrollHolder = gridController.getScrollHolder();\n\t\t\tcomp.observeResize();\n\t\t});\n\n\t\tthis.eTopConatiner = comp.getTopContainer();\n\t\tthis.eBodyViewPortContainer = comp.getBodyViewPortContainer();\n\t\tthis.eBottomContainer = comp.getBottomContainer();\n\t\t// this.eBodyContainer         = comp.getBodyContainer();\n\n\t\tthis.component = comp;\n\n\t\tthis.setFloatingHeights();\n\n\t\tthis.addEventListeners();\n\n\t\tthis.bodyScrollHandler = this.createManagedBean(\n\t\t\tnew GridBodyScrollHandler(this.eBodyViewPortContainer),\n\t\t);\n\t\tthis.registerController();\n\t\tthis.addRowDragListener();\n\t\tthis.addEventListener(Events.EVENT_ROW_CONTAINER_HEIGHT_CHANGED, this.updateAriaRowColCount.bind(this));\n\t}\n\n\tupdateAriaRowColCount() {\n\t\tconst gridBodyElement = this.component.getGui();\n\t\tconst rowCount        = this.recordHandler.getTotalCount();\n\t\tconst colCount        = this.fieldHandler.getTotalCount();\n\t\tsetAriaRowCount(gridBodyElement, rowCount);\n\t\tsetAriaColCount(gridBodyElement, colCount);\n\t}\n\tprivate addEventListeners() {\n\t\t// this.addListener(this.eBodyViewPortContainer, 'scroll', () => {\n\t\t// \tthis.eBodyViewPortContainer.scrollLeft = 0;\n\t\t// });\n\n\n\n\t\tthis.addListener(\n\t\t\tthis.eventHandler,\n\t\t\tEvents.EVENT_PINNED_ROW_DATA_CHANGED,\n\t\t\tthis.setFloatingHeights.bind(this),\n\t\t);\n\n\t\tthis.addListener(this.eventHandler, Events.EVENT_AUTO_WIDTH_INIT_START, () => {\n\t\t\tthis.component.getGui().classList.add('dg-auto-width-pending');\n\t\t});\n\n\t\tthis.addListener(this.eventHandler, Events.EVENT_AUTO_WIDTH_INIT_COMPLETE, () => {\n\t\t\tthis.component.getGui().classList.remove('dg-auto-width-pending');\n\t\t});\n\t}\n\n\n\tpublic scrollVertically(pixels: number): number {\n\t\tconst oldScrollPosition = this.eBodyViewPortContainer.scrollTop;\n\n\t\tthis.bodyScrollHandler.setVerticalScrollPosition( oldScrollPosition + pixels, );\n\n\t\treturn this.eBodyViewPortContainer.scrollTop - oldScrollPosition;\n\t}\n\n\t public scrollHorizontally(pixels: number): number {\n\t\tconst oldScrollPosition = this.getScrollLeft();\n\n\t\tthis.bodyScrollHandler.setHorizontalScrollPosition( oldScrollPosition + pixels, );\n\n\t\treturn this.getScrollLeft() - oldScrollPosition;\n\t}\n\n\tprivate setFloatingHeights() {\n\t\tconst setHeight = (element: HTMLElement, height: number) => {\n\t\t\tconst heightString = `${height}px`;\n\t\t\telement.style.minHeight = heightString;\n\t\t\telement.style.height = heightString;\n\t\t};\n\n\t\t// const setBottom = (element: HTMLElement, bottom: number) => {\n\t\t// \tconst bottomString = `${bottom}px`;\n\t\t// \telement.style.bottom = bottomString;\n\t\t// };\n\n\t\tconst setDisplay = (element: HTMLElement, display: string) => {\n\t\t\telement.style.display = display;\n\t\t};\n\n\t\tconst { recordHandler } = this;\n\n\t\tlet topHandler = recordHandler.getTopHandler();\n\t\tlet TopHeight = topHandler.getTotalHeight();\n\n\t\tif (TopHeight) {\n\t\t\tTopHeight += 1;\n\t\t}\n\n\t\tlet bottomHandler = recordHandler.getBottomHandler();\n\t\tlet BottomHeight = bottomHandler.getTotalHeight();\n\n\t\tif (BottomHeight) {\n\t\t\tBottomHeight += 1;\n\t\t}\n\n\t\tlet summaryHandler = recordHandler.getSummaryHandler();\n\t\tlet summaryHeight = summaryHandler.getTotalHeight();\n\n\t\tif (summaryHeight) {\n\t\t\tsummaryHeight += 1;\n\t\t}\n\n\t\tsetHeight(this.eTopConatiner, TopHeight);\n\t\tsetHeight(this.eBottomContainer, BottomHeight);\n\t\tsetHeight(this.component.getSummaryContainer(), summaryHeight);\n\n\t\t// setBottom(this.eBottomContainer, summaryHeight);\n\n\t\tsetDisplay(this.eTopConatiner, TopHeight ? 'inherit' : 'none');\n\t\tsetDisplay(this.eBottomContainer, BottomHeight ? 'inherit' : 'none');\n\t\tsetDisplay(\n\t\t\tthis.component.getSummaryContainer(),\n\t\t\tsummaryHeight ? 'inherit' : 'none',\n\t\t);\n\n\t\tthis.setStickyTopOffsetTop();\n\t}\n\n\tgetScrollTop(): number {\n\t\t// return this.gridScrollHolder?.scrollTop ?? 0;\n\t\treturn this.bodyScrollHandler.getScrollTop();\n\t}\n\n\tgetScrollLeft(): number {\n\t\treturn this.bodyScrollHandler.getScrollLeft();\n\t}\n\n\tgetVScrollPosition() {\n\t\tconst scrollTop  = this.getScrollTop();\n\t\tconst scrollLeft = this.getScrollLeft();\n\t\treturn {\n\t\t\ttop      : scrollTop,\n\t\t\tbottom   : scrollTop + this.component.getOffsetHeight(),\n\t\t\tright    : scrollLeft + this.component.getOffsetWidth(),\n\t\t};\n\t}\n\n\tgetTopContainerBoundRect(): DOMRect {\n\t\tconst boundRect = this.eTopConatiner.getBoundingClientRect();\n\t\treturn boundRect;\n\t}\n\n\tgetBottomContainerBoundRect(): DOMRect {\n\t\tconst boundRect = this.eBottomContainer.getBoundingClientRect();\n\t\treturn boundRect;\n\t}\n\n\tgetCenterContainerBoundRect(): DOMRect {\n\t\tconst boundRect = this.eBodyViewPortContainer.getBoundingClientRect();\n\t\treturn boundRect;\n\t}\n\n\tgetCenterContainer(): HTMLElement {\n\t\tconst container = this.eBodyViewPortContainer;\n\t\treturn container;\n\t}\n\n\tgetBodyContainer(): HTMLElement {\n\t\treturn this.component.getGui();\n\t}\n\n\tgetHeaderComponent(): GridHeader {\n\t\treturn this.component.getHeaderComponent();\n\t}\n\n\tgetScrollTopForTopContainer(): number {\n\t\tconst container = this.component.getTopContainer();\n\t\tif (!container) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn container.scrollTop;\n\t}\n\n\tgetScrollTopForBottomContainer(): number {\n\t\tconst container = this.component.getBottomContainer();\n\t\tif (!container) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn container.scrollTop;\n\t}\n\n\tgetScrollTopForCenterViewPortContainer(): number {\n\t\tconst container = this.component.getBodyViewPortContainer();\n\t\tif (!container) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn container.scrollTop;\n\t}\n\n\tgetScrollTopForHeaderComponent(): number {\n\t\tconst headerComponent = this.component.getHeaderComponent();\n\t\tconst container = headerComponent.getGui();\n\t\tif (!container) {\n\t\t\treturn 0;\n\t\t}\n\t\treturn container.scrollTop;\n\t}\n\n\tgetBoundRectForHeaderComponent(): DOMRect {\n\t\tconst headerComponent = this.component.getHeaderComponent();\n\t\tconst container = headerComponent.getGui();\n\t\tif (!container) {\n\t\t\treturn {\n\t\t\t\tbottom: 0,\n\t\t\t\theight: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: 0,\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\ttoJSON: () => 0,\n\t\t\t};\n\t\t}\n\t\treturn container.getBoundingClientRect();\n\t}\n\n\tgetBoundRectForCenterViewPortContainer(): DOMRect {\n\t\tconst container = this.component.getBodyViewPortContainer();\n\t\tif (!container) {\n\t\t\treturn {\n\t\t\t\tbottom: 0,\n\t\t\t\theight: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: 0,\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\ttoJSON: () => 0,\n\t\t\t};\n\t\t}\n\t\treturn container.getBoundingClientRect();\n\t}\n\n\tgetBoundRectForTopContainer(): DOMRect {\n\t\tconst container = this.component.getTopContainer();\n\t\tif (!container) {\n\t\t\treturn {\n\t\t\t\tbottom: 0,\n\t\t\t\theight: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: 0,\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\ttoJSON: () => 0,\n\t\t\t};\n\t\t}\n\t\treturn container.getBoundingClientRect();\n\t}\n\n\tgetBoundRectForBottomContainer(): DOMRect {\n\t\tconst container = this.component.getBottomContainer();\n\t\tif (!container) {\n\t\t\treturn {\n\t\t\t\tbottom: 0,\n\t\t\t\theight: 0,\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\twidth: 0,\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\ttoJSON: () => 0,\n\t\t\t};\n\t\t}\n\t\treturn container.getBoundingClientRect();\n\t}\n\n\tgetScrollHandler() {\n\t\treturn this.bodyScrollHandler\n\t}\n\n\tgetViewPortContainer() : HTMLElement {\n\t\treturn this.eBodyViewPortContainer;\n\t}\n\n\tpublic addScrollEventListener(listener: () => void): void {\n        this.eBodyViewPortContainer.addEventListener('scroll', listener, { passive: true });\n    }\n\n    public removeScrollEventListener(listener: () => void): void {\n        this.eBodyViewPortContainer.removeEventListener('scroll', listener);\n    }\n\n\tpublic setStickyTopHeight(height: number): void {\n\t\tconst stickyTopContainer = this.component.getStickyTopContainer();\n\t\tstickyTopContainer.style.height = `${height}px`;\n\t\tthis.stickyTopHeight = height;\n\t}\n\n\tpublic getStickyTopHeight(): number {\n\t\treturn this.stickyTopHeight\n\t}\n\n\tpublic setStickyTopTop(top: number): void {\n\t\tconst stickyTopContainer = this.component.getStickyTopContainer();\n\t\tstickyTopContainer.style.top = `${top}px`;\n\t}\n\n\tprivate setStickyTopOffsetTop(): void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as { getColumnHeaderHeight: (m: any) => number; getTotalColumnHeaderHeight?: (maxDepth: number) => number; hasColumnGroups?: () => boolean };\n\t\tconst treeModel = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_TREE_MODEL) as { getMaxDepth: () => number } | undefined;\n\t\tconst maxDepth = (optionHandler.hasColumnGroups?.() && treeModel) ? treeModel.getMaxDepth() : 1;\n\t\tconst headerHeight = typeof optionHandler.getTotalColumnHeaderHeight === 'function'\n\t\t\t? optionHandler.getTotalColumnHeaderHeight(maxDepth)\n\t\t\t: optionHandler.getColumnHeaderHeight({});\n\t\tconst pinnedTopHeight = this.recordHandler.getTopHandler().getTotalHeight();\n\n\t\tlet height = 0;\n\t\tif (headerHeight > 0) { height += headerHeight + 1; }\n\t\tif (pinnedTopHeight > 0) { height += pinnedTopHeight + 1; }\n\n\t\tthis.setStickyTopTop(height);\n\t}\n\n\tprivate addRowDragListener(): void {\n        this.rowDragHandler = this.createManagedBean(new RowDragHandler(this.eBodyViewPortContainer));\n\t\tconst bodyRowDraggerHandler = this.createManagedBean(new BodyRowDragger(document.body));\n        this.dragAndDropHandler.addDropTarget(this.rowDragHandler);\n\t\tthis.dragAndDropHandler.addDropTarget(bodyRowDraggerHandler);\n    }\n\n    public getRowDragFeature(): RowDragHandler {\n        return this.rowDragHandler;\n    }\n\n\tgetBodyViewPortContainer() {\n\t\treturn this.component.getBodyViewPortContainer();\n\t}\n\t\n\tgetGridScrollHolder(): HTMLElement {\n\t\treturn this.gridScrollHolder;\n\t}\n\n\tgetViewportWidth(): number {\n\t\treturn this.component.getOffsetWidth();\n\t}\n\n\tgetViewportHeight(): number {\n\t\treturn this.component.getOffsetHeight();\n\t}\n}\n","import { AutoWired, BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { NoRecordComponentWrapperType, NoRecordControllerType } from \"./no-record.types\";\nimport { GridUserComponentHandler } from \"../../../Core/Components/UserComponentHandler\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { IRecordHandler } from \"../../../Core/Rows/RecordHandler.types\";\nimport { Events } from \"../../../Core/Constants/Events\";\nimport { IControllerHandler } from \"../../../Core/Interface/IControllerHandler\";\n\nexport class NoRecordController extends EventEmitter implements NoRecordControllerType {\n    @AutoWired(BEAN_NAME.USER_COMPONENT_HANDLER) private userComponentHandler : GridUserComponentHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler : IControllerHandler;\n    private component : NoRecordComponentWrapperType | null = null;\n    setComponent(component: NoRecordComponentWrapperType): void {\n        this.component = component;\n        this.addClassNames();\n        this.controllerHandler.registerNoRecordFoundCOntroller(this);\n        this.addListener(this.eventHandler, 'EVENT_RECORD_UPDATED', this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_RECORD_INSERTED', this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_RECORD_REMOVED', this.setRendererDetails.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_DATA_LOADED, this.setRendererDetails.bind(this));\n    }\n\n    getElement(): HTMLElement {\n        return this.component.getElement();\n    }\n\n    private addClassNames() : void {\n        this.component.addOrRemoveCssClass('ZG-no-record-container', true);\n    }\n\n    private setRendererDetails() {\n        const centerHandler   = this.recordHandler.getMiddleHandler();\n        const rowCount        = centerHandler.getRowCount();\n        if(rowCount === 0) {\n            const rendererDetails = this.userComponentHandler.getNoRecordRendererDetails({});\n            this.component.setRendererDetails(rendererDetails);\n        }else {\n            this.component.setRendererDetails(undefined);\n        }\n\n        this.component.addOrRemoveCssClass('ZG-hide', rowCount !== 0);\n    }\n\n}","import { AutoWired, BEAN_NAME, clearElement, Component, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { NoRecordComponentType, NoRecordComponentWrapperType } from \"./no-record.types\";\nimport { NoRecordController } from \"./no-record-controller\";\nimport { UserComponentDetails } from \"../../../Core/Components/UserComponentHandler\";\nimport { IBaseComponent } from \"../../../Main\";\nimport { removeFromParent } from \"../../../Core/utils/Dom\";\n\nfunction getTemplate() {\n    const div = document.createElement('div');\n    return div;\n}\nexport class NoRecordComponent extends Component implements NoRecordComponentType {\n\n    private renderer : IBaseComponent<any>;\n    private rendererElement : HTMLElement;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    @PostConstruct()\n    init() {\n        this.setTemplate(getTemplate());\n        const component : NoRecordComponentWrapperType = {\n            getElement         : () => this.getGui(),\n            addOrRemoveCssClass: (className : string, force : boolean) => this.addOrRemoveCssClass(className, force),\n            setRendererDetails : (renderDetails : UserComponentDetails) => this.setRenderDetails(renderDetails)\n        }\n\n        const controller = this.createManagedBean(new NoRecordController());\n        controller.setComponent(component);\n    }\n\n    private setRenderDetails(renderDetails : UserComponentDetails) : void {\n        this.destroyRenderer();\n        if(renderDetails) {\n            const callBack = this.afterRenderer.bind(this);\n            const componentInstance = renderDetails.newInstance();\n            if(componentInstance) {\n                componentInstance.then(callBack);\n            }\n        }\n    }\n\n    private afterRenderer(renderer: IBaseComponent<any>) {\n        this.renderer = renderer;\n        this.rendererElement = renderer.getElement?.() ?? null;\n        if (this.rendererElement) {\n            const parentElement = this.getGui();\n            clearElement(parentElement);\n            parentElement.appendChild(this.rendererElement);\n        }\n\t}\n\n    private destroyRenderer(): void {\n        const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n        this.renderer = context.destroyBean(this.renderer);\n        removeFromParent(this.rendererElement);\n        this.rendererElement = null;\n        this.renderer        = null;\n    }\n\n\n}","\nimport { AutoWired, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { ColumnBufferHandler } from \"../../../Core/Buffer/column/ColumnBufferHandler\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\nimport { Events } from \"../../../Core/Constants/Events\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\n\nexport class CenterWidthHandler extends EventEmitter {\n\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private columnModel !: FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.COLUMN_BUFFER_HANDLER) private columnBufferHandler : ColumnBufferHandler;\n\n    constructor( private readonly callback: (width: number) => void, private readonly addSpacer: boolean = false ) {\n        super();\n    }\n\n    @PostConstruct()\n    init(): void {\n        const listener = this.setWidth.bind(this);\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, listener);\n        this.addListener(this.eventHandler, Events.EVENT_LEFT_PINNED_WIDTH_CHANGED, listener);\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_BUFFER_CONTAINER_WIDTH_CHANGED, listener);\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_HIDE, listener);\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_SHOW, listener);\n        this.setWidth();\n    }\n\n    private setWidth(): void {\n        const {columnModel, columnBufferHandler} = this;\n        \n        const centerWidth = columnModel.getBodyContainerWidth();\n        const leftWidth   = columnModel.getDisplayedColumnsLeftWidth();\n        const rightWidth  = columnModel.getDisplayedColumnsRightWidth();\n\n        const columnBufferItem = columnBufferHandler.getColumnBufferItem();\n        const columnBufferWidth = columnBufferItem.getWidth();\n\n        let totalWidth: number;\n\n        totalWidth = centerWidth + columnBufferWidth;\n\n        if (this.addSpacer) {\n            const relevantWidth = this.optionsHandler.isRTL() ? leftWidth : rightWidth;\n            if (relevantWidth === 0) {\n                totalWidth += this.optionsHandler.getScrollbarWidth();\n            }\n        }\n\n\n        this.callback(totalWidth);\n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter, Optional, PostConstruct } from \"@dg/corecomponent\";\nimport { IRangeSelectionHandler } from \"../../../../rangeselection/range-selection-handler.types\";\nimport { IDragEventParams, IDragHandler, IDragSource } from \"../../../../drag-handler/drag-core-handler.types\";\nimport { GridOptioHandler } from \"../../../Core/GridOptionHandler\";\n\nexport class DragContainerHandler extends EventEmitter {\n    @AutoWired('dragHandler') private dragService: IDragHandler;\n    @Optional('rangeSelectionHandler') private rangeService?: IRangeSelectionHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: GridOptioHandler;\n\n    private container: HTMLElement;\n    private params: IDragSource;\n\n    constructor(container: HTMLElement) {\n        super();\n        this.container = container;\n    }\n\n\n    @PostConstruct()\n    public postConstruct(): void {\n        if (!this.rangeService) {\n            return;\n        }\n\n        this.params = {\n            container  : this.container,\n            onDragStart: (params : IDragEventParams) => {\n                this.rangeService.onDragStart(params.event as MouseEvent)\n            },\n            onDragStop :  (params : IDragEventParams) => {\n                this.rangeService.onDragStop(params.event as MouseEvent)\n            },\n            onDragging :  (params : IDragEventParams) => {\n                this.rangeService.onDragging(params.event as MouseEvent)\n            },\n            shouldPreventMouseEvent : () => false,\n            getRootNode : () => window,\n            includeTouch : false\n        };\n\n        this.addDestroyFunc(() => this.disableRangeSelection());\n\n        const isRangeSelection = this.optionsHandler.isRangeSelectionEnabled();\n        if (isRangeSelection) {\n            this.enableRangeSelection();\n        }\n    }\n\n    private enableRangeSelection() {\n        this.dragService.addDragSource(this.params);\n    }\n\n    private disableRangeSelection() {\n        this.dragService.removeDragSource(this.params);\n    }\n}\n","import { Events } from \"../../../Core/Constants/Events\";\nimport { RowBufferHandler } from \"../../../Core/Buffer/row/RowBufferHandler\";\nimport { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\n\nexport class HeightContainerHandler extends EventEmitter {\n\n    private eContainer: HTMLElement;\n    private eViewport: HTMLElement | undefined;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    constructor(eContainer: HTMLElement, eViewport?: HTMLElement) {\n        super();\n        this.eContainer = eContainer;\n        this.eViewport = eViewport;\n    }\n\n\n    @PostConstruct()\n    init(): void {\n        this.addListener(this.eventHandler, Events.EVENT_ROW_CONTAINER_HEIGHT_CHANGED, this.onHeightChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_PLUS_CONTAINER_HEIGHT_CHANGED, this.onHeightChanged.bind(this))\n    }\n\n    private onHeightChanged(): void {\n        const recordHandler  = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        const rowPlusHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_BUFFER_HANDLER) as RowBufferHandler;\n        const extraRowHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.EXTRA_RECORD_HANDLER);\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\n        const rowPlusItem      = rowPlusHandler.getrowBufferItem();\n\n        const rowPlusHeight    = rowPlusItem.getHeight() ?? 0;\n        const centerRowHandler = recordHandler.getMiddleHandler();\n        const height           = centerRowHandler.getTotalHeight();\n        const extraRowHeight   =  optionHandler.getIsExtraRow() ? extraRowHandler.getRowHeight() : 0;\n        const heightInPixel    = height != null ? `${height + rowPlusHeight + extraRowHeight}px` : ``;\n\n        this.eContainer.style.height = heightInPixel;\n        if (this.eViewport) {\n            this.eViewport.style.height = heightInPixel;\n        }\n    }\n}","\nimport { AutoWired, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { PinnedHandler } from \"../../../../Core/Columns/PinnedHandler\";\nimport { GRID_BEAN_NAME } from \"../../../../Core/Constants/BeanName\";\nimport { Events } from \"../../../../Core/Constants/Events\";\nimport { setDisplayed, setFixedWidth } from \"../../../../Core/utils/Dom\";\n\nclass LeftPinnedHandler extends EventEmitter {\n\t@AutoWired(GRID_BEAN_NAME.PINNED_HANDLER) private pinndedHandler!: PinnedHandler;\n\tprivate element: HTMLElement;\n\n\tconstructor(element: HTMLElement) {\n\t\tsuper();\n\t\tthis.element = element;\n\t}\n\n\t@PostConstruct()\n\tpostConstruct(): void {\n\t\tthis.addListener(\n\t\t\tthis.eventHandler,\n\t\t\tEvents.EVENT_LEFT_PINNED_WIDTH_CHANGED,\n\t\t\tthis.onPinnedLeftWidthChanged.bind(this),\n\t\t);\n\t}\n\n\tprivate onPinnedLeftWidthChanged() {\n\t\tconst leftWidth = this.pinndedHandler.getLeftWidth();\n\t\tconst displayed = leftWidth > 0;\n\t\tsetDisplayed(this.element, displayed);\n\t\tsetFixedWidth(this.element, leftWidth);\n\t}\n\n\tgetWidth(): number {\n\t\treturn this.pinndedHandler.getLeftWidth();\n\t}\n}\n\nexport {\n    LeftPinnedHandler\n}","import { AutoWired, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { PinnedHandler } from \"../../../../Core/Columns/PinnedHandler\";\nimport { Events } from \"../../../../Core/Constants/Events\";\nimport { setDisplayed, setFixedWidth } from \"../../../../Core/utils/Dom\";\nimport { GRID_BEAN_NAME } from \"../../../../Core/Constants/BeanName\";\n\nclass RightPinnedHandler extends EventEmitter {\n\t@AutoWired(GRID_BEAN_NAME.PINNED_HANDLER) private pinndedHandler!: PinnedHandler;\n\tprivate element: HTMLElement;\n\n\tconstructor(element: HTMLElement) {\n\t\tsuper();\n\t\tthis.element = element;\n\t}\n\n\t@PostConstruct()\n\tpostConstruct(): void {\n\t\tthis.addListener(\n\t\t\tthis.eventHandler,\n\t\t\tEvents.EVENT_RIGHT_PINNED_WIDTH_CHANGED,\n\t\t\tthis.onPinnedRightWidthChanged.bind(this),\n\t\t);\n\t}\n\n\tprivate onPinnedRightWidthChanged() {\n\t\tconst leftWidth = this.pinndedHandler.getRightWidth();\n\t\tconst displayed = leftWidth > 0;\n\t\tsetDisplayed(this.element, displayed);\n\t\tsetFixedWidth(this.element, leftWidth);\n\t}\n\n\tgetWidth(): number {\n\t\treturn this.pinndedHandler.getRightWidth();\n\t}\n}\n\nexport {\n    RightPinnedHandler\n}","\nimport { AutoWired, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { PinnedHandler } from \"../../../../Core/Columns/PinnedHandler\";\nimport { Events } from \"../../../../Core/Constants/Events\";\nimport { setDisplayed, setFixedWidth } from \"../../../../Core/utils/Dom\";\nimport { GRID_BEAN_NAME } from \"../../../../Core/Constants/BeanName\";\n\nclass RowHeaderHandler extends EventEmitter {\n\n    @AutoWired(GRID_BEAN_NAME.PINNED_HANDLER) private pinndedHandler !: PinnedHandler;\n    private element: HTMLElement;\n\n    constructor(element : HTMLElement) {\n        super();\n        this.element = element;\n    }\n\n    @PostConstruct()\n    postConstruct() : void {\n        this.addListener(this.eventHandler, Events.EVENT_HEADER_WIDTH_CHANGED, this.onHeaderWidthChanged.bind(this));\n    }\n\n    private onHeaderWidthChanged() {\n        const leftWidth = this.pinndedHandler.getHeaderWidth();\n        const displayed = leftWidth > 0;\n        setDisplayed(this.element, displayed);\n        setFixedWidth(this.element, leftWidth);\n    }\n\n    getWidth(): number {\n\t\treturn this.pinndedHandler.getHeaderWidth();\n\t}\n    \n}\n\nexport {\n    RowHeaderHandler\n}","import { CellEditorPopupPosition, IColumnNode } from '../../../../../Core/Interface/IColumnNode';\nimport { IRowNode } from '../../../../../Core/Interface/IRowNode';\nimport { getWrapperTemplate, removeFromParent, toggleAttribute } from '../../../../../Core/utils/Dom';\nimport { clearElement } from '../../../../../Core/utils/Dom';\nimport { RowContainerType } from '../../utils/type';\nimport { ICellControllerWrapper } from './CellControllerWrapper';\nimport { ICellComponent } from './ICellComponent';\nimport { ICellRendererComponent } from '../../../../Interface/CellRenderer/ICellRendererComponent';\nimport { ICellEditorComponent } from '../../../../Interface/CellEditor/ICellEditorComponent';\nimport { UserComponentDetails } from '../../../../../Core/Components/UserComponentHandler';\nimport { PopupComponentPositionParams, PopupHandler } from '../../../../../Core/PopupHandler';\nimport { GridOptioHandler } from '../../../../../Core/GridOptionHandler';\nimport { PopupEditorWrapper } from './Editor/PopupEditorWrapper';\nimport { UserPresence } from '../../../../../../../userpresence/core/src/UserPresence';\nimport { IUserPresence } from '../../../../../../../userpresence/core/src/DataHandler/Interface/IUserPresenceConfig';\nimport { escapeString } from '../../../../../Core/utils/Generic';\nimport { ICellPosition, ICellUserPresenceParams } from './CellController';\nimport { BEAN_NAME, Component, Context, getBeanInstanceByBeanName, setAriaColIndex, setAriaLabel } from '@dg/corecomponent';\nimport { GRID_BEAN_NAME } from '../../../../../Core/Constants/BeanName';\nimport { IControllerHandler } from '../../../../../Core/Interface/IControllerHandler';\nimport { IAPIErrorHandler } from '../../../../../API/APIErrorHandler';\nimport { IGridCellEditorHandler } from '../../../../Editor/GridCellEditorHandler';\nimport { IColumnAutofitHandler } from '../../../../../../Autofit/ColumnAutofit/column-autofitHandler.types';\nimport { CellFocusParams, IFocusHandler } from '../../../../../Core/Navigation/focus-handler.types';\nimport { ICellInnerNavigationController } from './CellInnerNavigationController';\nimport { IGridLayoutPositionHandler } from 'Grid/Core/Interface/IGridLayoutPositionHandler';\nimport { IStateHandler } from 'Grid/Core/Interface/IStateHandler';\nfunction getTemplate(): HTMLElement {\n\tconst div = document.createElement('div');\n\tdiv.classList.add('ZG-cell');\n\tdiv.setAttribute('role', 'gridcell');\n\treturn div;\n}\nclass CellComponent extends Component {\n\tcolumn            : IColumnNode;\n\trowNode           : IRowNode;\n\tgetBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\teRow              : HTMLElement;\n\tcellController    : ICellControllerWrapper;\n\n\tcellRendererElement: HTMLElement;\n\n\tprivate cellRenderer!: ICellRendererComponent;\n\tprivate type         : RowContainerType;\n\n\tprivate cellEditor : ICellEditorComponent;\n\n\tprivate cellEditorGui : HTMLElement;\n\n\tprivate hideEditorPopup : () => void;\n\n\tprivate cellEditorPopupWrapper : PopupEditorWrapper;\n\n\tprivate userPresenceInstance : UserPresence;\n\n\tprivate cellValueElement  : HTMLElement | undefined;\n\n\tprivate cellWrapperElement : HTMLElement;\n\n\tprivate cellRendererClass : any;\n\n\tprivate domRenderer : boolean;\n\n\tprivate errorHandler          : IAPIErrorHandler;\n\tprivate gridCellEditorHandler : IGridCellEditorHandler;\n\tprivate columnAutoFitHandler  : IColumnAutofitHandler;\n\tprotected optionsHandler      : GridOptioHandler;\n\tprivate focusController       : ICellInnerNavigationController;\n\tprivate innerCellNavigationCallback: any;\n\n\tprivate rendererVersion = 0;\n\n\tprivate editorVersion = 0;\n\n\tprivate element : HTMLElement | null = null;\n\n\tprivate isCellEditorPopup = false;\n\n\n\tconstructor( getBeanInstanceByBeanName: getBeanInstanceByBeanName, cellController: ICellControllerWrapper, eRow: HTMLElement, type: RowContainerType, ) {\n\t\tsuper();\n\t\tthis.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n\t\tthis.errorHandler              = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ERROR_HANDLER);\n\t\tthis.column                    = cellController.getColumn();\n\t\tthis.rowNode                   = cellController.getRowNode();\n\t\tthis.eRow                      = eRow;\n\t\tthis.type                      = type;\n\t\tthis.cellController            = cellController;\n\t\tthis.gridCellEditorHandler     = getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER);\n\t\tthis.columnAutoFitHandler      = getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_AUTOFIT_HANDLER);\n\t\tthis.optionsHandler            = getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\n\t\tthis.setTemplate(getTemplate());\n\n\t\tthis.init();\n\n        this.refreshWrapper(false, false);\n\n\t\tthis.setAccessibility();\n\n\n\t\tconst component: ICellComponent = {\n\t\t\tgetRowElement              : () => this.eRow,\n\t\t\tsetRendererDetails         : (component?: any, loading ?: boolean, forceRenderer ?: boolean) => this.setRendererDetails(component, loading, forceRenderer),\n\t\t\tgetType                    : () => this.type,\n\t\t\tgetElement                 : () => this.getGui(),\n\t\t\taddOrRemoveCssClass        : (className: string, force: boolean) => this.addOrRemoveCssClass(className, force),\n\t\t\tdetach                     : () => this.detach(),\n\t\t\tsetLoadingDetails          : (component: any, _loading ?: boolean) => this.setLoadingDetails(component),\n\t\t\tsetEditorDetails           : (component : any, popup : boolean, popupPosition : CellEditorPopupPosition) => this.setEditorDetails(component, popup, popupPosition),\n\t\t\tgetCellEditor              : () => this.getCellEditor(),\n\t\t\tsetUserPresenceDetails     : (userPresenceDetails : IUserPresence, params ?: ICellUserPresenceParams) => this.setUserPresenceDetails(userPresenceDetails, params),\n\t\t\tgetParentValueElement      : () => this.getParentValueElement(),\n\t\t\tgetCellRenderer            : () => this.cellRenderer,\n\t\t\tgetCellValueElement        : () => this.getCellValueElement(),\n\t\t\tafterGuiAttached           : () => this.afterGuiAttached(),\n\t\t\tsetDomRenderer             : (renderer : boolean) => this.setDomRenderer(renderer),\n\t\t\tcloseUserPresenceDropdown  : () => this.onCloseUserPresenceDropDown(),\n\t\t\tupdateCellEditorDimensions : () => this.updateCellEditorDimensions(),\n\t\t\tsetInitialFocus           : () => this.setInitialFocus(),\n\t\t\tsetFocustoTrapElements    : (cellPosition : ICellPosition) => this.setFocustoTrapElements(cellPosition),\n\t\t\tremoveFocustoTrapElements : () => this.removeFocustoTrapElements(),\n\t\t\tgetCellEditorElement       : () => this.getCellEditorElement(),\n\t\t\tisCellEditorPopup          : () => this.isCellEditorPopup,\n\t\t};\n\n\t\tcellController.setComponent(component, this.getGui());\n\t}\n\n\tprivate setAccessibility() {\n\t\tconst columnKey = this.column.getColumnKey() as string;\n\n\t\tconst colIndex    = this.column.getIndex();\n\t\tconst value       = this.rowNode.getDataByKey(columnKey);\n\t\tconst cellElement = this.getGui();\n\n\t\tsetAriaLabel(cellElement, value);\n\t\tsetAriaColIndex(cellElement, colIndex + 1);\t\t//aria-colindex is 1-based\n\t}\n\n\tsetTemplate(element : HTMLElement) : void {\n\t\tthis.element = element;\n\t\t(this.element as any).Component = this;\n\t}\n\n\tgetGui() : HTMLElement {\n\t\treturn this.element;\n\t}\n\n\tsetGui(element : HTMLElement | null) {\n\t\tthis.element = element;\n\t}\n\n\t///editing start\n\tsetEditorDetails(component: UserComponentDetails, popup : boolean, popupPosition : CellEditorPopupPosition) : void {\n\t\tif (component) {\n\t\t\tthis.createCellEditorInstance(component, popup, popupPosition);\n\t\t} else {\n\t\t\tthis.destroyEditor();\n\t\t}\n\t}\n\n\tgetCellEditorElement() : HTMLElement {\n\t\treturn this.cellEditorGui;\n\t}\n\n\tcreateCellEditorInstance(component: UserComponentDetails, popup?: boolean, position?: 'over' | 'under'): void {\n\n\t\tif(this.userPresenceInstance) {\n\t\t\tthis.closeDropdown();\n\t\t}\n\n\t\tconst context                     = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n\n\t\tconst popupParams  = {\n\t\t\tgetParentElement : () => this.cellEditorPopupWrapper.getGui(),\n\t\t\tshowTooltip : (value : string) => this.cellController.openTooltip(this.cellEditorPopupWrapper.getGui(), value)\n\t\t} \n        const cellEditor = component.newInstance(popup ? popupParams: {});\n        if (!cellEditor) { return; } \n\t\tconst versionCopy = this.editorVersion;\n\n\t\tconst callback = (cellEditor, versionCopy) => {\n\t\t\tif(versionCopy !== this.editorVersion || this.isAlive() === false) {\n\t\t\t\tcontext.destroyBean(cellEditor);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.cellEditorPopupWrapper = context.createBean( new PopupEditorWrapper(component.params, this.cellController.getController()));\n\t\t\tconst { params } = component;\n\t\t\t\t\t\n\t\t\tconst editingCancelledByUserComp = cellEditor.isCancelBeforeStart && cellEditor.isCancelBeforeStart();\n\t\t\tif (editingCancelledByUserComp) {\n\t\t\t\tcontext.destroyBean(cellEditor);\n\t\t\t\t// this.cellController.stopEditing(true);\n\t\t\t\tthis.gridCellEditorHandler.stopEditing(true, null, false, true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!cellEditor.getElement) {\n\t\t\t\tcontext.destroyBean(cellEditor);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.cellEditor = cellEditor;\n\t\t\tthis.cellEditorGui = cellEditor.getElement();\n\n\t\t\tconst cellEditorInPopup = popup || (cellEditor.isPopup !== undefined && cellEditor.isPopup());\n\t\t\tif (cellEditorInPopup) {\n\t\t\t\tthis.addPopupCellEditor(params, position);\n\t\t\t\tthis.isCellEditorPopup = true;\n\t\t\t} else {\n\t\t\t\tthis.addInLineCellEditor();\n\t\t\t}\n\t\t\n\n\t\t\tif (cellEditor.afterElementAttached) {\n\t\t\t\tcellEditor.afterElementAttached();\n\t\t\t}\n\t\t}\n\t\tcellEditor.then((instance) => callback(instance, versionCopy))\n\n        \n\t\t\n    }\n\n\n\tgetCellEditor() {\n\t\treturn this.cellEditor;\n\t}\n\n\tdestroyEditor(): void {\n        const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n\t\t\n        if (this.hideEditorPopup) { \n\t\t\tconst popupCallback = this.hideEditorPopup;\n\t\t\tthis.hideEditorPopup = undefined;\n\t\t\tpopupCallback(); \n\t\t}\n\n        this.cellEditor = context.destroyBean(this.cellEditor);\n\t\tthis.cellEditorPopupWrapper = null;\n\t\tthis.isCellEditorPopup = false;\n\n        removeFromParent(this.cellEditorGui);\n        this.cellEditorGui = null;\n\t\tthis.editorVersion++;\n    }\n\n\taddInLineCellEditor() : void {\n        const eGui = this.getGui();\n\n\t\tconst optionHandler   = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst documentElement = optionHandler.getDocument();\n\t\tif (eGui.contains(documentElement.activeElement)) {\n\t\t\teGui.focus();\n\t\t}\n\n\t\tthis.destroyRenderer();\n\t\tclearElement(this.getGui());\n\n\t\tthis.refreshWrapper(false, true);\n\n\n\t\tconst parentValueElement = this.getParentValueElement();\n\n\t\tif(this.cellEditorGui) {\n\t\t\tparentValueElement.appendChild(this.cellEditorGui);\n\t\t\tthis.cellEditor.focus?.();\n\t\t}\n\t}\n\n\tupdateCellEditorDimensions() : void {\n\t\tif(this.cellEditorPopupWrapper){\n\t\t\tconst popupElement              = this.cellEditorPopupWrapper.getGui();\n\t\t\tconst gridLayoutPositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER) as IGridLayoutPositionHandler;\n\t\t\tconst width                     = gridLayoutPositionHandler ? gridLayoutPositionHandler.getCellWidth(this.rowNode, this.column, () => this.column.getWidth()) : this.column.getWidth();\n\t\n\t\t\tpopupElement.style.width     = `${width}px`;\n\t\t\tpopupElement.style.minHeight = `${this.rowNode.getHeight()}px`;\n\t\t}\n\t}\n\n\taddPopupCellEditor(_params: any, position?: 'over' | 'under'): void {\n\t\tconst popupElement                = this.cellEditorPopupWrapper.getGui();\n\t\tpopupElement.classList.add('ZG-cellEditorContainer', 'ZG-cellNotInlineEditing');\n\t\tconst gridLayoutPositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER) as IGridLayoutPositionHandler;\n\t\tconst width                     = gridLayoutPositionHandler ? gridLayoutPositionHandler.getCellWidth(this.rowNode, this.column, () => this.column.getWidth()) : this.column.getWidth();\n\t\t\n\t\tpopupElement.style.width  = `${width}px`;\n\t\tpopupElement.style.minHeight = `${this.rowNode.getHeight()}px`;\n\n        if (this.cellEditorGui) {\n            popupElement.appendChild(this.cellEditorGui);\n        }\n\n\t\tconst popupHandler  = this.getBeanInstanceByBeanName(BEAN_NAME.POPUP_HANDLER) as PopupHandler;\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\n        const positionToUse: CellEditorPopupPosition = position != null ? position  : 'over';\n        const isRtl = optionHandler.isRTL();\n\n        const positionParams: PopupComponentPositionParams = {\n\t\t\tpopUpElement    : popupElement,\n\t\t\tsourceElement   : this.getGui(),\n\t\t\tposition        : positionToUse,\n\t\t\talignSide       : isRtl ? 'right': 'left',\n\t\t\tkeepWithinBounds: true,\n\t\t};\n\n        const positionCallback = popupHandler.positionPopupByComponent.bind(popupHandler, positionParams);\n\n\n        const popupResponse = popupHandler.addPopup({\n            modal          : true,\n            childElement   : popupElement,\n            anchorToElement: this.getGui(),\n            positionCallback,\n\t\t\tariaLabel : 'cellEditor'\n        });\n\n        if (popupResponse) {\n\t\t\tthis.hideEditorPopup = popupResponse.hideFunction;\n\t\t}\n\t\tthis.cellEditor.focus?.();\n    }\n\n\t///editing end\n\n\n\tprivate setLoadingDetails(component: any): void {\n\t\tif (component) {\n\t\t\tthis.destroyRenderer();\n\t\t\t\n\t\t\tconst displayComponentVersionCopy = this.rendererVersion;\n\t\t\tconst callBack = this.afterRenderer.bind(this, true, displayComponentVersionCopy);\n\t\t\tconst componentInstance = component?.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callBack);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetController(): ICellControllerWrapper {\n\t\treturn this.cellController;\n\t}\n\n\tdetach() {\n\t\tif(this.eRow) {\n\t\t\tthis.eRow.removeChild(this.getGui());\n\t\t\tthis.setGui(null);\n\t\t\tthis.eRow = null;\n\t\t}\n\t}\n\n\tinit() {\n\t\ttoggleAttribute(this.getGui(), 'tabindex', -1);\n\t}\n\n\tdestroy(): void {\n\t\tsuper.destroy();\n\t\tthis.destroyRenderer();\n\t\tthis.destroyEditor();\n\n\t\tthis.cellValueElement       = null;\n\t\tthis.cellEditorGui          = null;\n\t\tthis.cellEditorGui          = null;\n\t\tthis.cellWrapperElement     = null;\n\t\tthis.cellEditorPopupWrapper = null;\n\t\tthis.cellRenderer           = null;\n\t\tthis.cellRendererClass      = null;\n\t\tthis.cellRendererElement    = null;\n\t\tthis.rowNode                = null;\n\t\tthis.column                 = null;\n\t\tthis.eRow                   = null;\n\t\tthis.cellController         = null;\n\t\tthis.type                   = null;\n\t\tthis.element                = null;\n\n\t}\n\n\tprivate destroyRenderer(): void {\n\t\tconst context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n\t\tthis.cellRenderer = context.destroyBean(this.cellRenderer);\n\t\tremoveFromParent(this.cellRendererElement);\n\t\tthis.cellRendererElement = null;\n\t\tthis.rendererVersion++;\n\t}\n\n\tgetCellRenderer() {\n\t\treturn this.cellRenderer;\n\t}\n\n\tafterGuiAttached() {\n\t\tthis.cellRenderer && this.cellRenderer.afterElementAttached && this.cellRenderer.afterElementAttached();\n\t}\n\n\tprivate setRendererDetails(component: any, loading : boolean = false, force : boolean = false) {\n\n\t\tif (component) {\n\t\t\tconst cellRendererRefresh = force ? false : this.refreshCellRenderer(component);\n\t\t\tif(!cellRendererRefresh) {\n\t\t\t\tthis.destroyRenderer();\n\t\t\t\t\n\t\t\t\tconst displayComponentVersionCopy = this.rendererVersion;\n\t\t\t\tconst callBack = this.afterRenderer.bind(this, loading, displayComponentVersionCopy);\n\t\t\t\tconst componentInstance = component?.newInstance();\n\t\t\t\tthis.cellRendererClass = component.componentClass\n\t\t\t\tif (componentInstance) {\n\t\t\t\t\tcomponentInstance.then(callBack);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\tthis.columnAutoFitHandler.onAfterCellRenderComplete(this);\n\t}\n\n\tprivate refreshCellRenderer(componentDetails: any): boolean {\n        if (this.cellRenderer == null || this.cellRenderer.refresh == null) { return false; }\n\n        if (this.cellRendererClass !== componentDetails.componentClass) { return false; }\n\n        const result = this.cellRenderer.refresh(componentDetails.params);\n\t\t\n        return result === true || result === undefined;\n    }\n\n\tinsertValueWithoutCellRenderer() {\n\t\tif (this.type == RowContainerType.HEADER) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.refreshWrapper(false, false);\n\n\t\tconst fieldName = this.column.getColumnKey() as string;\n\t\tconst data = this.rowNode.getRowData();\n\t\tconst value = data[fieldName];\n\n\t\tconst parentElement = this.getParentValueElement();\n        clearElement(parentElement);\n\n        const escapedValue = value != null ? escapeString(value) : null;\n        if (escapedValue != null) {\n            parentElement.textContent = escapedValue;\n        }\n\t}\n\n\tprivate afterRenderer(loading : boolean, cellRendererVersion : number,cellRenderer: ICellRendererComponent) {\n\t\tif (!this.isAlive() || cellRendererVersion !== this.rendererVersion) {\n\t\t\tconst context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT) as Context;\n\t\t\tcontext && context.destroyBean(cellRenderer);\n\t\t\treturn;\n\t\t}\n\t\ttry{\n\t\t\tthis.cellRenderer = cellRenderer;\n\t\t\tthis.refreshWrapper(loading, false);\n\t\t\t\n\t\t\t\n\t\t\tthis.cellRendererElement = cellRenderer.getElement?.() ?? null;\n\t\t\tif (this.cellRendererElement) {\n\t\t\t\tconst parentElement = this.getParentValueElement();\n\t\t\t\tclearElement(parentElement);\n\t\t\t\tparentElement.appendChild(this.cellRendererElement);\n\t\t\t\tthis.innerCellNavigationCallback = this.optionsHandler.getInnerCellNavigation();\n\t\t\t\tthis.domRenderer && this.afterGuiAttached();\n\t\t\t}\n\t\t}\n\t\tcatch(e){\n\t\t\tthis.errorHandler.throwError('cellRendererError',e);\n\t\t}\n\t}\n\n\tpublic setInitialFocus(): void {\n\t\tif(!this.isAlive()) { return; }\n\t\tthis.appendFocusElements();\n\t\tthis.focusController?.setInitialFocus(this.cellController, this.optionsHandler, this.getGui());\n\t}\n\n\n\tprivate appendFocusElements(): void {\n\t\tif(this.innerCellNavigationCallback){\n\t\t\tconst cellController   = this.cellController.getController();\n\t\t\tconst cellPosition     = cellController.getCellPosition();\n\t\t\tconst meta = {\n\t\t\t\trowIndex    : cellPosition ? cellPosition.rowIndex : null,\n\t\t\t\tcolumnIndex : cellPosition ? cellPosition.columnIndex : null,\n\t\t\t\tpinPosition : cellPosition ? cellPosition.pinPosition : null,\n\t\t\t\tcolumnId    : cellPosition ? cellPosition.columnID :  null,\n\t\t\t\tparentKeys : cellPosition ? cellPosition.parentKeys :  null\n\t\t\t};\n\n\t\t\tconst allowInnerNavigation = this.innerCellNavigationCallback(meta);\n\t\t\tif (allowInnerNavigation) {\n\t\t\t\tthis.constructFocusController();\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate constructFocusController(): void {\n\t\tthis.focusController    = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CELL_INNER_NAVIGATION_CONTROLLER);\n\t\tconst parentElement     = this.getParentValueElement();\n\t\tthis.focusController.focusDomAttacher(parentElement, this.getGui());\n\t\t\t\n\t}\n\n\tprivate setUserPresenceDetails(userPresenceDetails : IUserPresence, params ?: ICellUserPresenceParams) : void {\n\n\t\tif(params && params.destroy) {\n\t\t\tthis.destroyUserPresence();\n\t\t\treturn;\n\t\t}\n\n\t\tif (params && params.refresh) {\n\t\t\tif (this.userPresenceInstance) {\n\t\t\t\tthis.userPresenceInstance.api.updatePresence(\n\t\t\t\t\tuserPresenceDetails,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\n\t\tif(params && params.removed) {\n\t\t\tif(this.userPresenceInstance) {\n\t\t\t\tthis.userPresenceInstance.api.removeItemByID(params.id)\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(!this.userPresenceInstance) {\n\t\t\tconst controlHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\t\tconst gridController = controlHandler.getGridController();\n\t\t\tconst element        = gridController.getGui();\n\n\t\t\tuserPresenceDetails.dropDownNeeded = true;\n\t\t\t\n\t\t\tuserPresenceDetails.appendTo = element;\n\t\t\tuserPresenceDetails.onAfterClose = (event) => {\n\t\t\t\tconst focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\t\t\tconst focusedCell = focusHandler.getFocusedCellPosition();\n\t\t\t\tif(!focusedCell) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst params : CellFocusParams = {\n\t\t\t\t\t...focusedCell,\n\t\t\t\t\teventOrigin : 'ui',\n\t\t\t\t\tevent\n\t\t\t\t}\n\t\t\t\tfocusHandler.setFocusedCell(params, false);\n\t\t\t}\n\t\t\tuserPresenceDetails.onAfterOpen = () => {\n\t\t\t\tconst stateHandler = this.getBeanInstanceByBeanName('stateHandler') as IStateHandler;\n\t\t\t\tstateHandler && stateHandler.setUserPresenceActive(this.cellController.getController().getCellPosition());\n\t\t\t}\n\t\t\tthis.userPresenceInstance = new UserPresence(this.getGui(), userPresenceDetails)\n\t\t}\n\t}\n\n\tprivate destroyUserPresence() : void {\n\t\tif(this.userPresenceInstance) {\n\t\t\tthis.userPresenceInstance.api.destroy();\n\t\t\tthis.userPresenceInstance = null;\n\t\t}\n\t}\n\n\tprivate closeDropdown() : void {\n\t\tif(this.userPresenceInstance) {\n\t\t\tthis.userPresenceInstance.api.closeDropdown();\n\t\t\tthis.userPresenceInstance = null;\n\t\t}\n\t}\n\n\tprivate refreshWrapper(loading : boolean, editing : boolean) : void {\n\n\n\t\tconst apprendWrapper = editing && this.cellWrapperElement == null;\n\n\t\tif(apprendWrapper) {\n\t\t\tthis.cellWrapperElement = getWrapperTemplate(\"ZG-cellEditorContainer\");\n\t\t\tthis.cellWrapperElement.classList.add('ZG-cellInlineEditing');\n\t\t\tthis.getGui().appendChild(this.cellWrapperElement);\n\t\t}\n\n\t\tconst removeWrapper = !editing && this.cellWrapperElement != null;\n\n\t\tif(removeWrapper) {\n\t\t\tremoveFromParent(this.cellWrapperElement);\n\t\t\tthis.cellWrapperElement = null;\n\t\t}\n\n\n\t\tconst removeCellValue = loading && this.cellValueElement != null;\n\t\tif (removeCellValue) {\n\t\t\tremoveFromParent(this.cellValueElement);\n\t\t\tthis.cellValueElement = null;\n\t\t}\n\n\n\t\tconst removeCellValueEditorOpen = editing && this.cellValueElement != null;\n\n\t\tif(removeCellValueEditorOpen) {\n\t\t\tremoveFromParent(this.cellValueElement);\n\t\t\tthis.cellValueElement = null;\n\t\t}\n\t\t\n\t\tconst appendCellValue = !editing && !loading && this.cellValueElement == null;\n\t\tif(appendCellValue){\n\t\t\tthis.cellValueElement = getWrapperTemplate('ZG-cellValue');\n\t\t\tthis.getGui().appendChild(this.cellValueElement);\n\t\t}\n\t\t\n\t}\n\n\tprivate getParentValueElement(): HTMLElement {\n        if (this.cellValueElement) {\n            return this.cellValueElement;\n        }\n\n\t\tif(this.cellWrapperElement) {\n\t\t\treturn this.cellWrapperElement;\n\t\t}\n\n        return this.getGui();\n    }\n\n\tprivate getCellValueElement(): HTMLElement {\n\t\treturn this.cellValueElement;\n\t}\n\n\tprivate setDomRenderer(renderer : boolean) : void {\n\t\tthis.domRenderer = renderer;\n\t}\n\n\tprivate onCloseUserPresenceDropDown() : void {\n\t\tthis.userPresenceInstance && this.userPresenceInstance.api.closeDropDown();\n\t}\n\n\tpublic setFocustoTrapElements(cellPosition : ICellPosition) : void {\n\t\tthis.constructFocusController();\n\t\tthis.focusController.setFocustoTrapElements(cellPosition);\n\t}\n\n\tremoveFocustoTrapElements() : void {\n\t\tthis.constructFocusController();\n\t\tthis.focusController.removeFocustoTrapElements();\n\t}\n}\n\n\n\n\nexport{\n\tCellComponent\n}\n","import { ColumnHoverHandler } from '../../../../../Core/ColumnHoverHandler';\nimport { COLUMN_NODE_EVENTS, EDIT_EVENTS, GRID_USER_PRESENCE_EVENTS } from '../../../../../Core/Constants/Events';\nimport { rowPinPositions } from '../../../../../Core/Constants/GridConfigurationConstants';\nimport { GridOptioHandler } from '../../../../../Core/GridOptionHandler';\nimport { CellEditorPopupPosition, IColumnNode } from '../../../../../Core/Interface/IColumnNode';\nimport { IRowNode } from '../../../../../Core/Interface/IRowNode';\nimport { RowContainerType } from '../../utils/type';\nimport { IRegisterRowSelection, RowController, RowType } from '../Row/RowController';\nimport { CellStyle } from './CellStyle';\nimport { ICellComponent } from './ICellComponent';\nimport { IFocusEventParam } from '../../../../Interface/Events/IFocusEventParam';\nimport { ICellEventParam } from '../../../../Interface/Events/ICellEventComponent';\nimport { ICellEditorParams } from '../../../../Interface/CellEditor/ICellEditorParam';\nimport { UserPresenceHandler } from '../../../../../Core/UserPresence/UserPresenceHandler';\nimport { UserPresenceItem } from '../../../../../Core/UserPresence/UserPresenceItem';\nimport { IUserPresence } from '../../../../../../../userpresence/core/src/DataHandler/Interface/IUserPresenceConfig';\nimport { IUserPresenceEventParams } from '../../../../../Core/UserPresence/Interface/IUserPresenceEventParams';\nimport { RowRenderController } from '../../../../../Core/Rows/RowRenderController';\nimport { ICellRendererComponent } from '../../../../Interface/CellRenderer/ICellRendererComponent';\nimport { BEAN_NAME, EventEmitter, getBeanInstanceByBeanName} from '@dg/corecomponent';\nimport { GRID_BEAN_NAME } from '../../../../../Core/Constants/BeanName';\nimport { GridUserComponentHandler } from '../../../../../Core/Components/UserComponentHandler';\nimport { Tooltip } from '../../../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Tooltip';\nimport { IControllerHandler } from '../../../../../Core/Interface/IControllerHandler';\nimport { IAPIHandler } from '../../../../../Interface/IAPIHandler';\nimport { ICellAPIManager, ICellEditorComponent, ICellRendererParams, IGridAPI } from '../../../../../Main';\nimport { ITooltipConfiguration } from '../../../../../../../Sub_Components/src/fieldcomponents/dg-base/src/Tooltip/src/Interface/ITooltipConfiguration';\nimport { KeyBoardKeyCode } from '../../../../../Core/Navigation/KeyBoardEventKeys';\nimport { NavigationService } from '../../../../../../Navigation/navigation-handler';\nimport { CellFocusParams, IFocusHandler } from '../../../../../Core/Navigation/focus-handler.types';\nimport { IRangeSelectionHandler } from '../../../../../../rangeselection/range-selection-handler.types';\nimport { ICellRangeHandler } from '../../../../../../rangeselection/cell-range-handler.types';\nimport { INavigationHandler } from '../../../../../Core/Navigation/navigation-handler.types';\nimport { IRowSelectionHandler } from '../../../../../../Selection/row-selection-handler.types';\nimport { EventHandler } from '../../../../../../../Sub_Components/src/Utilities/EventHandler/EventHandler';\nimport { IDragSourceConfig } from '../../../../../../DragAndDrop-handler/dragAndDrop-handler.types';\nimport { IRowDragItem, IRowReoderParams } from '../../../../../../row-drag-handler/row-drag-handler';\nimport { IGridCellEditorHandler } from '../../../../Editor/GridCellEditorHandler';\nimport { IColumnSelection } from '../../../../../../Selection/column-selection.types';\nimport { areArraysEqual } from '../../../../../Core/utils/Object';\nimport { CellComponent } from './CellComponent';\nimport { IEscapeHandler } from '../../../../../../../Sub_Components/src/Utilities/EscapeHandler.types';\nimport { FieldHandler } from '../../../../../Core/Columns/FieldHandler';\nimport { CellPositionHandler } from './CellPositionHandler';\nimport { IStateHandler } from 'Grid/Core/Interface/IStateHandler';\n\nexport interface ICellPosition {\n\trowIndex        : number;\n\tcolumnIndex     : number;\n\tcolumnID        : string;\n\trowID           : string;\n\tpinPosition     : rowPinPositions;\n\tabsoluteRowIndex: number;\n\tparentKeys      : string[];\n}\n\n\nexport interface ICellUserPresenceParams {\n\tdestroy?: boolean;\n\trefresh?: boolean;\n\tremoved?: boolean;\n\tid     ?: string;\n}\n\nlet instanceIdSequence = 0;\nexport class CellController extends EventEmitter {\n\tstatic DOM_KEY_CELL_CTRL = 'cellController';\n\n\tpublic component!               : ICellComponent;\n\tprotected column                   : IColumnNode;\n\tprotected rowNode                  : IRowNode;\n\tprotected getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\tprotected instanceID               : string;\n\n\tprotected isCellRenderer: boolean;\n\tprotected cellPosition  : ICellPosition;\n\tprotected cellStyle     : CellStyle;\n\tprivate   rowController : RowController;\n\n\tprivate tooltipComponent  : Tooltip;\n\tprivate editorTooltipComponent : {\n\t\tid : string,\n\t\tinstance : Tooltip\n\t} | null;\n\n\tprivate editing               : boolean;\n\tprivate rowRendererController : RowRenderController;\n\n\tprivate cellRangeHandler : ICellRangeHandler;\n\n\tprivate type                  : string;\n\tprivate gridCellEditorHandler : IGridCellEditorHandler;\n\n\tprivate value: any;\n\n\tprotected cellPositionHandler : CellPositionHandler;\n\tprivate defaultRowDragSource : IDragSourceConfig<IRowDragItem>;\n\n\tprivate addRowSelectionDestroyCallback : CallableFunction[] = [];\n\tprivate cellWidthChangeCallback: (width: number) => any;\n\n\tconstructor(column: IColumnNode,rowNode: IRowNode,rowController: RowController,getBeanInstanceByBeanName: getBeanInstanceByBeanName, type : string) {\n\t\tsuper();\n\t\tthis.column = column;\n\t\tthis.rowNode = rowNode;\n\t\tthis.rowController = rowController;\n\t\tthis.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n\n\t\tthis.type = type;\n\n\t\t// const columnDefinition = column.getColumnDefinition();\n\n\t\tthis.isCellRenderer = column.getRenderer() != null || column.getCellRendererSelector() != null;\n\t\tthis.instanceID = this.generateID(column);\n\n\t\t// this.createCellPosition();\n\n\t\tthis.cellStyle = new CellStyle(this, this.getBeanInstanceByBeanName);\n\t\tthis.cellPositionHandler = new CellPositionHandler(this.column, this.rowNode, this.getBeanInstanceByBeanName);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.cellStyle?.destroy();\n\t\t\tthis.cellStyle = null;\n\n\t\t\tthis.cellPositionHandler?.destroy();\n\t\t\tthis.cellPositionHandler = null;\n\t\t});\n\t}\n\n\tprivate generateID(column: IColumnNode): string {\n\t\treturn `${column.getID()}-${instanceIdSequence++}`;\n\t}\n\n\tsetComponent(component: ICellComponent) {\n\t\tthis.component = component;\n\n\t\tthis.cellStyle.setComponent(component);\n\t\tthis.cellPositionHandler.setComponent(component.getElement());\n\n\t\tthis.createCellPosition();\n\n\t\tthis.attachDom();\n\n\t\tthis.addHoverListener();\n\n\t\tthis.onColumnHover();\n\n\t\tthis.addDomData();\n\n\t\tthis.onLeftChanged();\n\n\t\tthis.onWidthChanged()\n\n\t\tthis.setUserPresence({\n\t\t\tforceNewRenderer: true,\n\t\t\trefresh         : false,\n\t\t\tdestroy         : false,\n\t\t\trow             : this.cellPosition.rowID,\n\t\t\tcolumn          : this.cellPosition.columnID,\n\t\t\ttype            : ''\n\t\t});\n\n\n\t\t// this.registerTooltip();\n\n\t\tthis.onCellFocused(false, false);\n\n\t\tthis.addRangeSelection(component);\n\n\t\tthis.onColumnSelectionChanged();\n\n\t\tthis.registerHighlightColumnOnDrag();\n\n\t\tthis.gridCellEditorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER);\n\n        this.addListener(this.column, COLUMN_NODE_EVENTS.EVENT_COLUMN_DEFINITION_CHANGED, () => this.refreshCell({force : true}));\n        this.addListener(this.column, 'EVENT_COLUMN_DRAGGING', () => this.component.addOrRemoveCssClass('ZG-column-dragging', this.column.isDragging()));\n\n\t\tthis.addFirstColumnClass();\n\t\tthis.addLastColumnClass();\n\t\tthis.addRightPinnedColumnClass();\n\t\tthis.addLeftPinnedColumnClass();\n\t\tthis.addCenterPinnedColumnClass();\n\t\tthis.addGroupClassname();\n\n\t\tthis.applyFindClasses();\n\n\t}\n\n\tprivate addGroupClassname() : void {\n\t\tthis.component.addOrRemoveCssClass(\"ZG-groupingHeaderCell\", this.rowNode.isGroupRow());\n\t}\n\n\tpublic setFindActive(active: boolean): void {\n\t\tthis.component.addOrRemoveCssClass(\"dg-cell-find-active\", active);\n\t}\n\n\tpublic setFindMatched(matched: boolean): void {\n\t\tthis.component.addOrRemoveCssClass(\"dg-cell-find-match\", matched);\n\t}\n\n\tprivate applyFindClasses(): void {\n\t\tconst findHandler = this.getBeanInstanceByBeanName('gridFindHandler', true) as any;\n\t\tif (!findHandler || !this.cellPosition) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof findHandler.isCellMatched === 'function') {\n\t\t\tthis.setFindMatched(findHandler.isCellMatched(this.cellPosition));\n\t\t}\n\n\t\tif (typeof findHandler.isCellActive === 'function') {\n\t\t\tthis.setFindActive(findHandler.isCellActive(this.cellPosition));\n\t\t}\n\t}\n\n\tprotected registerHighlightColumnOnDrag() : void {\n\t\tthis.addListener(this.column, COLUMN_NODE_EVENTS.EVENT_COLUMN_HIGHLIGHT_CHANGE, this.highlightColumn.bind(this));\n\t}\n\n\tprivate highlightColumn() : void {\n\t\tif(!this.rowNode.isLoaded())  {\n\t\t\treturn;\n\t\t}\n\t\t\tconst highlight = this.column.getHighlight();\n\t\t\tconst aboveOn = highlight === 'left';\n\t\t\tconst BelowOn = highlight === 'right';\n\t\t\tthis.component.addOrRemoveCssClass('ZG-colHighlight-left', aboveOn);\n\t\t\tthis.component.addOrRemoveCssClass('ZG-colHighlight-right', BelowOn);\t\n\n\t}\n\n\tprivate addRangeSelection(component : ICellComponent) : void {\n\t\tconst rangeSelectionHandler = this.getBeanInstanceByBeanName('rangeSelectionHandler') as IRangeSelectionHandler;\n\t\tif(rangeSelectionHandler) {\n\t\t\tthis.cellRangeHandler = rangeSelectionHandler.createCellRangeHandler( this.getBeanInstanceByBeanName,this);\n\t\t\tthis.cellRangeHandler.setComponent(component);\n\t\t\tthis.addDestroyFunc(() => {\n\t\t\t\tthis.cellRangeHandler.destroy();\n\t\t\t\tthis.cellRangeHandler = null;\n\t\t\t})\n\t\t}\n\t\t\n\t}\n\n\n\tgetEditStartHookName() : string {\n\t\treturn EDIT_EVENTS.EVENT_CELL_EDIT_START;\n\t}\n\n\tgetEditStopHookName() : string {\n\t\treturn EDIT_EVENTS.EVENT_CELL_EDIT_STOPPED;\n\t}\n\n\tregisterDragElement(dragElement : HTMLElement) : void {\n\t\t// this.addListener(dragElement, 'mousedown', this.onRowReorderMouseDown.bind(this));\n\t\tconst rowReorderListener = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_REORDER_COMPONENT_HANDLER);\n\t\trowReorderListener.registerDragElement(dragElement);\n\t}\n\n\tregisterColumnDragElement(dragElement : HTMLElement) : void {\n\t\tthis.addListener(dragElement, 'mousedown', this.onColumnReorderMouseDown.bind(this));\n\t}\n\n\tprivate onColumnReorderMouseDown(_event : MouseEvent) : void {\n\t\t// const navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER ) as NavigationHandler;\n\t\t// navigation.onColumnReorderMouseDown(event);\n\n\t}\n\n\tregisterTooltip(value ?: string, shouldShowTooltip ?: () => boolean) : void {\n\t\tthis.disableTooltip();\n\t\tthis.enableTooltip(value, shouldShowTooltip);\n\t\tthis.addDestroyFunc(() => this.disableTooltip());\n\t}\n\n\n\tprivate registerEditorTooltip() : void {\n\t\tthis.destroyEditorToolTip();\n\t\tthis.enableEditorToolTip();\n\t\tthis.addDestroyFunc(() => this.destroyEditorToolTip());\n\t}\n\t\n\n\tprotected addDomData(): void {\n\t\tconst element = this.component.getElement();\n\t\tconst optionHandler = this.getBeanInstanceByBeanName( BEAN_NAME.OPTION_HANDLER);\n\t\tthis.rowRendererController = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n\t\toptionHandler.setDomData( element, CellController.DOM_KEY_CELL_CTRL, this);\n\t\tthis.addDestroyFunc(() => optionHandler.setDomData( element, CellController.DOM_KEY_CELL_CTRL, null) );\n\t}\n\n\tprivate attachDom() {\n\t\tconst rowType = this.rowController.getRowType();\n\t\tswitch (rowType) {\n\t\t\tcase RowType.CellLoading:\n\t\t\t\tthis.setLoading();\n\t\t\t\tbreak;\n\t\t\tcase RowType.Normal:\n\t\t\t\tthis.refreshCell({force : true});\n\t\t\t\tbreak;\n\t\t\tcase RowType.GroupCell:\n\t\t\t\tthis.refreshCell({force : true});\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetLoading() {\n\t\tthis.createCellPosition();\n\t\tconst params = this.createRendererParam();\n\t\tconst userComponentHandler = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_HANDLER, );\n\t\tlet componentDetails = userComponentHandler.getCellRendererLoadingDetails( this.column, params, );\n\n\t\tthis.component.setRendererDetails(componentDetails, true);\n\t}\n\n\taddHoverListener() {\n\t\tconst type = this.component.getType();\n\t\tif (type != RowContainerType.HEADER) {\n\t\t\tthis.addListener( this.column, COLUMN_NODE_EVENTS.EVENT_MOUSE_ENTER, this.onColumnHover.bind(this), );\n\t\t\tthis.addListener( this.column, COLUMN_NODE_EVENTS.EVENT_MOUSE_LEAVE, this.onColumnHover.bind(this), );\n\t\t}\n\t}\n\n\n\tprivate onMouseEnter(_event : MouseEvent) {\n\t\tconst columnHoverHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.COLUMN_HOVER_HANDLER, ) as ColumnHoverHandler; columnHoverHandler.setMouseOver([this.column]); \n\t\tthis.column.onMouseEnter();\n\t}\n\n\tprivate onMouseLeave(_event : MouseEvent) {\n\t\tconst columnHoverHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.COLUMN_HOVER_HANDLER) as ColumnHoverHandler;\n\t\tcolumnHoverHandler.clearMouseOver();\n\t\tthis.column.onMouseLeave();\n\t}\n\n\tprotected setValue(forceRenderer : boolean = false) {\n\t\tlet componentDetails;\n\t\tconst params = this.createRendererParam();\n\t\t// need to implement with default rendering\n\t\t// if(this.column.getPinnedPosition() === 'rowHeader') {\n\t\t// \tthis.registerRowDragger(this.component.getElement());\n\t\t// \tthis.registerRowSelection({\n\t\t// \t\telement : this.component.getElement()\n\t\t// \t})\n\t\t// }\n\t\t\n\t\tconst userComponentHandler = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_HANDLER );\n\t\tcomponentDetails = this.rowController.getRowType() === RowType.GroupCell ? userComponentHandler.getGroupCellRendererDetails( this.column, params) : userComponentHandler.getCellRendererDetails( this.column, params);\n\n\t\tthis.component.setRendererDetails(componentDetails, false, forceRenderer);\n\t}\n\n\tpublic updateAndFormatValue(compareValues: boolean): boolean {\n        const oldValue = this.value;\n\n\t\tconst fieldName = this.column.getColumnKey() as string;\n\t\tconst data      = this.rowNode.getRowData();\n\t\tconst value     = data[fieldName];\n\n        this.value = value;\n\n        if (compareValues) {\n            return oldValue !== this.value;\n        }\n        return true;\n    }\n\n\tprotected createRendererParam(): ICellRendererParams {\n\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as any;\n\t\treturn {\n\t\t\tdata                        : this.rowNode.getRowData(),\n\t\t\tcolumnId                    : this.column.getID(),\n\t\t\trowId                       : this.rowNode.getId(),\n\t\t\trowIndex                    : this.cellPosition.rowIndex,\n\t\t\tpinPosition                 : this.cellPosition.pinPosition,\n\t\t\tgridCellElement             : this.component.getElement(),\n\t\t\trowElement                  : this.component.getRowElement(),\n\t\t\tabsoluteRowIndex            : this.cellPosition.absoluteRowIndex,\n\t\t\tcolumnNode                  : this.column,\n\t\t\tparentElement               : this.component.getParentValueElement(),\n\t\t\trowUserParams               : this.rowNode.getUserParams(),\n\t\t\tcellData                    : this.rowNode.getDataByKey(this.column.getColumnKey() ?? ''),\n\t\t\trowNode                     : this.rowNode,\n\t\t\tapis                        : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER),\n\t\t\tcolumnIndex                 : this.cellPosition.columnIndex,\n\t\t\tregisterDragElement         : this.registerRowDragger.bind(this),\n\t\t\tregisterRowSelection        : this.registerRowSelection.bind(this),\n\t\t\trowSelected                 : rowSelectionHandler.isRowSelected(this.cellPosition),\n\t\t\tshowTooltip                 : (message : string)=>this.openCustomTooltip(this.component.getElement(), message),\n\t\t\tregisterExpandCollapseGroup : this.registerExpandCollapseGroup.bind(this),\n\t\t\tregisterOnCellWidthChange   : (callback : (width : number)=>any) => this.cellWidthChangeCallback = callback\n\t\t};\n\t}\n\n\tprivate registerExpandCollapseGroup(element : HTMLElement, callback : CallableFunction) : void {\n\t\tif(!element) return;\n\t\tconst focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\tconst focusCollapsedHeader = this.rowNode.isCollapsed() && focusHandler.isGroupHeaderFocused(this.cellPosition);\n\t\tif(focusCollapsedHeader) {\n\t\t\telement && element.focus();\n\t\t}\n\t\tthis.addListener(element, \"click\", (event) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\tconst rowNode     = this.rowNode;\n            const isCollapsed = rowNode.isCollapsed();\n\t\t\tcallback && callback({\n\t\t\t\tevent,\n\t\t\t\tisCollapsed : !isCollapsed\n\t\t\t})\n            isCollapsed ? rowNode.expand() : rowNode.collapse();\n\t\t})\n\t}\n\n\tprivate registerRowDragger(element  : HTMLElement) : void {\n\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif(!optionHandler.isRowDraggable()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(this.defaultRowDragSource) {\n\t\t\tthis.getBeanInstanceByBeanName('dragAndDropHandler').removeDragSource(this.defaultRowDragSource);\n\t\t\tthis.defaultRowDragSource = null;\n\t\t}\n\n\t\tthis.defaultRowDragSource  = {\n\t\t\ttype: 'rowDrag',\n\t\t\tcontainer: element,\n\t\t\tgetGhostElement: () => {\n\t\t\t\tconst dragItem             = this.defaultRowDragSource.getDragItem();\n\t\t\t\tconst definitionParam      = this.createDefinitionParam();\n\t\t\t\tconst rowReorderParams     = this.createRowReorderParams(dragItem);\n\t\t\t\tconst userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as GridUserComponentHandler;\n\t\t\t\tconst reorderDetails       = userComponentHandler.getRowReorderRendererDetails(definitionParam, rowReorderParams);\n\n                const div = document.createElement(\"div\");\n                if(reorderDetails) {\n                    const reorderElementInstance = reorderDetails?.newInstance();\n\t\t\t\t\treorderElementInstance.then((instance) => {\n\t\t\t\t\t\tdiv.appendChild(instance.getElement());\n\t\t\t\t\t})\n                }\n                return div;\n\t\t\t},\n\t\t\tgetDragItem:  () => {\n\t\t\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as IRowSelectionHandler;\n\n\t\t\t\tconst selectedRows = rowSelectionHandler.getSelectedRows();\n\t\t\t\tconst selectionType = rowSelectionHandler.getSelectionType();\n\n\t\t\t\tconst isSelected = rowSelectionHandler.isRowSelected(this.cellPosition);\n\n\t\t\t\tconst id = this.cellPosition.rowID\n\t\t\t\tconst result = {\n\t\t\t\t\trowIDs: [],\n\t\t\t\t\trowRanges: [],\n\t\t\t\t\tselectionType\n\t\t\t\t};\n\n\t\t\t\tif (selectionType === 'id') {\n\t\t\t\t\tresult.rowIDs = isSelected ? selectedRows.length > 0 ? selectedRows : [id] : [id];\n\t\t\t\t} else if (selectionType === 'index') {\n\t\t\t\t\tconst range = { from: this.cellPosition, to: this.cellPosition };\n\t\t\t\t\tresult.rowRanges = isSelected ? selectedRows.length > 0 ? selectedRows : [range] : [range];\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t},\n\t\t\tshouldPreventMouseEvent : () => true,\n\t\t\tgetRootNode : () => window,\n\t\t\tdragSourceId : this.getBeanInstanceByBeanName('instanceID'),\n\t\t\tonDragStarted : () => {\n\t\t\t\tconst gridCellEditorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as IGridCellEditorHandler;\n\t\t\t\tgridCellEditorHandler.stopEditing(true, null, false, true)\n\t\t\t}\n\t\t}\n\n\t\tthis.getBeanInstanceByBeanName('dragAndDropHandler').addDragSource(this.defaultRowDragSource, true);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.getBeanInstanceByBeanName('dragAndDropHandler').removeDragSource(this.defaultRowDragSource);\n\t\t\tthis.defaultRowDragSource = null;\n\t\t});\n\t}\n\n\tcreateCellPosition() {\n\t\tconst columnID    = this.column.getID();\n\t\tconst columnIndex = this.column.getIndex();\n\n\t\tconst rowPosition = this.rowController.getRowPosition();\n\t\tthis.cellPosition = {\n\t\t\trowIndex        : rowPosition.rowIndex,\n\t\t\tpinPosition     : rowPosition.pinPosition,\n\t\t\tparentKeys      : rowPosition.parentKeys,\n\t\t\trowID           : rowPosition.rowID,\n\t\t\tabsoluteRowIndex: rowPosition.absoluteRowIndex,\n\t\t\tcolumnIndex,\n\t\t\tcolumnID,\n\t\t};\n\t}\n\n\tfocus(_event?: KeyboardEvent, force : boolean = false, initator : 'api' | 'ui' = 'api'): void {\n\t\t// const element = this.component.getElement() as HTMLDivElement;\n\t\t// const isLoaded = this.rowNode.isLoaded();\n\n\t\t// const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\t// const fullRowHoverEdit = optionHandler.isFullRowHoverOnEdit();\n\t\t// if (!fullRowHoverEdit && this.editing) {\n\t\t// \t// this.stopEditing();\n\t\t// \tthis.gridCellEditorHandler.stopEditing();\n\t\t// }else {\n\t\t// \telement.scrollIntoView({ block: 'nearest' });\n\t\t// \tisLoaded && element.focus();\n\t\t// }\n\t\tconst stopEditing = true;\n\t\tconst scrollOnFocus = true;\n\t\tconst focus = true;\n\t\tthis.onCellFocused(stopEditing, scrollOnFocus, focus, initator, force);\n\t}\n\n\tgetInstanceID(): string {\n\t\treturn this.instanceID;\n\t}\n\t\n\tgetRowNode(): IRowNode {\n\t\treturn this.rowNode;\n\t}\n\tgetColumn(): IColumnNode {\n\t\treturn this.column;\n\t}\n\n\tonColumnHover() {\n\t\tif (!this.component) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst type = this.component.getType();\n\t\tif (type == RowContainerType.HEADER) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst optionHandler = this.getBeanInstanceByBeanName( BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\n\t\tconst isColumnHoverHighlighter = optionHandler.isColumnHoverHighlighter();\n\n\t\tif (!isColumnHoverHighlighter) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst columnHoverHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.COLUMN_HOVER_HANDLER ) as ColumnHoverHandler;\n\n\t\tconst isHovered = columnHoverHandler.isHovered(this.column);\n\n\t\tthis.component.addOrRemoveCssClass('ZG-columnHover', isHovered);\n\t}\n\n\tonKeyDown(event: KeyboardEvent) {\n\t\t\n\t\tconst navigationService = this.getBeanInstanceByBeanName('navigationService') as NavigationService;\n\t\tconst optionsHandler = this.getBeanInstanceByBeanName('optionsHandler') as any;\n\t\tconst isRTL = optionsHandler.isRTL();\n\n\t\tconst key = event.code;\n\n        switch (key) {\n\t\t\tcase KeyBoardKeyCode.ArrowLeft :\n\t\t\t\tif(event.ctrlKey || event.metaKey) {\n\t\t\t\t\tif (isRTL) {\n\t\t\t\t\t\tnavigationService.navigateToLastCellInRow(this.getCellPosition());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnavigationService.navigateToFirstCellInRow(this.getCellPosition());\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tnavigationService.navigateToCellLeft(this.getCellPosition());\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase KeyBoardKeyCode.ArrowRight:\n\t\t\t\tif(event.ctrlKey|| event.metaKey) {\n\t\t\t\t\tif (isRTL) {\n\t\t\t\t\t\tnavigationService.navigateToFirstCellInRow(this.getCellPosition());\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnavigationService.navigateToLastCellInRow(this.getCellPosition());\n\t\t\t\t\t}\n\t\t\t\t}else {\n\t\t\t\t\tnavigationService.navigateToCellRight(this.getCellPosition());\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase KeyBoardKeyCode.ArrowUp :\n\t\t\t\tif(event.ctrlKey|| event.metaKey) {\n\t\t\t\t\tnavigationService.navigateToFirstCellInColumn(this.getCellPosition());\n\t\t\t\t}else {\n\t\t\t\t\tnavigationService.navigateToCellUp(this.getCellPosition());\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase KeyBoardKeyCode.ArrowDown:\n\t\t\t\tif(event.ctrlKey|| event.metaKey) {\n\t\t\t\t\tnavigationService.navigateToLastCellInColumn(this.getCellPosition());\n\t\t\t\t}else {\n\t\t\t    \tnavigationService.navigateToCellDown(this.getCellPosition());\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.navigateKeyDown(event);\n\t\t\t\t\n\t\t}\n\t\t\n\t\t\n\t}\n\n\tonCellFocused(stopEditing : boolean = true, scrollOnFocus : boolean = true, focus : boolean = true, _initator : 'ui' | 'api' = 'api', force : boolean = false) : void {\n\t\tif(this.isEditing() && !stopEditing) {\n\t\t\treturn;\n\t\t}\n\t\tconst focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\tconst isCellFocused = focusHandler.isCellFocused(this.getCellPosition());\n\n\t\tthis.component.addOrRemoveCssClass('ZG-cellSelection' , isCellFocused);\n\n\t\tthis.closeEditorTooltipComponent();\n\t\tif(!isCellFocused && this.isEditing() && stopEditing) {\n\t\t\t// this.stopEditing(false, null, false, true);\n\t\t\tthis.gridCellEditorHandler.stopEditing(false, null, false, true);\n\t\t}\n\t\tconst element = this.component.getElement();\n\t\tif(isCellFocused) {\n\t\t\tconst isGridFocus = focusHandler.isGridFocus();\n\t\t\tif((isGridFocus || force ) && focus && element ){\n\t\t\t\telement.focus({\n\t\t\t\t\tpreventScroll : !scrollOnFocus\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.setInitialFocus();\n\t\t}else {\n\t\t\telement && element.blur();\n\t\t}\n\t}\n\n\n\tprivate navigateKeyDown(event, editing = false) {\n\t\tif(editing) {\n\t\t\treturn;\n\t\t}\n\t\tconst gridOption = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_OPTIONS);\n\t\tconst suppressKeyDownEvent = gridOption.suppressKeyDownEvent;\n\t\tif(suppressKeyDownEvent) {\n\t\t\tconst isKeyDownSuppressed = suppressKeyDownEvent({\n\t\t\t\tevent : event,\n\t\t\t\ttype : \"cell\",\n\t\t\t\tmeta : this.cellPosition});\n\t\t\tif(isKeyDownSuppressed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t};\n\n\n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\n\t\tgridEvent.onCellKeyDown(event, {keyEvent : event,rowIndex : this.cellPosition.rowIndex, pinPosition : this.cellPosition.pinPosition, columnIndex : this.cellPosition.columnIndex, columnID : this.cellPosition.columnID, rowID : this.cellPosition.rowID })\n\t}\n\n\tonCellMouseDown(event: MouseEvent) {\n\n\t\tconst gridOption = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_OPTIONS);\n\t\tconst suppressMouseDownEvent = gridOption.suppressMouseDownEvent;\n\t\t\n\t\tif(suppressMouseDownEvent) {\n\t\t\tconst isMouseDownSuppressed = suppressMouseDownEvent({\n\t\t\t\tevent : event,\n\t\t\t\ttype : \"cell\",\n\t\t\t\tmeta : this.cellPosition});\n\t\t\tif(isMouseDownSuppressed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t};\n\n\t\tif (this.cellPosition.columnIndex === null) {\n\t\t\treturn;\n\t\t}\n\t\tif(!this.isEditing()){\n\t\t\tthis.rowRendererController.closeEditor();\n\t\t}\n\n\t\t// const hookManager = this.getBeanInstanceByBeanName(BEAN_NAME.HOOK_MANAGER, [ BEAN_NAME.HOOK_MANAGER, ]) as HookManager;\n\t\t// hookManager.onCellMouseDown({mouseEvent : event, rowIndex : this.cellPosition.rowIndex, pinPosition : this.cellPosition.pinPosition, columnIndex : this.cellPosition.columnIndex, columnID : this.cellPosition.columnID, rowID : this.cellPosition.rowID });\n\n\t\t// const navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER) as NavigationHandler;\n\t\t// navigation.onCellMouseDown(event, this.cellPosition);\n\n\t\tconst gridAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_API) as IGridAPI;\n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\t\tgridEvent.onCellMouseDown({mouseEvent : event, rowIndex : this.cellPosition.rowIndex, pinPosition : this.cellPosition.pinPosition, columnIndex : this.cellPosition.columnIndex, columnID : this.cellPosition.columnID, rowID : this.cellPosition.rowID, instanceAPI : gridAPI });\n\n\t}\n\n\tprivate onCellContextMenu(event: MouseEvent, isRowSelected : boolean = false, isColumnSelected : boolean = false) {\n\t\tconst rowSelectionHandler    = this.getBeanInstanceByBeanName('RowSelectionHandler') as IRowSelectionHandler;\n\t\tconst columnSelectionHandler = this.getBeanInstanceByBeanName('columnSelection') as IColumnSelection;\n\t\t      isRowSelected          = rowSelectionHandler.isRowSelected(this.cellPosition);\n\t\t      isColumnSelected       = columnSelectionHandler.isColumnSelected(this.cellPosition.columnID);\n\t\tconst events                 = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.GRID_EVENTS);\n\t\tthis.closeEditorTooltipComponent();\n\t\tevents.onContextMenu({\n\t\t\tevent         : event,\n\t\t\tmeta          : this.cellPosition,\n\t\t\ttype          : this.rowNode.isGroupRow() ? \"groupCell\" : this.type === 'summarycell' ? \"summarycell\": this.type === 'rowHeader' ? \"rowHeaderCell\": 'cell',\n\t\t\trowSelected   : isRowSelected,\n\t\t\tcolumnSelected: isColumnSelected\n\t\t});\n\t}\n\n\tgetCellPosition(): ICellPosition {\n\t\tif (!this.cellPosition) {\n\t\t\tthis.createCellPosition();\n\t\t}\n\t\treturn this.cellPosition;\n\t}\n\t\n\n\tdestroy(): void {\n\t\tif(this.isEditing()) {\n\t\t\tthis.gridCellEditorHandler.stopEditing(false, null, false, true);\n\t\t}\n\t\tthis.disableTooltip();\n\t\tthis.destroyEditorToolTip();\n\t\t\n\t\t// Clear component references and DOM renderer state before destroying\n\t\tif (this.component) {\n\t\t\tthis.component.setDomRenderer(false);\n\t\t}\n\t\t\n\t\t// Call super.destroy() first to clean up all EventEmitter listeners\n\t\t// This ensures all event listeners (including DOM element listeners) are removed\n\t\tsuper.destroy();\n\t\t\n\t\t// After EventEmitter cleanup, clear all references to allow garbage collection\n\t\tif (this.component) {\n\t\t\tthis.component = null;\n\t\t}\n\t\tthis.addRowSelectionDestroyCallback.forEach((callback) => callback());\n\t\tthis.addRowSelectionDestroyCallback = [];\n\t\tthis.rowNode = null;\n\t\tthis.column = null;\n\t\tthis.rowController = null;\n\t\tthis.cellRangeHandler = null;\n\t\tthis.cellStyle = null;\n\t\tthis.cellPositionHandler = null;\n\t\tthis.tooltipComponent = null;\n\t\tthis.editorTooltipComponent = null;\n\t\tthis.defaultRowDragSource = null;\n\t\tthis.cellWidthChangeCallback = null;\n\t\tthis.gridCellEditorHandler = null;\n\t\tthis.rowRendererController = null;\n\t\tthis.getBeanInstanceByBeanName = null as any;\n\t}\n\n\tupdateCellStyles(meta: any): void {\n\t\t// const isLoaded = this.rowNode.isLoaded();\n\t\t// isLoaded && this.cellStyle.applyCellStyles(meta);\n\t\tthis.cellStyle.applyCellStyles(meta);\n\t}\n\n\tremoveCellSelectionStyle(): void {\n\t\tthis.cellStyle.removeCellSelection();\n\t}\n\n\tremoveRangeSelectionStyle(): void {\n\t\tthis.cellStyle.removeRangeSelection();\n\t}\n\n\tcreateFocusEventParam( event: KeyboardEvent = null, ): IFocusEventParam {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER);\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n\n\t\tconst rowID = this.rowNode.getId();\n\t\tconst rowIndex = recordHandler.getRelativeIndexByID(rowID);\n\n\t\tconst pinPosition = this.rowNode.getPinnedPosition();\n\n\t\tconst columnID = this.column.getID();\n\t\tconst columnIndex = fieldHandler.getIndexById(columnID);\n\n\t\treturn {\n\t\t\tevent,\n\t\t\trowIndex,\n\t\t\tpinPosition,\n\t\t\tcolumnIndex,\n\t\t\tcolumnID,\n\t\t\trowID,\n\t\t};\n\t}\n\n\tafterGuiAttached(): void {\n\t\tif (this.component) {\n\t\t\t// const navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER) as NavigationHandler;\n\t\t\t// const isLoaded = this.rowNode.isLoaded();\n\t\t\t// isLoaded && navigation.onCellCreate( this.rowNode.getID(), this.column.getID(), (styleInfo) => this.updateCellStyles(styleInfo));\n\t\t\t// navigation.onCellCreate( this.rowNode.getId(), this.column.getID(), (styleInfo) => this.updateCellStyles(styleInfo), );\n\t\t\tthis.component.afterGuiAttached();\n\t\t\tthis.component.setDomRenderer(true);\n\t\t\tthis.onCellFocused(false,false,true,'ui');\n\t\t\t// this.onCellFocused();\n\t\t}\n\t}\n\n\tonMouseEvent(eventName: string, event: MouseEvent): void {\n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\t\tswitch (eventName) {\n\t\t\tcase 'mouseover':\n\t\t\t\tthis.onMouseEnter(event);\n\t\t\t\tgridEvent.onCellMouseEnter({mouseEvent : event, rowIndex : this.cellPosition.rowIndex, pinPosition : this.cellPosition.pinPosition, columnIndex : this.cellPosition.columnIndex, columnID : this.cellPosition.columnID, rowID : this.cellPosition.rowID });\n\t\t\t\tbreak;\n\t\t\tcase 'mouseout':\n\t\t\t\tthis.onMouseLeave(event);\n\t\t\t\tgridEvent.onCellMouseLeave({mouseEvent : event, rowIndex : this.cellPosition.rowIndex, pinPosition : this.cellPosition.pinPosition, columnIndex : this.cellPosition.columnIndex, columnID : this.cellPosition.columnID, rowID : this.cellPosition.rowID });\n\t\t\t\tbreak;\n\t\t\tcase 'mousedown':\n\t\t\tcase 'touchstart':\n\t\t\t\tthis.onMouseDown(event);\n\t\t\t\tbreak;\n\t\t\tcase 'mouseup':\n\t\t\tcase 'touchend':\n\t\t\t\tgridEvent.onCellMouseUp({mouseEvent : event, rowIndex : this.cellPosition.rowIndex, pinPosition : this.cellPosition.pinPosition, columnIndex : this.cellPosition.columnIndex, columnID : this.cellPosition.columnID, rowID : this.cellPosition.rowID });\n\t\t\t\tbreak;\n\t\t\tcase 'mousemove':\n\t\t\tcase 'touchmove':\n\t\t\t\tgridEvent.onCellMouseMove({mouseEvent : event, rowIndex : this.cellPosition.rowIndex, pinPosition : this.cellPosition.pinPosition, columnIndex : this.cellPosition.columnIndex, columnID : this.cellPosition.columnID, rowID : this.cellPosition.rowID });\n\t\t\t\tbreak;\n\t\n\t\t\tcase 'contextmenu':\n\t\t\t\tthis.onCellContextMenu(event);\n\t\t\t\tbreak;\n\t\t\tcase 'dblclick':\n\t\t\t\tthis.onCellDoubleClick(event);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tonCellDoubleClick(_event: MouseEvent) {\n\t\t// this.startEditing(null, _event);\n\t\tthis.gridCellEditorHandler.startEditing(this, null, _event);\n\t}\n\n\tcreateEditableParams(event : MouseEvent | KeyboardEvent | null = null, value : any = null) : any {\n\t\treturn {\n\t\t\t...this.createCoreEditableParams(value),\n\t\t\tevent\n\n\t\t}\n\t}\n\n\tcreateCoreEditableParams(value : any = null) : any {\n\t\treturn {\n\t\t\t...this.cellPosition,\n\t\t\tdata                : this.rowNode.getRowData(),\n\t\t\tcolumnNode          : this.column,\n\t\t\trowUserParams       : this.rowNode.getUserParams(),\n\t\t\tcellData            : value ?? this.rowNode.getDataByKey(this.column.getColumnKey() ?? ''),\n\t\t\trowNode             : this.rowNode,\n\t\t\tinstanceAPI         : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER)\n\t\t}\n\t}\n\n\tstartEditing(key: string | null = null, event: KeyboardEvent | MouseEvent | null = null, value : any = null): boolean {\n\t\tconst isColumnEditable    = this.column.isEditable(this.createEditableParams(event, value));\n\t\tconst isRowEditable       = this.rowNode.isEditable();\n\n\t\tconst isGroupCell = this.rowNode.isGroupRow();\n\t\tif(isGroupCell) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst navigation = this.getBeanInstanceByBeanName('navigationService') as INavigationHandler;\n\t\tconst immediateScrollPropagate = true;\n\t\tnavigation.ensureCellVisible(this.cellPosition, immediateScrollPropagate);\n\n\t\tif (this.editing || isColumnEditable == false||  isRowEditable == false) {\n\t\t\tthis.openCellEditorTooltip();\n\t\t\treturn false;\n\t\t}\n\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\n\t\tconst onBeforeCellEditEvents = this.createCellEditorEvents(key,event, this.getEditStartHookName(), value)\n\n\t\tif(!optionHandler.onBefore(this.getEditStartHookName(), onBeforeCellEditEvents)) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// this.rowRendererController.setEditorState(this.rowNode, this.column);\n\n\t\t// this.rowRendererController.closeEditor();\n\n\t\tconst cellEditorParams     = this.createCellEditorParams(key, event, value);\n\t\t\n\t\tconst cellEditorDetails    = this.getEditorDetails(cellEditorParams);\n\t\t\n\t\tif(cellEditorDetails == undefined) {\n\t\t\tthis.openCellEditorTooltip();\n\t\t\treturn false;\n\t\t}\n\n\t\tif(cellEditorDetails && !cellEditorDetails?.componentClass) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst popup                             = cellEditorDetails?.popupFromSelector         != null ? cellEditorDetails.popupFromSelector : !!this.column.isCellEditorPopup() ;\n\n\t\tconst position: CellEditorPopupPosition = cellEditorDetails?.popupPositionFromSelector != null ? cellEditorDetails.popupPositionFromSelector : this.column.getCellEditorPopupPosition();\n\n        this.setEditing(true);\n\n\t\tthis.component.addOrRemoveCssClass('ZG-cell-inline-editor', true);\n\n\t\tthis.component.setEditorDetails(cellEditorDetails, popup, position);\n\n\t\tthis.dispatchEditStarted(key, event);\n\t\treturn true;\n\t}\n\t\n\tgetEditorDetails(cellEditorParams: ICellEditorParams<any, any>) {\n\t\tconst userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as GridUserComponentHandler;\n\t\treturn userComponentHandler.getCellEditorDetails(this.column, cellEditorParams);\n\t}\n\n\topenCellEditorTooltip() : void {\n\t\tconst hasEditorToolTip = this.column.isNonEditableMessageEnabled(this.createCoreEditableParams());\n\n\t\tif(hasEditorToolTip) {\n\n\t\t\tthis.registerEditorTooltip();\n\t\t\t\n\t\t\tthis.editorTooltipComponent.instance.api.open();\n\n\t\t}\n\t}\n\t\n\tenableTooltip(value ?: string, shouldShowTooltip ?: () => boolean) : void {\n\t\tconst getValue = () =>  this.rowNode.getDataByKey(this.column.getColumnKey() ?? '');\n            \n\t\tconst optionHandler   = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst documentElement = optionHandler.getDocument();\n\n\t\t\n\t\tif (!shouldShowTooltip && !this.isCellRenderer) {\n\t\t\tshouldShowTooltip = () => {\n                const eGui        = this.component.getElement()\n                const textElement = eGui ? eGui.children.length === 0 ? eGui : this.component.getCellValueElement() : null;\n                if (!textElement) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n                return textElement.scrollWidth > textElement.clientWidth;\n            }\n\t\t}\n\n\t\tlet renderer;\n\t\tlet userRendererParams;\n\t\tlet selector;\n\n\t\tconst hasCellRenderer = this.column.hasToolTipRenderer();\n\t\tif(hasCellRenderer){\n\t\t\trenderer           = this.column.getToolTipRenderer();\n\t\t\tuserRendererParams = this.column.getToolTipRendererParams();\n\t\t\tselector           = this.column.getToolTipRendererSelector();\n\t\t}\n\n\t\tconst tooolTipConfiguration = {\n\t\t\tpopupParent : this.getPopupParant(),\n\t\t\ttooltipValue: value != null ? value: getValue(),\n            documentElement,\n\t\t\tshouldShowTooltip,\n\t\t\ttooltipHideDelay            : 1000,\n\t\t\ttooltipShowDelay            : 500,\n\t\t\tfadeOutDelayAfterInteraction: 0,\n\t\t\thideTooltip : true,\n\t\t\trenderer,\n\t\t\tuserRendererParams,\n\t\t\tselector\n\t\t}\n\n\t\tthis.tooltipComponent = new Tooltip(this.component.getElement(), tooolTipConfiguration);\n\t}\n\n\tenableEditorToolTip() : void { \n\n\t\tconst hasEditorToolTip = this.column.isNonEditableMessageEnabled(this.createCoreEditableParams()); \n\n\t\tif(!hasEditorToolTip) {\n\t\t\treturn;\n\t\t}\n\t\tconst nonEditableMessageValue          = this.column.getNonEditableMessage();\n\t\tconst nonEditableMessageRenderer       = this.column.getNonEditableMessageRenderer();\n\t\tconst nonEditableMessageRendererParams = this.column.getNonEditableMessageRendererParams();\n\n\n\t\tlet tooltipValue = nonEditableMessageValue;\n\t\t\n\t\tif(typeof nonEditableMessageValue === 'function') {\n\t\t\ttooltipValue = nonEditableMessageValue(this.getCellPosition());\n\t\t}\n\t\t\n\t\tconst configuration = {\n\t\t\tpopupParent       : this.getPopupParant(),\n\t\t\ttooltipValue      : tooltipValue,\n\t\t\tgapY              : 5,\n\t\t\tgapX              : 0,\n\t\t\tposition          : 'bottomRight',\n\t\t\tshouldAttachEvents: false,\n\t\t\tshouldShowTooltip : () => true,\n\t\t\trenderer          : nonEditableMessageRenderer,\n\t\t\tuserRendererParams: nonEditableMessageRendererParams ?? {},\n\t\t\thideTooltip       : false,\n\t\t\tarrow             : true\n\t\t} as ITooltipConfiguration;\n\n\t\tconst escapeHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_ESCAPE_HANDLER) as IEscapeHandler;\n\t\tconst stateHandler = this.getBeanInstanceByBeanName('stateHandler') as IStateHandler;\n\t\tstateHandler && stateHandler.setEditorTooltipActive(this.cellPosition);\n\t\tthis.editorTooltipComponent = {\n\t\t\tid      : null,\n\t\t\tinstance: null\n\t\t};\n\n\n\t\tthis.editorTooltipComponent.instance = new Tooltip(this.component.getElement(), configuration)\n\t\tthis.editorTooltipComponent.id       = escapeHandler.addAction(this.destroyEditorToolTip.bind(this));\n\n\t}\n\n\n\t private disableTooltip() : void {\n        if (!this.tooltipComponent) { return; }\n\n        this.tooltipComponent.api.destroy();\n        this.tooltipComponent = null;\n    }\n\n\tprivate destroyEditorToolTip() : void {\n\t\tif(!this.isAlive()) {\n\t\t\treturn;\n\t\t}\n\t\tif(!this.editorTooltipComponent) {return;}\n\t\tconst escapeHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_ESCAPE_HANDLER) as IEscapeHandler;\n\t\tif(escapeHandler) {\n\t\t\tescapeHandler.removeAction(this.editorTooltipComponent.id);\n\t\t}\n\t\tthis.editorTooltipComponent.instance.api.destroy();\n\t\tthis.editorTooltipComponent = null;\n\t}\n\n\n\tprivate getPopupParant() : HTMLElement {\n\t\tconst optionHandler      = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst controller         = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n\t\tconst gridController     = controller.getGridController();\n\t\tconst popupParentElement = optionHandler.getPopupParent();\n        \n        if(popupParentElement) {\n            return popupParentElement;\n        }\n\n        return gridController.getGui();\n    }\n\n\n\n\tsetEditing(editing: boolean): void {\n\t\tif (this.editing === editing) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.editing = editing;\n\t}\n\n\tisEditing(): boolean {\n\t\treturn this.editing;\n\t}\n\n\tonLeftChanged() {\n\t\tthis.cellPositionHandler.onLeftChanged();\n\t}\n\n\tonWidthChanged() : void {\n\t\tconst width = this.column.getWidth();\n\t\tthis.cellPositionHandler.onWidthChanged();\n\t\tthis.cellWidthChangeCallback?.(width);\n\t}\n\n\tcreateCellKeyEventParam(event : KeyboardEvent ) : ICellEventParam<KeyboardEvent> {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER);\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n\n\t\tconst rowID = this.rowNode.getId();\n\t\tconst rowIndex = recordHandler.getRelativeIndexByID(rowID);\n\n\t\tconst pinPosition = this.rowNode.getPinnedPosition();\n\n\t\tconst columnID = this.column.getID();\n\t\tconst columnIndex = fieldHandler.getIndexById(columnID);\n\n\n\t\treturn {\n\t\t\tevent,\n\t\t\trowIndex,\n\t\t\tpinPosition,\n\t\t\tcolumnIndex,\n\t\t\tcolumnID,\n\t\t\trowID\n\t\t};\n\t}\n\n\tcreateCellMouseEventParam(event : MouseEvent ) : ICellEventParam<MouseEvent> {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER);\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n\n\t\tconst rowID = this.rowNode.getId();\n\t\tconst rowIndex = recordHandler.getRelativeIndexByID(rowID);\n\n\t\tconst pinPosition = this.rowNode.getPinnedPosition();\n\n\t\tconst columnID = this.column.getID();\n\t\tconst columnIndex = fieldHandler.getIndexById(columnID);\n\n\t\treturn {\n\t\t\tevent,\n\t\t\trowIndex,\n\t\t\tpinPosition,\n\t\t\tcolumnIndex,\n\t\t\tcolumnID,\n\t\t\trowID,\n\t\t};\n\t}\n\n\tcloseEditorTooltipComponent() : void {\n\t\tthis.editorTooltipComponent && this.editorTooltipComponent.instance.api.close();\n\t}\n\n\tstopEditing(cancel = false, ev : KeyboardEvent = null, shiftKey : boolean = false, suppressNavigation = false, dataupdate : boolean = true) : { editing : boolean, isNewValue : boolean, value : any } {\n\t\ttry {\n\t\t\tthis.closeEditorTooltipComponent();\n\t\t\tif(!this.isEditing()) {\n\t\t\t\treturn {\n\t\t\t\t\tediting : false,\n\t\t\t\t\tisNewValue : false,\n\t\t\t\t\tvalue : null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\t\tconst focusHandler = this.getBeanInstanceByBeanName(\"focusHandler\") as IFocusHandler;\n\n\t\t\tconst onBeforeCellEditEvents = this.createCellEditorEvents(ev?.key,ev, this.getEditStopHookName())\n\n\t\t\tif(!optionHandler.onBefore(this.getEditStopHookName(), onBeforeCellEditEvents)) {\n\t\t\t\treturn {\n\t\t\t\t\tediting : false,\n\t\t\t\t\tisNewValue : false,\n\t\t\t\t\tvalue : null\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst { newValue, isNewValue } = this.getValueFromEditor(cancel);\n\n\t\t\tconst oldValue = this.rowNode.getDataByKey(this.column.getColumnKey());\n\n\t\t\tif(isNewValue) {\n\t\t\t\tthis.saveCellValues(oldValue, newValue);\n\t\t\t\tconst cellEditor =  this.component.getCellEditor();\n\t\t\t\tdataupdate && cellEditor.submit?.();\n\t\t\t\tthis.rowController.refreshAutoRowHeight();\n\t\t\t}\n\n\t\t\tthis.setEditing(false);\n\n\t\t\tthis.component.addOrRemoveCssClass('ZG-cell-inline-editor', false);\n\n\t\t\tconst cellEditorElement = this.component.getCellEditorElement();\n\t\t\tconst hadFocusInsideEditor = cellEditorElement?.contains(document.activeElement);\n\n\t\t\tthis.component.setEditorDetails();\n\n\t\t\tthis.refreshCell({newData : true, force : true});\n\n\t\t\t// if(ev){\n\t\t\t// \tconst navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER) as NavigationHandler;\n\t\t\t// \tconst params = {...this.createNavigationKeyEventParams(), ...{suppressNavigation, editOnEnter : false}};\n\t\t\t\t\n\t\t\t// \tnavigation.onKeyDown(ev, params, this);\n\t\t\t// }\n\n\t\t\tthis.rowRendererController.setEditorState(null, null);\n\n\t\t\tthis.dispatchEditEnded(ev?.key ,ev);\n\t\t\tconst navigationService = this.getBeanInstanceByBeanName('navigationService') as INavigationHandler;\n\t\t\tconst isCellFocused = focusHandler.isCellFocused(this.getCellPosition());\n\t\t\tisCellFocused && navigationService.ensureCellVisible(this.cellPosition);\n\t\t\tfocusHandler.setGridFocus(true);\n\t\t\tthis.focus(null, hadFocusInsideEditor, 'ui');\n\n\t\t\tif(!suppressNavigation) {\n\t\t\t\tthis.navigateAfterEdit(shiftKey, ev);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tediting : true,\n\t\t\t\tisNewValue,\n\t\t\t\tvalue : newValue\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\n\t\n\tprivate navigateAfterEdit(shiftKey: boolean, event : KeyboardEvent) : void {\n\t\tif(this.column.isEnterNavigatesVertiallyAfterEdit()) {\n\t\t\tconst navigationHandler = this.getBeanInstanceByBeanName('navigationService') as INavigationHandler;\n\n\t\t\tif(shiftKey) {\n\t\t\t\tnavigationHandler.navigateToCellUp(this.cellPosition, event);\n\t\t\t}else {\n\t\t\t\tnavigationHandler.navigateToCellDown(this.cellPosition, event);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic saveCellValues(oldValue : any, newValue : any) : void {\n\t\tif(oldValue === newValue) {\n\t\t\treturn\n\t\t}\n\n\t\tconst cellAPI = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CELL_API) as ICellAPIManager;\n\t\tcellAPI.updateDataById(this.cellPosition.rowID, this.cellPosition.columnID, newValue, null, {eventOrigin : 'editor'});\n\t}\n\n\tupdateData(value : any) : void {\n\t\tthis.rowNode.updateDataByKey(this.column.getColumnKey(), value);\n\t\tthis.refreshCell({newData: true});\n\t}\n\n\tpublic recycleCells(params : {force ?: boolean, newData ?: boolean} = {}, focus : boolean = true) : void {\n\t\tthis.createCellPosition();\n\t\tif(!this.isEditing()) {\n\t\t\tthis.refreshCell(params);\n\t\t}\n\t\tthis.updateClassNames();\n\t\tthis.onCellFocused(false, false, focus, 'api');\n\t\tthis.onRangeSelectionChanged();\n\t}\n\n\tpublic refreshCell(params : {force ?: boolean, newData ?: boolean}) {\n\t\tconst isRowLoading = !this.rowNode.isLoaded();\n\n\t\tif(isRowLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.createCellPosition();\n        if (this.editing && !this.component.isCellEditorPopup()) { return; }\n\n        if (!this.component) { return; }\n\n\n\t\tconst newData = params != null && !!params.newData;\n\n\t\tconst valuesDifferent = this.updateAndFormatValue(!!this.component);\n\n\t\tconst dataUpdate = params.force || valuesDifferent || this.type === \"rowHeader\";\n\n\t\tif(dataUpdate) {\n        \tthis.setValue(newData);\n\n\t\t\tthis.cellStyle.applyClasses();\n\t\t}\n\n    }\n\n\tpublic setInitialFocus() : void {\n\t\tthis.component.setInitialFocus();\n\t}\n\n\tpublic setFocustoTrapElements() :void {\n\t\tthis.component.setFocustoTrapElements(this.cellPosition);\n\t}\n\n\tpublic removeFocustoTrapElements() : void {\n\t\tthis.component.removeFocustoTrapElements();\n\t}\n\t\n\tgetValueFromEditor(cancel: boolean): { newValue?: any, isNewValue: boolean } {\n        const result = { isNewValue: false };\n\n        if (cancel) { return result; }\n\n        const cellEditor =  this.component.getCellEditor();\n\n        if (!cellEditor) { return result; }\n\n        const userWantsToCancel = cellEditor.isCancelAfterEnd && cellEditor.isCancelAfterEnd();\n\n        if (userWantsToCancel) { return result; }\n\n        const newValue = cellEditor.getValue();\n\n\t\tconst oldValue = this.rowNode.getDataByKey(this.column.getColumnKey()) ?? \"\";\n\n\n        return {\n\t\t\tnewValue  : newValue,\n\t\t\tisNewValue: oldValue !== newValue\n\t\t};\n    }\n\n\tcreateCellEditorParams(key: string | null, event : KeyboardEvent | MouseEvent | null, value : any = null): ICellEditorParams {\n\t\tconst {rowIndex, columnIndex, pinPosition, absoluteRowIndex} = this.getCellPosition();\n\n        return {\n\t\t\tvalue            : value ?? this.rowNode.getDataByKey(this.column.getColumnKey()),\n\t\t\toldValue         : this.rowNode.getDataByKey(this.column.getColumnKey()),\n\t\t\teventKey         : key,\n\t\t\trowIndex,\n\t\t\tcolumnIndex,\n\t\t\tpinPosition,\n\t\t\tcolumnID         : this.column.getID(),\n\t\t\trowID            : this.rowNode.getId(),\n\t\t\trowNode          : this.rowNode,\n\t\t\tdata             : this.rowNode.getRowData(),\n\t\t\tcellElement      : this.component.getElement(),\n\t\t\trowUserParams    : this.rowNode.getUserParams(),\n\t\t\trowElement       : this.component.getRowElement(),\n\t\t\tabsoluteRowIndex,\n\t\t\tcolumnNode    : this.column,\n\t\t\tparentElement : this.component.getParentValueElement(),\n\t\t\tonKeyDown     : this.onKeyDown.bind(this),\n\t\t\tstopEditing   : this.gridCellEditorHandler.stopEditing.bind(this.gridCellEditorHandler),\n\t\t\tapi           : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER),\n\t\t\tevent         : event\n\t\t};\n    }\n\n\tpublic setUserPresence(params ?: IUserPresenceEventParams ) : void {\n\t\tconst userPresenceHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.USER_PRESENCE_HANDLER) as UserPresenceHandler;\n\t\tif(this.cellPosition) {\n\n\t\t\tconst userPresenceItem = userPresenceHandler.getUserPresence(this.cellPosition.rowID, this.cellPosition.columnID);\n\n\t\t\tif(userPresenceItem) {\n\t\t\t\tif(params && params.forceNewRenderer) {\n\t\t\t\t\tthis.addListener(userPresenceItem, GRID_USER_PRESENCE_EVENTS.EVENTS_ITEM_DESTROYED, this.onUserPresenceUpdate.bind(this, userPresenceItem))\n\t\t\t\t\tthis.addListener(userPresenceItem, GRID_USER_PRESENCE_EVENTS.EVENTS_ITEM_REFRESHED, this.onUserPresenceUpdate.bind(this, userPresenceItem))\n\t\t\t\t\tthis.addListener(userPresenceItem, GRID_USER_PRESENCE_EVENTS.EVENTS_ITEM_REMOVED, this.onUserPresenceUpdate.bind(this, userPresenceItem));\n\t\t\t\t}\n\t\t\t\tthis.onUserPresenceUpdate(userPresenceItem)\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t}\n\n\tprivate onUserPresenceUpdate(userPresenceItem, params ?: ICellUserPresenceParams) : void {\n\t\tconst userPresenceHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.USER_PRESENCE_HANDLER) as UserPresenceHandler;\n\t\tuserPresenceItem && this.component.setUserPresenceDetails(this.createUserPresenceConfig(userPresenceItem), params);\n\t\tconst hasAnyUserPresenceForRow =  userPresenceHandler.hasAnyUserPresenceForRow(this.cellPosition.rowID);\n\t\tconst elements = this.rowController.getAllRowElement();\n\t\telements.forEach((element) => {\n\t\t\telement.component.addOrRemoveCssClass('ZG-row-userpresence--active', hasAnyUserPresenceForRow);\n\t\t})\n\t}\n\n\tprivate createUserPresenceConfig(userPresence : UserPresenceItem) : IUserPresence {\n\t\treturn {\n\t\t\titems           : userPresence.getItems(),\n\t\t\tpriorityID      : userPresence.getPriorityID(),\n\t\t\tcustomComparator: userPresence.getCustomComparator(),\n\t\t\tsortType        : userPresence.getSortType()\n\t\t}\n\t}\n\n\n\tdispatchEditStarted(key : string | null, event : Event | null) : void {\n\n\t\tconst events = this.createCellEditorEvents(key,event, this.getEditStartHookName());\n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER);\n\n\t\teventHandler.dispatchEvent(events);\n\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\n\t\toptionHandler.onAfter(this.getEditStartHookName(), events);\n\t\t\n\t}\n\n\tdispatchEditEnded(key : string | null,event : Event | null) : void {\n\n\t\tconst events = this.createCellEditorEvents(key,event, this.getEditStopHookName());\n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER);\n\n\t\teventHandler.dispatchEvent(events);\n\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\n\t\toptionHandler.onAfter(this.getEditStopHookName(), events);\n\t}\n\n\tcreateCellEditorEvents(key,events : Event | null, type : string, value : any = null) {\n\t\tconst api              = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER) as IAPIHandler;\n\t\treturn {\n\t\t\ttype,\n\t\t\tevent            : events,\n\t\t\tinstanceAPI      : api,\n\t\t\teventKey         : key,\n\t\t\tvalue            : value ?? this.rowNode.getDataByKey(this.column.getColumnKey()),\n\t\t\tdata             : this.rowNode.getRowData(),\n\t\t\tparentElement    : this.component.getParentValueElement(),\n\t\t\tcellElement      : this.component.getElement(),\n\t\t\tcolumnID         : this.column.getID(),\n\t\t\trowID            : this.rowNode.getId(),\n\t\t\trowIndex         : this.cellPosition.rowIndex,\n\t\t\tpinPosition      : this.cellPosition.pinPosition,\n\t\t\tcolumnIndex      : this.column.getIndex(),\n\t\t\tabsoluteRowIndex : this.cellPosition.absoluteRowIndex,\n\t\t};\n\t}\n\n\tgetCellRenderer() : ICellRendererComponent {\n\t\tif(this.rowNode.isLoaded()) {\n\t\t\treturn this.component.getCellRenderer();\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic setFocusOutOnEditor(): void {\n        if (!this.editing) { return; }\n\n        const cellEditor = this.component.getCellEditor();\n\n        if (cellEditor && cellEditor.blur) {\n            cellEditor.blur();\n        }\n    }\n\n    public setFocusInOnEditor(): void {\n        if (!this.editing) { return; }\n\n        const cellEditor = this.component.getCellEditor();\n\n        if (cellEditor && cellEditor.focus) {\n            cellEditor.focus();\n        } else {\n            this.focus();\n        }\n    }\n\n\tpublic onRangeSelectionChanged() : void {\n\t\tif(this.cellRangeHandler) {\n\t\t\tthis.cellRangeHandler.onRangeSelectionChanged();\n\t\t}\n\t}\n\n\tpublic onColumnSelectionChanged() : void {\n\t\tconst isRowLoading = this.rowNode.isLoaded();\n\t\tif(!isRowLoading) {\n\t\t\treturn;\n\t\t}\n\t\tconst columnSelection = this.getBeanInstanceByBeanName('columnSelection');\n\t\tconst isColumnSelected = columnSelection.isColumnSelected(this.column.getID());\n\t\tthis.component.addOrRemoveCssClass('ZG-column-selected', !!isColumnSelected);\n\t}\n\n\tprivate isSameCellFocused(current : any, target : any) : boolean {\n        if(current === null || target === null) return false;\n    \n        const colsMatch        = current.columnID    === target.columnID;\n        const floatingMatch    = current.pinPosition === target.pinPosition;\n        const indexMatch       = current.rowIndex    === target.rowIndex;\n        const isParentKeyMatch = areArraysEqual(current.parentKeys, target.parentKeys)\n        return colsMatch && floatingMatch && indexMatch && isParentKeyMatch;\n    \n    }\n\n\tprivate onMouseDown(mouseEvent: MouseEvent): void {\n\t\tconst { ctrlKey, metaKey, shiftKey } = mouseEvent;\n\t\n\t\tconst gridOptions       = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_OPTIONS);\n\t\tconst optionHandler     = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst navigationService = this.getBeanInstanceByBeanName('navigationService');\n\t\tconst gridAPI           = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_API) as IGridAPI;\n\t\n\t\tconst suppressMouseDownEvent = gridOptions.suppressMouseDownEvent;\n\t\tconst clearSelectionOnMouseDown = optionHandler.clearSelectionOnMouseDown();\n\t\n\t\t// Suppress mouse down event if required\n\t\tif (suppressMouseDownEvent) {\n\t\t\tconst isMouseDownSuppressed = suppressMouseDownEvent({ event: mouseEvent, type: \"cell\", meta: this.cellPosition });\n\t\t\tif (isMouseDownSuppressed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\t\tlet isCurrentCellFocused = true;\n\t\n\t\t// Focus callback\n\t\tconst focusCallBack = (mouseEvent: MouseEvent, force : boolean = false): void => {\n\t\t\tconst focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\t\tconst isFloatingRecord = this.cellPosition.pinPosition == 'FloatingRecord';\n\t\t\tconst focusedParams: CellFocusParams = {\n\t\t\t\t...this.cellPosition,\n\t\t\t\trowIndex    : isFloatingRecord ? 0 : this.cellPosition.rowIndex,\n\t\t\t\teventOrigin : 'ui',\n\t\t\t\tevent       : mouseEvent\n\t\t\t};\n\t\t\tconst prevFocusedCell = focusHandler.getFocusedCellPosition();\n\n\t\t\tif(force) {\n\t\t\t\tisCurrentCellFocused = focusHandler.setFocusedCell(focusedParams);\t\n\t\t\t}else if (!prevFocusedCell || !this.isSameCellFocused(prevFocusedCell, this.cellPosition)) {\n\t\t\t\tisCurrentCellFocused = focusHandler.setFocusedCell(focusedParams);\n\t\t\t}\n\t\t};\n\t\n\t\tif (this.type !== \"summarycell\" && this.type !== \"rowHeader\") {\n\t\t\tconst rangeSelectionHandler = this.getBeanInstanceByBeanName('rangeSelectionHandler') as IRangeSelectionHandler;\n\t\t\tconst focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\t\tconst rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as RowRenderController;\n\t\n\t\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as IRowSelectionHandler;\n\t\t\tconst columnSelectionHandler = this.getBeanInstanceByBeanName('columnSelection') as IColumnSelection;\n\t\n\t\t\tconst isRowSelected = rowSelectionHandler.isRowSelected(this.cellPosition);\n\t\t\tconst isColumnSelected = columnSelectionHandler.isColumnSelected(this.cellPosition.columnID);\n\t\t\tconst hasRanges = rangeSelectionHandler && rangeSelectionHandler.getCellRanges().length > 0;\n\t\n\t\t\tconst isClearSelectionOnCellRightClick = optionHandler.isClearSelectionOnCellRightClick();\n\t\t\tconst isRangeSelected = this.isRangeIsSelected();\n\t\t\tif (isClearSelectionOnCellRightClick && (isColumnSelected || isRowSelected || isRangeSelected) && this.isRightClickByEvent(mouseEvent)) {\n\t\t\t\tmouseEvent.preventDefault();\n\t\t\t\tmouseEvent.stopPropagation();\n\t\n\t\t\t\tfocusCallBack(mouseEvent);\n\t\t\t\t// this.onCellContextMenu(mouseEvent, isRowSelected, isColumnSelected);\n\t\t\t\treturn;\n\t\t\t}\n\t\n\t\t\tif(clearSelectionOnMouseDown) {\n\t\t\t\t// gridAPI.clearAllSelections();\n\t\t\t}\n\t\n\t\t\tif (!shiftKey || !hasRanges) {\n\t\t\t\tfocusCallBack(mouseEvent, true);\n\t\t\t}\n\t\n\t\t\tconst isCellFocused = focusHandler.isCellFocused(this.cellPosition);\n\t\n\t\t\tif (shiftKey && hasRanges && !isCellFocused) {\n\t\t\t\tmouseEvent.preventDefault();\n\t\n\t\t\t\tconst focusedCellPosition = focusHandler.getFocusedCellPosition();\n\t\t\t\tif (focusedCellPosition) {\n\t\t\t\t\tconst focusedRowController = rowRenderController.getRowByPosition(focusedCellPosition);\n\t\t\t\t\tconst focusedCellController = focusedRowController?.getCellController(focusedCellPosition.columnID);\n\t\n\t\t\t\t\tif (focusedCellController?.isEditing()) {\n\t\t\t\t\t\tthis.gridCellEditorHandler.stopEditing();\n\t\t\t\t\t}\n\t\n\t\t\t\t\tconst focusedParams: CellFocusParams = {\n\t\t\t\t\t\t...focusedCellPosition,\n\t\t\t\t\t\teventOrigin: 'ui',\n\t\t\t\t\t\tevent: mouseEvent\n\t\t\t\t\t};\n\t\n\t\t\t\t\tisCurrentCellFocused = focusHandler.setFocusedCell(focusedParams);\n\t\t\t\t}\n\t\t\t}\n\n\t\n\t\t\tif (isCurrentCellFocused && rangeSelectionHandler) {\n\t\t\t\tconst activeCell = this.cellPosition;\n\t\n\t\t\t\tif (shiftKey) {\n\t\t\t\t\trangeSelectionHandler.extendLatestRangeToCell(activeCell);\n\t\t\t\t} else {\n\t\t\t\t\tconst isMultiKey = ctrlKey || metaKey;\n\t\t\t\t\trangeSelectionHandler.setRange(activeCell, isMultiKey);\n\t\t\t\t\tfocusCallBack(mouseEvent)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\n\t\t// Ensure cell visibility\n\t\tisCurrentCellFocused && navigationService.ensureCellVisible(this.cellPosition);\n\t\n\t\t// Trigger grid mouse down event\n\t\tgridEvent.onCellMouseDown({\n\t\t\tmouseEvent,\n\t\t\trowIndex   : this.cellPosition.rowIndex,\n\t\t\tpinPosition: this.cellPosition.pinPosition,\n\t\t\tcolumnIndex: this.cellPosition.columnIndex,\n\t\t\tcolumnID   : this.cellPosition.columnID,\n\t\t\trowID      : this.cellPosition.rowID,\n\t\t\tinstanceAPI: gridAPI\n\t\t});\n\t}\n\t\n\n\tprivate isRightClickByEvent(event : MouseEvent) : boolean {\n\t\tif(event.button === 2) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate isRangeIsSelected() : boolean {\n\t\tconst rangeSelectionHandler = this.getBeanInstanceByBeanName('rangeSelectionHandler') as IRangeSelectionHandler;\n\t\tif(rangeSelectionHandler) {\n\t\t\tconst cellInRange = rangeSelectionHandler.isCellExistAnyRange(this.getCellPosition());\n\t\t\tif(cellInRange) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\tpublic processPrintableCharacter(event : KeyboardEvent) : void {\n\t\tconst eventTarget = event.target;\n\t\tconst isSameEventTarget = eventTarget === this.component.getElement();\n\n\t\tif(!isSameEventTarget || this.isEditing()) {\n\t\t\treturn;\n\t\t}  \n\n\t\tconst key = event.key;\n\t\t// const isPrintableChar = isPrintableCharacter(key)\n\n\t\t// if(isPrintableChar) {\n\t\t\t// this.startEditing(key, event);\n\t\t\tthis.gridCellEditorHandler.startEditing(this, key, event);\n\t\t\tevent.preventDefault();\n\t\t// }\n\t\t// else {\n\t\t// \t// this.stopEditing();\n\t\t// \tthis.gridCellEditorHandler.stopEditing();\n\t\t// \t// event.preventDefault();\n\t\t// }\n\t}\n\n\tprivate registerRowSelection(params : IRegisterRowSelection) : void {\n\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif(optionHandler.getRowSelection() === 'none') {\n\t\t\treturn;\n\t\t}\n\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as any;\n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER) as EventHandler;\n\n\t\tthis.addRowSelectionDestroyCallback.forEach((callback) => callback());\n\t\tthis.addRowSelectionDestroyCallback = [];\n\n\t\t// const id = this.rowNode.getId();\n\t\tthis.addRowSelectionListener(params.element, \"mousedown\", (_event) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t})\n\t\tthis.addRowSelectionListener(params.element, 'click',(event : PointerEvent) => {\n\t\t\tevent.preventDefault();\n\t\t\trowSelectionHandler.setRowSelected({\n\t\t\t\tvalues     : [this.cellPosition],\n\t\t\t\tselected   : event.shiftKey ? true: !rowSelectionHandler.isRowSelected(this.cellPosition),\n\t\t\t\tsource     : 'ui',\n\t\t\t\trangeSelect: event.shiftKey\n\t\t\t});\n\t\t})\n\n\t\tif(params.onRowSelectionChange) {\n\t\t\tthis.addRowSelectionListener(eventHandler, 'rowSelectionChanged', (event : any) => {\n\t\t\t\tparams.onRowSelectionChange({\n\t\t\t\t\t...event,\n\t\t\t\t\trowSelected : rowSelectionHandler.isRowSelected(this.cellPosition)\n\t\t\t\t})\n\t\t\t});\n\t\t}\n\n\t\tthis.addDestroyFunc(() => {\n\t\t\tparams.element = null;\n\t\t\tparams.onRowSelectionChange = undefined;\n\t\t})\n\t}\n\n\tprivate addRowSelectionListener(eventHandler : HTMLElement | EventHandler, event : any, callback : any) {\n\t\teventHandler.addEventListener(event, callback);\n\t\tthis.addRowSelectionDestroyFunc(() => {\n\t\t\teventHandler.removeEventListener(event, callback);\n\t\t})\n\t}\n\n\n\tprivate addRowSelectionDestroyFunc(callback : CallableFunction) : void {\n\t\tthis.addRowSelectionDestroyCallback.push(callback);\n\t}\n\n\tcreateDefinitionParam() : any {\n        const optionHandler            = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const rowreorderRenderer = optionHandler.getRowReoderRenderer();\n        const userProvidedRenderParam = optionHandler.getRowReorderRendererParams();\n        return {\n            getRenderer : ()=>rowreorderRenderer,\n            getRendererParam : ()=>userProvidedRenderParam\n        }\n    }\n\n\tcreateRowReorderParams(sourceRows) : IRowReoderParams {\n        const APIHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER)\n        return {\n            values: sourceRows,\n            APIs  : APIHandler\n        }\n    }\n\n\tgetCellEditor() : ICellEditorComponent {\n\t\treturn this.component.getCellEditor();\n\t}\n\n\tupdateCellEditorDimensions() : void {\n\t\tconst cellEditorComponent = this.component as unknown as CellComponent;\n\t\tif(cellEditorComponent) {\n\t\t\tcellEditorComponent.updateCellEditorDimensions();\n\t\t}\n\t}\n\n\t// need to remove\n\topenCustomTooltip(element : HTMLElement, value : string) : {hideTooltip : CallableFunction} {\n\t\tconst configuration = {\n\t\t\tpopupParent       : this.getPopupParant(),\n\t\t\ttooltipValue      : value,\n\t\t\tgapY              : 5,\n\t\t\tgapX              : 0,\n\t\t\tposition          : 'bottomRight',\n\t\t\tshouldAttachEvents: false,\n\t\t\tshouldShowTooltip : () => true,\n\t\t\thideTooltip       : false,\n\t\t\tarrow             : true\n\t\t} as ITooltipConfiguration;\n\n\n\t\tconst tooltipComponent = new Tooltip(element, configuration);\n\t\ttooltipComponent.api.open();\n\n\t\treturn {\n\t\t\thideTooltip : () => tooltipComponent.api.close()\n\t\t}\n\t}\n\n\tupdateClassNames() : void {\n\t\tthis.addFirstColumnClass();\n\t\tthis.addLastColumnClass();\n\t\tthis.addRightPinnedColumnClass();\n\t\tthis.addLeftPinnedColumnClass();\n\t\tthis.addCenterPinnedColumnClass();\n\t}\n\n\tprivate addLastColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst lastColumnId = fieldHandler.getLastColumnID();\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--last', lastColumnId === this.column.getID());\n\t}\n\t\n\tprivate addFirstColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst firstColumnId = fieldHandler.getFirstColumnID();\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--first', firstColumnId === this.column.getID());\n\t}\n\t\n\tprivate addLeftPinnedColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst rightHandler = fieldHandler.getLeftHandler();\n\t\tconst isLeftFirstColumn = rightHandler.getFirstColumnID() === this.column.getID();\n\t\tconst isLeftLastColumn = rightHandler.getLastColumnID() === this.column.getID();\n\t\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-left-first', isLeftFirstColumn);\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-left-last', isLeftLastColumn);\n\t\n\t}\n\t\n\tprivate addRightPinnedColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst rightHandler = fieldHandler.getRightHandler();\n\t\tconst isFirstColumn = rightHandler.getFirstColumnID() === this.column.getID();\n\t\tconst isLastColumn = rightHandler.getLastColumnID() === this.column.getID();\n\t\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-right-first', isFirstColumn);\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-right-last', isLastColumn);\n\t\n\t}\n\n\tprivate addCenterPinnedColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst centerHandler = fieldHandler.getCenterHandler();\n\t\tconst isFirstColumn = centerHandler.getFirstColumnID() === this.column.getID();\n\t\tconst isLastColumn = centerHandler.getLastColumnID() === this.column.getID();\n\t\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-center-first', isFirstColumn);\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-center-last', isLastColumn);\n\t\n\t}\n\n\tpublic clearUserPresenceDropdown() : void {\n\t\tthis.component && this.component.closeUserPresenceDropdown();\n\t}\n\n\tpublic clearEditorTooltip() : void {\n\t\tthis.destroyEditorToolTip();\n\t}\n\n\n\tpublic isGroupCell(): boolean {\n\t\treturn this.rowNode.isGroupRow();\n\t}\n}\n\n\n","import { IColumnNode } from \"../../../../../Core/Interface/IColumnNode\";\nimport { IRowNode } from \"../../../../../Core/Interface/IRowNode\";\nimport { CellController } from \"./CellController\";\n\nexport interface ICellControllerWrapper {\n    getColumn()                                        : IColumnNode;\n    getRowNode()                                       : IRowNode;\n    setComponent(component: any, element : HTMLElement): void\n    getController()                                    : CellController;\n    getInstanceId()                                    : string;\n    stopEditing(cancel ?: boolean, event ?: KeyboardEvent, suppressNavigation ?: boolean) : { editing : boolean, isNewValue : boolean };\n    openTooltip(element : HTMLElement, value : string) : {hideTooltip : CallableFunction};\n}\n\nexport function CellControllerWrapper(cellController : CellController) : ICellControllerWrapper {\n    return {\n        getColumn() {\n            return cellController.getColumn();\n        },\n        getRowNode() {\n            return cellController.getRowNode();\n        },\n        setComponent(component: any) {\n            return cellController.setComponent(component)\n        },\n        getController() {\n            return cellController;\n        },\n        getInstanceId() : string {\n            return cellController.getInstanceID();\n        },\n        stopEditing(cancel :boolean, event : KeyboardEvent, suppressNavigation : boolean) : { editing : boolean, isNewValue : boolean }{\n            return cellController.stopEditing(cancel, event, suppressNavigation);\n        },\n        openTooltip(element, value) {\n            return cellController.openCustomTooltip(element, value);\n        },\n    }\n}","import { Bean, PostConstruct, AutoWired, BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../../../../Core/Constants/BeanName\";\nimport { CellFocusParams, focusedCellPosition, IFocusHandler } from \"../../../../../Core/Navigation/focus-handler.types\";\nimport { ICellControllerWrapper } from \"./CellControllerWrapper\";\nimport { GridOptioHandler } from \"../../../../../Core/GridOptionHandler\";\nimport { ICellPosition } from \"./CellController\";\nimport { FieldHandler } from \"../../../../../Core/Columns/FieldHandler\";\n\nexport interface ICellInnerNavigationController {\n    focusDomAttacher(cellValueElement: HTMLElement, cellGui: HTMLElement): void;\n    setInitialFocus(cellController: ICellControllerWrapper, optionsHandler: GridOptioHandler, cellElement: HTMLElement): void;\n    getFocusTrapStart(): HTMLElement | null;\n    getFocusTrapEnd(): HTMLElement | null;\n    onBeforeCellSelection(params :CellFocusParams): void;\n    setFocustoTrapElements(cellPosition : ICellPosition): void;\n    removeFocustoTrapElements(): void;\n}\n\n@Bean(GRID_BEAN_NAME.CELL_INNER_NAVIGATION_CONTROLLER)\nexport class CellInnerNavigationController implements ICellInnerNavigationController {\n    \n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler: FieldHandler;\n    private focusTrapStart                : HTMLElement = null;\n    private focusTrapEnd                  : HTMLElement = null;\n\n    private previousCellPosition :ICellPosition | focusedCellPosition = null;\n    @PostConstruct()\n    init() {\n        this.focusTrapStart = document.createElement(\"div\");\n        this.focusTrapStart.classList.add(\"ZG-focusTrap\", 'focus-trap-start');\n        this.focusTrapStart.setAttribute(\"tabindex\", \"0\");\n        this.focusTrapEnd = document.createElement(\"div\");\n        this.focusTrapEnd.classList.add(\"ZG-focusTrap\", 'focus-trap-end');\n        this.focusTrapEnd.setAttribute(\"tabindex\", \"0\");\n    }\n    onBeforeCellSelection(params :CellFocusParams): void {\n        if((params.event instanceof MouseEvent)){\n            this.previousCellPosition = null;\n        }\n        else {\n            const focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n            this.previousCellPosition = focusHandler.getPreviousFocusedCellPosition();\n        }\n    }\n\n    \n    focusDomAttacher(cellValueElement: HTMLElement, cellGui: HTMLElement): void {\n        cellValueElement.prepend(this.focusTrapStart);\n        cellValueElement.appendChild(this.focusTrapEnd);\n        this.addListener(cellGui);\n        \n    }\n\n    private addListener(cellGui: HTMLElement): void {\n        cellGui.addEventListener('keydown', (event) => {\n            const isTabKey    = event.key == 'Tab';\n            const isShift     = event.shiftKey;\n            const isFirstFocus    = event.target == this.focusTrapStart;\n            const isLastFocus     = event.target == this.focusTrapEnd;\n            const startTrapCheck  = isFirstFocus && isTabKey && !isShift;\n            const endTrapCheck    = isLastFocus && isTabKey && isShift;\n            const otherCheck      = !isFirstFocus && !isLastFocus && isTabKey;\n\n            if (startTrapCheck || endTrapCheck || otherCheck) {\n                event.stopPropagation();\n            }\n        });\n    }\n\n    setInitialFocus(cellController: ICellControllerWrapper, optionsHandler: GridOptioHandler): void {\n        const innerCellNavigationCallback = optionsHandler.getInnerCellNavigation();\n        if (innerCellNavigationCallback) {\n            const controller = cellController.getController();\n            const cellPosition = controller.getCellPosition();\n            this.setFocustoTrapElements(cellPosition);\n        }\n    }\n    setFocustoTrapElements(cellPosition : ICellPosition){\n        if (this.previousCellPosition && cellPosition) {\n            const currentColumnIndex    = this.fieldHandler.getIndexById(cellPosition.columnID);\n            const lastColumnIndex       = this.fieldHandler.getIndexById(this.previousCellPosition.columnID);\n            const isColumnIncreased     = currentColumnIndex > lastColumnIndex;\n            const isColumnDecreased     = currentColumnIndex < lastColumnIndex;\n            if (isColumnIncreased) {\n                this.focusTrapStart.focus();\n            } else if (isColumnDecreased) {\n                this.focusTrapEnd.focus();\n            }\n        }\n        else{\n            this.focusTrapStart.focus();\n        }\n    }\n\n\n    getFocusTrapStart(): HTMLElement | null {\n        return this.focusTrapStart;\n    }\n\n    getFocusTrapEnd(): HTMLElement | null {\n        return this.focusTrapEnd;\n    }\n\n    removeFocustoTrapElements(): void {\n        this.focusTrapStart.remove();\n        this.focusTrapEnd.remove();\n    }\n\n}","import { BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport {  IColumnNode, IRowNode } from \"../../../../../Main\";\nimport { GRID_BEAN_NAME } from \"../../../../../Core/Constants/BeanName\";\nimport { FieldHandler } from \"../../../../../Core/Columns/FieldHandler\";\nimport { GridOptioHandler } from \"../../../../../Core/GridOptionHandler\";\nimport { IGridLayoutPositionHandler } from \"Grid/Core/Interface/IGridLayoutPositionHandler\";\n\nexport class CellPositionHandler {\n    private readonly column                   : IColumnNode;\n\tprivate readonly getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\tprivate columnSpanningList                : IColumnNode[];\n\tprivate element                           : HTMLElement;\n\tprivate row                               : IRowNode;\n\n\tconstructor( column: IColumnNode, row: IRowNode, getBeanInstanceByBeanName: getBeanInstanceByBeanName, ) {\n\t\tthis.column                    = column;\n\t\tthis.row                       = row;\n\t\tthis.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n\t}\n\n\tpublic setComponent(element: HTMLElement): void {\n\t\tthis.element = element;\n\n\t\tthis.setupColSpan();\n\n\t\tthis.onLeftChanged();\n\t\tthis.onWidthChanged();\n\n\t\tthis.onHeightChanged();\n\t}\n\n\tprivate onHeightChanged() : void {\n\t\tif(!this.element) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst gridLayoutPositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER) as IGridLayoutPositionHandler;\n\n\t\tconst height = gridLayoutPositionHandler.getCellHeight(this.row, this.column);\n\t\theight && (this.element.style.setProperty(\"--ZG-groupingheader-cell-height\",`${height}px` ));\n\t\t\n\t}\n\n    public onLeftChanged() {\n\t\tif(!this.element) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst gridLayoutPositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER) as IGridLayoutPositionHandler;\n\n\t\tconst left = gridLayoutPositionHandler.getCellLeft(this.row, this.column, this.getCellLeft.bind(this));\n\n\t\tthis.element.style.left = `${left}px`;\n\t}\n\n\tpublic onWidthChanged() : void {\n\t\tif(!this.element) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst gridLayoutPositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER) as IGridLayoutPositionHandler;\n\n\t\tconst width = gridLayoutPositionHandler.getCellWidth(this.row, this.column, this.getCellWidth.bind(this));\n\n        this.element.style.width = `${width}px`;\n\t}\n\n    private getCellWidth(): number {\n        if (!this.columnSpanningList) {\n            return this.column.getWidth();\n        }\n\n        return this.columnSpanningList.reduce((width, col) => width + col.getWidth(), 0);\n    }\n\n    private getCellLeft(): number | null {\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n        let column: IColumnNode;\n\n        if (optionHandler.isRTL() && this.columnSpanningList) {\n            column = this.columnSpanningList[this.columnSpanningList.length - 1];\n        } else {\n            column = this.column;\n        }\n\n        return column.getLeft();\n    }\n\n\tprivate setupColSpan(): void {\n\t}\n\n\tpublic getColSpanningList(columnSpan: number): IColumnNode[] {\n\t\tconst columnSpanningList: IColumnNode[] = [];\n\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.FIELD_HANDLER, ) as FieldHandler;\n\n\t\tif (columnSpan === 1) {\n\t\t\tcolumnSpanningList.push(this.column);\n\t\t} else {\n\t\t\tlet pointer = this.column;\n\t\t\tconst pinned = this.column.getPinnedPosition();\n\t\t\tfor (let i = 0; pointer && i < columnSpan; i++) {\n\t\t\t\tcolumnSpanningList.push(pointer);\n\t\t\t\tconst nextColumnId = fieldHandler.getNextID(pointer.getID());\n\t\t\t\tif (!nextColumnId) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tpointer = fieldHandler.getColumnNodeByID(nextColumnId);\n\t\t\t\tif (pinned !== pointer.getPinnedPosition()) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn columnSpanningList;\n\t}\n\n\t// private getColumnSpanParams(): ColumnSpanParams {\n\t// \treturn {\n\t// \t\tcolumnId: this.column.getColumnKey(),\n\t// \t\trowIndex: this.row.getIndex(),\n\t// \t\trowId: this.row.getId(),\n\t// \t\trowPinPosition: this.row.getPinnedPosition(),\n\t// \t\tdata: this.row.getRowData(),\n\t// \t\tvalue: this.row.getDataByKey(this.column.getColumnKey()),\n\t// \t};\n\t// }\n\n    public destroy(): void {\n        this.columnSpanningList = null;\n        this.element = null;\n    }\n}","import { EventEmitter, getBeanInstanceByBeanName } from '@dg/corecomponent';\nimport { SELECTION_TYPE } from '../../../../Interface/Selection/ISelectionInterface';\nimport { CellController } from './CellController';\nimport { ICellComponent } from './ICellComponent';\nimport { IRowNode } from '../../../../../Core/Interface/IRowNode';\nimport { IColumnNode } from '../../../../../Core/Interface/IColumnNode';\nimport { GRID_BEAN_NAME } from '../../../../../Core/Constants/BeanName';\nimport { StylingHandler } from '../../../../../Core/StylingHandler';\nimport { HeaderCellController, IHeaderCellComponent } from '../../../../Header/Cell/HeaderCellController';\n\ninterface Border {\n\tleft?: boolean;\n\tright?: boolean;\n\ttop?: boolean;\n\tbottom?: boolean;\n}\nexport class CellStyle extends EventEmitter {\n\tprivate component: ICellComponent | IHeaderCellComponent;\n\tprivate readonly rowNode  : IRowNode;\n\tprivate readonly column   : IColumnNode;\n    private staticClasses: string[] = [];\n\n\tconstructor(cellController: CellController | HeaderCellController, private getBeanInstanceByBeanName : getBeanInstanceByBeanName) {\n\t\tsuper();\n\t\tthis.column = cellController.getColumn();\n\t\tif(cellController instanceof CellController) {\n\t\t\tthis.rowNode = cellController.getRowNode && cellController.getRowNode();\n\t\t}\n\t}\n\n\tapplyCellStyles(priority) {\n\t\tconst styleOrder = [\n\t\t\tSELECTION_TYPE.FILL_SERIES,\n\t\t\tSELECTION_TYPE.RANGE,\n\t\t\tSELECTION_TYPE.ROW,\n\t\t\tSELECTION_TYPE.COLUMN,\n\t\t\tSELECTION_TYPE.CELL,\n\t\t];\n\t\tconst directions = ['top', 'right', 'bottom', 'left', 'background'];\n\t\tfor (let i = 0; i < directions.length; i++) {\n\t\t\tconst direction = directions[i];\n\t\t\tlet isApplied = false;\n\t\t\tfor (let j = 0; j < styleOrder.length; j++) {\n\t\t\t\tif (isApplied) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst style = styleOrder[j];\n\t\t\t\tif (priority[direction].includes(style)) {\n\t\t\t\t\tisApplied = true;\n\t\t\t\t\tswitch (style) {\n\t\t\t\t\t\tcase SELECTION_TYPE.RANGE:\n\t\t\t\t\t\tcase SELECTION_TYPE.ROW:\n\t\t\t\t\t\tcase SELECTION_TYPE.COLUMN:\n\t\t\t\t\t\t\tthis.applyCellRangeSelection({ [direction]: true });\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SELECTION_TYPE.CELL:\n\t\t\t\t\t\t\tif (direction != 'background') {\n\t\t\t\t\t\t\t\tthis.applyCellSelection({ [direction]: true });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase SELECTION_TYPE.FILL_SERIES:\n\t\t\t\t\t\t\tthis.applyCellFillSeriesSelection({\n\t\t\t\t\t\t\t\t[direction]: true,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetComponent(component: ICellComponent | IHeaderCellComponent) {\n\t\tthis.component = component;\n\t\tthis.applyClasses();\n\t}\n\n\tapplyCellSelection(border: Border): void {\n\t\tconst isRange =\n\t\t\tborder.top || border.bottom || border.right || border.left;\n\t\tthis.component.addOrRemoveCssClass('ZG-cellSelection', isRange);\n\t\tif (border.left) {\n\t\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeLeft', border.left);\n\t\t}\n\n\t\tif (border.right) {\n\t\t\tthis.component.addOrRemoveCssClass(\n\t\t\t\t'ZG-cellRangeRight',\n\t\t\t\tborder.right,\n\t\t\t);\n\t\t}\n\n\t\tif (border.top) {\n\t\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeTop', border.top);\n\t\t}\n\n\t\tif (border.bottom) {\n\t\t\tthis.component.addOrRemoveCssClass(\n\t\t\t\t'ZG-cellRangeBottom',\n\t\t\t\tborder.bottom,\n\t\t\t);\n\t\t}\n\t}\n\n\tremoveCellSelection(): void {\n\t\tthis.component.addOrRemoveCssClass('ZG-cellSelection', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeTop', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeBottom', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeLeft', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeRight', false);\n\t}\n\n\tremoveRangeSelection(): void {\n\t\t// this.component.addOrRemoveCssClass('ZG-cellSelection', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeSelected', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeLeft', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeRight', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeTop', false);\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeBottom', false);\n\t}\n\n\tapplyCellRangeSelection(border: Border): void {\n\t\tconst isRange = true; //border.top || border.bottom || border.right || border.left ;\n\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeSelected', isRange);\n\t\t// this.component.addOrRemoveCssClass('ZG-cellSelection', isRange);\n\t\tif (border.left) {\n\t\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeLeft', border.left);\n\t\t}\n\n\t\tif (border.right) {\n\t\t\tthis.component.addOrRemoveCssClass(\n\t\t\t\t'ZG-cellRangeRight',\n\t\t\t\tborder.right,\n\t\t\t);\n\t\t}\n\n\t\tif (border.top) {\n\t\t\tthis.component.addOrRemoveCssClass('ZG-cellRangeTop', border.top);\n\t\t}\n\n\t\tif (border.bottom) {\n\t\t\tthis.component.addOrRemoveCssClass(\n\t\t\t\t'ZG-cellRangeBottom',\n\t\t\t\tborder.bottom,\n\t\t\t);\n\t\t}\n\t}\n\n\tapplyCellFillSeriesSelection(border: Border): void {\n\t\tconst isRange =\n\t\t\tborder.top || border.bottom || border.right || border.left;\n\t\tthis.component.addOrRemoveCssClass('ZG-selectionFill', isRange);\n\n\t\tif (border.left) {\n\t\t\tthis.component.addOrRemoveCssClass(\n\t\t\t\t'ZG-fillseries__selection--left',\n\t\t\t\tborder.left,\n\t\t\t);\n\t\t}\n\n\t\tif (border.right) {\n\t\t\tthis.component.addOrRemoveCssClass(\n\t\t\t\t'ZG-fillseries__selection--right',\n\t\t\t\tborder.right,\n\t\t\t);\n\t\t}\n\n\t\tif (border.top) {\n\t\t\tthis.component.addOrRemoveCssClass(\n\t\t\t\t'ZG-fillseries__selection--top',\n\t\t\t\tborder.top,\n\t\t\t);\n\t\t}\n\n\t\tif (border.bottom) {\n\t\t\tthis.component.addOrRemoveCssClass(\n\t\t\t\t'ZG-fillseries__selection--bottom',\n\t\t\t\tborder.bottom,\n\t\t\t);\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tsuper.destroy();\n\t}\n\n\tpublic applyClasses() {\n\t\tif (!this.rowNode || !this.column.getCellClass) {\n\t\t\treturn;\n\t\t}\n\t\tconst cellClass       = this.column.getCellClass();\n\t\tconst value           = this.rowNode.getDataByKey(this.column.getColumnKey() ?? '')\n\t\tconst StylingHandler  = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.STYLING_HANDLER) as StylingHandler;\n\n\t\tconst cellClassParams = {\n            value    : value,\n            data     : this.rowNode.getRowData(),\n            node     : this.rowNode,\n            column   : this.column,\n            rowIndex : this.rowNode.getIndex()!\n        };\n\n        if (this.staticClasses.length) {\n            this.staticClasses.forEach(className => this.component.addOrRemoveCssClass(className, false));\n        }\n\n        this.staticClasses = StylingHandler.getStaticCellClasses(cellClass, cellClassParams);\n\n        if (this.staticClasses.length) {\n            this.staticClasses.forEach(className => this.component.addOrRemoveCssClass(className, true));\n        }\n    }\n}\n","import { AutoWired, PostConstruct } from \"@dg/corecomponent\";\nimport { ICellEditorParams } from \"../../../../../Interface/CellEditor/ICellEditorParam\";\nimport { PopupComponent } from \"../../../../../PopupComponent\";\nimport { KeyEventHandler } from \"../../../../../../../../Sub_Components/src/KeyEventsComponent/KeyEventHandler\";\nimport { _isEventFromPrintableCharacter } from \"../../../../../../Core/utils/Generic\";\nimport { getControllerFromTargetElement } from \"../../../../../../Core/utils/Dom\";\nimport { CellController } from \"../CellController\";\nimport { RowController } from \"../../Row/RowController\";\nimport { IController } from \"../../../RowContainerEventHandler\";\nimport { KeyboardShortcutRegistry } from \"../../../../../../Core/actions/key-board-shortcut-registry\";\nimport { HeaderCellController } from \"../../../../../Header/Cell/HeaderCellController\";\n\nfunction getTemplate() {\n    const div = document.createElement(\"div\");\n    const template = '<div class=\"ZG-popup-editor\" tabindex=\"-1\"/>';\n    div.innerHTML = template;\n\n    return div.firstChild as HTMLElement;\n}\n\nexport class PopupEditorWrapper extends PopupComponent {\n\n    public static DOM_KEY_POPUP_EDITOR_WRAPPER = 'popupEditorWrapper';\n    @AutoWired('keyBoardShortCutRegistry') private keyBoardShortCutRegistry : KeyboardShortcutRegistry;\n\n\n    constructor(public readonly params: ICellEditorParams, private readonly cellCtrl : CellController) {\n        super(getTemplate());\n    }\n\n    @PostConstruct()\n    init(): void {\n        this.optionsHandler.setDomData(this.getGui(), PopupEditorWrapper.DOM_KEY_POPUP_EDITOR_WRAPPER, true);\n\t\tthis.optionsHandler.setDomData( this.getGui(), CellController.DOM_KEY_CELL_CTRL, this.cellCtrl);\n\n        this.addKeyDownListener();\n        this.addListener(this.getGui(), 'mousedown', (event: MouseEvent) => {\n            event.stopPropagation();\n        });\n    }\n\n    private addKeyDownListener(): void {\n        const eGui = this.getGui();\n        const keyEventManager = new KeyEventHandler({container : eGui, keyComboStackSize : 1})\n        keyEventManager.addListener({\n            keyCombo : 'any',\n            callback : (params ) => {\n                const {event} = params;\n                const activeKeys = params.activeKeys;\n                const keyCombo = params.activeKeys.join('+');\n\n                const isOpenEditor = activeKeys.includes('enter') && !activeKeys.includes('shift');\n\n                let isActionExecuted = false \n                if(isOpenEditor) {\n                    isActionExecuted = this.keyBoardShortCutRegistry.executeShortcut('enter', {event});\n                }else {\n                    isActionExecuted = this.keyBoardShortCutRegistry.executeShortcut(keyCombo, {\n                        event\n                    })\n                }\n\n                if(!isActionExecuted) {\n                    if(_isEventFromPrintableCharacter(event)) {\n                        const {cellController} = this.getControllersFromTargetElement(event.target)\n                        cellController.processPrintableCharacter(event);\n                    }\n                }\n                \n            },\n            repeat : true\n        })\n    }\n\n    private getControllersFromTargetElement(targetElement : EventTarget | null ) : IController {\n        return {\n            cellController       : getControllerFromTargetElement<CellController>(this.optionsHandler,targetElement, CellController.DOM_KEY_CELL_CTRL),\n            rowController        : getControllerFromTargetElement<RowController>(this.optionsHandler,targetElement, RowController.DOM_DATA_KEY_ROW_CTRL),\n            headerCellController : getControllerFromTargetElement<HeaderCellController>(this.optionsHandler,targetElement, HeaderCellController.DOM_DATA_KEY_HEADER_CELL)\n        }\n    }\n}\n","import { BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IColumnNode } from \"../../../../../../Core/Interface/IColumnNode\";\nimport { IRowNode } from \"../../../../../../Core/Interface/IRowNode\";\nimport { RowController } from \"../../Row/RowController\";\nimport { CellController } from \"../CellController\";\nimport { ICellComponent } from \"../ICellComponent\";\n\nexport class SummaryCellController extends CellController {\n    constructor(column : IColumnNode, rowNode : IRowNode, rowController : RowController,  getBeanInstanceByBeanName : getBeanInstanceByBeanName) {\n        super(column, rowNode, rowController, getBeanInstanceByBeanName, \"summarycell\");\n        this.isCellRenderer = column.getSummaryRenderer() != null\n    }\n    setComponent(component: ICellComponent): void {\n        this.component = component;\n        this.setValue();\n\n        this.cellStyle.setComponent(component);\n        this.cellPositionHandler.setComponent(component.getElement());\n        this.onLeftChanged();\n\n        this.onWidthChanged();\n\n        this.addDomData();\n\n        this.registerHighlightColumnOnDrag();\n    }\n\n    setValue() {\n        this.createCellPosition();\n        let componentDetails;\n        if(this.isCellRenderer) {\n            const params               = this.createRendererParam();\n            const userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n                  componentDetails     = userComponentHandler.getSummaryCellRendererDetails(this.column, params);\n        }\n\n        this.component.setRendererDetails(componentDetails)\n    }\n\n    onCellDoubleClick(_event: MouseEvent): void {\n        \n    }\n}","import { BEAN_NAME, Component, getBeanInstanceByBeanName, removeFromParent } from \"@dg/corecomponent\";\nimport { ROW_CONTAINER_NAME, RowContainerType } from \"../../utils/type\";\nimport { CellComponent } from \"../Cell/CellComponent\";\nimport { CellController } from \"../Cell/CellController\";\nimport { CellControllerWrapper } from \"../Cell/CellControllerWrapper\";\nimport { IRowComponent, RowType } from \"./RowController\";\nimport { IRowControllerWrapper } from \"./RowControllerWrapper\";\nimport { RowCssHandler } from \"./RowCssHandler\";\nimport { UserComponentDetails } from \"../../../../../Core/Components/UserComponentHandler\";\nimport { FloatingRecordMovedComponent } from \"../../../../../FloatingRecords/UIHandler/RecordMoved/FloatingRecordMovedComponent\";\nimport { setAriaLevel, setAriaRole, setAriaRowIndex } from \"../../../../../Core/utils/aria\";\n\nfunction getTemplate(rowId: string) : HTMLElement {\n    const div = document.createElement('div');\n    div.classList.add('ZG-row');\n    div.setAttribute('role', 'row');\n    div.setAttribute('dg-row-id', rowId);\n    return div;\n}\n\n\nexport class RowComponent extends Component {\n    private getBeanInstanceByBeanName     : getBeanInstanceByBeanName;\n    private controller: IRowControllerWrapper;\n    private type : RowContainerType;\n    private cellComps: Map<string, CellComponent>= new Map();\n\n    private fullWidthCellRenderer : any;\n    private fullWidthRendererElement : HTMLElement;\n\n\n    private rowCssHandler !: RowCssHandler;\n\n    private rowMovedComponent : FloatingRecordMovedComponent;\n\n    public domRendered : boolean = false;\n\n    containerName : ROW_CONTAINER_NAME;\n\n\tprivate element : HTMLElement | null = null;\n\n\n\n    constructor(controller: IRowControllerWrapper, getBeanInstanceByBeanName: getBeanInstanceByBeanName, containerType: RowContainerType, containerName : ROW_CONTAINER_NAME) {\n        super();\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n        this.controller         = controller;\n        this.type               = containerType;\n\n        this.containerName = containerName;\n\n        const rowMeta = this.controller.getRowMeta() as any;\n\n        this.setTemplate(getTemplate(rowMeta.rowID));\n\n        const tabIndex = this.controller.getTabIndex();\n        if (tabIndex != null) {\n            this.getGui().setAttribute('tabindex', tabIndex.toString());    \n        }\n\n        this.initialiseComp();\n        \n\n        this.rowCssHandler = new RowCssHandler(this.getGui());\n\n    }\n\n    setTemplate(element : HTMLElement) : void {\n\t\tthis.element = element;\n\t\t(this.element as any).Component = this;\n\t}\n\n\tgetGui() : HTMLElement {\n\t\treturn this.element;\n\t}\n\n    setGui(element : HTMLElement | null) {\n\t\tthis.element = element;\n\t}\n\n\n    // private setCellControlers(cellControllers : CellController[]) : void {\n    //     // if(!this.isAlive()) {\n    //     //     return;\n    //     // }\n        \n    //     // const CellComponent = Object.assign({}, this.cellComps);\n\n    //     // cellControllers.forEach((cellController) => {\n    //     //     const instanceID = cellController.getInstanceID();\n    //     //     if(this.cellComps[instanceID] == null) {\n    //     //         this.newCellComponent(cellController);\n    //     //     }else {\n    //     //         CellComponent[instanceID] = null;\n    //     //     }\n    //     // })\n\n    //     // const removeCellComponents = Object.values(CellComponent).filter(component => component != null) as CellComponent[];\n    //     // this.destroyCells(removeCellComponents);\n\n    //     const prevRowComps                        = this.cellComps;                     // Map<string, RowComponent>\n    //     const nextRowComps                        = new Map<string, any>();\n    //     const fragment                            = document.createDocumentFragment();\n    //     const newlyCreatedComps: CellController[] = [];\n\n\t// \t// Reuse or create row components\n\t// \tfor (let i = 0; i < cellControllers.length; i++) {\n\t// \t\tconst cellCtrl = cellControllers[i];\n\t// \t\tconst id = cellCtrl.getInstanceID();\n\n\t// \t\tconst existing = prevRowComps.get(id);\n\n\t// \t\tif (existing) {\n\t// \t\t\tnextRowComps.set(id, existing);\n\t// \t\t\tprevRowComps.delete(id);\n\t// \t\t} else {\n\t// \t\t\tconst newComp = this.newCellComponent(cellCtrl);\n\t// \t\t\tnextRowComps.set(id, newComp);\n\t// \t\t\tfragment.appendChild(newComp.getGui());\n    //             newlyCreatedComps.push(cellCtrl);\n\t// \t\t}\n\t// \t}\n\n    //     if (this.domRendered && newlyCreatedComps.length > 0) {\n    //         for (const comp of newlyCreatedComps) {\n    //             comp.afterGuiAttached();\n    //         }\n    //     }\n\n\t// \t// Batch append all new rows once\n\t// \tif (fragment.childNodes.length > 0) {\n\t// \t\tthis.getGui().appendChild(fragment);\n\t// \t}\n\n\t// \t// Remove all stale row components\n\t// \tif (prevRowComps.size > 0) {\n\t// \t\tfor (const [, comp] of prevRowComps) {\n\t// \t\t\tconst gui = comp.getGui();\n\t// \t\t\tif (gui.parentNode === this.getGui()) {\n\t// \t\t\t\tthis.getGui().removeChild(gui);\n\t// \t\t\t}\n\t// \t\t\tcomp.detach();\n\t// \t\t\tcomp.destroy();\n\t// \t\t}\n\t// \t\tprevRowComps.clear();\n\t// \t}\n\n\t// \tthis.cellComps = nextRowComps;\n\n    // }\n\n    private setCellControlers(cellControllers : CellController[]) : void {\n        const cellsToRemove = new Map(this.cellComps);\n\n        for (const cellCtrl of cellControllers) {\n            const key = cellCtrl.getInstanceID();\n\n            if (!this.cellComps.has(key)) {\n                this.newCellComponent(cellCtrl);\n            } else {\n                cellCtrl.isAlive() && cellCtrl.updateClassNames();\n                cellsToRemove.delete(key);\n            }\n        }\n\n        this.destroyCells(cellsToRemove);\n    }\n\n    setDomRenderer(renderer: boolean) {\n        this.domRendered = renderer;\n    }\n\n    private newCellComponent(cellController: CellController) {\n        const cellControllerWrapper = CellControllerWrapper(cellController)\n        const cellComp = new CellComponent(this.getBeanInstanceByBeanName, cellControllerWrapper, this.getGui(), this.type);\n        this.cellComps.set(cellController.getInstanceID() ,cellComp);\n        this.getGui() && this.getGui().appendChild(cellComp.getGui());\n        this.domRendered && cellController.afterGuiAttached();\n    }\n\n    private destroyCells(cellComps: Map<string, CellComponent | null>): void {\n        for (const cellComp of cellComps.values()) {\n            if (!cellComp) {\n                return;\n            }\n\n            const instanceId = cellComp.getController().getInstanceId();\n            if (this.cellComps.get(instanceId) !== cellComp) {\n                return;\n            }\n\n            cellComp.detach();\n            cellComp.destroy();\n            this.cellComps.delete(instanceId);\n        }\n    }\n\n\n    detach() {\n        if (this.controller) {\n            this.controller.unsetComp(this.type);\n        }\n        \n        if (this.element) {\n            (this.element as any).Component = null;\n        }\n        this.setGui(null as any);\n    }\n\n    private initialiseComp() {\n        const component : IRowComponent = {\n            setCellControllers : (cellController) => this.setCellControlers(cellController),\n            onMouseEnter       : () => this.onMouseEnter(),\n            renderFullWidth    : (compDetails, setFullWidthCellRenderer, refresh: boolean = false)  => this.renderFullWidth(compDetails, setFullWidthCellRenderer, refresh),\n            renderExtraWidth   : (componentDetails) => this.renderExtraRow(componentDetails),\n            setWidthInPixel    : (width : string) => this.setWidthInPixel(width),\n            addOrRemoveCssClass: (className : string, force : boolean) => this.addOrRemoveCssClass(className, force),\n            setRowHeight       : (height : number) => this.getGui().style.height = `${height}px`,\n            setFloatingRecord  : () => this.setFloatingRecord(),\n            setDomRenderer     : (renderer : boolean) => this.setDomRenderer(renderer),\n            updateRowMovedLabel : (label : string) => this.updateRowMovedLabel(label),\n        }\n        this.setAccessibility();\n        this.controller.setComponent(component, this.getGui(), this.type)\n        this.addDestroyFunc(() => {\n            this.controller.unsetComp(this.type);\n        })\n\n\n    }\n\n    private setAccessibility() {\n        const {rowIndex, parentKeys} = this.controller.getRowMeta();\n        const rowElement             = this.getGui();\n        const level                  = parentKeys.length + 1;\n\n        setAriaRowIndex(rowElement, rowIndex + 1);\t\t//aria-rowindex is 1-based\n        setAriaLevel(rowElement, level);\n    }\n\n    private setFloatingRecord() : void {\n        this.destroyFloatingRecord();\n        if(this.type === RowContainerType.HEADER) {\n            if(!this.rowMovedComponent) {\n                const conetxt = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n                this.rowMovedComponent = conetxt.createBean(new FloatingRecordMovedComponent());\n                this.element.appendChild((this.rowMovedComponent as any).getGui());\n            }\n        }\n    }\n\n    private destroyFloatingRecord() : void {\n        if (this.rowMovedComponent) {\n            const conetxt = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n            this.getGui().removeChild(this.rowMovedComponent.getGui());\n            this.rowMovedComponent = conetxt.destroyBean(this.rowMovedComponent);\n        }\t\n    }\n\n    private renderExtraRow(compDetails : UserComponentDetails) : void {\n        if(compDetails) {\n            const callback = (cellRenderer: any) => {\n                this.destroyExtraRow();\n                if (this.isAlive()) {\n                    const eGui = cellRenderer.getElement();\n                    this.getGui().appendChild(eGui);\n                    this.setFullWidthRowComp(cellRenderer, eGui);\n                } else {\n                    const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n                    context && context.destroyBean(cellRenderer);\n                }\n            }\n            const componentInstance = compDetails?.newInstance();\n            if (!componentInstance) {\n                return;\n            }\n            componentInstance.then(callback);\n        }else {\n            this.destroyExtraRow();\n        }\n    }\n\n    private destroyExtraRow() : void {\n        if(this.fullWidthCellRenderer) {\n            removeFromParent(this.fullWidthRendererElement);\n            this.fullWidthRendererElement = null;\n            this.fullWidthCellRenderer = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT).destroyBean(this.fullWidthCellRenderer);\n        }\n    }\n\n    private renderFullWidth(compDetails: UserComponentDetails, setFullWidthCellRenderer: (instance: any) => void, refresh: boolean = false  ) : any {\n        if(refresh){\n            this.refreshFullwidthRenderer(compDetails.params);\n            return;\n        }\n        if (compDetails) {\n            this.destroyFullWidth();\n            const callback = (cellRenderer: any) => {\n                    if (this.isAlive()) {\n                        const eGui = cellRenderer.getElement();\n                        if(eGui){\n                        this.getGui().appendChild(eGui);\n                        }\n                        this.setFullWidthRowComp(cellRenderer, eGui);\n                        setFullWidthCellRenderer(cellRenderer);\n                    } else {\n                        this.destroyFullWidth();\n                    }\n                };\n\n            const componentInstance = compDetails.newInstance();\n\n            if (!componentInstance) {\n                return null;\n            }\n\n            componentInstance.then(callback);\n        }\n\t\t\t\n    }\n\n    private destroyFullWidth() : void {\n        if(this.fullWidthCellRenderer) {\n            removeFromParent(this.fullWidthRendererElement);\n            this.fullWidthRendererElement = null;\n            this.fullWidthCellRenderer = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT).destroyBean(this.fullWidthCellRenderer);\n        }\n    }\n\n    private setFullWidthRowComp(fullWidthRowComponent: any, element : HTMLElement): void {\n        // const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n        if (this.fullWidthCellRenderer) {\n            console.error('should not be setting fullWidthRowComponent');\n        }\n\n        this.fullWidthCellRenderer = fullWidthRowComponent;\n        this.fullWidthRendererElement = element;\n        this.setRoleForRenderer(fullWidthRowComponent, element);\n        // this.addDestroyFunc(() => {\n        //     removeFromParent(this.fullWidthRendererElement);\n        //     this.fullWidthRendererElement = null;\n        //     this.fullWidthCellRenderer = context.destroyBean(this.fullWidthCellRenderer);\n        // });\n    }\n\n    private setRoleForRenderer(_renderer : any, element : HTMLElement) : void {\n        element && setAriaRole(element, 'gridcell');\n    }\n\n    private setWidthInPixel(width : string) : void {\n        const gui = this.getGui();\n        gui && (gui.style.width = width);\n    }\n\n    updateRowMovedLabel(label : string) : void {\n        if(this.rowMovedComponent) {\n            this.rowMovedComponent.updateRowMovedLabel(label);\n        }\n    }\n\n    onMouseEnter() {\n        this.rowCssHandler.onMouseEnter();\n    }\n\n    destroy(): void {\n        if (this.controller) {\n            this.controller.unsetComp(this.type);\n        }\n        \n        if (this.element) {\n            (this.element as any).Component = null;\n        }\n        \n        super.destroy();\n        this.destroyCells(this.cellComps);\n        this.destroyExtraRow();\n        this.fullWidthCellRenderer = null;\n        this.controller = null;\n        this.type = null;\n        this.cellComps = new Map();\n        this.fullWidthRendererElement = null;\n        this.rowCssHandler = null;\n        this.rowMovedComponent = null;\n        this.domRendered = null;\n        this.containerName = null;\n        this.element = null;\n        \n    }\n\n    getRowType() : RowType {\n        return this.controller.getRowType();\n    }\n\n    refreshFullwidthRenderer(params: any):void{\n        if(!this.fullWidthCellRenderer) {\n            return;\n        }\n        this.fullWidthCellRenderer.refresh && this.fullWidthCellRenderer.refresh(params);\n    }\n}","import { BEAN_NAME, EventEmitter, EventHandler, getBeanInstanceByBeanName } from '@dg/corecomponent';\nimport { COLUMN_PANE_TYPE, FieldHandler, } from '../../../../../Core/Columns/FieldHandler';\nimport { Events, ROW_NODE_EVENTS } from '../../../../../Core/Constants/Events';\nimport { defaultRowHeight, rowPinPositions } from '../../../../../Core/Constants/GridConfigurationConstants';\nimport { IColumnNode } from '../../../../../Core/Interface/IColumnNode';\nimport { IRowNode } from '../../../../../Core/Interface/IRowNode';\nimport { IFloatingRecordHandler } from '../../../../../FloatingRecords/Interface/IFloatingRecordHandler';\nimport { RowContainerType } from '../../utils/type';\nimport { CellController } from '../Cell/CellController';\nimport { GRID_BEAN_NAME } from '../../../../../Core/Constants/BeanName';\nimport { GridUserComponentHandler, UserComponentDetails } from '../../../../../Core/Components/UserComponentHandler';\nimport { GridOptioHandler } from '../../../../../Core/GridOptionHandler';\nimport { IFocusHandler } from '../../../../../Core/Navigation/focus-handler.types';\nimport { CellPositionType, RowPositionType } from '../../../../../Core/Navigation/cell-position.types';\nimport { IRowSelectionHandler } from '../../../../../../Selection/row-selection-handler.types';\nimport { IDragSourceConfig } from '../../../../../../DragAndDrop-handler/dragAndDrop-handler.types';\nimport { IRowDragItem, IRowReoderParams } from '../../../../../../row-drag-handler/row-drag-handler';\nimport { IRangeSelectionHandler } from '../../../../../../rangeselection/range-selection-handler.types';\nimport { ColumnVisibleHandlerType } from '../../../../../Core/Columns/column-visible-handler.types';\nimport { RecordHeaderColumnNode } from '../../../../../Core/Columns/ColumnNode';\nimport { IGridCellEditorHandler } from '../../../../Editor/GridCellEditorHandler';\nimport { RowHoverHandler } from '../../../../../Core/RowHoverHandler';\nimport { IRecordHandler } from '../../../../../Core/Rows/RecordHandler.types';\nimport { RefreshCellParams } from '../../../../../API/CommonAPIInterface';\nimport { ExtraRowRendererParams, FullWidthRendererParams } from '../../../../../Main';\nimport { GenericDataStore } from '../../../../../Core/generic-data-store';\nimport { IGridLayoutPositionHandler } from '../../../../../Core/Interface/IGridLayoutPositionHandler';\nimport { measureNaturalBlockHeight } from '../../../../cell-layout-measure';\n\nexport enum RowType {\n\tNormal               = 'Normal',\n\tFullWidth            = 'FullWidth',\n\tFullWidthLoading     = 'FullWidthLoading',\n\tFullWidthCellLoading = 'FullWidthCellLoading',\n\tExtraRow             = 'ExtraRow',\n\tFullWidthGrouping    = 'FullWidthGrouping',\n\tCellLoading          = 'CellLoading',\n\tGroupCell            = \"GroupCell\"\n}\nexport interface RowGui {\n\tcomponent: IRowComponent;\n\telement: HTMLElement;\n\tcontainerType: RowContainerType;\n}\n\nexport interface RowMeta { \n\trowID: string;\n\trowType : string;\n\tpinPosition : rowPinPositions;\n\trowIndex : number;\n\tparentKeys : string[];\n\tabsoluteRowIndex : number;\n}\n\nexport interface IRowSelectionChangedEvent {\n\trowSelected?: boolean;\n\tselectALL  ?:  \"none\" | \"all\" | \"intermediate\";\n\ttype        : string;\n}\n\nexport interface IRegisterRowSelection {\n\telement              : HTMLElement;\n\tonRowSelectionChange?: (params : IRowSelectionChangedEvent) => void;\n}\n\nexport interface IRowComponent {\n\tsetCellControllers(cellControllers: CellController[])    : void;\n\tonMouseEnter()                                           : void;\n\trenderExtraWidth(componentDetails : UserComponentDetails): void\n\trenderFullWidth(compDetails: UserComponentDetails, setFullWidthCellRenderer: (instance: any) => void, refresh: boolean)       : void;\n\tsetWidthInPixel(width: string)                           : void;\n\taddOrRemoveCssClass(className: string, force: boolean)   : void;\n\tsetRowHeight(height : number)                            : void;\n\tsetFloatingRecord()                                      : void;\n\tsetDomRenderer(renderer : boolean)                       : void;\n\tupdateRowMovedLabel(label : string)                      : void;\n}\n\nlet instanceIdSequence = 0;\n\nexport class RowController extends EventEmitter {\n\tpublic static DOM_DATA_KEY_ROW_CTRL = 'rowcontroller';\n\tprivate static readonly ROW_HEIGHT_BORDER_PX = 1;\n\n\tprivate centerCellCtrls : GenericDataStore<CellController> = new GenericDataStore();\n\tprivate leftCellCtrls : GenericDataStore<CellController> = new GenericDataStore();\n\tprivate rightCellCtrls : GenericDataStore<CellController> = new GenericDataStore();\n\tprivate headerCellCtrls : GenericDataStore<CellController> = new GenericDataStore();\n\t/** Latest scheduled animation frame for auto row-height work (cancelled when a new measure is queued). */\n\tprivate pendingAutoRowHeightFrameId: number | null = null;\n\n\tprotected allRowGui: RowGui[] = [];\n\n\tprotected rowNode: IRowNode;\n\tprotected getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\n\tprivate instanceId: string;\n\n\tprivate rowMeta: RowMeta;\n\n\tprivate rowType: RowType;\n\n\tprivate editingRow : boolean;\n\n\tprivate stoppingRowEdit: boolean;\n\n\tprivate hasRowEnteredFlag = false;\n\n\t// private component !: IRowComponent;\n\n\t// private leftGui  : RowGui | undefined;\n\t// private centerGui: RowGui | undefined;\n\t// private rightGui : RowGui | undefined;\n\t// private headerGui: RowGui | undefined;\n\n\tstatic wirePropertiesStack: string[] = [GRID_BEAN_NAME.FLOATING_RECORD_HANDLER];\n\n\tprivate tabIndex : number;\n\tprivate gridCellEditorHandler: IGridCellEditorHandler;\n\tprivate fullWidthCellRenderer : any;\n\n\tconstructor(rowNode: IRowNode, getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n\t\tsuper();\n\t\tthis.rowNode                   = rowNode;\n\t\tthis.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n\t\tthis.eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER);\n\t\tthis.setRowType();\n\t\tthis.instanceId = this.generateID(rowNode);\n\t\tthis.updateRowMeta();\n\n\t\tif(this.isFullWidth()) {\n\t\t\tthis.tabIndex = -1;\n\t\t}\n\n\t\tthis.addListeners();\n\t}\n\n\tgetTabIndex(): number {\n\t\treturn this.tabIndex;\n\t}\n\n\tgetRowMeta() {\n        return this.rowMeta;\n    }\n\n\tupdateRowMeta() : void {\n\t\tconst recordHandler    = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER);\n\t\tconst rowMeta          = this.rowNode.getRowMeta();\n\t\tconst recordID         = this.rowNode.getId()\n\t\tconst absoluteRowIndex = recordHandler.getRelativeIndexByID(recordID);\n\t\tconst isFloatingRecord = this.rowNode.isRecordFloating();\n\t\tconst pinPosition      = isFloatingRecord ? 'FloatingRecord' : rowMeta.pinPosition;\n\t\tconst rowIndex         = isFloatingRecord ? 0 : rowMeta.rowIndex;\n\t\tthis.rowMeta    = {\n\t\t\trowID            : recordID,\n\t\t\trowType          : this.rowType,\n\t\t\tpinPosition,\n\t\t\trowIndex,\n\t\t\tparentKeys       : rowMeta.parentKeys,\n\t\t\tabsoluteRowIndex : absoluteRowIndex\n\t\t};\n\t}\n\n\tpublic unsetComp(containerType: RowContainerType): void {\n        this.allRowGui = this.allRowGui.filter((rowGui) => rowGui.containerType !== containerType);\n    }\n\n\tprivate setRowType(): void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tconst isStub      = this.rowNode.isLoaded();\n\t\tconst isGroupRow  = (this.rowNode as any).isGroupRow?.();\n\t\tconst isFullWidth = this.isRowFullWidth();\n\t\tconst isExtraRow  = this.isExtraRow();\n\n \t\tconst isFullWidthGroup = isGroupRow && optionHandler.isGroupUseFullWidthRow();\n\n\t\tif (!isGroupRow && isFullWidth && isStub) {\n\t\t\tthis.rowType = RowType.FullWidth;\n\t\t} else if (isExtraRow) {\n\t\t\tthis.rowType = RowType.ExtraRow;\n\t\t} else if (isFullWidthGroup) {\n\t\t\tthis.rowType = RowType.FullWidthGrouping;\n\t\t} else if (!isStub && isFullWidth) {\n\t\t\tthis.rowType = RowType.FullWidthCellLoading;\n\t\t} else if(!isStub) {\n\t\t\tthis.rowType = RowType.CellLoading;\n\t\t}else if(isGroupRow) {\n\t\t\tthis.rowType = RowType.GroupCell;\n\t\t}else {\n\t\t\tthis.rowType = RowType.Normal;\n\t\t}\n\t}\n\n\tprivate generateID(rowNode: IRowNode): string {\n\t\treturn `${rowNode.getId()} - ${instanceIdSequence++}`;\n\t}\n\n\tgetRowType(): RowType {\n\t\treturn this.rowType;\n\t}\n\n\tgetRowNode(): IRowNode {\n\t\treturn this.rowNode;\n\t}\n\n\tgetInstanceId(): string {\n\t\treturn this.instanceId;\n\t}\n\n\tgetRowHeight(): number {\n\t\treturn this.rowNode.getHeight();\n\t}\n\n\tsetComponent( component: IRowComponent, element: HTMLElement, containerType: RowContainerType, ): void {\n\t\tconst gui: RowGui = { component, element, containerType };\n\t\tthis.allRowGui.push(gui);\n\t\tthis.initialise(gui);\n\t\tthis.setPaneClassName(gui);\n\n\t\tthis.gridCellEditorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER);\n\n\t\tthis.applyFindRowClass();\n\t}\n\n\tupdateFloatingRecordMovedLabel(label : string) : void {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\tconst isFloatingRecord = floatingRecordHandler.isFloatingRecord(this.rowMeta.rowID);\n\t\tif(isFloatingRecord) {\n\t\t\tthis.allRowGui.forEach((rowGUI) => {\n\t\t\t\trowGUI.component.updateRowMovedLabel(label);\n\t\t\t})\n\t\t}\n\t\t\n\t}\n\n\tprivate setPaneClassName(rowGui : RowGui) : void {\n\t\trowGui.element.classList.add(`ZG-${rowGui.containerType}-row`);\n\t}\n\n\tpublic setFindActiveForCell(cellPosition: CellPositionType, active: boolean): void {\n\t\tconst cellCtrl = this.getCellController(cellPosition.columnID);\n\t\tif (cellCtrl) {\n\t\t\tcellCtrl.setFindActive(active);\n\t\t}\n\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\trowGui.component.addOrRemoveCssClass(\"dg-row-find-active\", active);\n\t\t});\n\t}\n\n\tpublic setFindMatchedForCell(cellPosition: CellPositionType, matched: boolean): void {\n\t\tconst cellCtrl = this.getCellController(cellPosition.columnID);\n\t\tif (cellCtrl) {\n\t\t\tcellCtrl.setFindMatched(matched);\n\t\t}\n\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\trowGui.component.addOrRemoveCssClass(\"dg-row-find-match\", matched);\n\t\t});\n\t}\n\n\tprivate applyFindRowClass(): void {\n\t\tconst findHandler = this.getBeanInstanceByBeanName('gridFindHandler', true) as any;\n\t\tif (!findHandler || !this.rowMeta) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof findHandler.isRowActive === 'function') {\n\t\t\tconst isActive = findHandler.isRowActive(\n\t\t\t\tthis.rowMeta.rowIndex,\n\t\t\t\tthis.rowMeta.pinPosition,\n\t\t\t\tthis.rowMeta.parentKeys,\n\t\t\t);\n\n\t\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\t\trowGui.component.addOrRemoveCssClass(\"dg-row-find-active\", isActive);\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate addDomData(element : HTMLElement): void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName( BEAN_NAME.OPTION_HANDLER);\n\t\toptionHandler.setDomData( element, RowController.DOM_DATA_KEY_ROW_CTRL, this, );\n\t\tthis.addDestroyFunc(() => optionHandler.setDomData( element, RowController.DOM_DATA_KEY_ROW_CTRL, null) );\n\t}\n\n\tprivate onFloatingRecordChanged() {\n\t\tif(this.isAlive()) {\n\t\t\tif(this.rowNode.isExist()){\n\t\t\t\tthis.updateTop();\n\t\t\t\tthis.setFloatingRecordRelativePopupMsg(this.allRowGui);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected updateColumn(params ?: any) {\n\t\tconst force = params ?( params.force ?? false) : false;\n\t\tif(this.isFullWidth() || this.isEmbededFullWidth() || this.isExtraRow()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.createAllCellController(force);\n\t\tthis.setCellController();\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif (typeof optionHandler.isAutoRowHeight === 'function' && optionHandler.isAutoRowHeight()) {\n\t\t\tthis.updateAutoRowHeightIfNeeded();\n\t\t}\n\t\tthis.refreshAllCellPositions();\n\t\tthis.onWidthChanged();\n\t}\n\n\tprivate refreshAllCellPositions(): void {\n\t\tthis.getAllCellControllers(false).forEach((ctrl) => {\n\t\t\tctrl.onLeftChanged();\n\t\t\tctrl.onWidthChanged();\n\t\t});\n\t}\n\n\tprotected initialise(rowGui: RowGui) {\n\t\tif (this.rowType != RowType.FullWidthCellLoading && this.rowType != RowType.CellLoading) {\n\t\t\tthis.addHoverListener(rowGui);\n\t\t\tthis.addRowListener(rowGui);\n\t\t\tthis.setFloatingRecordRelativePopupMsg([rowGui]);\n\t\t\tthis.onRowSelected();\n\t\t}\n\t\tthis.addCssClass(rowGui);\n\t\tthis.onTopChanged();\n\t\tthis.setRowHeight();\n\t\tthis.updateColumn();\n\t\tthis.onWidthChanged();\n\t\tthis.updateRowIndexes();\n\t\tthis.attachAnimateRow();\n\t\tthis.onRowHighlightChanged();\n\n\t\tthis.addDomData(rowGui.element);\n\n\t\tif (this.isFullWidth()) {\n\t\t\tthis.setupFullWidth(rowGui);\n\t\t}\n\n\t\tif(this.isExtraRow()) {\n\t\t\tthis.setUpExtraRow(rowGui);\n\t\t}\n\t\tthis.onRowHighlightChanged();\n\n\t\t\t\n\t\t// this.setFloatingRecordClassName();\n\t\t\n\t}\n\n\tprivate addCssClass(rowGui : RowGui) : void {\n\t\tconst cssClasses = this.rowNode.getCssClasses().split(' ');\n\t\tcssClasses.forEach(className => className && rowGui.element.classList.add(className));\n\t}\n\n\tprivate updateTop() {\n\t\tthis.setRowHeight();\n\t\tthis.onTopChanged();\n\t}\n\n\tprivate attachAnimateRow() {\n\t\tconst isSticky = this.rowNode.isSticky();\n\t\tif(isSticky) {\n\t\t\treturn;\n\t\t}\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst animateRow = optionHandler.getAnimateRow();\n\t\t\n\t\tthis.allRowGui.forEach((c) => {\n\t\t\tc.component.addOrRemoveCssClass('ZG-animateRow', animateRow);\n\t\t});\n\t}\n\n\tprotected updateRowIndexes(): void {\n\t\tconst recordHandler  = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER);\n\t\tconst recordID       = this.rowNode.getId();\n\t\tconst parentNode     = this.rowNode.getParentNode();\n\t\tconst rowIndex       = recordHandler.getRelativeIndexByID(recordID);\n\t\tconst rowIsEven      = rowIndex! % 2                                          === 0;\n\t\tconst leafClass      = (this.rowNode as any).isExpandable?.() ? '' : 'zg-row-leaf';\n\t\tconst hasChildren    = parentNode ? parentNode.getDirectChildrenCount() > 0 : false;\n\t\tconst isLastLeafRow  = !this.rowNode.isGroupRow() && this.rowMeta.pinPosition === \"middle\" ? this.rowMeta.rowIndex === parentNode.getDirectChildrenCount() - 1 : false;\n\t\tconst isFirstLeafRow = !this.rowNode.isGroupRow() && this.rowMeta.pinPosition === \"middle\" ? this.rowMeta.rowIndex === 0 : false;\n\n\n        this.allRowGui.forEach((c) => {\n\t\t\tc.component.addOrRemoveCssClass(`ZG-groupLevel-${this.rowNode.getLevel?.() ?? 0}`, this.rowNode.isGroupRow());\n\t\t\tc.component.addOrRemoveCssClass(`ZG-groupingHeader`, this.rowType === RowType.GroupCell);\n\t\t\tc.component.addOrRemoveCssClass(`ZG-groupingHeader-collapsed`, this.rowNode.isGroupRow() && this.rowNode.isCollapsed());\n\t\t\tc.component.addOrRemoveCssClass(`ZG-groupingHeader-expanded`, this.rowNode.isGroupRow() && !this.rowNode.isCollapsed());\n\t\t\tc.component.addOrRemoveCssClass(leafClass, true);\n\t\t\tc.component.addOrRemoveCssClass('zg-row-even', rowIsEven);\n\t\t\tc.component.addOrRemoveCssClass('zg-row-odd', !rowIsEven);\n\t\t\tc.component.addOrRemoveCssClass(\"zg-row-leaf-end\", isLastLeafRow);\n\t\t\tc.component.addOrRemoveCssClass(\"zg-row-leaf-start\", isFirstLeafRow);\n\t\t\tthis.rowNode.isGroupRow() && c.component.addOrRemoveCssClass(\"ZG-group-empty\", !hasChildren);\n\t\t});\n    }\n\n\tprivate setupFullWidth(rowGui: RowGui,refresh: boolean = false) {\n\t\tconst userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n\t\tconst params = this.createFullWidthParams(rowGui.element, rowGui.containerType);\n\t\tlet componentDetails;\n\t\tswitch(this.rowType) {\n\t\t\tcase RowType.FullWidthGrouping:\n\t\t\t\tcomponentDetails = userComponentHandler.getFullWidthGroupingRendererDetails(params)\n\t\t\t\tbreak;\n\t\t\tcase RowType.FullWidthCellLoading:\n\t\t\t\tcomponentDetails = userComponentHandler.getFullWidthLoadingRendererDetails(params);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tcomponentDetails = userComponentHandler.getFullWidthCellRendererDetails(params);\n\t\t\t\tbreak;\n\n\t\t}\n\t\t rowGui.component.renderFullWidth(componentDetails, this.setFullWidthCellRenderer.bind(this),refresh);\n\t}\n\n\tprivate setFullWidthCellRenderer(instance: any) {\n\t\tthis.fullWidthCellRenderer = instance;\n\t}\n\t\n\tgetFullWidthCellRenderer(): any {\n\t\treturn this.fullWidthCellRenderer;\n\t}\n\n\tpublic createFullWidthParams(rowElement: HTMLElement, pinned): FullWidthRendererParams {\n\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as any;\n\t\tconst apiHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER);\n\t\tconst optionsHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER);\n\t\tconst gridComponent         = controllerHandler.getGridController();\n\n\n\n\t\t// const fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\n\t\t\n        const params = {\n\t\t\tfullWidth           : true,\n\t\t\tdata                : this.rowNode.getRowData(),\n\t\t\tnode                : this.rowNode,\n\t\t\tvalue               : this.rowNode.key,\n\t\t\tvalueFormatted      : this.rowNode.key,\n\t\t\trowIndex            : this.rowNode.getIndex()!,\n\t\t\tparentElement       : rowElement,\n\t\t\tpinned              : pinned,\n\t\t\tregisterRowSelection: this.registerRowSelection.bind(this),\n\t\t\trowSelected         : rowSelectionHandler.isRowSelected(this.rowNode.getRowMeta()),\n\t\t\tregisterRowDrag     : this.registerRowDragger.bind(this),\n\t\t\tapiHandler          : apiHandler,\n\t\t\tgridContainer       : optionsHandler.getGridContainer(),\n\t\t\tscrollHolder        : gridComponent.getScrollHolder(),\n\t\t\tcontrollerHandler  :  controllerHandler\n\t\t\t// ganttConfiguration : {\n\t\t\t// \tprojestStartDate: optionsHandler.getProjectStartDate(),\n\t\t\t// \tprojestEndDate  : optionsHandler.getProjectEndDate(),\n\t\t\t// \tviewType        : optionsHandler.getTimeLineViewType(),\n\t\t\t// \tcolumnWidth     : fieldHandler.getColumnWidth(),\n\t\t\t// \tdateUtilsInstance : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.DATE_UTILS)\n\n\t\t\t// }\n\t\t};\n\n        return params;\n    }\n\n\tprivate registerRowDragger(element  : HTMLElement) : void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif(!optionHandler.isRowDraggable()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst dragSource : IDragSourceConfig<IRowDragItem> = {\n\t\t\ttype: 'rowDrag',\n\t\t\tcontainer: element,\n\t\t\tgetGhostElement: () => {\n\t\t\t\tconst values               = dragSource.getDragItem();\n\t\t\t\tconst definitionParam      = this.createDefinitionParam();\n\t\t\t\tconst rowReorderParams     = this.createRowReorderParams(values);\n\t\t\t\tconst userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as GridUserComponentHandler;\n\t\t\t\tconst reorderDetails       = userComponentHandler.getRowReorderRendererDetails(definitionParam, rowReorderParams);\n\n                const div = document.createElement(\"div\");\n                if(reorderDetails) {\n                    const reorderElementInstance = reorderDetails?.newInstance();\n\t\t\t\t\treorderElementInstance.then((instance) => {\n\t\t\t\t\t\tdiv.appendChild(instance.getElement());\n\t\t\t\t\t})\n                }\n                return div;\n\t\t\t},\n\t\t\tgetDragItem:  () => {\n\t\t\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as IRowSelectionHandler;\n\n\t\t\t\tconst selectedRows = rowSelectionHandler.getSelectedRows();\n\t\t\t\tconst selectionType = rowSelectionHandler.getSelectionType();\n\n\t\t\t\tconst isSelected = rowSelectionHandler.isRowSelected(this.rowMeta);\n\n\t\t\t\tconst id = this.rowMeta.rowID\n\t\t\t\tconst result = {\n\t\t\t\t\trowIDs: [],\n\t\t\t\t\trowRanges: [],\n\t\t\t\t\tselectionType\n\t\t\t\t};\n\n\t\t\t\tif (selectionType === 'id') {\n\t\t\t\t\tresult.rowIDs = isSelected ? selectedRows.length > 0 ? selectedRows : [id] : [id];\n\t\t\t\t} else if (selectionType === 'index') {\n\t\t\t\t\tconst range = { from: this.rowMeta, to: this.rowMeta };\n\t\t\t\t\tresult.rowRanges = isSelected ? selectedRows.length > 0 ? selectedRows : [range] : [range];\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tshouldPreventMouseEvent : (event : MouseEvent) => {\t\n\t\t\t\tif(event.target && (event.target as HTMLElement).closest(\".ZG-row\")) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tgetRootNode : () => window,\n\t\t\tdragSourceId : this.getBeanInstanceByBeanName('instanceID')\n\t\t}\n\n\t\tthis.getBeanInstanceByBeanName('dragAndDropHandler').addDragSource(dragSource, true);\n\t}\n\n\n\tprivate registerRowSelection(params : IRegisterRowSelection) : void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif(optionHandler.getRowSelection() === 'none') {\n\t\t\treturn;\n\t\t}\n\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as any;\n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER) as EventHandler;\n\t\tthis.addListener(params.element, \"mousedown\", (event) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t})\n\t\tthis.addListener(params.element, 'click',(event : PointerEvent) => {\n\t\t\trowSelectionHandler.setRowSelected({\n\t\t\t\tvalues      : [this.rowMeta],\n\t\t\t\tselected    : !rowSelectionHandler.isRowSelected(this.rowMeta),\n\t\t\t\tsource      : 'ui',\n\t\t\t\trangeSelect: event.shiftKey\n\t\t\t});\n\t\t})\n\n\t\tif(params.onRowSelectionChange) {\n\t\t\tthis.addListener(eventHandler, 'rowSelectionChanged', (event) => {\n\t\t\t\tparams.onRowSelectionChange({\n\t\t\t\t\t...event,\n\t\t\t\t\trowSelected : rowSelectionHandler.isRowSelected(this.rowMeta)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n\t\n\n\tprivate setUpExtraRow(rowGui : RowGui) {\n\t\tconst userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n\t\tconst apiHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER);\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst userParams = optionHandler.getExtraRowRendererParam();\n\t\tlet initParam : ExtraRowRendererParams = {\n\t\t\trowNode : this.rowNode as any, \n\t\t\trowIndex : this.rowNode.getIndex(), \n\t\t\tpaneType : rowGui.containerType,\n\t\t\tAPIs : apiHandler,\n\t\t\telement : rowGui.element\n\t\t}\n\t\tuserParams && (initParam = {...initParam, ...{extraRowRenderParam : userParams}})\n\t\tlet componentDetails  = userComponentHandler.getExtraRowRendererDetails(initParam);\n\t\trowGui.component.renderExtraWidth(componentDetails); \n\t}\n\n\taddListeners() : void { \n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER);\n\t\tthis.addListener(eventHandler, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, (params : any) => {\n\t\t\tthis.updateColumn(params);\n\t\t})\n\t\tthis.addListener(eventHandler, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, () => {\n\t\t\tthis.onWidthChanged();\n\t\t})\n\t\tthis.addListener(eventHandler, Events.EVENT_COLUMN_HIDE, this.onWidthChanged.bind(this))\n\t\tthis.addListener(eventHandler, Events.EVENT_COLUMN_SHOW, this.onWidthChanged.bind(this))\n\t\tthis.addListener(eventHandler, 'columnResized', this.updateColumn.bind(this))\n\t\tthis.addListener(eventHandler, Events.EVENT_COLUMN_INSERT, () => {\n\t\t\tthis.getAllCellControllers().forEach((cellController) => {\n\t\t\t\tcellController.updateClassNames();\n\t\t\t})\n\n\t\t\tthis.isExtraRow() && this.allRowGui.forEach((gui) => {\n\t\t\t\tthis.setUpExtraRow(gui);\n\t\t\t})\n\t\t});\n\t\tthis.addListener(eventHandler, Events.EVENT_COLUMN_DELETE, () => {\n\t\t\tthis.getAllCellControllers().forEach((cellController) => {\n\t\t\t\tcellController.updateClassNames();\n\t\t\t})\n\t\t\tthis.isExtraRow() && this.allRowGui.forEach((gui) => {\n\t\t\t\tthis.setUpExtraRow(gui);\n\t\t\t})\n\t\t});\n\t\tthis.addListener(eventHandler, Events.EVENT_COLUMN_HIDE, () => {\n\t\t\tthis.getAllCellControllers().forEach((cellController) => {\n\t\t\t\tcellController.updateClassNames();\n\t\t\t})\n\t\t\tthis.onWidthChanged();\n\t\t\tthis.isExtraRow() && this.allRowGui.forEach((gui) => {\n\t\t\t\tthis.setUpExtraRow(gui);\n\t\t\t})\n\t\t});\n\t\tthis.addListener(eventHandler, Events.EVENT_COLUMN_SHOW, () => {\n\t\t\tthis.getAllCellControllers().forEach((cellController) => {\n\t\t\t\tcellController.updateClassNames();\n\t\t\t})\n\t\t\tthis.onWidthChanged();\n\t\t\tthis.isExtraRow() && this.allRowGui.forEach((gui) => {\n\t\t\t\tthis.setUpExtraRow(gui);\n\t\t\t})\n\t\t});\n\t\tthis.addListener(this.rowNode,ROW_NODE_EVENTS.EVENT_ROW_TOP_CHANGE, this.updateTop.bind(this));\n\t\tthis.addListener(this.rowNode,ROW_NODE_EVENTS.EVENT_ROW_HEIGHT_CHANGE, this.updateTop.bind(this));\n\t\tthis.addListener(this.rowNode, ROW_NODE_EVENTS.EVENt_STICKY_TOP_CHANGE, this.updateTop.bind(this));\n\t\tthis.addListener(this.rowNode, ROW_NODE_EVENTS.EVENT_ROW_HIGHLIGHT_CHANGE, this.onRowHighlightChanged.bind(this));\n\t\tthis.addListener(this.rowNode, ROW_NODE_EVENTS.EVENT_ROW_INDEX_CHANGE, this.updateRowIndexes.bind(this));\n\t\tthis.addListener(this.rowNode, 'EVENT_ROW_DRAGGING', () => {\n\t\t\tthis.allRowGui.forEach((gui) => {\n\t\t\t\tgui.component.addOrRemoveCssClass('ZG-row-dragging', this.rowNode.isDragging());\n\t\t\t})\n\t\t})\n\n\t\tthis.addListener(eventHandler, Events.EVENT_FLOATING_RECORD_CHANGED, this.onFloatingRecordChanged.bind(this));\n\t\tthis.addListener(eventHandler, Events.EVENT_FLOATING_RECORD_ADDED, this.onFloatingRecordChanged.bind(this));\n\t\tthis.addListener(eventHandler, Events.EVENT_FLOATING_RECORD_REMOVED, this.onFloatingRecordChanged.bind(this));\n\n\t}\n\n\tprotected onWidthChanged() : void {\n\t\tconst gridLayoutPositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER) as IGridLayoutPositionHandler;\n\n\t\tthis.allRowGui.forEach((rowgui) => {\n\t\t\tif(this.isFullWidth()) { return;}\n\t\t\tconst {containerType, component} = rowgui;\n\t\t\tconst width = gridLayoutPositionHandler.getWidth(this.rowNode, containerType);\n\n\t\t\tconst widthInPixel = width != null ? `${width}px` : '';\n\n\t\t\tcomponent.setWidthInPixel(widthInPixel);\n\n\t\t})\n\t}\n\n\tprotected onTopChanged(): void {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\t\tconst optionHandler = this.getBeanInstanceByBeanName( BEAN_NAME.OPTION_HANDLER);\n\n\t\tconst isRelativeFloatingRecord = optionHandler.isRelativeFloatingRecord();\n\n\t\tconst isFloatingRecordIndex = floatingRecordHandler.isFloatingRecord(this.rowNode.getId()); \n\n\t\tconst isFloatingRecord = !isRelativeFloatingRecord ? isFloatingRecordIndex : false;\n\t\tlet top = 0;\n\n\t\tif(this.rowNode.isSticky()) {\n\t\t\ttop = this.rowNode.getStickyRowTop();\n\t\t}else if(this.rowNode.getPinnedPosition() === \"middle\") {\n\t\t\tif (isFloatingRecord) {\n\t\t\t\ttop = 0;\n\t\t\t}else if(isRelativeFloatingRecord && isFloatingRecordIndex) {\n\t\t\t\ttop = floatingRecordHandler.getFloatingRecordSorceTop();\n\t\t\t}\n\t\t\telse if (!this.rowNode.isLoaded()) {\n\t\t\t\ttop = this.rowNode.getTop();\n\t\t\t} else {\n\t\t\t\ttop = this.rowNode.getTop();\n\t\t\t}\n\t\t}else {\n\t\t\ttop = this.rowNode.getTop();\n\t\t}\n\n\t\tconst treeLevelLayout = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER) as IGridLayoutPositionHandler;\n\t\tconst width           = this.rowNode.getWidth();\n\t\tconst rowLeft         = this.rowNode.getLeft();\n\t\tconst isRowTransform  = optionHandler.isRowTransform();\n\t\tthis.allRowGui.forEach((gui) => {\n\t\t\tif(isRowTransform) {\n\t\t\t\tgui.element.style.transform = `translateY(${top}px)`;\n\t\t\t}else {\n\t\t\t\tgui.element.style.top = `${top}px`;\n\t\t\t}\n\t\t\tconst left = treeLevelLayout ? treeLevelLayout.getLeft(this.rowNode, gui.containerType) : rowLeft;\t\t\t\n\t\t\t(left != null) && (gui.element.style.left = `${left}px`);\n\t\t\t(width != null) && (gui.element.style.width = `${width}px`);\n\t\t});\n\t}\n\n\n\tsetRowHeight() {\n\t\tconst gridLayoutPositionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_LAYOUT_POSITION_HANDLER) as IGridLayoutPositionHandler;\n\t\tconst height = gridLayoutPositionHandler.getHeight(this.rowNode);\n\t\tif(this.isExtraRow()){\n\t\t\tthis.dispatchEvent({\n\t\t\t\ttype : Events.EVENT_EXTRA_ROW_HEIGHT_CHANGED\n\t\t\t})\n\t\t}\n\t\tthis.allRowGui.forEach((gui) => {\n\t\t\tgui.component.setRowHeight(height);\n\t\t});\n\t}\n\n\tpublic isRowFullWidth(): boolean {\n\t\treturn this.rowNode.isFullWidthRow();\n    }\n\n\tisFullWidth(): boolean {\n\t\treturn this.rowType === RowType.FullWidth || this.rowType === RowType.FullWidthGrouping || this.rowType === RowType.FullWidthLoading || this.rowType === RowType.FullWidthCellLoading;\n\t}\n\t\t\n\n\tpublic isExtraRow() : boolean {\n\t\treturn this.rowNode.isExtraRow();\n\t}\n\n\tpublic isEmbededFullWidth(): boolean {\n\t\treturn this.rowNode.getFullWidthType() === 'embeded';\n\t}\n\n\t// private getRowTop() : number {\n\t//     const recordHandler = this.getBeanInstanceByBeanName(BEAN_NAME.RECORD_HANDLER, [BEAN_NAME.RECORD_HANDLER]);\n\t//     const id = this.rowNode.getTop();\n\t//     switch(this.rowNode.getPinnedPosition()) {\n\t//         case 'top':\n\t//             const topHandler = recordHandler.getTopHandler();\n\t//             return topHandler.getRowTop(id);\n\t//         case 'bottom':\n\t//             const bottomHandler = recordHandler.getBottomHandler();\n\t//             return bottomHandler.getRowTop(id);\n\t//         default:\n\t//             const middleHandler = recordHandler.getMiddleHandler();\n\t//             return middleHandler.getRowTop(id);\n\t//     }\n\t// }\n\n\tprivate addRowListener(rowGui: RowGui): void {\n\t\t//rowHeaderListener\n\t\t// if (rowGui.containerType == RowContainerType.HEADER) {\n\t\t\tthis.addListener( rowGui.element, 'mousedown', this.onRowMouseDown.bind(this));\n\t\t\t// this.addListener( rowGui.element, 'mouseup', this.onRowMouseUp.bind(this));\n\t\t\t// this.addListener(rowGui.element, 'mouseover', (ev)=> {\n\t\t\t// \tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\t\t\t// \tgridEvent.onRowHeaderMouseEnter({mouseEvent : ev, rowID : this.rowMeta.rowID});\n\t\t\t// });\n\n\t\t\t// this.addListener(rowGui.element, 'mouseout', (ev)=> {\n\t\t\t// \tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\t\t\t// \tgridEvent.onRowHeaderMouseLeave({mouseEvent : ev, rowID : this.rowMeta.rowID});\n\t\t\t// });\n\n\t\t\t// this.addListener(rowGui.element, 'mousemove', (ev)=> {\n\t\t\t// \tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\t\t\t// \tgridEvent.onRowHeaderMouseMove({mouseEvent : ev, rowID : this.rowMeta.rowID});\n\t\t\t// });\n\t\t// }\n\t}\n\n\tonRowMouseDown(event: MouseEvent): void {\n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\t\t// const navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER ) as NavigationHandler; \n\t\tconst gridOption = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_OPTIONS);\n\n\t\t// const gridAPI                   = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_API);\n\t\tconst optionHandler             = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tconst suppressMouseDownEvent    = gridOption.suppressMouseDownEvent;\n\t\tconst clearSelectionOnMouseDown = optionHandler.clearSelectionOnMouseDown();\n\n\t\tconst rangeSelectionHandler = this.getBeanInstanceByBeanName('rangeSelectionHandler') as IRangeSelectionHandler;\n\n\t\tconst ranges = rangeSelectionHandler && rangeSelectionHandler.getCellRanges().length !== 0;\n\n\t\tif(ranges && this.isRightClickByEvent(event)) {\n\t\t\t// event.preventDefault();\n\t\t\t// event.stopPropagation();\n\t\t\treturn;\n\t\t}\n\n\t\tif(clearSelectionOnMouseDown) {\n\t\t\t// gridAPI.clearAllSelections();\n\t\t}\n\t\t\n\t\tif(suppressMouseDownEvent) {\n\t\t\tconst isMouseDownSuppressed = suppressMouseDownEvent({\n\t\t\t\tevent : event,\n\t\t\t\ttype : \"rowHeader\",\n\t\t\t\tmeta : this.rowMeta});\n\t\t\tif(isMouseDownSuppressed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t};\n\n\t\tif(this.isFullWidth()) {\n\t\t\tconst selectionHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\t\tconst focusedCellPosition = selectionHandler.getFocusedCellPosition();\n\t\t\tselectionHandler.setFocusedCell({\n\t\t\t\t...this.rowMeta,\n\t\t\t\tcolumnID : focusedCellPosition ? focusedCellPosition.columnID : fieldHandler.getLastColumnID()\n\t\t\t})\n\t\t}\n\t\t// navigation.onRowMouseDown(event, this.rowMeta);\n\t\tgridEvent.onRowHeaderMouseDown({mouseEvent : event, rowID : this.rowMeta.rowID});\n\t}\n\n\n\tonRowMouseUp(event: MouseEvent): void {\n\t\t// const navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER ) as NavigationHandler; \n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\t\t\n\t\t// navigation.onRowMouseUp(event, this.rowMeta);\n\t\tgridEvent.onRowHeaderMouseUp({mouseEvent : event, rowID : this.rowMeta.rowID});\n\t}\n\n\tgetRowPosition() {\n\t\treturn this.rowMeta;\n\t}\n\n\tprivate addHoverListener(rowGui: RowGui) {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\t\tthis.addListener(rowGui.element, 'mouseenter', () =>{\n\t\t\t\tconst rowHoverHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_HOVER_HANDLER) as RowHoverHandler;\n\t\t\t\trowHoverHandler.setMouseOver(this.rowNode);\n\t\t\t\t// this.rowNode.onMouseEnter()\n\t\t\t}\n\t\t);\n\t\tthis.addListener(rowGui.element, 'mouseleave', () =>{\n\t\t\t\tconst rowHoverHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_HOVER_HANDLER) as RowHoverHandler;\n\t\t\t\trowHoverHandler.clearMouseOver(this.rowNode);\n\t\t\t\t// this.rowNode.onMouseLeave();\n\t\t\t}\n\t\t);\n\n\t\tthis.addListener( this.rowNode, ROW_NODE_EVENTS.EVENT_MOUSE_ENTER, () => {\n\t\t\t\tconst isRowHoverHighlighter = optionHandler.isRowHoverHighlighter();\n\t\t\t\t// const rowHoverHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_HOVER_HANDLER) as RowHoverHandler;\n\t\t\t\tif ( !isRowHoverHighlighter) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst fullRowHoverEdit = optionHandler.isFullRowHoverOnEdit();\n\t\t\t\tif (fullRowHoverEdit) {\n\t\t\t\t\tthis.startRowHoverEditing();\n\t\t\t\t} \n\t\t\t\tthis.onRowEnter();\n\n\t\t\t\t// rowHoverHandler.setMouseOver(this.rowNode);\n\t\t\t\tthis.eventHandler.dispatchEvent({\n\t\t\t\t\ttype       : Events.EVENT_ROW_ENTER,\n\t\t\t\t\trowID      : this.rowMeta.rowID,\n\t\t\t\t\trowMeta    : this.rowMeta,\n\t\t\t\t\tcontroller : this\n\t\t\t\t} as any);\n\t\t\t},\n\t\t);\n\n\t\tthis.addListener( this.rowNode, ROW_NODE_EVENTS.EVENT_MOUSE_LEAVE, () => {\n\t\t\t\tconst fullRowHoverEdit = optionHandler.isFullRowHoverOnEdit();\n\t\t\t\tif(fullRowHoverEdit) {\n\t\t\t\t\tthis.stopRowHoverEditing();\n\t\t\t\t}\n\t\t\t\tthis.onRowLeave();\n\t\t\t\tthis.eventHandler.dispatchEvent({\n\t\t\t\t\ttype       : Events.EVENT_ROW_LEAVE,\n\t\t\t\t\trowID      : this.rowMeta.rowID,\n\t\t\t\t\trowMeta    : this.rowMeta,\n\t\t\t\t\tcontroller : this\n\t\t\t\t} as any);\n\t\t\t},\n\t\t);\n\t}\n\n\thasRowEntered() : boolean {\n\t\treturn this.hasRowEnteredFlag;\n\t}\n\n\n\tonRowEnter() {\n\t\tthis.hasRowEnteredFlag = true;\n\t\tthis.allRowGui.forEach((gui) => {\n\t\t\tgui.component.onMouseEnter();\n\t\t});\n\t}\n\n\tonRowLeave() {\n\t\tthis.hasRowEnteredFlag = false;\n\t\tthis.allRowGui.forEach((gui) => {\n\t\t\tgui.element.classList.remove('ZG-rowHover');\n\t\t});\n\t}\n\n\tsetCellController() {\n\t\tthis.allRowGui.forEach((gui) => {\n\t\t\tconst controllers = this.getCellControllersForContainer(\n\t\t\t\tgui.containerType,\n\t\t\t);\n\t\t\tgui.component.setCellControllers(controllers);\n\t\t});\n\t}\n\n\tprivate getCellControllersForContainer( containerType: RowContainerType, ): CellController[] {\n\t\tswitch (containerType) {\n\t\t\tcase RowContainerType.LEFT:\n\t\t\t\treturn this.leftCellCtrls.getAllData();\n\t\t\tcase RowContainerType.RIGHT:\n\t\t\t\treturn this.rightCellCtrls.getAllData();\n\t\t\tcase RowContainerType.HEADER:\n\t\t\t\treturn this.headerCellCtrls.getAllData();\n\t\t\tcase RowContainerType.CENTER:\n\t\t\t\treturn this.centerCellCtrls.getAllData();\n\t\t\tcase RowContainerType.FULL_WIDTH:\n\t\t\t\treturn [];\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`${containerType}`);\n\t\t}\n\t}\n\n\tcreateAllCellController(force : boolean = false): void {\n\t\tconst columnVisibleHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_VISIBLE_HANDLER) as ColumnVisibleHandlerType;\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst params = {\n\t\t\trowNode : this.rowNode,\n\t\t\trowIndex: this.rowNode.getIndex()\n\t\t};\n\t\tconst centerColumns = this.shouldRenderAllCellsForAutoRowHeight()\n\t\t\t? fieldHandler.getDisplayedCenterColumns()\n\t\t\t: columnVisibleHandler.getCenterColumns(params);\n\t\tconst leftColumns   = columnVisibleHandler.getLeftColumns(params);\n\t\tconst rightColumns  = columnVisibleHandler.getRightColumns(params);\n\t\tconst headerColumns = columnVisibleHandler.getHeaderColumns(params);\n\n\t\tthis.centerCellCtrls = this.createCellController( this.centerCellCtrls, centerColumns, force);\n\t\tthis.leftCellCtrls   = this.createCellController( this.leftCellCtrls, leftColumns, force);\n\t\tthis.rightCellCtrls  = this.createCellController( this.rightCellCtrls, rightColumns, force);\n\t\tthis.headerCellCtrls = this.createCellController( this.headerCellCtrls, headerColumns, force);\n\t}\n\n\tprotected createCellController( previousCellControllers: GenericDataStore<CellController>, columns: IColumnNode[] | RecordHeaderColumnNode[], force : boolean = false) {\n\t\tconst cellControllers : GenericDataStore<CellController> = new GenericDataStore<CellController>() as any;\n\t\tcolumns.forEach((column) => {\n\t\t\tconst columnID = column.getID();\n\t\t\tlet  cellControllerExist = previousCellControllers.getData(columnID);\n\t\t\tif (cellControllerExist) {\n\t\t\t\tcellControllers.addData(columnID ,cellControllerExist);\n\t\t\t\tpreviousCellControllers.removeData(columnID);\n\t\t\t\t\n\t\t\t}else {\n\t\t\t\tconst cellCtrl = new CellController( column, this.rowNode, this, this.getBeanInstanceByBeanName, column.getPinnedPosition());\n\t\t\t\tcellControllers.addData(columnID , cellCtrl);\n\t\t\t}\n\t\t});\n\n\t\tpreviousCellControllers.getAllData().forEach((cellController) => {\n\t\t\tconst columnID = cellController.getColumn().getID();\n\n\t\t\tconst isCellAvailable = cellControllers.getData(columnID) != null;\n\n\t\t\tif (isCellAvailable) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst isEditing = cellController.isEditing();\n\t\t\tconst isCellFocused = this.getBeanInstanceByBeanName('focusHandler').isCellFocused(cellController.getCellPosition());\n\n\t\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\t\tconst isColumnExist = fieldHandler.getColumnNodeByID(columnID);\n\n\t\t\tif(!force && (isEditing ||isCellFocused) ) {\n\n\t\t\t\tif(!isColumnExist) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcellControllers.addData(columnID, cellController);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcellController.destroy();\n\t\t});\n\n\t\treturn cellControllers;\n\t}\n\n\tgetAllCellControllers(skipHeader: boolean = true): CellController[] {\n\t\tconst result: CellController[] = [];\n\n\t\tconst left = this.leftCellCtrls.getAllData();\n\t\tfor (let i = 0; i < left.length; i++) {\n\t\t\tresult.push(left[i]);\n\t\t}\n\n\t\tconst center = this.centerCellCtrls.getAllData();\n\t\tfor (let i = 0; i < center.length; i++) {\n\t\t\tresult.push(center[i]);\n\t\t}\n\n\t\tconst right = this.rightCellCtrls.getAllData();\n\t\tfor (let i = 0; i < right.length; i++) {\n\t\t\tresult.push(right[i]);\n\t\t}\n\n\t\tif (!skipHeader) {\n\t\t\tconst header = this.headerCellCtrls.getAllData();\n\t\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\t\tresult.push(header[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tgetHeaderCellControllers() : CellController[] {\n\t\treturn this.headerCellCtrls.getAllData();\n\t}\n\n\tdestroy(): void {\n\t\tthis.destroyPass();\n\t\t\n\t\t// Call super.destroy() first to clean up all EventEmitter listeners\n\t\t// This ensures all event listeners are removed before clearing references\n\t\tsuper.destroy();\n\t\t\n\t\t// After EventEmitter cleanup, clear all references to allow garbage collection\n\t\tthis.rowNode = null as any;\n\t\tthis.fullWidthCellRenderer = null;\n\t\tthis.gridCellEditorHandler = null as any;\n\t\tthis.getBeanInstanceByBeanName = null as any;\n\t}\n\n\tdestroyPass() {\n\t\tif (this.pendingAutoRowHeightFrameId != null) {\n\t\t\tcancelAnimationFrame(this.pendingAutoRowHeightFrameId);\n\t\t\tthis.pendingAutoRowHeightFrameId = null;\n\t\t}\n\t\tthis.allRowGui.length = 0;\n\n\t\t// Destroy all cell controllers first to ensure proper cleanup order\n\t\tconst destroyCellCtrls = (ctrls: GenericDataStore<CellController>) => {\n\t\t\tconst allData = ctrls.getAllData();\n\t\t\tfor (let i = 0; i < allData.length; i++) {\n\t\t\t\tconst c = allData[i];\n\t\t\t\tif (c) {\n\t\t\t\t\tc.destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn new GenericDataStore<CellController>();\n\t\t};\n\n\t\tthis.headerCellCtrls = destroyCellCtrls(this.headerCellCtrls);\n\t\tthis.centerCellCtrls = destroyCellCtrls(this.centerCellCtrls);\n\t\tthis.leftCellCtrls = destroyCellCtrls(this.leftCellCtrls);\n\t\tthis.rightCellCtrls = destroyCellCtrls(this.rightCellCtrls);\n\t}\n\n\tgetCellController(columnID: string): CellController | null {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst columnIndex  = fieldHandler.getIndexById(columnID);\n\t\tconst pane         = fieldHandler.getFieldPaneByIndex(columnIndex);\n\n\t\tswitch (pane.getPinPosition()) {\n\t\t\tcase COLUMN_PANE_TYPE.LEFT:\n\t\t\t\treturn this.leftCellCtrls.getData(columnID) ?? null;\n\t\t\tcase COLUMN_PANE_TYPE.CENTER:\n\t\t\t\treturn this.centerCellCtrls.getData(columnID) ?? null;\n\t\t\tcase COLUMN_PANE_TYPE.RIGHT:\n\t\t\t\treturn this.rightCellCtrls.getData(columnID) ?? null;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\n\tgetHeaderCellController(columnID: string): CellController {\n\t\treturn this.headerCellCtrls.getData(columnID) ?? null;\n\t}\n\t\n\n\tafterGuiAttached(): void {\n\t\tif(!this.isAlive()) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tthis.onRowFocused();\n\t\tthis.onFullWidthRowFocused();\n\t\tthis.getAllCellControllers(false).forEach((controller: CellController) => {\n\t\t\tcontroller.afterGuiAttached();\n\t\t});\n\n\t\tthis.updateAutoRowHeightIfNeeded();\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\tconst rowCreatedParams = this.getRowCreatedParams(rowGui);\n\t\t\toptionHandler.onAfter(\"rowCreated\", rowCreatedParams);\n\t\t})\n\t}\n\n\tpublic refreshAutoRowHeight(): void {\n\t\tthis.updateAutoRowHeightIfNeeded();\n\t}\n\n\tprivate setFloatingRecordRelativePopupMsg(rowGuis : RowGui[]) : void {\n\t\tconst floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n\n\t\t// const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n\n\t\tconst recordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n\n\t\tconst recordID        = this.rowNode.getId();\n\n\t\tconst currentRowIndex = recordHandler.getRelativeIndexByID(recordID);\n\n\t\tconst isIndexinMiddleHandler = recordHandler.isInMiddlePane(currentRowIndex);\n\n\t\tif(isIndexinMiddleHandler) {\n\t\t\tconst rowId                 = this.rowNode.getId();\n\t\t\t// const isRelativeFloatingRecord = optionHandler.isRelativeFloatingRecord();\n\t\t\tconst isFloatingRecord         = floatingRecordHandler.isFloatingRecord(rowId);\n\n\t\t\tif (!isFloatingRecord) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trowGuis.forEach((rowGui) => {\n\t\t\t\tconst { component } = rowGui;\n\t\t\t\tcomponent.setFloatingRecord();\n\t\t\t});\n\t\t}\n\t}\n\n\t// private setFloatingRecordClassName() : void {\n\t// \tconst floatingRecordHandler = this.getBeanInstanceByBeanName(BEAN_NAME.FLOATING_RECORD_HANDLER, [BEAN_NAME.FLOATING_RECORD_HANDLER]) as IFloatingRecordHandler;\n\n\t// \tconst rowNode = this.getRowNode();\n\n\t// \tconst rowIndex = rowNode.getIndex();\n\t\t\n\t// \tconst isFloatingRecord = floatingRecordHandler.isFloatingRecord(rowIndex);\n\n\t// \tthis.allRowGui.forEach((rowGui) => {\n\t// \t\tconst {component} = rowGui;\n\t// \t\tcomponent.addOrRemoveCssClass('ZG-rowPopover', !!isFloatingRecord);\n\n\t// \t})\n\t// }\n\n\t public startRowHoverEditing(_key: string | null = null, event: KeyboardEvent | null = null): void {\n        if (this.editingRow) { return; }\n\n        this.getAllCellControllers(true).reduce((prev: boolean, cellCtrl: CellController) => {\n            // cellCtrl.startEditing(null, event);\n\t\t\tthis.gridCellEditorHandler.startEditing(cellCtrl, null, event);\n            if (prev) { return true; }\n\n            return cellCtrl.isEditing();\n        }, false);\n\n        this.setEditingRow(true);\n    }\n\n\tpublic stopRowHoverEditing(cancel = false): void {\n        if (this.stoppingRowEdit) { return; }\n\n        const cellControls = this.getAllCellControllers(true);\n        const isRowEdit = this.editingRow;\n\n        this.stoppingRowEdit = true;\n\n        let fireRowEditEvent = false;\n        for (let i = 0; i < cellControls.length; i++) {\n            // const valueChanged = ctrl.stopEditing(cancel);\n\t\t\tconst valueChanged = this.gridCellEditorHandler.stopEditing(cancel);\n            if (isRowEdit && !cancel && !fireRowEditEvent && valueChanged) {\n                fireRowEditEvent = true;\n            }\n        }\n\n\n        if (isRowEdit) {\n            this.setEditingRow(false);\n        }\n\n        this.stoppingRowEdit = false;\n    }\n\n\tprivate setEditingRow(value: boolean): void {\n        this.editingRow = value;\n        this.allRowGui.forEach(gui => gui.component.addOrRemoveCssClass('dg-row-editing', value));\n    }\n\n\tfocus(): void {\n\t\t// const selectionHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.SELECTION_HANDLER) as SelectionHandler;\n\t\t// const activeSelection = selectionHandler.getActiveSelection();\n\n\t\t// if(!activeSelection) {\n\t\t// \treturn;\n\t\t// }\n\t\t// const isRangeSelection = selectionHandler.getActiveSelection().type === 'range';\n\t\t// if(!this.isFullWidth()) {\n\t\t// \treturn;\n\t\t// }\n\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\tconst element = rowGui.element;\n\t\t\t// element && element.scrollIntoView({ block: 'nearest' });\n\t\t\telement && element.focus();\n\t\t})\n\n\t}\n\n\t// onKeyDown(event: KeyboardEvent): void {\n\t// \tthis.navigateKeyDown(event);\n\t// }\n\n\t// private navigateKeyDown(event) {\n\n\t// \tif(!this.isFullWidth()) {\n\t// \t\treturn;\n\t// \t}\n\t// \tconst gridOption = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_OPTIONS);\n\t// \tconst suppressKeyDownEvent = gridOption.suppressKeyDownEvent;\n\t// \tif(suppressKeyDownEvent) {\n\t// \t\tconst isKeyDownSuppressed = suppressKeyDownEvent({\n\t// \t\t\tevent : event,\n\t// \t\t\ttype : \"row\"});\n\t// \t\tif(isKeyDownSuppressed) {\n\t// \t\t\treturn;\n\t// \t\t}\n\t// \t};\n\n\n\t// \tconst navigationService = this.getBeanInstanceByBeanName('navigationService') as NavigationService;\n\n\t// \tconst key = event.code;\n\n\t// \tconst focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\n\t// \tconst focusedCellPosition  = focusHandler.getFocusedCellPosition();\n\t// \tconst cellPosition  : CellPositionType = {\n\t// \t\tcolumnID : focusedCellPosition.columnID,\n\t// \t\trowIndex : this.rowNode.getIndex(),\n\t// \t\tpinPosition : this.rowNode.getPinnedPosition()\n\t// \t}\n\n    //     switch (key) {\n\t// \t\tcase KeyBoardKeyCode.ArrowLeft :\n\t// \t\t\tif(event.ctrlKey || event.metaKey) {\n\t// \t\t\t\tnavigationService.navigateToFirstCellInRow(cellPosition);\n\n\t// \t\t\t}else {\n\t// \t\t\t\tnavigationService.navigateToCellLeft(cellPosition);\n\t// \t\t\t}\n\t// \t\t\tevent.preventDefault();\n\t// \t\t\tbreak;\n\t// \t\tcase KeyBoardKeyCode.ArrowRight:\n\t// \t\t\tif(event.ctrlKey|| event.metaKey) {\n\t// \t\t\t\tnavigationService.navigateToLastCellInRow(cellPosition);\n\t// \t\t\t}else {\n\t// \t\t\t\tnavigationService.navigateToCellRight(cellPosition);\n\t// \t\t\t}\n\t// \t\t\tevent.preventDefault();\n\t// \t\t\tbreak;\n\t// \t\tcase KeyBoardKeyCode.ArrowUp :\n\t// \t\t\tif(event.ctrlKey|| event.metaKey) {\n\t// \t\t\t\tnavigationService.navigateToFirstCellInColumn(cellPosition);\n\t// \t\t\t}else {\n\t// \t\t\t\tnavigationService.navigateToCellUp(cellPosition);\n\t// \t\t\t}\n\t// \t\t\tevent.preventDefault();\n\t// \t\t\tbreak;\n\t// \t\tcase KeyBoardKeyCode.ArrowDown:\n\t// \t\t\tif(event.ctrlKey|| event.metaKey) {\n\t// \t\t\t\tnavigationService.navigateToLastCellInColumn(cellPosition);\n\t// \t\t\t}else {\n\t// \t\t    \tnavigationService.navigateToCellDown(cellPosition);\n\t// \t\t\t}\n\t// \t\t\tevent.preventDefault();\n\t// \t\t\tbreak;\n\t// \t\tdefault:\n\t// \t\t\t// this.navigateKeyDown(event);\n\t\t\t\t\n\t// \t}\n\n\t// \t// navigation.onKeyDown(event, {}, this);\n\t// }\n\n\tonRowFocused(): void {\n\t\tconst selectionHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\tconst rowMeta =  this.rowNode.getRowMeta() as RowPositionType;\n\n\t\tconst isRowFocused = selectionHandler.isRowFocused(rowMeta);\n\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\trowGui.component.addOrRemoveCssClass(\"dg-row-focus\", isRowFocused);\n\t\t\trowGui.component.addOrRemoveCssClass(\"dg-row-no-focus\", !isRowFocused);\n\t\t})\n\t}\n\n\tonFullWidthRowFocused() : void {\n\t\tconst selectionHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\tconst rowMeta =  this.rowNode.getRowMeta() as RowPositionType;\n\n\t\tconst isRowFocused = this.isFullWidth() ? selectionHandler.isRowFocused(rowMeta) : false;\n\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\trowGui.component.addOrRemoveCssClass(\"dg-full-width-focus\", isRowFocused);\n\t\t})\n\t\tisRowFocused && this.focus();\n\t}\n\n\tgetRowFocusedPosition() : CellPositionType {\n\t\tconst focusHandler                    = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\t\tconst focusedCellPosition             = focusHandler.getFocusedCellPosition();\n\t\tconst rowMeta                         = this.rowNode.getRowMeta() as RowPositionType;\n\t\tconst cellPosition : CellPositionType = {\n\t\t\t...rowMeta,\n\t\t\tcolumnID : (focusedCellPosition && focusedCellPosition.columnID) as string\n\t\t}\n\n\t\treturn cellPosition;\n\t}\n\n\tpublic onRowSelected() : void {\n\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler');\n\t\tconst isRowSelected = rowSelectionHandler.isRowSelected(this.rowMeta);\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\trowGui.component.addOrRemoveCssClass('ZG-rowSelected', !!isRowSelected);\n\t\t})\n\t}\n\n\tprivate onRowHighlightChanged() : void {\n\t\tif(!this.rowNode.isLoaded())  {\n\t\t\treturn;\n\t\t}\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\tconst highlight = this.rowNode.getHighlight();\n\t\t\tconst aboveOn = highlight === 'above';\n\t\t\tconst BelowOn = highlight === 'below';\n\t\t\trowGui.component.addOrRemoveCssClass('ZG-rowHighlight-above', aboveOn);\n\t\t\trowGui.component.addOrRemoveCssClass('ZG-rowHighlight-below', BelowOn);\t\n\n\t\t})\n\t}\n\n\tcreateDefinitionParam() : any {\n        const optionHandler            = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const rowreorderRenderer = optionHandler.getRowReoderRenderer();\n        const userProvidedRenderParam = optionHandler.getRowReorderRendererParams();\n        return {\n            getRenderer : ()=>rowreorderRenderer,\n            getRendererParam : ()=>userProvidedRenderParam\n        }\n    }\n\n\tcreateRowReorderParams(sourceRow) : IRowReoderParams {\n        const APIHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER)\n        return {\n            values: sourceRow,\n            APIs  : APIHandler\n        }\n    }\n\n\tprivate isRightClickByEvent(event : MouseEvent) : boolean {\n\t\tif(event.button === 2) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tgetElements() : HTMLElement[] {\n\t\treturn this.allRowGui.map((rowGui) => rowGui.element);\n\t}\n\n\tgetAllRowElement() : RowGui[] {\n\t\treturn this.allRowGui;\n\t}\n\n\trefreshCells(focus : boolean = true) : void {\n\t\tthis.updateRowMeta();\n\t\tthis.updateRowIndexes();\n\t\tthis.updateTop();\n\t\tthis.updateRowIndexes();\n\t\tthis.refreshFullwidthRenderer();\n\t\tthis.getAllCellControllers(false).forEach((cellCtrl) => {\n\t\t\tcellCtrl.recycleCells({force : true}, focus);\n\t\t})\n\t}\n\n\trefreshFullwidthRenderer():void{\n\t\tif(!this.isFullWidth()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\tthis.setupFullWidth(rowGui, true);\n\t\t})\n\n\t}\n\n\trefreshCell(fieldID : string, params : RefreshCellParams) : void {\n\t\tconst cellCtrl = this.getCellController(fieldID);\n\t\tcellCtrl && cellCtrl.recycleCells(params);\n\t}\n\n\texpandCollapseRow() : void {\n\t\tthis.updateRowIndexes();\n\t\tthis.updateTop();\n\t}\n\n\tprivate updateAutoRowHeightIfNeeded() : void {\n\t\t\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif (!optionHandler || typeof optionHandler.getViewType !== 'function' || optionHandler.getViewType() !== 'grid') {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof optionHandler.isAutoRowHeight !== 'function' || !optionHandler.isAutoRowHeight()) {\n\t\t\treturn;\n\t\t}\n\t\tif (this.isExtraRow()) {\n\t\t\treturn;\n\t\t}\n\t\tif ((this.rowNode as any).isGroupRow?.() && !this.isFullWidth()) {\n\t\t\treturn;\n\t\t}\n\t\t// Allow auto-height measurement for full-width group headers; other full-width rows use dedicated renderers.\n\t\tif (this.isFullWidth() && this.rowType !== RowType.FullWidthGrouping) {\n\t\t\treturn;\n\t\t}\n\t\t// Check if any column has width set to 'auto'\n\t\tconst columnDefs = typeof optionHandler.getColumnDef === 'function'\n\t\t? optionHandler.getColumnDef() ?? []\n\t\t: [];\n\n\t\t// const hasAutoWidthColumn = columnDefs.some(\n\t\t// (col) => col?.width === 'auto'\n\t\t// );\n\t\tconst anyColumnUsesAutoWidth = columnDefs.some(\n\t\t\t(col) => (col?.width as any) === 'auto'\n\t\t);\n\n\t\tconst columnAutofitHandler = this.getBeanInstanceByBeanName(\n\t\tGRID_BEAN_NAME.COLUMN_AUTOFIT_HANDLER\n\t\t) as { getAutofitProgressState?: () => boolean } | undefined;\n\n\t\tconst autoFitWidthsStillComputing =\n\t\ttypeof columnAutofitHandler?.getAutofitProgressState === 'function'\n\t\t? columnAutofitHandler.getAutofitProgressState()\n\t\t: false;\n\n\n\t\tif (anyColumnUsesAutoWidth && autoFitWidthsStillComputing) {\n\t\t\tconst fallbackHeight = this.clampAutoMeasuredRowHeight(defaultRowHeight, optionHandler);\n\t\t\tif (Math.round(this.rowNode.getHeight()) !== Math.round(fallbackHeight)) {\n\t\t\t\tthis.rowNode.updateHeight(fallbackHeight);\n\t\t\t}\n\t\t\tthis.setRowHeight();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.pendingAutoRowHeightFrameId != null) {\n\t\t\tcancelAnimationFrame(this.pendingAutoRowHeightFrameId);\n\t\t\tthis.pendingAutoRowHeightFrameId = null;\n\t\t}\n\n\t\tthis.pendingAutoRowHeightFrameId = requestAnimationFrame(() => {\n\t\t\tthis.pendingAutoRowHeightFrameId = null;\n\t\t\tvoid this.measureAndApplyAutoRowHeight().catch(() => {});\n\t\t});\n\t}\n\n\tprivate shouldRenderAllCellsForAutoRowHeight(): boolean {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\treturn typeof optionHandler?.isAutoRowHeight === 'function' && optionHandler.isAutoRowHeight();\n\t}\n\n\t/** Single-pass auto height: read live cell content heights and apply tallest value to the row. */\n\tprivate async measureAndApplyAutoRowHeight(): Promise<void> {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif (!this.isAlive() || !this.allRowGui.length || !this.allRowGui[0].element) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst cellControllers = this.getAllCellControllers(false);\n\t\tlet tallestContentHeightPx = 0;\n\t\tfor (let i = 0; i < cellControllers.length; i++) {\n\t\t\tconst component = cellControllers[i]?.component;\n\t\t\tif (!component || typeof component.getElement !== 'function') {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cellEl = component.getElement();\n\t\t\tif (!cellEl) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst cellValueEl =\n\t\t\t\ttypeof component.getCellValueElement === 'function'\n\t\t\t\t\t? component.getCellValueElement()\n\t\t\t\t\t: null;\n\t\t\tconst heightPx = measureNaturalBlockHeight(cellEl, cellValueEl ?? undefined);\n\t\t\tif (heightPx > tallestContentHeightPx) {\n\t\t\t\ttallestContentHeightPx = heightPx;\n\t\t\t}\n\t\t}\n\n\t\tif (!Number.isFinite(tallestContentHeightPx) || tallestContentHeightPx <= 0) {\n\t\t\tthis.setRowHeight();\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextRowHeightPx = this.clampAutoMeasuredRowHeight(\n\t\t\tMath.ceil(tallestContentHeightPx) + RowController.ROW_HEIGHT_BORDER_PX,\n\t\t\toptionHandler,\n\t\t);\n\t\tconst previousRowHeightPx = this.rowNode.getHeight();\n\t\tif (Math.round(previousRowHeightPx) !== Math.round(nextRowHeightPx)) {\n\t\t\tthis.rowNode.updateHeight(nextRowHeightPx);\n\t\t}\n\t\tthis.setRowHeight();\n\t}\n\tprivate getRowCreatedParams(rowGUI : RowGui) {\n\t\treturn {\n\t\t\t...this.rowMeta,\n\t\t\telement : rowGUI.element,\n\t\t\tposition : rowGUI.containerType\n\t\t}\n\t}\n\n\tprivate clampAutoMeasuredRowHeight(height: number, optionHandler: GridOptioHandler): number {\n\t\tconst minV = typeof optionHandler.getMinRowAuto === 'function' ? optionHandler.getMinRowAuto() : undefined;\n\t\tconst maxV = typeof optionHandler.getMaxRowAuto === 'function' ? optionHandler.getMaxRowAuto() : undefined;\n\t\tlet h = height;\n\t\tif (minV !== undefined) {\n\t\t\th = Math.max(h, minV);\n\t\t}\n\t\tif (maxV !== undefined) {\n\t\t\th = Math.min(h, maxV);\n\t\t}\n\t\treturn h;\n\t}\n\trefreshFullWidth() : void {\n\t\tthis.allRowGui.forEach((rowGui) => {\n\t\t\tthis.setupFullWidth(rowGui);\n\t\t})\n\t}\n\n}\n\n","import { IRowMeta } from \"../../../../../API/CommonAPIInterface\";\nimport { RowContainerType } from \"../../utils/type\";\nimport { IRowComponent, RowController, RowType } from \"./RowController\";\n\nexport interface IRowControllerWrapper {\n    setComponent(component : IRowComponent, element : HTMLElement, containerType : RowContainerType): void;\n    getRowMeta() : IRowMeta;\n    getRowHeight() : number ;\n    getRowType()   : RowType;\n    getTabIndex()  : number;\n    unsetComp(containerType: RowContainerType) : void;\n}\nexport function RowControllerWrapper(rowController : RowController) : IRowControllerWrapper {\n    return {\n        getRowMeta() : IRowMeta {\n            return rowController.getRowMeta();\n        },\n        getRowHeight() : number {\n            return rowController.getRowHeight();\n        },\n\n        setComponent(component : IRowComponent, element : HTMLElement, containerType : RowContainerType) : void {\n            return rowController.setComponent(component, element, containerType)\n        },\n\n        getRowType() : RowType {\n            return rowController.getRowType();\n        },\n        getTabIndex() : number {\n            return rowController.getTabIndex();\n        },\n        unsetComp(containerType: RowContainerType) : void {\n            rowController.unsetComp(containerType);\n        }\n    }\n}\n\n","import { EventEmitter } from \"@dg/corecomponent\";\n\nexport class RowCssHandler extends EventEmitter {\n    constructor(private element : HTMLElement | null) {\n        super();\n    }\n\n    onMouseEnter() {\n        this.element.classList.add('ZG-rowHover')\n    }\n\n    destroy() {\n        super.destroy();\n        this.element = null;\n    }\n}","import { BEAN_NAME } from \"@dg/corecomponent\";\nimport { Events } from \"../../../../../../Core/Constants/Events\";\nimport { IColumnNode } from \"../../../../../../Core/Interface/IColumnNode\";\nimport { RowContainerType } from \"../../../utils/type\";\nimport { CellController } from \"../../Cell/CellController\";\nimport { SummaryCellController } from \"../../Cell/Summary/SummyCellController\";\nimport { IRowComponent, RowController, RowGui } from \"../RowController\";\nimport { GenericDataStore } from \"../../../../../../Core/generic-data-store\";\n\nexport class SummaryRowController extends RowController {\n\n    protected createCellController( previousCellControllers: GenericDataStore<CellController>, columns: IColumnNode[], ) {\n\n        const cellControllers : GenericDataStore<CellController> = new GenericDataStore() as any;\n\t\tcolumns.forEach((column) => {\n\t\t\tconst columnID = column.getID();\n\t\t\tlet cellControllerExist = previousCellControllers.getData(columnID);\n\t\t\tif (cellControllerExist) {\n\t\t\t\tcellControllers.addData(columnID, cellControllerExist);\n\t\t\t\tpreviousCellControllers.removeData(columnID);\n\t\t\t} else {\n\t\t\t\tconst cellCtrl = new SummaryCellController(\n\t\t\t\t\tcolumn,\n\t\t\t\t\tthis.rowNode,\n\t\t\t\t\tthis,\n\t\t\t\t\tthis.getBeanInstanceByBeanName,\n\t\t\t\t);\n\t\t\t\tcellControllers.addData(columnID, cellCtrl);\n\t\t\t}\n\t\t});\n\n\t\tpreviousCellControllers.getAllData().forEach((cellController) => {\n\t\t\tconst columnID = cellController.getColumn().getID();\n\n\t\t\tconst isCellAvailable = cellControllers.getData(columnID) != null;\n\n\t\t\tif (isCellAvailable) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcellController.destroy();\n\t\t});\n\n\t\treturn cellControllers;\n\t}\n\n    setComponent(component : IRowComponent, element : HTMLElement, containerType : RowContainerType) : void {\n        const gui: RowGui = { component, element, containerType };\n        this.allRowGui.push(gui);\n\n        this.initialise(gui);\n\n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER);\n\n\t\tthis.addListener(eventHandler, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.updateColumn.bind(this))\n    }\n\n    protected initialise(rowGui: RowGui): void {\n\t\trowGui.element.classList.add('ZG-summary-row')\n        this.onTopChanged();\n        this.updateColumn();\n    }\n}","import { AutoWired, BEAN_NAME, Component, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { queryAssignedNodes } from \"../../../Core/Decorator/ReferenceSelector\";\nimport { RowComponent } from \"./Rendering/Row/RowComponent\";\nimport { RowController } from \"./Rendering/Row/RowController\";\nimport { RowControllerWrapper } from \"./Rendering/Row/RowControllerWrapper\";\nimport { RowContainerController } from \"./RowContainerController\";\nimport { ROW_CONTAINER_NAME, RowContainerType, getRowContainerTypeForName } from \"./utils/type\";\n\n\nexport class RowContainerComponent extends Component {\n\tprivate readonly name: ROW_CONTAINER_NAME;\n\tprivate readonly type: RowContainerType;\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\t// @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler;\n\n\tstatic getTemplate: (name: ROW_CONTAINER_NAME) => HTMLElement;\n\n\tprivate rowComponents:{ [id: string]: RowComponent } = {};\n\n\t@queryAssignedNodes('eContainer') private eContainer! : HTMLElement;\n\t@queryAssignedNodes('eViewPort') private eViewPort!   : HTMLElement;\n\n\tconstructor() {\n\t\tsuper();\n\t\tthis.name = Component.elementGettingCreated.getAttribute('rowtype') as ROW_CONTAINER_NAME;\n\n\t\tthis.setTemplate(RowContainerComponent.getTemplate(this.name));\n\n\t\tthis.type = getRowContainerTypeForName(this.name);\n\t}\n\n\tpublic appendChild( newChild: Component | HTMLElement, _container?: HTMLElement | undefined, ): void {\n\t\tsuper.appendChild(newChild, this.eContainer);\n\t}\n\n\t@PostConstruct()\n\tpostConstruct() {\n\t\tconst rowController = new RowContainerController(this.name);\n\t\tthis.createManagedBean(rowController);\n\t\tconst component = {\n\t\t\tappendChild      : (newChild: Component | HTMLElement) => this.appendChild(newChild, this.eContainer),\n\t\t\tsetContainerWidth: (width : string) => this.eContainer.style.width = width,\n\t\t\tsetRowControllers: (rowControllers: RowController[]) => this.setRowControllers(rowControllers),\n\t\t\tfocus            : () => this.getGui().focus(),\n\t\t};\n\t\trowController.setUpComponent(\n\t\t\tcomponent,\n\t\t\tthis.eContainer,\n\t\t\tthis.eViewPort\n\t\t);\n\t}\n\n\n\t// private setRowControllers(rowControllers: RowController[]): void {\n\t// \t// const previousRowComponent = { ...this.rowComponents };\n\n\t// \t// this.rowComponents = {};\n\t// \t// rowControllers.forEach((rowController) => {\n\t// \t// \tconst instanceID = rowController.getInstanceId();\n\t// \t// \tconst RowComponentExist = previousRowComponent[instanceID];\n\t// \t// \tconst isExtraRow = rowController.isExtraRow();\n\t// \t// \tif (RowComponentExist && !isExtraRow) {\n\t// \t// \t\tthis.rowComponents[instanceID] = RowComponentExist;\n\t// \t// \t\tdelete previousRowComponent[instanceID];\n\t// \t// \t} else {\n\t// \t// \t\tthis.newComponent(rowController);\n\t// \t// \t}\n\t// \t// });\n\n\t// \t// Object.values(previousRowComponent).forEach((oldRowComp: any) => {\n\t// \t// \tthis.eContainer.removeChild(oldRowComp.getGui());\n\t// \t// \toldRowComp.detach();\n\t// \t// \toldRowComp.destroy();\n\t// \t// });\n\n\t// \tconst prevRowComps = this.rowComponents; // Map<string, RowComponent>\n\t// \tconst nextRowComps = new Map<string, any>();\n\t// \tconst fragment = document.createDocumentFragment();\n\t// \tconst newlyCreatedComps: RowController[] = [];\n\n\t// \t// Reuse or create row components\n\t// \tfor (let i = 0; i < rowControllers.length; i++) {\n\t// \t\tconst rowCtrl = rowControllers[i];\n\t// \t\tconst id = rowCtrl.getInstanceId();\n\t// \t\tconst isExtra = rowCtrl.isExtraRow();\n\n\t// \t\tconst existing = prevRowComps.get(id);\n\n\t// \t\tif (existing && !isExtra) {\n\t// \t\t\tnextRowComps.set(id, existing);\n\t// \t\t\tprevRowComps.delete(id);\n\t// \t\t} else {\n\t// \t\t\tconst newComp = this.newComponent(rowCtrl);\n\t// \t\t\tnextRowComps.set(id, newComp);\n\t// \t\t\tfragment.appendChild(newComp.getGui());\n\t// \t\t\tnewlyCreatedComps.push(rowCtrl);\n\t// \t\t}\n\t// \t}\n\n\t// \t// Batch append all new rows once\n\t// \tif (fragment.childNodes.length > 0) {\n\t// \t\tthis.eContainer.appendChild(fragment);\n\t// \t}\n\n\t// \tif (newlyCreatedComps.length > 0) {\n    //         for (const comp of newlyCreatedComps) {\n    //             comp.afterGuiAttached();\n    //         }\n    //     }\n\n\t// \t// Remove all stale row components\n\t// \tif (prevRowComps.size > 0) {\n\t// \t\tfor (const [, comp] of prevRowComps) {\n\t// \t\t\tconst gui = comp.getGui();\n\t// \t\t\tif (gui.parentNode === this.eContainer) {\n\t// \t\t\t\tthis.eContainer.removeChild(gui);\n\t// \t\t\t}\n\t// \t\t\tcomp.detach();\n\t// \t\t\tcomp.destroy();\n\t// \t\t}\n\t// \t\tprevRowComps.clear();\n\t// \t}\n\n\t// \tthis.rowComponents = nextRowComps;\n\t// }\n\n\tprivate newComponent(controller: RowController) {\n\t\tconst rowControllerWrapper = RowControllerWrapper(controller);\n\t\tconst rowComponent         = new RowComponent(\n\t\t\trowControllerWrapper,\n\t\t\tthis.getBeanInstanceByBeanName,\n\t\t\tthis.type,\n\t\t\tthis.name,\n\t\t);\n\n\t\treturn rowComponent;\n\t}\n\n\tprivate setRowControllers(rowCtrls: RowController[]): void {\n\n        const oldRows = Object.assign({}, this.rowComponents);\n        const newComps: { [id: string]: RowComponent } = {};\n\t\tthis.rowComponents = newComps;\n\n        const orderedRows: [rowComp: RowComponent, isNew: boolean, rowCtrl: RowController][] = [];\n\n        for (const rowCtrl of rowCtrls) {\n            const instanceId = rowCtrl.getInstanceId();\n            const existingRowComp = oldRows[instanceId];\n\n            let rowComp: RowComponent;\n\n            if (existingRowComp) {\n                rowComp = existingRowComp;\n                delete oldRows[instanceId];\n            } else {\n                rowComp = this.newComponent(rowCtrl);\n            }\n            newComps[instanceId] = rowComp;\n            orderedRows.push([rowComp, !existingRowComp, rowCtrl]);\n        }\n\n        this.removeOldRows(Object.values(oldRows));\n        this.addRowNodes(orderedRows);\n    }\n\n    private addRowNodes(rows: [rowComp: RowComponent, isNew: boolean, rowCtrl: RowController][]): void {\n        for (const [rowComp, isNew, rowCtrl] of rows) {\n            const eGui = rowComp.getGui();\n\t\t\tif (isNew) {\n\t\t\t\tthis.eContainer.appendChild(eGui);\n\t\t\t\trowCtrl.afterGuiAttached();\n\t\t\t}\n        }\n    }\n\n    private removeOldRows(rowComps: RowComponent[]): void {\n        for (const oldRowComp of rowComps) {\n            oldRowComp.getGui().remove();\n            oldRowComp.destroy();\n        }\n    }\n}\n\n\n","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { Events } from \"../../../Core/Constants/Events\";\nimport { columnPinPositions } from \"../../../Core/Constants/GridConfigurationConstants\";\nimport { IControllerHandler } from \"../../../Core/Interface/IControllerHandler\";\nimport { IFloatingRecordHandler } from \"../../../FloatingRecords/Interface/IFloatingRecordHandler\";\nimport { CenterWidthHandler } from \"./CenterWidthHandler\";\nimport { HeightContainerHandler } from \"./HeightContainerHandler\";\nimport { LeftPinnedHandler } from \"./PinnedHandler/LeftPinnedHandler\";\nimport { RightPinnedHandler } from \"./PinnedHandler/RightPinnedHandler\";\nimport { RowHeaderHandler } from \"./PinnedHandler/RowHeaderHandler\";\nimport { RowController } from \"./Rendering/Row/RowController\";\nimport { RowContainerEventHandler } from \"./RowContainerEventHandler\";\nimport { ROW_CONTAINER_NAME } from \"./utils/type\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { getInnerWidth, isVisible } from \"../../../Core/utils/Dom\";\nimport { ResizeObserverType } from \"../../../Core/Interface/resize-observer.types\";\nimport { ViewportSizeHandler } from \"./viewportSizeHandler\";\nimport { DragContainerHandler } from \"./DragContainerHandler\";\n\nexport interface IRowContainerComponent {\n    setRowControllers(rowControllers : RowController[]) : void;\n    setContainerWidth(width : number) : number;\n}\n\nexport function getPaneStructure() {\n    const centerPanes    = [ROW_CONTAINER_NAME.TOP_CENTER, ROW_CONTAINER_NAME.CENTER, ROW_CONTAINER_NAME.BOTTOM_CENTER, ROW_CONTAINER_NAME.SUMMARY_CENTER, ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER,ROW_CONTAINER_NAME.EXTRA_ROW_CENTER, ROW_CONTAINER_NAME.STICKY_TOP_CENTER];\n    const leftPanes      = [ROW_CONTAINER_NAME.TOP_LEFT, ROW_CONTAINER_NAME.LEFT, ROW_CONTAINER_NAME.BOTTOM_LEFT, ROW_CONTAINER_NAME.SUMMARY_LEFT, ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT,ROW_CONTAINER_NAME.EXTRA_ROW_LEFT, ROW_CONTAINER_NAME.STICKY_TOP_LEFT];\n    const rightPanes     = [ROW_CONTAINER_NAME.RIGHT, ROW_CONTAINER_NAME.TOP_RIGHT, ROW_CONTAINER_NAME.BOTTOM_RIGHT, ROW_CONTAINER_NAME.SUMMARY_RIGHT, ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT,ROW_CONTAINER_NAME.EXTRA_ROW_RIGHT, ROW_CONTAINER_NAME.STICKY_TOP_RIGHT];\n\n    const allTopPanes    = [ROW_CONTAINER_NAME.TOP_HEADER,ROW_CONTAINER_NAME.TOP_LEFT, ROW_CONTAINER_NAME.TOP_CENTER, ROW_CONTAINER_NAME.TOP_RIGHT];\n    const allMiddlePanes = [ROW_CONTAINER_NAME.HEADER, ROW_CONTAINER_NAME.LEFT, ROW_CONTAINER_NAME.CENTER, ROW_CONTAINER_NAME.RIGHT, ROW_CONTAINER_NAME.FULL_WIDTH];\n    const allBottomPanes = [ROW_CONTAINER_NAME.BOTTOM_HEADER, ROW_CONTAINER_NAME.BOTTOM_LEFT, ROW_CONTAINER_NAME.BOTTOM_CENTER, ROW_CONTAINER_NAME.BOTTOM_RIGHT]\n\n    const allSummaryanes         = [ROW_CONTAINER_NAME.SUMMARY_HEADER, ROW_CONTAINER_NAME.SUMMARY_LEFT, ROW_CONTAINER_NAME.SUMMARY_CENTER, ROW_CONTAINER_NAME.SUMMARY_RIGHT];\n    const allFloatingRecordPanes = [ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER, ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT, ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER, ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT];\n    const allStickyTopPaned = [ROW_CONTAINER_NAME.STICKY_TOP_CENTER, ROW_CONTAINER_NAME.STICKY_TOP_FULL_WIDTH, ROW_CONTAINER_NAME.STICKY_TOP_HEADER, ROW_CONTAINER_NAME.STICKY_TOP_LEFT, ROW_CONTAINER_NAME.STICKY_TOP_RIGHT];\n    const headerPanes            = [ROW_CONTAINER_NAME.TOP_HEADER, ROW_CONTAINER_NAME.BOTTOM_HEADER, ROW_CONTAINER_NAME.HEADER, ROW_CONTAINER_NAME.SUMMARY_HEADER, ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER, ROW_CONTAINER_NAME.EXTRA_ROW_HEADER, ROW_CONTAINER_NAME.STICKY_TOP_HEADER];\n    return {\n        center   : centerPanes,\n        left     : leftPanes,\n        right    : rightPanes,\n        allTops  : allTopPanes,\n        allMiddle: allMiddlePanes,\n        allBottom: allBottomPanes,\n        header   : headerPanes,\n        allSummary : allSummaryanes,\n        allFloatingRecordPanes,\n        allStickyTopPaned\n    }\n}\n\nfunction isFullWidthContainer(name : ROW_CONTAINER_NAME) : boolean {\n    return (\n\t\tname === ROW_CONTAINER_NAME.TOP_FULL_WIDTH ||\n\t\tname === ROW_CONTAINER_NAME.FLOATING_FULL_WIDTH ||\n\t\tname === ROW_CONTAINER_NAME.BOTTOM_FULL_WIDTH ||\n\t\tname === ROW_CONTAINER_NAME.FULL_WIDTH ||\n        name === ROW_CONTAINER_NAME.STICKY_TOP_FULL_WIDTH ||\n        name === ROW_CONTAINER_NAME.SUMMARY_FULL_WIDTH\n\t);\n}\nexport class RowContainerController extends EventEmitter {\n    lastFrame : any\n    private name                : ROW_CONTAINER_NAME;\n    private pinnedWidthHandler !: LeftPinnedHandler | RightPinnedHandler | RowHeaderHandler;\n    private component        !  : any;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler !: IControllerHandler;\n    \n    private eContainer!         : HTMLElement;\n    private eViewport!          : HTMLElement;\n    private viewportSizeHandler : ViewportSizeHandler;\n\n    private readonly isFullWidthContainer : boolean;\n\n\n    private visible : boolean = true;\n    constructor(name : ROW_CONTAINER_NAME) {\n        super();\n        this.name = name;\n        this.isFullWidthContainer = isFullWidthContainer(name);\n    }\n\n\n\n    getPinnedWidthHandler() { \n        return this.pinnedWidthHandler;\n    }\n\n    setUpComponent(component : any, eContainer : HTMLElement, eViewPort : HTMLElement) {\n        this.component = component;\n        this.eContainer = eContainer;\n        this.eViewport = eViewPort;\n        this.registerController();\n        this.addListeners();\n    }\n\n    setHeight(height : number) {\n        if(this.eViewport) {\n            this.eViewport.style.height = `${height}px`;\n        }else {\n            this.eContainer.style.height = `${height}px`;\n        }\n    } \n\n\n    getScrollTop() : number {\n        // if(this.eViewport) {\n        //     return this.eViewport.scrollTop\n        // }\n        // return this.eContainer.scrollTop;\n        const bodyController = this.controllerHandler.getBodyController();\n        return bodyController.getScrollTop();\n    }\n\n    getScrollLeft() : number {\n        // if(this.eViewport) {\n        //     return this.eViewport.scrollLeft\n        // }\n        // return this.eContainer.scrollLeft;\n        const bodyController = this.controllerHandler.getBodyController();\n        return bodyController.getScrollLeft();\n    }\n\n    private addListeners() {\n        const panes = getPaneStructure();\n        const {left, right, center, header, allMiddle} = panes;\n        this.setUpLeftPinned(left)\n        this.setUpRightPinned(right);\n        this.setUpCenter(center);\n        this.setUpHeader(header);\n        this.setUpViewportSize();\n        this.setUpMiddleContainer(allMiddle);\n        this.setUpDragHandler([...center, ...left, ...right]);\n\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_ROWS_CHANGED, this.onDisplayedDataChanged.bind(this))\n\n        this.createManagedBean(new RowContainerEventHandler(this.eContainer));\n    }\n\n    setUpMiddleContainer(middle : any[]) : void {\n        if(middle.indexOf(this.name) >= 0 ) {\n            this.createManagedBean(new HeightContainerHandler(this.eContainer, this.eViewport));\n        }\n    }\n\n    setUpDragHandler(panes  : any[]) : void {\n        if(panes.indexOf(this.name) >= 0) {\n            this.createManagedBean(new DragContainerHandler(this.eContainer));\n        }\n    }\n\n    \n\n    private onDisplayedDataChanged() : void {\n        if(this.visible) {\n            const updateRowCtrl = (rowController : RowController) => {\n                const fullWidthRow = rowController.isFullWidth();\n                // const fullWidthRow = false;\n                const embededFullWidth = rowController.isEmbededFullWidth();\n\n                const match = this.isFullWidthContainer ? (!embededFullWidth && fullWidthRow) : (embededFullWidth || !fullWidthRow);\n\n                return match;\n            }\n            const controllers = this.getRowControls().filter(updateRowCtrl);\n            this.component.setRowControllers(controllers);\n        }else {\n            this.component.setRowControllers([]);\n        }\n        \n    }\n\n    private getRowControls() : RowController[] {\n        const rowRenderer = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n        const floatingRecordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) as IFloatingRecordHandler;\n        switch(this.name) {\n            case ROW_CONTAINER_NAME.TOP_CENTER:\n            case ROW_CONTAINER_NAME.TOP_HEADER:\n            case ROW_CONTAINER_NAME.TOP_RIGHT:\n            case ROW_CONTAINER_NAME.TOP_LEFT:\n            case ROW_CONTAINER_NAME.TOP_FULL_WIDTH:\n                return rowRenderer.getTopControllers();\n            case ROW_CONTAINER_NAME.BOTTOM_CENTER:\n            case ROW_CONTAINER_NAME.BOTTOM_HEADER:\n            case ROW_CONTAINER_NAME.BOTTOM_RIGHT:\n            case ROW_CONTAINER_NAME.BOTTOM_LEFT:\n            case ROW_CONTAINER_NAME.BOTTOM_FULL_WIDTH:\n                return rowRenderer.getBottomControllers();\n            case ROW_CONTAINER_NAME.SUMMARY_CENTER:\n            case ROW_CONTAINER_NAME.SUMMARY_HEADER:\n            case ROW_CONTAINER_NAME.SUMMARY_LEFT:\n            case ROW_CONTAINER_NAME.SUMMARY_RIGHT:\n            case ROW_CONTAINER_NAME.SUMMARY_FULL_WIDTH:\n                return rowRenderer.getSummaryControllers();\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER:\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER:\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT:\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT:\n            case ROW_CONTAINER_NAME.FLOATING_FULL_WIDTH:\n                return floatingRecordHandler.getAllRowControllers();\n            case ROW_CONTAINER_NAME.STICKY_TOP_CENTER:\n            case ROW_CONTAINER_NAME.STICKY_TOP_FULL_WIDTH:\n            case ROW_CONTAINER_NAME.STICKY_TOP_HEADER:\n            case ROW_CONTAINER_NAME.STICKY_TOP_LEFT:\n            case ROW_CONTAINER_NAME.STICKY_TOP_RIGHT:\n                return rowRenderer.getStickyRowControllers();\n            default:\n                return rowRenderer.getCenterControllers();\n        }\n    }\n\n    focus() : void {\n        this.component.focus();\n    }\n\n    private setUpCenter(center : any[]) {\n        if(center.indexOf(this.name) >= 0) {\n            this.createManagedBean(new CenterWidthHandler(width => this.component.setContainerWidth(`${width}px`)))\n        }\n    }\n\n\n\n    setScrollLeft(left : number) : void {\n        const isRTL = this.optionsHandler.isRTL();\n\n        if(isRTL) {\n            left *= - 1;\n        }\n        this.eViewport.scrollTo({\n            // @ts-ignore\n            behavior: \"instant\",\n            left,\n            top : 0\n        });\n    }\n\n    private setUpRightPinned(right : any[]) {\n        if(right.indexOf(this.name) >= 0) {\n            this.pinnedWidthHandler = this.createManagedBean(new RightPinnedHandler(this.eContainer));\n            this.addListener(this.eventHandler, Events.EVENT_RIGHT_PINNED_WIDTH_CHANGED, this.onPinnedWidthChanged.bind(this))\n        }\n    }\n\n    private setUpLeftPinned(left : any[]) {\n        if(left.indexOf(this.name) >= 0) {\n            this.pinnedWidthHandler = this.createManagedBean(new LeftPinnedHandler(this.eContainer));\n            this.addListener(this.eventHandler, Events.EVENT_LEFT_PINNED_WIDTH_CHANGED, this.onPinnedWidthChanged.bind(this));\n        }\n    }\n\n    private setUpHeader(headers : any[]) {\n        if(headers.indexOf(this.name) >= 0) {\n            this.pinnedWidthHandler = this.createManagedBean(new RowHeaderHandler(this.eContainer));\n            this.addListener(this.eventHandler, Events.EVENT_HEADER_WIDTH_CHANGED, this.onPinnedWidthChanged.bind(this));\n\n        }\n    }\n\n    private setUpViewportSize() {\n        const center = [ROW_CONTAINER_NAME.CENTER]\n        if(center.indexOf(this.name) >= 0) {\n            this.viewportSizeHandler = this.createManagedBean(new ViewportSizeHandler(this))\n        }\n    }\n\n    appendChild(child : any) {\n        this.component.appendChild(child)\n    }\n\n    private registerController(): void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler\n        switch (this.name) {\n            case ROW_CONTAINER_NAME.CENTER: \n                controllerHandler.registerCenterRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.LEFT: \n                controllerHandler.registerLeftRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.RIGHT: \n                controllerHandler.registerRightRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.TOP_CENTER: \n                controllerHandler.registerTopCenterRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.TOP_LEFT: \n                controllerHandler.registerTopLeftRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.TOP_RIGHT: \n                controllerHandler.registerTopRightRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.BOTTOM_CENTER: \n                controllerHandler.registerBottomCenterRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.BOTTOM_LEFT: \n                controllerHandler.registerBottomLeftRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.BOTTOM_RIGHT: \n                controllerHandler.registerBottomRightRowContainerController(this); \n                break;\n            case ROW_CONTAINER_NAME.HEADER:\n                controllerHandler.registerHeaderRowContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.TOP_HEADER:\n                controllerHandler.registerTopHeaderRowContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.BOTTOM_HEADER:\n                controllerHandler.registerBottomHeaderRowContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.SUMMARY_HEADER:\n                controllerHandler.registerSummaryHeaderRowContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.SUMMARY_LEFT:\n                controllerHandler.registerSummaryLeftRowContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.SUMMARY_CENTER:\n                controllerHandler.registerSummaryCenterRowContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.SUMMARY_RIGHT:\n                controllerHandler.registerSummaryRightRowContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER:\n                controllerHandler.registerFloatingRecordCenterRowContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER:\n                controllerHandler.registerFloatingRecordHeaderContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT:\n                controllerHandler.registerFloatingRecordLeftContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT:\n                controllerHandler.registerFloatingRecordRightContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.STICKY_TOP_CENTER:\n                controllerHandler.registerStickyTopCenterContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.STICKY_TOP_HEADER:\n                controllerHandler.registerStickyTopHeaderContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.STICKY_TOP_LEFT:\n                controllerHandler.registerStickyTopLeftContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.STICKY_TOP_FULL_WIDTH:\n                controllerHandler.registerStickyTopFullWidthContainerController(this);\n                break;\n            case ROW_CONTAINER_NAME.STICKY_TOP_RIGHT:\n                controllerHandler.registerStickyTopRightContainerController(this);\n                break;\n        }\n    }\n\n    getViewPortContainer() {\n        return this.eViewport;\n    }\n\n    getContainer() {\n        return this.eContainer;\n    }\n\n    getRect() : DOMRect {\n        if(this.eViewport) {\n            return this.eViewport.getBoundingClientRect();\n        }\n        return this.eContainer.getBoundingClientRect();\n    }\n\n    private onPinnedWidthChanged(): void {\n        const visible = this.isContainerInVisible();\n        if (this.visible != visible) {\n            this.visible = visible;\n            this.onDisplayedDataChanged();\n        }\n    }\n\n    private isContainerInVisible(): boolean {\n\t\tconst pinned = this.getPinned(this.name);\n\t\treturn ( !pinned || (!!this.pinnedWidthHandler && this.pinnedWidthHandler.getWidth() > 0) );\n\t}\n\n\tprivate getPinned(name: ROW_CONTAINER_NAME): columnPinPositions {\n\t\tswitch (name) {\n\t\t\tcase ROW_CONTAINER_NAME.BOTTOM_LEFT:\n\t\t\tcase ROW_CONTAINER_NAME.TOP_LEFT:\n\t\t\tcase ROW_CONTAINER_NAME.SUMMARY_LEFT:\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT:\n\t\t\tcase ROW_CONTAINER_NAME.LEFT:\n            case ROW_CONTAINER_NAME.STICKY_TOP_LEFT:\n\t\t\t\treturn 'left';\n\t\t\tcase ROW_CONTAINER_NAME.BOTTOM_RIGHT:\n\t\t\tcase ROW_CONTAINER_NAME.TOP_RIGHT:\n\t\t\tcase ROW_CONTAINER_NAME.SUMMARY_RIGHT:\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT:\n\t\t\tcase ROW_CONTAINER_NAME.RIGHT:\n            case ROW_CONTAINER_NAME.STICKY_TOP_RIGHT:\n\t\t\t\treturn 'right';\n            case ROW_CONTAINER_NAME.BOTTOM_HEADER:\n            case ROW_CONTAINER_NAME.TOP_HEADER:\n            case ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER:\n            case ROW_CONTAINER_NAME.SUMMARY_HEADER:\n            case ROW_CONTAINER_NAME.STICKY_TOP_HEADER:\n            case ROW_CONTAINER_NAME.HEADER:\n                return 'rowHeader';\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n    isViewportVisible(): boolean {\n        return isVisible(this.eViewport);\n    }\n\n    registerViewportResizeListener(listener: (() => void)) {\n        const resizeObserverService = this.getBeanInstanceByBeanName('ResizeObserver') as ResizeObserverType;\n        const unsubscribeFromResize = resizeObserverService.observeResize(this.eViewport, listener);\n        this.addDestroyFunc(() => unsubscribeFromResize());\n    }\n\n    getCenterWidth() : number {\n        return getInnerWidth(this.eViewport);\n    }\n\n    getViewportSizeHandler(): ViewportSizeHandler | undefined {\n        return this.viewportSizeHandler;\n    }\n\n    getHScrollPosition() : { left: number; right: number }{\n        // return {\n        //     left: this.eViewport.scrollLeft,\n\t\t// \tright: this.eViewport.scrollLeft + this.eViewport.offsetWidth,\n        // }\n\n        return {\n            left  : this.getScrollLeft(),\n            right : this.getScrollLeft() + this.eViewport.offsetWidth\n        }\n    }\n\n    getScrollLeftPosition() : number {\n        const isRTL = this.optionsHandler.isRTL();\n        if(isRTL) {\n            return Math.abs(this.eViewport.scrollLeft);\n        }\n        return this.eViewport.scrollLeft\n    }\n\n    scrollBy(x : number, y : number) : void {\n        this.eViewport.scrollBy(x, y);\n    }   \n\n    destroy(): void {\n        this.component.setRowControllers([]);\n        super.destroy();\n    }\n}","import { AutoWired, EventEmitter, Optional, PostConstruct, BEAN_NAME } from \"@dg/corecomponent\";\nimport { getControllerFromTargetElement, isEventSupported } from \"../../../Core/utils/Dom\";\nimport { CellController } from \"./Rendering/Cell/CellController\";\nimport { RowController } from \"./Rendering/Row/RowController\";\nimport { INavigationActions } from \"../../../Core/Navigation/navigation-actions.types\";\nimport { KeyEventHandler} from \"../../../../../Sub_Components/src/KeyEventsComponent/KeyEventHandler\"\nimport { KeyboardShortcutRegistry } from \"../../../Core/actions/key-board-shortcut-registry\";\nimport { _isEventFromPrintableCharacter } from \"../../../Core/utils/Generic\";\nimport { HeaderCellController } from \"../../Header/Cell/HeaderCellController\";\nimport { GridOptioHandler } from \"../../../Core/GridOptionHandler\";\n\nexport interface IController {\n    cellController       : CellController\n    rowController        : RowController\n    headerCellController : HeaderCellController\n}\nexport class RowContainerEventHandler extends EventEmitter {\n    @Optional('rowNavigation') rowNavigation : INavigationActions<RowController>;\n    @Optional('cellNavigation') cellNavigation : INavigationActions<CellController>;\n    @AutoWired('keyBoardShortCutRegistry') private keyBoardShortCutRegistry : KeyboardShortcutRegistry;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: GridOptioHandler;\n\tprivate element: HTMLElement;\n\n\tconstructor(element: HTMLElement) {\n\t\tsuper();\n\t\tthis.element = element;\n\t}\n\n\n    @PostConstruct()\n\tinit() : void {\n        this.addKeyBoardListener();\n        this.addMouseListener();\n    }\n\n    private addMouseListener() : void {\n        const mouseDownEvent = isEventSupported('touchstart') ? 'touchstart' : 'mousedown';\n        const eventNames = ['mouseover', 'mouseout', 'mouseup', 'contextmenu', 'dblclick', 'touchend', mouseDownEvent];\n        eventNames.forEach(eventName => {\n            const listener = this.processMouseEvent.bind(this, eventName);\n            this.addListener(this.element, eventName, listener);\n        });\n    }\n\n    private addKeyBoardListener() : void {\n        const keyEventManager = new KeyEventHandler({container : this.element, keyComboStackSize : 1})\n        keyEventManager.addListener({\n            keyCombo : 'any',\n            callback : (params ) => {\n                const {event} = params;\n                const activeKeys = params.activeKeys;\n                const keyCombo = params.activeKeys.join('+');\n                const isOpenEditor = activeKeys.includes('enter') && !activeKeys.includes('shift');\n\n                let isActionExecuted = false \n                if(isOpenEditor) {\n                    isActionExecuted = this.keyBoardShortCutRegistry.executeShortcut('enter', {event});\n                }else {\n                    isActionExecuted = this.keyBoardShortCutRegistry.executeShortcut(keyCombo, {\n                        event\n                    })\n                }\n                \n                \n\n                if(!isActionExecuted) {\n                    if(_isEventFromPrintableCharacter(event)) {\n                        const {cellController} = this.getControllersFromTargetElement(event.target)\n                        cellController && cellController.processPrintableCharacter(event);\n                    }\n                }\n                \n            },\n            repeat : true\n        })\n    }   \n\n\n\n    private processMouseEvent(eventName : string , event : MouseEvent) : void {\n        const {cellController, rowController, headerCellController} = this.getControllersFromTargetElement(event.target);\n        if(cellController) {\n            cellController.onMouseEvent(eventName, event);\n        }\n\n        if(rowController) {\n            // rowController.onMouseEvent(eventName, event);\n        }\n\n        if(headerCellController){\n            headerCellController.onMouseEvent(eventName, event);\n        }\n    }\n\n    private getControllersFromTargetElement(targetElement : EventTarget | null ) : IController {\n        return {\n            cellController : getControllerFromTargetElement<CellController>(this.optionsHandler,targetElement, CellController.DOM_KEY_CELL_CTRL),\n            rowController : getControllerFromTargetElement<RowController>(this.optionsHandler,targetElement, RowController.DOM_DATA_KEY_ROW_CTRL),\n            headerCellController : getControllerFromTargetElement<HeaderCellController>(this.optionsHandler,targetElement, HeaderCellController.DOM_DATA_KEY_HEADER_CELL)\n        }\n    }\n    \n}","import { ROW_CONTAINER_NAME } from \"./type\";\n\nconst ContainerCssClasses = {\n    [ROW_CONTAINER_NAME.CENTER]    : 'ZG-centerCol',\n    [ROW_CONTAINER_NAME.LEFT]      : 'ZG-pinnedLeftCol',\n    [ROW_CONTAINER_NAME.RIGHT]     : 'ZG-pinnedRightCol',\n    [ROW_CONTAINER_NAME.HEADER]    : 'ZG-pinnedRowSelectionCol',\n    [ROW_CONTAINER_NAME.FULL_WIDTH]: 'ZG-fullWidthCol',\n\n    [ROW_CONTAINER_NAME.TOP_CENTER]    : 'ZG-floatingTopContainer',\n    [ROW_CONTAINER_NAME.TOP_LEFT]      : 'ZG-pinnedLeftCol',\n    [ROW_CONTAINER_NAME.TOP_RIGHT]     : 'ZG-pinnedRightCol',\n    [ROW_CONTAINER_NAME.TOP_HEADER]    : 'ZG-pinnedRowSelectionCol',\n    [ROW_CONTAINER_NAME.TOP_FULL_WIDTH]: 'ZG-fullWidthCol',\n\n\n    [ROW_CONTAINER_NAME.BOTTOM_CENTER]    : 'ZG-floatingTopContainer',\n    [ROW_CONTAINER_NAME.BOTTOM_LEFT]      : 'ZG-pinnedLeftCol',\n    [ROW_CONTAINER_NAME.BOTTOM_RIGHT]     : 'ZG-pinnedRightCol',\n    [ROW_CONTAINER_NAME.BOTTOM_HEADER]    : 'ZG-pinnedRowSelectionCol',\n    [ROW_CONTAINER_NAME.BOTTOM_FULL_WIDTH]: 'ZG-fullWidthCol',\n\n\n    [ROW_CONTAINER_NAME.SUMMARY_CENTER]    : 'ZG-floatingTopContainer',\n    [ROW_CONTAINER_NAME.SUMMARY_LEFT]      : 'ZG-pinnedLeftCol',\n    [ROW_CONTAINER_NAME.SUMMARY_RIGHT]     : 'ZG-pinnedRightCol',\n    [ROW_CONTAINER_NAME.SUMMARY_HEADER]    : 'ZG-pinnedRowSelectionCol',\n    [ROW_CONTAINER_NAME.SUMMARY_FULL_WIDTH]: 'ZG-fullWidthCol',\n\n\n    [ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER]: 'ZG-centerCol',\n    [ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT]  : 'ZG-pinnedLeftCol',\n    [ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT] : 'ZG-pinnedRightCol',\n    [ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER]: 'ZG-pinnedRowSelectionCol',\n    [ROW_CONTAINER_NAME.FLOATING_FULL_WIDTH]   : 'ZG-fullWidthCol',\n\n    [ROW_CONTAINER_NAME.STICKY_TOP_CENTER] : \"ZG-stickyTopViewport ZG-centerCol\",\n    [ROW_CONTAINER_NAME.STICKY_TOP_LEFT] : \"ZG-pinnedLeftStickyTop ZG-pinnedLeftCol\",\n    [ROW_CONTAINER_NAME.STICKY_TOP_RIGHT] : \"ZG-pinnedRightStickyTop ZG-pinnedRightCol\",\n    [ROW_CONTAINER_NAME.STICKY_TOP_HEADER] : \"ZG-pinnedRowSelectionCol\",\n    [ROW_CONTAINER_NAME.STICKY_TOP_FULL_WIDTH] : \"ZG-stickyTopFullWidthContainer ZG-fullWidthCol\"\n\n}\n\n\nexport function getCSSClassNameForName(name : ROW_CONTAINER_NAME) : string {\n    return ContainerCssClasses[name];\n}\n\nconst ContainerReferenceName = {\n    [ROW_CONTAINER_NAME.CENTER]       : 'centerContainer',\n    [ROW_CONTAINER_NAME.LEFT]         : 'leftContainer',\n    [ROW_CONTAINER_NAME.RIGHT]        : 'rightContainer',\n    [ROW_CONTAINER_NAME.HEADER]       : 'headerContainer',\n\n    [ROW_CONTAINER_NAME.TOP_HEADER]   : 'topHeaderContainer',\n    [ROW_CONTAINER_NAME.TOP_LEFT]     : 'topLeftContainer',\n    [ROW_CONTAINER_NAME.TOP_CENTER]   : 'topCenterContainer',\n    [ROW_CONTAINER_NAME.TOP_RIGHT]    : 'topRightContainer',\n\n    [ROW_CONTAINER_NAME.BOTTOM_HEADER]: 'bottomHeaderContainer',\n    [ROW_CONTAINER_NAME.BOTTOM_CENTER]: 'bottomCenterContainer',\n    [ROW_CONTAINER_NAME.BOTTOM_LEFT]  : 'bottomLeftContainer',\n    [ROW_CONTAINER_NAME.BOTTOM_RIGHT] : 'bottomRightContainer',\n\n    [ROW_CONTAINER_NAME.SUMMARY_HEADER]: 'summaryHeaderContainer',\n    [ROW_CONTAINER_NAME.SUMMARY_CENTER]: 'summaryCenterContainer',\n    [ROW_CONTAINER_NAME.SUMMARY_LEFT]  : 'summaryLeftContainer',\n    [ROW_CONTAINER_NAME.SUMMARY_RIGHT] : 'summaryRightContainer',\n\n    [ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER]: 'floatingRecordHeaderContainer',\n    [ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER]: 'floatingRecordCenterContainer',\n    [ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT]  : 'floatingRecordLeftContainer',\n    [ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT] : 'floatingRecordRightContainer',\n\n    [ROW_CONTAINER_NAME.STICKY_TOP_CENTER] : 'stickyTopCenterContainer',\n    [ROW_CONTAINER_NAME.STICKY_TOP_LEFT] : 'stickyTopLeftContainer',\n    [ROW_CONTAINER_NAME.STICKY_TOP_RIGHT] : 'stickyTopRightContainer',\n    [ROW_CONTAINER_NAME.STICKY_TOP_FULL_WIDTH] : 'stickyTopFullWidthContainer',\n    [ROW_CONTAINER_NAME.STICKY_TOP_HEADER] : 'stickyTopHeaderContainer',\n\n}\n\nexport function getReferenceNameforName(name : ROW_CONTAINER_NAME) : string {\n    return ContainerReferenceName[name];\n}\n    ","enum ROW_CONTAINER_NAME {\n    LEFT       = 'left',\n    RIGHT      = 'right',\n    CENTER     = 'center',\n    HEADER     = 'header',\n    FULL_WIDTH = \"fullWidth\",\n\n    TOP_LEFT       = 'topLeft',\n    TOP_RIGHT      = 'topRight',\n    TOP_CENTER     = 'topCenter',\n    TOP_HEADER     = 'topHeader',\n    TOP_FULL_WIDTH = 'topFullWidth',\n\n    BOTTOM_LEFT       = 'bottomLeft',\n    BOTTOM_RIGHT      = 'bottomRight',\n    BOTTOM_CENTER     = 'bottomCenter',\n    BOTTOM_HEADER     = \"bottomHeader\",\n    BOTTOM_FULL_WIDTH = \"bottomFullWidth\",\n\n\n    SUMMARY_LEFT       = 'summaryLeft',\n    SUMMARY_RIGHT      = 'summaryRight',\n    SUMMARY_CENTER     = 'summaryCenter',\n    SUMMARY_HEADER     = \"summaryHeader\",\n    SUMMARY_FULL_WIDTH = \"summaryFullWidth\",\n\n    FLOATING_RECORD_HEADER = 'floatingRecordHeader',\n    FLOATING_RECORD_LEFT   = 'floatingRecordLeft',\n    FLOATING_RECORD_CENTER = 'floatingRecordCenter',\n    FLOATING_RECORD_RIGHT  = 'floatingRecordRight',\n    FLOATING_FULL_WIDTH    = \"floatingFullWidth\",\n\n    EXTRA_ROW_HEADER = 'extraRowHeader',\n    EXTRA_ROW_LEFT = 'extraRowLeft',\n    EXTRA_ROW_CENTER = 'extraRowCenter',\n    EXTRA_ROW_RIGHT = 'extraRowRight',\n\n    STICKY_TOP_HEADER = 'stickyTopHeader',\n    STICKY_TOP_LEFT = 'stickyTopLeft',\n    STICKY_TOP_CENTER = 'stickyTopCenter',\n    STICKY_TOP_RIGHT = 'stickyTopRight',\n    STICKY_TOP_FULL_WIDTH = \"stickyTopFullWidth\",\n}\n\nenum RowContainerType {\n    LEFT       = 'left',\n    RIGHT      = 'right',\n    CENTER     = 'center',\n    HEADER     = 'header',\n    FULL_WIDTH = 'fullWidth'\n}\n\nexport function getRowContainerTypeForName(name: ROW_CONTAINER_NAME): RowContainerType {\n    switch (name) {\n        case ROW_CONTAINER_NAME.CENTER:\n        case ROW_CONTAINER_NAME.TOP_CENTER:\n        case ROW_CONTAINER_NAME.BOTTOM_CENTER:\n        case ROW_CONTAINER_NAME.SUMMARY_CENTER:\n        case ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER:\n        case ROW_CONTAINER_NAME.EXTRA_ROW_CENTER:\n        case ROW_CONTAINER_NAME.STICKY_TOP_CENTER:\n            return RowContainerType.CENTER;\n        case ROW_CONTAINER_NAME.LEFT:\n        case ROW_CONTAINER_NAME.TOP_LEFT:\n        case ROW_CONTAINER_NAME.BOTTOM_LEFT:\n        case ROW_CONTAINER_NAME.SUMMARY_LEFT:\n        case ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT:\n        case ROW_CONTAINER_NAME.EXTRA_ROW_LEFT:\n        case ROW_CONTAINER_NAME.STICKY_TOP_LEFT:\n            return RowContainerType.LEFT;\n        case ROW_CONTAINER_NAME.RIGHT:\n        case ROW_CONTAINER_NAME.TOP_RIGHT:\n        case ROW_CONTAINER_NAME.BOTTOM_RIGHT:\n        case ROW_CONTAINER_NAME.SUMMARY_RIGHT:\n        case ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT:\n        case ROW_CONTAINER_NAME.EXTRA_ROW_RIGHT:\n        case ROW_CONTAINER_NAME.STICKY_TOP_RIGHT:\n            return RowContainerType.RIGHT;\n        case ROW_CONTAINER_NAME.HEADER:\n        case ROW_CONTAINER_NAME.TOP_HEADER:\n        case ROW_CONTAINER_NAME.BOTTOM_HEADER:\n        case ROW_CONTAINER_NAME.SUMMARY_HEADER:\n        case ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER:\n        case ROW_CONTAINER_NAME.STICKY_TOP_HEADER:\n        \n            return RowContainerType.HEADER; \n        case ROW_CONTAINER_NAME.FULL_WIDTH:\n        case ROW_CONTAINER_NAME.BOTTOM_FULL_WIDTH:\n        case ROW_CONTAINER_NAME.SUMMARY_FULL_WIDTH:\n        case ROW_CONTAINER_NAME.FLOATING_FULL_WIDTH:\n        case ROW_CONTAINER_NAME.TOP_FULL_WIDTH:\n        case ROW_CONTAINER_NAME.EXTRA_ROW_HEADER:\n        case ROW_CONTAINER_NAME.STICKY_TOP_FULL_WIDTH:\n            return RowContainerType.FULL_WIDTH;\n        \n        default :\n            throw Error('Invalid Row Container Type');\n    }\n}\n\nexport {\n    RowContainerType,\n    ROW_CONTAINER_NAME\n}","import { AutoWired, DGEvent, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IControllerHandler } from \"../../../Core/Interface/IControllerHandler\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { RowContainerController } from \"./RowContainerController\";\nimport { ColumnSizeHandler } from \"../../../Core/Columns/ColumnSizeHandler\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\nimport { RowRenderController } from \"../../../Core/Rows/RowRenderController\";\nimport { Events } from \"../../../Core/Constants/Events\";\n\nexport class ViewportSizeHandler extends EventEmitter {\n\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler: IControllerHandler;\n    @AutoWired('ColumnSizeHandler') columnSizeHandler: ColumnSizeHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) fieldHandler : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) rowRenderer: RowRenderController;\n    @AutoWired(\"viewType\") viewType : any;\n\n    private centerContainer: RowContainerController;\n\n    private centerWidth: number;\n\n    constructor(centerContainer: RowContainerController) {\n        super();\n        this.centerContainer = centerContainer;\n    }\n\n    @PostConstruct()\n    init(): void {\n        this.controllerHandler.onAfterGridReady(() => {\n            this.listenForResize();\n        });\n    }\n\n    private listenForResize(): void {\n        const listener = () => {\n            requestAnimationFrame(() => this.onCenterViewportResized());\n        }\n        const viewportListener = () => {\n            requestAnimationFrame(() => this.onViewportSizeChanged());\n        };\n        this.centerContainer.registerViewportResizeListener(listener);\n        this.centerContainer.registerViewportResizeListener(viewportListener);\n    }\n\n    private onCenterViewportResized(): void {\n        if (!this.isAlive() || !this.rowRenderer?.isAlive()) {\n            return;\n        }\n\n        if (this.centerContainer.isViewportVisible()) {\n\n            const newWidth = this.centerContainer.getCenterWidth();\n\n            if (newWidth !== this.centerWidth) {\n                this.centerWidth = newWidth;\n                const columns = this.fieldHandler.getDisplayedCenterColumns();\n                this.columnSizeHandler.refreshFlexedColumns( { viewportWidth: this.centerWidth, columns} );\n\n                this.eventHandler.dispatchEvent({\n                    type : Events.EVENT_GRID_SIZE_UPDATED,\n                    refresh : true\n                } as any)\n            }\n\n            this.eventHandler.dispatchEvent({\n                type : \"gridResize\",\n                width : newWidth\n            } as DGEvent)\n        }\n    }\n\n    private onViewportSizeChanged() : void {\n        if (!this.isAlive() || !this.rowRenderer?.isAlive()) {\n            return;\n        }\n\n        const isGallery = this.viewType === \"gallery\"\n        this.rowRenderer.refreshAfterModelUpdate({\n            recycleRows : !isGallery ? true: false,\n            focus       : false,\n            refreshCells: false\n        });\n    }\n}","import { AutoWired, BEAN_NAME, Component, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\nimport { Events } from \"../../../Core/Constants/Events\";\nimport { queryAssignedNodes } from \"../../../Core/Decorator/ReferenceSelector\";\nimport { IControllerHandler } from \"../../../Core/Interface/IControllerHandler\";\nimport { setFixedHeight, setFixedWidth } from \"../../../Core/utils/Dom\";\nimport { CenterWidthHandler } from \"../RowContainer/CenterWidthHandler\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\n\nexport class HSComponent extends Component {\n    @queryAssignedNodes('eViewport') protected readonly eViewport   !: HTMLElement;\n    @queryAssignedNodes('eContainer') protected readonly eContainer !: HTMLElement;\n\n    @queryAssignedNodes('eLeftScroll') private eLeftSpacer !: HTMLElement;\n    @queryAssignedNodes('eRightScroll') private eRightSpacer !: HTMLElement;\n    @queryAssignedNodes('eHeaderScroll') private eHeaderScroll !: HTMLElement;\n\n\n\n\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private columnModel !: FieldHandler;\n    static getTemplate: () => HTMLElement;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    private enableRtl !: boolean;\n    constructor() {\n        super(HSComponent.getTemplate());\n    }\n\n    @PostConstruct()\n    init() {\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, this.setHScrollSpacerWidths.bind(this))\n        this.createManagedBean(new CenterWidthHandler((width) => this.eContainer.style.width = `${width}px`))\n\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        controllerHandler.registerHSComponent(this);\n\n        this.setScrollVisible();\n    }\n\n    private setHScrollSpacerWidths(): void {\n        let rightSpacing = this.columnModel.getDisplayedColumnsRightWidth();\n        const scrollOnRight = !this.enableRtl;\n        const scrollbarWidth = this.optionsHandler.getScrollbarWidth();\n\n        if (scrollOnRight) {\n            rightSpacing += scrollbarWidth;\n        }\n        setFixedWidth(this.eRightSpacer, rightSpacing);\n        this.addOrRemoveCssClass('dg-scroller-corner', rightSpacing <= scrollbarWidth);\n        \n        let leftSpacing = this.columnModel.getDisplayedColumnsLeftWidth();\n        const scrollOnLeft = this.enableRtl;\n\n        if (scrollOnLeft) {\n            leftSpacing += scrollbarWidth;\n        }\n\n        setFixedWidth(this.eLeftSpacer, leftSpacing);\n        this.addOrRemoveCssClass('dg-scroller-corner', leftSpacing <= scrollbarWidth);\n\n\n        let headerSpacing = this.columnModel.getDisplayedColumnsHeaderWidth();\n        setFixedWidth(this.eHeaderScroll, headerSpacing);\n        this.addOrRemoveCssClass('dg-scroller-corner', leftSpacing <= scrollbarWidth);\n\n        \n    }\n\n\n    getViewport() : HTMLElement {\n        return this.eViewport;\n    }\n\n    getContainer(): HTMLElement {\n        return this.eContainer;\n    }\n\n    onScrollCallback(func: () => void): void {\n        this.addListener(this.getViewport(), 'scroll', func);\n    }\n\n    setScrollLeft(value: number): void {\n        this.eViewport.scrollLeft = value;\n    }\n\n    getScrollPosition() : number {\n        return this.eViewport.scrollLeft;\n    }\n\n    setScrollVisible(): void {\n        const isSuppressHorizontalScroll = this.optionsHandler.isSuppressHorizontalScroll();\n        const scrollbarWidth = isSuppressHorizontalScroll ? (this.optionsHandler.getScrollbarWidth() || 0) : 0;\n        const adjustedScrollbarWidth = (scrollbarWidth === 0) ? 16 : scrollbarWidth;\n        const scrollContainerSize = !isSuppressHorizontalScroll ? adjustedScrollbarWidth : 0;\n\n        setFixedHeight(this.getGui(), scrollContainerSize);\n        setFixedHeight(this.eViewport, scrollContainerSize);\n        setFixedHeight(this.eContainer, scrollContainerSize);\n        this.setDisplayed(!isSuppressHorizontalScroll, { skipAriaHidden: true });\n    }\n   \n}\n","import { AutoWired, BEAN_NAME, Component, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { queryAssignedNodes } from \"../../../Core/Decorator/ReferenceSelector\";\nimport { IControllerHandler } from \"../../../Core/Interface/IControllerHandler\";\nimport { setFixedWidth } from \"../../../Core/utils/Dom\";\nimport { HeightContainerHandler } from \"../RowContainer/HeightContainerHandler\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nexport class VSComponent extends Component {\n    @queryAssignedNodes('eViewport') protected readonly eViewport   !: HTMLElement;\n    @queryAssignedNodes('eContainer') protected readonly eContainer !: HTMLElement;\n    static getTemplate: () => HTMLElement;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName\n\n    constructor() {\n        super(VSComponent.getTemplate());\n    }\n\n    @PostConstruct()\n    init() : void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        controllerHandler.registerVSComponent(this);\n\n        this.createManagedBean(new HeightContainerHandler(this.eContainer));\n        this.setScrollVisible()\n    }\n\n    getViewport() : HTMLElement {\n        return this.eViewport;\n    }\n\n    getContainer(): HTMLElement {\n        return this.eContainer;\n    }\n\n    onScrollCallback(func: () => void): void {\n        this.addListener(this.getViewport(), 'scroll', func);\n    }\n\n    setScrollTop(value: number): void {\n        this.eViewport.scrollTop = value;   \n    }\n\n    getScrollPosition() : number {\n        return this.eViewport.scrollTop;\n    }\n\n    setScrollVisible(): void {\n        const isSuppressVerticalScroll = this.optionsHandler.isSuppressVerticalScroll();\n\n        const scrollbarWidth = isSuppressVerticalScroll ? (this.optionsHandler.getScrollbarWidth() || 0) : 0;\n        const adjustedScrollbarWidth = (scrollbarWidth === 0) ? 16 : scrollbarWidth;\n\n        setFixedWidth(this.getGui(), adjustedScrollbarWidth);\n        setFixedWidth(this.eViewport, adjustedScrollbarWidth);\n        setFixedWidth(this.eContainer, adjustedScrollbarWidth);\n        this.setDisplayed(!isSuppressVerticalScroll, { skipAriaHidden: true });\n    }\n}\n","import { GridController, IGridComponent } from \"./GridController\";\nimport { queryAssignedNodes } from \"../Core/Decorator/ReferenceSelector\";\nimport { GridBodyComponent } from \"./GridBodyComponent/GridBodyComponent\";\nimport { Component, PostConstruct } from \"@dg/corecomponent\";\n\n\n\nexport class GridComponent extends Component {\n    private gridElement: HTMLElement;\n\n    @queryAssignedNodes('gridBody') \n    private readonly gridElementRootBodyWrapper!: GridBodyComponent;\n\t@queryAssignedNodes('gridScrollHolder') private gridScrollHolder : HTMLElement;\n    @queryAssignedNodes('gridRootWrapper') private gridRootWrapper : HTMLElement;\n\n    static template: HTMLElement;\n    static getTemplate: () => HTMLElement;\n\n    constructor(gridElement : HTMLElement) {\n        super();\n        this.gridElement = gridElement;\n    }\n\n    \n    @PostConstruct()\n    init() : void {\n        const template = GridComponent.getTemplate();\n        this.setTemplate(template);\n\n        const component: IGridComponent = {\n\t\t\tgetGui: () => this.gridElementRootBodyWrapper.getGui(),\n            addOrRemoveCssClass : (className: string, addOrRemove: boolean)=> this.addOrRemoveCssClass(className, addOrRemove),\n            getRootElement : () => this.getGui(),\n            destroy : () => this.destroy(),\n            getScrollHolder : () => this.getScrollHolder(),\n            getGridRootWrapper : () => this.getGridRootWrapper(),\n            updateDimension : ()=>this.updateDimension()\n\t\t};\n\n        this.appendGridIntoUserDom();\n        this.updateDimension();\n        const controller = this.createManagedBean(new GridController());\n        controller.setComponent(component);\n\n    }\n\n    updateDimension() : void{\n        this.gridRootWrapper.style.height = `${this.gridScrollHolder.offsetHeight}px`;\n        this.gridRootWrapper.style.width  = `${this.gridScrollHolder.offsetWidth}px`;\n    }\n\n    getGridRootWrapper() : HTMLElement {\n        return this.gridRootWrapper;\n    }\n\n    getScrollHolder() : HTMLElement {\n        return this.gridScrollHolder;\n    }\n\n    appendGridIntoUserDom() {\n        const eGui = this.getGui();\n        this.gridElement && this.gridElement.appendChild(eGui);\n        this.addDestroyFunc(() => {\n            this.gridElement && this.gridElement.removeChild(this.getGui());\n            this.gridElement = null;\n        })\n    }\n    \n\n}","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IControllerHandler } from \"../Core/Interface/IControllerHandler\";\nimport { GRID_BEAN_NAME } from \"../Core/Constants/BeanName\";\nimport { IRowSelectionHandler } from \"../../Selection/row-selection-handler.types\";\nimport { IGridCellEditorHandler } from \"./Editor/GridCellEditorHandler\";\nimport { IFocusHandler } from \"../Core/Navigation/focus-handler.types\";\nimport { ResizeObserverType } from \"../Core/Interface/resize-observer.types\";\nimport { IRecordHandler } from \"../Core/Rows/RecordHandler.types\";\nimport { Events } from \"../Core/Constants/Events\";\n\n/** Root CSS class when rows are hierarchical: row grouping and/or full tree structure (see updateRowGroupingClassName). */\nconst ROW_GROUPING_ROOT_CLASS = \"ZG-grid-grouping\";\n\nexport interface IGridComponent {\naddOrRemoveCssClass(className: string, addOrRemove: boolean): void\n getGui()           : HTMLElement;\n getRootElement()   : HTMLElement;\n destroy            : () => void;\n getScrollHolder    : () => HTMLElement;\n getGridRootWrapper : () => HTMLElement;\n updateDimension    : ()=>void;\n}\n\nexport class GridController extends EventEmitter {\n    private component : IGridComponent;\n\n    static GRID_INSTANCE = 'gridInstance'\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\t@AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler!: IRecordHandler;\n\n\n    setComponent(component: IGridComponent) : void {\n        this.component = component;\n\n        this.registerController();\n\n        this.updateRTL();\n\n        this.addListener(this.eventHandler, 'EVENT_PROPERTIES_UPDATED', () => {\n            this.updateRTL();\n            this.updateRowGroupingClassName();\n        });\n\n\n        this.optionsHandler.setDomData(this.component.getGui(), GridController.GRID_INSTANCE, this.getBeanInstanceByBeanName('instanceID'));\n\n        this.addListener(this.eventHandler, 'rowSelectionChanged', () => {\n            const element = component.getRootElement();\n            const rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as IRowSelectionHandler;\n            if(rowSelectionHandler) {\n                element.classList.toggle('DG-select-all-rows', rowSelectionHandler.getSelectAllState() === true);\n            }\n        })\n\n        this.addListener(this.component.getGui(), 'mousedown', (ev : MouseEvent) => { \n            const shouldPreventGridMousedown = this.optionsHandler.getShouldPreventGridMousedown();\n            if(shouldPreventGridMousedown) {\n                ev.preventDefault();\n            }\n        });\n        this.addListener(this.component.getGui(), 'focusout', (event: FocusEvent) => { \n            const stopEditingWhenCellsLoseFocus = this.optionsHandler.isStopEditingWhenCellsLoseFocus();\n            \n            const elementWithFocus = event.relatedTarget as HTMLElement;\n            const gridEditorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as IGridCellEditorHandler;\n            const focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n\n            const closeEditorCallBack = () => {\n                focusHandler.setGridFocus(false);\n\n                if(!stopEditingWhenCellsLoseFocus) {\n                    return;\n                }\n                gridEditorHandler && gridEditorHandler.stopEditing(false, null, false, true);\n                this.dispatchEvent({\n                    type : 'destroyEditorTooltip'\n                })\n            }\n\n            const focusInsideGrid = this.isElementFromGrid(elementWithFocus);\n\n            if(!focusInsideGrid) {\n                if(!this.isElementWithinCustomPopup(elementWithFocus)) {\n                    document.hasFocus() && closeEditorCallBack();\n                }\n            }\n        });\n\n        this.addListener(this.component.getGui(), 'focusin', (_event) => {\n            // const relatedTarget = event.relatedTarget;\n            // const focusInsideGrid = this.isElementFromGrid(relatedTarget);\n\n            // if(!focusInsideGrid) {\n            //     const focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n            //     focusHandler.setGridFocus(true);\n            // }\n             const focusHandler = this.getBeanInstanceByBeanName('focusHandler') as IFocusHandler;\n            focusHandler.setGridFocus(true);\n        })\n\n        this.updateAutoFillRows();\n        this.updateAutoRowHeightClass();\n        this.updateAutoColumnHeaderHeightClass();\n\n        this.addListener(this.eventHandler, 'EVENT_RECORD_UPDATED', this.updateNoRecordClassName.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_RECORD_INSERTED', this.updateNoRecordClassName.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_RECORD_REMOVED', this.updateNoRecordClassName.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_DATA_LOADED, () => {\n            this.updateNoRecordClassName();\n            this.updateRowGroupingClassName();\n        });\n\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_ROWS_CHANGED, this.updateRowGroupingClassName.bind(this));\n        this.updateRowGroupingClassName();\n    }\n\n    private updateNoRecordClassName() : void {\n        const centerHandler   = this.recordHandler.getMiddleHandler();\n        const rowCount        = centerHandler.getRowCount();\n        this.component.addOrRemoveCssClass(\"ZG-no-record\", rowCount === 0);\n    }\n\n    private updateRowGroupingClassName(): void {\n        const model = this.recordHandler.getRowGroupingModel();\n        const hasRowGrouping = Array.isArray(model) && model.length > 0;\n        const hasFullTreeStructure = this.optionsHandler.hasFullTreeStructureProvided();\n        this.component.addOrRemoveCssClass(ROW_GROUPING_ROOT_CLASS, hasRowGrouping || hasFullTreeStructure);\n    }\n    private updateAutoRowHeightClass() : void {\n        const isAuto = typeof this.optionsHandler.isAutoRowHeight === 'function' && this.optionsHandler.isAutoRowHeight();\n        this.component.addOrRemoveCssClass('ZG-rowHeight-auto', !!isAuto);\n    }\n\n    private updateAutoColumnHeaderHeightClass() : void {\n        const isAuto = typeof this.optionsHandler?.isAutoColumnHeaderHeight === 'function' && this.optionsHandler?.isAutoColumnHeaderHeight();\n        this.component.addOrRemoveCssClass('ZG-columnHeaderHeight-auto', !!isAuto);\n    }\n\n    private updateRTL() : void {\n        const isRTL = this.optionsHandler.isRTL();\n        isRTL ? document.documentElement.setAttribute('dir', 'rtl') : document.documentElement.setAttribute('dir', 'ltr');\n        // isRTL ? rootElement.setAttribute('dir', 'rtl') : null;\n    }\n    private updateAutoFillRows() : void {\n\t\tconst isAutoFillRows = this.optionsHandler.isAutoFillRows();\n\n\t\tif(isAutoFillRows) {\n\t\t\tthis.registerViewportResizeListener((entries : any) => {\n\t\t\t\tconst totalRowHeight = this.recordHandler.getTotalRowHeight();\n\t\t\t\tconst containerHeight = (entries[0] as ResizeObserverEntry).contentRect.height;\n                const columnHeaderHeight = this.recordHandler.getColumnHeaderHeight()\n\t\t\t\tconst extraSpace = containerHeight - totalRowHeight - columnHeaderHeight;\n                const middleHandler = this.recordHandler.getMiddleHandler();\n\n\t\t\t\tlet rowsToAdd = 0;\n\t\t\t\tif (extraSpace > 0) {\n\t\t\t\t\trowsToAdd = Math.ceil(extraSpace / (middleHandler.getTotalHeight() / middleHandler.getRowCount()));\n\t\t\t\t}\n\n\t\t\t\trowsToAdd > 0 && middleHandler.insertDraftRows();\n\t\t\t})\n\t\t}\n\t}\n\n    registerViewportResizeListener(listener: ((enteries : any) => void)) {\n\t\tconst resizeObserverService = this.getBeanInstanceByBeanName('ResizeObserver') as ResizeObserverType;\n\t\tconst unsubscribeFromResize = resizeObserverService.observeResize(this.component.getRootElement(), listener as any);\n\t\tthis.addDestroyFunc(() => unsubscribeFromResize());\n\t}\n\n    private isElementFromGrid(element : HTMLElement) : boolean {\n        let pointer: HTMLElement | null = element;\n        while (pointer) {\n            const instanceId = this.optionsHandler.getDomData(pointer, GridController.GRID_INSTANCE);\n            if (!!instanceId) {\n                const eventFromThisGrid = instanceId === this.getBeanInstanceByBeanName('instanceID');\n                return eventFromThisGrid;\n            }\n            pointer = pointer.parentElement;\n        }\n        return false;\n    }\n\n    private isElementWithinCustomPopup(element: HTMLElement): boolean {\n        let pointer: HTMLElement | null = element;\n        const documentElement = this.optionsHandler.getDocument();\n        while (pointer && pointer !== documentElement.body) {\n            if (pointer.classList.contains('ZG-popup') || pointer.parentElement === null) {\n                return true;\n            }\n            pointer = pointer.parentElement;\n        }\n\n        return false;\n    }\n\n    getBoundRectForGridElement() : DOMRect {\n        return this.component.getGui().getBoundingClientRect();\n    }\n\n    private registerController() : void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        controllerHandler.registerGridController(this);\n    }\n\n    getGui(): HTMLElement {\n        return this.component.getGui();\n    }\n\n    getScrollHolder() : HTMLElement {\n        return this.component.getScrollHolder();\n    }\n\n    getGridRootWrapper() : HTMLElement {\n        return this.component.getGridRootWrapper();\n    }\n\n    updateDimension() : void {\n        return this.component.updateDimension();\n    }\n\n    destroyComponent() {\n        this.component && this.component.destroy();\n        this.component = null;\n    }\n}\n","import type { IHeaderCellRendererComponent } from '../../Interface/HeaderCellRenderer/IHeaderCellRendererComponent';\nimport type { IHeaderCellRendererParams } from '../../Interface/HeaderCellRenderer/IHeaderCellRendererParams';\nimport type { ISortOrder } from '../../../Core/Interface/ISortConfigurations';\n\nconst SORT_ASC_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14\"/><path d=\"m5 12 7-7 7 7\"/></svg>`;\nconst SORT_DESC_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14\"/><path d=\"m19 12-7 7-7-7\"/></svg>`;\nconst SORT_NONE_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 15 5 5 5-5\"/><path d=\"m7 9 5-5 5 5\"/></svg>`;\n\nexport class DefaultHeaderCellRenderer implements IHeaderCellRendererComponent {\n\tprivate eGui: HTMLElement;\n\tprivate eLabel: HTMLElement;\n\tprivate eText: HTMLElement;\n\tprivate eSort: HTMLElement | null = null;\n\tprivate eResize: HTMLElement | null = null;\n\tprivate pendingParams: IHeaderCellRendererParams | null = null;\n\tprivate registered = false;\n\n\tgetElement(): HTMLElement {\n\t\treturn this.eGui;\n\t}\n\n\tinit(params: IHeaderCellRendererParams): void {\n\t\tthis.eGui = document.createElement('div');\n\t\tthis.eGui.className = 'ZG-headerCellRenderer';\n\n\t\tthis.eLabel = document.createElement('div');\n\t\tthis.eLabel.className = 'ZG-headerCellLabel';\n\n\t\tthis.eText = document.createElement('span');\n\t\tthis.eText.className = 'ZG-headerCellText';\n\t\tthis.eText.textContent = params.displayName;\n\n\t\tthis.eLabel.appendChild(this.eText);\n\n\t\tthis.eSort = document.createElement('span');\n\t\tthis.eSort.className = 'ZG-headerCellSort';\n\t\tthis.updateSortIcon(params.sortOrder);\n\t\tthis.eLabel.appendChild(this.eSort);\n\n\t\tthis.eGui.appendChild(this.eLabel);\n\n\t\tif (params.columnNode?.isResizable()) {\n\t\t\tthis.eResize = document.createElement('div');\n\t\t\tthis.eResize.className = 'ZG-resizeCueSec';\n\t\t\tthis.eGui.appendChild(this.eResize);\n\t\t}\n\n\t\tthis.pendingParams = params;\n\t}\n\n\tafterElementAttached(): void {\n\t\tif (this.registered || !this.pendingParams) return;\n\t\tthis.registered = true;\n\t\tconst params = this.pendingParams;\n\n\t\tif (this.eSort) {\n\t\t\tparams.registerSortElement?.(this.eSort);\n\t\t}\n\t\tif (this.eResize) {\n\t\t\tparams.registerResizeElement?.(this.eResize);\n\t\t}\n\t\tparams.registerDragElement?.(this.eLabel);\n\t}\n\n\trefresh(params: IHeaderCellRendererParams): boolean {\n\t\tthis.eText.textContent = params.displayName;\n\t\tif (this.eSort) {\n\t\t\tthis.updateSortIcon(params.sortOrder);\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate updateSortIcon(sortOrder: ISortOrder | null): void {\n\t\tif (!this.eSort) return;\n\t\tthis.eSort.classList.remove('ZG-headerCellSort--asc', 'ZG-headerCellSort--desc', 'ZG-headerCellSort--active');\n\t\tif (sortOrder === 'ascending') {\n\t\t\tthis.eSort.innerHTML = SORT_ASC_ICON;\n\t\t\tthis.eSort.classList.add('ZG-headerCellSort--asc', 'ZG-headerCellSort--active');\n\t\t} else if (sortOrder === 'descending') {\n\t\t\tthis.eSort.innerHTML = SORT_DESC_ICON;\n\t\t\tthis.eSort.classList.add('ZG-headerCellSort--desc', 'ZG-headerCellSort--active');\n\t\t} else {\n\t\t\tthis.eSort.innerHTML = SORT_NONE_ICON;\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.eGui = null!;\n\t\tthis.eLabel = null!;\n\t\tthis.eText = null!;\n\t\tthis.eSort = null;\n\t\tthis.eResize = null;\n\t\tthis.pendingParams = null;\n\t}\n}\n","import type { IHeaderGroupCellRendererComponent } from '../../Interface/HeaderGroupCellRenderer/IHeaderGroupCellRendererComponent';\nimport type { IHeaderGroupCellRendererParams } from '../../Interface/HeaderGroupCellRenderer/IHeaderGroupCellRendererParams';\n\nconst ICON_EXPANDED = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M3 4.5L6 7.5L9 4.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\nconst ICON_COLLAPSED = '<svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\"><path d=\"M4.5 3L7.5 6L4.5 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n\nexport class DefaultHeaderGroupCellRenderer implements IHeaderGroupCellRendererComponent {\n\tprivate eGui: HTMLElement;\n\tprivate eText: HTMLElement;\n\tprivate eIcon: HTMLElement;\n\tprivate eResize: HTMLElement | null = null;\n\tprivate params: IHeaderGroupCellRendererParams;\n\n\tgetElement(): HTMLElement {\n\t\treturn this.eGui;\n\t}\n\n\tinit(params: IHeaderGroupCellRendererParams): void {\n\t\tthis.params = params;\n\t\tthis.eGui = document.createElement('div');\n\t\tthis.eGui.className = 'ZG-headerGroupCellRenderer';\n\n\t\tthis.eText = document.createElement('span');\n\t\tthis.eText.className = 'ZG-headerGroupCellRenderer-text';\n\n\t\tthis.eIcon = document.createElement('span');\n\t\tthis.eIcon.className = 'ZG-headerGroupCellRenderer-icon';\n\n\t\tthis.eGui.appendChild(this.eText);\n\t\tthis.eGui.appendChild(this.eIcon);\n\n\t\tif (params.registerResizeElement) {\n\t\t\tthis.eResize = document.createElement('div');\n\t\t\tthis.eResize.className = 'ZG-resizeCueSec';\n\t\t\tthis.eGui.appendChild(this.eResize);\n\t\t\tparams.registerResizeElement(this.eResize);\n\t\t}\n\n\t\tthis.eText.textContent = params.displayName;\n\t\tthis.updateExpandState(params.expandable, params.expanded);\n\n\t\tif (params.expandable) {\n\t\t\tparams.registerExpandCollapseElement?.(this.eIcon);\n\t\t}\n\t}\n\n\trefresh(params: IHeaderGroupCellRendererParams): void {\n\t\tthis.params = params;\n\t\tthis.eText.textContent = this.params.displayName;\n\t\tthis.updateExpandState(this.params.expandable, this.params.expanded);\n\t}\n\n\tprivate updateExpandState(expandable: boolean, expanded: boolean): void {\n\t\tif (expandable) {\n\t\t\tthis.eIcon.classList.add('ZG-headerGroupCellRenderer-icon--visible');\n\t\t\tthis.eIcon.innerHTML = expanded ? ICON_EXPANDED : ICON_COLLAPSED;\n\t\t\tthis.eIcon.setAttribute('title', expanded ? 'Collapse' : 'Expand');\n\t\t\tthis.eGui.classList.toggle('ZG-headerGroupCellRenderer--expanded', expanded);\n\t\t\tthis.eGui.classList.toggle('ZG-headerGroupCellRenderer--collapsed', !expanded);\n\t\t} else {\n\t\t\tthis.eIcon.classList.remove('ZG-headerGroupCellRenderer-icon--visible');\n\t\t\tthis.eIcon.innerHTML = '';\n\t\t\tthis.eGui.classList.remove('ZG-headerGroupCellRenderer--expanded', 'ZG-headerGroupCellRenderer--collapsed');\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tthis.eGui = null!;\n\t\tthis.eText = null!;\n\t\tthis.eIcon = null!;\n\t\tthis.eResize = null;\n\t\tthis.params = null!;\n\t}\n}\n","import { AutoWired, BEAN_NAME, Component, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { clearElement, getWrapperTemplate, removeFromParent } from \"../../../Core/utils/Dom\";\nimport { escapeString } from \"../../../Core/utils/Generic\";\nimport { HeaderCellController, IHeaderCellComponent } from \"./HeaderCellController\";\nimport { IHeaderCellRendererComponent } from \"../../Interface/HeaderCellRenderer/IHeaderCellRendererComponent\";\nimport { IHeaderCellRendererParams } from \"../../Interface/HeaderCellRenderer/IHeaderCellRendererParams\";\nimport { DefaultHeaderCellRenderer } from \"./DefaultHeaderCellRenderer\";\nimport { CellEditorPopupPosition, ICellEditorComponent, IColumnNode } from \"../../../Main\";\nimport { UserComponentDetails } from \"../../../Core/Components/UserComponentHandler\";\nimport { PopupEditorWrapper } from \"../../GridBodyComponent/RowContainer/Rendering/Cell/Editor/PopupEditorWrapper\";\nimport { IRowNodeCore } from \"../../../../DataStore/rownode.types\";\nimport { CellComponent } from \"../../GridBodyComponent/RowContainer/Rendering/Cell/CellComponent\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { IColumnAutofitHandler } from \"../../../../Autofit/ColumnAutofit/column-autofitHandler.types\";\nimport { IGridCellEditorHandler } from \"../../Editor/GridCellEditorHandler\";\nfunction getTemplate() {\n    const template = `<div class=\"ZG-headerCell\" role=\"columnheader\">\n</div>`\n    const div = document.createElement('div');\n    div.innerHTML = template;\n    return div.firstChild as HTMLElement\n}\nexport class HeaderCellComponent extends Component {\n\tprivate cellRenderer!          : IHeaderCellRendererComponent;\n\tprivate cellRendererElement    : HTMLElement;\n\tprivate headerElement          : HTMLElement;\n\t\n\tprivate cellValueElement  : HTMLElement | undefined;\n\tprivate cellWrapperElement : HTMLElement;\n\n\t domRenderer : boolean;\n\n\n\n\t//editor properties\n\tcellEditor             : ICellEditorComponent;\n\tcellEditorGui          : HTMLElement;\n\tcellEditorPopupWrapper : PopupEditorWrapper;\n\tcolumn                 : IColumnNode;\n\trowNode                : IRowNodeCore;\n\thideEditorPopup        : () => void;\n\teRow                   : HTMLElement;\n\tcellController         : HeaderCellController;\n\tprivate columnAutoFitHandler  : IColumnAutofitHandler;\n\t@AutoWired(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) public gridCellEditorHandler !: IGridCellEditorHandler;\n\t\n\n\n\tconstructor(controller: HeaderCellController, eRow : HTMLElement) {\n\t\tsuper();\n\t\tthis.headerElement = getTemplate();\n\t\tthis.setTemplate(this.headerElement);\n\t\tthis.cellController = controller;\n\n\t\tthis.column               = controller.getColumn();\n\t\tthis.rowNode              = controller.getRowNode();\n\t\tthis.eRow                 = eRow;\n\n\t}\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\t@PostConstruct()\n\tinit() : void {\n\t\tthis.columnAutoFitHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_AUTOFIT_HANDLER);\n\t\tconst component: IHeaderCellComponent = {\n\t\t\tsetWidth              : (width: string) => this.setWidth(width),\n\t\t\tsetValue              : (value: string) => this.setValue(value),\n\t\t\tsetLeft               : (left: string) => this.setLeft(left),\n\t\t\tsetRendererDetails    : (component: any) => this.setRendererDetails(component),\n\t\t\tsetDefaultRendererParams: (params: IHeaderCellRendererParams) => this.setDefaultRendererParams(params),\n\t\t\taddOrRemoveCssClass   : (className: string, force: boolean) => this.addOrRemoveCssClass(className, force),\n\t\t\tgetRenderer           : () => this.cellRenderer,\n\t\t\tsetEditorDetails      : (component: any, popup: boolean, popupPosition: CellEditorPopupPosition) => this.setEditorDetails(component, popup, popupPosition),\n\t\t\tgetElement            : () => this.getGui(),\n\t\t\tgetCellEditor         : () => this.getCellEditor(),\n\t\t\tgetParentValueElement : () => this.getParentValueElement(),\n\t\t\tgetRowElement         : () => this.eRow,\n\t\t\tgetCellEditorElement  : () => this.getCellEditorElement(),\n\t\t\tsetDomRenderer        : (renderer : boolean) => this.setDomRenderer(renderer),\n\t\t\tafterGuiAttached      : () => this.afterGuiAttached(),\n\t\t\tsetHeaderRowSpan      : (rowSpan: number, totalHeightPx?: number, currentRowHeightPx?: number) => this.setHeaderRowSpan(rowSpan, totalHeightPx, currentRowHeightPx),\n\t\t};\n\n\t\tthis.cellController.setComponent(component, this.getGui());\n\t}\n\n\tprivate static readonly HEADER_ROW_HEIGHT_PX = 42;\n\n\tprivate setHeaderRowSpan(rowSpan: number, totalHeightPx?: number, currentRowHeightPx?: number): void {\n\t\tconst el = this.getGui();\n\t\tif (rowSpan > 1) {\n\t\t\tconst total = totalHeightPx ?? rowSpan * HeaderCellComponent.HEADER_ROW_HEIGHT_PX;\n\t\t\tconst current = currentRowHeightPx ?? HeaderCellComponent.HEADER_ROW_HEIGHT_PX;\n\t\t\tel.style.height = `${total}px`;\n\t\t\tel.style.marginTop = `${-(total - current)}px`;\n\t\t\tel.classList.add('ZG-headerCell--spanning');\n\t\t} else {\n\t\t\tel.style.height = '';\n\t\t\tel.style.marginTop = '';\n\t\t\tel.classList.remove('ZG-headerCell--spanning');\n\t\t}\n\t}\n\tgetCellEditorElement() {\n\t\treturn  CellComponent.prototype.getCellEditorElement.call(this);\n\t}\n\n\tdestroyRenderer(): void {\n\t\tconst context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n\t\tthis.cellRenderer = context.destroyBean(this.cellRenderer);\n\t\tremoveFromParent(this.cellRendererElement);\n\t\tthis.cellRendererElement = null;\n\t}\n\n\trefreshWrapper(loading : boolean, editing : boolean) : void {\n\n\n\t\tconst apprendWrapper = editing && this.cellWrapperElement == null;\n\n\t\tif(apprendWrapper) {\n\t\t\tthis.cellWrapperElement = getWrapperTemplate(\"ZG-cellEditorContainer ZG-cellInlineEditing\");\n\t\t\tthis.getGui().appendChild(this.cellWrapperElement);\n\t\t}\n\n\t\tconst removeWrapper = !editing && this.cellWrapperElement != null;\n\n\t\tif(removeWrapper) {\n\t\t\tremoveFromParent(this.cellWrapperElement);\n\t\t\tthis.cellWrapperElement = null;\n\t\t}\n\n\n\t\tconst removeCellValue = loading && this.cellValueElement != null;\n\t\tif (removeCellValue) {\n\t\t\tremoveFromParent(this.cellValueElement);\n\t\t\tthis.cellValueElement = null;\n\t\t}\n\n\n\t\tconst removeCellValueEditorOpen = editing && this.cellValueElement != null;\n\n\t\tif(removeCellValueEditorOpen) {\n\t\t\tremoveFromParent(this.cellValueElement);\n\t\t\tthis.cellValueElement = null;\n\t\t}\n\t\t\n\t\tconst appendCellValue = !editing && !loading && this.cellValueElement == null;\n\t\tif(appendCellValue){\n\t\t\tthis.cellValueElement = getWrapperTemplate(\"ZG-cellValue\");\n\t\t\tthis.getGui().appendChild(this.cellValueElement);\n\t\t}\n\t\t\n\t}\n\n\tgetParentValueElement(): HTMLElement {\n        if (this.cellValueElement) {\n            return this.cellValueElement;\n        }\n\n\t\tif(this.cellWrapperElement) {\n\t\t\treturn this.cellWrapperElement;\n\t\t}\n\n        return this.getGui();\n    }\n\n\tprivate setRendererDetails(component: any) {\n\t\tif (component) {\n\t\t\tthis.destroyHeaderComponent();\n\t\t\tconst callBack = this.afterRenderer.bind(this);\n\t\t\tconst componentInstance = component?.newInstance();\n\t\t\tif (componentInstance) {\n\t\t\t\tcomponentInstance.then(callBack);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.setValuewithoutCellRenderer();\n\t\t}\n\t\tthis.columnAutoFitHandler.onAfterCellRenderComplete(this);\n\t}\n\n\tprivate setDefaultRendererParams(params: IHeaderCellRendererParams): void {\n\t\tif (this.cellRenderer && this.cellRenderer.refresh) {\n\t\t\tconst refreshed = this.cellRenderer.refresh(params);\n\t\t\tif (refreshed) return;\n\t\t}\n\n\t\tthis.destroyHeaderComponent();\n\t\tconst renderer = new DefaultHeaderCellRenderer();\n\t\trenderer.init(params);\n\n\t\tthis.cellRenderer = renderer;\n\t\tthis.cellRendererElement = renderer.getElement();\n\t\tif (this.cellRendererElement) {\n\t\t\tclearElement(this.getGui());\n\t\t\tthis.getGui().appendChild(this.cellRendererElement);\n\t\t}\n\t\tthis.columnAutoFitHandler.onAfterCellRenderComplete(this);\n\t}\n\n\tprivate afterRenderer(cellRenderer: IHeaderCellRendererComponent) {\n\t\tif (!this.isAlive()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.cellRenderer = cellRenderer;\n\t\tthis.cellRendererElement = cellRenderer.getElement();\n\t\tif (this.cellRendererElement) {\n\t\t\tclearElement(this.getGui());\n\t\t\tthis.getGui().appendChild(this.cellRendererElement);\n\t\t}\n\t}\n\n\tprivate destroyHeaderComponent() {\n\t\tthis.cellRenderer = this.destroyBean(this.cellRenderer);\n\t\tremoveFromParent(this.cellRendererElement);\n\t\tthis.cellRendererElement = null;\n\t}\n\n\tafterGuiAttached() {\n\t\tthis.cellRenderer && this.cellRenderer.afterElementAttached && this.cellRenderer.afterElementAttached();\n\t}\n\n\tprotected destroy(): void {\n\t\tthis.destroyHeaderComponent();\n\t\tthis.destroyEditor();\n\t\tsuper.destroy();\n\t\tthis.cellRenderer = null;\n\t\tthis.cellRendererElement = null;\n\t\tthis.headerElement = null;\n\t\tthis.cellValueElement = null;\n\t\tthis.cellWrapperElement = null;\n\t\tthis.column = null;\n\t\tthis.rowNode = null;\n\t\tthis.eRow = null;\n\t\tthis.cellController = null;\n\t\tthis.columnAutoFitHandler = null;\n\t\tthis.hideEditorPopup && this.hideEditorPopup();\n\t\tthis.domRenderer = null;\n\t\tthis.cellEditor = null;\n\t\tthis.cellEditorGui = null;\n\t\tthis.cellEditorPopupWrapper = null;\n\t}\n\n\tprivate setValuewithoutCellRenderer() {\n\t\tif (this.cellController.getPinned() == 'rowHeader') {\n\t\t\treturn;\n\t\t}\n\t\tconst column       = this.cellController.getColumn();\n\t\tconst headerName   = column.getHeaderName() ?? column.getColumnKey() as string;\n\t\tconst escapedValue = headerName != null ? escapeString(headerName) : null;\n\n\n\t\tif (escapedValue != null) {\n\t\t\tthis.getGui().textContent = escapedValue;\n\t\t}\n\t}\n\n\tprivate setWidth(width: string) {\n\t\tthis.getGui().style.width = width;\n\t}\n\n\tprivate setLeft(left: string) {\n\t\tthis.getGui().style.left = left;\n\t}\n\n\tprivate setValue(value: string): void {\n\t\tthis.getGui().textContent = value;\n\t}\n\n\tgetCellRenderer() {\n\t\treturn this.cellRenderer;\n\t}\n\n\t//editor\n\n\tgetCellEditor() {\n\t\treturn CellComponent.prototype.getCellEditor.call(this);\n\t}\n\n\tsetEditorDetails(component: any, popup: boolean, popupPosition: CellEditorPopupPosition) : void {\n\t\tCellComponent.prototype.setEditorDetails.call(this, component, popup, popupPosition);\n\t}\n\n\tcreateCellEditorInstance(component: UserComponentDetails, popup?: boolean, position?: 'over' | 'under'): void {\n\t\tCellComponent.prototype.createCellEditorInstance.call(this, component, popup, position);\n    }\n\n\taddPopupCellEditor(_params: any, _position?: 'over' | 'under'): void {\n\t\tCellComponent.prototype.addPopupCellEditor.call(this, _params, _position);\n    }\n\n\taddInLineCellEditor() : void {\n        CellComponent.prototype.addInLineCellEditor.call(this);\n\t}\n\n\tdestroyEditor(): void {\n        CellComponent.prototype.destroyEditor.call(this);\n    }\n\n\tprivate setDomRenderer(renderer : boolean) : void {\n\t\tthis.domRenderer = renderer;\n\t}\n}","import { AutoWired, BEAN_NAME, EventEmitter, EventHandler, getBeanInstanceByBeanName, IEventEmitter } from \"@dg/corecomponent\";\nimport { ColumnHoverHandler } from \"../../../Core/ColumnHoverHandler\";\nimport { COLUMN_NODE_EVENTS, EDIT_EVENTS, Events, isMacOS } from \"../../../Core/Constants/Events\";\nimport { columnPinPositions } from \"../../../Core/Constants/GridConfigurationConstants\";\nimport { GridOptioHandler } from \"../../../Core/GridOptionHandler\";\nimport { CellEditorPopupPosition, IColumnNode } from \"../../../Core/Interface/IColumnNode\";\nimport { CellStyle } from \"../../GridBodyComponent/RowContainer/Rendering/Cell/CellStyle\";\nimport { ICellEventParam } from \"../../Interface/Events/ICellEventComponent\";\nimport { IHeaderRowController } from \"../Row/Interface/IHeaderRowController\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport type { ColumnTreeModel } from \"../../../../nested-header/column-tree-model\";\nimport { GridUserComponentHandler } from \"../../../Core/Components/UserComponentHandler\";\nimport { IHeaderCellRendererParams } from \"../../../GridComponent/Interface/HeaderCellRenderer/IHeaderCellRendererParams\";\nimport { IColumnSelection } from \"../../../../Selection/column-selection.types\";\nimport { IColumnRoederParams } from \"../../../Core/Components/ColumnReorderController/ColumnReorderListener\";\nimport { CellController, ICellPosition } from \"../../GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { RowRenderController } from \"../../../Core/Rows/RowRenderController\";\nimport { ICellEditorParams, IRowNode } from \"../../../Main\";\nimport { IRowNodeCore } from \"../../../../DataStore/rownode.types\";\nimport { IGridCellEditorHandler } from \"../../Editor/GridCellEditorHandler\";\nimport { IRegisterRowSelection } from \"../../GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { INavigationHandler } from \"../../../Core/Navigation/navigation-handler.types\";\nimport { IRecordHandler } from \"../../../Core/Rows/RecordHandler.types\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\nimport { ColumnResizeHandler } from \"../column-resize/column-resize-handler\";\nimport type { ISortApiManager } from \"../../../API/SortAPI/Interface/ISortApiManager.types\";\nimport type { ISortModel, ISortOrder } from \"../../../Core/Interface/ISortConfigurations\";\n\nlet instanceIdSequence = 0;\n\n\nexport interface IColumnSelectionChangedEvent {\n\tcolumnSelected : boolean;\n\ttype: string;\n}\nexport interface IRegisterColumnSelection {\n\telement              : HTMLElement;\n\tonSelectionChange?: (params : IColumnSelectionChangedEvent) => void;\n}\n\n\nexport interface IHeaderCellComponent {\n\tgetElement(): HTMLElement;\n\tgetCellEditor(): any;\n\tsetEditorDetails(component ?: any, popup ?: boolean, popupPosition ?: CellEditorPopupPosition): void;\n\tsetWidth(width: string)                               : void;\n\tsetLeft(left: string)                                 : void;\n\tsetValue(value: string)                               : void;\n\tsetRendererDetails(component?: any, loading ?: boolean, forceRenderer ?: boolean)                                       : void;\n\tsetDefaultRendererParams(params: any)                 : void;\n\taddOrRemoveCssClass(className: string, force: boolean): void;\n\tgetRenderer()                                         : any;\n\n\tgetParentValueElement() : HTMLElement;\n\tgetRowElement()         : HTMLElement;\n\tgetCellEditorElement() : HTMLElement;\n\tsetDomRenderer(value : boolean) : void;\n\tafterGuiAttached() : void;\n\tsetHeaderRowSpan?(rowSpan: number, totalHeightPx?: number, currentRowHeightPx?: number): void;\n}\nexport class HeaderCellController extends EventEmitter {\n\t\n\tprivate column         : IColumnNode;\n\tprivate rowController  : IHeaderRowController;\n\tprivate component!     : IHeaderCellComponent;\n\tprivate element!       : HTMLElement;\n\tprivate isCellRenderer : boolean;\n\tprivate resizeHandler;\n\tprivate columnMeta;\n\n\tprivate addDestroyCellComponentFuncs : CallableFunction[] = [];\n\tprivate addDestroyColumnSelectionFunc : CallableFunction[] = [];\n\n\tprivate headerData : string | null = null;\n\t\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!                     : getBeanInstanceByBeanName;\n\t@AutoWired(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) private gridCellEditorHandler! : IGridCellEditorHandler;\n\n\tprivate defaultColumnDraggerSource : any ;\n\n\tprotected cellStyle: CellStyle;\n\n\tprivate instanceID = instanceIdSequence++;\n\n    static DOM_DATA_KEY_HEADER_CELL = 'headerCellController';\n\t\n\tprivate mouseEventListeners   : Record<string, (event : MouseEvent) => any>;\n\t        editing               : boolean;\n\t        cellPosition          : ICellPosition;\n\t        rowRendererController : RowRenderController;\n\t        rowNode               : IRowNode;\n\t\n\tprivate headerRowSpan: number;\n\n\tconstructor(column: IColumnNode, rowController: IHeaderRowController, rowSpan: number = 1) {\n\t\tsuper();\n\t\tthis.column \t\t= column;\n\t\tthis.headerRowSpan = rowSpan;\n\n\t\tthis.columnMeta = { columnID: this.column.getID(),\n\t\t\t\t\t\t\tpinnedPosition : this.column.getPinnedPosition()\n\t\t\t\t\t\t };\n\t\tthis.rowController  = rowController;\n\t\tthis.isCellRenderer = column.getHeaderRenderer() != null;\n\n\t\tthis.cellStyle = new CellStyle(this, this.getBeanInstanceByBeanName);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.cellStyle?.destroy();\n\t\t\tthis.cellStyle = null;\n\t\t});\n\t}\n\n\tsetComponent(component: IHeaderCellComponent, element: HTMLElement) {\n\t\tthis.component = component;\n\t\tthis.element = element;\n\t\tthis.addHoverListener();\n\t\tthis.addColumnListener();\n\t\tthis.onWidthChange();\n\t\tthis.onLeftChange();\n\t\tthis.refresh({force : true});\n\t\t\n        this.addListener(this.column, COLUMN_NODE_EVENTS.EVENT_COLUMN_DEFINITION_CHANGED, this.onColumnDefintionChanged.bind(this));\n        this.addListener(this.column, 'EVENT_COLUMN_DRAGGING', () => this.component.addOrRemoveCssClass('ZG-column-dragging', this.column.isDragging()));\n\n\t\tthis.addListener(this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER), 'columnSelectionChanged', this.onColumnSelectionChanged.bind(this));\n\n        this.addListener(this.eventHandler, Events.EVENT_CELL_REFRESH, this.refresh.bind(this));\n\n\t\tthis.addSortChangeListener();\n\n\n\t\tthis.cellStyle.setComponent(component);\n\t\tthis.onColumnSelectionChanged();\n\n\t\tthis.registerHighlightColumnOnDrag();\n\n\t\tthis.addDomData();\n\t\tthis.createCellPosition();\n\n\n\t\tthis.mouseEventListeners = {\n\t\t\tdblclick : this.onCellDoubleClick\n\t\t}\n\n\t\tthis.updateClassNames();\n\n\t\tif (this.headerRowSpan > 1 && typeof this.component.setHeaderRowSpan === 'function') {\n\t\t\tthis.applyHeaderRowSpanHeight(this.headerRowSpan);\n\t\t}\n\t}\n\n\tsetHeaderRowSpan(rowSpan: number): void {\n\t\tthis.headerRowSpan = rowSpan;\n\t\tif (this.component && typeof this.component.setHeaderRowSpan === 'function') {\n\t\t\tif (rowSpan > 1) {\n\t\t\t\tthis.applyHeaderRowSpanHeight(rowSpan);\n\t\t\t} else {\n\t\t\t\tthis.component.setHeaderRowSpan(rowSpan);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate applyHeaderRowSpanHeight(rowSpan: number): void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tconst treeModel = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_TREE_MODEL) as ColumnTreeModel | undefined;\n\t\tconst maxDepth = (optionHandler.hasColumnGroups?.() && treeModel) ? treeModel.getMaxDepth() : 1;\n\t\tconst leafRowIndex = maxDepth - 1;\n\t\tconst startRowIndex = leafRowIndex - rowSpan + 1;\n\t\tconst totalHeightPx = optionHandler.getColumnHeaderHeightSum(maxDepth, startRowIndex, rowSpan);\n\t\tconst currentRowHeightPx = optionHandler.getColumnHeaderHeight({ rowIndex: leafRowIndex, rowType: 'leaf', level: leafRowIndex, maxDepth });\n\t\tthis.component.setHeaderRowSpan!(rowSpan, totalHeightPx, currentRowHeightPx);\n\t}\n\n\tupdateClassNames() : void {\n\t\tthis.addFirstColumnClass();\n\t\tthis.addLastColumnClass();\n\t\tthis.addRightPinnedColumnClass();\n\t\tthis.addLeftPinnedColumnClass();\n\t\tthis.addCenterPinnedColumnClass();\n\t}\n\n\tgetRowNode(): IRowNodeCore {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER)\n\t\tthis.rowNode    = recordHandler.getHeaderHandler().getRowNode(0);\n\t\treturn this.rowNode;\n\t}\n\n\tprivate onCellDoubleClick(event: MouseEvent) {\n\t\t// this.startEditing(null, event);\n\t\tthis.gridCellEditorHandler.startEditing(this, null, event);\n\t}\n\n\tcreateCellPosition() {\n\t\tCellController.prototype.createCellPosition.call(this);\n\t}\n\t\n\tfocus(_event?: KeyboardEvent): void {\n\t\tconst element = this.component.getElement() as HTMLDivElement;\n\t\tconst isLoaded = this.rowNode.isLoaded();\n\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tconst fullRowHoverEdit = optionHandler.isFullRowHoverOnEdit();\n\t\tif (!fullRowHoverEdit && this.editing) {\n\t\t\t// this.stopEditing();\n\t\t\tthis.gridCellEditorHandler.stopEditing();\n\t\t}else {\n\t\t\telement.scrollIntoView({ block: 'nearest' });\n\t\t\tisLoaded && element.focus();\n\t\t}\n\t}\n\n\tpublic refreshCell(params : {force ?: boolean, newData ?: boolean}) {\n\t\tthis.createCellPosition();\n        if (this.editing) { return; }\n\n        if (!this.component) { return; }\n\n\t\tconst newData = params != null && !!params.newData;\n\n        const dataUpdate = params.force;\n\n\t\tif(dataUpdate) {\n        \tthis.setValue(newData);\n\n\t\t\tthis.cellStyle.applyClasses();\n\t\t}\n    }\n\n\tprotected setValue(forceRenderer : boolean = false) {\n\t\tlet componentDetails;\n\t\tif (this.isCellRenderer) {\n\t\t\tconst params = this.createRendererParam();\n\t\t\tconst userComponentHandler = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_HANDLER );\n\t\t\tcomponentDetails = userComponentHandler.getHeaderCellRendererDetails(\n\t\t\t\tthis.column,\n\t\t\t\tparams,\n\t\t\t);\n\t\t}\n\n\t\tthis.component.setRendererDetails(componentDetails, false, forceRenderer);\n\t}\n\n\tprotected addDomData(): void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName( BEAN_NAME.OPTION_HANDLER);\n\t\tthis.rowRendererController = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n\t\toptionHandler.setDomData( this.element, HeaderCellController.DOM_DATA_KEY_HEADER_CELL, this, );\n\t\tthis.addDestroyFunc(() => optionHandler.setDomData( this.element, HeaderCellController.DOM_DATA_KEY_HEADER_CELL, null) );\n\t}\n\n\tprotected registerHighlightColumnOnDrag() : void {\n\t\tthis.addListener(this.column, COLUMN_NODE_EVENTS.EVENT_COLUMN_HIGHLIGHT_CHANGE, this.highlightColumn.bind(this));\n\t}\n\n\tprivate highlightColumn() : void {\n\t\t\tconst highlight = this.column.getHighlight();\n\t\t\tconst aboveOn = highlight === 'left';\n\t\t\tconst BelowOn = highlight === 'right';\n\t\t\tthis.component.addOrRemoveCssClass('ZG-colHighlight-left', aboveOn);\n\t\t\tthis.component.addOrRemoveCssClass('ZG-colHighlight-right', BelowOn);\t\n\n\t\t\t\n\t}\n\n\tonMouseEvent(eventName: string, event: MouseEvent): void {\n\t\tconst callback = this.mouseEventListeners[eventName];\n\t\tcallback?.call(this, event);\n\t}\n\n\tprivate onColumnDefintionChanged() {\n\t\tthis.refresh({force:true});\n\t}\n\n\tprivate addColumnListener() {\n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\n\t\tthis.addListener( this.element, 'mousedown', this.onColumnMouseDown.bind(this), );\n\t\tthis.addListener( this.element, 'touchstart', this.onColumnMouseDown.bind(this), );\n\n\n\t\tthis.addListener(this.element, 'contextmenu' , (event) => {\n\t\t\tgridEvent.onContextMenu({\n\t\t\t\tevent : event,\n\t\t\t\tmeta : this.columnMeta,\n\t\t\t\ttype : 'headerCell'\n\t\t\t})\n\t\t})\n\t}\n\n\tregisterDragElement(dragElement : HTMLElement) : void {\n\t\tthis.addListener(dragElement, 'mousedown', this.onColumnReorderMouseDown.bind(this))\n\t}\n\n\tonColumnReorderMouseDown(_event : MouseEvent) : void {\n\t\t// const navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER ) as NavigationHandler;\n\t\t// navigation.onColumnReorderMouseDown(event);\n\t}\n\n\tonColumnMouseDown(event: MouseEvent) {\n\n\t\tconst gridOption = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_OPTIONS);\n\t\tconst suppressMouseDownEvent = gridOption.suppressMouseDownEvent;\n\t\t\n\t\tif(suppressMouseDownEvent) {\n\t\t\tconst isMouseDownSuppressed = suppressMouseDownEvent({\n\t\t\t\tevent : event,\n\t\t\t\ttype : \"columnHeader\",\n\t\t\t\tmeta : this.columnMeta});\n\t\t\tif(isMouseDownSuppressed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t};\n\n\t\t\n\t\t// const navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER ) as NavigationHandler;\n\t\t// navigation.onColumnMouseDown(event, this.columnMeta);\n\n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\n\t\tconst gridEditorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as IGridCellEditorHandler;\n\t\tgridEditorHandler.stopEditing(false, null, false, true);\n\n\t\tgridEvent.onColumnHeaderMouseDown({\n\t\t\tmouseEvent: event,\n\t\t\tcolumnID: this.columnMeta.columnID,\n\t\t});\n\t}\n\n\tgetController(): HeaderCellController {\n\t\treturn this;\n\t}\n\n\tonColumnMouseUp(event: MouseEvent): void {\n\t\t// const navigation = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.NAVIGATIONHANDLER) as NavigationHandler;\n\t\t// navigation.onColumnMouseUp(event, this.columnMeta);\n\t\tconst gridEvent = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_EVENTS);\n\n\t\tgridEvent.onColumnHeaderMouseUp({\n\t\t\tmouseEvent: event,\n\t\t\tcolumnID: this.columnMeta.columnID,\n\t\t});\n\t}\n\n\tprivate refresh(params : {force ?: boolean, newData ?: boolean}): void {\n\t\tconst valuesDifferent = this.updateAndFormatValue(!!this.component);\n\t\tconst dataUpdate = params.force || valuesDifferent;\n\t\tif(dataUpdate)  {\n\t\t\tthis.addDestroyCellComponentFuncs.forEach((func) => func());\n\t\t\tthis.refreshHeaderComp();\n\t\t}\n    }\n\n\tpublic updateAndFormatValue(compareValues: boolean): boolean {\n        const oldValue = this.headerData;\n\n\t\tconst fieldName = this.column.getHeaderName() as string;\n\n        this.headerData = fieldName;\n\n        if (compareValues) {\n            return oldValue !== this.headerData;\n        }\n        return true;\n    }\n\n\tprivate addHoverListener() {\n\t\tconst type = this.rowController.getPinned();\n\t\tif (type != 'rowHeader') {\n\t\t\tthis.addListener(this.element, 'mouseover', (event: MouseEvent) =>\n\t\t\t\tthis.onMouseOver(event),\n\t\t\t);\n\n\t\t\tthis.addListener(this.element, 'mouseout', (event: MouseEvent) =>\n\t\t\t\tthis.onMouseLeave(event),\n\t\t\t);\n\t\t\tthis.addListener(\n\t\t\t\tthis.column,\n\t\t\t\tCOLUMN_NODE_EVENTS.EVENT_MOUSE_ENTER,\n\t\t\t\tthis.onColumnHover.bind(this)\n\t\t\t);\n\t\t\tthis.addListener(\n\t\t\t\tthis.column,\n\t\t\t\tCOLUMN_NODE_EVENTS.EVENT_MOUSE_LEAVE,\n\t\t\t\tthis.onColumnHover.bind(this)\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate onMouseOver(_event: MouseEvent) {\n\t\tconst columnHoverHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.COLUMN_HOVER_HANDLER ) as ColumnHoverHandler;\n\t\tcolumnHoverHandler.setMouseOver([this.column]);\n\t\tthis.column.onMouseEnter();\n\t}\n\n\tprivate onMouseLeave(_event: MouseEvent) {\n\t\tconst columnHoverHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.COLUMN_HOVER_HANDLER, ) as ColumnHoverHandler;\n\t\tcolumnHoverHandler.clearMouseOver();\n\t\tthis.column.onMouseLeave();\n\t}\n\n\tprivate refreshHeaderComp() {\n\t\tconst params = this.createRendererParam();\n\n\t\tif (this.isCellRenderer) {\n\t\t\tconst userComponentHandler = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_HANDLER, ) as GridUserComponentHandler;\n\t\t\tconst componentDetails = userComponentHandler.getHeaderCellRendererDetails( this.column, params, );\n\t\t\tthis.component.setRendererDetails(componentDetails);\n\t\t} else {\n\t\t\tthis.component.setDefaultRendererParams(params);\n\t\t}\n\t}\n\n\tprivate createRendererParam() : IHeaderCellRendererParams {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER, ) as IRecordHandler;\n\t\tconst fieldHeaderHandler = recordHandler.getFieldHeaderHandler();\n\n\t\tconst rowNode = fieldHeaderHandler.getRowNode(\n\t\t\tthis.rowController.getRowIndex(),\n\t\t);\n\t\treturn {\n\t\t\tcolumnNode             : this.column,\n\t\t\tparentElement          : this.element,\n\t\t\trowUserParam           : rowNode && rowNode.getUserParams(),\n\t\t\tdisplayName            : this.getValue(),\n\t\t\tsortOrder              : this.getColumnSortOrder(),\n\t\t\tapis                   : this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER),\n\t\t\tregisterDragElement    : this.registerDragger.bind(this),\n\t\t\tregisterColumnSelection: this.registerColumnSelection.bind(this),\n\t\t\tregisterResizeElement  : this.registerResizeElement.bind(this),\n\t\t\tregisterResizeCue      : this.registerResizeCue.bind(this),\n\t\t\tregisterSelectAll      : this.registerSelectAll.bind(this),\n\t\t\tregisterSortElement    : this.registerSortElement.bind(this),\n\t\t};\n\t}\n\n\tprivate getValue() : string {\n\t\treturn this.column.getHeaderName() ?? this.column.getColumnKey();\n\t}\n\n\tprivate registerResizeCue(resizeCue : HTMLElement) : void {\n\t\tthis.resizeHandler.registerResizeCue(resizeCue);\n\t}\n\n\tprivate getColumnSortOrder(): ISortOrder | null {\n\t\tconst sortApi = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.SORT_API, true) as ISortApiManager | undefined;\n\t\tif (!sortApi) return null;\n\t\tconst sortModel = sortApi.getSortModel() ?? [];\n\t\tconst columnId = this.column.getID();\n\t\tconst match = sortModel.find((m: ISortModel) => m.columnId === columnId);\n\t\treturn match?.order ?? null;\n\t}\n\n\tprivate registerSortElement(element: HTMLElement): void {\n\t\tconst sortApi = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.SORT_API, true) as ISortApiManager | undefined;\n\t\tif (!sortApi) return;\n\n\t\tconst columnId = this.column.getID();\n\n\t\tconst onClick = () => {\n\t\t\tconst currentOrder = this.getColumnSortOrder();\n\t\t\tif (currentOrder === null) {\n\t\t\t\tsortApi.addSort(columnId, 'ascending');\n\t\t\t} else if (currentOrder === 'ascending') {\n\t\t\t\tsortApi.clearSort();\n\t\t\t\tsortApi.addSort(columnId, 'descending');\n\t\t\t} else {\n\t\t\t\tsortApi.clearSort();\n\t\t\t}\n\t\t};\n\n\t\telement.addEventListener('click', onClick);\n\t\tthis.addDestroyCellComponentFuncs.push(() => element.removeEventListener('click', onClick));\n\t}\n\n\tprivate addSortChangeListener(): void {\n\t\tconst hookManager = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.HOOK_MANAGER, true);\n\t\tif (!hookManager) return;\n\n\t\tconst onSortChanged = () => this.onSortChanged();\n\t\tthis.addListener(hookManager, 'onAfterRowSortApplied', onSortChanged);\n\t\tthis.addListener(hookManager, 'onAfterRowSortRemove', onSortChanged);\n\t}\n\n\tprivate onSortChanged(): void {\n\t\tif (!this.component) return;\n\t\tconst renderer = this.component.getRenderer();\n\t\tif (renderer?.refresh) {\n\t\t\tconst params = this.createRendererParam();\n\t\t\trenderer.refresh(params);\n\t\t}\n\t}\n\n\tonWidthChange() {\n\t\tconst width = this.getWidth();\n\t\tthis.component.setWidth(`${width}px`);\n\t}\n\n\tonLeftChange() {\n\t\tif (this.column.getLeft) {\n\t\t\tconst left = this.column.getLeft();\n\t\t\tthis.component.setLeft(`${left}px`);\n\t\t}\n\t}\n\n\tprivate onColumnHover() {\n\t\tif (!this.component) {\n\t\t\treturn;\n\t\t}\n\t\tconst optionHandler = this.getBeanInstanceByBeanName( BEAN_NAME.OPTION_HANDLER ) as GridOptioHandler;\n\t\tconst isColumnHoverHighlighter =\n\t\t\toptionHandler.isColumnHoverHighlighter?.();\n\n\t\tif (!isColumnHoverHighlighter) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst columnHoverHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.COLUMN_HOVER_HANDLER ) as ColumnHoverHandler;\n\n\t\tconst isHovered = columnHoverHandler.isHovered(this.column);\n\t\tthis.component.addOrRemoveCssClass('ZG-columnHover', isHovered);\n\t}\n\n\tgetColumn(): IColumnNode {\n\t\treturn this.column;\n\t}\n\n\tgetPinned(): columnPinPositions {\n\t\treturn this.rowController.getPinned();\n\t}\n\n\tgetInstanceId(): string {\n\t\treturn `${this.column.getID()}-${this.instanceID}`;\n\t}\n\n\tgetLeft(): number {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n\t\tconst columnPinnedPosition = this.column.getPinnedPosition();\n\t\tswitch (columnPinnedPosition) {\n\t\t\tcase 'center':\n\t\t\t\tconst centerHandler = fieldHandler.getCenterHandler();\n\t\t\t\treturn centerHandler.getColumnLeft(this.column.getID());\n\t\t\tcase 'left':\n\t\t\t\tconst leftHandler = fieldHandler.getLeftHandler();\n\t\t\t\treturn leftHandler.getColumnLeft(this.column.getID());\n\t\t\tcase 'right':\n\t\t\t\tconst rightHandler = fieldHandler.getRightHandler();\n\t\t\t\treturn rightHandler.getColumnLeft(this.column.getID());\n\t\t\tcase 'rowHeader':\n\t\t\t\tconst headerHandler = fieldHandler.getHeaderHandler();\n\t\t\t\treturn headerHandler.getColumnLeft(this.column.getID());\n\t\t\tdefault:\n\t\t\t\treturn centerHandler.getColumnLeft(this.column.getID());\n\t\t}\n\t}\n\n\tprivate getWidth(): number {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n\t\tconst columnPinnedPosition = this.column.getPinnedPosition();\n\t\tswitch (columnPinnedPosition) {\n\t\t\tcase 'center':\n\t\t\t\tconst centerHandler = fieldHandler.getCenterHandler();\n\t\t\t\treturn centerHandler.getColumnWidth(this.column.getID());\n\t\t\tcase 'left':\n\t\t\t\tconst leftHandler = fieldHandler.getLeftHandler();\n\t\t\t\treturn leftHandler.getColumnWidth(this.column.getID());\n\t\t\tcase 'right':\n\t\t\t\tconst rightHandler = fieldHandler.getRightHandler();\n\t\t\t\treturn rightHandler.getColumnWidth(this.column.getID());\n\t\t\tcase 'rowHeader':\n\t\t\t\tconst headerHandler = fieldHandler.getHeaderHandler();\n\t\t\t\treturn headerHandler.getColumnWidth(this.column.getID());\n\t\t\tdefault:\n\t\t\t\treturn centerHandler.getColumnWidth(this.column.getID());\n\t\t}\n\t}\n\n\tupdateCellStyles(meta: any): void {\n\t\tthis.cellStyle.applyCellStyles(meta);\n\t}\n\n\tremoveRangeSelectionStyle(): void {\n\t\tthis.cellStyle.removeRangeSelection();\n\t}\n\n\tgetCellComponent() : any {\n\t\treturn this.component.getRenderer();\n\t}\n\n\tcreateCellKeyEventParam( event: KeyboardEvent, ): ICellEventParam<KeyboardEvent> {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n\t\tconst fieldHandler  = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n\n\t\tconst fieldHeaderHandler = recordHandler.getFieldHeaderHandler();\n\n\t\tconst rowNode = fieldHeaderHandler.getRowNode(\n\t\t\tthis.rowController.getRowIndex(),\n\t\t);\n\n\t\tconst rowID = rowNode.getId();\n\t\tconst rowIndex = recordHandler.getRelativeIndexByID(rowID);\n\n\t\tconst pinPosition = rowNode.getPinnedPosition();\n\n\t\tconst columnID = this.column.getID();\n\t\tconst columnIndex = fieldHandler.getIndexById(columnID);\n\n\t\treturn {\n\t\t\tevent,\n\t\t\trowIndex,\n\t\t\tpinPosition,\n\t\t\tcolumnIndex,\n\t\t\tcolumnID,\n\t\t\trowID,\n\t\t};\n\t}\n\n\tcreateCellMouseEventParam( event: MouseEvent, ): ICellEventParam<MouseEvent> {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName( GRID_BEAN_NAME.RECORD_HANDLER, ) as IRecordHandler;\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n\n\t\tconst fieldHeaderHandler = recordHandler.getFieldHeaderHandler();\n\n\t\tconst rowNode = fieldHeaderHandler.getRowNode(\n\t\t\tthis.rowController.getRowIndex(),\n\t\t);\n\n\t\tconst rowID = rowNode.getId();\n\t\tconst rowIndex = recordHandler.getRelativeIndexByID(rowID);\n\n\t\tconst pinPosition = rowNode.getPinnedPosition();\n\n\t\tconst columnID = this.column.getID();\n\t\tconst columnIndex = fieldHandler.getIndexById(columnID);\n\n\t\treturn {\n\t\t\tevent,\n\t\t\trowIndex,\n\t\t\tpinPosition,\n\t\t\tcolumnIndex,\n\t\t\tcolumnID,\n\t\t\trowID,\n\t\t};\n\t}\n\n\tgetCellPosition(): ICellPosition {\n\t\treturn this.cellPosition;\n\t}\n\n\tonColumnSelectionChanged() : void {\n\t\tconst columnSelection = this.getBeanInstanceByBeanName('columnSelection', true);\n\t\tif(columnSelection) {\n\t\t\tconst isColumnSelected = columnSelection?.isColumnSelected(this.column.getID());\n\t\t\tthis.component.addOrRemoveCssClass('ZG-column-selected', !!isColumnSelected);\n\t\t}\n\t\t\n\t}\n\n\tprivate registerResizeElement(element : HTMLElement) : void {\n\t\tthis.resizeHandler = this.createManagedBean(new ColumnResizeHandler(this.column, this.component, this.columnMeta));\n\t\tconst dragSource = this.resizeHandler.getDragSource(element);\n\n\t\tif (!dragSource) return;\n\n        const dragAndDropHandler = this.getBeanInstanceByBeanName('dragAndDropHandler')\n        dragAndDropHandler.addDragSource(dragSource, true);\n\n\t\tthis.addDestroyCellComponentFuncs.push(() => {\n\t\t\tdragAndDropHandler.removeDragSource(dragSource);\n\t\t})\n\t}\n\n\tprivate registerDragger(element  : HTMLElement) : void {\n\t\tif(!this.column.isDraggable()) {\n\t\t\treturn;\n\t\t}\n\n\t\tif(this.defaultColumnDraggerSource) {\n\t\t\tthis.getBeanInstanceByBeanName('dragAndDropHandler').removeDragSource(this.defaultColumnDraggerSource);\n\t\t\tthis.defaultColumnDraggerSource = null;\n\t\t}\n\n\t\tthis.defaultColumnDraggerSource = {\n\t\t\ttype: 'headercell',\n\n\t\t\tcontainer: element,\n\t\t\tgetGhostElement: () => {\n\t\t\t\tconst columnSelectionHandler = this.getBeanInstanceByBeanName('columnSelection') as IColumnSelection;\n\t\t\t\tconst sourceArray            = this.defaultColumnDraggerSource.getDragItem().columnIds;\n\t\t\t\tconst columnID               = this.column.getID();\n\t\t\t\tconst isSelected             = columnSelectionHandler.isColumnSelected(columnID);\n\t\t\t\tconst definitionParam        = this.createDefinitionParam();\n\t\t\t\tconst rowReorderParams       = this.createRowReorderParams(sourceArray, isSelected);\n\t\t\t\tconst userComponentHandler   = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as GridUserComponentHandler;\n\t\t\t\tconst reorderDetails         = userComponentHandler.getColumnReorderRendererDetails(definitionParam, rowReorderParams);\n\n\t\t\t\tconst div = document.createElement(\"div\");\n                if(reorderDetails) {\n                    const reorderElementInstance = reorderDetails?.newInstance();\n\t\t\t\t\treorderElementInstance.then((instance) => {\n\t\t\t\t\t\tdiv.appendChild(instance.getElement());\n\t\t\t\t\t})\n                }\n                return div;\n\t\t\t},\n\t\t\tgetDragItem:  () => {\n\t\t\t\tconst columnSelectionHandler = this.getBeanInstanceByBeanName('columnSelection') as IColumnSelection;\n\t\t\t\tconst columnIds              = columnSelectionHandler.getSelectedColumns();\n\t\t\t\tconst columnID               = this.column.getID();\n\t\t\t\tconst isSelected             = columnSelectionHandler.isColumnSelected(columnID);\n\n\n\t\t\t\treturn {\n\t\t\t\t\tcolumnIds : isSelected ? columnIds.length != 0 ? columnIds : [columnID] : [columnID]\n\t\t\t\t}\n\t\t\t},\n\t\t\tshouldPreventMouseEvent : () => true,\n\t\t\tgetRootNode : () => window,\n\t\t\tdragSourceId : this.getBeanInstanceByBeanName('instanceID'),\n\t\t\ttriggerTimeout : 80,\n\t\t\tonDragStarted : () => {\n\t\t\t\tconst gridCellEditorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as IGridCellEditorHandler;\n\t\t\t\tgridCellEditorHandler.stopEditing(true, null, false, true)\n\t\t\t}\n\t\t}\n\n\t\tthis.getBeanInstanceByBeanName('dragAndDropHandler').addDragSource(this.defaultColumnDraggerSource, true);\n\n\t\tthis.addDestroyCellComponentFuncs.push(() => {\n\t\t\tthis.defaultColumnDraggerSource && this.getBeanInstanceByBeanName('dragAndDropHandler').removeDragSource(this.defaultColumnDraggerSource);\n\t\t\tthis.defaultColumnDraggerSource = null;\n\t\t})\n\t}\n\n\tcreateDefinitionParam() : any {\n        const optionHandler           = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const columnreorderRenderer   = optionHandler.getColumnReoderRenderer();\n        const userProvidedRenderParam = optionHandler.getColumnReorderRendererParams();\n        return {\n            getRenderer : ()=>columnreorderRenderer,\n            getRendererParam : ()=>userProvidedRenderParam\n        }\n    }\n\n\tcreateRowReorderParams(sourceColumnIds, isSourceColumnSelected) : IColumnRoederParams {\n        const APIHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.API_HANDLER)\n        return {\n            sourceColumnIds       : sourceColumnIds,\n            isSourceColumnSelected: isSourceColumnSelected,\n            APIs                  : APIHandler\n        }\n    }\n\n\tprivate registerColumnSelection(params : IRegisterColumnSelection) : void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif(optionHandler.getColumnSelection() == 'none') {\n\t\t\treturn;\n\t\t}\n\t\tconst columnSelection = this.getBeanInstanceByBeanName('columnSelection') as IColumnSelection;\n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER) as EventHandler;\n\t\tconst id = this.column.getID();\n\t\tthis.addDestroyColumnSelectionFunc.forEach((callBack) => callBack());\n\t\tthis.addDestroyColumnSelectionFunc = [];\n\t\tthis.addColumnSelectionListener(params.element, \"mousedown\", (event) => {\n\t\t\tevent.preventDefault();\n\t\t\t// event.stopPropagation();\n\t\t})\n\t\tthis.addColumnSelectionListener(params.element, 'click',(event : PointerEvent) => {\n\t\t\tcolumnSelection.setColumnSelected({\n\t\t\t\tids        : [id],\n\t\t\t\tnewValue   : true,\n\t\t\t\tsource     : 'ui',\n\t\t\t\trangeSelect: event.shiftKey,\n\t\t\t\tctrlSelect : isMacOS ? event.metaKey: event.ctrlKey\n\t\t\t});\n\t\t})\n\n\t\tif(params.onSelectionChange) {\n\t\t\tthis.addColumnSelectionListener(eventHandler, 'columnSelectionChanged', (event) => {\n\t\t\t\tparams.onSelectionChange({\n\t\t\t\t\t...event,\n\t\t\t\t\tcolumnSelected : columnSelection.isColumnSelected(id)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate addComponentListener(event :Window | HTMLElement | IEventEmitter , eventName : string, callBack : EventListener) : void {\n\t\tevent.addEventListener(eventName, callBack);\n\t\tthis.addDestroyCellComponentFuncs.push(() => event.removeEventListener(eventName, callBack));\n\t}\n\n\tprivate addColumnSelectionListener(event :Window | HTMLElement | IEventEmitter , eventName : string, callBack : EventListener) : void {\n\t\tevent.addEventListener(eventName, callBack);\n\t\tthis.addDestroyColumnSelectionFunc.push(() => event.removeEventListener(eventName, callBack));\n\t}\n\n\tgetEditStartHookName() : string {\n\t\treturn EDIT_EVENTS.EVENT_HEADER_CELL_EDIT_START;\n\t}\n\n\tgetEditStopHookName() : string {\n\t\treturn EDIT_EVENTS.EVENT_HEADER_CELL_EDIT_STOPPED;\n\t}\n\n\n\t//editing\n\n\tcreateCellEditorEvents(eventKey : string, event : Event | null, type : string) {\n\t\tconst eventArgs = CellController.prototype.createCellEditorEvents.call(this, eventKey, event, type);\n\t\treturn {...eventArgs, ...{\n\t\t\tdata  : null,\n\t\t\tvalue : this.column.getHeaderName(),\n\t\t\tcolumn : this.column\n\t\t}}\n\t}\n\n\tcreateCellEditorParams(key: string | null, event : KeyboardEvent | MouseEvent | null): any {\n\t\tconst params = CellController.prototype.createCellEditorParams.call(this, key, event);\n\t\treturn {...params, ...{\n\t\t\tvalue : this.getValue(),\n\t\t\tdata  : null\n\t\t}}\n    }\n\n\tisEditing(): boolean {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst hasColumnNode = !!fieldHandler.getColumnNodeByID(this.column.getID());\n\t\treturn hasColumnNode && CellController.prototype.isEditing.call(this);\n\t}\n\n\tsetEditing(editing: boolean): void {\n\t\tCellController.prototype.setEditing.call(this, editing);\n\t}\n\n\tgetValueFromEditor(cancel: boolean): { newValue?: any, isNewValue: boolean } {\n        return CellController.prototype.getValueFromEditor.call(this, cancel);\n    }\n\n\tpublic saveCellValues(oldValue : any, newValue : any) : void {\n\t\toldValue = this.column.getHeaderName();\n\t\tif(oldValue === newValue) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.column.updateHeaderName(newValue);\n\t}\n\n\tstopEditing(cancel = false, ev : KeyboardEvent = null, _shiftKey : boolean = false, _suppressNavigation = false) : boolean {\n\t\treturn CellController.prototype.stopEditing.call(this, cancel, ev);\n\t}\n\n\tdispatchEditEnded(key : string | null,event : Event | null) : void {\n\t\tCellController.prototype.dispatchEditEnded.call(this, key, event);\n\t}\n\n\tdispatchEditStarted(key : string | null, event : Event | null) : void {\n\t\tCellController.prototype.dispatchEditStarted.call(this, key, event);\n\t}\n\n\tstartEditing(key: string | null = null, event: KeyboardEvent | MouseEvent | null = null): boolean {\n\t\tconst isColumnEditable    = this.column.isHeaderEditable(this.createEditableParams());\n\t\t\n\t\t\n\n\t\tif (this.editing || isColumnEditable == false) {\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tconst navigation             = this.getBeanInstanceByBeanName('navigationService') as INavigationHandler;\n\t\tconst optionHandler          = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tconst onBeforeCellEditEvents = this.createCellEditorEvents(key,event, this.getEditStartHookName());\n\t\tnavigation.ensureCellVisible(this.cellPosition);\n\n\t\tif(!optionHandler.onBefore(this.getEditStartHookName(), onBeforeCellEditEvents)) {\n\t\t\treturn false;\n\t\t}\n\n\n\t\tconst cellEditorParams     = this.createCellEditorParams(key, event);\n\t\tconst cellEditorDetails    = this.getEditorDetails(cellEditorParams);\n\t\t\n\t\tif(cellEditorDetails == undefined) {\n\t\t\tthis.openCellEditorTooltip();\n\t\t\treturn false;\n\t\t}\n\t\t\n\t\tif(cellEditorDetails && !cellEditorDetails?.componentClass) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst popup = cellEditorDetails?.popupFromSelector != null ? cellEditorDetails.popupFromSelector : !!this.column.isCellEditorPopup() ;\n\n\t\tconst position: CellEditorPopupPosition = cellEditorDetails?.popupPositionFromSelector != null ? cellEditorDetails.popupPositionFromSelector : this.column.getCellEditorPopupPosition();\n\n\t\tthis.setEditing(true);\n\n\t\tthis.component.addOrRemoveCssClass('ZG-cell-inline-editor', true);\n\t\tthis.component.setEditorDetails(cellEditorDetails, popup, position);\n\n\t\tthis.dispatchEditStarted(key, event);\n\n\t\treturn true;\n\t}\n\n\n\tgetEditorDetails(cellEditorParams: ICellEditorParams<any, any>) {\n\t\tconst userComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n\t\treturn userComponentHandler.getHeaderCellEditorDetails(this.column, cellEditorParams);\n\t}\n\n\tcreateEditableParams() : any {\n\t\treturn CellController.prototype.createEditableParams.call(this);\n\t}\n\n\tcreateCoreEditableParams() : any {\n\t\treturn CellController.prototype.createCoreEditableParams.call(this);\n\t}\n\n\tonKeyDown(_event: KeyboardEvent) {\n\n\t}\n\n\tcloseEditorTooltipComponent() : void {\n\t\treturn CellController.prototype.closeEditorTooltipComponent.call(this);\n\t}\n\n\topenCellEditorTooltip() : void {\n\n\t}\n\n\tnavigateAfterEdit(_shiftKey: boolean, _event : KeyboardEvent) : void {\n\t\t\n\t}\n\n\tprocessPrintableCharacter(event : KeyboardEvent) : void {\n\t\tCellController.prototype.processPrintableCharacter.call(this, event);\n\t}\n\n\tprivate registerSelectAll(params : IRegisterRowSelection) : void {\n\t\tconst rowSelectionHandler = this.getBeanInstanceByBeanName('RowSelectionHandler') as any;\n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER) as EventHandler;\n\t\tthis.addComponentListener(params.element, \"mousedown\", (event) => {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t})\n\t\tthis.addComponentListener(params.element, 'click',(event : PointerEvent) => {\n\t\t\tconst isSelectAll = rowSelectionHandler.getSelectAllState();\n\t\t\tisSelectAll ? rowSelectionHandler.deselectAllRows({\n\t\t\t\tsource : 'ui',\n\t\t\t\tevent\n\t\t\t}) :rowSelectionHandler.selectAllRows({\n\t\t\t\tsource : 'ui',\n\t\t\t\tevent\n\t\t\t});\n\t\t})\n\n\t\tif(params.onRowSelectionChange) {\n\t\t\tthis.addComponentListener(eventHandler, 'rowSelectionChanged', (event) => {\n\t\t\t\tconst selectAllState = rowSelectionHandler.getSelectAllState();\n\t\t\t\tconst selectAllValue = selectAllState === null ? 'intermediate' : selectAllState ? 'all' : 'none';\n\n\t\t\t\tparams.onRowSelectionChange({\n\t\t\t\t\t...event,\n\t\t\t\t\tselectALL: selectAllValue,\n\t\t\t\t});\n\t\t\t})\n\t\t}\n\t}\n\n\tdestroy(): void {\n\t\tif (this.isEditing()) {\n\t\t\tthis.gridCellEditorHandler.stopEditing(false, null, false, true);\n\t\t}\n\n\t\tif (this.component) {\n\t\t\tthis.component.setDomRenderer(false);\n\t\t}\n\n\t\tthis.addDestroyCellComponentFuncs.forEach((func) => func());\n\t\tthis.addDestroyColumnSelectionFunc.forEach((func) => func());\n\t\tthis.addDestroyCellComponentFuncs = [];\n\t\tthis.addDestroyColumnSelectionFunc = [];\n\t\tsuper.destroy();\n\n\t\tthis.column = null;\n\t\tthis.rowController = null;\n\t\tthis.component = null;\n\t\tthis.isCellRenderer = null;\n\t\tthis.resizeHandler = null;\n\t\tthis.columnMeta = null;\n\t\tthis.element = null;\n\t\tthis.mouseEventListeners = null;\n\t\tthis.editing = null;\n\t\tthis.cellPosition = null;\n\t\tthis.rowRendererController = null;\n\t\tthis.rowNode = null;\n\t\tthis.instanceID = null;\n\t\tthis.defaultColumnDraggerSource = null;\n\t\tthis.cellStyle = null;\n\t\tthis.headerData = null;\n\t}\n\n\tprivate addLastColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst lastColumnId = fieldHandler.getLastColumnID();\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--last', lastColumnId === this.column.getID());\n\t}\n\t\n\tprivate addFirstColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst firstColumnId = fieldHandler.getFirstColumnID();\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--first', firstColumnId === this.column.getID());\n\t}\n\t\n\tprivate addLeftPinnedColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst rightHandler = fieldHandler.getLeftHandler();\n\t\tconst isLeftFirstColumn = rightHandler.getFirstColumnID() === this.column.getID();\n\t\tconst isLeftLastColumn = rightHandler.getLastColumnID() === this.column.getID();\n\t\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-left-first', isLeftFirstColumn);\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-left-last', isLeftLastColumn);\n\t\n\t}\n\t\n\tprivate addRightPinnedColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst rightHandler = fieldHandler.getRightHandler();\n\t\tconst isFirstColumn = rightHandler.getFirstColumnID() === this.column.getID();\n\t\tconst isLastColumn = rightHandler.getLastColumnID() === this.column.getID();\n\t\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-right-first', isFirstColumn);\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-right-last', isLastColumn);\n\t\n\t}\n\n\tprivate addCenterPinnedColumnClass() : void {\n\t\tconst fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\t\tconst centerHandler = fieldHandler.getCenterHandler();\n\t\tconst isFirstColumn = centerHandler.getFirstColumnID() === this.column.getID();\n\t\tconst isLastColumn = centerHandler.getLastColumnID() === this.column.getID();\n\t\n\t\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-center-first', isFirstColumn);\n\t\tthis.component.addOrRemoveCssClass('ZG-column--pinned-center-last', isLastColumn);\n\t\n\t}\n\n\tafterGuiAttached(): void {\n\t\tif (this.component) {\n\t\t\tthis.component.afterGuiAttached();\n\t\t\tthis.component.setDomRenderer(true);\n\t\t}\n\t}\n\n\tgetElement() : HTMLElement | null {\n\t\treturn this.component.getElement();\n\t}\n\n}","import { Component, PostConstruct } from '@dg/corecomponent';\nimport type { HeaderGroupCellController, IHeaderGroupCellComponent } from './HeaderGroupCellController';\nimport { DefaultHeaderGroupCellRenderer } from './DefaultHeaderGroupCellRenderer';\nimport type { IHeaderGroupCellRendererComponent } from '../../Interface/HeaderGroupCellRenderer/IHeaderGroupCellRendererComponent';\nimport type { IHeaderGroupCellRendererParams } from '../../Interface/HeaderGroupCellRenderer/IHeaderGroupCellRendererParams';\n\nfunction getTemplate(): HTMLElement {\n\tconst div = document.createElement('div');\n\tdiv.className = 'ZG-headerGroupCell';\n\tdiv.setAttribute('role', 'columnheader');\n\treturn div;\n}\n\nexport class HeaderGroupCellComponent extends Component implements IHeaderGroupCellComponent {\n\tprivate controller: HeaderGroupCellController;\n\tprivate cellRenderer: IHeaderGroupCellRendererComponent | null = null;\n\n\tconstructor(controller: HeaderGroupCellController, _eRow: HTMLElement) {\n\t\tsuper();\n\t\tthis.controller = controller;\n\t\tthis.setTemplate(getTemplate());\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tthis.controller.setComponent(this, this.getGui());\n\t}\n\n\tsetWidth(width: string): void {\n\t\tthis.getGui().style.width = width;\n\t}\n\n\tsetLeft(left: string): void {\n\t\tthis.getGui().style.left = left;\n\t}\n\n\tsetHeaderName(_name: string): void {\n\t\tthis.refreshRenderer();\n\t}\n\n\tsetExpandable(_expandable: boolean): void {\n\t\tthis.refreshRenderer();\n\t}\n\n\tsetExpanded(_expanded: boolean): void {\n\t\tthis.refreshRenderer();\n\t}\n\n\tsetExpandToggleCallback(_callback: () => void): void {\n\t\tthis.refreshRenderer();\n\t}\n\n\tsetColSpan(colSpan: number): void {\n\t\tthis.getGui().setAttribute('aria-colspan', String(colSpan));\n\t}\n\n\tsetHeaderRowSpan(rowSpan: number, totalHeightPx?: number): void {\n\t\tconst el = this.getGui();\n\t\tconst ROW_HEIGHT_PX = 42;\n\t\tif (rowSpan > 1) {\n\t\t\tconst total = totalHeightPx ?? rowSpan * ROW_HEIGHT_PX;\n\t\t\tel.style.height = `${total}px`;\n\t\t\tel.classList.add('ZG-headerGroupCell--spanning');\n\t\t} else {\n\t\t\tel.style.height = '';\n\t\t\tel.classList.remove('ZG-headerGroupCell--spanning');\n\t\t}\n\t}\n\n\taddOrRemoveCssClass(className: string, force: boolean): void {\n\t\tif (force) this.getGui().classList.add(className);\n\t\telse this.getGui().classList.remove(className);\n\t}\n\n\tgetElement(): HTMLElement {\n\t\treturn this.getGui();\n\t}\n\n\tprivate buildRendererParams(): IHeaderGroupCellRendererParams & Record<string, unknown> {\n\t\tconst group = this.controller.getGroup();\n\t\tconst base: IHeaderGroupCellRendererParams & Record<string, unknown> = {\n\t\t\tgroup,\n\t\t\tdisplayName: group.getHeaderName(),\n\t\t\texpanded: group.isExpanded(),\n\t\t\texpandable: group.isExpandable(),\n\t\t\tsetExpanded: (_expanded: boolean) => this.controller.onExpandToggle(),\n\t\t\tregisterExpandCollapseElement: (element: HTMLElement) => this.controller.setExpandCollapseElement?.(element),\n\t\t\tregisterColumnSelection: (element: HTMLElement) => this.controller.registerColumnSelection(element),\n\t\t\tregisterResizeElement: (element: HTMLElement) => this.controller.registerResizeElement(element),\n\t\t};\n\t\tconst userDef = group.getUserDefinition() as { headerGroupCellRendererParams?: object } | undefined;\n\t\tconst customParams = userDef?.headerGroupCellRendererParams;\n\t\tif (typeof customParams === 'object' && customParams !== null) {\n\t\t\tObject.assign(base, customParams);\n\t\t}\n\t\treturn base;\n\t}\n\n\tprivate refreshRenderer(): void {\n\t\tconst params = this.buildRendererParams();\n\t\tthis.getGui().setAttribute('aria-expanded', params.expanded ? 'true' : 'false');\n\n\t\tif (this.cellRenderer) {\n\t\t\tif (this.cellRenderer.refresh) {\n\t\t\t\tthis.cellRenderer.refresh(params);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst group = this.controller.getGroup();\n\t\tconst userDef = group.getUserDefinition() as { headerGroupCellRenderer?: new () => IHeaderGroupCellRendererComponent } | undefined;\n\t\tconst CustomRenderer = userDef?.headerGroupCellRenderer;\n\n\t\tif (CustomRenderer && typeof CustomRenderer === 'function') {\n\t\t\tthis.cellRenderer = new CustomRenderer();\n\t\t} else {\n\t\t\tthis.cellRenderer = new DefaultHeaderGroupCellRenderer();\n\t\t}\n\t\tthis.cellRenderer.init!(params);\n\t\tconst rendererEl = this.cellRenderer.getElement();\n\t\tif (rendererEl) {\n\t\t\tthis.getGui().appendChild(rendererEl);\n\t\t}\n\t}\n\n\tprotected destroy(): void {\n\t\tif (this.cellRenderer?.destroy) {\n\t\t\tthis.cellRenderer.destroy();\n\t\t}\n\t\tthis.cellRenderer = null;\n\t\tsuper.destroy();\n\t}\n}\n","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from '@dg/corecomponent';\nimport type { ColumnGroupNode } from '../../../../nested-header/column-group-node';\nimport type { IHeaderRowController } from '../Row/Interface/IHeaderRowController';\nimport type { IColumnSelection } from '../../../../Selection/column-selection.types';\nimport type { IColumnNode } from '../../../Core/Interface/IColumnNode';\nimport { GRID_BEAN_NAME } from '../../../Core/Constants/BeanName';\nimport type { ColumnTreeModel } from '../../../../nested-header/column-tree-model';\nimport type { GridOptioHandler } from '../../../Core/GridOptionHandler';\nimport type { IColumnAPIManager } from '../../../Main';\n\nlet instanceIdSeq = 0;\n\nexport interface IHeaderGroupCellComponent {\n\tgetElement(): HTMLElement;\n\tsetWidth(width: string): void;\n\tsetLeft(left: string): void;\n\tsetHeaderName(name: string): void;\n\tsetExpandable(expandable: boolean): void;\n\tsetExpanded(expanded: boolean): void;\n\tsetColSpan(colSpan: number): void;\n\tsetHeaderRowSpan?(rowSpan: number, totalHeightPx?: number): void;\n\taddOrRemoveCssClass(className: string, force: boolean): void;\n\tsetExpandToggleCallback(callback: () => void): void;\n}\n\nexport class HeaderGroupCellController extends EventEmitter {\n\tprivate group: ColumnGroupNode;\n\tprivate rowController: IHeaderRowController;\n\tprivate colSpan: number;\n\tprivate rowSpan: number;\n\tprivate instanceId = instanceIdSeq++;\n\tprivate component!: IHeaderGroupCellComponent;\n\tprivate expandCollapseElement: HTMLElement | null = null;\n\tprivate expandCollapseClickHandler = (e: MouseEvent) => {\n\t\te.stopPropagation();\n\t\tthis.onExpandToggle();\n\t};\n\tprivate expandedChangedListener: (() => void) | null = null;\n\tprivate selectionCleanupFuncs: (() => void)[] = [];\n\tprivate resizeCleanupFuncs: (() => void)[] = [];\n\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\n\tconstructor(group: ColumnGroupNode, rowController: IHeaderRowController, colSpan: number, rowSpan: number = 1) {\n\t\tsuper();\n\t\tthis.group = group;\n\t\tthis.rowController = rowController;\n\t\tthis.colSpan = colSpan;\n\t\tthis.rowSpan = rowSpan;\n\t\tthis.addDestroyFunc(() => this.destroyController());\n\t}\n\n\tprivate destroyController(): void {\n\t\tif (this.expandCollapseElement) {\n\t\t\tthis.expandCollapseElement.removeEventListener('click', this.expandCollapseClickHandler);\n\t\t\tthis.expandCollapseElement = null;\n\t\t}\n\t\tif (this.expandedChangedListener) {\n\t\t\tthis.group.removeEventListener('expandedChanged', this.expandedChangedListener);\n\t\t\tthis.expandedChangedListener = null;\n\t\t}\n\t\tthis.selectionCleanupFuncs.forEach(fn => fn());\n\t\tthis.selectionCleanupFuncs = [];\n\t\tthis.resizeCleanupFuncs.forEach(fn => fn());\n\t\tthis.resizeCleanupFuncs = [];\n\t\tthis.component = null!;\n\t}\n\n\tgetInstanceId(): number {\n\t\treturn this.instanceId;\n\t}\n\n\tgetGroup(): ColumnGroupNode {\n\t\treturn this.group;\n\t}\n\n\tgetColSpan(): number {\n\t\treturn this.colSpan;\n\t}\n\n\tsetExpandCollapseElement(element: HTMLElement): void {\n\t\tif (this.expandCollapseElement) {\n\t\t\tthis.expandCollapseElement.removeEventListener('click', this.expandCollapseClickHandler);\n\t\t\tthis.expandCollapseElement = null;\n\t\t}\n\t\tthis.expandCollapseElement = element;\n\t\tif (element && this.group.isExpandable()) {\n\t\t\telement.addEventListener('click', this.expandCollapseClickHandler);\n\t\t}\n\t}\n\n\tgetExpandCollapseElement(): HTMLElement | null {\n\t\treturn this.expandCollapseElement;\n\t}\n\n\tsetComponent(component: IHeaderGroupCellComponent, _element: HTMLElement): void {\n\t\tthis.component = component;\n\t\tthis.component.setHeaderName(this.group.getHeaderName());\n\t\tthis.component.setExpandable(this.group.isExpandable());\n\t\tthis.component.setExpanded(this.group.isExpanded());\n\t\tthis.component.setColSpan(this.colSpan);\n\t\tthis.component.setExpandToggleCallback(() => this.onExpandToggle());\n\t\tif (this.rowSpan > 1 && typeof this.component.setHeaderRowSpan === 'function') {\n\t\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\t\tconst treeModel = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_TREE_MODEL) as ColumnTreeModel | undefined;\n\t\t\tconst maxDepth = (optionHandler.hasColumnGroups?.() && treeModel) ? treeModel.getMaxDepth() : 1;\n\t\t\tconst rowIndex = this.rowController.getRowIndex();\n\t\t\tconst totalHeightPx = optionHandler.getColumnHeaderHeightSum(maxDepth, rowIndex, this.rowSpan);\n\t\t\tthis.component.setHeaderRowSpan(this.rowSpan, totalHeightPx);\n\t\t}\n\t\tthis.refreshWidthAndLeft();\n\t}\n\n\tgetComponent(): IHeaderGroupCellComponent {\n\t\treturn this.component;\n\t}\n\n\t/** Width = sum of displayed leaf column widths; Left = first leaf column's left (for this pin zone). */\n\trefreshWidthAndLeft(): void {\n\t\tif (!this.component) return;\n\t\tconst pinned = this.rowController.getPinned();\n\t\tconst leaves = this.group.getDisplayedLeafColumns().filter(\n\t\t\t(col: IColumnNode) => col.getPinnedPosition() === pinned\n\t\t);\n\t\tif (leaves.length === 0) return;\n\t\tconst first = leaves[0];\n\t\tconst left = first.getLeft();\n\t\tconst width = leaves.reduce((sum, col) => sum + col.getWidth(), 0);\n\t\tthis.component.setWidth(`${width}px`);\n\t\tthis.component.setLeft(`${left}px`);\n\t}\n\n\tonWidthChange(): void {\n\t\tthis.refreshWidthAndLeft();\n\t}\n\n\tonLeftChange(): void {\n\t\tthis.refreshWidthAndLeft();\n\t}\n\n\tafterGuiAttached(): void {\n\t\tconst eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER);\n\t\tif (eventHandler) {\n\t\t\tthis.addListener(eventHandler, 'columnSelectionChanged', () => this.onColumnSelectionChanged());\n\t\t}\n\t\tthis.expandedChangedListener = () => {\n\t\t\tthis.updateExpandState();\n\t\t\tthis.refreshWidthAndLeft();\n\t\t};\n\t\tthis.group.addEventListener('expandedChanged', this.expandedChangedListener);\n\t\tthis.onColumnSelectionChanged();\n\t\tthis.refreshWidthAndLeft();\n\t\tthis.updateExpandState();\n\t}\n\n\tprivate updateExpandState(): void {\n\t\tif (!this.component) return;\n\t\tthis.component.setExpandable(this.group.isExpandable());\n\t\tthis.component.setExpanded(this.group.isExpanded());\n\t}\n\n\t/** Called when expand/collapse icon is clicked. */\n\tonExpandToggle(): void {\n\t\tif (!this.group.isExpandable()) return;\n\t\tconst api = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_GROUP_API, true);\n\t\tif (api) api.toggleColumnGroup(this.group.getGroupId());\n\t}\n\n\tprivate onColumnSelectionChanged(): void {\n\t\tif (!this.component) return;\n\t\tconst columnSelection = this.getBeanInstanceByBeanName('columnSelection', true) as IColumnSelection | undefined;\n\t\tif (!columnSelection) return;\n\t\tconst groupId = this.group.getGroupId();\n\t\tconst selected = columnSelection.isColumnGroupSelected(groupId);\n\t\tconst partial = columnSelection.isColumnGroupPartiallySelected(groupId);\n\t\tthis.component.addOrRemoveCssClass('ZG-columnGroup-selected', selected);\n\t\tthis.component.addOrRemoveCssClass('ZG-columnGroup-partial-selected', partial);\n\t}\n\n\tregisterColumnSelection(element: HTMLElement): void {\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tif (optionHandler.getColumnSelection() === 'none') return;\n\n\t\tconst columnSelection = this.getBeanInstanceByBeanName('columnSelection') as IColumnSelection;\n\t\tconst groupId = this.group.getGroupId();\n\n\t\tconst onMouseDown = (event: Event) => { event.preventDefault(); };\n\t\tconst onClick = () => {\n\t\t\tcolumnSelection.setColumnGroupSelected({\n\t\t\t\tgroupId,\n\t\t\t\tnewValue: true,\n\t\t\t\tsource: 'ui',\n\t\t\t});\n\t\t};\n\n\t\telement.addEventListener('mousedown', onMouseDown);\n\t\telement.addEventListener('click', onClick);\n\n\t\tthis.selectionCleanupFuncs.push(\n\t\t\t() => element.removeEventListener('mousedown', onMouseDown),\n\t\t\t() => element.removeEventListener('click', onClick),\n\t\t);\n\t}\n\n\tprivate groupFloatingCue: HTMLElement | null = null;\n\n\tprivate createGroupFloatingCue(gridRoot: HTMLElement, resizeElement: HTMLElement): HTMLElement {\n\t\tconst wrapper = document.createElement('div');\n\t\twrapper.className = 'ZG-resizeFloatingCue';\n\t\tconst cueWrapper = document.createElement('div');\n\t\tcueWrapper.className = 'ZG-resizeCueSec-wrapper';\n\t\tcueWrapper.appendChild(resizeElement.cloneNode(true));\n\t\twrapper.appendChild(cueWrapper);\n\t\tgridRoot.appendChild(wrapper);\n\t\treturn wrapper;\n\t}\n\n\tprivate positionGroupFloatingCue(mouseX: number, gridRoot: HTMLElement, cellElement: HTMLElement): void {\n\t\tif (!this.groupFloatingCue) return;\n\t\tconst gridRect = gridRoot.getBoundingClientRect();\n\t\tconst cellRect = cellElement.getBoundingClientRect();\n\t\tconst topOffset = cellRect.top - gridRect.top;\n\t\tthis.groupFloatingCue.style.left = `${mouseX - gridRect.left}px`;\n\t\tthis.groupFloatingCue.style.top = `${topOffset}px`;\n\t\tthis.groupFloatingCue.style.height = `${gridRect.height - topOffset}px`;\n\t\tthis.groupFloatingCue.style.setProperty('--cell-height', `${cellRect.height}px`);\n\t}\n\n\tprivate removeGroupFloatingCue(): void {\n\t\tif (this.groupFloatingCue) {\n\t\t\tthis.groupFloatingCue.remove();\n\t\t\tthis.groupFloatingCue = null;\n\t\t}\n\t}\n\n\tregisterResizeElement(element: HTMLElement): void {\n\t\tconst pinned = this.rowController.getPinned();\n\t\tconst columnApi = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_API) as IColumnAPIManager;\n\t\tconst optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as GridOptioHandler;\n\t\tconst useCueMode = optionHandler.isResizeCueEnabled();\n\t\tlet initialLeafWidths: { id: string; width: number }[] | null = null;\n\t\tlet requestID: number | undefined;\n\t\tlet startMouseX = 0;\n\t\tlet initialGroupWidth = 0;\n\n\t\tconst getLeaves = (): IColumnNode[] =>\n\t\t\tthis.group.getDisplayedLeafColumns().filter(\n\t\t\t\t(col: IColumnNode) => col.getPinnedPosition() === pinned\n\t\t\t);\n\n\t\tconst hasResizableLeaf = getLeaves().some(col => col.isResizable());\n\t\tif (!hasResizableLeaf) return;\n\n\t\tconst calculateGroupWidth = (mouseEvent: MouseEvent): number => {\n\t\t\tconst groupEl = this.component.getElement();\n\t\t\tconst rect = groupEl.getBoundingClientRect();\n\t\t\tconst isRTL = optionHandler.isRTL();\n\t\t\tlet newWidth: number;\n\t\t\tif (isRTL) {\n\t\t\t\tnewWidth = (rect.x + rect.width) - mouseEvent.clientX;\n\t\t\t} else {\n\t\t\t\tnewWidth = mouseEvent.clientX - rect.x;\n\t\t\t}\n\t\t\treturn Math.max(newWidth, getLeaves().length * 30);\n\t\t};\n\n\t\tconst distributeWidth = (newGroupWidth: number, hookMeta: any) => {\n\t\t\tif (!initialLeafWidths) return;\n\t\t\tconst initialTotal = initialLeafWidths.reduce((s, l) => s + l.width, 0);\n\t\t\tconst ratio = newGroupWidth / initialTotal;\n\t\t\tconst widthOptions = initialLeafWidths.map(leaf => ({\n\t\t\t\tcolumnId: leaf.id,\n\t\t\t\tcolumnWidth: Math.max(30, Math.round(leaf.width * ratio)),\n\t\t\t}));\n\t\t\tcolumnApi.setColumnsWidthById(widthOptions, {}, hookMeta);\n\t\t};\n\n\t\tconst getGridRoot = (): HTMLElement => {\n\t\t\treturn this.component.getElement().closest('.ZG-rootWrapperBody') as HTMLElement\n\t\t\t\t?? this.component.getElement().closest('.ZG-gridScrollHolder') as HTMLElement;\n\t\t};\n\n\t\tconst dragAndDropHandler = this.getBeanInstanceByBeanName('dragAndDropHandler') as any;\n\n\t\tconst dragSource = {\n\t\t\tdisableYaxis: true,\n\t\t\tcontainer: element,\n\t\t\tgetGhostElement: () => null,\n\t\t\tshouldPreventMouseEvent: () => true,\n\t\t\tgetRootNode: () => window,\n\t\t\tgetDragItem: () => ({ columnIds: getLeaves().map(c => c.getID()) }),\n\t\t\tonDragStarted: (mouseEvent: MouseEvent) => {\n\t\t\t\tinitialLeafWidths = getLeaves().map(col => ({\n\t\t\t\t\tid: col.getID(),\n\t\t\t\t\twidth: col.getWidth(),\n\t\t\t\t}));\n\t\t\t\telement.classList.add('ZG-resizing');\n\t\t\t\tthis.component.addOrRemoveCssClass('ZG-column--resizing', true);\n\n\t\t\t\tconst beforeHookOptions = initialLeafWidths.map(leaf => ({\n\t\t\t\t\tcolumnId: leaf.id,\n\t\t\t\t\tcolumnWidth: leaf.width,\n\t\t\t\t}));\n\t\t\t\tcolumnApi.setColumnsWidthById(beforeHookOptions, {}, {\n\t\t\t\t\tevent: mouseEvent,\n\t\t\t\t\tstopAfterAction: true,\n\t\t\t\t\tuseApiCaller: false,\n\t\t\t\t});\n\n\t\t\t\tif (useCueMode) {\n\t\t\t\t\tinitialGroupWidth = initialLeafWidths.reduce((s, l) => s + l.width, 0);\n\t\t\t\t\tstartMouseX = mouseEvent.clientX;\n\t\t\t\t\tconst gridRoot = getGridRoot();\n\t\t\t\t\tif (gridRoot) {\n\t\t\t\t\t\tthis.groupFloatingCue = this.createGroupFloatingCue(gridRoot, element);\n\t\t\t\t\t\tthis.positionGroupFloatingCue(mouseEvent.clientX, gridRoot, this.component.getElement());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonDragging: (mouseEvent: MouseEvent) => {\n\t\t\t\trequestID = requestAnimationFrame(() => {\n\t\t\t\t\tif (useCueMode) {\n\t\t\t\t\t\tconst gridRoot = getGridRoot();\n\t\t\t\t\t\tif (gridRoot) {\n\t\t\t\t\t\t\tthis.positionGroupFloatingCue(mouseEvent.clientX, gridRoot, this.component.getElement());\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as any;\n\t\t\t\t\t\tconst newWidth = calculateGroupWidth(mouseEvent);\n\t\t\t\t\t\tconst hookMeta = {\n\t\t\t\t\t\t\tevent: mouseEvent,\n\t\t\t\t\t\t\tisOnHookAction: true,\n\t\t\t\t\t\t\tstopBeforeAction: true,\n\t\t\t\t\t\t\tstopAfterAction: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tdistributeWidth(newWidth, hookMeta);\n\t\t\t\t\t\trowRenderController.refreshColumnAfterModelUpdate({ fromColumnResize: true });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tonDragStopped: (mouseEvent: MouseEvent) => {\n\t\t\t\tif (requestID) cancelAnimationFrame(requestID);\n\t\t\t\telement.classList.remove('ZG-resizing');\n\t\t\t\tthis.component.addOrRemoveCssClass('ZG-column--resizing', false);\n\n\t\t\t\tif (useCueMode) {\n\t\t\t\t\tthis.removeGroupFloatingCue();\n\t\t\t\t\tconst isRTL = optionHandler.isRTL();\n\t\t\t\t\tconst deltaX = mouseEvent.clientX - startMouseX;\n\t\t\t\t\tconst newGroupWidth = Math.max(\n\t\t\t\t\t\tinitialGroupWidth + (isRTL ? -deltaX : deltaX),\n\t\t\t\t\t\tgetLeaves().length * 30\n\t\t\t\t\t);\n\t\t\t\t\tconst hookMeta = {\n\t\t\t\t\t\tevent: mouseEvent,\n\t\t\t\t\t\tisOnHookAction: true,\n\t\t\t\t\t\tstopBeforeAction: true,\n\t\t\t\t\t\tstopAfterAction: true,\n\t\t\t\t\t};\n\t\t\t\t\tdistributeWidth(newGroupWidth, hookMeta);\n\t\t\t\t}\n\n\t\t\t\tconst rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) as any;\n\t\t\t\trowRenderController.refreshColumnAfterModelUpdate({ fromColumnResize: true });\n\t\t\t\tconst afterHookOptions = getLeaves().map(col => ({\n\t\t\t\t\tcolumnId: col.getID(),\n\t\t\t\t\tcolumnWidth: col.getWidth(),\n\t\t\t\t}));\n\t\t\t\tcolumnApi.setColumnsWidthById(afterHookOptions, {}, { event: mouseEvent, stopBeforeAction: true });\n\t\t\t\tinitialLeafWidths = null;\n\t\t\t},\n\t\t\tonDragCancelled: () => {\n\t\t\t\tif (requestID) cancelAnimationFrame(requestID);\n\t\t\t\telement.classList.remove('ZG-resizing');\n\t\t\t\tthis.component.addOrRemoveCssClass('ZG-column--resizing', false);\n\t\t\t\tthis.removeGroupFloatingCue();\n\t\t\t\tif (initialLeafWidths) {\n\t\t\t\t\tconst restoreOptions = initialLeafWidths.map(leaf => ({\n\t\t\t\t\t\tcolumnId: leaf.id,\n\t\t\t\t\t\tcolumnWidth: leaf.width,\n\t\t\t\t\t}));\n\t\t\t\t\tcolumnApi.setColumnsWidthById(restoreOptions, {}, { event: null, stopBeforeAction: true });\n\t\t\t\t}\n\t\t\t\tinitialLeafWidths = null;\n\t\t\t},\n\t\t};\n\n\t\tdragAndDropHandler.addDragSource(dragSource, true);\n\n\t\tthis.resizeCleanupFuncs.push(() => {\n\t\t\tdragAndDropHandler.removeDragSource(dragSource);\n\t\t});\n\t}\n}\n","import { Component, PostConstruct } from '@dg/corecomponent';\nimport type { HeaderPaddingCellController, IHeaderPaddingCellComponent } from './HeaderPaddingCellController';\n\nfunction getTemplate(): HTMLElement {\n\tconst div = document.createElement('div');\n\tdiv.className = 'ZG-headerPaddingCell';\n\tdiv.setAttribute('role', 'columnheader');\n\treturn div;\n}\n\nexport class HeaderPaddingCellComponent extends Component implements IHeaderPaddingCellComponent {\n\tprivate controller: HeaderPaddingCellController;\n\n\tconstructor(controller: HeaderPaddingCellController, _eRow: HTMLElement) {\n\t\tsuper();\n\t\tthis.controller = controller;\n\t\tconst el = getTemplate();\n\t\tthis.setTemplate(el);\n\t}\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tthis.controller.setComponent(this, this.getGui());\n\t}\n\n\tsetWidth(width: string): void {\n\t\tthis.getGui().style.width = width;\n\t}\n\n\tsetLeft(left: string): void {\n\t\tthis.getGui().style.left = left;\n\t}\n\n\tgetElement(): HTMLElement {\n\t\treturn this.getGui();\n\t}\n}\n","import { EventEmitter } from '@dg/corecomponent';\nimport type { IHeaderRowController } from '../Row/Interface/IHeaderRowController';\nimport type { IColumnNode } from '../../../Core/Interface/IColumnNode';\n\nlet instanceIdSeq = 0;\n\nexport interface IHeaderPaddingCellComponent {\n\tgetElement(): HTMLElement;\n\tsetWidth(width: string): void;\n\tsetLeft(left: string): void;\n}\n\nexport class HeaderPaddingCellController extends EventEmitter {\n\tprivate _rowController: IHeaderRowController;\n\tprivate colSpan: number;\n\tprivate instanceId = instanceIdSeq++;\n\tprivate columnNode: IColumnNode | undefined;\n\n\tconstructor(rowController: IHeaderRowController, colSpan: number, columnNode?: IColumnNode) {\n\t\tsuper();\n\t\tthis._rowController = rowController;\n\t\tthis.colSpan = colSpan;\n\t\tthis.columnNode = columnNode;\n\t}\n\n\tgetInstanceId(): number {\n\t\treturn this.instanceId;\n\t}\n\n\tgetColSpan(): number {\n\t\treturn this.colSpan;\n\t}\n\n\tgetRowController(): IHeaderRowController {\n\t\treturn this._rowController;\n\t}\n\n\tsetComponent(component: IHeaderPaddingCellComponent, _element: HTMLElement): void {\n\t\t(this as any)._component = component;\n\t\tthis.refreshWidthAndLeft();\n\t}\n\n\trefreshWidthAndLeft(): void {\n\t\tconst comp = (this as any)._component as IHeaderPaddingCellComponent | undefined;\n\t\tif (!comp || !this.columnNode) return;\n\t\tcomp.setWidth(`${this.columnNode.getWidth()}px`);\n\t\tcomp.setLeft(`${this.columnNode.getLeft()}px`);\n\t}\n\n\tonWidthChange(): void {\n\t\tthis.refreshWidthAndLeft();\n\t}\n\n\tonLeftChange(): void {\n\t\tthis.refreshWidthAndLeft();\n\t}\n\n\tafterGuiAttached(): void {\n\t\tthis.refreshWidthAndLeft();\n\t}\n}\n","import { Component, PostConstruct } from \"@dg/corecomponent\";\nimport { GridHeaderController } from \"./GridHeaderController\";\n\nexport class GridHeader extends Component {\n    static getTemplate: () => HTMLElement;\n    \n\n    @PostConstruct()\n    init() {\n        this.setTemplate(GridHeader.getTemplate());\n\n        const comp = {\n            getElement : () => this.getGui()\n        }\n\n        const controller = this.createManagedBean(new GridHeaderController());\n        controller.setComponent(comp);\n    }\n\n    getScrollTop(): number {\n        return this.getGui().scrollTop;\n    }\n}\n","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, setDisplayed } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../Core/Constants/BeanName\";\nimport { IControllerHandler } from \"../../Core/Interface/IControllerHandler\";\n\nexport class GridHeaderController extends EventEmitter {\n    private comp : any;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n    setComponent(component : any) : void {\n        this.comp = component;\n        this.setDisplayed();\n\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        controllerHandler.registerGridHeaderController(this);\n    }\n\n    private setDisplayed() : void {\n        const isColumnHeader = this.optionsHandler.isColumnHeader();\n\n        setDisplayed(this.comp.getElement(), isColumnHeader);\n    }\n}","import { Component, PostConstruct } from \"@dg/corecomponent\";\nimport { HeaderCellComponent } from \"../Cell/HeaderCellComponent\";\nimport { HeaderCellController } from \"../Cell/HeaderCellController\";\nimport { HeaderGroupCellComponent } from \"../Cell/HeaderGroupCellComponent\";\nimport { HeaderGroupCellController } from \"../Cell/HeaderGroupCellController\";\nimport { HeaderPaddingCellComponent } from \"../Cell/HeaderPaddingCellComponent\";\nimport { HeaderPaddingCellController } from \"../Cell/HeaderPaddingCellController\";\nimport { IHeaderRowController } from \"./Interface/IHeaderRowController\";\n\nexport type HeaderCellControllerUnion = HeaderCellController | HeaderGroupCellController | HeaderPaddingCellController;\n\nfunction getTemplate() {\n    const template = `<div class='ZG-headerRow' role=\"row\"></div>`;\n    const div =document.createElement('div');\n    div.innerHTML = template;\n    return div.firstChild as HTMLElement \n}\nexport class HeaderRowComponent extends Component {\n    private controller : IHeaderRowController;\n    private headerCellComponents : { [id : string] : HeaderCellComponent | HeaderGroupCellComponent | HeaderPaddingCellComponent } = {}\n    constructor(controller : IHeaderRowController) {\n        super();\n        this.controller = controller;\n        this.setTemplate(getTemplate());\n    }\n\n    @PostConstruct()\n    init() {\n        const rowType = (this.controller as { getRowType?: () => string }).getRowType?.();\n        if (rowType === 'group') {\n            this.getGui().classList.add('ZG-headerGroupRow');\n        }\n        const component = {\n            setCellControllers : (controllers : HeaderCellControllerUnion[]) => this.setCellControllers(controllers),\n            setHeight : (height : string) => this.setHeight(height),\n            setWidth : (width : string) => this.setWidth(width),\n            getElement : () => this.getGui()\n        }\n\n        this.controller.setComponent(component);\n    }\n\n    private setHeight(height : string) : void {\n        this.getGui().style.height = height;\n    }\n\n    private setWidth(width : string) : void {\n        this.getGui().style.width = width;\n    }\n\n    private setCellControllers(controllers : HeaderCellControllerUnion[]) {\n        const oldCellComponents = this.headerCellComponents;\n        this.headerCellComponents = {};       \n\n        controllers.forEach((controller) => {\n            const id = String(controller.getInstanceId());\n            const existingComponent =  oldCellComponents[id];\n            delete oldCellComponents[id];\n\n            let cellComponent: HeaderCellComponent | HeaderGroupCellComponent | HeaderPaddingCellComponent;\n\n            if(existingComponent) {\n                cellComponent = existingComponent;\n            }\n            else {\n                if (controller instanceof HeaderGroupCellController) {\n                cellComponent = this.createBean(new HeaderGroupCellComponent(controller, this.getGui()));\n                } else if (controller instanceof HeaderPaddingCellController) {\n                    cellComponent = this.createBean(new HeaderPaddingCellComponent(controller, this.getGui()));\n                } else {\n                    cellComponent = this.createBean(new HeaderCellComponent(controller, this.getGui()));\n                }\n            }\n            cellComponent.setParentComponent(this);\n            this.appendChild(cellComponent);\n            this.headerCellComponents[id] = cellComponent;\n\n            this.controller.isDomRenderer() && controller.afterGuiAttached();\n        });\n\n        Object.values(oldCellComponents).forEach((component) => {\n            this.getGui().removeChild(component.getGui());\n\t\t\tthis.destroyBean(component);\n        })\n\n    }\n\n    public  destroy(): void {\n        this.setCellControllers([]);\n        super.destroy();\n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\nimport { Events } from \"../../../Core/Constants/Events\";\nimport { columnPinPositions } from \"../../../Core/Constants/GridConfigurationConstants\";\nimport { IColumnNode } from \"../../../Core/Interface/IColumnNode\";\nimport { HeaderCellController } from \"../Cell/HeaderCellController\";\nimport { HeaderGroupCellController } from \"../Cell/HeaderGroupCellController\";\nimport { HeaderPaddingCellController } from \"../Cell/HeaderPaddingCellController\";\nimport { IHeaderRowController } from \"./Interface/IHeaderRowController\";\nimport type { ColumnTreeModel } from \"../../../../nested-header/column-tree-model\";\nimport type { ColumnGroupNode } from \"../../../../nested-header/column-group-node\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { ColumnDragHandler, IColumnDragItem } from \"../column-drag/column-drag-handler\";\nimport { IDropTarget } from \"../../../../DragAndDrop-handler/dragAndDrop-handler.types\";\nimport { DragAndDropHandler } from \"../../../../DragAndDrop-handler/dragAndDrop-handler\";\nimport { ColumnVisibleHandlerType } from \"../../../Core/Columns/column-visible-handler.types\";\nimport { RowContainerEventHandler } from \"../../GridBodyComponent/RowContainer/RowContainerEventHandler\";\nimport { RowMeta } from \"../../GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { IRowNodeCore } from \"../../../../DataStore/rownode.types\";\nimport { IRowNode } from \"../../../Main\";\nimport { IControllerHandler } from \"../../../Core/Interface/IControllerHandler\";\nimport { requestAutoColumnHeaderHeightRefresh } from \"../column-header-auto-height\";\nlet instanceIdSequence = 0;\n\nexport type HeaderRowType = 'group' | 'leaf';\n\nexport class HeaderRowController extends EventEmitter implements IHeaderRowController {\n    private rowIndex: number;\n    private pinned: columnPinPositions;\n    private rowType: HeaderRowType;\n    private instanceId = instanceIdSequence++;\n    public domRenderer : boolean = false;\n\n    private headerCellCtrls:  { [key: string]: HeaderCellController } = {};\n    private allCellControllers: (HeaderCellController | HeaderGroupCellController | HeaderPaddingCellController)[] = [];\n    rowNode               : IRowNode;\n\n\t@AutoWired('dragAndDropHandler') private dragAndDropHandler : DragAndDropHandler<any>\n\n    private component !: any;\n\n    public dragHandler : IDropTarget<IColumnDragItem> | null = null;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    constructor(rowIndex: number, pinned: columnPinPositions, rowType: HeaderRowType = 'leaf') {\n        super();\n        this.rowIndex = rowIndex;\n        this.pinned   = pinned;\n        this.rowType  = rowType;\n    }\n\n    getRowType(): HeaderRowType {\n        return this.rowType;\n    }  \n\n\n    setComponent(component : any) : void {\n        this.component = component;\n        const treeModel = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_TREE_MODEL) as ColumnTreeModel | undefined;\n        const maxDepth = (this.optionsHandler.hasColumnGroups?.() && treeModel) ? treeModel.getMaxDepth() : 1;\n        const props = {\n            rowIndex: this.rowIndex,\n            rowType: this.rowType,\n            level: this.rowIndex,\n            maxDepth,\n        };\n        this.setRowNode();\n        const headerHeight = this.optionsHandler.getColumnHeaderHeight(props);\n        this.component.setHeight(`${headerHeight}px`);\n        this.onWidthChanged();\n\n        this.registerDragHandler();\n        this.createManagedBean(new RowContainerEventHandler(component.getElement()));\n        this.onDisplayedColumnsChanged();\n        this.requestAutoColumnHeaderHeightRefresh();\n    }\n\n    registerDragHandler() : void {\n        this.dragHandler = this.createBean(new ColumnDragHandler(this.pinned, this.component.getElement()));\n        this.dragAndDropHandler.addDropTarget(this.dragHandler);\n\n        this.addDestroyFunc(() => {\n            if (this.dragHandler) {\n                this.dragAndDropHandler.removeDropTarget(this.dragHandler);\n                this.dragHandler = null;\n            }\n        })\n    }\n\n    @PostConstruct()\n    init() {\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_CHANGED, this.onDisplayedColumnsChanged.bind(this))\n        this.addListener(this.eventHandler, Events.EVENT_LEFT_CHANGED, this.onLeftChange.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_WIDTH_CHANGED, this.onWidthChange.bind(this));\n\n        this.addListener(this.eventHandler, Events.EVENT_DISPLAYED_COLUMNS_WIDTH_CHANGED, this.onWidthChanged.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_REORDERED, this.onColumnReordered.bind(this));\n    }\n\n    private onColumnReordered(): void {\n        this.getAllCellControllers().forEach((controller) => {\n            if ('updateClassNames' in controller && typeof (controller as HeaderCellController).updateClassNames === 'function') {\n                (controller as HeaderCellController).updateClassNames();\n            }\n        });\n    }\n\n    getAllCellControllers(): (HeaderCellController | HeaderGroupCellController | HeaderPaddingCellController)[] {\n        return this.allCellControllers.length ? this.allCellControllers : Object.values(this.headerCellCtrls);\n    }\n\n    setRowNode(): IRowNodeCore {\n\t\tconst recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER)\n\t\t      this.rowNode  = recordHandler.getHeaderHandler().getRowNode(0);\n\t\treturn this.rowNode;\n\t}\n\n    private onWidthChanged() : void {\n        const width = this.getFullWidth();\n\n        const widthInpPixel = width != null ? `${width}px` : ''\n\n        this.component.setWidth(widthInpPixel)\n        this.requestAutoColumnHeaderHeightRefresh();\n\n    }\n\n    private onDisplayedColumnsChanged() : void {\n        const controllers = this.createAllCellController();\n        this.component.setCellControllers(controllers);\n        this.requestAutoColumnHeaderHeightRefresh();\n    }\n\n    getInstanceId(): number {\n        return this.instanceId;\n    }\n\n    private createAllCellController(): (HeaderCellController | HeaderGroupCellController | HeaderPaddingCellController)[] {\n        if (this.rowType === 'group') {\n            const treeModel = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_TREE_MODEL) as ColumnTreeModel | undefined;\n            if (!treeModel) {\n                this.allCellControllers = [];\n                return [];\n            }\n            const items = treeModel.getColumnsForHeaderRow(this.rowIndex, this.pinned);\n            this.headerCellCtrls = {};\n            this.allCellControllers = items.map((item) => {\n                if (item.type === 'group' && item.node) {\n                    const ctrl = this.createManagedBean(new HeaderGroupCellController(item.node as ColumnGroupNode, this, item.colSpan, item.rowSpan));\n                    this.headerCellCtrls[`g-${ctrl.getInstanceId()}`] = ctrl as any;\n                    return ctrl;\n                }\n                if (item.type === 'leaf' && item.node) {\n                    const ctrl = this.createManagedBean(new HeaderCellController(item.node as IColumnNode, this));\n                    this.headerCellCtrls[(item.node as IColumnNode).getID()] = ctrl;\n                    return ctrl;\n                }\n                const ctrl = this.createManagedBean(new HeaderPaddingCellController(this, item.colSpan, (item.node as IColumnNode) ?? undefined));\n                this.headerCellCtrls[`p-${ctrl.getInstanceId()}`] = ctrl as any;\n                return ctrl;\n            });\n            return this.allCellControllers;\n        }\n        const treeModel = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_TREE_MODEL) as ColumnTreeModel | undefined;\n        const hasNestedHeaders = treeModel && treeModel.getMaxDepth() > 1;\n\n        if (hasNestedHeaders) {\n            const items = treeModel!.getColumnsForHeaderRow(this.rowIndex, this.pinned);\n            const leafItems = items.filter((item) => item.type === 'leaf' && item.node);\n            const previousCellControllers = this.headerCellCtrls;\n            this.headerCellCtrls = {};\n            leafItems.forEach((item) => {\n                const column = item.node as IColumnNode;\n                const columnID = column.getID();\n                let headerCellController = previousCellControllers[columnID];\n                delete previousCellControllers[columnID];\n\n                if (headerCellController && headerCellController.getColumn() !== column) {\n                    this.destroyBean(headerCellController);\n                    headerCellController = null;\n                }\n\n                if (headerCellController == null) {\n                    headerCellController = this.createManagedBean(new HeaderCellController(column, this, item.rowSpan));\n                } else if (typeof (headerCellController as HeaderCellController).setHeaderRowSpan === 'function') {\n                    (headerCellController as HeaderCellController).setHeaderRowSpan?.(item.rowSpan);\n                }\n                this.headerCellCtrls[columnID] = headerCellController;\n            });\n            Object.values(previousCellControllers).forEach((ctrl) => {\n                if (ctrl.isEditing()) {\n                    const columnID = ctrl.getColumn().getID();\n                    this.headerCellCtrls[columnID] = ctrl;\n                } else {\n                    this.destroyBean(ctrl);\n                }\n            });\n            this.allCellControllers = Object.values(this.headerCellCtrls);\n            return this.allCellControllers;\n        }\n\n        const columnVisibleHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_VISIBLE_HANDLER) as ColumnVisibleHandlerType;\n        const fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n        const columns = this.shouldRenderAllColumnsForAutoColumnHeaderHeight()\n            ? fieldHandler.getDisplayedCenterColumns()\n            : (columnVisibleHandler.getDisplayedColumns(this.rowIndex, this.pinned) as IColumnNode[]);\n        const leafControllers = this.createCellController(columns);\n        this.allCellControllers = leafControllers;\n        return leafControllers;\n    }\n\n    private shouldRenderAllColumnsForAutoColumnHeaderHeight(): boolean {\n        return this.pinned === 'center'\n            && typeof this.optionsHandler?.isAutoColumnHeaderHeight === 'function'\n            && this.optionsHandler?.isAutoColumnHeaderHeight();\n    }\n\n    private createCellController(columns : IColumnNode[]) {\n        const previousCellControllers = this.headerCellCtrls\n        this.headerCellCtrls = {};\n        columns.forEach((column) => {\n            const columnID = column.getID();\n\n            let headerCellController = previousCellControllers[columnID];\n            delete previousCellControllers[columnID];\n\n            if(headerCellController && headerCellController.getColumn() != column) {\n                this.destroyBean(headerCellController);\n                headerCellController = null;\n            }\n\n            if(headerCellController == null ){\n                headerCellController = this.createBean(new HeaderCellController(column, this))\n            }\n            \n            this.headerCellCtrls[columnID] = headerCellController;\n        })\n\n        Object.values(previousCellControllers).forEach((column) => {\n            if(column.isEditing()) {\n                const columnID = column.getColumn().getID();\n                this.headerCellCtrls[columnID] = column;\n            }\n            this.destroyBean(column);\n        })\n\n        return Object.values(this.headerCellCtrls);\n    }\n\n    getPinned() : columnPinPositions {\n        return this.pinned;\n    }\n\n    getRowIndex() : number {\n        return this.rowIndex;\n    }\n\n    private onLeftChange(): void {\n        this.getAllCellControllers().forEach((controller) => {\n            if ('onLeftChange' in controller && typeof (controller as HeaderCellController).onLeftChange === 'function') {\n                (controller as HeaderCellController).onLeftChange();\n            }\n        });\n    }\n\n    private onWidthChange(): void {\n        this.getAllCellControllers().forEach((controller) => {\n            if ('onWidthChange' in controller && typeof (controller as HeaderCellController).onWidthChange === 'function') {\n                (controller as HeaderCellController).onWidthChange();\n            }\n        });\n        this.requestAutoColumnHeaderHeightRefresh();\n    }\n\n    getCellController(columnID : string) : HeaderCellController {\n        return this.headerCellCtrls[columnID];\n    }\n\n    private getFullWidth() : number {\n        const fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n\n        const columnPinnedPosition = this.getPinned();\n\n        switch (columnPinnedPosition) {\n            case 'rowHeader':\n                return fieldHandler.getDisplayedColumnsHeaderWidth();\n            case 'left':\n                return fieldHandler.getDisplayedColumnsLeftWidth();\n            case 'center':\n                return fieldHandler.getBodyContainerWidth();\n            case 'right':\n                return fieldHandler.getDisplayedColumnsRightWidth();\n            default:\n                return fieldHandler.getBodyContainerWidth();\n\t\t}\n    }\n\n     destroy(): void {\n        const cellControllers = Object.values(this.headerCellCtrls);\n        cellControllers.forEach((controller) => {\n            if (controller) {\n                this.destroyBean(controller);\n            }\n        });\n        this.headerCellCtrls = {};\n\n        if (this.dragHandler) {\n            this.dragAndDropHandler.removeDropTarget(this.dragHandler);\n            this.dragHandler = null;\n        }\n\n        super.destroy();\n\n        this.component = null;\n        this.rowNode = null;\n    }\n\n    getRowPosition() : RowMeta{\n        const {rowIndex, parentKeys, pinPosition} = this.rowNode.getRowMeta();\n        return {\n            rowID           : this.rowNode.getId(),\n            rowIndex        : rowIndex,\n            parentKeys      : parentKeys,\n            pinPosition     : pinPosition,\n            absoluteRowIndex: rowIndex,\n            rowType         : 'headerRow'\n        }\n    }\n\n    afterGuiAttached(): void {\n        this.domRenderer = true;\n        this.getAllCellControllers().forEach((cell) => {\n            cell.afterGuiAttached?.();\n        });\n        this.requestAutoColumnHeaderHeightRefresh();\n    }\n\n    private requestAutoColumnHeaderHeightRefresh(): void {\n        const controllerHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER) as IControllerHandler;\n        const recordHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER);\n        const fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n        requestAutoColumnHeaderHeightRefresh(\n            controllerHandler,\n            this.optionsHandler,\n            recordHandler,\n            this.eventHandler,\n            fieldHandler,\n        );\n    }\n\n    isDomRenderer(): boolean {\n        return this.domRenderer;\n    }\n\n    public refreshAutoRowHeight(): void {\n\t}\n\n}","import { Component, PostConstruct } from \"@dg/corecomponent\";\nimport { columnPinPositions } from \"../../../Core/Constants/GridConfigurationConstants\";\nimport { queryAssignedNodes } from \"../../../Core/Decorator/ReferenceSelector\";\nimport { setFixedWidth } from \"../../../Core/utils/Dom\";\nimport { HeaderRowComponent } from \"../Row/HeaderRowComponent\";\nimport { IHeaderRowController } from \"../Row/Interface/IHeaderRowController\";\nimport { IRowHeaderContainerComponent, RowHeaderContainerController } from \"./RowHeaderContainerController\";\n\nexport class RowHeaderContainerComponent extends Component {\n    private readonly pinned: columnPinPositions;\n    static getTemplate : (pinned : columnPinPositions) => HTMLElement;\n\n    @queryAssignedNodes('eViewPortContainer') private eViewPortContainer !: HTMLElement;\n\n    private headerRowComponents: {[id: string]: HeaderRowComponent} = {};\n\n\n    constructor() {\n        super();\n        this.pinned = Component.elementGettingCreated.getAttribute('name') as columnPinPositions;\n    }\n\n    \n\n    @PostConstruct()\n    init() : void {    \n        const template = RowHeaderContainerComponent.getTemplate(this.pinned);\n\n        this.setTemplate(template);\n\n        const component: IRowHeaderContainerComponent = {\n            setDisplayed           : (displayed : boolean) => this.setDisplayed(displayed),\n            setControllers         : (controllers : IHeaderRowController[]) => this.setControllers(controllers),\n            setCenterWidth         : (width : string) => this.eViewPortContainer.style.width = width,\n            setViewportScrollLeft  : (left : number) => this.getGui().scrollLeft = left,\n            setPinnedContainerWidth: (width : string) =>  setFixedWidth(this.getGui(), width)\n        };\n        const controller = this.createManagedBean(new RowHeaderContainerController(this.pinned));\n        controller.setComponent(component, this.getGui());\n    }\n\n    private setControllers(controllers : IHeaderRowController[]) : void {\n        const oldRowComponents = this.headerRowComponents;\n        this.headerRowComponents = {};\n        controllers.forEach((controller) => {\n            const id = controller.getInstanceId();\n            const existingComponent =  oldRowComponents[id];\n            delete oldRowComponents[id];\n\n            const rowComp = existingComponent ? existingComponent : this.createBean(new HeaderRowComponent(controller));\n            this.headerRowComponents[id] = rowComp;\n            rowComp.setParentComponent(this);\n            this.appendChild(rowComp, this.eViewPortContainer)\n            controller.afterGuiAttached();\n        })\n\n        Object.values(oldRowComponents).forEach((oldRowComp: HeaderRowComponent) => {\n            const parentElement = this.eViewPortContainer ?? this.getGui();\n\t\t\tparentElement.removeChild(oldRowComp.getGui());\n            this.destroyBean(oldRowComp);\n\t\t});\n    }\n\n    getScrollTop() : number {\n        return this.getGui().scrollTop;\n    }\n}\n","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { columnPinPositions } from \"../../../Core/Constants/GridConfigurationConstants\";\nimport { CenterWidthHandler } from \"../../GridBodyComponent/RowContainer/CenterWidthHandler\";\nimport { LeftPinnedHandler } from \"../../GridBodyComponent/RowContainer/PinnedHandler/LeftPinnedHandler\";\nimport { RightPinnedHandler } from \"../../GridBodyComponent/RowContainer/PinnedHandler/RightPinnedHandler\";\nimport { RowHeaderHandler } from \"../../GridBodyComponent/RowContainer/PinnedHandler/RowHeaderHandler\";\nimport { HeaderRowController } from \"../Row/HeaderRowController\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { Events } from \"../../../Core/Constants/Events\";\nimport type { ColumnTreeModel } from \"../../../../nested-header/column-tree-model\";\n\nexport interface IRowHeaderContainerComponent {\n    setCenterWidth(width: string)                     : void;\n    setViewportScrollLeft(left: number)               : void;\n    setPinnedContainerWidth(width: string)            : void;\n    setDisplayed(displayed: boolean)                  : void;\n    setControllers(controller : HeaderRowController[]): void;\n}\n\n\nexport class RowHeaderContainerController extends EventEmitter {\n    private pinned : columnPinPositions;\n    \n    private component !: IRowHeaderContainerComponent;\n    private eViewport !: HTMLElement;\n\n    private columnsRowControllers: HeaderRowController[] = [];\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n    constructor(pinned : columnPinPositions) {\n        super();\n        this.pinned = pinned;\n    }\n\n    setComponent(component : IRowHeaderContainerComponent, eViewport : HTMLElement) : void {\n        this.component = component;\n        this.eViewport = eViewport;\n        this.registerController()\n        this.setUpWidth();\n\n        this.refresh();\n\n        this.component.setControllers(this.columnsRowControllers)\n        this.addListener(this.eventHandler, Events.EVENT_GRID_REFRESH, this.refreshRow.bind(this)); \n        this.addListener(this.eventHandler, 'preDestroyed', () => {\n            this.component.setControllers([]);\n        })\n    }\n\n    refreshRow() : void {\n        this.refresh();\n        this.component.setControllers(this.columnsRowControllers)\n    }\n\n    private registerController() {\n        const controller = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.CONTROLLER_HANDLER)\n        switch(this.pinned) {\n            case 'rowHeader':\n                controller.registerHeaderRowHeaderContainerController(this);\n                break;\n            case 'left':\n                controller.registerLeftRowHeaderContainerController(this);\n                break;\n            case 'center':\n                controller.registerCenterRowHeaderContainerController(this);\n                break;\n            case 'right':\n                controller.registerRightRowHeaderContainerController(this);\n                break;\n        }\n    }\n\n    setUpWidth() {\n        this.setUpCenterWidth();\n        this.setHeaderWidth();\n        this.setUpLeftWidth();\n        this.setRightWidth();\n    }\n\n    setScrollLeft(left : number) : void {\n        const isRTL = this.optionsHandler.isRTL();\n\n        if(isRTL) {\n            left *= - 1;\n        }\n        this.eViewport.scrollTo({\n            // @ts-ignore\n            behavior: \"instant\",\n            left,\n            top : 0\n        });\n    }\n\n    refresh() : void {\n        const isColumnHeader = this.optionsHandler.isColumnHeader();\n        if (!isColumnHeader) {\n            this.columnsRowControllers.forEach(ctrl => this.destroyBean(ctrl));\n            this.columnsRowControllers = [];\n            return;\n        }\n        const treeModel = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.COLUMN_TREE_MODEL) as ColumnTreeModel | undefined;\n        const hasGroups = this.optionsHandler.hasColumnGroups?.();\n        const rowCount = (hasGroups && treeModel) ? treeModel.getMaxDepth() : 1;\n        this.columnsRowControllers.forEach(ctrl => this.destroyBean(ctrl));\n        this.columnsRowControllers = [];\n        for (let i = 0; i < rowCount; i++) {\n            const rowType = (i < rowCount - 1) ? 'group' : 'leaf';\n            this.columnsRowControllers.push(this.createManagedBean(new HeaderRowController(i, this.pinned, rowType)));\n        }\n    }\n\n    private setUpCenterWidth() {\n        if (this.pinned != 'center') { return; }\n\n        this.createManagedBean(new CenterWidthHandler(width => this.component.setCenterWidth(`${width}px`), false));\n    }\n\n    private setUpLeftWidth() {\n        if(this.pinned != 'left') { return }\n        this.createManagedBean(new LeftPinnedHandler(this.eViewport));\n    }\n\n    private setRightWidth() {\n        if(this.pinned != 'right') { return }\n\n        this.createManagedBean(new RightPinnedHandler(this.eViewport));\n    }\n\n    private setHeaderWidth() {\n        if(this.pinned != 'rowHeader') { return }\n\n        this.createManagedBean(new RowHeaderHandler(this.eViewport));\n    }\n\n\n    getViewPortContainer() {\n        return this.eViewport;\n    }\n\n    getScrollLeft() : number {\n        return this.eViewport.scrollLeft;\n    }\n\n    getColumnHeaderRowController() : HeaderRowController {\n        return this.columnsRowControllers[0];\n    }\n\n    getColumnHeaderRowControllers() : HeaderRowController[] {\n        return this.columnsRowControllers;\n    }\n\n    getRowCount() : number {\n        return this.columnsRowControllers.length || 1;\n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { DraggingEvent, IDropTarget } from \"../../../../DragAndDrop-handler/dragAndDrop-handler.types\";\nimport { GridBodyScrollHandler } from \"../../../Core/GridBodyScrollHandler\";\nimport { IAutoScrollHandler, IAutoScrollOptions } from \"../../../../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler.types\";\nimport { IControllerHandler, IPaneControllerParam } from \"../../../Core/Interface/IControllerHandler\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\nimport { ReorderableAPI } from \"../../../API/ReorderableAPI/ReorderableAPI\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { ColumnHighlightPosition, IColumnNode } from \"../../../Main\";\nimport { AutoScrollHandler } from \"../../../../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler\";\nimport { columnPinPositions } from \"../../../Core/Constants/GridConfigurationConstants\";\nimport { ColumnDragEvent } from \"./column-drag-handler.types\";\nimport { GridOptioHandler } from \"../../../Core/GridOptionHandler\";\n\nexport interface IColumnDragItem {\n    columnIds : string[];\n}\nexport class ColumnDragHandler extends EventEmitter implements IDropTarget<IColumnDragItem> {\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler: IControllerHandler;\n    @AutoWired(GRID_BEAN_NAME.REORDERABLE_API) private reorderableAPI: ReorderableAPI;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler: FieldHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler: GridOptioHandler;\n\n    private lastHighlightedColumn: IColumnNode | null    = null;\n    private autoScrollHandler: IAutoScrollHandler | null = null;\n    private supportingContainer : HTMLElement[][] = []\n\n    constructor(private pinned: columnPinPositions, private container: HTMLElement) {\n        super();\n    }\n    @PostConstruct()\n    init(): void {\n        this.controllerHandler.onAfterGridReady((params: IPaneControllerParam) => {\n            const autoScrollOptions = new ColumnDragHandler.AutoScrollHandlerOptions(\n                params, \n                'x',\n                this.optionsHandler?.isSuppressHorizontalScroll() ?? false,\n                () => this.optionHandler.isRTL()\n            );\n            this.autoScrollHandler = new AutoScrollHandler(autoScrollOptions);\n\n            this.addDestroyFunc(() => {\n                this.autoScrollHandler = null;\n            });\n\n            switch (this.pinned) {\n                case 'left':\n                    this.supportingContainer = [[params.gridBodyController.getViewPortContainer(), params.leftRowContainerControl.getContainer()], [params.bottomLeftRowContainerControl.getContainer() ],[params.topLeftRowContainerControl.getContainer()]];\n                    break;\n                case 'right':\n                    this.supportingContainer = [[params.gridBodyController.getViewPortContainer(), params.rightRowContainerControl.getContainer()],[params.bottomRightRowContainerControl.getContainer()],[params.topRightRowContainerControl.getContainer()]];\n                    break;\n                case 'rowHeader':\n                    this.supportingContainer = [[params.gridBodyController.getViewPortContainer(), params.headerRowContainerControl.getContainer()],[params.bottomHeaderRowContainerControl.getContainer()],[params.topHeaderRowContainerControl.getContainer()]];\n                    break;\n                default:\n                    this.supportingContainer = [[params.gridBodyController.getViewPortContainer(), params.centerRowContainerControl.getViewPortContainer()],[params.bottomCenterRowContainerControl.getViewPortContainer()], [params.topCenterRowContainerControl.getViewPortContainer()]];\n                    break;\n            }\n        });\n    }\n    getContainer(): HTMLElement {\n        return this.container;\n    }\n    getSupportingContainers?(): HTMLElement[][] {\n        return this.supportingContainer;\n    }\n    isInterestedIn(type: string, _container: HTMLElement): boolean {\n        return ( type === 'headercell')\n    }\n    onDragEnter?(params: DraggingEvent<IColumnDragItem>): void {\n        this.dispatchDraggingEvent('columnDragEnter', params);\n        this.getColumnNodes(params).forEach((columnNode) => {\n            columnNode.updateDraggingState(true);\n        })\n        this.autoScrollHandler?.clear();\n    }\n    onDragLeave?(params: DraggingEvent<IColumnDragItem>): void {\n        this.dispatchDraggingEvent('columnDragLeave', params);\n        this.autoScrollHandler?.clear();\n        this.clearColumnHighlight();\n    }\n    onDragging?(params: DraggingEvent<IColumnDragItem>): void {\n        this.dispatchDraggingEvent('columnDragMove', params);\n        const targetColumn = this.getColumnOverNode(params);\n\n        this.clearColumnHighlight();\n        if (targetColumn) {\n            \n            const highlightPos = this.getHighlightPosition(this.getNormalisedPosition(params).x, targetColumn);\n            targetColumn.setHighlighted(highlightPos);\n            this.lastHighlightedColumn = targetColumn;\n        }\n        this.autoScrollHandler?.update(params.event);\n\n    }\n    onDragStop?(params: DraggingEvent<IColumnDragItem>): void {\n        this.dispatchDraggingEvent('columnDragEnd', params);\n        this.getColumnNodes(params).forEach((columnNode) => {\n            columnNode.updateDraggingState(false);\n        })\n        this.clearColumnHighlight();\n        this.autoScrollHandler?.clear();\n        const columnNode = this.getColumnOverNode(params);\n        const highlightPosition = this.getHighlightPosition(this.getNormalisedPosition(params).x, columnNode)\n\n        columnNode && this.reorderableAPI.moveColumnsById(params.dragItem.columnIds, columnNode.getID(),highlightPosition === 'left' ? \"before\" : 'after', {}, {eventOrigin : 'ui', event : params.event});\n    }\n\n\n    onDragCancel(params: DraggingEvent<IColumnDragItem>): void {\n        this.dispatchDraggingEvent('columnDragCancel');\n        this.getColumnNodes(params).forEach((columnNode) => {\n            columnNode.updateDraggingState(false);\n        })\n        this.autoScrollHandler?.clear();\n        this.clearColumnHighlight();\n    }\n\n    private getColumnNodes(params : DraggingEvent<IColumnDragItem>) : IColumnNode[] {\n        const dragItem = params.dragItem;\n\n        if(dragItem) {\n            const columnIds = dragItem.columnIds;\n            return columnIds.map(columnid => this.fieldHandler.getColumnNodeByID(columnid))\n        }\n\n        return [];\n    }\n\n    private clearColumnHighlight(): void {\n        if (this.lastHighlightedColumn) {\n            this.lastHighlightedColumn.setHighlighted(null);\n            this.lastHighlightedColumn = null;\n        }\n    }\n\n    public getHighlightPosition(pixel: number, columnNode?: IColumnNode): ColumnHighlightPosition {\n        const isRTL = this.optionHandler.isRTL();\n        if (!columnNode) return isRTL ? 'right' : 'left';\n\n        const columnLeft = columnNode.getLeft() ?? 0;\n        const columnWidth = columnNode.getWidth() ?? 0;\n        let adjustedPixel = pixel;\n        if (isRTL) {\n            const centerHandler = this.fieldHandler.getCenterHandler();\n            const totalWidth = centerHandler.getTotalWidth();\n            adjustedPixel = totalWidth - pixel;\n        }\n        \n        const columnCenter = columnLeft + (columnWidth / 2);\n        return adjustedPixel < columnCenter ? (isRTL ? 'right' : 'left') : (isRTL ? 'left' : 'right');\n    }\n\n    private dispatchDraggingEvent(type : string, draggingEvent?: DraggingEvent<IColumnDragItem>): void {\n        if(draggingEvent) {\n            const dragEvent = this.createColumnDragEvent(type, draggingEvent);\n\n            this.optionHandler.on(type, dragEvent);\n            return;\n        }\n        this.optionHandler.on(type, {});\n    }\n\n    private createColumnDragEvent(type: string, draggingEvent: DraggingEvent<IColumnDragItem>): ColumnDragEvent {\n        const isRTL = this.optionHandler.isRTL();\n        const { x, y } = this.getNormalisedPosition(draggingEvent);\n        const centerHandler = this.fieldHandler.getCenterHandler();\n        \n        let adjustedX = x;\n        if (isRTL) {\n            const totalWidth = centerHandler.getTotalWidth();\n            adjustedX = totalWidth - x;\n        }\n        \n        const overIndex = centerHandler.getColumnIndexByPosition(adjustedX);\n        const overNode = centerHandler.getColumnNode(overIndex);\n\n        let horizontalDirection: 'left' | 'right';\n        if (draggingEvent.horizontalDirection === 'left') {\n            horizontalDirection = isRTL ? 'right' : 'left';\n        } else if (draggingEvent.horizontalDirection === 'right') {\n            horizontalDirection = isRTL ? 'left' : 'right';\n        } else {\n            horizontalDirection = isRTL ? 'right' : 'left';\n        }\n\n        return {\n            type,\n            event: draggingEvent.event,\n            overIndex,\n            overId: overNode?.getID() ?? null,\n            columnIds: draggingEvent.dragItem.columnIds,\n            overNode,\n            nodes :draggingEvent.dragItem.columnIds.length !== 0 ? draggingEvent.dragItem.columnIds.map((id) => this.fieldHandler.getColumnNodeByID(id)) : [],\n            x,\n            y,\n            verticalDirection  : draggingEvent.verticalDirection   === 'down' ? 'down' : 'up',\n            horizontalDirection\n        };\n    }\n\n    private getColumnOverNode(draggingEvent: DraggingEvent<IColumnDragItem>): IColumnNode | null {\n        const { x } = this.getNormalisedPosition(draggingEvent);\n        const middleHandler = this.fieldHandler.getCenterHandler();\n        \n        const isRTL = this.optionHandler.isRTL();\n        let adjustedX = x;\n        \n        if (isRTL) {\n            const totalWidth = middleHandler.getTotalWidth();\n            adjustedX = totalWidth - x;\n        }\n        \n        const overIndex = middleHandler.getColumnIndexByPosition(adjustedX);\n        return middleHandler.getColumnNode(overIndex) ?? null;\n    }\n\n    private getNormalisedPosition(event: MouseEvent | DraggingEvent<IColumnDragItem>): { x: number; y: number } {\n        const e = event as MouseEvent;\n        const x = e.clientX ?? e.x;\n        const y = e.clientY ?? e.y;\n\n        const gridBodyController = this.controllerHandler.getBodyController();\n        const scrollHandler = gridBodyController.getScrollHandler();\n        const verticalPosition = scrollHandler.getVScrollPosition().top;\n\n        const bodyContainer = gridBodyController.getBodyContainer();\n        const rect = bodyContainer.getBoundingClientRect();\n        \n        let relativeX = x;\n        const relativeY = y - rect.y;\n\n        if(this.optionHandler.isRTL()) {\n            relativeX = x - rect.x;\n        }\n\n        if(this.pinned === \"left\" || this.pinned === \"rowHeader\") {\n            relativeX = 0;\n        }\n\n        return { x: relativeX, y: relativeY + verticalPosition };\n    }\n\n    static AutoScrollHandlerOptions = class implements IAutoScrollOptions {\n        public scrollContainer          : HTMLElement;\n        public horizontalScrollContainer: HTMLElement;\n        public scrollByTick             : number;\n        public scrollHandler            : GridBodyScrollHandler;\n        public isRTLCallback            : () => boolean;\n\n        constructor(controllerParams: IPaneControllerParam, public scrollAxis: any, public skipHorizontalScroll: boolean, isRTL : () => boolean) {\n            const bodyController = controllerParams.bodyController;\n            const centerController = controllerParams.centerRowContainerControl;\n            this.scrollHandler = bodyController.getScrollHandler();\n\n            this.horizontalScrollContainer = centerController.getViewPortContainer();\n            this.scrollContainer = bodyController.getViewPortContainer();\n            this.isRTLCallback = isRTL;\n        }\n\n        getVerticalPosition = () => this.scrollHandler.getVScrollPosition().top;\n        setVerticalPosition = (position: number) => this.scrollHandler.setVerticalScrollPosition(position);\n        getHorizontalPosition = () => this.scrollHandler.getHScrollPosition().left;\n        setHorizontalPosition = (position: number) => this.scrollHandler.setHorizontalScrollPosition(position);\n        shouldSkipVerticalScroll = () => false;\n        shouldSkipHorizontalScroll = () => this.skipHorizontalScroll;\n        isRTL = () => this.isRTLCallback();\n    };\n\n}","import { IControllerHandler } from '../../Core/Interface/IControllerHandler';\nimport { Events } from '../../Core/Constants/Events';\nimport { GridOptioHandler } from '../../Core/GridOptionHandler';\nimport { IRecordHandler } from '../../Core/Rows/RecordHandler.types';\nimport type { FieldHandler } from '../../Core/Columns/FieldHandler';\nimport type { IColumnNode } from '../../Core/Interface/IColumnNode';\nimport { copyComputedLayoutStylesForMeasure, measureNaturalBlockHeight } from '../cell-layout-measure';\n\nconst MEASURE_ROW_HEIGHT_PX = 9999;\nconst DEFAULT_HEADER_HEIGHT_PX = 42;\nconst HEADER_ROW_BORDER_PX = 1;\n\nconst pendingRafByController = new WeakMap<IControllerHandler, number>();\n\nfunction collectHeaderRowElements(controllerHandler: IControllerHandler): HTMLElement[] {\n\tconst rows: HTMLElement[] = [];\n\tconst ctrls = [\n\t\tcontrollerHandler.getHeaderRowHeaderContainerController(),\n\t\tcontrollerHandler.getLeftRowHeaderContainerController(),\n\t\tcontrollerHandler.getCenterRowHeaderContainerController(),\n\t\tcontrollerHandler.getRightRowHeaderContainerController(),\n\t];\n\tfor (let i = 0; i < ctrls.length; i++) {\n\t\tconst c = ctrls[i];\n\t\tif (!c) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst vp = c.getViewPortContainer();\n\t\tif (!vp) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst hr = vp.querySelector('.ZG-headerRow') as HTMLElement | null;\n\t\tif (hr) {\n\t\t\trows.push(hr);\n\t\t}\n\t}\n\treturn rows;\n}\n\nfunction collectHeaderCells(rowElements: HTMLElement[]): HTMLElement[] {\n\tconst cells: HTMLElement[] = [];\n\tfor (let r = 0; r < rowElements.length; r++) {\n\t\trowElements[r].querySelectorAll('.ZG-headerCell').forEach((n) => {\n\t\t\tcells.push(n as HTMLElement);\n\t\t});\n\t}\n\treturn cells;\n}\n\nfunction pickContentForMeasure(cellEl: HTMLElement): HTMLElement {\n\tconst inner = cellEl.querySelector(\n\t\t'.ZG-headerCellText, .ZG-cellValue, .ZG-cellLabelContainer',\n\t) as HTMLElement | null;\n\treturn inner ?? cellEl;\n}\n\nfunction getMaxColumnHeaderLabelHeight(fieldHandler: FieldHandler,referenceHeaderRow: HTMLElement | null): number {\n\t\n\tconst columns = fieldHandler.getNonHiddenColumnNodes() as IColumnNode[];\n\tif (!columns.length) {\n\t\treturn 0;\n\t}\n\n\tconst measureContainer = createHeaderLabelMeasureContainer();\n\tconst refCellStyle = getFirstHeaderCellComputedStyle(referenceHeaderRow);\n\tdocument.body.appendChild(measureContainer);\n\n\tlet maxHeightPx = 0;\n\ttry {\n\t\tfor (let i = 0; i < columns.length; i++) {\n\t\t\tconst columnHeaderLabelHeightPx = measureColumnHeaderLabelHeight(columns[i], measureContainer, refCellStyle);\n\t\t\tif (columnHeaderLabelHeightPx > maxHeightPx) {\n\t\t\t\tmaxHeightPx = columnHeaderLabelHeightPx;\n\t\t\t}\n\t\t}\n\t} finally {\n\t\tmeasureContainer.remove();\n\t}\n\n\treturn maxHeightPx;\n}\n\nfunction createHeaderLabelMeasureContainer(): HTMLDivElement {\n\tconst container = document.createElement('div');\n\tcontainer.className = 'ZG-columnHeaderHeight-auto ZG-columnHeaderHeight-measureHost';\n\tcontainer.setAttribute('aria-hidden', 'true');\n\treturn container;\n}\n\nfunction getFirstHeaderCellComputedStyle(headerRow: HTMLElement | null): CSSStyleDeclaration | null {\n\tconst refCell = headerRow?.querySelector('.ZG-headerCell') as HTMLElement | null;\n\treturn refCell ? window.getComputedStyle(refCell) : null;\n}\n\nfunction measureColumnHeaderLabelHeight(column: IColumnNode, measureContainer: HTMLElement, refCellStyle: CSSStyleDeclaration | null): number {\n\tconst widthPx = column.getWidth();\n\tif (!Number.isFinite(widthPx) || widthPx <= 0) {\n\t\treturn 0;\n\t}\n\n\tconst label = (column.getHeaderName() ?? column.getColumnKey() ?? '').trim();\n\tif (!label) {\n\t\treturn 0;\n\t}\n\n\tconst cellEl = document.createElement('div');\n\tcellEl.className = 'ZG-headerCell ZG-headerCell--syntheticMeasure';\n\tcellEl.style.width = `${widthPx}px`;\n\tcopyComputedLayoutStylesForMeasure(cellEl, refCellStyle);\n\n\tconst renderer = document.createElement('div');\n\trenderer.className = 'ZG-headerCellRenderer';\n\n\tconst labelRow = document.createElement('div');\n\tlabelRow.className = 'ZG-headerCellLabel';\n\n\tconst textEl = document.createElement('span');\n\ttextEl.className = 'ZG-headerCellText';\n\ttextEl.textContent = label;\n\n\tconst sortPlaceholder = document.createElement('span');\n\tsortPlaceholder.className = 'ZG-headerCellSort';\n\n\tlabelRow.appendChild(textEl);\n\tlabelRow.appendChild(sortPlaceholder);\n\trenderer.appendChild(labelRow);\n\tcellEl.appendChild(renderer);\n\tmeasureContainer.appendChild(cellEl);\n\n\tvoid cellEl.offsetHeight;\n\tconst heightPx = Math.max(cellEl.scrollHeight, cellEl.getBoundingClientRect().height);\n\tmeasureContainer.removeChild(cellEl);\n\n\treturn Number.isFinite(heightPx) ? heightPx : 0;\n}\n\nfunction measureMaxHeaderCellHeight(controllerHandler: IControllerHandler, fieldHandler: FieldHandler): number {\n\tconst rowEls = collectHeaderRowElements(controllerHandler);\n\tif (!rowEls.length) {\n\t\tconst maxColumnHeaderLabelHeightPx = getMaxColumnHeaderLabelHeight(fieldHandler, null);\n\t\tif (maxColumnHeaderLabelHeightPx > 0) {\n\t\t\treturn Math.ceil(maxColumnHeaderLabelHeightPx) + HEADER_ROW_BORDER_PX;\n\t\t}\n\t\treturn DEFAULT_HEADER_HEIGHT_PX;\n\t}\n\tconst cells = collectHeaderCells(rowEls);\n\tif (!cells.length) {\n\t\tconst maxColumnHeaderLabelHeightPx = getMaxColumnHeaderLabelHeight(fieldHandler, rowEls[0] ?? null);\n\t\tif (maxColumnHeaderLabelHeightPx > 0) {\n\t\t\treturn Math.ceil(maxColumnHeaderLabelHeightPx) + HEADER_ROW_BORDER_PX;\n\t\t}\n\t\treturn DEFAULT_HEADER_HEIGHT_PX;\n\t}\n\n\tfor (let i = 0; i < rowEls.length; i++) {\n\t\trowEls[i].style.height = `${MEASURE_ROW_HEIGHT_PX}px`;\n\t}\n\n\tlet maxCellContentHeightPx = 0;\n\tfor (let i = 0; i < cells.length; i++) {\n\t\tconst cellEl = cells[i];\n\t\tconst inner = pickContentForMeasure(cellEl);\n\t\tconst cellContentHeightPx = measureNaturalBlockHeight(cellEl, inner !== cellEl ? inner : undefined);\n\t\tif (cellContentHeightPx > maxCellContentHeightPx) {\n\t\t\tmaxCellContentHeightPx = cellContentHeightPx;\n\t\t}\n\t}\n\n\tfor (let i = 0; i < rowEls.length; i++) {\n\t\trowEls[i].style.height = '';\n\t}\n\n\tif (!Number.isFinite(maxCellContentHeightPx) || maxCellContentHeightPx <= 0) {\n\t\tmaxCellContentHeightPx = 0;\n\t}\n\tconst domMeasuredHeaderHeightPx =\n\t\tmaxCellContentHeightPx > 0 ? Math.ceil(maxCellContentHeightPx) + HEADER_ROW_BORDER_PX : 0;\n\tconst maxColumnHeaderLabelHeightPx = getMaxColumnHeaderLabelHeight(fieldHandler, rowEls[0] ?? null);\n\tconst syntheticMeasuredHeaderHeightPx =\n\t\tmaxColumnHeaderLabelHeightPx > 0 ? Math.ceil(maxColumnHeaderLabelHeightPx) + HEADER_ROW_BORDER_PX : 0;\n\tconst resolvedHeaderHeightPx = Math.max(domMeasuredHeaderHeightPx, syntheticMeasuredHeaderHeightPx);\n\tif (resolvedHeaderHeightPx > 0) {\n\t\treturn resolvedHeaderHeightPx;\n\t}\n\treturn DEFAULT_HEADER_HEIGHT_PX;\n}\n\nfunction applyHeightPxToHeaderRows(controllerHandler: IControllerHandler, heightPx: number): void {\n\tconst rowEls = collectHeaderRowElements(controllerHandler);\n\tconst heightStyleValue = `${heightPx}px`;\n\tfor (let i = 0; i < rowEls.length; i++) {\n\t\trowEls[i].style.height = heightStyleValue;\n\t}\n}\n\nexport function runAutoColumnHeaderHeightSync(controllerHandler: IControllerHandler,optionsHandler: GridOptioHandler,recordHandler: IRecordHandler,eventHandler: { dispatchEvent: (e: { type: string }) => void },fieldHandler: FieldHandler): void {\n\tif (!optionsHandler.isColumnHeader() || !optionsHandler?.isAutoColumnHeaderHeight()) {\n\t\treturn;\n\t}\n\tconst measuredHeaderRowHeightPx = measureMaxHeaderCellHeight(controllerHandler, fieldHandler);\n\tconst headerHandler = recordHandler.getFieldHeaderHandler() as {\n\t\tsetAutoMeasuredHeaderRowHeight?: (rowIndex: number, height: number) => boolean;\n\t};\n\tif (typeof headerHandler.setAutoMeasuredHeaderRowHeight !== 'function') {\n\t\treturn;\n\t}\n\tconst changed = headerHandler.setAutoMeasuredHeaderRowHeight(0, measuredHeaderRowHeightPx);\n\tconst columnHeaderTotalHeightPx = recordHandler.getColumnHeaderHeight();\n\tapplyHeightPxToHeaderRows(controllerHandler, columnHeaderTotalHeightPx);\n\tif (changed) {\n\t\teventHandler.dispatchEvent({ type: Events.EVENT_ROW_CONTAINER_HEIGHT_CHANGED });\n\t}\n}\n\nexport function requestAutoColumnHeaderHeightRefresh(controllerHandler: IControllerHandler,optionsHandler: GridOptioHandler,recordHandler: IRecordHandler,eventHandler: { dispatchEvent: (e: { type: string }) => void },fieldHandler: FieldHandler): void {\n\n\tif (!optionsHandler.isColumnHeader() || !optionsHandler?.isAutoColumnHeaderHeight()) {\n\t\treturn;\n\t}\n\tconst previousPendingFrameId = pendingRafByController.get(controllerHandler);\n\tif (previousPendingFrameId != null) {\n\t\tcancelAnimationFrame(previousPendingFrameId);\n\t}\n\tconst animationFrameRequestId = requestAnimationFrame(() => {\n\t\tpendingRafByController.delete(controllerHandler);\n\t\trunAutoColumnHeaderHeightSync(controllerHandler, optionsHandler, recordHandler, eventHandler, fieldHandler);\n\t});\n\tpendingRafByController.set(controllerHandler, animationFrameRequestId);\n}\n","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../../../Core/Constants/BeanName\";\nimport { IControllerHandler, IPaneControllerParam } from \"../../../Core/Interface/IControllerHandler\";\nimport { IAutoScrollHandler, IAutoScrollOptions } from \"../../../../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler.types\";\nimport { AutoScrollHandler } from \"../../../../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler\";\nimport { GridBodyScrollHandler } from \"../../../Core/GridBodyScrollHandler\";\nimport { IColumnAPIManager, IColumnNode } from \"../../../Main\";\nimport { IHeaderCellComponent } from \"../Cell/HeaderCellController\";\nimport { GridCellEditorHandler } from \"../../Editor/GridCellEditorHandler\";\nimport { IColumnSelection } from \"../../../../Selection/column-selection.types\";\nimport { IRecordHandler } from \"../../../Core/Rows/RecordHandler.types\";\nimport { FieldHandler } from \"../../../Core/Columns/FieldHandler\";\n\nexport class ColumnResizeHandler extends EventEmitter {\n\n    private resizeAutoScrollHandler :  IAutoScrollHandler;\n\n\t@AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) controllerHandler: IControllerHandler;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\t@AutoWired(GRID_BEAN_NAME.COLUMN_API) private columnApi\t\t!: IColumnAPIManager;\n\n\tprivate column         : IColumnNode;\n    private component!     : IHeaderCellComponent;\n\tprivate columnMeta;\n    private resizeCue      : HTMLElement;\n\n    constructor(column : IColumnNode, component : IHeaderCellComponent, columnMeta : any) {\n        super();\n        this.column = column;\n        this.component = component;\n        this.columnMeta = columnMeta;\n    }\n\n    @PostConstruct()\n    init(): void {\n        this.controllerHandler.onAfterGridReady((params  : IPaneControllerParam) => {\n            const fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n            const isColumnPinned = fieldHandler.isColumnPinned(this.column.getID());\n            const autoScrollOption = new ColumnResizeHandler.ResizeAutoScrollHandlerOptions(params, 'x', isColumnPinned ? true : this.optionsHandler.isSuppressHorizontalScroll(), () => this.optionsHandler.isRTL());\n            this.resizeAutoScrollHandler = new AutoScrollHandler(autoScrollOption);\n        });\n    }\n\n    registerResizeCue(resizeCue : HTMLElement) : void {\n\t\tthis.resizeCue = resizeCue;\n\t}\n\n    /** Right-pane column adjacent to the center viewport: resize boundary faces center (physical left in LTR). */\n    private isRightPinnedFirstColumn(): boolean {\n        if (this.column.getPinnedPosition() !== 'right') {\n            return false;\n        }\n        const fieldHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER) as FieldHandler;\n        return fieldHandler.getRightHandler().getFirstColumnID() === this.column.getID();\n    }\n\n    private floatingCue: HTMLElement | null = null;\n\n    private createFloatingCue(gridRoot: HTMLElement, resizeElement: HTMLElement): HTMLElement {\n        const wrapper = document.createElement('div');\n        wrapper.className = 'ZG-resizeFloatingCue';\n        const cueWrapper = document.createElement('div');\n        cueWrapper.className = 'ZG-resizeCueSec-wrapper';\n        cueWrapper.appendChild(resizeElement.cloneNode(true));\n        wrapper.appendChild(cueWrapper);\n        gridRoot.appendChild(wrapper);\n        return wrapper;\n    }\n\n    private positionFloatingCue(mouseX: number, gridRoot: HTMLElement, cellElement: HTMLElement): void {\n        if (!this.floatingCue) return;\n        const gridRect = gridRoot.getBoundingClientRect();\n        const cellRect = cellElement.getBoundingClientRect();\n        const topOffset = cellRect.top - gridRect.top;\n        this.floatingCue.style.left = `${mouseX - gridRect.left}px`;\n        this.floatingCue.style.top = `${topOffset}px`;\n        this.floatingCue.style.height = `${gridRect.height - topOffset}px`;\n        this.floatingCue.style.setProperty('--cell-height', `${cellRect.height}px`);\n    }\n\n    private removeFloatingCue(): void {\n        if (this.floatingCue) {\n            this.floatingCue.remove();\n            this.floatingCue = null;\n        }\n    }\n\n    private beginColumnResize(mouseEvent: MouseEvent): void {\n        this.columnApi.setColumnWidthById(\n            this.columnMeta.columnID,\n            this.column.getWidth(),\n            {},\n            { event: mouseEvent, stopAfterAction: true, useApiCaller: false },\n        );\n    }\n\n    private columnResizeInProgressHookMeta(mouseEvent: MouseEvent) {\n        return {\n            event: mouseEvent,\n            isOnHookAction: true,\n            stopBeforeAction: true,\n            stopAfterAction: true,\n        };\n    }\n\n    private completeColumnResize(mouseEvent: MouseEvent): void {\n        this.columnApi.setColumnWidthById(\n            this.columnMeta.columnID,\n            this.column.getWidth(),\n            {},\n            { event: mouseEvent, stopBeforeAction: true },\n        );\n    }\n\n    getDragSource(element : HTMLElement) : any {\n        const isResizable = this.column.isResizable();\n        if(!isResizable) {\n            return;\n        }\n        const optionHanlder = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const colDef = this.column.getUserColumnDefinition();\n        const useCueMode = optionHanlder.isResizeCueEnabled();\n\n        let requestID;\n\n        /** LTR only: first right-pinned column resizes from the center-facing (inline-start) edge. RTL keeps the generic RTL width math + default cue side. */\n        const resizeFromLeadingEdge = () => this.isRightPinnedFirstColumn() && !optionHanlder.isRTL();\n\n        const calculateWidth = (mouseEvent : MouseEvent) => {\n            const headerDummyDom  = this.component.getElement();\n            const headerBoundRect = headerDummyDom.getBoundingClientRect();\n            const startX          = headerBoundRect.x;\n            const isRTL           = optionHanlder.isRTL();\n            // Touch drags pass Touch from DragCoreHandler; Touch has clientX but not x (MouseEvent alias).\n            const pointerX = mouseEvent.clientX ?? (mouseEvent as MouseEvent).x;\n            \n            let width: number;\n            if (isRTL) {\n                const endX = startX + headerBoundRect.width;\n                width = endX - pointerX;\n            } else {\n                width = pointerX - startX;\n            }\n            \n            const minWidth        = colDef.minWidth ?? 50;\n            const maxWidth        = colDef.maxWidth;\n            let   actualWidth     = Math.max(minWidth, width);\n            maxWidth && (actualWidth = Math.min(actualWidth, maxWidth));\n            return actualWidth;\n        }\n\n        const clampWidth = (w: number): number => {\n            const minWidth = colDef.minWidth ?? 50;\n            const maxWidth = colDef.maxWidth;\n            let clamped = Math.max(minWidth, w);\n            maxWidth && (clamped = Math.min(clamped, maxWidth));\n            return clamped;\n        }\n\n        const getGridRoot = (): HTMLElement => {\n            return this.component.getElement().closest('.ZG-rootWrapperBody') as HTMLElement\n                ?? this.component.getElement().closest('.ZG-gridScrollHolder') as HTMLElement;\n        }\n\n        let initialWidth = 0;\n        let startMouseX  = 0;\n\n        const dragSource  = {\n            disableYaxis : true,\n            container : element,\n            getGhostElement : () => {\n                return this.resizeCue ?? null;\n            },\n            shouldPreventMouseEvent : () => true,\n            getRootNode : () => window,\n            getDragItem:  () => {\n                const columnSelectionHandler = this.getBeanInstanceByBeanName('columnSelection') as IColumnSelection;\n                const recordHandler       = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.RECORD_HANDLER) as IRecordHandler;\n                const columnIds       \t  = columnSelectionHandler.getSelectedColumns();\n\n                recordHandler.addStaticRowById(this.column.getID());\n\n                return {\n                    columnIds : columnIds.length != 0 ? columnIds : [this.column.getID()]\n                }\n            },\n            onDragStarted : (mouseEvent : MouseEvent) => {\n                element.classList.add('ZG-resizing');\n                this.component.addOrRemoveCssClass('ZG-column--resizing', true);\n\n                const editorHandler = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) as GridCellEditorHandler;\n                editorHandler && editorHandler.stopEditing(false);\n\n                this.beginColumnResize(mouseEvent);\n\n                if (useCueMode) {\n                    initialWidth = this.column.getWidth();\n                    startMouseX  = mouseEvent.clientX;\n                    const gridRoot = getGridRoot();\n                    if (gridRoot) {\n                        this.floatingCue = this.createFloatingCue(gridRoot, element);\n                        this.positionFloatingCue(mouseEvent.clientX, gridRoot, this.component.getElement());\n                    }\n                }\n            },\n            onDragging : (mouseEvent : MouseEvent) => {\n                requestID = requestAnimationFrame(() => {\n                    this.resizeAutoScrollHandler?.update(mouseEvent);\n                    if (useCueMode) {\n                        const gridRoot = getGridRoot();\n                        if (gridRoot) {\n                            this.positionFloatingCue(mouseEvent.clientX, gridRoot, this.component.getElement());\n                        }\n                    } else {\n                        const width = calculateWidth(mouseEvent);\n                        const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n                        this.columnApi.setColumnWidthById(this.columnMeta.columnID, width, {}, this.columnResizeInProgressHookMeta(mouseEvent));\n                        rowRenderController.refreshColumnAfterModelUpdate({ fromColumnResize: true });\n                    }\n                });\n            },\n            onDragStopped : (mouseEvent : MouseEvent) => {\n                this.resizeAutoScrollHandler?.clear();\n                element.classList.remove('ZG-resizing');\n                this.component.addOrRemoveCssClass('ZG-column--resizing', false);\n                requestID && cancelAnimationFrame(requestID);\n\n                if (useCueMode) {\n                    this.removeFloatingCue();\n                    const isRTL  = optionHanlder.isRTL();\n                    const deltaX = mouseEvent.clientX - startMouseX;\n                    const leading = resizeFromLeadingEdge();\n                    const newWidth = clampWidth(initialWidth + (isRTL || leading ? -deltaX : deltaX));\n                    this.columnApi.setColumnWidthById(this.columnMeta.columnID, newWidth, {}, this.columnResizeInProgressHookMeta(mouseEvent));\n                }\n\n                const rowRenderController = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER);\n                rowRenderController.refreshColumnAfterModelUpdate({ fromColumnResize: true });\n                this.completeColumnResize(mouseEvent);\n            },\n            onDragCancelled : () => {\n                this.resizeAutoScrollHandler?.clear();\n                element.classList.remove('ZG-resizing');\n                this.component.addOrRemoveCssClass('ZG-column--resizing', false);\n                requestID && cancelAnimationFrame(requestID);\n                this.removeFloatingCue();\n            }\n        }\n\n        return dragSource;\n    }\n\n    static ResizeAutoScrollHandlerOptions = class implements IAutoScrollOptions {\n                public scrollContainer          : HTMLElement;\n                public horizontalScrollContainer: HTMLElement;\n                public scrollByTick             : number;\n                public scrollHandler            : GridBodyScrollHandler;\n                public isRTLCallback            : () => boolean;\n        \n                constructor(controllerParams: IPaneControllerParam, public scrollAxis: any, public skipHorizontalScroll: boolean, isRTL : () => boolean) {\n                    const bodyController = controllerParams.bodyController;\n                    const centerController = controllerParams.centerRowContainerControl;\n                    this.scrollHandler = bodyController.getScrollHandler();\n        \n                    this.horizontalScrollContainer = centerController.getViewPortContainer();\n                    this.scrollContainer = bodyController.getViewPortContainer();\n                    this.isRTLCallback = isRTL;\n                }\n        \n                getVerticalPosition = () => this.scrollHandler.getVScrollPosition().top;\n                setVerticalPosition = (position: number) => this.scrollHandler.setVerticalScrollPosition(position);\n                getHorizontalPosition = () => this.scrollHandler.getHScrollPosition().left;\n                setHorizontalPosition = (position: number) => this.scrollHandler.setHorizontalScrollPosition(position);\n                shouldSkipVerticalScroll = () => true;\n                shouldSkipHorizontalScroll = () => this.skipHorizontalScroll;\n                isRTL = () => this.isRTLCallback();\n        };\n}\n","interface ColumnSelection {\n\tstartColumn: number;\n\tendColumn: number;\n}\n\ninterface RangeSelection {\n\tstartRow: number;\n\tstartColumn: number;\n\tendRow: number;\n\tendColumn: number;\n}\n\ninterface RowSelection {\n\tstartRow: number;\n\tendRow: number;\n}\n\ninterface CellSelection {\n\trow: number;\n\tcolumn: number;\n}\ninterface FillSeriesSelection {\n\tstartRowID: string;\n\tstartColumnID: string;\n\tendRowID: string;\n\tendColumnID: string;\n}\n\nconst enum SELECTION_TYPE {\n\tFILL_SERIES = 'fillSeries',\n\tRANGE = 'range',\n\tCELL = 'cell',\n\tROW = 'row',\n\tCOLUMN = 'column',\n}\n\ninterface ISelectionInfo {\n\tbackground: SELECTION_TYPE[];\n\tleft: SELECTION_TYPE[];\n\tright: SELECTION_TYPE[];\n\ttop: SELECTION_TYPE[];\n\tbottom: SELECTION_TYPE[];\n}\n\nexport {\n\tISelectionInfo,\n\tSELECTION_TYPE,\n\tFillSeriesSelection,\n\tCellSelection,\n    RowSelection,\n    ColumnSelection,\n    RangeSelection,\n};","import { Component } from \"@dg/corecomponent\";\nimport { IPopupComponent } from \"./Interface/CellEditor/IPopupComponent\";\n\nexport class PopupComponent extends Component implements IPopupComponent<any> {\n\tsetParentComponent(container: Component) {\n\t\tcontainer.addCssClass('ZG-has-popup');\n\t\tsuper.setParentComponent(container);\n\t}\n\n\tpublic destroy(): void {\n\t\tconst parentComp = this.parentComponent;\n\t\tconst hasParent = parentComp && parentComp.isAlive();\n\n\t\tif (hasParent) {\n\t\t\tparentComp!.getGui().classList.remove('ZG-has-popup');\n\t\t}\n\n\t\tsuper.destroy();\n\t}\n\n\tgetElement(): HTMLElement {\n\t\treturn super.getGui();\n\t}\n}\n","\nexport type SavedMeasureInlineStyle = {\n\tel: HTMLElement;\n\theight: string;\n\tmaxHeight: string;\n\talignItems: string;\n\twhiteSpace: string;\n\toverflow: string;\n};\n\nfunction pushSavedMeasureStyle(el: HTMLElement, bucket: SavedMeasureInlineStyle[]): void {\n\tbucket.push({\n\t\tel,\n\t\theight: el.style.height,\n\t\tmaxHeight: el.style.maxHeight,\n\t\talignItems: el.style.alignItems,\n\t\twhiteSpace: el.style.whiteSpace,\n\t\toverflow: el.style.overflow,\n\t});\n}\n\nfunction restoreSavedMeasureStyles(saved: SavedMeasureInlineStyle[]): void {\n\tfor (let i = saved.length - 1; i >= 0; i--) {\n\t\tconst s = saved[i];\n\t\ts.el.style.height = s.height;\n\t\ts.el.style.maxHeight = s.maxHeight;\n\t\ts.el.style.alignItems = s.alignItems;\n\t\ts.el.style.whiteSpace = s.whiteSpace;\n\t\ts.el.style.overflow = s.overflow;\n\t}\n}\n\n// clone Styles from a element to another element\nexport function copyComputedLayoutStylesForMeasure(target: HTMLElement, computed: CSSStyleDeclaration | null): void {\n\tif (!computed) {\n\t\treturn;\n\t}\n\ttarget.style.font            = computed.font;\n\ttarget.style.fontSize        = computed.fontSize;\n\ttarget.style.fontFamily      = computed.fontFamily;\n\ttarget.style.fontWeight      = computed.fontWeight;\n\ttarget.style.lineHeight      = computed.lineHeight;\n\ttarget.style.letterSpacing   = computed.letterSpacing;\n\ttarget.style.textTransform   = computed.textTransform;\n\ttarget.style.wordBreak       = computed.wordBreak;\n\ttarget.style.whiteSpace      = computed.whiteSpace;\n\ttarget.style.padding         = computed.padding;\n\ttarget.style.paddingTop      = computed.paddingTop;\n\ttarget.style.paddingRight    = computed.paddingRight;\n\ttarget.style.paddingBottom   = computed.paddingBottom;\n\ttarget.style.paddingLeft     = computed.paddingLeft;\n\ttarget.style.border          = computed.border;\n\ttarget.style.borderTopWidth  = computed.borderTopWidth;\n\ttarget.style.borderRightWidth = computed.borderRightWidth;\n\ttarget.style.borderBottomWidth = computed.borderBottomWidth;\n\ttarget.style.borderLeftWidth = computed.borderLeftWidth;\n\ttarget.style.boxSizing       = computed.boxSizing;\n\ttarget.style.gap             = computed.gap;\n\ttarget.style.rowGap          = computed.rowGap;\n\ttarget.style.columnGap       = computed.columnGap;\n\ttarget.style.alignItems      = computed.alignItems;\n\ttarget.style.justifyContent  = computed.justifyContent;\n\ttarget.style.minHeight       = computed.minHeight;\n\ttarget.style.maxHeight       = computed.maxHeight;\n}\n\n\n\n// measure height if a Element\nexport function measureNaturalBlockHeight(rootEl: HTMLElement, innerEl?: HTMLElement | null): number {\n\tconst contentEl = innerEl ?? rootEl;\n\tconst saved: SavedMeasureInlineStyle[] = [];\n\n\tpushSavedMeasureStyle(rootEl, saved);\n\trootEl.style.height = 'auto';\n\trootEl.style.alignItems = 'flex-start';\n\trootEl.style.overflow = 'visible';\n\n\tif (contentEl !== rootEl) {\n\t\tpushSavedMeasureStyle(contentEl, saved);\n\t\tcontentEl.style.height = 'auto';\n\t\tcontentEl.style.maxHeight = 'none';\n\t\tcontentEl.style.whiteSpace = 'normal';\n\t\tcontentEl.style.overflow = 'visible';\n\t}\n\n\tvoid rootEl.offsetHeight;\n\tconst heightPx = Math.max(rootEl.scrollHeight, rootEl.getBoundingClientRect().height);\n\trestoreSavedMeasureStyles(saved);\n\n\treturn Number.isFinite(heightPx) ? heightPx : 0;\n}\n","import { GridBodyComponent } from './GridComponent/GridBodyComponent/GridBodyComponent';\nimport { GridHeader } from './GridComponent/Header/GridHeader';\nimport { RowHeaderContainerComponent } from './GridComponent/Header/RowContainer/RowHeaderContainerComponent';\nimport { RowContainerComponent } from './GridComponent/GridBodyComponent/RowContainer/RowContainerComponent';\nimport { VSComponent } from './GridComponent/GridBodyComponent/Scroller/VSComponent';\nimport { HSComponent } from './GridComponent/GridBodyComponent/Scroller/HSComponent';\nimport { getBodyTemplate, gridTemplate } from './Template/GridTemplate';\nimport { gridHeaderTemplate } from './Template/Header/GridHeaderTemplate';\nimport { gridRowHeaderTemplate } from './Template/Header/GridRowHeaderComponent';\nimport { gridRowContainerTemplate } from './Template/GridRowContainerTemplate';\nimport { gridHSTemplate } from './Template/Scroller/HSTemplate';\nimport { gridVSTemplate } from './Template/Scroller/VSTemplate';\nimport { GridComponent } from './GridComponent/GridComponent';\nimport { getGridFloatingEditorTemplate } from './Template/GridFloatingEditorTemplate';\nimport { GridFloatingEditorComponent } from './GridComponent/FloatingEditor/GridFloatingEditorComponent';\nimport { RowBufferContainerComponent } from './GridComponent/GridBodyComponent/BufferContainer/row/RowBufferContainerComponent';\nimport { getGridRowPlusTemplate } from './Template/GridRowPlusTemplate';\nimport { ColumnBufferContainerComponent } from './GridComponent/GridBodyComponent/BufferContainer/column/ColumnBufferContainerComponent';\nimport { getGridColumnBufferTemplate } from './Template/GridColumnBufferTemplate';\nimport { FloatingRecordComponent } from './FloatingRecords/UIHandler/FloatingRecordComponent';\nimport { floatigRecordTemplate } from './Template/FloatingRecord/FloatingRecordTemplate';\nimport { FloatingRecordMovedComponent } from './FloatingRecords/UIHandler/RecordMoved/FloatingRecordMovedComponent';\nimport { floatigRecordMovedTemplate } from './Template/FloatingRecord/FloatingRecordMovedTemplate';\nimport { ComponentMeta } from '@dg/corecomponent';\nimport { GRID_ELEMENT_NAMES } from './Core/Constants/GridConfigurationConstants';\nimport { ganttTimelineHolderTemplate } from './Template/GanttTimelineHolderTemplate';\nimport { GanttDependencyMarkContainerComponent } from './GridComponent/Gantt/DependencyMarkHolder/GanttDependencyMarkContainerComponent';\nimport { ganttDependencyMarkContainerTemplate } from './Template/ganttDependencyMarkContainerTemplate';\nimport { GanttTimelineHolderComponent } from './GridComponent/Gantt/GanttTimelineHolder/GanttTimelineHolderComponent';\nimport { CurrentTimeIndicatorComponent } from './GridComponent/Gantt/CurrentTimeIndicator/CurrentTimeIndicatorComponent';\nimport { getCurrentTimeIndicatorTemplate } from './GridComponent/Gantt/CurrentTimeIndicator/CurrentTimeIndicatorTemplate';\nimport { ActionComponent } from '../GanttModelClasses/Core/ActionComponent/ActionComponent';\nimport { NoRecordComponent } from './GridComponent/GridBodyComponent/NoRecordConatiner/no-record-view';\n\nexport function createComponentList(excludeElements : string[]): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n\t\t{\n\t\t\tcomponentName: 'dg-grid',\n\t\t\tcomponentClass: GridComponent,\n\t\t\ttemplate: getBodyTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'datagrid-grid-body',\n\t\t\tcomponentClass: GridBodyComponent,\n\t\t\ttemplate: gridTemplate(excludeElements),\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'datagrid-header',\n\t\t\tcomponentClass: GridHeader,\n\t\t\ttemplate: gridHeaderTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'dg-row-header-container',\n\t\t\tcomponentClass: RowHeaderContainerComponent,\n\t\t\ttemplate: gridRowHeaderTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'datagrid-row-container',\n\t\t\tcomponentClass: RowContainerComponent,\n\t\t\ttemplate: gridRowContainerTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'dg-floating-cell-editor',\n\t\t\tcomponentClass: GridFloatingEditorComponent,\n\t\t\ttemplate: getGridFloatingEditorTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentClass: RowBufferContainerComponent,\n\t\t\tcomponentName: 'dg-row-buffer',\n\t\t\ttemplate: getGridRowPlusTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentClass: ColumnBufferContainerComponent,\n\t\t\tcomponentName: 'dg-column-buffer',\n\t\t\ttemplate: getGridColumnBufferTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentClass: FloatingRecordComponent,\n\t\t\tcomponentName : 'dg-floating-record-row',\n\t\t\ttemplate      : floatigRecordTemplate()\n\t\t},\n\t\t{\n\t\t\tcomponentClass: FloatingRecordMovedComponent,\n\t\t\tcomponentName : 'dg-floating-record-moved',\n\t\t\ttemplate      : floatigRecordMovedTemplate()\n\t\t},\n\t\t// {\n\t\t// \tcomponentClass : NoRecordComponent,\n\t\t// \tcomponentName : GRID_ELEMENT_NAMES.NO_RECORD_CONTAINER\n\t\t// }\n\t];\n\n\t!excludeElements.includes(GRID_ELEMENT_NAMES.GANTT_TIMELINE_HOLDER) && components.push({\n\t\tcomponentName  : GRID_ELEMENT_NAMES.GANTT_TIMELINE_HOLDER,\n\t\tcomponentClass : GanttTimelineHolderComponent,\n\t\ttemplate       : ganttTimelineHolderTemplate()\n\t})\n\n\t!excludeElements.includes(GRID_ELEMENT_NAMES.NO_RECORD_CONTAINER) && components.push({\n\t\tcomponentName  : GRID_ELEMENT_NAMES.NO_RECORD_CONTAINER,\n\t\tcomponentClass : NoRecordComponent,\n\t})\n\t\n\t!excludeElements.includes(GRID_ELEMENT_NAMES.GANTT_DEPENDENCY_MARK_CONTAINER) && components.push({\n\t\tcomponentName  : GRID_ELEMENT_NAMES.GANTT_DEPENDENCY_MARK_CONTAINER,\n\t\tcomponentClass : GanttDependencyMarkContainerComponent,\n\t\ttemplate       : ganttDependencyMarkContainerTemplate()\n\t})\n\n\t!excludeElements.includes(GRID_ELEMENT_NAMES.HORIZONTAL_SCROLL) && components.push({\n\t\tcomponentName  : GRID_ELEMENT_NAMES.HORIZONTAL_SCROLL,\n\t\tcomponentClass : HSComponent,\n\t\ttemplate       : gridHSTemplate(),\n\t})\n\t!excludeElements.includes(GRID_ELEMENT_NAMES.VERTICAL_SCROLL) && components.push({\n\t\tcomponentName  : GRID_ELEMENT_NAMES.VERTICAL_SCROLL,\n\t\tcomponentClass : VSComponent,\n\t\ttemplate       : gridVSTemplate()\n\t})\n\n\t!excludeElements.includes(GRID_ELEMENT_NAMES.GANTT_CURRENT_TIME_INDICATOR) && components.push({\n\t\tcomponentName  : GRID_ELEMENT_NAMES.GANTT_CURRENT_TIME_INDICATOR,\n\t\tcomponentClass : CurrentTimeIndicatorComponent,\n\t\ttemplate       : getCurrentTimeIndicatorTemplate()\n\t})\n\n\t!excludeElements.includes(GRID_ELEMENT_NAMES.GANTT_ACTION_BAR) && components.push({\n\t\tcomponentName : 'gantt-action',\n\t\tcomponentClass : ActionComponent\n\t})\n\n\treturn components;\n}\n","import { Bean } from '@dg/corecomponent';\nimport {EscapeHandler} from '../../Sub_Components/src/Utilities/EscapeHandler';\nimport { GRID_BEAN_NAME } from './Core/Constants/BeanName';\nimport { IEscapeHandler } from '../../Sub_Components/src/Utilities/EscapeHandler.types';\n\n@Bean(GRID_BEAN_NAME.GRID_ESCAPE_HANDLER)\nexport class GridEscapeHandler extends EscapeHandler implements IEscapeHandler{\n}","import { AutoWired, BEAN_NAME, Bean, DGEvent, EventHandler } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"./Core/Constants/BeanName\";\nimport { IAPIHandler } from \"./Interface/IAPIHandler\";\n\n@Bean(BEAN_NAME.EVENT_HANDLER)\nexport class GridEventHanlder extends EventHandler {\n    @AutoWired(GRID_BEAN_NAME.API_HANDLER) apiHandler : IAPIHandler;\n    dispatchEvent(event: DGEvent): void {\n        let dgEvent = event as any;\n\t\tif (this.optionHandler) {\n\t\t\tdgEvent.instanceAPI = this.apiHandler;\n\t\t}\n\n\t\tthis.dispatchToListeners(dgEvent, true);\n\t\tthis.dispatchToListeners(dgEvent, false);\n\n\t\tthis.firedEvents[dgEvent.type] = true;\n    }\n}","// const enum HookUiInitiator {\n//     RESIZE_CUE            = 'resizeCue',\n//     CONTEXT_MENU          = 'contextMenu',\n//     PAGINATION            = 'Pagination',\n//     SEARCH                = 'search',\n//     EDITOR                = 'editor',\n//     DRAG_AND_DROP         = 'dragAndDrop',\n//     RECORD_HEADER         = 'recordHeader',\n//     SELECT_ALL_CHECKBOX   = \"selectAllCheckBox\",\n//     EVENT                 = 'event',\n//     FILL_CUE              = 'fillCue'\n// }\n\nimport { IJson } from \"Grid/ListMain\";\n\nexport type HookInitiator = 'api' | 'resizeCue' | 'contextMenu' | 'Pagination' | 'search' | 'editor' | 'dragAndDrop' | 'recordHeader' | 'selectAllCheckBox' | 'event' | 'fillCue' | 'clipboard' | 'ui' | 'draftRow';\n \nexport type ActionType = 'clear' | 'edit'\ninterface IHookMeta {\n    action ?: ActionType,\n    suppressEventTrigger?: boolean;\n    useAction           ?: boolean;\n    useActionOldValues  ?: boolean;\n    useApiCaller        ?: boolean;\n    eventOrigin         ?: HookInitiator;\n    event               ?: Event | null;\n    oldValues           ?: Record<string, IJson>;\n    userParams          ?: Record<string, IJson>;\n    isOnHookAction      ?: boolean;\n    stopBeforeAction    ?: boolean;\n    stopAfterAction     ?: boolean;\n\n\t[key: string]       : any;\n\n}\n\nexport {\n    IHookMeta\n}","import { IModule } from \"GanttModelClasses/Modules/modules.types\";\nimport { BasicLayoutPositionHandler } from \"./Core/BasicLayoutPositionHandler\";\n\nexport const LayoutModule : IModule = {\n\tmoduleName    : 'layout',\n\tversion       : '0.0.1',\n\tbeans         : [BasicLayoutPositionHandler]\n}","export * from './Core/Interface/IGridConfiguration';\nexport * from './Core/Interface/IColumnDefinition';\nexport * from './Core/Interface/IColumnNode';\nexport * from './Core/Interface/IRowNode';\nexport * from './Core/Interface/IUserPresenceMeta';\nexport * from './GridComponent/Interface/CellEditor/ICellEditorComponent';\nexport * from './GridComponent/Interface/CellEditor/ICellEditorParam';\nexport * from './GridComponent/Interface/CellEditor/IPopupComponent';\nexport * from './GridComponent/Interface/CellRenderer/ICellRendererComponent';\nexport * from './GridComponent/Interface/CellRenderer/ICellRendererParams';\nexport * from './GridComponent/Interface/Events/ICellEventComponent';\nexport * from './GridComponent/Interface/Events/IFocusEventParam';\nexport * from './GridComponent/Interface/HeaderCellRenderer/IHeaderCellRendererComponent';\nexport * from './GridComponent/Interface/HeaderCellRenderer/IHeaderCellRendererParams';\nexport * from './GridComponent/Interface/IComponent';\nexport * from './GridComponent/Interface/LoadingCellRenderer/ILoadingCellRenderer';\nexport * from './GridComponent/Interface/LoadingCellRenderer/ILoadingCellRendererParams';\nexport * from './GridComponent/Interface/SummaryCellRenderer/ISummaryCellRenderer';\nexport * from './GridComponent/Interface/SummaryCellRenderer/ISummaryCellRendererParams';\nexport * from './API/CellAPI/Interface/ICellAPIManager';\nexport * from './API/CellAPI/Interface/ICellAPIInteracter';\nexport * from './API/CellAPI/Interface/ICellHookAction';\nexport * from './API/ColumnAPI/Interface/IColumnAPI';\nexport * from './API/ColumnAPI/Interface/IColumnHookAction';\nexport * from './API/FloatingRowAPI/Interface/IFloatingRowAPI';\nexport * from './API/FloatingRowAPI/Interface/IFloatingRowAPIHookAction';\nexport * from './API/FloatingRowAPI/Interface/IFloatingRowAPIInteracter';\nexport * from './API/RowAPI/Interface/IRowAPI';\nexport * from './API/RowAPI/Interface/IRowAPIHookParams.types';\nexport * from './Interface/Hooks';\nexport * from './Interface/IAPIHandler';\nexport * from './Interface/IGridAPI';\nexport * from './Interface/IGridExperimentalAPI';\nexport * from './API/ReorderableAPI/Interface/IReorderableAPI';\nexport * from './API/ReorderableAPI/Interface/IReorderableHookParams';\nexport * from './API/ReorderableAPI/Interface/IRorderableAPIInteracter';\nexport * from \"./API/selection/selection-api.types\";\nexport * from \"./API/user-presence/user-presence-api.types\";\nexport * from \"./API/RangeSelectionAPI/range-selection-api.types\";\nexport * from \"./API/navigation/navigation-api.types\";\nexport * from \"./API/RowGroupingAPI/Interface/IRowGroupingApiManager.types\";\nexport * from \"./API/ClipboardAPI/Interface/IClipboardApiManager.types\";\nexport * from \"./API/FloatingRowAPI/Interface/IFloatingRowAPI\";\nexport * from \"./API/RangeSelectionAPI/range-selection-api.types\";\nexport * from \"./API/SortAPI/Interface/ISortApiManager.types\";\nexport * from \"./API/FilterAPI/Interface/IFilterApiManager.types\";\nexport * from \"./API/ReorderableAPI/Interface/IReorderableAPI\";\nexport * from \"./API/TreeAPI/Interface/ITreeApi\";\nexport * from \"../row-drag-handler/row-drag-handler\"\nexport * from \"../Grid/Core/Components/ColumnReorderController/ColumnReorderListener\"\nexport * from \"./Grid\"\nexport * from \"./Core/BasicLayoutPositionHandler\";","\nexport function floatigRecordMovedTemplate() {\n\treturn function getTemplate(): HTMLElement {\n\t\tconst template = `<div class=\"ZG-poppedRowMessageSec\"></div>`;\n\n\t\tconst div = document.createElement('div');\n\t\tdiv.innerHTML = template;\n\t\treturn div.firstChild as HTMLElement;\n\t};\n}\n","import { ROW_CONTAINER_NAME } from '../../GridComponent/GridBodyComponent/RowContainer/utils/type';\n\nexport function floatigRecordTemplate() {\n\treturn function getTemplate(): HTMLElement {\n\t\tconst template = `<div class=\"ZG-floatingGridSec\">\n            <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.FLOATING_RECORD_HEADER}></datagrid-row-container>\n            <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.FLOATING_RECORD_LEFT}></datagrid-row-container>\n            <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER}></datagrid-row-container>\n            <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.FLOATING_RECORD_RIGHT}></datagrid-row-container>\n            <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.FLOATING_FULL_WIDTH}></datagrid-row-container>\n        </div>`;\n\n\t\tconst div = document.createElement('div');\n\t\tdiv.innerHTML = template;\n\t\treturn div.firstChild as HTMLElement;\n\t};\n}\n\n","import { GANTT_CLASS_NAMES } from \"../Core/Constants/CSSClassNameContants\";\n\nexport function ganttTimelineHolderTemplate() {\n    return function getTemplate(): HTMLElement {\n        const template = `<div class=\"${GANTT_CLASS_NAMES.GANTT_TIMELINE_SCROLL_HOLDER}\" ref=\"ganttTimelineScrollHolder\">\n                        <div class=\"${GANTT_CLASS_NAMES.GANTT_TIMELINE_HOLDER}\" ref=\"ganttTimelineScroller\"></div>\n                    </div>`;\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}","export function getGridColumnBufferTemplate() {\n\treturn function getTemplate(): HTMLElement {\n\t\tconst res = `<div class=\"ZG-columnBuffer\">\n                    </div>`;\n\n\t\tconst div = document.createElement('div');\n\t\tdiv.innerHTML = res;\n\n\t\treturn div.firstChild as HTMLElement;\n\t};\n}\n","export function getGridFloatingEditorTemplate() {\n    return function getTemplate(): HTMLElement {\n\t\tconst res = `<div class=\"ZG-cellEditorContainer\">\n                        <div class=\"ZG-cell\">                           \n                            <div class=\"ZF-optionText ZF-textField ZF-fieldEditState\" tabindex=\"0\" data-placeholder=\"\" ><span class=\"ZF-optionTextValue\" contenteditable=\"true\">data grid</span></div>\n                        </div>  \n                    </div>`;\n\n\t\tconst div = document.createElement('div');\n\t\tdiv.innerHTML = res;\n\n\t\treturn div.firstChild as HTMLElement;\n\t};\n}","import { GRID_ELEMENT_NAMES } from \"../Core/Constants/GridConfigurationConstants\";\nimport { getCSSClassNameForName, getReferenceNameforName } from \"../GridComponent/GridBodyComponent/RowContainer/utils/classNames\";\nimport { ROW_CONTAINER_NAME } from \"../GridComponent/GridBodyComponent/RowContainer/utils/type\";\n\nexport function gridRowContainerTemplate() {\n    return function getTemplate(name : ROW_CONTAINER_NAME): HTMLElement {\n        const classNames = getCSSClassNameForName(name);\n        const reference = getReferenceNameforName(name);\n        let res = `<div ref='eContainer' class=\"${classNames}\"></div>`;\n        const isCenter = name === ROW_CONTAINER_NAME.CENTER;\n        if(name === ROW_CONTAINER_NAME.CENTER || name === ROW_CONTAINER_NAME.FLOATING_RECORD_CENTER) {\n            const ganttTemplate = isCenter ? `<div class=\"dg-gantt-dependancy-wrapper\">\n                            <${GRID_ELEMENT_NAMES.GANTT_DEPENDENCY_MARK_CONTAINER} ref=\"ganttDependencyMarkContainer\"></${GRID_ELEMENT_NAMES.GANTT_DEPENDENCY_MARK_CONTAINER}>\n                        </div>` : '';\n\n            res = `<div ref=${reference} class=\"${classNames}\" role=\"presentation\">\n                <div class=\"ZG-centerColViewport\" ref=\"eViewPort\" role=\"presentation\">\n                    <div class=\"ZG-centerColContainer\" ref=\"eContainer\" role=\"rowgroup\">\n                        ${ganttTemplate}\n                    </div>\n                </div>\n            </div>\n            `;\n        }else if( name === ROW_CONTAINER_NAME.TOP_CENTER || name === ROW_CONTAINER_NAME.BOTTOM_CENTER || name === ROW_CONTAINER_NAME.SUMMARY_CENTER) {\n            res = `<div class=\"ZG-pinndedCenterColViewport\" ref=\"eViewPort\" role=\"presentation\">\n                    <div class='ZG-pinnedCenterColContainer' ref='eContainer'></div>\n                </div>\n            `;\n        }else if(name === ROW_CONTAINER_NAME.HEADER) {\n            res = `<div ref='eContainer' class=${classNames}>\n                <dg-row-buffer class=\"plus\"></dg-row-buffer>\n            </div>`;\n        }else if(name === ROW_CONTAINER_NAME.STICKY_TOP_CENTER) {\n            res = `<div ref=${reference} class=\"${classNames}\" role=\"presentation\">\n                <div class=\"ZG-stickyTopContainer ZG-centerColViewport\" ref=\"eViewPort\" role=\"presentation\">\n                    <div class=\"ZG-stickyTopContainer ZG-centerColContainer\" ref=\"eContainer\" role=\"rowgroup\">\n                    </div>\n                </div>\n            </div>\n            `\n        }\n     \n        const div = document.createElement('div');\n        div.innerHTML = res;\n    \n        return div.firstChild as HTMLElement;\n    }\n}","export function getGridRowPlusTemplate() {\n\treturn function getTemplate(): HTMLElement {\n\t\tconst res = `<div class=\"ZG-rowPlus\">\n                    </div>`;\n\n\t\tconst div = document.createElement('div');\n\t\tdiv.innerHTML = res;\n\n\t\treturn div.firstChild as HTMLElement;\n\t};\n}\n","import { GRID_ELEMENT_NAMES } from \"../Core/Constants/GridConfigurationConstants\";\nimport { ROW_CONTAINER_NAME } from \"../GridComponent/GridBodyComponent/RowContainer/utils/type\";\n\nexport function gridTemplate(excludeElements : string[]) {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"ZG-rootWrapperBody ZG-grid-view-root\" role=\"treegrid\">\n            <datagrid-header ref=\"gridHeader\"></datagrid-header>\n            <div class=\"ZG-floatingTop\" ref='eTopContainer'>\n                <div class=\"ZG-floatingTopViewport\" ref='eTopViewPort'>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.TOP_HEADER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.TOP_LEFT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.TOP_CENTER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.TOP_RIGHT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.TOP_FULL_WIDTH}></datagrid-row-container>\n                </div>\n            </div>\n            <div class=\"ZG-gridBodyWrapper\" ref='eBodyConatiner' role=\"presentation\">\n            <${GRID_ELEMENT_NAMES.GANTT_TIMELINE_HOLDER}></${GRID_ELEMENT_NAMES.GANTT_TIMELINE_HOLDER}>\n                <div class=\"ZG-gridBody\" ref=\"eBodyViewPort\" role=\"presentation\">\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.HEADER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.LEFT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.CENTER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.RIGHT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.FULL_WIDTH} role=\"rowgroup\"></datagrid-row-container>\n                    <datagrid-no-record></datagrid-no-record>\n                </div>\n                ${excludeElements.includes(GRID_ELEMENT_NAMES.VERTICAL_SCROLL) ? '' : `<${GRID_ELEMENT_NAMES.VERTICAL_SCROLL}></${GRID_ELEMENT_NAMES.VERTICAL_SCROLL}>`}\n            </div>\n            <div class=\"ZG-stickyTop\" ref=\"eStickyTop\">\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.STICKY_TOP_HEADER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.STICKY_TOP_LEFT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.STICKY_TOP_CENTER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.STICKY_TOP_RIGHT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.STICKY_TOP_FULL_WIDTH} role=\"rowgroup\"></datagrid-row-container>\n            </div>\n            <div class=\"ZG-floatingBottom\" ref=\"eBottomConatiner\">\n                <div class=\"ZG-floatingBottomViewport\" ref=\"eBottomViewport\">\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.BOTTOM_HEADER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.BOTTOM_LEFT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.BOTTOM_CENTER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.BOTTOM_RIGHT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.BOTTOM_FULL_WIDTH}></datagrid-row-container>\n                </div>\n            </div>\n            <dg-floating-record-row ref=\"eFloatingContainer\"></dg-floating-record-row>\n            <div class=\"ZG-floatingBottom ZG-summaryBar\" ref=\"eSummaryContainer\">\n                <div class=\"ZG-floatingBottomViewport\">\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.SUMMARY_HEADER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.SUMMARY_LEFT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.SUMMARY_CENTER}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.SUMMARY_RIGHT}></datagrid-row-container>\n                    <datagrid-row-container rowtype=${ROW_CONTAINER_NAME.SUMMARY_FULL_WIDTH}></datagrid-row-container>\n                </div>\n            </div>\n            ${excludeElements.includes(GRID_ELEMENT_NAMES.HORIZONTAL_SCROLL) ? '' : `<${GRID_ELEMENT_NAMES.HORIZONTAL_SCROLL}></${GRID_ELEMENT_NAMES.HORIZONTAL_SCROLL}>`}\n            ${excludeElements.includes(GRID_ELEMENT_NAMES.GANTT_ACTION_BAR) ? '' : `<gantt-action></gantt-action>`}\n        </div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}\n\nexport function getBodyTemplate() {\n    return function getTemplate() : HTMLElement {\n        const template = `\n        <div class=\"ZG-gridScrollHolder\" ref=\"gridScrollHolder\">\n            <div class=\"ZG-gridScroller\">\n                <div class=\"ZG-rootWrapper\" ref='gridRootWrapper' role=\"presentation\">\n                    <datagrid-grid-body ref=\"gridBody\"></datagrid-grid-body>\n                </div>\n            </div>\n        </div>`;\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.querySelector('.ZG-gridScrollHolder') as HTMLElement;\n    }\n}\n","export function gridHeaderTemplate() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"ZG-gridHeader\" role=\"presentation\">\n            <dg-row-header-container name=\"rowHeader\"></dg-row-header-container>\n            <dg-row-header-container name=\"left\"></dg-row-header-container>\n            <dg-row-header-container name=\"center\"></dg-row-header-container>\n            <dg-row-header-container name=\"right\"></dg-row-header-container>\n        </div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}","import { columnPinPositions } from \"../../Core/Constants/GridConfigurationConstants\";\n\nexport function gridRowHeaderTemplate() {\n    return function getTemplate(pinned : columnPinPositions) : HTMLElement {\n        let template = '';\n        switch (pinned) {\n            case 'left':\n                template = `<div class=\"ZG-pinnedLeftCol ZG-pinnedLeftHeader\"></div>`\n                break;\n            case 'center':\n                template = `<div class='ZG-centerColViewport'>\n                    <div class=\"ZG-headerViewport\" ref=\"eViewPortContainer\">\n                        <dg-column-buffer></dg-column-buffer>\n                    </div>  \n                </div>`\n                break;\n            case 'right' : \n                template = `<div class=\"ZG-pinnedRightCol ZG-pinnedRightHeader\"></div>`\n                break;\n            case 'rowHeader':\n                template = `<div class=\"ZG-rowSelectionHeader\"></div>`\n                break;\n            default:\n                template = `<div class=\"ZG-headerViewport\" ref=\"eViewPortContainer\"></div>`\n                break;\n        }\n\n        const div           = document.createElement('div');\n            div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}","export function gridHSTemplate() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"ZG-horizontalScroll\">\n            <div class=\"ZG_pane ZG-horizontalScrollHeader\" ref=\"eHeaderScroll\"></div>\n            <div class=\"ZG_pane ZG-horizontalScrollLeft\" ref=\"eLeftScroll\"></div>\n            <div class=\"ZG_pane  ZG-horizontalScrollViewport\" ref=\"eViewport\">\n                <div class=\"ZG-horizondalScroller\" ref=\"eContainer\"></div>\n            </div>\n            <div class=\"ZG_pane ZG-horizontalScrollRight\" ref=\"eRightScroll\"></div>\n        </div>`\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}","export function gridVSTemplate() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"ZG-verticalScroll\">                        \n            <div class=\"ZG_pane ZG-verticalScrollViewport\" ref=\"eViewport\">\n                <div class=\"ZG-verticalScroller\" ref=\"eContainer\"></div>\n            </div>\n        </div>`\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}","import { GANTT_CLASS_NAMES } from \"../Core/Constants/CSSClassNameContants\";\n\nexport function ganttDependencyMarkContainerTemplate() {\n    return function getTemplate(): HTMLElement {\n        const template = `<div class=\"${GANTT_CLASS_NAMES.GANTT_DEPENDENCY_MARK_CONTAINER}\">\n            <svg width=\"100%\" height=\"100%\"></svg>\n        </div>`;\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}","import { IModule } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\nimport { CheckEditorRenderer } from \"./FieldComponent/Checkbox/CheckboxEditorRenderer\";\nimport { CurrencyEditorRenderer } from \"./FieldComponent/Currency/CurrencyEditorRenderer\";\nimport { DateEditorRenderer } from \"./FieldComponent/Date/DateEditorRenderer\";\nimport { EmailEditorRenderer } from \"./FieldComponent/Email/EmailEditorRenderer\";\nimport { MultilineEditorRenderer } from \"./FieldComponent/MultiLineTextRenderer.ts/MultiLineEditor\";\nimport { MultiSelectEditorRenderer } from \"./FieldComponent/MultiSelect/MultiSelectEditorRenderer\";\nimport { NumberEditorRenderer } from \"./FieldComponent/Number/NumberEditorRenderer\";\nimport { PercentEditorRenderer } from \"./FieldComponent/Percent/PercentEditorRenderer\";\nimport { PhoneNumberEditorRenderer } from \"./FieldComponent/PhoneNumber/PhoneNumberEditorRenderer\";\nimport { RatingEditorRenderer } from \"./FieldComponent/Rating/RatingEditorRenderer\";\nimport { SingleSelectEditorRenderer } from \"./FieldComponent/SingleSelect/SingleSelectEditorRenderer\";\nimport { TextEditorRenderer } from \"./FieldComponent/Text/TextEditorRenderer\";\nimport { URLEditorRenderer } from \"./FieldComponent/URL/URLEditorRenderer\";\n\nexport const GridCellEditorModule : IModule = {\n\tmoduleName: 'GridCellEditorModule',\n\tversion: '1.0.0',\n\tuserComponents : [\n\t\t{\n\t\t\t\"componentName\" : \"dgNumberCellEditor\",\n\t\t\t\"componentClass\" : NumberEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgURLEditor\",\n\t\t\t\"componentClass\" : URLEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgEmailEditor\",\n\t\t\t\"componentClass\" : EmailEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgPhoneEditorRenderer\",\n\t\t\t\"componentClass\" : PhoneNumberEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgRatingCellEditor\",\n\t\t\t\"componentClass\" : RatingEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgDateCellEditor\",\n\t\t\t\"componentClass\" : DateEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgPercentCellEditor\",\n\t\t\t\"componentClass\" : PercentEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgCurrencyCellEditor\",\n\t\t\t\"componentClass\" : CurrencyEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgCheckboxEditor\",\n\t\t\t\"componentClass\" : CheckEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgTextCellEditor\",\n\t\t\t\"componentClass\" : TextEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgMultilineEditor\",\n\t\t\t\"componentClass\" : MultilineEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgSingleSelectCellEditor\",\n\t\t\t\"componentClass\" : SingleSelectEditorRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgMultiSelectCellEditor\",\n\t\t\t\"componentClass\" : MultiSelectEditorRenderer\n\t\t}\n\t]\n}","import { IModule } from '../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types';\nimport { NavigationModule } from '../Navigation/navigation-module';\nimport { RangeSelectionModule } from '../rangeselection/range-selection-module';\nimport { NestedHeaderModule } from '../nested-header/nested-header-module';\nimport { ColumnSelection } from '../Selection/column-selection';\nimport { RowSelection } from '../Selection/row-selection';\nimport { ServerSideRowSelectionHandler } from '../Selection/row-selection-handler';\nimport { RowSelectionIndexHandler } from '../Selection/row-selection/row-selection-index';\nimport { ColumnSelectionAPI } from './API/selection/column-selection-api';\nimport { RowSelectionAPI } from './API/selection/row-selection-api';\nimport { RowSelectionIndexAPI } from './API/selection/selection-index/row-selection-index-api';\nimport { RowMovedRenderer } from './Components/RowMovedRenderer';\nimport { ColumnAddButtonRenderer } from './Core/Buffer/column/ColumnAddButtonGridRenderer';\nimport { RowPlusRenderer } from './Core/Buffer/row/RowPlusGridRenderer';\nimport { GridBeanClassRegistry } from './Core/GridBeanClassRegistry';\nimport { GridOptioHandler } from './Core/GridOptionHandler';\nimport { ViewportRangeRegistry } from './Core/ViewportRangeModule';\n\nexport const gridPlusRendererModule : IModule = {\n\tmoduleName: 'gridPlusRendererModule',\n\tversion: '1.0.0',\n\tuserComponents : [\n\t\t{\n\t\t\t\"componentName\" : \"rowPlusRenderer\",\n\t\t\t\"componentClass\" : RowPlusRenderer\n\t\t},\n\t\t{\n\t\t\tcomponentName : \"columnPlusRenderer\",\n\t\t\tcomponentClass : ColumnAddButtonRenderer\n\t\t}\n\t]\n}\n\nexport const ServerRowSelectionModule : IModule = {\n\trowModel      : 'remote',\n\tmoduleName    : 'row-selection',\n\tversion       : '0.0.1',\n\tbeans         : [ServerSideRowSelectionHandler, RowSelectionAPI],\n\tselectionModel: 'id'\n}\n\nexport const LocalRowSelectionModule : IModule = {\n\trowModel      : 'local',\n\tmoduleName    : 'row-selection-id',\n\tversion       : '0.0.1',\n\tbeans         : [RowSelection, RowSelectionAPI],\n\tselectionModel: 'id'\n}\n\nexport const RowSelectionIndexModule : IModule = {\n\tmoduleName    : 'row-selection-index',\n\tversion       : '0.0.1',\n\tbeans         : [RowSelectionIndexHandler, RowSelectionIndexAPI],\n\tselectionModel: 'index'\n}\n\nexport const LocalRowModelModule : IModule = {\n\trowModel  : 'local',\n\tversion   : '0.0.1',\n\tmoduleName: 'local-row-model',\n\tdependantModules : [RowSelectionIndexModule, LocalRowSelectionModule]\n}\n\nexport const RemoteRowModelModule : IModule = {\n\trowModel  : 'remote',\n\tversion   : '0.0.1',\n\tmoduleName: 'remote-row-model',\n\tdependantModules : [RowSelectionIndexModule, ServerRowSelectionModule]\n}\n\n\n\nexport const GridModule: IModule = {\n\tmoduleName       : 'grid',\n\tversion          : '1.0.0',\n\tbeans            : [GridBeanClassRegistry, GridOptioHandler, ColumnSelection, ColumnSelectionAPI, ViewportRangeRegistry],\n\tmodelType        : 'grid',\n\tuserComponents : [{\n\t\tcomponentName : 'rowMovedRenderer',\n\t\tcomponentClass : RowMovedRenderer\n\t}],\n\tdependantModules : [gridPlusRendererModule, NavigationModule, RangeSelectionModule, NestedHeaderModule, LocalRowModelModule, RemoteRowModelModule]\n};\n","import { IModule } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\nimport { CheckboxRenderer } from \"./FieldComponent/Checkbox/CheckboxRenderer\";\nimport { CurrencyRenderer } from \"./FieldComponent/Currency/CurrencyRenderer\";\nimport { DateRenderer } from \"./FieldComponent/Date/DateRenderer\";\nimport { EmailRenderer } from \"./FieldComponent/Email/EmailRenderer\";\nimport { MultilineTextRenderer } from \"./FieldComponent/MultiLineTextRenderer.ts/MultilineTextRenderer\";\nimport { MultiSelectRenderer } from \"./FieldComponent/MultiSelect/MultiSelectRenderer\";\nimport { NumberRenderer } from \"./FieldComponent/Number/NumberRenderer\";\nimport { PercentRenderer } from \"./FieldComponent/Percent/PercentRenderer\";\nimport { PhoneNumberRenderer } from \"./FieldComponent/PhoneNumber/PhoneNumberRenderer\";\nimport { RatingRenderer } from \"./FieldComponent/Rating/RatingRenderer\";\nimport { SingleSelectRenderer } from \"./FieldComponent/SingleSelect/SingleSelectRenderer\";\nimport { TextRenderer } from \"./FieldComponent/Text/TextRenderer\";\nimport { URLRenderer } from \"./FieldComponent/URL/URLRenderer\";\n\nimport { ImageRenderingComponent } from \"./FieldComponent/RenderingComponent/ImageRenderingComponent\";\nimport { CheckboxRenderingComponent } from \"./FieldComponent/RenderingComponent/CheckboxRenderingComponent\";\nimport { TextRenderingComponent } from \"./FieldComponent/RenderingComponent/TextRenderingComponent\";\nimport { RatingRenderingComponent } from \"./FieldComponent/RenderingComponent/RatingRenderingComponent\";\nimport { ChipRenderingComponent } from \"./FieldComponent/RenderingComponent/ChipRenderingComponent\";\nimport { CELL_RENDERER_TYPE, CELL_RENDERING_COMPONENT } from \"./Core/Constants/GridConfigurationConstants\";\n\nexport const GridCellRendererModule: IModule = {\n\tmoduleName: 'GridCellRendererModule',\n\tversion: '1.0.0',\n\tuserComponents : [\n\t\t{\n\t\t\t\"componentName\": \"dgNumberCellRenderer\",\n\t\t\t\"componentClass\": NumberRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgLinkCellRenderer\",\n\t\t\t\"componentClass\" : URLRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgEmailRenderer\",\n\t\t\t\"componentClass\" : EmailRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgPhoneNumberRenderer\",\n\t\t\t\"componentClass\" : PhoneNumberRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgRatingCellRenderer\",\n\t\t\t\"componentClass\" : RatingRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgDateCellRenderer\",\n\t\t\t\"componentClass\" : DateRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgPercentCellRenderer\",\n\t\t\t\"componentClass\" : PercentRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgCurrencyCellRenderer\",\n\t\t\t\"componentClass\" : CurrencyRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgCheckboxRenderer\",\n\t\t\t\"componentClass\" : CheckboxRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgTextCellRenderer\",\n\t\t\t\"componentClass\" : TextRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgMultilineRenderer\",\n\t\t\t\"componentClass\" : MultilineTextRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgSingleSelectCellRenderer\",\n\t\t\t\"componentClass\" : SingleSelectRenderer\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : \"dgMultiSelectCellRenderer\",\n\t\t\t\"componentClass\" : MultiSelectRenderer\n\t\t},\n\n\n\t\t// rendering components\n\t\t{\n\t\t\t\"componentName\" : CELL_RENDERING_COMPONENT[CELL_RENDERER_TYPE.IMAGE],\n\t\t\t\"componentClass\" : ImageRenderingComponent\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : CELL_RENDERING_COMPONENT[CELL_RENDERER_TYPE.CHECKBOX],\n\t\t\t\"componentClass\" : CheckboxRenderingComponent\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : CELL_RENDERING_COMPONENT[CELL_RENDERER_TYPE.TEXT],\n\t\t\t\"componentClass\" : TextRenderingComponent\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : CELL_RENDERING_COMPONENT[CELL_RENDERER_TYPE.RATING],\n\t\t\t\"componentClass\" : RatingRenderingComponent\n\t\t},\n\t\t{\n\t\t\t\"componentName\" : CELL_RENDERING_COMPONENT[CELL_RENDERER_TYPE.CHIP],\n\t\t\t\"componentClass\" : ChipRenderingComponent\n\t\t}\n\t],\n\tmodelType: 'grid',\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"../Constants/KanbanConstants\";\nimport { IKanbanAPI } from \"./IKanbanAPI\";\nimport { IRecordData } from \"../Data/IDataFetcher\";\nimport { IBoardDefinition, IBoardPosition } from \"../Interface/IBoardDefinition\";\nimport { KanbanListRegistry } from \"../KanbanListRegistry\";\nimport { KanbanOptionHandler } from \"../KanbanOptionHandler\";\n\n@Bean(KANBAN_BEAN_NAME.KANBAN_API)\nclass KanbanAPI extends EventEmitter implements IKanbanAPI {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n    @AutoWired(KANBAN_BEAN_NAME.KANBAN_LIST_REGISTRY) private listRegistry !: KanbanListRegistry;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler !: KanbanOptionHandler;\n\n    expandBoard(boardID: string): void {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        boardHandler.expandBoard(boardID)\n    }\n    collapseBoard(boardID: string): void {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        boardHandler.collapseBoard(boardID)\n    }\n    //board apis\n    createBoard(boardDefinition: IBoardDefinition): void {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        boardHandler.appendBoard(boardDefinition);\n    }\n    insertBoard(boardId: string, boardDefinition: IBoardDefinition, position: IBoardPosition): void {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        boardHandler.insertBoard(boardId, boardDefinition, position);\n    }\n    \n    deleteBoard(boardID: string): void {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        boardHandler.deleteBoard(boardID);\n    }\n\n    moveBoard(sourceBoardID: string, targetBoardID: string, position : IBoardPosition): void {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        boardHandler.moveBoard(sourceBoardID, targetBoardID, position);\n    }\n    \n    updateBoard(_boardID: string, _boardDefinition: IBoardDefinition): void {\n        throw new Error(\"Method not implemented.\");\n    }\n   \n    createCard(cardData: IRecordData, boardIdParam?: string): string {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        let boardId: string | null = boardIdParam ?? null;\n        if (!boardId) {\n            const groupBy = this.optionHandler.getGroupByField();\n            const fieldValue = (cardData as Record<string, unknown>)[groupBy];\n            if (fieldValue == null || fieldValue === '') {\n                throw new Error(`createCard: provide boardId or include groupBy field '${groupBy}' in cardData to determine the board.`);\n            }\n            const boardIds = boardHandler.getBoardIDs();\n            for (const id of boardIds) {\n                const node = boardHandler.getBoardNode(id);\n                if (node.getFieldKey() === fieldValue) {\n                    boardId = id;\n                    break;\n                }\n            }\n            if (!boardId) {\n                throw new Error(`createCard: no board found for fieldKey '${fieldValue}'.`);\n            }\n        }\n        const rowAPI = this.listRegistry.getRowAPI(boardId);\n        if (!rowAPI) {\n            throw new Error(`No list found for board ${boardId}. Ensure the board is rendered.`);\n        }\n        const rowId = (cardData as Record<string, unknown>).id as string\n            ?? (cardData as Record<string, unknown>).Bug_Prefix as string\n            ?? (cardData as Record<string, unknown>).bugPrefix as string\n            ?? `card-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n        rowAPI.appendrow(cardData as Record<string, unknown>, { rowId });\n        return rowId;\n    }\n\n    createCardById(cardData: IRecordData, targetCardId: string, position: 'before' | 'after'): string {\n        const boardId = this.listRegistry.getBoardIdForRowId(targetCardId);\n        if (!boardId) {\n            throw new Error(`Target card ${targetCardId} not found in any board.`);\n        }\n        const rowAPI = this.listRegistry.getRowAPI(boardId);\n        if (!rowAPI) {\n            throw new Error(`No list found for board ${boardId}.`);\n        }\n        const rowId = (cardData as Record<string, unknown>).id as string\n            ?? (cardData as Record<string, unknown>).Bug_Prefix as string\n            ?? (cardData as Record<string, unknown>).bugPrefix as string\n            ?? `card-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n        rowAPI.insertRowById(targetCardId, position, cardData as Record<string, unknown>, { rowId });\n        return rowId;\n    }\n\n    createCardByIndex(index: number, cardData: IRecordData, boardIdParam?: string): string {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        let boardId: string | null = boardIdParam ?? null;\n        if (!boardId) {\n            const groupBy = this.optionHandler.getGroupByField();\n            const fieldValue = (cardData as Record<string, unknown>)[groupBy];\n            if (fieldValue == null || fieldValue === '') {\n                throw new Error(`createCardByIndex: provide boardId or include groupBy field '${groupBy}' in cardData.`);\n            }\n            const boardIds = boardHandler.getBoardIDs();\n            for (const id of boardIds) {\n                const node = boardHandler.getBoardNode(id);\n                if (node.getFieldKey() === fieldValue) {\n                    boardId = id;\n                    break;\n                }\n            }\n            if (!boardId) {\n                throw new Error(`createCardByIndex: no board found for fieldKey '${fieldValue}'.`);\n            }\n        }\n        const rowAPI = this.listRegistry.getRowAPI(boardId);\n        if (!rowAPI) {\n            throw new Error(`No list found for board ${boardId}. Ensure the board is rendered.`);\n        }\n        const rowId = (cardData as Record<string, unknown>).id as string\n            ?? (cardData as Record<string, unknown>).Bug_Prefix as string\n            ?? (cardData as Record<string, unknown>).bugPrefix as string\n            ?? `card-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n        rowAPI.insertRow(index, 'before', cardData as Record<string, unknown>, { rowId });\n        return rowId;\n    }\n\n    updateCardData(cardID: string, cardData: IRecordData): void {\n        const boardId = this.listRegistry.getBoardIdForRowId(cardID);\n        if (!boardId) {\n            throw new Error(`Card ${cardID} not found in any board.`);\n        }\n        const rowAPI = this.listRegistry.getRowAPI(boardId);\n        if (!rowAPI) {\n            throw new Error(`No list found for board ${boardId}.`);\n        }\n        rowAPI.updateRowDataById(cardID, cardData as Record<string, unknown>);\n    }\n\n    deleteCard(cardID: string): void {\n        const boardId = this.listRegistry.getBoardIdForRowId(cardID);\n        if (!boardId) {\n            throw new Error(`Card ${cardID} not found in any board.`);\n        }\n        const rowAPI = this.listRegistry.getRowAPI(boardId);\n        if (!rowAPI) {\n            throw new Error(`No list found for board ${boardId}.`);\n        }\n        rowAPI.removeRowById(cardID);\n    }\n\n\n\n    updateKanbanConfiguration(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    collapseAll(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    expandAll(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    groupBy(_groupByField: string): void {\n        throw new Error(\"Method not implemented.\");\n    }\n\n    showBoard(_boardID: string): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    hideBoard(_boardID: string): void {\n        throw new Error(\"Method not implemented.\");\n    }\n\n    \n    lockBoard(_boardID: string): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    unlockBoard(_boardID: string): void {\n        throw new Error(\"Method not implemented.\");\n    }\n   \n\n    \n}\n\nexport {\n    KanbanAPI\n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME, board_position } from \"./Constants/KanbanConstants\";\nimport { IBoardDefinition, IBoardPosition } from \"./Interface/IBoardDefinition\";\nimport { kanban_events } from \"./Constants/KanbanEvents\";\nimport { BoardDataNode } from \"./DataNodes/BoardDataNode\";\nimport { IBoardNode } from \"./DataNodes/IBoardDataNode\";\n\n\n@Bean(KANBAN_BEAN_NAME.BOARD_HANDLER)\nclass BoardHandler extends EventEmitter {\n\n    // @AutoWired(BEAN_NAME.BEANS) private getBeanInstance !: getBeanInstanceByBeanName;\n\n    private boardNodeMap : {[boardId : string] : IBoardNode} = {};\n    private boardIDs : string[] = [];\n\n\n    constructBoard(boardDefinitions : IBoardDefinition[]) : void {\n\n        boardDefinitions.forEach((boardDefinition : IBoardDefinition) => {\n            this.createBoard(boardDefinition);\n        });\n        const onBoardCreatedEvent = {\n            type : kanban_events.ON_BOARD_NODE_CHANGED\n        }; \n        this.dispatchEvent(onBoardCreatedEvent);\n    }\n\n    private createBoard(boardDefinition : IBoardDefinition) : IBoardNode {\n        const boardID = boardDefinition.boardId ?? boardDefinition.fieldKey;\n        const boardNode = this.createManagedBean(new BoardDataNode(boardDefinition));\n\n        this.boardNodeMap[boardID] = boardNode;\n        this.boardIDs.push(boardID);\n\n        return boardNode;\n    }\n\n    appendBoard(boardDefinition : IBoardDefinition) : void {\n       const boardNode = this.createBoard(boardDefinition);\n\n        this.dispatchEvent({\n            type : kanban_events.ON_BOARD_APPENDED,\n            boardId : boardNode.getBoardId()\n        });\n    }\n\n    insertBoard(boardId: string, boardDefinition: IBoardDefinition, position: IBoardPosition) {\n        const boardIndex = this.boardIDs.indexOf(boardId);\n        if (boardIndex === -1) { return; }\n    \n        //create board\n        const boardID = boardDefinition.boardId ?? boardDefinition.fieldKey;\n        const boardNode = this.createManagedBean(new BoardDataNode(boardDefinition));\n        this.boardNodeMap[boardID] = boardNode;\n\n        const newBoardId = boardNode.getBoardId();\n    \n        if (position === board_position.AFTER) {\n            this.boardIDs.splice(boardIndex + 1, 0, newBoardId);\n        } \n        else if (position === board_position.BEFORE) {\n            this.boardIDs.splice(boardIndex, 0, newBoardId);\n        }\n\n        this.dispatchEvent({\n            type : kanban_events.ON_BOARD_INSERTED,\n            boardId : boardNode.getBoardId(),\n            targetBoardId : boardId,\n            position : position\n        });\n    }\n\n    deleteBoard(boardId : string) : void {\n        const boardIndex = this.boardIDs.indexOf(boardId);\n        if (boardIndex === -1) { return; }\n\n        this.boardIDs.splice(boardIndex, 1);\n        delete this.boardNodeMap[boardId];\n\n        this.dispatchEvent({\n            type : kanban_events.ON_BOARD_DELETED,\n            boardId : boardId\n        })\n    }\n\n    moveBoard(sourceBoardId : string, targetBoardId : string, position = board_position.AFTER) : void {\n        const sourceIndex = this.boardIDs.indexOf(sourceBoardId);\n        const targetIndex = this.boardIDs.indexOf(targetBoardId);\n      \n        if (sourceIndex === -1 || targetIndex === -1) {\n          throw new Error('Source or Target node not found');\n        }\n\n        const [boardId] = this.boardIDs.splice(sourceIndex, 1);\n    \n        let newIndex = targetIndex;\n        if (position === board_position.AFTER) {\n          newIndex += 1;\n        }\n\n        this.boardIDs.splice(newIndex, 0, boardId);\n\n        const moveBoardEvent : IBoardMoveEventParam = {\n            type : kanban_events.ON_BOARD_MOVED,\n            sourceId : sourceBoardId,\n            targetId : targetBoardId,\n            position : position\n        }\n        this.dispatchEvent(moveBoardEvent);\n    }\n    \n\n    getBoardIDs() : string[] {\n        return this.boardIDs;\n    }\n\n    getBoardNode(id : string) : IBoardNode {\n        return this.boardNodeMap[id];\n    }\n\n    getAllBoardId() : string[] {\n        return this.boardIDs;\n    }\n\n    getTotalBoardCount() : number {\n        return this.boardIDs.length;\n    }\n\n    collapseBoard(boardID : string) : void {\n        const boardNode : IBoardNode = this.boardNodeMap[boardID];\n        boardNode.setBoardCollapsed(true);\n        this.dispatchEvent({\n            type : kanban_events.ON_BOARD_COLLAPSED,\n            boardId : boardID\n        }); \n    }\n\n    expandBoard(boardID : string) : void {\n        const boardNode : IBoardNode = this.boardNodeMap[boardID];\n        boardNode.setBoardCollapsed(false);\n        this.dispatchEvent({\n            type : kanban_events.ON_BOARD_EXPANDED,\n            boardId : boardID\n        });\n    }\n\n\n\n}\n\nexport interface IBoardCreateEventParam {\n    type : string,\n    boardId : string,\n    targetBoardId ?: string,\n    position ?: IBoardPosition\n}\n\nexport interface IBoardMoveEventParam {\n    type : string,\n    sourceId : string,\n    targetId : string,\n    position : string\n}\n\nexport interface IBoardDeleteEventParam {\n    type : string,\n    boardId : string,\n}\n\nexport {\n    BoardHandler\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"../Constants/KanbanConstants\";\n\n\ninterface IHeaderEventListener {\n    registerDragElement(dragElement : HTMLElement) : void;\n    registerCollapseElement(collapseElement : HTMLElement) : void;\n}\n\nclass HeaderEventListener extends EventEmitter implements IHeaderEventListener {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstance !: getBeanInstanceByBeanName;\n\n    \n    // private getElement : () => HTMLElement;\n    private boardId : string;\n\n    constructor(boardID : string, _getElement : () => HTMLElement) {\n        super();\n        this.boardId = boardID;\n        // this.getElement = getElement;\n    }\n\n    @PostConstruct()\n    init() {\n\n    }\n\n    registerDragElement(_dragElement: HTMLElement): void {\n        \n    }\n\n    registerCollapseElement(collapseElement : HTMLElement) : void {\n        this.addListener(collapseElement, 'click', this.collapseElement.bind(this));\n    }\n\n    private collapseElement() : void {\n        const kanbanAPI = this.getBeanInstance(KANBAN_BEAN_NAME.KANBAN_API);\n        kanbanAPI.collapseBoard(this.boardId);\n    }\n\n\n}\n\nexport {\n    HeaderEventListener,\n    IHeaderEventListener\n}","import { BEAN_NAME, Component, getBeanInstanceByBeanName, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { IBoardBodyController } from \"./BoardBodyController\";\nimport { getKanbanBoardBodyContainer } from \"../../KanbanTemplate\";\nimport { removeFromParent } from \"../../../Grid/Core/utils/Dom\";\n\ninterface IBoardBodyComponent {\n    getGui : () => HTMLElement;\n    setCollapsedRendererDetails : (details : any) => void;\n}\n\nclass BoardBodyComponent extends Component {\n\n    private collapsedRendererInstance !: any;\n    private collapsedRendererElement !: any;\n\n\n    @queryAssignedNodes('kanbanBoardBodyWrapper') private boardInnerContainer !: HTMLElement;\n\n    private getBeanInstance : getBeanInstanceByBeanName;\n\n    constructor(boardBodyController : IBoardBodyController, getBeanInstance) {\n        super();\n        this.getBeanInstance = getBeanInstance;\n\n        const template = getKanbanBoardBodyContainer();\n        this.setTemplate(template);\n        \n        const componentWrapper : IBoardBodyComponent  = {\n            getGui : () => { return this.boardInnerContainer },\n            setCollapsedRendererDetails : (details : any) => { this.setCollapsedRendererDetails(details);}\n        }\n\n        boardBodyController.setComponent(componentWrapper);\n    }\n\n    // collapsed renderer\n\n    private setCollapsedRendererDetails(details : any) : void {\n        details.componentClass && (this.collapsedRendererInstance = details?.newInstance());\n        this.collapsedRendererElement = this.collapsedRendererInstance?.getElement();\n    }\n\n    appendCollapsedElement() : void {\n        const rootElement = this.getGui();\n        this.collapsedRendererElement && rootElement && rootElement.appendChild(this.collapsedRendererElement as HTMLElement);\n    }\n\n    removeCollapsedElement() : void {\n        const rootElement = this.getGui();\n        this.collapsedRendererElement?.parentNode &&  rootElement && rootElement.removeChild(this.collapsedRendererElement as HTMLElement);\n    }\n\n    generateCollapsed() : void {\n        this.boardInnerContainer?.classList.add('kanban__board-body--collapsed');\n        \n        this.appendCollapsedElement();\n    };\n\n    degenerateCollapsed() : void {\n        this.boardInnerContainer?.classList.remove('kanban__board-body--collapsed');\n        this.removeCollapsedElement();\n    }\n    \n    destroy() : void {\n        this.destroyRenderer();\n\t\tsuper.destroy();\n    }\n\n    private destroyRenderer(): void {\n\t\tconst context = this.getBeanInstance(BEAN_NAME.CONTEXT);\n\t\tthis.collapsedRendererInstance = context.destroyBean(this.collapsedRendererInstance);\n\n\t\tremoveFromParent(this.getGui());\n\n\t\tthis.collapsedRendererElement = null;\n        this.collapsedRendererInstance = null;\n\t}\n}\n\nexport {\n    BoardBodyComponent,\n    IBoardBodyComponent\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IBoardBodyComponent } from \"./BoardBodyComponent\";\nimport { KANBAN_BEAN_NAME } from \"../../Constants/KanbanConstants\";\nimport { IKanbanUserComponentHandler } from \"../../KanbanUserComponentHandler\";\nimport { IKanbanAPI } from \"../../API/IKanbanAPI\";\nimport { IListInteracter, ListInteracter } from \"../../ListInteracter\";\nimport { KanbanListRegistry } from \"../../KanbanListRegistry\";\n\ninterface IBoardBodyController {\n    setComponent(component : IBoardBodyComponent) : void;\n    getBoardId() : string;\n    destroy(): void;\n}\n\n\nclass BoardBodyController extends EventEmitter {\n\n    private component !: IBoardBodyComponent;\n    private listInteracter !: IListInteracter;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n    @AutoWired(KANBAN_BEAN_NAME.KANBAN_LIST_REGISTRY) private listRegistry !: KanbanListRegistry;\n    private boardID : string;\n\n    constructor(boardID : string) {\n        super();\n        this.boardID = boardID;\n    }\n\n    @PostConstruct()\n    init() {\n        this.listInteracter = this.createManagedBean(new ListInteracter(this.boardID));\n        this.addDestroyFunc(()=>{\n            this.listInteracter.destroyListView();\n        })\n    }\n\n    setComponent(component : IBoardBodyComponent) : void {\n        this.component = component;\n        this.renderList();\n        this.addListenerForBoard();\n    }\n\n    private renderList() :void {\n        this.listInteracter.createListView(this.component.getGui());\n        const listInstance = this.listInteracter.getListInstance();\n        if (listInstance && this.listRegistry) {\n            this.listRegistry.register(this.boardID, { rowAPI: listInstance.rowAPI });\n        }\n    }\n\n    private addListenerForBoard() : void {\n        //collapsed renderer\n        this.setCollapsedRendererDetails();\n    }\n\n    private setCollapsedRendererDetails() : void {\n        const userComponentHandler  : IKanbanUserComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n\n        const rendererDetails = this.createUserParam();\n\n        const boardNode = boardHandler.getBoardNode(this.boardID);\n\n        const collapsedRendererDetails = userComponentHandler.getCollapsedBoardRendererDetails(boardNode, rendererDetails);\n\n        this.component.setCollapsedRendererDetails(collapsedRendererDetails);\n\n    }\n\n    private createUserParam() : any {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        const boardNode = boardHandler.getBoardNode(this.boardID);\n        const rendererParams = boardNode.getCollapsedRendererParams();\n        let userParam: any = {\n            boardID : this.boardID,\n            registerExpandElement : this.registerExpandElement.bind(this)\n        };\n        rendererParams && (userParam = {...userParam, ...rendererParams});\n        return userParam;\n    }\n\n    registerExpandElement(expandElement : HTMLElement) : void {\n        this.addListener(expandElement, 'click', (_event : MouseEvent) => {\n            const kanbanAPI : IKanbanAPI = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.KANBAN_API);\n            kanbanAPI.expandBoard(this.boardID);\n        });\n    }\n\n    getBoardId() : string {\n        return this.boardID;\n    }\n\n    destroy(): void {\n        this.listRegistry?.unregister(this.boardID);\n        super.destroy();\n    }\n}\n\nexport {\n    BoardBodyController,\n    IBoardBodyController\n}","import { Component, getBeanInstanceByBeanName, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { IBoardContainerController } from \"./BoardController\";\nimport { getKanbanBoardExpandedContainer } from \"../../KanbanTemplate\";\nimport { IBoardHeaderController } from \"../BoardHeaderContainer/BoardHeaderController\";\nimport { IBoardBodyController } from \"../BoardBodyContainer/BoardBodyController\";\nimport { BoardHeaderComponent } from \"../BoardHeaderContainer/BoardHeaderComponent\";\nimport { BoardBodyComponent } from \"../BoardBodyContainer/BoardBodyComponent\";\nimport { removeFromParent } from \"../../../Grid/Core/utils/Dom\";\n\ninterface IBoardContainerComponent {\n    getGui : () => HTMLElement;\n    generateHeader : (boardHeaderController : IBoardHeaderController) => void\n    generateBoardBody : (boardBodyController : IBoardBodyController) => void\n    onBoardCollapsed : ()=>void;\n    onBoardExpanded : ()=>void;\n    destroy : () => void;\n}\n\nclass BoardContainerComponent extends Component {\n\n    @queryAssignedNodes('kanbanBoardContainer') private innerBoardContainer !: HTMLElement;\n \n    private boardBodyComponent !: BoardBodyComponent | null;\n    private boardHeaderComponent !: BoardHeaderComponent;\n\n    private getBeanInstance !: getBeanInstanceByBeanName;\n\n    constructor(boardContainerController : IBoardContainerController, getBeanInstance : getBeanInstanceByBeanName){\n        super();\n        this.getBeanInstance = getBeanInstance;\n        const template = getKanbanBoardExpandedContainer();\n        this.setTemplate(template);\n\n        const componentWrapper : IBoardContainerComponent  = {\n            getGui : () => { return this.getGui() },\n            generateHeader : (boardHeaderController : IBoardHeaderController) => {this.generateHeader(boardHeaderController)},\n            generateBoardBody : (boardBodyController : IBoardBodyController) => { this.generateBoardBody(boardBodyController)},\n            onBoardCollapsed : () => {this.onBoardCollapsed()},\n            onBoardExpanded : () => { this.onBoardExpanded()},\n            destroy : () => { this.destroy(); },\n        }\n\n        boardContainerController.setComponent(componentWrapper);\n    }\n\n    generateHeader(boardHeaderController : IBoardHeaderController) : void {\n        this.boardHeaderComponent = new BoardHeaderComponent(boardHeaderController, this.getBeanInstance);\n        this.addDestroyFunc(()=> {\n            this.boardHeaderComponent.destroy();\n        })\n        //generateboard\n    \n        this.boardHeaderComponent.setParentComponent(this);\n        this.appendChild(this.boardHeaderComponent, this.innerBoardContainer);\n    }\n\n    generateBoardBody(boardBodyController : IBoardBodyController) : void {\n        this.boardBodyComponent = new BoardBodyComponent(boardBodyController, this.getBeanInstance);\n        this.addDestroyFunc(()=>{\n            this.boardBodyComponent.destroy();\n        })\n        //generateboard\n\n\n        this.boardBodyComponent.setParentComponent(this);\n        this.appendChild(this.boardBodyComponent, this.innerBoardContainer);\n    }\n\n    onBoardCollapsed() : void {\n        this.boardHeaderComponent.generateCollapseHeader();\n        this.boardBodyComponent.generateCollapsed();\n        this.getGui().classList.add('dg-kanban__board-collapsed');\n\n    }\n\n    onBoardExpanded() : void {\n        this.boardHeaderComponent.degenerateCollapsedHeader();\n        this.boardBodyComponent.degenerateCollapsed();\n        this.getGui().classList.remove('dg-kanban__board-collapsed');\n\n    }\n\n    destroy(): void {\n        this.boardHeaderComponent.destroy();\n        this.boardBodyComponent.destroy();\n\n        removeFromParent(this.getGui())\n\n        this.boardHeaderComponent = null;\n        this.boardBodyComponent = null;\n\n    }\n}\n\nexport {\n    BoardContainerComponent,\n    IBoardContainerComponent\n}","import { AutoWired, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"../../Constants/KanbanConstants\";\nimport { IBoardContainerComponent } from \"./BoardComponent\";\nimport { BoardHeaderController, IBoardHeaderController } from \"../BoardHeaderContainer/BoardHeaderController\";\nimport { BoardBodyController, IBoardBodyController } from \"../BoardBodyContainer/BoardBodyController\";\n\ninterface IBoardContainerController {\n    setComponent(component : IBoardContainerComponent) : void;\n    generateController() : void;\n    getInstanceID() : string;\n    onBoardCollapsed() : void;\n    onBoardExpanded() : void;\n    destroy() : void;\n}\n\n\nclass BoardContainerController extends EventEmitter implements IBoardContainerController {\n\n    @AutoWired(KANBAN_BEAN_NAME.BOARD_HANDLER) private boardHandler !: { getBoardNode: (id: string) => { isBoardCollapsed: () => boolean } };\n\n    private component !: IBoardContainerComponent;\n\n    private instanceID : string;\n\n    private headerController !: IBoardHeaderController;\n    private bodyController !: IBoardBodyController;\n\n    constructor(id  : string) {\n        super();\n        this.instanceID = id;\n    } \n\n    @PostConstruct()\n    init() {\n        this.headerController = this.createManagedBean(new BoardHeaderController(this.instanceID));\n        this.bodyController = this.createManagedBean(new BoardBodyController(this.instanceID));\n    }\n\n\n    setComponent(component : IBoardContainerComponent) : void {\n        this.component = component;\n        this.generateController();\n        const boardNode = this.boardHandler?.getBoardNode(this.instanceID);\n        if (boardNode?.isBoardCollapsed()) {\n            this.component.onBoardCollapsed();\n        }\n        this.addBoardListener();\n    }\n\n    getInstanceID() : string {\n        return this.instanceID;\n    }\n\n    generateController() : void {\n        this.component.generateHeader(this.headerController);\n        this.component.generateBoardBody(this.bodyController);\n    }\n\n    private addBoardListener() : void {\n        // this.addEventListener(kanban_events.ON_BOARD_COMPONENT_READY, this.generateController.bind(this));\n    }\n\n    onBoardCollapsed() : void {\n        this.component.onBoardCollapsed();\n    }\n\n    onBoardExpanded() : void {\n        this.component.onBoardExpanded();\n    }\n    \n    destroy() : void{\n        this.headerController.destroy();\n        this.bodyController.destroy();\n\n        this.headerController = null;\n        this.bodyController = null;\n    }\n}\n\nexport {\n    BoardContainerController,\n    IBoardContainerController\n}","import { IBoardHeaderController } from \"./BoardHeaderController\";\nimport { getKanbanBoardHeaderContainer } from \"../../KanbanTemplate\";\nimport { BEAN_NAME, Component, getBeanInstanceByBeanName, removeFromParent } from \"@dg/corecomponent\";\n\ninterface IBoardHeaderComponent {\n    getGui : () => HTMLElement\n    setRendererDetails : (details : any) => void;\n    setCollapsedRendererDetails : (details : any) => void;\n    appendHeaderElement : () => void;\n    generateCollapseHeader : () => void;\n    destroy : () => void;\n}\n\nclass BoardHeaderComponent extends Component {\n\n    private headerElement !: HTMLElement | null;\n    private headerInstance !: any;\n\n    private collapsedHeaderElement !: Element | null;\n    private collapsedHeaderInstance !: any;\n\n    private getBeanInstance : getBeanInstanceByBeanName;\n \n    constructor(boardHeaderController : IBoardHeaderController, getBeanInstance : getBeanInstanceByBeanName) {\n        super();\n        this.getBeanInstance = getBeanInstance;\n        const template = getKanbanBoardHeaderContainer();\n        this.setTemplate(template);\n\n        const componentWrapper : IBoardHeaderComponent  = {\n            getGui: () => { return this.getGui(); },\n            setRendererDetails: (details: any) => { this.setRendererDetails(details); },\n            setCollapsedRendererDetails: (details: any) => { this.setCollapsedRendererDetails(details); },\n            appendHeaderElement: () => { this.appendHeaderElement(); },\n            generateCollapseHeader : () => { this.generateCollapseHeader(); },\n            destroy : () => { this.destroy(); }\n        }\n        boardHeaderController.setComponent(componentWrapper);\n    }\n\n    setRendererDetails(headerDetails : any) : void {\n        this.headerInstance = headerDetails?.newInstance();\n        this.headerElement = this.headerInstance.getElement();\n    }\n\n    appendHeaderElement() : void {\n        const sec_wrapper = document.createElement('div');\n        sec_wrapper.classList.add('primary_header_elem')\n        this.appendChild(this.headerElement as HTMLElement, sec_wrapper);\n        this.appendChild(sec_wrapper);\n        // rootElement && rootElement.appendChild(this.headerElement as HTMLElement);\n    }\n\n    destroy(): void {\n\t\tthis.destroyRenderer();\n\t\tsuper.destroy();\n\t}\n\n    private destroyRenderer(): void {\n\t\tconst context = this.getBeanInstance(BEAN_NAME.CONTEXT);\n\t\tthis.headerInstance = context.destroyBean(this.headerInstance);\n        this.collapsedHeaderInstance = context.destroyBean(this.collapsedHeaderInstance);\n\n\t\tremoveFromParent(this.getGui());\n\n\t\tthis.headerElement = null;\n        this.collapsedHeaderElement = null;\n\t}\n\n    // collapsed Header\n\n    setCollapsedRendererDetails(headerDetails : any) : void {\n        headerDetails.componentClass && (this.collapsedHeaderInstance = headerDetails?.newInstance());\n        this.collapsedHeaderElement = this.collapsedHeaderInstance?.getElement();\n    }\n\n    appendCollapsedHeaderElement() : void {\n        const sec_wrapper = document.createElement('div');\n        sec_wrapper.classList.add('secondary_header_elem')\n        this.appendChild(this.collapsedHeaderElement as HTMLElement,sec_wrapper );\n        this.appendChild(sec_wrapper);\n        // this.collapsedHeaderElement && rootElement && rootElement.appendChild(this.collapsedHeaderElement as HTMLElement);\n    }\n\n    removeCollapsedHeaderElement() : void {\n\n        this.collapsedHeaderElement?.parentNode && (this.collapsedHeaderElement?.parentNode as HTMLElement).remove();\n    }\n\n    generateCollapseHeader() : void {\n        this.headerElement?.classList.add('kanban__board-header--collapsed');\n        this.appendCollapsedHeaderElement();\n    };\n\n    degenerateCollapsedHeader() : void {\n        this.headerElement?.classList.remove('kanban__board-header--collapsed');\n        this.removeCollapsedHeaderElement();\n    }\n}\n\nexport {\n    BoardHeaderComponent,\n    IBoardHeaderComponent\n}","\nimport { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IBoardHeaderComponent } from \"./BoardHeaderComponent\";\nimport { IKanbanUserComponentHandler } from \"../../KanbanUserComponentHandler\";\nimport { KANBAN_BEAN_NAME } from \"../../Constants/KanbanConstants\";\nimport { HeaderEventListener, IHeaderEventListener } from \"../../ComponentEventListeners/HeaderEventListener\";\nimport { IKanbanAPI } from \"../../API/IKanbanAPI\";\n\ninterface IBoardHeaderController {\n    setComponent(component : IBoardHeaderComponent) : void;\n    destroy() : void;\n}\n\n\nclass BoardHeaderController extends EventEmitter implements IBoardHeaderController{\n\n    private component !: IBoardHeaderComponent;\n    private boardID : string;\n    private headerEventListener !: IHeaderEventListener;\n\n    constructor(id : string) {\n        super();\n        this.boardID = id;\n    }\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n    setComponent(component : IBoardHeaderComponent) : void {\n        this.component = component;\n        this.addDestroyFunc(()=>{\n            this.component = null;\n        })\n\n        this.createEventListener();\n\n        this.createRendererDetails();\n\n        this.attachDom();\n    }\n\n    private createEventListener() : void {\n        this.headerEventListener = this.createManagedBean(new HeaderEventListener(this.boardID, this.component.getGui.bind(this)));\n        this.addDestroyFunc(()=>{\n            // this.headerEventListener.destroy();\n            this.headerEventListener = null;\n        })\n    }\n\n    private createRendererDetails() : void {\n        const userComponentHandler  : IKanbanUserComponentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER);\n        \n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        const boardNode = boardHandler.getBoardNode(this.boardID);\n\n        const rendererDetails = this.createUserParam();\n\n        const headerRendererDetails = userComponentHandler.getBoardHeaderRendererDetails(boardNode, rendererDetails);\n\n        this.component.setRendererDetails(headerRendererDetails);\n\n        //collapsed header\n\n        const collapseRendererParams = this.createCollapseUserParam();\n        \n        const collapsedHeaderRendererDetails = userComponentHandler.getCollapsedBoardHeaderRendererDetails(boardNode, collapseRendererParams);\n\n        this.component.setCollapsedRendererDetails(collapsedHeaderRendererDetails);\n    }\n\n    private attachDom() : void {\n        \n        this.component.appendHeaderElement();\n\n    }\n\n    private createUserParam() : any {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        const boardNode = boardHandler.getBoardNode(this.boardID);\n        const rendererParams = boardNode.getHeaderRendererParams();\n        let userParam = {\n            boardID : this.boardID,\n            registerCollapseElement : this.headerEventListener.registerCollapseElement.bind(this.headerEventListener)\n\n        }\n        rendererParams && (userParam = {...userParam, ...rendererParams});\n        return userParam;\n    }\n\n    private createCollapseUserParam() : any {\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        const boardNode = boardHandler.getBoardNode(this.boardID);\n        const rendererParams = boardNode.getCollapsedHeaderRendererParams();\n        let userParam: any = {\n            boardID : this.boardID,\n            registerExpandElement : this.registerExpandElement.bind(this)\n        };\n        rendererParams && (userParam = {...userParam, ...rendererParams});\n        return userParam;\n    }\n\n    registerExpandElement(expandElement : HTMLElement) : void {\n        this.addListener(expandElement, 'click', (_event : MouseEvent) => {\n            const kanbanAPI : IKanbanAPI = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.KANBAN_API);\n            kanbanAPI.expandBoard(this.boardID);\n        });\n    }\n\n    destroy() : void {\n        super.destroy();\n    }\n\n}\n\nexport {\n    BoardHeaderController,\n    IBoardHeaderController\n}","import { Bean, EventEmitter, PostConstruct, AutoWired } from \"@dg/corecomponent\";\nimport { BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"../../Constants/KanbanConstants\";\nimport { kanban_events } from \"../../Constants/KanbanEvents\";\nimport { IKanbanBoardViewportController } from \"../../KanbanBoardViewportController\";\nimport { BoardHandler } from \"../../BoardHandler\";\nimport { KanbanOptionHandler } from \"../../KanbanOptionHandler\";\n\nexport interface IBoardViewport {\n    startBoardIndex: number;\n    endBoardIndex: number;\n}\n\nexport interface IBoardViewportRange {\n    startBoardIndex: number;\n    endBoardIndex: number;\n    actualStartBoardIndex: number;\n    actualEndBoardIndex: number;\n    totalBoardCount: number;\n}\n\nexport interface IBoardViewportRangeUpdatedPayload {\n    range: IBoardViewportRange;\n}\n\nexport interface IBoardFetchMorePayload {\n    currentLoadedCount: number;\n    suggestedPageSize: number;\n    suggestedStartIndex: number;\n}\n\nfunction calculateBoardRangeFromViewport(\n    firstRenderedBoard: number,\n    lastRenderedBoard: number,\n    buffer: number,\n    pageSize: number,\n    pinCount: number,\n    max: number\n): { startBoard: number; endBoard: number; actualStartBoard: number; actualEndBoard: number } {\n    if (lastRenderedBoard === -1 || max < 0) {\n        return { startBoard: pinCount, endBoard: -1, actualStartBoard: pinCount, actualEndBoard: -1 };\n    }\n    const effectivePage = Math.max(pageSize, 1);\n    const stride = Math.max(Math.floor(effectivePage / 2), 1);\n\n    const normalizedStart = Math.max(firstRenderedBoard - buffer, pinCount);\n    const maxStart = Math.max(max - (effectivePage - 1), pinCount);\n\n    const blockIndex = Math.floor((normalizedStart - pinCount) / stride);\n    const candidateStart = blockIndex * stride + pinCount;\n    const boundedStart = Math.min(Math.max(candidateStart, pinCount), maxStart);\n\n    const candidateEnd = candidateStart + effectivePage - 1;\n    const boundedEnd = Math.min(boundedStart + effectivePage - 1, max);\n\n    return {\n        startBoard: boundedStart,\n        endBoard: boundedEnd,\n        actualStartBoard: candidateStart,\n        actualEndBoard: candidateEnd,\n    };\n}\n\n@Bean(KANBAN_BEAN_NAME.BOARD_VIEWPORT_VIRTUALIZATION_BEAN)\nexport class BoardViewportVirtualizationBean extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n    @AutoWired(KANBAN_BEAN_NAME.BOARD_HANDLER) private boardHandler!: BoardHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler!: KanbanOptionHandler;\n\n    private currentStartBoardIndex = -1;\n    private currentEndBoardIndex = -2;\n    private boardPageSize!: number;\n    private boardBufferCount!: number;\n    private lastFetchTriggeredAtLoadedCount = 0;\n    private fetchCheckAfterScrollSettledTimeoutId: ReturnType<typeof setTimeout> | null = null;\n    private static readonly FETCH_CHECK_SETTLE_MS = 600;\n\n    @PostConstruct()\n    init(): void {\n        this.boardPageSize = this.optionHandler.getBoardViewportPageSize();\n        this.boardBufferCount = this.optionHandler.getBoardViewportBufferCount();\n    }\n\n    updateViewportFromScroll(forceUpdate?: boolean): void {\n        const viewportController = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_CONTROLLER) as IKanbanBoardViewportController;\n        const viewport = this.getViewport(viewportController, forceUpdate);\n        const fromScroll = forceUpdate !== true;\n        this.applyViewport(viewport, fromScroll);\n    }\n\n    private getViewport(viewportController: IKanbanBoardViewportController, forceUpdate?: boolean): IBoardViewport {\n        const { firstBoardIndex, lastBoardIndex } = viewportController.getVisibleBoardIndices(forceUpdate);\n        return { startBoardIndex: firstBoardIndex, endBoardIndex: lastBoardIndex };\n    }\n\n    private applyViewport(viewport: IBoardViewport, fromScroll: boolean): void {\n        const totalBoardCount = this.boardHandler.getBoardIDs().length;\n\n        if (totalBoardCount === 0) {\n            this.currentStartBoardIndex = -1;\n            this.currentEndBoardIndex = -2;\n            this.dispatchRange({\n                startBoardIndex: 0,\n                endBoardIndex: -1,\n                actualStartBoardIndex: 0,\n                actualEndBoardIndex: -1,\n                totalBoardCount: 0,\n            });\n            return;\n        }\n\n        const max = totalBoardCount - 1;\n        const pinCount = 0;\n        const { startBoard, endBoard, actualStartBoard, actualEndBoard } = calculateBoardRangeFromViewport(\n            viewport.startBoardIndex,\n            viewport.endBoardIndex,\n            this.boardBufferCount,\n            this.boardPageSize,\n            pinCount,\n            max\n        );\n\n        const rangeChanged =\n            this.currentStartBoardIndex !== startBoard ||\n            this.currentEndBoardIndex !== endBoard;\n\n        if (rangeChanged) {\n            this.currentStartBoardIndex = startBoard;\n            this.currentEndBoardIndex = endBoard;\n            this.dispatchRange({\n                startBoardIndex: startBoard,\n                endBoardIndex: endBoard,\n                actualStartBoardIndex: actualStartBoard,\n                actualEndBoardIndex: actualEndBoard,\n                totalBoardCount,\n            });\n        }\n\n        if (fromScroll) {\n            this.scheduleFetchCheckAfterScrollSettled(BoardViewportVirtualizationBean.FETCH_CHECK_SETTLE_MS);\n        } else {\n            this.scheduleFetchCheckAfterScrollSettled(0);\n        }\n    }\n\n    private dispatchRange(range: IBoardViewportRange): void {\n        const eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER) as {\n            dispatchEvent: (e: { type: string; range: IBoardViewportRange }) => void;\n        };\n        eventHandler?.dispatchEvent?.({\n            type: kanban_events.ON_BOARD_VIEWPORT_RANGE_UPDATED,\n            range,\n        });\n    }\n\n    private scheduleFetchCheckAfterScrollSettled(delayMs: number): void {\n        if (this.fetchCheckAfterScrollSettledTimeoutId != null) {\n            clearTimeout(this.fetchCheckAfterScrollSettledTimeoutId);\n        }\n        this.fetchCheckAfterScrollSettledTimeoutId = setTimeout(() => {\n            this.fetchCheckAfterScrollSettledTimeoutId = null;\n            this.runFetchCheckIfCrossedHalf();\n        }, delayMs);\n    }\n\n    private runFetchCheckIfCrossedHalf(): void {\n        const viewportController = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_CONTROLLER) as IKanbanBoardViewportController;\n        const viewport = this.getViewport(viewportController, true);\n        const totalBoardCount = this.boardHandler.getBoardIDs().length;\n        if (totalBoardCount === 0) return;\n\n        const halfPageSize = Math.max(1, Math.floor(this.boardPageSize / 2));\n        const nearEndThreshold = totalBoardCount - halfPageSize;\n        const hasReachedTriggerPoint = viewport.endBoardIndex >= nearEndThreshold;\n        const shouldFetchMore =\n            hasReachedTriggerPoint &&\n            (this.lastFetchTriggeredAtLoadedCount === 0 || totalBoardCount > this.lastFetchTriggeredAtLoadedCount);\n\n        if (shouldFetchMore) {\n            this.lastFetchTriggeredAtLoadedCount = totalBoardCount;\n            const suggestedStartIndex = Math.max(0, totalBoardCount - halfPageSize);\n            const eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER) as {\n                dispatchEvent: (e: { type: string; currentLoadedCount: number; suggestedPageSize: number; suggestedStartIndex: number }) => void;\n            };\n            eventHandler?.dispatchEvent?.({\n                type: kanban_events.ON_BOARD_FETCH_MORE,\n                currentLoadedCount: totalBoardCount,\n                suggestedPageSize: this.boardPageSize,\n                suggestedStartIndex,\n            });\n        }\n    }\n\n    updateViewport(): void {\n        this.currentStartBoardIndex = -1;\n        this.currentEndBoardIndex = -2;\n        this.updateViewportFromScroll(true);\n    }\n\n    getStartBoardIndex(): number {\n        return this.currentStartBoardIndex;\n    }\n\n    getEndBoardIndex(): number {\n        return this.currentEndBoardIndex;\n    }\n\n    getBoardPageSize(): number {\n        return this.boardPageSize;\n    }\n\n    getBoardBufferCount(): number {\n        return this.boardBufferCount;\n    }\n\n    resetViewport(): void {\n        this.currentStartBoardIndex = -1;\n        this.currentEndBoardIndex = -2;\n        this.lastFetchTriggeredAtLoadedCount = 0;\n        if (this.fetchCheckAfterScrollSettledTimeoutId != null) {\n            clearTimeout(this.fetchCheckAfterScrollSettledTimeoutId);\n            this.fetchCheckAfterScrollSettledTimeoutId = null;\n        }\n    }\n}\n","import { AutoWired, BEAN_NAME, Component, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { KanbanCenterPaneController } from \"./CenterPaneController\";\nimport { BoardContainerComponent } from \"../BoardContainer/BoardComponent\";\nimport { IBoardContainerController } from \"../BoardContainer/BoardController\";\nimport { IBoardCreateEventParam, IBoardDeleteEventParam, IBoardMoveEventParam } from \"../../BoardHandler\";\nimport { board_position } from \"../../Constants/KanbanConstants\";\n\nexport interface IViewportSpacers {\n    leadingSpacerWidth : number;\n    trailingSpacerWidth : number;\n}\n\ninterface IKanbanCenterPaneComponent {\n    getGui : () => HTMLElement;\n    setBoardControllers : (bodyBoardControllers : IBoardContainerController[], viewportSpacers?: IViewportSpacers) => void;\n    prependBoard : (boardController : IBoardContainerController) => void;\n    appendBoard : (boardController : IBoardContainerController) => void;\n    removeBoard : (boardId : string) => void;\n    updateSpacers : (viewportSpacers : IViewportSpacers) => void;\n    insertBoard : (boardController : IBoardContainerController, eventParam : IBoardCreateEventParam) => void;\n    deleteBoard : (deleteEvent  : IBoardDeleteEventParam) => void;\n    moveBoard : (moveEvent : IBoardMoveEventParam) => void;\n}\n\nclass KanbanCenterPaneComponent extends Component {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstance : getBeanInstanceByBeanName;\n\n    static getTemplate: () => HTMLElement;\n\n    private boardContainerComponents : {[id : string] : BoardContainerComponent} = {};\n \n    @PostConstruct()\n    init() : void {\n        const template = KanbanCenterPaneComponent.getTemplate();\n        this.setTemplate(template);\n\n        const componentWrapper : IKanbanCenterPaneComponent  = {\n            getGui : () => { return this.getGui() },\n            setBoardControllers : (boardControllers : IBoardContainerController[], viewportSpacers?: IViewportSpacers)  => this.setBoardControllers(boardControllers, viewportSpacers),\n            prependBoard : (boardController : IBoardContainerController) => { this.prependBoard(boardController); },\n            appendBoard : (boardController : IBoardContainerController) => { this.appendBoard(boardController); },\n            removeBoard : (boardId : string) => { this.removeBoard(boardId); },\n            updateSpacers : (viewportSpacers : IViewportSpacers) => { this.updateSpacers(viewportSpacers); },\n            insertBoard : (boardController : IBoardContainerController, eventParam : IBoardCreateEventParam) => { this.insertBoard(boardController, eventParam)},\n            deleteBoard : (deleteEvent : IBoardDeleteEventParam) => {this.deleteBoard(deleteEvent);},\n            moveBoard : (moveBoardEvent : IBoardMoveEventParam) => {this.moveBoard(moveBoardEvent)}\n        }\n\n        const kanbanCenterPaneController = this.createManagedBean(new KanbanCenterPaneController());\n        kanbanCenterPaneController.setComponent(componentWrapper);\n    }\n\n    private leadingSpacerEl : HTMLElement | null = null;\n    private trailingSpacerEl : HTMLElement | null = null;\n\n    setBoardControllers(boardControllers : IBoardContainerController[], viewportSpacers?: IViewportSpacers) : void {\n        const gui = this.getGui();\n        if (viewportSpacers != null) {\n            const { leadingSpacerWidth } = viewportSpacers;\n            this.removeAllBoardChildren();\n            this.leadingSpacerEl = document.createElement('div');\n            this.leadingSpacerEl.style.width = `${leadingSpacerWidth}px`;\n            this.leadingSpacerEl.style.minWidth = `${leadingSpacerWidth}px`;\n            this.leadingSpacerEl.style.flexShrink = '0';\n            gui.appendChild(this.leadingSpacerEl);\n        }\n        boardControllers.forEach((boardController : IBoardContainerController) => {\n            this.appendBoard(boardController);\n        });\n        if (viewportSpacers != null) {\n            const { trailingSpacerWidth } = viewportSpacers;\n            this.trailingSpacerEl = document.createElement('div');\n            this.trailingSpacerEl.style.width = `${trailingSpacerWidth}px`;\n            this.trailingSpacerEl.style.minWidth = `${trailingSpacerWidth}px`;\n            this.trailingSpacerEl.style.flexShrink = '0';\n            gui.appendChild(this.trailingSpacerEl);\n        }\n    }\n\n    private removeAllBoardChildren() : void {\n        const gui = this.getGui();\n        Object.values(this.boardContainerComponents).forEach((comp) => comp.destroy());\n        this.boardContainerComponents = {};\n        while (gui.firstChild) gui.removeChild(gui.firstChild);\n        this.leadingSpacerEl = null;\n        this.trailingSpacerEl = null;\n    }\n\n    private createBoard(boardController : IBoardContainerController) : BoardContainerComponent {\n        const id = boardController.getInstanceID();\n\n        const boardContainerComponent = this.createManagedBean(new BoardContainerComponent(boardController, this.getBeanInstance))\n\n        this.boardContainerComponents[id] = boardContainerComponent;\n        boardContainerComponent.setParentComponent(this);\n        return boardContainerComponent;\n    }\n\n    prependBoard(boardController : IBoardContainerController) : void {\n        const boardContainerComponent = this.createBoard(boardController);\n        const gui = this.getGui();\n        const firstBoard = this.leadingSpacerEl?.nextElementSibling ?? null;\n        if (firstBoard) {\n            gui.insertBefore(boardContainerComponent.getGui(), firstBoard);\n        } else {\n            this.appendChild(boardContainerComponent);\n        }\n    }\n\n    appendBoard(boardController : IBoardContainerController) : void {\n        const boardContainerComponent = this.createBoard(boardController);\n        const gui = this.getGui();\n        if (this.trailingSpacerEl) {\n            gui.insertBefore(boardContainerComponent.getGui(), this.trailingSpacerEl);\n        } else {\n            this.appendChild(boardContainerComponent);\n        }\n    }\n\n    removeBoard(boardId : string) : void {\n        const boardContainerComponent = this.boardContainerComponents[boardId];\n        if (!boardContainerComponent) return;\n        const el = boardContainerComponent.getGui();\n        el.parentNode?.removeChild(el);\n        boardContainerComponent.destroy();\n        delete this.boardContainerComponents[boardId];\n    }\n\n    updateSpacers(viewportSpacers : IViewportSpacers) : void {\n        const { leadingSpacerWidth, trailingSpacerWidth } = viewportSpacers;\n        if (this.leadingSpacerEl) {\n            this.leadingSpacerEl.style.width = `${leadingSpacerWidth}px`;\n            this.leadingSpacerEl.style.minWidth = `${leadingSpacerWidth}px`;\n        }\n        if (this.trailingSpacerEl) {\n            this.trailingSpacerEl.style.width = `${trailingSpacerWidth}px`;\n            this.trailingSpacerEl.style.minWidth = `${trailingSpacerWidth}px`;\n        }\n    }\n\n    insertBoard(boardController : IBoardContainerController, eventParam : IBoardCreateEventParam) : void {\n        const boardContainerComponent = this.createBoard(boardController); \n\n        const targetBoardId = eventParam.targetBoardId;\n\n        const position = eventParam.position;\n\n        const targetBoardComponent = this.boardContainerComponents[targetBoardId];\n        const targetContainer = targetBoardComponent.getGui();\n\n        const newBoardContainer = boardContainerComponent.getGui();\n\n        if(position == board_position.AFTER) {\n            targetContainer.insertAdjacentElement('afterend', newBoardContainer);\n        }\n        else if(position == board_position.BEFORE) {\n            targetContainer.insertAdjacentElement('beforebegin', newBoardContainer);\n        }\n    }\n\n    deleteBoard(deleteEvent : IBoardDeleteEventParam) : void {\n        const boardId = deleteEvent.boardId;\n\n        const boardContainerComponent = this.boardContainerComponents[boardId];\n        boardContainerComponent.destroy();\n\n        delete this.boardContainerComponents[boardId];\n    }\n\n    moveBoard(moveEvent : IBoardMoveEventParam) : void {\n        const position = moveEvent.position;\n        const sourceId = moveEvent.sourceId;\n        const targetId = moveEvent.targetId;\n\n        const sourceBoard = this.boardContainerComponents[sourceId];\n        const targetBoard = this.boardContainerComponents[targetId];\n\n        const sourceBoardEle = sourceBoard.getGui();\n        const targetBoardEle = targetBoard.getGui();\n\n        if(position == board_position.BEFORE) {\n            targetBoardEle.insertAdjacentElement('beforebegin', sourceBoardEle);\n        } \n        else {\n            targetBoardEle.insertAdjacentElement('afterend', sourceBoardEle);\n        }\n    }\n} \n\nexport {\n    KanbanCenterPaneComponent,\n    IKanbanCenterPaneComponent\n}","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"../../Constants/KanbanConstants\";\nimport { IKanbanCenterPaneComponent } from \"./CenterPaneComponent\";\nimport { kanban_events } from \"../../Constants/KanbanEvents\";\nimport { IBoardContainerController } from \"../BoardContainer/BoardController\";\nimport { IBoardCreateEventParam, IBoardDeleteEventParam, IBoardMoveEventParam } from \"../../BoardHandler\";\nimport { IKanbanBoardViewportController } from \"../../KanbanBoardViewportController\";\nimport { IKanbanEvents } from \"../../Interface/IKanbanConguration\";\nimport { BoardViewportVirtualizationBean, IBoardViewportRange } from \"./BoardViewportVirtualizationBean\";\nimport { BoardContainerController } from \"../BoardContainer/BoardController\";\nimport { IViewportSpacers } from \"./CenterPaneComponent\";\n\ninterface IKanbanCenterPaneController {\n\n}\n\nclass KanbanCenterPaneController extends EventEmitter {\n\n    private component !: IKanbanCenterPaneComponent;\n\n    private boardControllers : { [id : string] : IBoardContainerController} = {};\n    private lastFirstBoardIndex : number = -1;\n    private lastLastBoardIndex : number = -2;\n\n    private scrollContainer : HTMLElement | null = null;\n    private scrollListener : (() => void) | null = null;\n    private resizeObserver : ResizeObserver | null = null;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n    setComponent(component : IKanbanCenterPaneComponent) : void {\n        this.component = component;\n        this.setScrollContainerFromComponent();\n        this.registerController();\n        this.listenEvents();\n        const virtualizationBean = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_VIRTUALIZATION_BEAN) as BoardViewportVirtualizationBean;\n        if (virtualizationBean) virtualizationBean.updateViewportFromScroll(true);\n    }\n\n    private setScrollContainerFromComponent() : void {\n        const viewportController = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_CONTROLLER) as IKanbanBoardViewportController;\n        if (!viewportController || !this.component) return;\n        const centerPaneEl = this.component.getGui();\n        const scrollEl = centerPaneEl?.parentElement;\n        if (scrollEl) {\n            viewportController.setScrollContainer(scrollEl);\n            this.scrollContainer = scrollEl;\n            this.attachScrollAndResizeListeners();\n        }\n    }\n\n    private attachScrollAndResizeListeners() : void {\n        if (!this.scrollContainer) return;\n        const virtualizationBean = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_VIRTUALIZATION_BEAN) as BoardViewportVirtualizationBean;\n\n        const onScrollOrResize = () => {\n            requestAnimationFrame(() => {\n                virtualizationBean?.updateViewportFromScroll();\n            });\n        };\n\n        this.scrollListener = onScrollOrResize;\n        this.scrollContainer.addEventListener('scroll', this.scrollListener, { passive: true });\n        this.resizeObserver = new ResizeObserver(onScrollOrResize);\n        this.resizeObserver.observe(this.scrollContainer);\n    }\n\n    private registerController() : void {\n        const controllerHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.CONTROLLER_HANDLER);\n        controllerHandler.registerCenterPaneController(this);\n    }\n\n    private listenEvents() : void {\n        const eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER);\n        this.addListener(eventHandler, kanban_events.ON_BOARD_NODE_CHANGED, this.onBoardNodeChanged.bind(this));\n        this.addListener(eventHandler, kanban_events.ON_BOARD_VIEWPORT_RANGE_UPDATED, this.onBoardViewportRangeUpdated.bind(this));\n        this.addListener(eventHandler, kanban_events.ON_BOARD_COLLAPSED, this.onBoardCollapsed.bind(this));\n        this.addListener(eventHandler, kanban_events.ON_BOARD_EXPANDED, this.onBoardExpanded.bind(this));\n\n        this.addListener(eventHandler, kanban_events.ON_BOARD_APPENDED, this.onBoardAppended.bind(this));\n        this.addListener(eventHandler, kanban_events.ON_BOARD_INSERTED, this.onBoardInserted.bind(this));\n        this.addListener(eventHandler, kanban_events.ON_BOARD_DELETED, this.onBoardDeleted.bind(this));\n        this.addListener(eventHandler, kanban_events.ON_BOARD_MOVED, this.onBoardMoved.bind(this));\n    }\n\n    private onBoardViewportRangeUpdated(payload?: { range: IBoardViewportRange }) : void {\n        if (payload?.range) this.applyViewportDelta(payload.range);\n    }\n\n    private applyViewportDelta(range: IBoardViewportRange) : void {\n        const viewportController = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_CONTROLLER) as IKanbanBoardViewportController;\n        const boardHandler = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        const boardIDs = boardHandler.getBoardIDs();\n        const firstIdx = range.startBoardIndex;\n        const lastIdx = range.endBoardIndex;\n        const spacers = viewportController.getSpacerWidthsForRange(firstIdx, lastIdx);\n\n        if (firstIdx > lastIdx) {\n            this.clearAllRenderedBoards();\n            this.component.updateSpacers({\n                leadingSpacerWidth : spacers.leadingSpacerWidth,\n                trailingSpacerWidth : spacers.trailingSpacerWidth\n            });\n            this.lastFirstBoardIndex = firstIdx;\n            this.lastLastBoardIndex = lastIdx;\n            return;\n        }\n\n        if (this.lastFirstBoardIndex < 0 || this.lastLastBoardIndex < this.lastFirstBoardIndex) {\n            this.refreshVisibleBoardsFull(firstIdx, lastIdx, boardIDs, spacers);\n            this.lastFirstBoardIndex = firstIdx;\n            this.lastLastBoardIndex = lastIdx;\n            return;\n        }\n\n        const visibleIDs = new Set(boardIDs.slice(firstIdx, lastIdx + 1));\n        const toRemove = Object.keys(this.boardControllers).filter((id) => !visibleIDs.has(id));\n        for (const id of toRemove) {\n            const ctrl = this.boardControllers[id];\n            if (ctrl) {\n                ctrl.destroy();\n                delete this.boardControllers[id];\n                this.component.removeBoard(id);\n            }\n        }\n\n        for (let i = firstIdx; i <= lastIdx; i++) {\n            const id = boardIDs[i];\n            let ctrl = this.boardControllers[id];\n            if (!ctrl) {\n                ctrl = this.createManagedBean(new BoardContainerController(id));\n                this.boardControllers[id] = ctrl;\n                this.component.appendBoard(ctrl);\n            }\n        }\n\n        this.component.updateSpacers({\n            leadingSpacerWidth : spacers.leadingSpacerWidth,\n            trailingSpacerWidth : spacers.trailingSpacerWidth\n        });\n        this.lastFirstBoardIndex = firstIdx;\n        this.lastLastBoardIndex = lastIdx;\n    }\n\n    private refreshVisibleBoardsFull(\n        firstIdx : number,\n        lastIdx : number,\n        boardIDs : string[],\n        spacers : { leadingSpacerWidth: number; trailingSpacerWidth: number }\n    ) : void {\n        const visibleIDs = boardIDs.slice(firstIdx, lastIdx + 1);\n        const boardCtrls : IBoardContainerController[] = [];\n        visibleIDs.forEach((id : string) => {\n            let ctrl = this.boardControllers[id];\n            if (!ctrl) {\n                ctrl = this.createManagedBean(new BoardContainerController(id));\n                this.boardControllers[id] = ctrl;\n            }\n            boardCtrls.push(ctrl);\n        });\n        const viewportSpacers : IViewportSpacers = {\n            leadingSpacerWidth : spacers.leadingSpacerWidth,\n            trailingSpacerWidth : spacers.trailingSpacerWidth\n        };\n        this.component.setBoardControllers(boardCtrls, viewportSpacers);\n    }\n\n    private clearAllRenderedBoards() : void {\n        Object.keys(this.boardControllers).forEach((id) => {\n            const ctrl = this.boardControllers[id];\n            ctrl.destroy();\n            this.component.removeBoard(id);\n        });\n        this.boardControllers = {};\n    }\n\n    private onBoardNodeChanged() : void {\n        this.setScrollContainerFromComponent();\n        const virtualizationBean = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_VIRTUALIZATION_BEAN) as BoardViewportVirtualizationBean;\n        virtualizationBean?.updateViewportFromScroll(true);\n    }\n\n    private onBoardAppended(_createdEvent : IBoardCreateEventParam) : void {\n        const virtualizationBean = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_VIRTUALIZATION_BEAN) as BoardViewportVirtualizationBean;\n        virtualizationBean?.updateViewportFromScroll(true);\n    }\n\n    private onBoardInserted(_createdEvent : IBoardCreateEventParam) : void {\n        const virtualizationBean = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_VIRTUALIZATION_BEAN) as BoardViewportVirtualizationBean;\n        virtualizationBean?.updateViewportFromScroll(true);\n    }\n\n    private onBoardDeleted(deleteEvent : IBoardDeleteEventParam) : void {\n        const boardId = deleteEvent.boardId;\n        const controller = this.boardControllers[boardId];\n        if (controller) {\n            controller.destroy();\n            delete this.boardControllers[boardId];\n            this.component.removeBoard(boardId);\n        }\n        const virtualizationBean = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_VIRTUALIZATION_BEAN) as BoardViewportVirtualizationBean;\n        virtualizationBean?.updateViewportFromScroll(true);\n    }\n\n    private onBoardMoved(_moveEvent : IBoardMoveEventParam) : void {\n        const virtualizationBean = this.getBeanInstanceByBeanName(KANBAN_BEAN_NAME.BOARD_VIEWPORT_VIRTUALIZATION_BEAN) as BoardViewportVirtualizationBean;\n        virtualizationBean?.updateViewportFromScroll(true);\n    }\n\n    private onBoardCollapsed(collapsedEvent : any) : void {\n        const boardId = collapsedEvent.boardId;\n        const boardCtrl = this.boardControllers[boardId];\n        boardCtrl?.onBoardCollapsed();\n        const events = (this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as { getEvents?: () => IKanbanEvents })?.getEvents?.();\n        events?.onBoardCollapsed?.({ boardId });\n    }\n\n    private onBoardExpanded(expandedEvent : any) : void {\n        const boardId = expandedEvent.boardId;\n        const boardCtrl = this.boardControllers[boardId];\n        boardCtrl?.onBoardExpanded();\n        const events = (this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as { getEvents?: () => IKanbanEvents })?.getEvents?.();\n        events?.onBoardExpanded?.({ boardId });\n    }\n\n    destroy() : void {\n        const scrollEl = this.scrollContainer;\n        if (scrollEl && this.scrollListener) {\n            scrollEl.removeEventListener('scroll', this.scrollListener);\n            this.scrollListener = null;\n        }\n        if (this.resizeObserver && scrollEl) {\n            this.resizeObserver.unobserve(scrollEl);\n            this.resizeObserver.disconnect();\n            this.resizeObserver = null;\n        }\n        this.scrollContainer = null;\n        this.clearAllRenderedBoards();\n        this.component = null!;\n        super.destroy?.();\n    }\n}\n\nexport {\n    KanbanCenterPaneController,\n    IKanbanCenterPaneController\n}","\nimport { AutoWired, Component, PostConstruct } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"../../Constants/KanbanConstants\";\nimport { KanbanContainerController } from \"./KanbanController\";\n\n\ninterface IKanbanComponent {\n    getGui : () => HTMLElement;\n}\n\nclass KanbanComponent extends Component {\n\n    static getTemplate : () => HTMLElement;\n\n    @AutoWired(KANBAN_BEAN_NAME.KANBAN_DIV_ELEMENT) private userElement !: HTMLElement;\n\n    @PostConstruct()\n    init() : void {\n        const template = KanbanComponent.getTemplate();\n        this.setTemplate(template);\n\n        const componentWrapper : IKanbanComponent = {\n            getGui : () => { return this.getGui()}\n        }\n\n        const kanbanContainerController = this.createManagedBean(new KanbanContainerController());\n        kanbanContainerController.setComponent(componentWrapper);\n\n        this.appendKanbanIntoUserElement();\n    }\n\n    private appendKanbanIntoUserElement() : void {\n        const kanbanRootElement = this.getGui();\n        this.userElement && this.userElement.append(kanbanRootElement);\n        this.addDestroyFunc(() => {\n            this.userElement && this.userElement.remove();\n        })\n    }\n\n}\n\nexport {\n    KanbanComponent,\n    IKanbanComponent\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { IKanbanComponent } from \"./KanbanComponent\";\n\nclass KanbanContainerController extends EventEmitter{\n\n    private component !: IKanbanComponent;\n\n    setComponent(component : IKanbanComponent) : void {\n        this.component = component;\n    }\n\n    getKanbanContainerElement() : HTMLElement {\n        return this.component.getGui();\n    }\n}\n\nexport {\n    KanbanContainerController\n}","const KANBAN_BEAN_NAME = {\n    KANBAN_DIV_ELEMENT : 'kanbanContainer',\n    KANBAN_OPTIONS : 'kanbanOptions',\n    KANBAN_MODEL_PROVIDER : 'kanbanModelProvider',\n\n    CONTROLLER_HANDLER : 'controllerHandler',\n\n    KANBAN_API : 'KanbanAPI',\n\n    BOARD_HANDLER : 'boardHandler',\n    BOARD_VIEWPORT_CONTROLLER : 'boardViewportController',\n    BOARD_VIEWPORT_VIRTUALIZATION_BEAN : 'boardViewportVirtualizationBean',\n    SWIMLANE_HANDLER : 'swimLaneHandler',\n    KANBAN_LIST_REGISTRY : 'kanbanListRegistry',\n}\n\n\nconst KANBAN_DEFAULT_CONFIG = {\n    \n}\n\nexport const board_position = {\n    AFTER : 'after',\n    BEFORE : 'before'\n}\n\n \n export {\n     KANBAN_DEFAULT_CONFIG,\n     KANBAN_BEAN_NAME\n }","export const kanban_events = {\n\n    ON_BOARD_VIEWPORT_CHANGED : 'onBoardViewportChanged',\n    ON_BOARD_VIEWPORT_RANGE_UPDATED : 'onBoardViewportRangeUpdated',\n    ON_BOARD_FETCH_MORE : 'onBoardFetchMore',\n    ON_BOARD_NODE_CHANGED : 'onBoardNodeChanged',\n    ON_BOARD_COMPONENT_READY : 'onBoardComponentReady',\n\n    //crud events\n    ON_BOARD_INSERTED: 'onBoardCreated',\n    ON_BOARD_APPENDED : 'onBoardAppended',\n\n    ON_BOARD_DELETED : 'onBoardDeleted',\n    ON_BOARD_UPDATED : 'onBoardUpdated',\n    ON_BOARD_MOVED : 'onBoardMoved',\n\n    ON_BOARD_COLLAPSED : 'onBoardCollapsed',\n    ON_BOARD_EXPANDED : 'onBoardExpanded',\n\n\n    ON_SWIM_LANE_NODE_CHANGED : 'onSwimlaneNodeChanged'\n\n}\n\nconst KanbanExposedEvent = [\n    'onKanbanLoaded',\n\n    'onBoardCreated',\n    'onBoardDeleted',\n    'onBoardUpdated',\n\n    'onBoardDragStart',\n    'onBoardDragging',\n    'onBoardDragEnd',\n\n    'onCardDragStart',\n    'onCardDragging',\n    'onCardDragEnd',\n\n    'onBoardMouseDown',\n    'onBoardMouseUp',\n    'onBoardKeyUp',\n    'onBoardKeyDown',\n    'onBoardDblClick',\n    'onBoardRightClick',\n    'onBoardMouseEnter',\n    'onBoardMouseLeave',\n    'onBoardMouseMove',\n\n    'onBoardHeaderMouseDown',\n    'onBoardHeaderMouseUp',\n    'onBoardHeaderKeyUp',\n    'onBoardHeaderKeyDown',\n    'onBoardHeaderDblClick',\n    'onBoardHeaderRightClick',\n    'onBoardHeaderMouseEnter',\n    'onBoardHeaderMouseLeave',\n    'onBoardHeaderMouseMove',\n\n    'onCardMouseDown',\n    'onCardMouseUp',\n    'onCardKeyUp',\n    'onCardKeyDown',\n    'onCardDblClick',\n    'onCardRightClick',\n    'onCardMouseEnter',\n    'onCardMouseLeave',\n    'onCardMouseMove'\n]\n\nexport {\n    KanbanExposedEvent\n}\n\n","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IRecordData } from \"./IDataFetcher\";\nimport { groupBy } from \"../../../Sub_Components/src/DataProcessor/GroupBy/GroupBy\";\n\nexport class ClientDataFetcher extends EventEmitter {\n\n    private result !: any;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstance !: getBeanInstanceByBeanName;\n\n    @PostConstruct()\n    init() : void {\n        const optionalHandler = this.getBeanInstance(BEAN_NAME.OPTION_HANDLER);\n        const data = optionalHandler.getData();\n        const groupByField = optionalHandler.getGroupByField();\n        this.result = groupBy({\n            data,\n            comparer: [groupByField]\n        });\n    }\n\n    getDataByField(field : string, startRow : number, endRow : number) : IRecordData[] {\n        return this.result[field].slice(startRow, endRow);\n    }\n\n    getBoardData(fieldKey : string) : any[] {\n        return this.result[fieldKey];\n    } \n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, PostConstruct, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"../Constants/KanbanConstants\";\nimport { ServerDataFetcher } from \"./ServerDataFetcher\";\nimport { ClientDataFetcher } from \"./ClientDataFetcher\";\nimport { IGetData, IKanbanDataModel } from \"../Interface/IKanbanConguration\";\nimport { IDataFetcher, IRecordData } from \"./IDataFetcher\";\n\nexport const data_model = {\n    REMOTE : 'remote' as IKanbanDataModel,\n    LOCAL : 'local' as IKanbanDataModel\n}\n\n@Bean(KANBAN_BEAN_NAME.KANBAN_MODEL_PROVIDER)\nclass DataFetcher extends EventEmitter implements IDataFetcher {\n\n    private dataFetcher : any;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n    @PostConstruct()\n    init() {\n        const optionalHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const dataModel = optionalHandler.getDataModel();\n        if(dataModel === data_model.REMOTE) {\n            this.dataFetcher = this.createManagedBean(new ServerDataFetcher());\n        } else if(dataModel === data_model.LOCAL){\n            this.dataFetcher = this.createManagedBean(new ClientDataFetcher());\n        }\n    }\n\n    getBoardData(fieldKey : string) : IRecordData[] | IGetData {\n        return this.dataFetcher.getBoardData(fieldKey);\n    }\n\n}\nexport {\n\n    DataFetcher\n}\n","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IRecordData } from \"./IDataFetcher\";\nimport { IFetchParam, IServerDataFetcher } from \"./IServerDataFetcher\";\nimport { IGetData, IjsonData } from \"../Interface/IKanbanConguration\";\n\nclass ServerDataFetcher extends EventEmitter implements IServerDataFetcher {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n    private onSuccessCallbacks : Record<string,CallableFunction> = {};\n    //to fetch row data\n    getDataByField(fieldValue: string, startRow : number, endRow : number): void {\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const dataFetcher = optionHandler.getData();\n\n        if(typeof dataFetcher === 'function') {\n            const fetcherParams = this.createFetchParams(fieldValue, startRow, endRow);\n            dataFetcher(fetcherParams);\n        }\n    }\n\n    private createFetchParams(fieldValue : string, startRow : number, endRow : number) : object {\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        const onSuccess = (records : IRecordData[]) => this.onSuccessfulDataFetch(records, startRow, endRow, fieldValue);\n        const onFailure = this.onFailure;\n        const params = {\n            groupBy : optionHandler.getGroupByField(),\n            fieldValue : fieldValue,\n            onSuccess : onSuccess, \n            onFailure : onFailure,\n            startRow : startRow,\n            endRow : endRow\n        }\n        return params;\n    }\n\n    getBoardData(fieldKey : string) : IjsonData[] | IGetData {\n        const rowData = (params : any) => {\n        \n            this.getDataByField(fieldKey, params.startRowIndex, params.endRowIndex);\n            this.onSuccessCallbacks[`${fieldKey}_${params.startRowIndex}_${params.endRowIndex}`] = params.onSuccess;\n        };\n        return rowData;\n    }\n\n    /** Update current viewport when scrolling changes - this info is available to getBoardData */\n    updateViewport(_firstBoardIndex: number, _lastBoardIndex: number): void {\n    }\n\n    onSuccessfulDataFetch(recordData : IRecordData[], startRow : number, endRow : number, fieldKey : string) : void {\n        this.onSuccessCallbacks[`${fieldKey}_${startRow}_${endRow}`]?.(recordData);\n    }\n\n    onFailure(_fetchParam: IFetchParam): void {\n        \n    }\n}\n\nexport {\n    ServerDataFetcher\n}","\nimport { IBoardDefinition, IPinPosition } from \"../Interface/IBoardDefinition\";\nimport { EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IRowDefinitions } from \"../../Grid/Core/Interface/IRowDefinitions\";\n\nimport { IBoardNode, IBoardNodeDS } from \"./IBoardDataNode\";\nimport { IjsonData, IGetData } from \"../Interface/IKanbanConguration\";\n\n\nclass BoardDataNode extends EventEmitter implements IBoardNode {\n\n    private boardData : IBoardNodeDS;\n    private userBoardDefinition : IBoardDefinition;    \n\n    //states of board\n    private isCollapsed !: boolean;\n\n    constructor(boardData : IBoardDefinition) {\n        super();\n        this.userBoardDefinition = boardData;\n    }\n\n    @PostConstruct()\n    init() {\n        this.boardData = this.createBoardNode(this.userBoardDefinition);\n        this.isCollapsed = this.boardData.collapsedByDefault ?? false;\n        Object.seal(this.userBoardDefinition);\n    }\n\n    private createBoardNode(boardDefinition : IBoardDefinition) : IBoardNodeDS {\n        const node = {\n            data : boardDefinition.data,\n            boardId : boardDefinition.boardId ?? boardDefinition.fieldKey,\n            fieldKey : boardDefinition.fieldKey ?? '',\n            cardRenderer : boardDefinition.cardRenderer ?? null,\n            cardRendererParams : boardDefinition.cardRendererParams ?? null,\n            width : boardDefinition.width || 100,\n            cardCount : boardDefinition.cardCount || 0,\n            cardHeight : boardDefinition.cardHeight || 200,\n            headerRenderer : boardDefinition.headerRenderer ?? null,\n\n            collapsedRenderer : boardDefinition.collapsedRenderer ?? null,\n            collapsedRendererParams : boardDefinition.collapsedRendererParams ?? null,\n            collapsedHeaderRenderer : boardDefinition.collapsedHeaderRenderer ?? null,\n            collapsedHeaderRendererParams : boardDefinition.collapsedHeaderRendererParams ?? null,\n            collapsedByDefault : boardDefinition.collapsedByDefault ?? false,\n\n            headerRendererParams : boardDefinition.headerRendererParams ?? null,\n            marginTop : boardDefinition.marginTop ?? undefined,\n            marginBottom : boardDefinition.marginBottom ?? undefined,\n            cardDefinitions : boardDefinition.cardDefinitions ?? undefined,\n\n        }\n        return node;\n    }\n\n    getData(): IjsonData[] | IGetData | undefined {\n        return this.boardData.data;\n    }\n    getPinPosition(): IPinPosition | undefined {\n        return this.boardData.pinPosition;\n    }\n    getWidth(): number | undefined {\n        return this.boardData.width;\n    }\n    getWithinReorder(): boolean | undefined {\n        return this.boardData.withinReorder;\n    }\n    getAllowCardDrag(): boolean | undefined {\n        return this.boardData.allowCardDrag;\n    }\n    getAllowBoardDrag(): boolean | undefined {\n        return this.boardData.allowBoardDrag;\n    }\n    getAllowToggle(): boolean | undefined {\n        return this.boardData.allowToggle;\n    }\n    getStackedHeader(): IBoardDefinition[] | undefined {\n        return this.boardData.stackedHeader;\n    }\n\n    getBoardId(): string {\n        return this.boardData.boardId;\n    }\n\n    getFieldKey() : string {\n        return this.boardData.fieldKey;\n    }\n\n    getCardRenderer() : any {\n        return this.boardData.cardRenderer;\n    }\n\n    getHeaderRenderer() : any {\n        return this.boardData.headerRenderer;\n    }\n\n    getCardCount() : number {\n        return this.boardData.cardCount;\n    }\n\n    getCardHeight() : number {\n        return this.boardData.cardHeight;\n    }\n\n    //Collapsed Expanded\n\n    getCollapsedRenderer() : any {\n        return this.boardData.collapsedRenderer;\n    }\n\n    getCollapsedHeaderRenderer() : any {\n        return this.boardData.collapsedHeaderRenderer;\n    }\n\n    getCollapsedRendererParams() : any {\n        return this.boardData.collapsedRendererParams;\n    }\n\n    getCollapsedHeaderRendererParams() : any {\n        return this.boardData.collapsedHeaderRendererParams;\n    }\n\n    isCollapsedByDefault() : boolean {\n        return this.boardData.collapsedByDefault;\n    }\n\n    //Board states\n\n    setBoardCollapsed(isCollapsed : boolean) : void {\n        this.isCollapsed = isCollapsed;\n       \n    }\n\n    isBoardCollapsed() : boolean {\n        return this.isCollapsed;\n    }\n\n    getHeaderRendererParams() : any {\n        return this.boardData.headerRendererParams;\n    }\n\n    getCardRendererParams() : any {\n        return this.boardData.cardRendererParams;\n    }\n\n    getMarginTop() : number | undefined {\n        return this.boardData.marginTop;\n    }\n\n    getMarginBottom() : number | undefined {\n        return this.boardData.marginBottom;\n    }\n\n    getCardDefinitions() : IRowDefinitions | undefined {\n        return this.boardData.cardDefinitions;\n    }\n}\n\nexport { BoardDataNode };","\nimport { EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { ISwimlaneDefinition } from \"../Interface/ISwimlaneDefinition\";\nimport { ISwimlaneDSNode, ISwimlaneNode } from \"./ISwimlaneDataNode\";\nimport { IRenderer } from \"Kanban/Interface/KanbanInterface\";\n\nexport class SwimLaneNode extends EventEmitter implements ISwimlaneNode {\n\n    private swimlaneData : ISwimlaneDSNode;\n    private userSwimlaneDefinition : ISwimlaneDefinition;\n\n    constructor(swimlaneData : ISwimlaneDefinition) {\n        super();\n        this.swimlaneData = swimlaneData; \n    }\n\n    @PostConstruct()\n    init() {\n        this.swimlaneData = this.createSwimlaneNode(this.userSwimlaneDefinition);\n        Object.seal(this.userSwimlaneDefinition);\n    }\n\n    private createSwimlaneNode(swimlaneDefinition : ISwimlaneDefinition) : ISwimlaneDSNode {\n        const node = {\n            swimlaneId : swimlaneDefinition.swimlaneId ?? swimlaneDefinition.groupBy,\n            groupBy : swimlaneDefinition.groupBy,\n            swimlaneHeaderRenderer : swimlaneDefinition.swimlaneHeaderRenderer,\n            swimlaneDefinitions : swimlaneDefinition.swimlaneDefinitions,\n            height : swimlaneDefinition.swimlaneHeight,\n            collapsedRenderer : swimlaneDefinition.collapsedRenderer,\n            collapsedByDefault : swimlaneDefinition.collapsedByDefault,\n            allowToggle : swimlaneDefinition.allowToggle,\n            pinHeader : swimlaneDefinition.pinHeader,\n            sortOrder : swimlaneDefinition.sortOrder\n        }\n\n        return node;\n    }\n\n    getSwimlaneId(): string | null {\n        return this.swimlaneData.swimlaneId;\n    }\n    getGroupBy(): string {\n        return this.swimlaneData.groupBy;\n    }\n    getSwimlaneHeaderRenderer(): IRenderer | null {\n        return this.swimlaneData.swimlaneHeaderRenderer;\n    }\n    getSwimlaneDefinitions(): ISwimlaneDefinition[] | null {\n        return this.swimlaneData.swimlaneDefinitions;\n    }\n    getSwimlaneHeight(): number | null {\n        return this.swimlaneData.height;\n    }\n    getCollapsedRenderer(): IRenderer | null {\n        return this.swimlaneData.collapsedRenderer;\n    }\n    getCollapsedHeaderRenderer(): IRenderer | null {\n        return this.swimlaneData.collapsedHeaderRenderer;\n    }\n    isCollapsedByDefault(): boolean | null {\n        return this.swimlaneData.collapsedByDefault;\n    }\n    getAllowToggle(): boolean | null {\n        return this.swimlaneData.allowToggle;\n    }\n    getPinHeader(): boolean | null {\n        return this.swimlaneData.pinHeader;\n    }\n    getSortOrder(): \"asc\" | \"desc\" | null {\n        return this.swimlaneData.sortOrder;\n    }\n\n}","import { Context } from \"@dg/corecomponent\";\nimport { IKanbanAPI } from \"./API/IKanbanAPI\";\nimport { IKanbanConfiguration } from \"./Interface/IKanbanConguration\";\nimport { KANBAN_BEAN_NAME } from \"./Constants/KanbanConstants\";\nimport { KanbanController } from \"./KanbanRootController\";\nimport \"../Kanban/css/kanban.css\";\n\nexport class Kanban {\n\n    public api !:IKanbanAPI;\n\n    constructor(kanbanContainer : HTMLElement, kanbaConfigurations : IKanbanConfiguration) {\n\n        const setAPI = (context : Context) => {\n            this.api = context.getBean(KANBAN_BEAN_NAME.KANBAN_API);\n        }\n\n        new KanbanController(kanbanContainer, kanbaConfigurations, setAPI);\n    }\n}\n(window as any || globalThis as any).Kanban_DG = Kanban\n","import { AutoWired, Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"./Constants/KanbanConstants\";\nimport { BoardHandler } from \"./BoardHandler\";\n\nexport interface IKanbanBoardViewportController {\n\tsetScrollContainer(el: HTMLElement | null): void;\n\tgetBoardBufferInPixels(): number;\n\tgetVisibleBoardIndices(forceUpdate?: boolean): { firstBoardIndex: number; lastBoardIndex: number };\n\tgetFirstBoardIndex(): number;\n\tgetLastBoardIndex(): number;\n\tgetLeadingSpacerWidth(): number;\n\tgetTrailingSpacerWidth(): number;\n\tgetSpacerWidthsForRange(startBoardIndex: number, endBoardIndex: number): { leadingSpacerWidth: number; trailingSpacerWidth: number };\n\tgetTotalBoardsWidth(): number;\n}\n\nconst DEFAULT_BOARD_BUFFER_PIXELS = 100;\n\n@Bean(KANBAN_BEAN_NAME.BOARD_VIEWPORT_CONTROLLER)\nexport class KanbanBoardViewportController extends EventEmitter implements IKanbanBoardViewportController {\n\n\tprivate scrollContainer: HTMLElement | null = null;\n\tprivate firstBoardIndex: number = 0;\n\tprivate lastBoardIndex: number = -1;\n\tprivate leadingSpacerWidth: number = 0;\n\tprivate trailingSpacerWidth: number = 0;\n\tprivate totalBoardsWidth: number = 0;\n\n\t@AutoWired(KANBAN_BEAN_NAME.BOARD_HANDLER) private boardHandler!: BoardHandler;\n\n\tsetScrollContainer(el: HTMLElement | null): void {\n\t\tthis.scrollContainer = el;\n\t}\n\n\tgetBoardBufferInPixels(): number {\n\t\treturn DEFAULT_BOARD_BUFFER_PIXELS;\n\t}\n\n\tprivate getCumulativeWidths(): number[] {\n\t\tconst boardHandler = this.boardHandler;\n\t\tconst ids = boardHandler.getBoardIDs();\n\t\tconst cum: number[] = [0];\n\t\tlet w = 0;\n\t\tfor (const id of ids) {\n\t\t\tconst node = boardHandler.getBoardNode(id);\n\t\t\tconst width = node?.getWidth() ?? 300;\n\t\t\tw += width;\n\t\t\tcum.push(w);\n\t\t}\n\t\treturn cum;\n\t}\n\n\tprivate getBoardIndexByPosition(pixelX: number): number {\n\t\tconst cum = this.getCumulativeWidths();\n\t\tfor (let i = cum.length - 1; i >= 0; i--) {\n\t\t\tif (pixelX >= cum[i]) return Math.min(i, cum.length - 2);\n\t\t}\n\t\treturn 0;\n\t}\n\n\tgetVisibleBoardIndices(forceUpdate: boolean = false): { firstBoardIndex: number; lastBoardIndex: number } {\n\t\tconst boardHandler = this.boardHandler;\n\t\tconst ids = boardHandler.getBoardIDs();\n\t\tconst boardCount = ids.length;\n\t\tif (boardCount === 0) {\n\t\t\tthis.firstBoardIndex = 0;\n\t\t\tthis.lastBoardIndex = -1;\n\t\t\tthis.totalBoardsWidth = 0;\n\t\t\tthis.leadingSpacerWidth = 0;\n\t\t\tthis.trailingSpacerWidth = 0;\n\t\t\treturn { firstBoardIndex: 0, lastBoardIndex: -1 };\n\t\t}\n\n\t\tconst cum = this.getCumulativeWidths();\n\t\tthis.totalBoardsWidth = cum[cum.length - 1] ?? 0;\n\n\t\tconst bufferPixels = this.getBoardBufferInPixels();\n\t\tlet firstPixel = 0;\n\t\tlet lastPixel = this.totalBoardsWidth;\n\n\t\tif (this.scrollContainer) {\n\t\t\tconst scrollLeft = this.scrollContainer.scrollLeft;\n\t\t\tconst clientWidth = this.scrollContainer.clientWidth;\n\t\t\tfirstPixel = Math.max(scrollLeft - bufferPixels, 0);\n\t\t\tlastPixel = Math.min(scrollLeft + clientWidth + bufferPixels, this.totalBoardsWidth);\n\t\t}\n\n\t\tlet firstIdx = this.getBoardIndexByPosition(firstPixel);\n\t\tlet lastIdx = this.getBoardIndexByPosition(lastPixel);\n\t\tif (lastIdx >= boardCount) lastIdx = boardCount - 1;\n\n\t\tconst firstDiffers = firstIdx !== this.firstBoardIndex;\n\t\tconst lastDiffers = lastIdx !== this.lastBoardIndex;\n\t\tif (!forceUpdate && !firstDiffers && !lastDiffers) {\n\t\t\treturn { firstBoardIndex: this.firstBoardIndex, lastBoardIndex: this.lastBoardIndex };\n\t\t}\n\n\t\tthis.leadingSpacerWidth = cum[firstIdx] ?? 0;\n\t\tthis.trailingSpacerWidth = this.totalBoardsWidth - (cum[lastIdx + 1] ?? this.totalBoardsWidth);\n\t\tthis.firstBoardIndex = firstIdx;\n\t\tthis.lastBoardIndex = lastIdx;\n\t\treturn { firstBoardIndex: firstIdx, lastBoardIndex: lastIdx };\n\t}\n\n\tgetFirstBoardIndex(): number {\n\t\treturn this.firstBoardIndex;\n\t}\n\n\tgetLastBoardIndex(): number {\n\t\treturn this.lastBoardIndex;\n\t}\n\n\tgetLeadingSpacerWidth(): number {\n\t\treturn this.leadingSpacerWidth;\n\t}\n\n\tgetTrailingSpacerWidth(): number {\n\t\treturn this.trailingSpacerWidth;\n\t}\n\n\tgetSpacerWidthsForRange(startBoardIndex: number, endBoardIndex: number): { leadingSpacerWidth: number; trailingSpacerWidth: number } {\n\t\tconst cum = this.getCumulativeWidths();\n\t\tconst total = cum[cum.length - 1] ?? 0;\n\t\tconst leadingSpacerWidth = startBoardIndex <= 0 ? 0 : (cum[startBoardIndex] ?? 0);\n\t\tconst trailingSpacerWidth = endBoardIndex < 0 ? total : total - (cum[endBoardIndex + 1] ?? total);\n\t\treturn { leadingSpacerWidth, trailingSpacerWidth };\n\t}\n\n\tgetTotalBoardsWidth(): number {\n\t\treturn this.totalBoardsWidth;\n\t}\n}","import { KanbanComponent } from \"./Components/KanbanContainer/KanbanComponent\";\nimport { KanbanCenterPaneComponent } from \"./Components/CenterPane/CenterPaneComponent\";\nimport { ComponentMeta } from \"@dg/corecomponent\";\nimport { getKanbanCenterPaneTemplate, getKanbanRootTemplate } from \"./KanbanTemplate\";\n\nexport function createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n\t\t{\n\t\t\tcomponentName: 'dg-kanban-wrapper',\n\t\t\tcomponentClass: KanbanComponent,\n\t\t\ttemplate: getKanbanRootTemplate()\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'dg-kanban-center-pane',\n\t\t\tcomponentClass: KanbanCenterPaneComponent,\n\t\t\ttemplate: getKanbanCenterPaneTemplate()\n\t\t},\n\t\t// {\n\t\t// \tcomponentName: 'dg-kanban-board-container',\n\t\t// \tcomponentClass: BoardContainerComponent,\n\t\t// \ttemplate: getKanbanBoardContainer()\n\t\t// },\n\t\t// {\n\t\t// \tcomponentName: 'dg-kanban-board-expanded-container',\n\t\t// \tcomponentClass: ExpandedContainerComponent,\n\t\t// \ttemplate: getKanbanBoardExpandedContainer()\n\t\t// },\n\t\t// {\n\t\t// \tcomponentName: 'dg-kanban-board-header-container',\n\t\t// \tcomponentClass: BoardHeaderComponent,\n\t\t// \ttemplate: getKanbanBoardHeaderContainer()\n\t\t// },\n\t\t// {\n\t\t// \tcomponentName: 'dg-kanban-board-body-container',\n\t\t// \tcomponentClass: BoardBodyComponent,\n\t\t// \ttemplate: getKanbanBoardBodyContainer()\n\t\t// }\n\n\t];\n\n\treturn components;\n}\n","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"./Constants/KanbanConstants\";\nimport { IKanbanCenterPaneController } from \"./Components/CenterPane/CenterPaneController\";\n\n@Bean(KANBAN_BEAN_NAME.CONTROLLER_HANDLER)\nclass KanbanControllerHandler extends EventEmitter {\n\n    private centerPaneController !: IKanbanCenterPaneController;\n\n    registerCenterPaneController(centerPaneController : IKanbanCenterPaneController) : void {\n        this.centerPaneController = centerPaneController;\n    }\n\n    getCenterPaneController() : IKanbanCenterPaneController {\n        return this.centerPaneController;\n    }\n}\n\nexport {\n    KanbanControllerHandler\n}","import { BEAN_NAME, Bean, EventHandler } from \"@dg/corecomponent\";\n\n\n@Bean(BEAN_NAME.EVENT_HANDLER)\nclass KanbanEventHandler extends EventHandler {\n\n}\n\nexport {\n    KanbanEventHandler\n}","import { Bean } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"./Constants/KanbanConstants\";\nimport { IRowAPIManager } from \"../Grid/API/RowAPI/Interface/IRowAPI\";\n\nexport interface IListInstance {\n    rowAPI: IRowAPIManager;\n}\n\n@Bean(KANBAN_BEAN_NAME.KANBAN_LIST_REGISTRY)\nclass KanbanListRegistry {\n    private boardIdToList: { [boardId: string]: IListInstance } = {};\n\n    register(boardId: string, listInstance: IListInstance): void {\n        this.boardIdToList[boardId] = listInstance;\n    }\n\n    unregister(boardId: string): void {\n        delete this.boardIdToList[boardId];\n    }\n\n    getList(boardId: string): IListInstance | null {\n        return this.boardIdToList[boardId] ?? null;\n    }\n\n    getRowAPI(boardId: string): IRowAPIManager | null {\n        return this.boardIdToList[boardId]?.rowAPI ?? null;\n    }\n\n    getBoardIdForRowId(rowId: string): string | null {\n        const boardIds = Object.keys(this.boardIdToList);\n        for (const boardId of boardIds) {\n            const list = this.boardIdToList[boardId];\n            const rowAPI = list?.rowAPI as unknown as { getRowNodeById?: (id: string) => unknown };\n            if (rowAPI?.getRowNodeById?.(rowId)) {\n                return boardId;\n            }\n        }\n        return null;\n    }\n}\n\nexport { KanbanListRegistry };\n","import { AutoWired, BEAN_NAME } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"./Constants/KanbanConstants\";\nimport { IBoardDefinition } from \"./Interface/IBoardDefinition\";\nimport { CardSelectionType, IGetData, IKanbanDataModel, IKanbanEvents, IjsonData } from \"./Interface/IKanbanConguration\";\nimport { Bean } from \"@dg/corecomponent\";\nimport { data_model } from \"./Data/DataFetcher\";\n\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nclass KanbanOptionHandler {\n\n    @AutoWired(KANBAN_BEAN_NAME.KANBAN_OPTIONS) private kanbanOption : any;\n\n    getData() : IjsonData[] | IGetData {\n        return this.kanbanOption.data;\n    }\n\n    getGroupByField() : string {\n        return this.kanbanOption.groupBy;\n    }\n\n    getBoardDefinition() : IBoardDefinition[] {\n        return this.kanbanOption?.boardDefinitions ?? [];\n    }\n\n    getDataModel() : IKanbanDataModel {\n        return  data_model.REMOTE;\n    }\n\n    getBoardViewportPageSize(): number {\n        return this.kanbanOption?.boardViewportPageSize ?? 20;\n    }\n\n    getBoardViewportBufferCount(): number {\n        return this.kanbanOption?.boardViewportBufferCount ?? 5;\n    }\n\n    getSelection(): boolean {\n        return this.kanbanOption?.selection ?? false;\n    }\n\n    getCardSelection(): CardSelectionType {\n        return this.kanbanOption?.cardSelection ?? 'none';\n    }\n\n    getCardHighlighter(): boolean {\n        return this.kanbanOption?.cardHighlighter ?? false;\n    }\n\n    getEvents(): IKanbanEvents | undefined {\n        return this.kanbanOption?.events;\n    }\n}\n\nexport {\n    KanbanOptionHandler\n}","import \"./css/kanban.css\"\nimport { IKanbanConfiguration } from \"./Interface/IKanbanConguration\";\nimport { BoardHandler } from \"./BoardHandler\";\nimport { KanbanOptionHandler } from \"./KanbanOptionHandler\";\nimport { KanbanEventHandler } from \"./KanbanEventHandler\";\nimport { KANBAN_BEAN_NAME } from \"./Constants/KanbanConstants\";\nimport { DataFetcher } from \"./Data/DataFetcher\";\nimport { KanbanComponent } from \"./Components/KanbanContainer/KanbanComponent\";\nimport { BEAN_NAME, ComponentsRegistry, Context, VanillaFrameWorkOverrider } from \"@dg/corecomponent\";\nimport { createComponentList } from \"./KanbanComponentRegistry\";\nimport { KanbanControllerHandler } from \"./KanbanControllerHandler\";\nimport { KanbanUserComponentHandler } from \"./KanbanUserComponentHandler\";\nimport { KanbanAPI } from \"./API/KanbanAPI\";\nimport { KanbanListRegistry } from \"./KanbanListRegistry\";\nimport { SwimlaneHandler } from \"./SwimlaneHandler\";\nimport { BoardViewportVirtualizationBean } from \"./Components/CenterPane/BoardViewportVirtualizationBean\";\nimport { KanbanBoardViewportController } from \"./KanbanBoardViewportController\";\nexport class KanbanController {\n\n    constructor(container : HTMLElement = document.body, kanbanConfiguration : IKanbanConfiguration, callback ?: CallableFunction) {\n        const userConfiguration = this.createUserConfiguration(container, kanbanConfiguration);\n\n        const context = new Context();\n        const beanClasses = this.getBeanClasses();\n        context.registerBeanClasses(beanClasses, userConfiguration);\n\n        this.registerComponent(context);\n\n        const kanbanComponent = new KanbanComponent();\n\n        context.createBean(kanbanComponent);\n        (window as any).kanbancontext = context;\n\n        this.setBoardData(context);\n        this.setSwimlaneData(context);\n        \n\n        callback && callback(context);\n    }\n\n    private createUserConfiguration(kanbanContainer : HTMLElement, kanbanConfiguration : IKanbanConfiguration) : any {\n        let frameWorkOverrides = new VanillaFrameWorkOverrider();\n        return {\n            kanbanContainer : kanbanContainer,\n            kanbanOptions : kanbanConfiguration,\n            frameWorkOverrides : frameWorkOverrides\n        }\n    }\n\n    private getBeanClasses() { \n        const kanbanBeanClasses = new Set([\n            BoardHandler,\n            SwimlaneHandler,\n            KanbanOptionHandler,\n            KanbanEventHandler,\n            KanbanUserComponentHandler,\n            DataFetcher,\n            ComponentsRegistry,\n            KanbanListRegistry,\n            KanbanControllerHandler,\n            KanbanBoardViewportController,\n            BoardViewportVirtualizationBean,\n            KanbanAPI\n        ]); \n\n        return kanbanBeanClasses;\n    }\n\n    private registerComponent(context : Context) : void {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n\n    private setBoardData(context : Context) : void {\n        const kanbanConfiguration : IKanbanConfiguration = context.getBean(KANBAN_BEAN_NAME.KANBAN_OPTIONS);\n        const kanbanBoardHandler = context.getBean(KANBAN_BEAN_NAME.BOARD_HANDLER);\n\n        kanbanBoardHandler.constructBoard(kanbanConfiguration.boardDefinitions);\n    }\n\n    private setSwimlaneData(context : Context) : void {\n        const kanbanConfig : IKanbanConfiguration = context.getBean(KANBAN_BEAN_NAME.KANBAN_OPTIONS);\n        const kanbanSwimlaneHandler = context.getBean(KANBAN_BEAN_NAME.SWIMLANE_HANDLER);\n\n        kanbanSwimlaneHandler.constructSwimlanes(kanbanConfig.swimlaneDefinitions ?? [])\n    }\n}","export function getKanbanRootTemplate() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"kanban__wrapper\" role=\"presentation\">\n\n            <div class=\"kanban__left_pane\" ref='kanbanLeftPane'></div>\n\n            <dg-kanban-center-pane></dg-kanban-center-pane>\n\n            <div class=\"kanban__right_pane\" ref='kanbanRightPane'></div>\n            </div>`\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}\n\nexport function getKanbanLeftPaneTemplate() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"kanban__center_pane\" ref='kanbanLeftPane' role=\"presentation\"></div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}\nexport function getKanbanCenterPaneTemplate() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"kanban__center_pane\" ref='kanbanLeftPane' role=\"presentation\"></div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}\nexport function getKanbanRightPaneTemplate() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"kanban__center_pane\" ref='kanbanRightPane' role=\"presentation\"></div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}\n\nexport function getKanbanBoardExpandedContainer() {\n        const template = `<div class=\"kanban__board_container_wrapper\"  ref='kanbanBoardContainerWrapper' role=\"presentation\">\n            <div class=\"kanban__board_container\" ref='kanbanBoardContainer'></div>\n        </div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n}\n\nexport function getKanbanBoardHeaderContainer() {\n        const template = `<div class=\"kanban__board-header-container\"  ref='kanbanBoardHeaderContainer' role=\"presentation\"></div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n}\n\nexport function getKanbanBoardBodyContainer() {\n        const template = `<div class=\"kanban__board-body-container\"  ref='kanbanBoardBodyContainer' role=\"presentation\">\n            <div class = 'kanban__board-body-wrapper' ref='kanbanBoardBodyWrapper' role=\"presentation\"></div>\n        </div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n}\n\nexport function getKanbanCollapsedBoardHeaderContainer() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"kanban__board-collapsed-header-container\"  ref='kanbanCollapsedBoardHeaderContainer' role=\"presentation\"></div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}\n\nexport function getKanbanCardContainer() {\n    return function getTemplate() : HTMLElement {\n        const template = `<div class=\"kanban__card-container\"  ref='kanbanCardContainer' role=\"presentation\"></div>`;\n\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n    }\n}\n\n\n// all new templates are here\n\nexport function getKanbanContainerTemplate() : HTMLElement {\n        const template = `<div ref=\"kanbanContainerWrapper\" class='dg-kanban__container-wrapper'>\n            <div ref='kanbanContainer' class='dg-kanban__container'></div>\n        </div>`;\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n}\n\nexport function getKanbanHeaderContainerTemplate() : HTMLElement {\n        const template = `<div ref=\"kanbanHeaderContainer\" class='dg-kanban__header-container'>\n            <div ref='kanbanPinnedHeaderContainer' class='dg-kanban__pinned-header-container'></div>\n            <div ref='kanbanScrollHeaderContainer' class='dg-scroll-header-container'></div>\n        </div>`;\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n}\n\nexport function getHeaderColumn() : HTMLElement {\n    const template = `div ref=\"kanbanHeaderColumn\" class='dg-kanban__header-column'></div>`;\n    const div = document.createElement('div');\n    div.innerHTML = template;\n    return div.firstChild as HTMLElement;\n}\n\nexport function getHeaderRow() : HTMLElement {\n    const template = `div ref=\"kanbanHeaderRow\" class='dg-kanban__header-row'></div>`;\n    const div = document.createElement('div');\n    div.innerHTML = template;\n    return div.firstChild as HTMLElement;\n}\n\nexport function getBodyContainerTemplate() : HTMLElement {\n        const template = `<div ref=\"kanbanBodyContainer\" class='dg-kanban__header-container'>\n        </div>`;\n        const div = document.createElement('div');\n        div.innerHTML = template;\n        return div.firstChild as HTMLElement;\n}","import { AutoWired, BEAN_NAME, Bean, UserComponentHandler, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IBoardNode } from \"./DataNodes/IBoardDataNode\";\n\nexport const property_name = {\n    BOARD_HEADER_RENDERER : 'boardHeaderRenderer',\n    BOARD_COLLAPSED_HEADER_RENDERER : 'boardCollapsedHeaderRenderer',\n    BOARD_COLLAPSED_RENDERER : 'boardCollapsedRenderer'\n\n}\n\nexport interface UserComponentDetails {\n    newInstance              : () => any;\n    componentClass           : any;\n    componentFramework       : boolean;\n    params                   : any;\n    propertyName             : any;\n}\n\nexport interface IComponentDetails {\n\tjsComponent              : any;\n\tcomponentName            : string;\n\tframeworkComponent       : any;\n}\n\ninterface IKanbanUserComponentHandler {\n    getBoardHeaderRendererDetails(boardNode : IBoardNode, param : any) : any;\n    getCollapsedBoardHeaderRendererDetails(boardNode : IBoardNode, param : any) : any;\n    getCollapsedBoardRendererDetails(boardNode : IBoardNode, param : any) : any;\n}\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nclass KanbanUserComponentHandler extends UserComponentHandler implements IKanbanUserComponentHandler{\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName !: getBeanInstanceByBeanName;\n\n\n    getBoardHeaderRendererDetails(boardNode : IBoardNode, param : any) : any {\n        return this.getComponentDetails(boardNode, property_name.BOARD_HEADER_RENDERER, param);\n    }\n\n    getCollapsedBoardHeaderRendererDetails(boardNode : IBoardNode, param : any) : any {\n        return this.getComponentDetails(boardNode, property_name.BOARD_COLLAPSED_HEADER_RENDERER, param);\n    }\n\n    getCollapsedBoardRendererDetails(boardNode: IBoardNode, param: any) {\n        return this.getComponentDetails(boardNode, property_name.BOARD_COLLAPSED_RENDERER, param);\n    }\n\n    protected getComponentDetails(definition: any, fieldName: any, params?: any, defaultName?: string): UserComponentDetails{\n        let {jsComponent, frameworkComponent, componentName} = this.getComponentMeta(definition, fieldName, params);\n         const mergeParams = this.getMergeParams(definition, fieldName, params);\n \n         const looUpRegistry = (_name : string) => {\n             const userComponentRegistry = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_REGISTRY);\n             const item = userComponentRegistry.retrieve(fieldName);\n             if(item) {\n                 jsComponent        = !item.componentFrameWork ? item.component : undefined;\n                 frameworkComponent = item.componentFrameWork ? item.component : undefined;\n             }\n         }\n \n         if(componentName != null) {\n             looUpRegistry(componentName);\n         }\n \n         if(jsComponent == null && frameworkComponent == null && defaultName != null) {\n             looUpRegistry(defaultName);\n         }\n \n         const componentFramework = jsComponent == null;\n         const componentClass     = jsComponent ? jsComponent : frameworkComponent;\n \n         return {\n             componentClass,\n             componentFramework,\n             params: mergeParams,\n             propertyName : fieldName,\n             newInstance: () => this.newInstance(componentClass, mergeParams),\n         };\n    }\n\n\n    protected getComponentMeta(definition: any, propertyName: any, _params?: any): IComponentDetails{\n        let componentName     : any = null;\n        let jsComponent       : any           = null;\n        let frameworkComponent: any           = null;\n\n        const assignComponentNameOrComponentClass = (component : any) => {\n            if(typeof component === 'string') {\n                componentName = component;\n            }else if(component != null && component !== true) {\n                jsComponent = component;\n            }\n        }\n\n        if(definition) {\n            const definitionObject = definition as any;\n            assignComponentNameOrComponentClass(this.getComponent(definitionObject, propertyName));\n        \n        } else {\n            assignComponentNameOrComponentClass(propertyName);\n        }\n\n        \n\n        return {\n            jsComponent,\n            frameworkComponent,\n            componentName\n        }\n    }\n\n\n    protected getComponent(definition : any, propertyName : string) : any {\n        switch (propertyName) {\n            case property_name.BOARD_HEADER_RENDERER:\n                return definition.getHeaderRenderer();\n            case property_name.BOARD_COLLAPSED_HEADER_RENDERER :\n                return (definition  as IBoardNode).getCollapsedHeaderRenderer();\n            case property_name.BOARD_COLLAPSED_RENDERER :\n                return (definition  as IBoardNode).getCollapsedRenderer();\n        }\n    }\n\n    private getMergeParams(_definition : any, _propertyName : string, params : any) : any {\n        return {...params};\n    }\n\n    protected newInstance(component : any, param : any) : Promise<any> {\n        let instance : any;\n        if(component) {\n            instance = new component();\n        }\n        this.initComponent(instance, param);\n        return instance;\n    }\n\n    protected initComponent(component: any, params: any): Promise<any> | any {\n        this.context.createBean(component);\n        if (component.init == null) { return; }\n        return component.init(params);\n    }\n\n}\n\nexport {\n    KanbanUserComponentHandler,\n    IKanbanUserComponentHandler\n}","import { AutoWired, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"./Constants/KanbanConstants\";\nimport { List } from \"../ListModelClasses/List\";\nimport { IDataFetcher } from \"./Data/IDataFetcher\";\nimport { IRowAPIManager } from \"../Grid/API/RowAPI/Interface/IRowAPI\";\nimport { IBoardNode } from \"./DataNodes/IBoardDataNode\";\n\nexport interface IListInteracter {\n    createListView(container : HTMLElement) : void;\n    destroyListView() : void;\n    getListInstance() : List | null;\n    getRowAPI() : IRowAPIManager | null;\n}\n\nexport class ListInteracter extends EventEmitter {\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstance !: getBeanInstanceByBeanName;\n\n    private boardId : string;\n    private listInstance : List | null = null;\n\n    constructor(boardId : string) {\n        super();\n        this.boardId = boardId;\n    }\n\n    createListView(container : HTMLElement) : void {\n        const listConfig = this.generateInitialListConfig();\n        this.listInstance = new List(container, listConfig);\n    }\n\n    destroyListView() : void {\n        this.listInstance = null;\n    }\n\n    getListInstance() : List | null {\n        return this.listInstance;\n    }\n\n    getRowAPI() : IRowAPIManager | null {\n        return this.listInstance?.rowAPI ?? null;\n    }\n\n    private generateInitialListConfig() : any {\n        const boardHandler      = this.getBeanInstance(KANBAN_BEAN_NAME.BOARD_HANDLER);\n        const optionalHandler   = this.getBeanInstance(BEAN_NAME.OPTION_HANDLER);\n        const dataFetcher : IDataFetcher      = this.getBeanInstance(KANBAN_BEAN_NAME.KANBAN_MODEL_PROVIDER); \n\n        const boardNode : IBoardNode = boardHandler.getBoardNode(this.boardId);\n        const dataModel = optionalHandler.getDataModel();\n        const fieldKey  = boardNode.getFieldKey();\n        const cardRenderer = boardNode.getCardRenderer();\n        const cardRendererParams = boardNode.getCardRendererParams();\n        const cardCount = boardNode.getCardCount();\n        const cardHeight = boardNode.getCardHeight();\n        const marginTop = boardNode.getMarginTop();\n        const marginBottom = boardNode.getMarginBottom();\n        const boardData = dataFetcher.getBoardData(fieldKey);\n\n        const listConfiguration : any = {};\n\n        listConfiguration.rowModelType          = dataModel;\n        listConfiguration.rowCount              = cardCount;\n        listConfiguration.fullWidthCellRenderer = cardRenderer;\n        listConfiguration.fullWidthCellRendererParams = cardRendererParams;\n\n        listConfiguration.rowHeights            = cardHeight;\n        listConfiguration.rowData               = boardData;\n        listConfiguration.showColumnHeader     = false;\n        listConfiguration.rowDraggable         = true;\n\n        listConfiguration.rowSelection          = optionalHandler.getSelection() ? optionalHandler.getCardSelection() : 'none';\n        listConfiguration.rowHighlighter       = optionalHandler.getCardHighlighter();\n\n        const cardDefinitions = boardNode.getCardDefinitions();\n        cardDefinitions && (listConfiguration.rowDefinitions = cardDefinitions);\n\n        marginTop !== undefined && (listConfiguration.marginTop = marginTop);\n        marginBottom !== undefined && (listConfiguration.marginBottom = marginBottom);\n\n        return listConfiguration;\n    }\n\n\n}","import { Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { KANBAN_BEAN_NAME } from \"./Constants/KanbanConstants\";\nimport { ISwimlaneNode } from \"./DataNodes/ISwimlaneDataNode\";\nimport { ISwimlaneDefinition } from \"./Interface/ISwimlaneDefinition\";\nimport { SwimLaneNode } from \"./DataNodes/SwimlaneDataNode\";\nimport { kanban_events } from \"./Constants/KanbanEvents\";\n\n@Bean(KANBAN_BEAN_NAME.SWIMLANE_HANDLER)\nexport class SwimlaneHandler extends EventEmitter {\n\n    private swimlaneNodeMap : {[swimLaneId : string] : ISwimlaneNode} = {};\n    private swimlaneIds : string[] = [];\n\n    constructSwimlanes(swimlaneDefinitions : ISwimlaneDefinition[]) : void {\n        swimlaneDefinitions.forEach((swimlaneDef : ISwimlaneDefinition ) => {\n            this.createSwimLane(swimlaneDef);\n        });\n\n        const event = {\n            type : kanban_events.ON_SWIM_LANE_NODE_CHANGED\n        };\n\n        this.dispatchEvent(event);\n    }\n\n    private createSwimLane(swimlaneDefinition : ISwimlaneDefinition) : ISwimlaneNode {\n\n        const swimlaneId = swimlaneDefinition.swimlaneId;\n        const swimlaneNode = this.createManagedBean(new SwimLaneNode(swimlaneDefinition)) ;\n\n        this.swimlaneNodeMap[swimlaneId] = swimlaneNode;\n        this.swimlaneIds.push(swimlaneId);\n\n        return swimlaneNode;\n    }\n\n}","import { Context } from \"@dg/corecomponent\";\nimport { IExperimentalAPI, IGridAPI, IReorderableAPI, IRowAPIManager } from \"../Grid/Main\";\nimport { IListConfiguration } from \"./list-configuration.types\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IUserParams } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/Text/src/text-core-component\";\nimport { GridCoreComponent } from \"../Grid/Core/GridCoreComponent\";\nimport { ModuleRegistry } from \"../Grid/Core/ModuleRegistry\";\nimport { ListModule } from \"./list-module\";\nimport { ISortApiManager } from \"../Grid/API/SortAPI/Interface/ISortApiManager.types\";\nimport { IFilterApiManager } from \"../Grid/API/FilterAPI/Interface/IFilterApiManager.types\";\nimport { IRowGroupingApiManager } from \"../Grid/API/RowGroupingAPI/Interface/IRowGroupingApiManager.types\";\nimport { IRowSelectionAPI } from \"../Grid/API/selection/selection-api.types\";\nimport { IListNavigationAPI } from \"../Grid/API/navigation/list-navigation-api.types\";\n\n\nModuleRegistry.registerModules([ListModule])\n\nexport class List {\n\tpublic api              : IGridAPI;\n\tpublic experimentalAPI : IExperimentalAPI;\n\tpublic rowAPI           : IRowAPIManager;\n\tpublic selectionAPI     : IRowSelectionAPI;\n\tpublic reorderableAPI   : IReorderableAPI;\n\tpublic sortAPI          : ISortApiManager;\n\tpublic filterAPI        : IFilterApiManager;\n\tpublic rowGroupingAPI   : IRowGroupingApiManager;\n\tpublic listNavigationAPI    : IListNavigationAPI;\n\tconstructor(gridContainer : HTMLElement, gridOptions : IListConfiguration, params ?: IUserParams, getContext : (context : Context) => void = () => {}) {\n\t\tconst setContextAPI = (context : Context) => {\n\t\t\tthis.api              = context.getBean(GRID_BEAN_NAME.GRID_API);\n\t\t\tthis.experimentalAPI = context.getBean(GRID_BEAN_NAME.GRID_EXPERIMENTAL_API);\n\t\t\tthis.rowAPI           = context.getBean(GRID_BEAN_NAME.ROW_API);\n\t\t\tthis.selectionAPI     = context.getBean('rowSelectionAPI');\n\t\t\tthis.reorderableAPI   = context.getBean(GRID_BEAN_NAME.REORDERABLE_API);\n\t\t\tthis.sortAPI          = context.getBean(GRID_BEAN_NAME.SORT_API);\n\t\t\tthis.filterAPI        = context.getBean(GRID_BEAN_NAME.FILTER_API);\n\t\t\tthis.rowGroupingAPI   = context.getBean(GRID_BEAN_NAME.ROW_GROUPING_API);\n\t\t\tthis.listNavigationAPI = context.getBean('listNavigationAPI');\n\n\t\t\tgetContext(context);\n\t\t};\n\t\tnew GridCoreComponent().initializeGrid(gridContainer, gridOptions, 'list', setContextAPI, params);\n\t}\n\n}\n","import { FilterHandler } from \"../DataStore/Local/FilterHandler\";\nimport { IFilterHandlerConstructor } from \"../DataStore/Local/filter-handler.types\";\nimport { ISortHandlerConstructor } from \"../DataStore/Local/sort-handler.types\";\nimport { RowGroupingHandler } from \"../DataStore/Local/RowGroupingHandler\";\nimport { SortHandler } from \"../DataStore/Local/SortHandler\";\nimport { IRowAxisConstructor } from \"../DataStore/RowAxis/rowAxis.types\";\nimport { IListBeanClassRegistry } from \"./list-beanclass-registry.types\";\nimport { IRowGroupingHandlerConstructor } from \"../DataStore/Local/rowgrouping-handler.types\";\nimport { IRowNodeCoreConstructor } from \"../DataStore/rownode.types\";\nimport { IGroupedRowNodeConstructor } from \"../DataStore/group-rownode.types\";\nimport { GroupRowNode } from \"../DataStore/GroupRowNode\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { Bean } from \"@dg/corecomponent\";\nimport { ListGroupedRowAxis } from \"./ListGroupAxis\";\nimport { ListRowNode } from \"./ListRowNode\";\nimport { DynamicRowAxis } from \"../DataStore/RowAxis/DynamicRowAxis\";\n\n@Bean(GRID_BEAN_NAME.MODEL_CLASS_REGISTRY)\nexport class ListBeanClassRegistry implements IListBeanClassRegistry {\n    registerClasses: Map<string, any>;\n    constructor() {\n        this.registerClasses = new Map();\n    }\n\n    getRowNode(): IRowNodeCoreConstructor {\n        return ListRowNode;\n    }\n    getGroupRowNode(): IGroupedRowNodeConstructor {\n        return GroupRowNode;\n    }\n    getStaticRowAxis(): IRowAxisConstructor {\n        return ListGroupedRowAxis;\n    }\n    getDynamicRowAxis(): IRowAxisConstructor {\n        return DynamicRowAxis;\n    }\n    getSortHandler(): ISortHandlerConstructor {\n        return SortHandler;\n    }\n    getFilterHandler(): IFilterHandlerConstructor {\n        return FilterHandler;\n    }\n    getRowGroupingHandler(): IRowGroupingHandlerConstructor {\n        return RowGroupingHandler;\n    }\n}\n","import { RowBlockAxisCore } from \"../DataStore/RowAxis/RowBlockAxisCore\"\nimport { StaticRowAxis } from \"./StaticRowAxis\";\n\nexport class ListBlockAxis extends RowBlockAxisCore {\n    constructor(config){\n        super();\n        this.axis = new StaticRowAxis(config);\n        this.isBlockVisible = config.isVisible ?? true;\n    }\n\n    updateBottomMargin(marginBottom: number = 0): void {\n        this.axis.updateBottomMargin(marginBottom);\n    }\n\n    updateTopMargin(marginTop: number = 0): void {\n        this.axis.updateTopMargin(marginTop);\n    }\n}","import { AutoWired, BEAN_NAME, PostConstruct } from \"@dg/corecomponent\";\nimport { IBlockRowAxisCore } from \"../DataStore/RowAxis/grouped-rowAxis.types\";\nimport { groupedRowAxisCore } from \"../DataStore/RowAxis/groupedRowAxisCore\";\nimport { ListBlockAxis } from \"./ListBlockAxis\";\n// import { ListDynamicBlockAxis } from \"./ListDynamicBlockAxis\";\nimport { ListOptioHandler } from \"./list-option-handler\";\n\nexport class ListGroupedRowAxis extends groupedRowAxisCore{\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionalHandler : ListOptioHandler;\n    config: any;\n\n    @PostConstruct()\n    init(){\n        this.config = {...{}, ...{\n            marginTop   : this.optionalHandler.getMarginTop(),\n            marginBottom: this.optionalHandler.getMarginBottom()\n        }};\n    }\n\n    private createBlockAxis(configurations: Record<string, unknown>): IBlockRowAxisCore {\n        // if (this.optionalHandler.hasStaticRowHeight()) {\n            return new ListBlockAxis(configurations);\n        // }\n        // return new ListDynamicBlockAxis(configurations);\n    }\n\n    createBlock(config ?: any): IBlockRowAxisCore {\n        const configurations = {...{}, ...this.config, ...config};\n        return this.createBlockAxis(configurations);\n    }\n    getNewBlock(): IBlockRowAxisCore {\n        const blockAxis = this.createBlockAxis(this.config);\n        this.insertBlock(blockAxis);\n        return blockAxis;\n    }\n}","import { IFullWidthType } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { RowNode } from \"../Grid/Core/Rows/RowNode\";\n\nexport class ListRowNode extends RowNode {\n    isFullWidthRow(): boolean {\n        return true;\n    }\n\n    getFullWidthType(): IFullWidthType {\n        return 'sticky';\n    }\n}\n","import { findInsertIndex } from \"../../Sub_Components/src/Utilities/Utility\";\nimport { IAxisConfig, IRowAxisCore } from \"../DataStore/RowAxis/rowAxis.types\"; \n\nclass StaticRowAxis implements IRowAxisCore {\n    private totalCount   : number;\n    private staticHeight : number;\n    private marginTop    : number;\n    private marginBottom : number;\n    private totalMargin  : number;\n    private visibleRows  : number[];\n    constructor(config : IAxisConfig = {}) {\n        this.totalCount   = 0;\n        this.staticHeight = 0;\n        this.visibleRows  = [];\n        const {marginTop, marginBottom} = config;\n        this.updateMargin(marginTop, marginBottom);\n    }\n    \n    resetRows(): void {\n        this.totalCount  = 0;\n        this.visibleRows = [];\n    }\n\n    updateAllHeight(height: number): void {\n        this.staticHeight = height;\n    }\n    \n    updateMargin(marginTop : number = 0, marginBottom: number = 0): void {\n        this.marginTop = marginTop;\n        this.marginBottom = marginBottom;\n        this.totalMargin = this.marginTop + this.marginBottom;\n    }\n\n    updateBottomMargin(marginBottom: number = 0): void {\n        this.marginBottom = marginBottom;\n        this.totalMargin = this.marginTop + this.marginBottom;\n    }\n\n    updateTopMargin(marginTop: number = 0): void {\n        this.marginTop = marginTop;\n        this.totalMargin = this.marginTop + this.marginBottom;\n    }\n\n    getBottomMargin() : number {\n        return this.marginBottom;\n    }\n\n    getTopMargin() : number {\n        return this.marginTop;\n    }\n\n    private isValidRow(index : number) : boolean {\n        return index < this.getTotalCount();\n    }\n\n    private isValidVisibleRow(index : number) : boolean {\n        return index < this.getVisibleCount();\n    }\n\n    getVerticalIndex(index: number, count?: number): number {\n        return index + count;\n    }\n\n    getMargin() : number {\n        return this.totalMargin;\n    }\n\n    getVisibleIndexesByPosition(localTop: number, localBottom: number, left: number): number[] {\n        const startRow  = this.getDisplayIndexByPosition(localTop, left);\n        const endRow    = this.getDisplayIndexByPosition(localBottom, left);\n        return this.visibleRows.slice(startRow, endRow+1);\n    }\n\n    convertToActualIndex(visibleIndex: number): number {\n        return this.visibleRows[visibleIndex];\n    }\n\n    getVisibleCount() : number {\n        return this.visibleRows.length;\n    }\n\n    getViewportRows(top: number, bottom: number, left?: number): number[] {\n        const startRow  = this.getDisplayIndexByPosition(top, left);\n        const endRow    = this.getDisplayIndexByPosition(bottom, left);\n        return this.visibleRows.slice(startRow, endRow+1);\n    }\n\n    getDisplayIndexByPosition(top: number, _left?: number): number {\n        const RowHeight = this.staticHeight + this.totalMargin;\n        return Math.floor(top / RowHeight);\n    }\n\n    insertRow(_index: number, height: number): void {\n        this.appendRow(height);\n    }\n\n    updateRow(_index: number, height: number): void {\n        this.staticHeight = height;\n    }\n\n    deleteRow(index: number): void {\n        if(this.isValidRow(index)){\n            const visibleIndex = this.visibleRows.indexOf(index);\n            const insertIndex = findInsertIndex(this.visibleRows, index);\n            this.totalCount--;\n            for(let i = insertIndex; i < this.visibleRows.length; i++){\n                this.visibleRows[i] = this.visibleRows[i]-1; \n            }\n            (visibleIndex != -1) && this.visibleRows.splice(visibleIndex, 1);\n        }\n    }\n\n    appendRow(height: number): void {\n        this.totalCount++;\n        this.staticHeight =  height;\n        this.visibleRows.push(this.totalCount - 1);\n        // this.visibleRows = this.visibleRows.sort((a, b) => a - b);\n    }\n\n    appendMultipleRows(heights : number[]): void {\n        const insertCount = heights.length;\n        this.totalCount += insertCount;\n        this.staticHeight = heights[0] ?? 0;\n        this.visibleRows.push(...heights.map((_height, index) => this.totalCount - insertCount + index));\n    }\n\n    getTotalHeight(): number {\n        const visibleCount = this.visibleRows.length;\n        return visibleCount * (this.staticHeight + this.totalMargin);\n    }\n\n    getTotalCount(): number {\n        return this.totalCount;\n    }\n\n    getTop(index : number): number {\n        const isHidden = this.isRowHidden(index);\n        const visibleIndex = this.visibleRows.indexOf(index);\n        if(isHidden){\n            const nearestIndex = findInsertIndex(this.visibleRows, index);\n            return (nearestIndex * this.staticHeight) + this.marginTop;\n        }\n        else if(visibleIndex != -1){\n            const rowHeight = this.staticHeight + this.totalMargin;\n            return (visibleIndex * rowHeight) + this.marginTop;\n        }\n        return this.getTotalHeight();\n    }\n\n    getHeight(index: number): number {\n        if(this.isValidRow(index) && !this.isRowHidden(index)){\n            return this.staticHeight;\n        }\n        return 0;\n    }\n\n    getLeft(_index: number): number {\n        return 0;\n    }\n\n    getWidth(_index: number): number {\n        return null;\n    }\n\n    getIndexByPosition(top: number, _left?: number): number {\n        const index = this.getDisplayIndexByPosition(top);\n        const isValid = this.isValidVisibleRow(index); \n        return isValid ? this.visibleRows[index] : this.getTotalCount();\n    }\n\n    isRowHidden(index: number): boolean {\n        return !this.visibleRows.includes(index);\n    }\n\n    showRow(index: number): void {\n        !this.visibleRows.includes(index) && this.visibleRows.push(index);\n        this.visibleRows = this.visibleRows.sort((a, b) => a - b);\n    }\n\n    hideRow(index: number): void {\n        const indexIndex = this.visibleRows.indexOf(index);\n        if(indexIndex != -1){\n            this.visibleRows.splice(indexIndex, 1);\n        }\n    }\n}\n\nexport{\n    StaticRowAxis\n}","import { ViewportRangeRegistry } from \"../Grid/Core/ViewportRangeModule\";\nimport { IModule } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\nimport { LocalRowModelModule, RemoteRowModelModule } from \"../Grid/grid-module\";\nimport { NavigationModule } from \"../Navigation/navigation-module\";\nimport { ListOptioHandler } from \"./list-option-handler\";\nimport { ListBeanClassRegistry } from \"./ListBeanClassRegistry\";\n\nexport const ListModule: IModule = {\n\tmoduleName : 'list',\n\tversion    : '1.0.0',\n\tbeans      : [ListBeanClassRegistry, ListOptioHandler, ViewportRangeRegistry],\n\tmodelType  : 'list',\n\tdependantModules : [NavigationModule, LocalRowModelModule, RemoteRowModelModule]\n};","import { AutoWired, Bean, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IListConfiguration } from \"./list-configuration.types\";\nimport { defaultCacheBlockCount, defaultCacheBlockSize, defaultFetchTriggerPoint, defaultRowHeight, minCacheBlockSize } from \"../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IBaseComponent, IColumnDefinition, IColumnNode, IGridEventHandlers, IKeyBoardShortcutsParams, IRowModel, SuppressCallback, TimeLineViewType } from \"../Grid/Main\";\nimport { IFetchParam, IRowDefinition, IRowDefinitionFetchParams, IRowHeightParam } from \"../Grid/Core/Interface/IRowDefinitions\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { IActionRenderer } from \"GanttModelClasses/IGanttConfiguration\";\n\nexport const configuration = {\n    popUpParent : 'popupParent'\n}\n\nfunction getCallbackForEvent(eventName: string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\nfunction getHookCallbackForEvent(eventName: string, Hookname : string): string {\n\tif (eventName && eventName.length == 2) {\n\t\treturn eventName;\n\t}\n\treturn `on${Hookname}${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nclass ListOptioHandler extends EventEmitter {\n\n\tprivate domKey = `_DG_${Math.random().toString()}`;\n\n\t@AutoWired(GRID_BEAN_NAME.GRID_OPTIONS) private configuration !      : IListConfiguration;\n\t@AutoWired(GRID_BEAN_NAME.GRID_DIV_ELEMENT) private \tgridDivElement !: HTMLElement;\n\t\n\t@PostConstruct()\n\tinit() {\n\t\tthis.setRowData(this.configuration.rowData);\n\t\tthis.eventHandler.addGlobalListener(\n\t\t\tthis.globalEventHandler.bind(this),\n\t\t\tfalse,\n\t\t);\n\t}\n\n\tprivate globalEventHandler(eventName: string, event?: any) {\n\t\tconst callbackMethodName = getCallbackForEvent(eventName);\n\t\tif (typeof this.configuration[callbackMethodName] === 'function') {\n\t\t\tthis.configuration[callbackMethodName](event);\n\t\t}\n\t}\n\n\tonBefore(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'Before');\n\n\t\tif(typeof this.configuration['events']?.[callbackMethodName] === 'function') {\n\t\t\treturn this.configuration['events'][callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ton(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, '');\n\n\t\tif(typeof this.configuration['events']?.[callbackMethodName] === 'function') {\n\t\t\treturn this.configuration['events'][callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tonAfter(eventName : string, event?: any) : void {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'After');\n\n\t\tif(typeof this.configuration['events']?.[callbackMethodName] === 'function') {\n\t\t\tthis.configuration['events'][callbackMethodName](event);\n\t\t}\n\t}\n\n\t\n\n\tgetDomKey(): string {\n\t\treturn this.domKey;\n\t}\n\n\tgetDomData(element: Node | null, key: string): any {\n\t\tconst domData = element[this.getDomKey()];\n\t\treturn domData ? domData[key] : undefined;\n\t}\n\n\tsetDomData(element: Element, key: string, value: any): any {\n\t\tconst domKey = this.getDomKey();\n\t\tlet domData = element[domKey];\n\n\t\tif (!domData) {\n\t\t\tdomData = {};\n\t\t\t(element as any)[domKey] = domData;\n\t\t}\n\n\t\tdomData[key] = value;\n\t}\n\n\tgetDefaultRowHeight(): number {\n\t\treturn defaultRowHeight;\n\t}\n\n\tgetCacheBlockCount(): number {\n\t\treturn this.configuration.cacheBlockCount ?? defaultCacheBlockCount;\n\t}\n\n\tgetCacheBlockSize(): number {\n\t\tconst size = this.configuration.cacheBlockSize ?? defaultCacheBlockSize;\n\t\treturn Math.max(minCacheBlockSize, size);\n\t}\n\n\tgetStaticCacheIndexes(): number[] {\n\t\treturn this.configuration.staticCacheRowIndices ?? [];\n\t}\n\n\tgetFetchTriggerPoint(): number {\n\t\treturn this.configuration.fetchTriggerPoint ?? defaultFetchTriggerPoint;\n\t}\n\n\tgetColumnDef(): IColumnDefinition[] {\n\t\treturn this.configuration?.columnDefinitions ?? [];\n\t}\n\n\tgetRowDefinitions(rowMeta : IRowDefinitionFetchParams) : IRowDefinition {\n\t\treturn this.configuration?.rowDefinitions ? this.configuration?.rowDefinitions(rowMeta) ?? {} :{};\n\t}\n\n\tgetRowData() {\n\t\treturn this.configuration.rowData;\n\t}\n\n\tisRTL(): boolean {\n\t\treturn this.configuration?.rtl ?? false;\n\t}\n\n\tgetAnimateRow() : boolean {\n\t\treturn this.configuration?.animateRow ?? true;\n\t}\n\n\n\tgetScrollbarWidth(): number {\n\t\treturn 10;\n\t}\n\n\n\tisRowHoverHighlighter(): boolean {\n\t\treturn this.configuration?.rowHighlighter ?? false;\n\t}\n\n\tgetBufferSize(): number {\n\t\tconst buffer = (this.configuration as any)?.buffer ?? 10;\n\t\treturn Math.max(0, buffer);\n\t}\n\n\tisSuppressHorizontalScroll() {\n\t\treturn false;\n\t}\n\n\tisSuppressVerticalScroll() {\n\t\treturn false;\n\t}\n\n\tgetPopupParent(): HTMLElement {\n        return this.configuration[configuration.popUpParent];\n\t}\n\n    getDocument(): Document {\n        let result: Document | null = null;\n        if (this.gridDivElement) {\n\t\t\tresult = this.gridDivElement.ownerDocument;\n\t\t}\n\n        if (result) {\n            return result;\n        }\n\n        return document;\n    }\n\n\tgetGridContainer(): HTMLElement {\n\t\treturn this.gridDivElement ?? null;\n\t}\n\n\tgetHookEvents() : IGridEventHandlers {\n\t\treturn this.configuration?.events || {};\n\t}\n\n\tgetEvents(){\n\t\treturn this.configuration?.events || {};\n\t}\n\n\tgetSuppressMouseDownEvent() : SuppressCallback {\n\t\treturn this.configuration?.suppressMouseDownEvent;\n\t}\n\n\tgetSuppressKeyDownEvent() : SuppressCallback {\n\t\treturn this.configuration?.suppressKeyDownEvent;\n\t}\n\n\n\tgetRowReoderRenderer() : any {\n\t\treturn this.configuration?.rowReorderRenderer;\n\t}\n\n\tgetRowReorderRendererParams() : any {\n\t\treturn this.configuration?.rowReorderRendererParam;\n\t}\n\n\tgetRowDropZones() : any[] {\n\t\treturn this.configuration?.rowDropZones ?? [];\n\t}\n\n\n\n\tgetRowHeights(meta : IRowHeightParam) : number {\n\t\tconst rowHeights = this.configuration?.rowHeights;\n\t\tif(rowHeights) {\n\t\t\tif(typeof rowHeights === 'function') {\n\t\t\t\treturn rowHeights(meta);\n\t\t\t}\n\n\t\t\telse if(typeof rowHeights === 'string' || typeof rowHeights === 'number') {\n\t\t\t\treturn Number(rowHeights) ?? defaultRowHeight;\n\t\t\t}\n\t\t}\n\t\treturn defaultRowHeight;\n\t}\n\n\n\n\tsetRowData(rowData: Record<string, any>[] | ((param: IFetchParam) => void)) {\n        this.configuration.rowData = rowData;\n    }\n\n\n\n\tgetFullWidthCellRenderer() : any {\n\t\treturn this.configuration?.fullWidthCellRenderer;\n\t}\n\n\tgetFullWidthGroupCellRenderer() : any {\n\t\treturn this.configuration?.groupRowRenderer;\n\t}\n\n\tisGroupUseFullWidthRow(): boolean {\n        return true;\n    }\n\n    getViewConfig(_isGrouped : boolean = false) : any {\n        return {\n            marginBottom : this.getMarginBottom()\n        };\n    }\n\n    getMarginBottom() : number {\n        return this.configuration.marginBottom ?? 0;\n    }\n\n    getMarginTop() : number {\n        return this.configuration.marginTop ?? 0;\n    }\n\n    isColumnHeader() : boolean {\n        return true;\n    }\n\n    getIsExtraRow() : boolean {\n        return false;\n    }\n\n    isRelativeFloatingRecord() : boolean {\n        return true;\n    }\n\n    getRowHeader() {\n        return []\n    }\n\n    getDefaultColumnDefinitions() {\n        return {};\n    }\n\n    isFullRowHoverOnEdit() {\n        return false;\n    }\n\n    getRowModelType() : IRowModel {\n\t\treturn this.configuration?.rowModelType ?? 'local';\n\t}\n\n    getRowCount() : number {\n\t\treturn this.configuration?.rowCount  ?? this.getRowData().length;\n\t}\n\n    getFetchDelay(): number {\n\t\treturn this.configuration.fetchDelay ?? 0;\n\t}\n\n    getFullWidthLoadingRenderer() : any {\n\t\treturn this.configuration.fullWidthLoadingRenderer ?? 'dgFullWidthLoadingRenderer';\n\t}\n\n\thasStaticRowHeight() : boolean {\n\t\treturn true;\n\t}\n\n\tgetRootRowCount() : ()=>number {\n\t\treturn  ()=>this.getRowCount();\n\t}\n\n\tisWrapNavigationToNextRow() : boolean {\n\t\treturn this.configuration.wrapNavigationToNextRow ?? false;\n\t}\n\n\tisRowSuppressNavigation(params : {node : IRowNodeCore, column : IColumnNode}) : boolean {\n\t\tif(typeof this.configuration.suppressRowNavigation === 'function') {\n\t\t\tconst useFunction = this.configuration.suppressRowNavigation;\n\n\t\t\treturn useFunction(params);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tisRangeSelectionEnabled() : boolean {\n\t\treturn false;\n\t}\n\n\tsuppressMultiRangeSelection() : boolean {\n\t\treturn true;\n\t}\n\n\tisRowTransform() : boolean {\n\t\treturn true;\n\t}\n\n\tsuppressGroupRowsSticky() : boolean {\n\t\treturn this.configuration.suppressGroupRowsSticky;\n\t}\n\n\tgetColumnHeaderHeight(meta : any) : number {\n\t\tconst columnHeaderHeights = this.configuration?.columnHeaderHeights;\n\t\tif(columnHeaderHeights) {\n\t\t\tif(typeof columnHeaderHeights === 'function') {\n\t\t\t\treturn columnHeaderHeights(meta);\n\t\t\t}\n\n\t\t\telse if(typeof columnHeaderHeights === 'string' || typeof columnHeaderHeights === 'number') {\n\t\t\t\tif (columnHeaderHeights === 'auto') {\n\t\t\t\t\treturn defaultRowHeight;\n\t\t\t\t}\n\t\t\t\tconst numericHeight = typeof columnHeaderHeights === 'number' ? columnHeaderHeights : Number(columnHeaderHeights);\n\t\t\t\treturn Number.isFinite(numericHeight) ? numericHeight : defaultRowHeight;\n\t\t\t}\n\t\t}\n\t\treturn defaultRowHeight;\n\t}\n\n\n\tgetKeyBoardShortCuts() : IKeyBoardShortcutsParams[] {\n\t\treturn this.configuration.keyBoardShortcuts ?? [];\n\t}\n\n\tisEnterNavigatesVerticallyAfterEdit() : boolean {\n\t\treturn  false;\n\t}\n\n\tisEnterNavigatesVertically() : boolean {\n\t\treturn  false;\n\t}\n\n\tisCellEditingOnBackspace() : boolean {\n\t\treturn  false;\n\t}\n\n\tsuppressCsvExport() : boolean {\n\t\treturn this.configuration.suppressCsvExport ?? false;\n\t}\n\n\tclearSelectionOnMouseDown() : boolean {\n\t\treturn this.configuration.clearSelectionOnMouseDown ?? true\n\t}\n\n\tgetIncludeKeyboardShortcuts() : string[] {\n\t\treturn this.configuration.includeKeyboardShortcuts ?? [];\n\t}\n\n\tgetExcludeKeyboardShortcuts() : string[] {\n\t\treturn this.configuration.excludeKeyboardShortcuts ?? [];\n\t}\n\n\tgetRowSelection() : 'single' | 'multiple' | \"none\"{\n\t\treturn this.configuration.rowSelection ?? 'none';\n\t}\n\n\tisAllowMultipleTypeSelection() : boolean {\n\t\treturn false;\n\t}\n\n\tgetFullWidthRendererParams() : any {\n\t\treturn this.configuration.fullWidthCellRendererParams\n\t}\n\n\tgetFullWidtLoadinghRendererParams() : any {\n\t\treturn this.configuration.fullWidthLoadingRendererParams\n\t}\n\n\tgetGroupingFullWidthRendererParams() : any {\n\t\treturn this.configuration.groupRowRendererParams;\n\t}\n\n\tisStopEditingWhenCellsLoseFocus() : boolean {\n\t\treturn false;\n\t}\n\n\tisClearSelectionOnCellRightClick() : boolean {\n\t\treturn false;\n\t} \n\n\tisCellFocusonSelection() : boolean {\n\t\treturn false;\n\t}\n\n\tgetShouldPreventGridMousedown() : boolean {\n\t\treturn this.configuration.shouldPreventGridMousedown ?? false;\n\t}\n\n\tisCellFocusScrollOnColumnSelection() : boolean {\n\t\treturn false;\n\t}\n\n\tisAutoFillRows() : boolean {\n\t\treturn  false;\n\t}\n\n\tisRowDraggable() : boolean {\n\t\treturn this.configuration.rowDraggable ?? false;\n\t}\n\n\texcludeScrollbarForPinning() {\n\t\treturn this.configuration.excludeScrollbarForPinning ?? true;\n\t}\n\n\tgetMinSpareRows() : number {\n\t\treturn 0;\n\t}\n\n\tgetMinSpareColumns() : number {\n\t\treturn 0;\n\t}\n\n\tgetInitialMinSpareRows() : number {\n\t\treturn 0;\n\t}\n\n\tgetInitialMinSpareColumns() : number {\n\t\treturn 0;\n\t}\n\n\tgetTopDraftRowCount() : number {\n\t\treturn 0;\n\t}\n\n\tgetBottomDraftRowCount() : number {\n\t\treturn 0;\n\t}\n\n\t//gantt\n\tgetProjectStartDate() : Date | string{\n\t\treturn this.configuration.projectStartDate;\n\t}\n\tgetProjectEndDate():Date | string{\n\t\treturn this.configuration.projectEndDate;\n\t}\n\n\tgetViewType():string{\n\t\treturn this.configuration.viewType ?? 'grid';\n\t}\n\n\tgetViewportRowPageSize() : number {\n\t\treturn 100;\n\t}\n\n\tgetViewportColumnPageSize() : number {\n\t\treturn 50;\n\t}\n\n\tgetViewportRowBufferSize() : number {\n\t\treturn  20;\n\t}\n\n\tgetViewportColumnBufferSize() : number {\n\t\treturn   5;\n\t}\n\n\n\tgetTimeLineViewType() : TimeLineViewType{\n\t\treturn this.configuration.timeLineViewType ?? 'week';\n\t}\n\n\thasFullTreeStructureProvided() : boolean {\n\t\treturn this.configuration.hasTreeFullStructureProvided ?? false;\n\t}\n\n\tgetActionRenderer() : (new() => IActionRenderer) {\n\t\treturn this.configuration.actionRenderer;\n\t}\n\n\tgetActionRendererParams() : Object | null {\n\t\treturn this.configuration.actionRendererParams ?? null;\n\t\t}\n\tgetNoRecordRenderer() : new () => IBaseComponent<any> {\n\t\treturn this.configuration.noRecordRenderer;\n\t}\n\tsuppressCellFocusOnSelection() : boolean {\n\t\treturn this.configuration.suppressCellFocusOnSelection ?? false;\n\t}\n\n\tsuppressGroupHeaderCellFocus() : boolean {\n\t\treturn this.configuration.suppressGroupHeaderCellFocus ?? false\n\t}\n\n\tgetTreeLevelLeftMargins(level: number = 1): number {\n\t\tconst margins = this.configuration.treeLevelLeftMargins;\n\t\tif (!margins) return 0;\n\n\t\tlet total = 0;\n\t\tfor (let i = 0; i < level; i++) {\n\t\t\ttotal += margins[i] ?? 0;\n\t\t}\n\t\treturn total;\n\t}\n\n\tgetTreeLevelRightMargins(level: number = 1): number {\n\t\tconst margins = this.configuration.treeLevelRightMargins;\n\t\tif (!margins) return 0;\n\n\t\tlet total = 0;\n\t\tfor (let i = 0; i < level; i++) {\n\t\t\ttotal += margins[i] ?? 0;\n\t\t}\n\t\treturn total;\n\t}\n\n\tsuppressGroupToGroupRangeSelection() : boolean {\n\t\treturn  false;\n\t}\n\n\tisAutoUnpinnedColumns() : boolean {\n\t\treturn false;\n\t}\n\n\tisAutoColumnHeaderHeight() : boolean {\n\t\treturn this.configuration.columnHeaderHeights === 'auto';\n\t}\n}\n\n\nexport { ListOptioHandler };\n","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { IColumnNode } from \"../Grid/Core/Interface/IColumnNode\";\nimport { CellPositionType, RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { KeyBoardEventKeys } from \"../Grid/Core/Navigation/KeyBoardEventKeys\";\nimport { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { ICellNavigationHandler } from \"../Grid/Core/Navigation/cell-navigation-handler.types\";\nimport type { RowRenderController } from \"../Grid/Core/Rows/RowRenderController\";\nimport { areArraysEqual } from \"../Grid/Core/utils/Object\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { IRowAPIManager } from \"../Grid/API/RowAPI/Interface/IRowAPI\";\n\n@Bean(\"CellNavigationHandler\")\nexport class CellNavigationHandler extends EventEmitter implements ICellNavigationHandler {\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler: FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler: IRecordHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: GridOptioHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRendererController : RowRenderController;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName   : getBeanInstanceByBeanName;\n    isCellFocusable(cellPosition: CellPositionType, initator : \"range\" | \"cell\" = \"cell\"): boolean {\n        const column: IColumnNode = this.fieldHandler.getColumnNodeByID(cellPosition.columnID);\n        const rowNode = this.getRowNodeForPosition(cellPosition);\n\n        const suppressGroupHeaderCellFocus = this.optionsHandler.suppressGroupHeaderCellFocus();\n\n        if (!rowNode) {\n            return true;\n        }\n\n        if(initator === \"cell\" && suppressGroupHeaderCellFocus && rowNode.isGroupRow()) {\n            return false;\n        }\n\n        const columnSuppressNavigable = column ? column.isSuppressNavigation(rowNode) : false;\n        const rowSuppressNavigation = this.isRowSuppressNavigation(rowNode, column);\n\n\n        return !columnSuppressNavigable && !rowSuppressNavigation;\n    }\n\n    getFirstCellInColumn(cellPosition: CellPositionType): CellPositionType | null {\n        const groupBoundaryCell = this.getGroupBoundaryCellInColumn(cellPosition, 'first');\n        if (groupBoundaryCell) {\n            return groupBoundaryCell;\n        }\n\n        const suppressGroupHeaderCellFocus = this.optionsHandler.suppressGroupHeaderCellFocus();\n        const firstRowPosition = suppressGroupHeaderCellFocus ? this.recordHandler.getFirstLeafRowMeta() : this.recordHandler.getFirstIndexMeta() as RowPositionType;\n        return firstRowPosition ? { ...cellPosition, ...firstRowPosition } : null;\n    }\n\n    getLastCellInColumn(cellPosition: CellPositionType): CellPositionType | null {\n        const groupBoundaryCell = this.getGroupBoundaryCellInColumn(cellPosition, 'last');\n        if (groupBoundaryCell) {\n            return groupBoundaryCell;\n        }\n\n        const suppressGroupHeaderCellFocus = this.optionsHandler.suppressGroupHeaderCellFocus();\n        const lastRowPosition = suppressGroupHeaderCellFocus\n            ? this.recordHandler.getLastLeafRowMeta(false)\n            : this.recordHandler.getLastIndexMeta(false) as RowPositionType;\n        return lastRowPosition ? { ...cellPosition, ...lastRowPosition } : null;\n    }\n\n    private getGroupBoundaryCellInColumn(cellPosition: CellPositionType,boundary: 'first' | 'last'): CellPositionType | null {\n        const isGroupingApplied = this.optionsHandler.hasFullTreeStructureProvided();\n\n        if (!isGroupingApplied) {\n            return null;\n        }\n\n        const rowNode = this.recordHandler.getRowNodeByMeta(cellPosition);\n        if (!rowNode || rowNode.isGroupRow?.()) {\n            return null;\n        }\n\n        const groupRow = boundary === 'first'? this.recordHandler.getGroupFirstRow(cellPosition): this.recordHandler.getGroupLastRow(cellPosition, false);\n\n        if (!groupRow) {\n            return null;\n        }\n\n        if (boundary === 'last' && groupRow.rowIndex < 0) {\n            return { ...cellPosition };\n        }\n\n        const pinPosition = groupRow.pinPosition === 'topDraftRow' || groupRow.pinPosition === 'bottomDraftRow' ? 'middle': groupRow.pinPosition;\n\n        return { ...cellPosition, ...groupRow, pinPosition };\n    }\n\n\n\n    getFirstCellInRow(rowPosition: RowPositionType): CellPositionType | null {\n        const isRTL           = this.optionsHandler.isRTL();\n        const firstColumnID   = this.fieldHandler.getFirstColumnID();\n        const lastColumnID    = this.fieldHandler.getLastColumnID();\n        const columnID        = isRTL ? lastColumnID : firstColumnID;\n        return columnID ? { ...rowPosition, columnID } : null;\n    }\n\n    getLastCellInRow(rowPosition: RowPositionType): CellPositionType | null {\n        const isRTL           = this.optionsHandler.isRTL();\n        const firstColumnID   = this.fieldHandler.getFirstColumnID();\n        const lastColumnID    = this.fieldHandler.getLastColumnID();\n        const columnID        = isRTL ? firstColumnID : lastColumnID;\n        return columnID ? { ...rowPosition, columnID } : null;\n    }\n\n    getNextCellToFocus(key: string, cellPosition: CellPositionType, wrapNavigationToNextRow : boolean = false, initator : \"range\" | \"cell\" = \"cell\"): CellPositionType | null {\n        let currentCellPosition: CellPositionType | null = cellPosition;\n\n        while (currentCellPosition) {\n            currentCellPosition = this.getNextPointer(key, currentCellPosition, wrapNavigationToNextRow);\n\n            if (!currentCellPosition || this.isCellFocusable(currentCellPosition, initator)) {\n                break;\n            }\n        }\n\n        return currentCellPosition;\n    }\n\n    getNextCellForward(cellPosition: CellPositionType) : CellPositionType | null {\n        const isRTL = this.optionsHandler.isRTL();\n        return this.getNextCellToFocus(isRTL ? KeyBoardEventKeys.ARROW_LEFT :KeyBoardEventKeys.ARROW_RIGHT, cellPosition, true);\n    }\n\n    getNextCellBackward(cellPosition: CellPositionType) : CellPositionType | null {\n        const isRTL = this.optionsHandler.isRTL();\n        return this.getNextCellToFocus(isRTL ? KeyBoardEventKeys.ARROW_RIGHT :KeyBoardEventKeys.ARROW_LEFT, cellPosition, true);\n    }\n\n    public getRowAbove(previousRowPosition: RowPositionType): RowPositionType | null {\n        // const isFirstRow = this.isFirstRow(previousRowPosition);\n        // if (isFirstRow) {\n        //     return this.getPreviousPinnedRow(previousRowPosition);\n        // }\n\n        // return { ...previousRowPosition, rowIndex: previousRowPosition.rowIndex - 1 };\n        return this.recordHandler.getRelativeRowMeta(previousRowPosition, -1) as RowPositionType | null;\n    }\n\n    public getRowBelow(currentRowPosition: RowPositionType): RowPositionType | null {\n        // const isLastRow = this.isLastRow(currentRowPosition);\n        // if (isLastRow) {\n        //     return this.getNextPinnedRow(currentRowPosition);\n        // }\n\n        // return { ...currentRowPosition, rowIndex: currentRowPosition.rowIndex + 1 };\n        return this.recordHandler.getRelativeRowMeta(currentRowPosition, 1) as RowPositionType | null;\n    }\n\n    public getTopOfColumnView(columnID : string) : CellPositionType | null {\n        const rowNode = this.rowRendererController.getTopRowNodeOfView();\n        if(!rowNode) {\n            return null\n        }\n\n        const rowMeta = rowNode.getRowMeta() as RowPositionType;\n        return {\n            columnID,\n            ...rowMeta\n        }\n    }\n\n    public getBottomOfColumnView(columnID : string) : CellPositionType | null {\n        const rowNode = this.rowRendererController.getBottomRowNodeOfView();\n        if(!rowNode) {\n            return null\n        }\n        const rowMeta = rowNode.getRowMeta() as RowPositionType;\n        return {\n            columnID,\n            ...rowMeta\n        }\n    }\n\n    private getRowNodeForPosition(cellPosition: CellPositionType): IRowNodeCore | undefined {\n        const rowApiInteracter = this.getBeanInstanceByBeanName(GRID_BEAN_NAME.ROW_API) as IRowAPIManager;\n        const getRowNode = ({rowIndex, pinPosition, parentKeys}: RowPositionType) => {\n            const rowId = rowApiInteracter.getIdByIndex(rowIndex, pinPosition, parentKeys);\n            return this.recordHandler.getRowNodeById(rowId);\n        }\n        const handlerMap: { [key: string]: () => IRowNodeCore | undefined } = {\n            top     : () => getRowNode(cellPosition),\n            bottom  : () => getRowNode(cellPosition),\n            summary : () => getRowNode(cellPosition),\n            default : () => getRowNode(cellPosition),\n        };\n\n        return (handlerMap[cellPosition.pinPosition] || handlerMap.default)();\n    }\n\n    private isRowSuppressNavigation(rowNode: IRowNodeCore, column: IColumnNode): boolean {\n        const params = this.createSuppressNavigationParams(rowNode, column);\n        if(rowNode.isHidden()) {\n            return true;\n        }\n        return this.optionsHandler.isRowSuppressNavigation(params);\n    }\n\n    private createSuppressNavigationParams(rowNode: IRowNodeCore, columnNode: IColumnNode) {\n        return { node: rowNode, column: columnNode };\n    }\n\n    private getCardsPerRow(): number | undefined {\n        const middleHandler = this.recordHandler.getMiddleHandler();\n        const rowAxis = middleHandler?.getRowAxis?.() as { getCardsPerRow?: () => number } | undefined;\n        return rowAxis?.getCardsPerRow?.();\n    }\n\n    private getNextPointer(key: string, pointer: CellPositionType, wrapNavigationToNextRow : boolean = false): CellPositionType | null {\n        const isRtl = this.optionsHandler.isRTL();\n        const cardsPerRow = this.getCardsPerRow();\n\n        if (this.optionsHandler.getViewType() === 'gallery') {\n            return this.getNextPointerGallery(key, pointer, cardsPerRow, isRtl);\n        }\n\n        switch (key) {\n            case KeyBoardEventKeys.ARROW_UP:\n                return this.getCellAbove(pointer);\n            case KeyBoardEventKeys.ARROW_DOWN:\n                return this.getCellBelow(pointer);\n            case KeyBoardEventKeys.ARROW_RIGHT:\n                return isRtl ? this.getCellToLeft(pointer, wrapNavigationToNextRow) : this.getCellToRight(pointer, wrapNavigationToNextRow);\n            case KeyBoardEventKeys.ARROW_LEFT:\n                return isRtl ? this.getCellToRight(pointer,wrapNavigationToNextRow) : this.getCellToLeft(pointer,wrapNavigationToNextRow);\n            default:\n                return null;\n        }\n    }\n\n    private getNextPointerGallery(key: string, pointer: CellPositionType, cardsPerRow: number, isRtl: boolean): CellPositionType | null {\n        let delta = 0;\n        switch (key) {\n            case KeyBoardEventKeys.ARROW_UP:\n                delta = -cardsPerRow;\n                break;\n            case KeyBoardEventKeys.ARROW_DOWN:\n                delta = cardsPerRow;\n                break;\n            case KeyBoardEventKeys.ARROW_LEFT:\n                delta = isRtl ? 1 : -1;\n                break;\n            case KeyBoardEventKeys.ARROW_RIGHT:\n                delta = isRtl ? -1 : 1;\n                break;\n            default:\n                return null;\n        }\n        const nextRowMeta = this.recordHandler.getRelativeRowMeta(pointer, delta) as RowPositionType | null;\n        return nextRowMeta ? { ...nextRowMeta, columnID: pointer.columnID } : null;\n    }\n\n    private getCellToLeft(previousCellPosition: CellPositionType | null, wrapNavigationToNextRow : boolean = false): CellPositionType | null {\n        if (!previousCellPosition) { return null; }\n\n        let leftColumnID = this.fieldHandler.getPreviousID(previousCellPosition.columnID);\n        if (!leftColumnID && wrapNavigationToNextRow)  { \n            const previousRowPosition = this.getRowAbove(previousCellPosition);\n            if (previousRowPosition) {\n                leftColumnID = this.fieldHandler.getLastColumnID();\n                return {\n                    rowIndex: previousRowPosition.rowIndex,\n                    columnID: leftColumnID,\n                    pinPosition: previousRowPosition.pinPosition,\n                    parentKeys : previousRowPosition.parentKeys\n                } as CellPositionType;\n            }\n        }  \n\n        return leftColumnID ? {\n            ...previousCellPosition,\n            columnID: leftColumnID\n        } : null;\n    }\n\n    private getCellToRight(previousCellPosition: CellPositionType | null, wrapNavigationToNextRow : boolean = false): CellPositionType | null {\n        if (!previousCellPosition) { return null; }\n\n        let rightColumnID = this.fieldHandler.getNextID(previousCellPosition.columnID);\n        if (!rightColumnID && wrapNavigationToNextRow)  { \n            const previousRowPosition = this.getRowBelow(previousCellPosition);\n            if (previousRowPosition) {\n                rightColumnID = this.fieldHandler.getFirstColumnID();\n                return {\n                    rowIndex: previousRowPosition.rowIndex,\n                    columnID: rightColumnID,\n                    pinPosition: previousRowPosition.pinPosition,\n                    parentKeys : previousRowPosition.parentKeys\n                } as CellPositionType;\n            }\n        }  \n\n        return rightColumnID ? {\n            ...previousCellPosition,\n            columnID: rightColumnID\n        } : null;\n    }\n\n    private getCellAbove(lastCellPosition: CellPositionType | null): CellPositionType | null {\n        if (!lastCellPosition) { return null; }\n\n        const rowAbove = this.getRowAbove(lastCellPosition);\n        return rowAbove ? { ...lastCellPosition, ...rowAbove } : null;\n    }\n\n    private getCellBelow(lastCellPosition: CellPositionType | null): CellPositionType | null {\n        if (!lastCellPosition) { return null; }\n\n        const rowBelow = this.getRowBelow(lastCellPosition);\n        return rowBelow ? { ...lastCellPosition,...rowBelow } : null;\n    }\n    \n    public isFirstRow(rowPosition: RowPositionType): boolean {\n        const firstRow = this.recordHandler.getFirstIndexMeta() as RowPositionType;\n        return firstRow !== null && rowPosition.rowIndex === firstRow.rowIndex && areArraysEqual(firstRow.parentKeys ,rowPosition.parentKeys);\n    }\n\n    public isLastRow(rowPosition: RowPositionType): boolean {\n        const lastRow = this.recordHandler.getFirstIndexMeta() as RowPositionType;\n        return lastRow !== null && rowPosition.rowIndex === lastRow.rowIndex && areArraysEqual(lastRow.parentKeys ,rowPosition.parentKeys);\n    }\n}","import { AutoWired, Bean, EventEmitter, Optional } from \"@dg/corecomponent\";\nimport { IFocusHandler } from \"../Grid/Core/Navigation/focus-handler.types\";\nimport { CellController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { INavigationHandler } from \"../Grid/Core/Navigation/navigation-handler.types\";\nimport { INavigationActions } from \"../Grid/Core/Navigation/navigation-actions.types\";\nimport { IRangeSelectionHandler } from \"../rangeselection/range-selection-handler.types\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IControllerHandler } from \"../Grid/Core/Interface/IControllerHandler\";\nimport { CellPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\n\n@Bean('cellNavigation')\nexport class CellNavigation extends EventEmitter implements INavigationActions<CellController> {\n    @AutoWired('navigationService') navigationService: INavigationHandler;\n    @AutoWired('focusHandler') focusHandler: IFocusHandler;\n    @Optional('rangeSelectionHandler') rangeSelectionHandler : IRangeSelectionHandler;\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) controllerHandler : IControllerHandler;\n\n    navigateToCellLeft(cellController : CellController,  event : KeyboardEvent | null = null) : void {\n        if(cellController) {\n            const cellPosition = cellController.getCellPosition();\n            this.navigationService.navigateToCellLeft(cellPosition, event);\n        } \n    }\n\n    navigateToCellRight(cellController : CellController,  event : KeyboardEvent | null = null) : void {\n        if(cellController) {\n            const cellPosition = cellController.getCellPosition();\n            this.navigationService.navigateToCellRight(cellPosition, event);\n        } \n    }\n\n    navigateToCellUp(cellController : CellController,  event : KeyboardEvent | null = null) : void {\n        if(cellController) {\n            const cellPosition = cellController.getCellPosition();\n            this.navigationService.navigateToCellUp(cellPosition,event);\n        } \n    }\n\n    navigateToCellDown(cellController : CellController,  event : KeyboardEvent | null = null) : void {\n        if(cellController) {\n            const cellPosition = cellController.getCellPosition();\n            this.navigationService.navigateToCellDown(cellPosition,event);\n        } \n    }\n\n    navigateToFirstCellInRow(cellController : CellController,  event : KeyboardEvent | null = null) : void {\n        if(cellController) {\n            const cellPosition = cellController.getCellPosition();\n            this.navigationService.navigateToFirstCellInRow(cellPosition,event);\n        } \n    }\n\n    navigateToLastCellInRow(cellController : CellController,  event : KeyboardEvent | null = null) : void {\n        if(cellController) {\n            const cellPosition = cellController.getCellPosition();\n            this.navigationService.navigateToLastCellInRow(cellPosition,event);\n        } \n    }\n\n    navigateToFirstCellInColumn(cellController : CellController,  event : KeyboardEvent | null = null) : void {\n        if(cellController) {\n            const cellPosition = cellController.getCellPosition();\n            this.navigationService.navigateToFirstCellInColumn(cellPosition,event);\n        } \n    }\n\n    navigateToLastCellInColumn(cellController : CellController,  event : KeyboardEvent | null = null) : void {\n        if(cellController) {\n            const cellPosition = cellController.getCellPosition();\n            this.navigationService.navigateToLastCellInColumn(cellPosition,event);\n        } \n    }\n\n    navigatePreviousCellToFocus(cellController : CellController, event : KeyboardEvent) : void {\n        if(cellController) {\n            this.navigationService.navigatePreviousCellToFocus(cellController, event);\n        }\n    }\n\n    navigateNextCellToFocus(cellController : CellController, event : KeyboardEvent) : void {\n        if(cellController) {\n            this.navigationService.navigateNextCellToFocus(cellController, event);\n        }\n    }\n\n    extendCellToLeft() : void {\n        if(this.rangeSelectionHandler) {\n            let endCell = this.rangeSelectionHandler.extendCellToLeft();\n            if(endCell) {\n                this.ensureCellVisible(endCell);\n            }\n        }\n    }\n\n    extendCellToRight() : void {\n        if(this.rangeSelectionHandler) {\n            let endCell = this.rangeSelectionHandler.extendCellToRight();\n            if(endCell) {\n                this.ensureCellVisible(endCell);\n            }\n        }\n    }\n\n    extendCellToTop() : void {\n        if(this.rangeSelectionHandler) {\n            const endCell = this.rangeSelectionHandler.extendCellToTop();\n            if(endCell) {\n                this.ensureCellVisible(endCell);\n            }\n        }\n    }\n\n    extendCellToBottom() : void {\n        if(this.rangeSelectionHandler) {\n            const endCell = this.rangeSelectionHandler.extendCellToBottom();\n            if(endCell) {\n                this.ensureCellVisible(endCell);\n            }\n        }\n    }\n\n    extendToLastCellInRow() : void {\n        if(this.rangeSelectionHandler) {\n            const endCell = this.rangeSelectionHandler.extendToLastCellInRow();\n            if(endCell) {\n                this.ensureCellVisible(endCell);\n            }\n        }\n    }\n\n    extendToLastCellInColumn() : void { \n        if(this.rangeSelectionHandler) {\n            const endCell = this.rangeSelectionHandler.extendToLastCellInColumn();\n            if(endCell) {\n                this.ensureCellVisible(endCell);\n            }\n        }\n    }\n\n    extendToFirstCellInColumn() : void {\n        if(this.rangeSelectionHandler) {\n            const endCell = this.rangeSelectionHandler.extendToFirstCellInColumn();\n            if(endCell) {\n                this.ensureCellVisible(endCell);\n            }\n        }\n    }\n\n    extendToFirstCellInRow() : void {\n        if(this.rangeSelectionHandler) {\n            const endCell = this.rangeSelectionHandler.extendToFirstCellInRow();\n            if(endCell) {\n                this.ensureCellVisible(endCell);\n            }\n        }\n    }\n\n    navigateToFirstRowFirstColumn(controller: CellController, event: KeyboardEvent | null): void {\n        if(controller) {\n            const cellPosition = controller.getCellPosition();\n            this.navigationService.navigateToFirstRowFirstColumn(cellPosition,event);\n        } \n    }\n\n    navigateToLastRowLastColumn(controller: CellController, event: KeyboardEvent | null): void {\n        if(controller) {\n            const cellPosition = controller.getCellPosition();\n            this.navigationService.navigateToLastRowLastColumn(cellPosition,event);\n        } \n    }\n\n    navigateToTopOfColumnInView(controller: CellController, event : KeyboardEvent | null) : void {\n        if(controller) {\n            const cellPosition = controller.getCellPosition();\n            this.navigationService.navigateToTopOfColumnInView(cellPosition.columnID,event);\n        } \n    }\n\n    navigateToBottomOfColumnInView(controller: CellController, event : KeyboardEvent | null) : void  {\n        if(controller) {\n            const cellPosition = controller.getCellPosition();\n            this.navigationService.navigateToBottomOfColumnInView(cellPosition.columnID,event);\n        } \n    }\n\n    private ensureCellVisible(cellPosition : CellPositionType) : void {\n        const bodyController = this.controllerHandler.getBodyController();\n        const scrollHandler = bodyController.getScrollHandler();\n        cellPosition.pinPosition === \"middle\" && scrollHandler.ensureIndexVisible(cellPosition.rowIndex, cellPosition.parentKeys);\n        scrollHandler.ensureColumnVisible(cellPosition.columnID)\n    }\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, Optional, PostConstruct } from \"@dg/corecomponent\";\nimport { ShortcutParams } from \"../Grid/Core/actions/key-board-shortcut-registry\";\nimport { getControllerFromTargetElement } from \"../Grid/Core/utils/Dom\";\nimport { CellController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { RowController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { INavigationActions } from \"../Grid/Core/Navigation/navigation-actions.types\";\nimport { IActionRegistry } from \"../Grid/Core/actions/action-registry.types\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { ClipBoardHandler } from \"../clipboard/clipboard-handler\";\nimport { CellRangeType, IRangeSelectionHandler } from \"../rangeselection/range-selection-handler.types\";\nimport { IFocusHandler } from \"../Grid/Core/Navigation/focus-handler.types\";\nimport { IColumnSelection } from \"../Selection/column-selection.types\";\nimport { IRowSelectionHandler } from \"../Selection/row-selection-handler.types\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { rowPinPositions } from \"../Grid/Core/Constants/GridConfigurationConstants\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { IGridCellEditorHandler } from \"../Grid/GridComponent/Editor/GridCellEditorHandler\";\nimport { ICellAPIManager, IColumnAPIManager } from \"../Grid/Main\";\nimport { IRange } from \"../Grid/API/CommonAPIInterface\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { IEscapeHandler } from \"../../Sub_Components/src/Utilities/EscapeHandler.types\";\n\nexport interface IController {\n    cellController : CellController\n    rowController : RowController\n}\n@Bean('GridKeyBoardNavigation')\nexport class GridKeyBoardNavigation extends EventEmitter {\n    // @AutoWired('keyBoardShortCutRegistry') private keyBoardShortCutRegistry : KeyboardShortcutRegistry;\n    @AutoWired('actionRegistry') private actionRegistry                               : IActionRegistry<any>\n    @Optional ('rowNavigation') rowNavigation                                         : INavigationActions<RowController>;\n    @Optional ('cellNavigation') cellNavigation                                       : INavigationActions<CellController>;\n    @Optional ('clipBoardHandler') private clipBoardHandler                           : ClipBoardHandler;\n    @Optional ('rangeSelectionHandler') private rangeSelectionHandler                 : IRangeSelectionHandler;\n    @Optional ('focusHandler') private focusHandler                                   : IFocusHandler;\n    @Optional ('columnSelection') private columnSelection                             : IColumnSelection;\n    @Optional ('RowSelectionHandler') private rowSelection                            : IRowSelectionHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler                   : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER) private gridCellEditorHandler : IGridCellEditorHandler;\n    @AutoWired(GRID_BEAN_NAME.GRID_ESCAPE_HANDLER) private gridEscapeHandler           : IEscapeHandler;\n\n\n\n\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler : GridOptioHandler;\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstance : getBeanInstanceByBeanName;\n    @PostConstruct()\n    init() {\n    //    this.registerShortcut();\n       this.registerAction();\n    }\n\n    // private registerShortcut() : void {\n    //     this.keyBoardShortCutRegistry.registerShortcut(`arrowup`, 'navigateToCellUp');\n    //     this.keyBoardShortCutRegistry.registerShortcut(`arrowdown`, 'navigateToCellDown');\n    //     this.keyBoardShortCutRegistry.registerShortcut(`arrowleft`, 'navigateToCellLeft');\n    //     this.keyBoardShortCutRegistry.registerShortcut(`arrowRight`, 'navigateToCellRight');\n    //     this.keyBoardShortCutRegistry.registerShortcut('meta+arrowup', 'navigateToFirstCellInColumn');\n    //     this.keyBoardShortCutRegistry.registerShortcut('meta+arrowdown', 'navigateToLastCellInColumn');\n    //     this.keyBoardShortCutRegistry.registerShortcut('meta+arrowleft', 'navigateToFirstCellInRow');\n    //     this.keyBoardShortCutRegistry.registerShortcut('meta+arrowright', 'navigateToLastCellInRow');\n    //     this.keyBoardShortCutRegistry.registerShortcut('tab', 'navigateNextToFocus')\n    //     this.keyBoardShortCutRegistry.registerShortcut('shift+tab', 'navigatePreviousToFocus');\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"meta+shift+arrowright\", 'extendToLastCellInRow');\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"meta+shift+arrowleft\", 'extendToFirstCellInRow');\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"meta+shift+arrowup\", 'extendToFirstCellInColumn');\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"meta+shift+arrowdown\", 'extendToLastCellInColumn');\n    //     this.keyBoardShortCutRegistry.registerShortcut('shift+arrowright', 'extendCellToRight');\n    //     this.keyBoardShortCutRegistry.registerShortcut('shift+arrowleft','extendCellToLeft');\n    //     this.keyBoardShortCutRegistry.registerShortcut('shift+arrowup','extendCellToTop');\n    //     this.keyBoardShortCutRegistry.registerShortcut('shift+arrowdown','extendCellToBottom');\n    //     this.keyBoardShortCutRegistry.registerShortcut('enter', 'openEditorAndNavigate');\n    //     this.keyBoardShortCutRegistry.registerShortcut('shift+enter', 'openEditorAndNavigate');\n    //     this.keyBoardShortCutRegistry.registerShortcut('backspace', 'dataEditOrClear');\n    //     this.keyBoardShortCutRegistry.registerShortcut('meta+c','gridCopy');\n    //     this.keyBoardShortCutRegistry.registerShortcut('meta+x','gridCut');\n    //     this.keyBoardShortCutRegistry.registerShortcut('meta+v','gridPaste');\n    //     this.keyBoardShortCutRegistry.registerShortcut('meta+a', 'gridSelectAll');\n    //     this.keyBoardShortCutRegistry.registerShortcut('CONTROL+ ','selectColumnAsRange');\n    //     this.keyBoardShortCutRegistry.registerShortcut('shift+ ', 'selectRowAsRange');\n    //     this.keyBoardShortCutRegistry.registerShortcut('META+END', 'navigateToLastRowLastColumn');\n    //     this.keyBoardShortCutRegistry.registerShortcut('META+HOME', 'navigateToFirstRowFirstColumn');\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"PAGEUP\", 'navigateToTopOfColumnInView')\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"PAGEDOWN\", 'navigateToBottomOfColumnInView')\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"HOME\", 'navigateToFirstCellInRow');\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"END\", 'navigateToLastCellInRow');\n    //     this.keyBoardShortCutRegistry.registerShortcut(\"DELETE\", 'dataClearOnBackspace');\n    //     this.keyBoardShortCutRegistry.registerShortcut('ESCAPE', 'stopEditing');\n    // }\n\n    private registerAction() : void {\n        this.actionRegistry.registerAction('extendToFirstCellInColumn', this.extendToFirstCellInColumn.bind(this));\n        this.actionRegistry.registerAction('extendToLastCellInColumn', this.extendToLastCellInColumn.bind(this));\n        this.actionRegistry.registerAction('extendCellToBottom', this.extendCellToBottom.bind(this));\n        this.actionRegistry.registerAction('extendCellToTop', this.extendCellToTop.bind(this));\n        this.actionRegistry.registerAction('extendToFirstCellInRow', this.extendToFirstCellInRow.bind(this));\n        this.actionRegistry.registerAction('extendToLastCellInRow', this.extendToLastCellInRow.bind(this))\n        this.actionRegistry.registerAction('extendCellToLeft', this.extendCellToLeft.bind(this));\n        this.actionRegistry.registerAction('extendCellToRight', this.extendCellToRight.bind(this));\n        this.actionRegistry.registerAction('navigateToCellLeft', this.navigateToCellLeft.bind(this));\n        this.actionRegistry.registerAction('navigateToCellRight', this.navigateToCellRight.bind(this));\n        this.actionRegistry.registerAction('navigateToCellUp', this.navigateToCellUp.bind(this));\n        this.actionRegistry.registerAction('navigateToCellDown', this.navigateToCellDown.bind(this));\n        this.actionRegistry.registerAction('navigateToFirstCellInRow', this.navigateToFirstCellInRow.bind(this));\n        this.actionRegistry.registerAction('navigateToLastCellInRow', this.navigateToLastCellInRow.bind(this));\n        this.actionRegistry.registerAction('navigateToFirstCellInColumn', this.navigateToFirstCellInColumn.bind(this));\n        this.actionRegistry.registerAction('navigateToLastCellInColumn', this.navigateToLastCellInColumn.bind(this));\n        this.actionRegistry.registerAction('navigateNextToFocus', this.navigateNextToFocus.bind(this));\n        this.actionRegistry.registerAction('navigatePreviousToFocus', this.navigatePreviousToFocus.bind(this));\n        this.actionRegistry.registerAction('openEditorAndNavigate', this.openEditorAndNavigate.bind(this));\n        this.actionRegistry.registerAction('dataEditOrClear', this.dataEditOrClear.bind(this));\n        this.actionRegistry.registerAction('dataClearOnBackspace', this.clearValueOnBackspace.bind(this));\n        this.actionRegistry.registerAction('dataEditOnBackspace', this.cellEditingOnBackspace.bind(this));\n        this.actionRegistry.registerAction('gridCopy', this.gridCopy.bind(this));\n        this.actionRegistry.registerAction('gridCut', this.gridCut.bind(this));\n        this.actionRegistry.registerAction('gridPaste', this.gridPaste.bind(this));\n        this.actionRegistry.registerAction('gridSelectAll', this.selectAll.bind(this));\n        this.actionRegistry.registerAction('selectFocusedCellColumn', this.selectFocusedCellColumn.bind(this));\n        this.actionRegistry.registerAction('selectFocusedCellRow', this.selectFocusedCellRow.bind(this));\n        this.actionRegistry.registerAction('navigateToFirstRowFirstColumn', this.navigateToFirstRowFirstColumn.bind(this));\n        this.actionRegistry.registerAction('navigateToLastRowLastColumn', this.navigateToLastRowLastColumn.bind(this));\n        this.actionRegistry.registerAction('navigateToBottomOfColumnInView', this.navigateToBottomOfColumnInView.bind(this))\n        this.actionRegistry.registerAction('navigateToTopOfColumnInView', this.navigateToTopOfColumnInView.bind(this))\n        this.actionRegistry.registerAction('selectColumnAsRange',this.selectColumnAsRange.bind(this));\n        this.actionRegistry.registerAction('selectRowAsRange',this.selectRowAsRange.bind(this));\n        this.actionRegistry.registerAction('stopEditing', this.stopEditing.bind(this));\n        this.actionRegistry.registerAction('handleGridEscape', this.handleGridEscape.bind(this));\n        this.actionRegistry.registerAction('openGridFind', this.openGridFind.bind(this));\n\n\n    }\n\n    private selectAll({event} : ShortcutParams) : void {\n        if(this.rangeSelectionHandler) {\n            event.preventDefault();\n            event.stopPropagation();\n            this.rangeSelectionHandler.selectAll();\n        }\n    }\n\n    private openGridFind({event}: ShortcutParams): void {\n        event.preventDefault();\n        event.stopPropagation();\n\n        const findHandler = this.getBeanInstance(GRID_BEAN_NAME.GRID_DIV_ELEMENT)\n            ? (this.getBeanInstance('gridFindHandler', true) as any)\n            : null;\n\n        if (findHandler && typeof findHandler.togglePanel === 'function') {\n            findHandler.togglePanel();\n        }\n    }\n\n    private gridCopy({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n\n        if(this.clipBoardHandler) {\n            this.clipBoardHandler.copyToClipboard({event, source : 'clipboard'});\n        }\n\n    }\n\n    private gridCut({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n\n        if(this.clipBoardHandler) {\n            this.clipBoardHandler.copyOrCutToClipboard({event, source : 'clipboard'}, true);\n        }\n\n    }\n\n    private gridPaste({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n\n        if(this.clipBoardHandler) {\n            this.clipBoardHandler.pasteFromClipboard({event, source : 'clipboard'});\n        }\n\n    }\n\n\n    private dataEditOrClear({event} : ShortcutParams): void {\n        const isCellEditingOnBackspace = this.optionHandler.isCellEditingOnBackspace();\n\n        if(isCellEditingOnBackspace) {\n            this.cellEditingOnBackspace({event});\n        }else {\n            this.clearValueOnBackspace({event});\n        }\n    }\n\n    private cellEditingOnBackspace({event} : ShortcutParams): void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n\n        // cellController.startEditing(event.key, event);\n        this.gridCellEditorHandler.startEditing(cellController, event.key, event);\n\n        if(cellController.isEditing()) {\n            event.preventDefault();\n        }\n    }\n\n    private clearValueOnBackspace({event} : ShortcutParams): void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n\n        if(!cellController) {\n            return;\n        }\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n\n        const selectedRows    = this.rowSelection.getSelectedRows();\n        const selectedColumns = this.columnSelection.getSelectedColumns();\n        const selectedRanges  = this.rangeSelectionHandler.getCellRanges();\n\n        const selectedRangeParam : IRange[] = [];\n        selectedRanges.forEach((range : CellRangeType) => {\n            selectedRangeParam.push({\n                columnIds  : range.columnIds,\n                startRow : range.startRow,\n                endRow   : range.endRow\n            });\n        })\n\n        const cellAPI : ICellAPIManager      = this.getBeanInstance(GRID_BEAN_NAME.CELL_API);\n        const columnAPI  : IColumnAPIManager = this.getBeanInstance(GRID_BEAN_NAME.COLUMN_API);\n\n        this.rangeSelectionHandler.hasMultipleCells() && selectedRangeParam.length!=0 && cellAPI.clearDataInRanges(selectedRangeParam, {}, { action : 'clear', eventOrigin : 'ui', event });\n        selectedRows.length!=0 && this.rowSelection.clearRowsCellValues('ui', event);\n        selectedColumns.length!=0 && columnAPI.clearColumnsById(selectedColumns, {}, {action : 'clear', eventOrigin : 'ui', event});\n        !this.rangeSelectionHandler.hasMultipleCells() && !(selectedRows.length != 0 || selectedColumns.length != 0) && cellAPI.clearDataInRanges(selectedRangeParam,  {}, { action : 'clear', eventOrigin : 'ui', event });\n    }\n\n    private openEditorAndNavigate({event} : ShortcutParams): void {\n        if(event.key == 'Enter'){\n            const {cellController} = this.getControllersFromTargetElement(event.target);\n            if(!cellController) {\n                return\n            }\n            if(cellController.isEditing()) {\n                // cellController.stopEditing(false, event, event.shiftKey);\n                this.gridCellEditorHandler.stopEditing(false, event, event.shiftKey);\n            }else {\n                if(cellController) {\n                    const columnNode = cellController.getColumn();\n\n                    if(columnNode.getPinnedPosition() === \"rowHeader\") return;\n                    const isEnterNavigatesVertically = columnNode.isEnterNavigatesVertically();\n                    if(isEnterNavigatesVertically) {\n                        if(event.shiftKey) {\n                            this.cellNavigation.navigateToCellUp(cellController, event);\n                        }else {\n                            this.cellNavigation.navigateToCellDown(cellController, event);\n                        }\n                    }else {\n                        // cellController.startEditing(event.key, event);\n                        if(this.rangeSelectionHandler.isCellExistAnyRange(cellController.getCellPosition())) {\n                            this.rangeSelectionHandler.removeRangeSelection();\n                            this.rangeSelectionHandler.setRange(cellController.getCellPosition(), false);\n                        }\n                        this.gridCellEditorHandler.startEditing(cellController, event.key, event);\n        \n                        if(cellController.isEditing()) {\n                            event.preventDefault();\n                        }\n                    }\n                }\n                \n                \n            }\n        }\n    }\n\n    private extendToFirstCellInColumn() : void {\n        this.cellNavigation.extendToFirstCellInColumn();\n    }\n\n    private extendToLastCellInColumn() : void {\n        this.cellNavigation.extendToLastCellInColumn();\n    }\n    private extendCellToBottom() : void {\n        this.cellNavigation.extendCellToBottom();\n    }\n    private extendCellToTop() : void {\n        this.cellNavigation.extendCellToTop();\n    }\n\n    private extendToFirstCellInRow({event} : ShortcutParams) : void {\n        event.preventDefault();\n        this.cellNavigation.extendToFirstCellInRow();\n    }\n\n    private extendToLastCellInRow({event} : ShortcutParams) : void {\n        event.preventDefault();\n        this.cellNavigation.extendToLastCellInRow();\n    }\n\n    private extendCellToLeft() : void {\n        this.cellNavigation.extendCellToLeft();\n    }\n    private extendCellToRight() : void {\n        this.cellNavigation.extendCellToRight();\n    }\n\n    private navigateToCellLeft({event} : ShortcutParams) : void {\n        const {cellController, rowController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToCellLeft(cellController, event);\n        }\n\n        if(this.rowNavigation) {\n            this.rowNavigation.navigateToCellLeft(rowController, event);\n        }\n        event.preventDefault();\n\n    }\n\n    private navigateToCellRight({event} : ShortcutParams) : void {\n        const {cellController, rowController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToCellRight(cellController, event);\n        }\n        if(this.rowNavigation) {\n            this.rowNavigation.navigateToCellRight(rowController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateToCellUp({event} : ShortcutParams) : void {\n        const {cellController, rowController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToCellUp(cellController, event);\n        }\n\n        if(this.rowNavigation) {\n            this.rowNavigation.navigateToCellUp(rowController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateToCellDown({event} : ShortcutParams) : void {\n        const {cellController, rowController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToCellDown(cellController, event);\n        }\n\n        if(this.rowNavigation) {\n            this.rowNavigation.navigateToCellDown(rowController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateToFirstCellInRow({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToFirstCellInRow(cellController, event);\n        }\n        event.preventDefault();\n\n    }\n\n    private navigateToLastCellInRow({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToLastCellInRow(cellController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateToFirstCellInColumn({event} : ShortcutParams) : void {\n        const {cellController, rowController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToFirstCellInColumn(cellController, event);\n        }\n\n        if(this.rowNavigation) {\n            this.rowNavigation.navigateToFirstCellInColumn(rowController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateToLastCellInColumn({event} : ShortcutParams) : void {\n        const {cellController, rowController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToLastCellInColumn(cellController, event);\n        }\n\n        if(this.rowNavigation) {\n            this.rowNavigation.navigateToLastCellInColumn(rowController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateNextToFocus({event} : ShortcutParams) : void {\n        const {cellController, rowController} = this.getControllersFromTargetElement(event.target);\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateNextCellToFocus(cellController, event);\n        }\n\n        if(this.rowNavigation) {\n            this.rowNavigation.navigateNextCellToFocus(rowController, event);\n        }\n    }\n\n    private navigatePreviousToFocus({event} : ShortcutParams) : void {\n        const {cellController, rowController} = this.getControllersFromTargetElement(event.target);\n        if(this.cellNavigation) {\n            this.cellNavigation.navigatePreviousCellToFocus(cellController, event);\n        }\n\n        if(this.rowNavigation) {\n            this.rowNavigation.navigatePreviousCellToFocus(rowController, event);\n        }\n    }\n\n    private stopEditing({event} : ShortcutParams) : void {\n        // const {cellController} = this.getControllersFromTargetElement(event.target);\n        // if(cellController) {\n        //     cellController.stopEditing(true, event, event.shiftKey, true); // need to retain the edit value as configuration\n        // }\n        this.gridCellEditorHandler.stopEditing(true, event, event.shiftKey, true);\n    }\n\n    private handleGridEscape() : void {\n        this.gridEscapeHandler.executeAction();\n    }\n    \n    private getControllersFromTargetElement(targetElement : EventTarget | null ) : IController {\n        return {\n            cellController : getControllerFromTargetElement<CellController>(this.optionsHandler,targetElement, CellController.DOM_KEY_CELL_CTRL),\n            rowController : getControllerFromTargetElement<RowController>(this.optionsHandler,targetElement, RowController.DOM_DATA_KEY_ROW_CTRL)\n        }\n    }\n\n    private selectFocusedCellColumn(toggle : boolean) : void {\n        if(this.focusHandler) {\n            const focusedCell = this.focusHandler.getFocusedCellPosition();\n            if(focusedCell) {\n                this.columnSelection.setColumnSelected({\n                    ids : [focusedCell.columnID],\n                    newValue : toggle ? !this.columnSelection.isColumnSelected(focusedCell.columnID) : true,\n                    source : 'ui'\n                })\n            }\n        }\n    }   \n\n    private selectFocusedCellRow(toggle : boolean) : void {\n        if(this.focusHandler) {\n            const focusedCell = this.focusHandler.getFocusedCellPosition();\n            if(focusedCell) {\n                const rowNode = this.getRowNode(focusedCell.rowIndex, focusedCell.pinPosition);\n                const rowId = rowNode.getId();\n                const rowMeta = rowNode.getRowMeta();\n                const rowType = {\n                    rowID  : rowId,\n                    ...{rowMeta}\n                }\n                this.rowSelection.setRowSelected({\n                    values     : [rowType],\n                    selected: toggle ? !this.rowSelection.isRowSelected(rowType): true,\n                    source  : 'ui'\n                })\n            }\n        }\n    }   \n\n    private navigateToFirstRowFirstColumn({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToFirstRowFirstColumn(cellController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateToLastRowLastColumn({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToLastRowLastColumn(cellController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateToTopOfColumnInView({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToTopOfColumnInView(cellController, event);\n        }\n        event.preventDefault();\n    }\n\n    private navigateToBottomOfColumnInView({event} : ShortcutParams) : void {\n        const {cellController} = this.getControllersFromTargetElement(event.target);\n        if(cellController && cellController.isEditing()) {\n            return;\n        }\n        if(this.cellNavigation) {\n            this.cellNavigation.navigateToBottomOfColumnInView(cellController, event);\n        }\n        event.preventDefault();\n    }\n\n    private selectColumnAsRange() : void {\n        if(this.focusHandler) {\n            const focusedCell = this.focusHandler.getFocusedCellPosition();\n            if(focusedCell) {\n                this.rangeSelectionHandler.selectColumnAsRange(focusedCell.columnID,focusedCell.columnID);\n            }\n        }\n    }\n\n    private selectRowAsRange() : void {\n        if(this.focusHandler) {\n            const focusedCell = this.focusHandler.getFocusedCellPosition();\n            if(focusedCell) {\n                this.rangeSelectionHandler.selectRowAsRange(focusedCell,focusedCell);\n            }\n        }\n    }\n\n    private getRowNode(rowIndex : number, pinPosition : rowPinPositions) : IRowNodeCore {\n        switch(pinPosition) {\n            case 'top':{\n                const topHandler = this.recordHandler.getTopHandler();\n                return topHandler.getRowNode(rowIndex);\n            }\n            case 'bottom':{\n                const bottomHandler = this.recordHandler.getBottomHandler();\n                return bottomHandler.getRowNode(rowIndex);\n            }\n            default: {\n                const middleHandler = this.recordHandler.getMiddleHandler();\n                return middleHandler.getRowNode(rowIndex);\n            }\n        }\n    }\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, Optional, PostConstruct } from \"@dg/corecomponent\";\nimport { IFocusHandler } from \"../Grid/Core/Navigation/focus-handler.types\";\nimport { ICellNavigationHandler } from \"../Grid/Core/Navigation/cell-navigation-handler.types\";\nimport { CellPositionType, RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { KeyBoardEventKeys } from \"../Grid/Core/Navigation/KeyBoardEventKeys\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IControllerHandler } from \"../Grid/Core/Interface/IControllerHandler\";\nimport { INavigationHandler, NavigateParams } from \"../Grid/Core/Navigation/navigation-handler.types\";\nimport { CellController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { RowController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { IRangeSelectionHandler } from \"../rangeselection/range-selection-handler.types\";\nimport { IHookManager } from \"../Grid/Core/Hooks/Interface/IHookManager\";\nimport { RowRenderController } from \"../Grid/Core/Rows/RowRenderController\";\nimport { IColumnSelection } from \"../Selection/column-selection.types\";\nimport { IRowSelectionHandler } from \"../Selection/row-selection-handler.types\";\nimport { IRecordHandler, IRowInsertMeta } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { areArraysEqual } from \"../Grid/Core/utils/Object\";\nimport { Events, ROW_REORDER_EVENT } from \"../Grid/Core/Constants/Events\";\nimport { IGridCellEditorHandler } from \"../Grid/GridComponent/Editor/GridCellEditorHandler\";\nimport { AutoUnpinnedLeftColumns } from \"../Grid/Core/Columns/AutoUnpinnedLeftColumns\";\nimport { FloatingRecordHandler } from \"../Grid/FloatingRecords/FloatingRecordHandler\";\nimport { GroupRowNode } from \"../DataStore/GroupRowNode\";\n\n@Bean('navigationService')\nexport class NavigationService extends EventEmitter implements INavigationHandler {\n    @AutoWired('focusHandler') focusHandler : IFocusHandler;\n    @AutoWired('CellNavigationHandler') cellNavigationHandler : ICellNavigationHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: GridOptioHandler;\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) controllerHanlder : IControllerHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) fieldHandler : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler : IRecordHandler;\n\n    @Optional('rangeSelectionHandler') rangeSelectionHandler : IRangeSelectionHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRendererController : RowRenderController;\n\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) hookManager : IHookManager;\n\n    @Optional('columnSelection') columnSelection : IColumnSelection;\n    @Optional('RowSelectionHandler') rowSelection: IRowSelectionHandler;\n\n    @Optional(GRID_BEAN_NAME.GRID_CELL_EDITOR_HANDLER)  editorHandler : IGridCellEditorHandler;\n    @Optional(GRID_BEAN_NAME.AUTO_UNPINNED_LEFT_COLUMNS) private autoUnpinnedLeftColumns : AutoUnpinnedLeftColumns;\n    @AutoWired(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) private floatingRecordHandler : FloatingRecordHandler;\n\n\n    private insertStartedWithEmptyMiddlePane = false;\n\n    @PostConstruct()\n    init() : void {\n        this.addListener(this.eventHandler, 'columnSelectionChanged', () => {\n            const isCellFocusonSelection = this.optionsHandler.isCellFocusonSelection();\n            if(isCellFocusonSelection) {\n                const selectedColumns = this.columnSelection.getSelectedColumns();\n                const column = selectedColumns[selectedColumns.length - 1];\n                if(selectedColumns.length > 0) {\n                    const cellFocusScrollOnColumnSelection = this.optionsHandler.isCellFocusScrollOnColumnSelection();\n                    this.navigateToTopOfColumnInView(column, null, false, cellFocusScrollOnColumnSelection);\n                } \n            }\n           \n        })\n\n        this.addListener(this.eventHandler, 'rowSelectionChanged', (params : any) => {\n            const isCellFocusonSelection = this.optionsHandler.isCellFocusonSelection();\n            if(isCellFocusonSelection && params.lastSelection) {\n                let  row = this.rowSelection.getLastSelectedRow();\n                if(row) {\n                    const rowNode = this.recordHandler.getRowNodeByMeta(row);\n                    const rowId = rowNode.getId();\n                    const isFloatingRecord = this.floatingRecordHandler.isFloatingRecord(rowId);\n                    if(isFloatingRecord) {\n                        const floatingRowNode = this.floatingRecordHandler.getFloatingRowNode();    \n                        row = floatingRowNode.getRowMeta() as any;\n                    }\n                    this.navigateToFirstCellInRow(row, null, false, false);\n                } \n            }\n           \n        })\n\n        this.addListener(this.eventHandler, 'EVENT_BEFORE_COLUMN_DELETE', (params : any) => {\n            const focusedCellPosition = this.focusHandler.getFocusedCellPosition();\n            if(focusedCellPosition) {\n                const isColumnFocused = focusedCellPosition.columnID === params.id;\n                if(!isColumnFocused) {\n                    return;\n                }\n                const lastColumn = this.fieldHandler.getLastColumnID();\n\n                const controller = this.getCellController(focusedCellPosition);\n                lastColumn === params.id ? this.navigatePreviousCellToFocus(controller, null) :this.navigateToCell(controller, null);\n            }\n        });\n\n        this.addListener(this.eventHandler, Events.EVENT_COLUMN_HIDE, () => {\n            const focusedCellPosition = this.focusHandler.getFocusedCellPosition();\n            const allColumnsHide = this.autoUnpinnedLeftColumns ? this.autoUnpinnedLeftColumns.isAllColumnsHidden() : this.fieldHandler.isCenterColumnHidden();\n            if(focusedCellPosition) {\n                if(allColumnsHide) {\n                    const firstColumn = this.fieldHandler.getFirstColumnID()\n                    this.navigateTo({\n                        focusColumnID : firstColumn,\n                        focusIndex : focusedCellPosition.rowIndex,\n                        pinPosition : focusedCellPosition.pinPosition,\n                        parentKeys : focusedCellPosition.parentKeys,\n                        scrollColumnID : firstColumn,\n                        scrollIndex : focusedCellPosition.rowIndex,\n                    }, null);\n                    return;\n                }\n            }\n        });\n\n        this.addListener(this.eventHandler, 'EVENT_COLUMN_HIDE', (params : any) => {\n            const focusedCellPosition = this.focusHandler.getFocusedCellPosition();\n            if(focusedCellPosition) {\n                const isColumnFocused = focusedCellPosition.columnID === params.id;\n                if(!isColumnFocused) {\n                    return;\n                }\n                const controller = this.getCellController(focusedCellPosition);\n                controller && this.navigateToCell(controller, null);\n            }\n        });\n\n        this.addListener(this.eventHandler, 'EVENT_BEFORE_RECORD_INSERTED', () => {\n            this.insertStartedWithEmptyMiddlePane = this.recordHandler.getMiddleHandler().getRowCount() === 0;\n        });\n\n        this.addListener(this.eventHandler, 'EVENT_RECORD_INSERTED', (params : { rowInsertMetas ?: IRowInsertMeta[] }) => {\n            const focusedCellPosition = this.focusHandler.getFocusedCellPosition();\n            if(focusedCellPosition) {\n                this.insertStartedWithEmptyMiddlePane = false;\n                return;\n            }\n            const groupParentKeys = this.getMiddleGroupParentKeysFromInsertMetas(params?.rowInsertMetas);\n            const focusAfterEmptyMiddleInsert = this.insertStartedWithEmptyMiddlePane;\n            this.insertStartedWithEmptyMiddlePane = false;\n\n            if (!groupParentKeys?.length && !focusAfterEmptyMiddleInsert) {\n                return;\n            }\n            if (this.recordHandler.getMiddleHandler().getRowCount() === 0) {\n                return;\n            }\n            requestAnimationFrame(() => {\n                requestAnimationFrame(() => {\n                    if (this.recordHandler.getMiddleHandler().getRowCount() === 0) {\n                        return;\n                    }\n                    if (groupParentKeys?.length) {\n                        const groupFirstRow : RowPositionType = {\n                            rowIndex   : 0,\n                            pinPosition: 'middle',\n                            parentKeys : groupParentKeys,\n                        };\n                        if (this.recordHandler.isValidRowMeta(groupFirstRow)) {\n                            this.focusFirstFocusableCellFromRowStart(groupFirstRow);\n                        }\n                        return;\n                    }\n                    if (focusAfterEmptyMiddleInsert) {\n                        this.focusFirstMiddleCellAfterEmptyToNonEmptyInsert();\n                    }\n                });\n            });\n        });\n\n        this.addListener(this.eventHandler, 'EVENT_RECORD_REMOVED', (params) => {\n            const rowDeleteMetas = params.rowMetas;\n            const focusedCellPosition = this.focusHandler.getFocusedCellPosition();\n            \n            if(focusedCellPosition) {\n                const isFocusedRowDeleted = rowDeleteMetas.some(\n                    (meta) => meta.rowIndex === focusedCellPosition.rowIndex && meta.pinPosition === focusedCellPosition.pinPosition && areArraysEqual(meta.parentKeys, focusedCellPosition.parentKeys)\n                );\n                const isRowPresent = this.recordHandler.isValidRowMeta(focusedCellPosition);\n                if(isRowPresent) {\n                    isFocusedRowDeleted && this.focusPosition(focusedCellPosition, null);\n                    return;\n                }\n                const lastRowIndex = this.recordHandler.getGroupLastRow({\n                    rowIndex : 0,\n                    pinPosition : focusedCellPosition.pinPosition,\n                    parentKeys : focusedCellPosition.parentKeys\n                }, false);\n\n                if(lastRowIndex === null || lastRowIndex.rowIndex < 0) {\n                    const middleHandler = this.recordHandler.getMiddleHandler();\n                    const firstRowWithDraft = middleHandler.getFirstRowMeta(true);\n                    const lastRowWithDraft = middleHandler.getLastRowMeta(true);\n                    const isDraftRow = (rowMeta : { pinPosition ?: string } | null | undefined) => {\n                        return rowMeta?.pinPosition === \"topDraftRow\" || rowMeta?.pinPosition === \"bottomDraftRow\";\n                    };\n                    const draftRowToFocus = isDraftRow(firstRowWithDraft) ? firstRowWithDraft : isDraftRow(lastRowWithDraft) ? lastRowWithDraft : null;\n\n                    if(draftRowToFocus) {\n                        const draftCell = {\n                            ...focusedCellPosition,\n                            ...draftRowToFocus\n                        };\n                        this.ensureCellVisible(draftCell);\n                        this.focusPosition(draftCell, null);\n                        return;\n                    }\n\n                    this.focusPosition({\n                        rowIndex : null,\n                        pinPosition : null,\n                        columnID : null,\n                        parentKeys : []\n                    }, null);\n                    return;\n                }\n                \n                const nextCell = {\n                    ...focusedCellPosition,\n                    ...lastRowIndex,\n                }\n                if(nextCell) {\n                    this.ensureCellVisible(nextCell);\n                    this.focusPosition(nextCell, null);\n                }\n            }\n        })\n\n        this.addListener(this.eventHandler, ROW_REORDER_EVENT.EVENT_ROW_REORDERED, () => {\n            // const cellEditorPosition = this.editorHandler.getCellPosition();\n\n            // if(!cellEditorPosition) {\n                // discussed with karthee bro - hot fix\n                // this.focusPosition({\n                //     rowIndex   : null,\n                //     pinPosition: null,\n                //     columnID   : null,\n                //     parentKeys : []\n                // }, null);\n            // }\n        });\n\n        this.addListener(this.eventHandler, \"RECORD_DELETE\", () => {\n            if(this.focusHandler.getFocusedCellPosition()) {\n                const focusCellPosition = this.focusHandler.getFocusedCellPosition();\n                const parentLength      = focusCellPosition.parentKeys.length;\n                const rootRowNode       = this.recordHandler.getMiddleHandler().getRootNode();\n                const parentId          = focusCellPosition.parentKeys[parentLength - 1];\n                const parentNode        = parentLength > 0 ? this.recordHandler.getRowNodeById(parentId) as GroupRowNode : rootRowNode;\n                const checkValidRow     = () => {\n                    return focusCellPosition.rowIndex < parentNode.getDirectChildrenCount(false);\n                }\n                const isValid           = focusCellPosition.pinPosition === 'middle' ? checkValidRow(): this.recordHandler.isValidRowMeta(focusCellPosition);\n                let   nextCellPosition  = focusCellPosition;\n                if(!isValid) {\n                    const {rowIndex = 0, pinPosition = 'middle', parentKeys = []} = this.recordHandler.getGroupLastRow({...focusCellPosition, rowIndex : 0}, true);\n                    nextCellPosition = {\n                        rowIndex    : rowIndex,\n                        pinPosition : pinPosition,\n                        parentKeys  : parentKeys,\n                        columnID    : focusCellPosition.columnID,\n                    }\n                }\n                const focusCell         = this.focusHandler.isFocusedCellEditing() ? false : this.focusHandler.isGridFocus();\n                this.ensureCellVisible(nextCellPosition);\n                this.focusHandler.setFocusedCell(nextCellPosition, false, focusCell);\n            }\n        })\n\n        this.addListener(this.eventHandler, \"RECORD_INSERT\", () => {\n            if(this.focusHandler.getFocusedCellPosition()) {\n                const focusCellPosition = this.focusHandler.getFocusedCellPosition();\n                const focusCell = this.focusHandler.isFocusedCellEditing() ? false : this.focusHandler.isGridFocus();\n                this.ensureCellVisible(focusCellPosition);\n                this.focusHandler.setFocusedCell(focusCellPosition, false, focusCell);\n            }\n        })\n\n    }\n\n    public navigateToCellUp(currentCellPosition : CellPositionType, event : KeyboardEvent | null = null) : void {\n        const wrapNavigationToNextRow = this.optionsHandler.isWrapNavigationToNextRow();\n        let nextCell : CellPositionType = this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_UP, currentCellPosition, wrapNavigationToNextRow);\n\n        if(nextCell) {\n            this.ensureCellVisible(nextCell);\n            this.focusPosition(nextCell, event);\n        }\n    }\n\n    public navigateToCellDown(currentCellPosition : CellPositionType,  event : KeyboardEvent | null = null) : void {\n        const wrapNavigationToNextRow = this.optionsHandler.isWrapNavigationToNextRow();\n        let nextCell : CellPositionType = this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_DOWN, currentCellPosition, wrapNavigationToNextRow);\n\n        if(nextCell) {\n            this.ensureCellVisible(nextCell);\n            this.focusPosition(nextCell, event);\n        }\n    }\n\n    public navigateToCellLeft(currentCellPosition : CellPositionType,  event : KeyboardEvent | null = null) : void {\n        const wrapNavigationToNextRow = this.optionsHandler.isWrapNavigationToNextRow();\n        let nextCell : CellPositionType = this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_LEFT, currentCellPosition, wrapNavigationToNextRow);\n\n        if(nextCell) {\n            this.ensureCellVisible(nextCell);\n            this.focusPosition(nextCell, event);\n        }\n    }\n\n    public navigateToCellRight(currentCellPosition : CellPositionType,  event : KeyboardEvent | null = null) : void {\n        const wrapNavigationToNextRow = this.optionsHandler.isWrapNavigationToNextRow();\n        let nextCell : CellPositionType = this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_RIGHT, currentCellPosition, wrapNavigationToNextRow);\n\n        if(nextCell) {\n            this.ensureCellVisible(nextCell);\n            this.focusPosition(nextCell, event);\n        }\n    }\n\n    public navigateToFirstCellInRow(rowPosition : RowPositionType,  event : KeyboardEvent | null = null, setRange = true, scrollOnFocus = true) : void {\n        const cellPosition = this.cellNavigationHandler.getFirstCellInRow(rowPosition);\n        this.navigateTo({\n            focusColumnID : cellPosition.columnID,\n            focusIndex : cellPosition.rowIndex,\n            pinPosition : cellPosition.pinPosition,\n            scrollColumnID : cellPosition.columnID,\n            scrollIndex : cellPosition.rowIndex,\n            parentKeys : cellPosition.parentKeys,\n        }, event, setRange, scrollOnFocus)\n    }\n\n    public navigateToLastCellInRow(rowPosition : RowPositionType,  event : KeyboardEvent | null = null, setRange : boolean = true, scrollOnFocus = true) : void {\n        const cellPosition = this.cellNavigationHandler.getLastCellInRow(rowPosition);\n        this.navigateTo({\n            focusColumnID : cellPosition.columnID,\n            focusIndex : cellPosition.rowIndex,\n            pinPosition : cellPosition.pinPosition,\n            scrollColumnID : cellPosition.columnID,\n            scrollIndex : cellPosition.rowIndex,\n            parentKeys : cellPosition.parentKeys,\n\n        }, event, setRange, scrollOnFocus)\n    }\n\n    public navigateToFirstCellInColumn(currentCellPosition : CellPositionType,  event : KeyboardEvent | null = null) : void {\n        const cellPosition = this.cellNavigationHandler.getFirstCellInColumn(currentCellPosition);\n        this.navigateTo({\n            focusColumnID : cellPosition.columnID,\n            focusIndex : cellPosition.rowIndex,\n            pinPosition : cellPosition.pinPosition,\n            scrollColumnID : cellPosition.columnID,\n            scrollIndex : cellPosition.rowIndex,\n            parentKeys : cellPosition.parentKeys,\n\n        }, event)\n    }\n\n    public navigateToLastCellInColumn(currentCellPosition : CellPositionType,  event : KeyboardEvent | null = null) : void {\n        const cellPosition = this.cellNavigationHandler.getLastCellInColumn(currentCellPosition);\n        this.navigateTo({\n            focusColumnID : cellPosition.columnID,\n            focusIndex    : cellPosition.rowIndex,\n            pinPosition     : cellPosition.pinPosition,\n            scrollColumnID: cellPosition.columnID,\n            scrollIndex   : cellPosition.rowIndex,\n            parentKeys : cellPosition.parentKeys,\n\n        }, event)\n    }\n\n    public ensureCellVisible(gridCell: CellPositionType, immediateScrollPropagate : boolean = false): void {\n        const bodyController = this.controllerHanlder.getBodyController();\n        const scrollHandler = bodyController.getScrollHandler();\n        if(gridCell.pinPosition === 'middle' || gridCell.pinPosition === 'topDraftRow' || gridCell.pinPosition === 'bottomDraftRow') {\n            scrollHandler.ensureIndexVisible(gridCell.rowIndex, gridCell.parentKeys, null, immediateScrollPropagate, gridCell.pinPosition);\n        }\n\n        scrollHandler.ensureColumnVisible(gridCell.columnID);\n\n    }\n\n    public navigateNextCellToFocus(previous : CellController | RowController, event : KeyboardEvent) : void {\n        const nextCell = this.navigateToNextNonEditableCell(previous, false, event);\n        event?.preventDefault();// hotfix for focus tab navigation\n        if(nextCell) {\n            return;\n        }\n    }\n\n    public navigatePreviousCellToFocus(previous : CellController | RowController, event : KeyboardEvent | null) : void {\n        const nextCell = this.navigateToNextNonEditableCell(previous, true, event);\n        event?.preventDefault();// hotfix for focus tab navigation\n        if(nextCell) {\n            return;\n        }\n\n        let cellPosition : CellPositionType;\n        if(previous instanceof RowController) {\n            cellPosition = previous.getRowFocusedPosition();\n        }else {\n            cellPosition = previous.getCellPosition();\n        }\n\n        const isFirstRow = this.cellNavigationHandler.isFirstRow(cellPosition);\n\n        if(isFirstRow) {\n            const isHeaderNeeded = this.optionsHandler.isColumnHeader();\n            if(isHeaderNeeded) {\n                // need to implement header navigation\n            }\n            event?.preventDefault();\n        }\n        \n    }\n\n    private navigateToNextNonEditableCell(previous : CellController | RowController,backward : boolean, event : KeyboardEvent | null ,  wrapNavigationToNextRow : boolean = true) : boolean {\n        let cellPosition : CellPositionType;\n\n        if(previous instanceof RowController) {\n            const columnID = this.getColumnIDFromDisplayedColumns(backward);\n            const rowNode = previous.getRowNode();\n            const rowMeta = rowNode.getRowMeta() as RowPositionType;\n            cellPosition = {\n                ...rowMeta,\n                columnID\n            }\n        }else {\n            cellPosition = previous.getCellPosition();\n        }\n\n        const nextCell = backward ? this.cellNavigationHandler.getNextCellBackward(cellPosition, wrapNavigationToNextRow) : this.cellNavigationHandler.getNextCellForward(cellPosition, wrapNavigationToNextRow);\n        if(nextCell) {\n            this.ensureCellVisible(nextCell);\n            this.focusPosition(nextCell, event);\n        }\n\n        return nextCell !== null;\n    }\n\n    private getColumnIDFromDisplayedColumns(backward : boolean) : string {\n        const displayAllColumns = this.fieldHandler.getDisplayedAllColumns();\n        const columnNode = displayAllColumns[backward ? 0 : (displayAllColumns.length - 1)];\n        if(columnNode) {\n            return columnNode.getID();\n        }\n\n        return null;\n    }\n\n\n    public navigateTo(params : NavigateParams, event : KeyboardEvent | null, setRange : boolean = true, scrollOnFocus = true) : void {\n        const cellPosition = {\n            columnID   : params.focusColumnID,\n            rowIndex   : params.focusIndex,\n            pinPosition: params.pinPosition,\n            parentKeys : params.parentKeys\n\n        }\n        scrollOnFocus && this.ensureCellVisible(cellPosition);\n        this.focusPosition(cellPosition, event, 'ui', setRange, scrollOnFocus);\n    }\n\n    public focusPosition(cellPosition: CellPositionType, event : KeyboardEvent | null, eventOrigin : 'api' | 'ui' = 'ui', setRange : boolean = true, scrollOnFocus : boolean = true, focus : boolean = true) {\n        const isCellFocused = this.focusHandler.setFocusedCell({\n            rowIndex   : cellPosition.rowIndex,\n            columnID   : cellPosition.columnID,\n            pinPosition: cellPosition.pinPosition,\n            parentKeys : cellPosition.parentKeys,\n            event      : event,\n            eventOrigin\n        }, scrollOnFocus, focus);\n\n        if (isCellFocused && this.rangeSelectionHandler && setRange) {\n            const focusedCellPosition = this.focusHandler.getFocusedCellPosition();\n            this.rangeSelectionHandler.setRange(focusedCellPosition || cellPosition);\n        }\n    }\n\n    public getCellController(cellPosition: CellPositionType): CellController {\n        const rowCtrl = this.rowRendererController.getRowByPosition(cellPosition);\n        if (!rowCtrl) {\n            return null;\n        }\n\n        return rowCtrl.getCellController(cellPosition.columnID);\n    }\n\n    public navigateToFirstRowFirstColumn(cellPosition: CellPositionType, event : KeyboardEvent | null) : void {\n        const firstCellInRow    = this.cellNavigationHandler.getFirstCellInRow(cellPosition);\n        const firstCellInColumn = this.cellNavigationHandler.getFirstCellInColumn(firstCellInRow);\n\n        this.navigateTo({\n            focusColumnID : firstCellInColumn.columnID,\n            focusIndex    : firstCellInColumn.rowIndex,\n            pinPosition   : firstCellInColumn.pinPosition,\n            scrollColumnID: firstCellInColumn.columnID,\n            scrollIndex   : firstCellInColumn.rowIndex,\n            parentKeys : firstCellInColumn.parentKeys\n        }, event)\n    }\n\n    public navigateToLastRowLastColumn(cellPosition: CellPositionType, event : KeyboardEvent | null) : void {\n        const lastCellInRow    = this.cellNavigationHandler.getLastCellInRow(cellPosition);\n        const lastCellInColumn = this.cellNavigationHandler.getLastCellInColumn(lastCellInRow);\n\n        this.navigateTo({\n            focusColumnID : lastCellInColumn.columnID,\n            focusIndex    : lastCellInColumn.rowIndex,\n            pinPosition   : lastCellInColumn.pinPosition,\n            scrollColumnID: lastCellInColumn.columnID,\n            scrollIndex   : lastCellInColumn.rowIndex,\n            parentKeys : lastCellInColumn.parentKeys\n        }, event)\n    }\n\n    public navigateToTopOfColumnInView(columnID : string, event : KeyboardEvent | null, setRange : boolean = true, scrollOnFocus : boolean = true) : void {\n        const focusedCellPosition = this.cellNavigationHandler.getTopOfColumnView(columnID);\n\n        focusedCellPosition && this.navigateTo({\n            focusColumnID : focusedCellPosition.columnID,\n            focusIndex    : focusedCellPosition.rowIndex,\n            pinPosition   : focusedCellPosition.pinPosition,\n            scrollColumnID: focusedCellPosition.columnID,\n            scrollIndex   : focusedCellPosition.rowIndex,\n            parentKeys : focusedCellPosition.parentKeys\n        }, event, setRange, scrollOnFocus)\n    }\n\n    public navigateToBottomOfColumnInView(columnID : string, event : KeyboardEvent | null, setRange : boolean = true, scrollOnFocus : boolean = true) : void {\n        const focusedCellPosition = this.cellNavigationHandler.getBottomOfColumnView(columnID);\n\n        focusedCellPosition && this.navigateTo({\n            focusColumnID : focusedCellPosition.columnID,\n            focusIndex    : focusedCellPosition.rowIndex,\n            pinPosition   : focusedCellPosition.pinPosition,\n            scrollColumnID: focusedCellPosition.columnID,\n            scrollIndex   : focusedCellPosition.rowIndex,\n            parentKeys : focusedCellPosition.parentKeys\n        }, event, setRange, scrollOnFocus)\n    }\n\n    private getMiddleGroupParentKeysFromInsertMetas(rowInsertMetas ?: IRowInsertMeta[]) : string[] | null {\n        if (!rowInsertMetas?.length) {\n            return null;\n        }\n        for (let i = 0; i < rowInsertMetas.length; i++) {\n            const meta = rowInsertMetas[i];\n            const pin = meta.pinPosition ?? 'middle';\n            const keys = meta.parentKeys ?? [];\n            if (pin === 'middle' && keys.length > 0) {\n                return keys;\n            }\n        }\n        return null;\n    }\n\n    private focusFirstFocusableCellFromRowStart(rowStart : RowPositionType) : void {\n        const middleHandler = this.recordHandler.getMiddleHandler();\n        if (middleHandler.getRowCount() === 0) {\n            return;\n        }\n\n        const columnID = this.fieldHandler.getFirstColumnID();\n        if (!columnID) {\n            return;\n        }\n\n        let cell : CellPositionType = {\n            columnID,\n            rowIndex   : rowStart.rowIndex,\n            pinPosition: rowStart.pinPosition,\n            parentKeys : rowStart.parentKeys ?? [],\n        };\n\n        const maxSteps = middleHandler.getRowCount() + 5;\n        for (let i = 0; i < maxSteps && cell; i++) {\n            if (this.cellNavigationHandler.isCellFocusable(cell)) {\n                this.ensureCellVisible(cell);\n                this.focusPosition(cell, null);\n                return;\n            }\n            cell = this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_DOWN, cell, true);\n        }\n    }\n\n    private focusFirstMiddleCellAfterEmptyToNonEmptyInsert() : void {\n        const middleHandler = this.recordHandler.getMiddleHandler();\n        if (middleHandler.getRowCount() === 0) {\n            return;\n        }\n\n        const rowMeta = middleHandler.getFirstRowMeta();\n        this.focusFirstFocusableCellFromRowStart({\n            rowIndex   : rowMeta.rowIndex,\n            pinPosition: rowMeta.pinPosition,\n            parentKeys : rowMeta.parentKeys ?? [],\n        });\n    }\n\n    private navigateToCell(previous : CellController | RowController, event : KeyboardEvent | null) : void {\n        const nextCell = this.navigateToNextNonEditableCell(previous, false, event, false);\n    \n        if (nextCell || this.navigateToNextNonEditableCell(previous, true, event, false)) {\n            event?.preventDefault();\n        }\n    }\n\n    // private navigateToNextOrPreviousRow(controller : CellController | RowController , event : KeyboardEvent | null) : void {\n    //     const nextCell = this.getNextRow(controller, true, event);\n    \n    //     if (nextCell || this.getNextRow(controller, false, event)) {\n    //         event?.preventDefault();\n    //     }\n    // }\n\n    // private getNextRow(controller : CellController | RowController, backward : boolean,event : KeyboardEvent | null ) : boolean {\n    //     let cellPosition : CellPositionType;\n\n    //     if(controller instanceof RowController) {\n    //         const columnID = this.getColumnIDFromDisplayedColumns(backward);\n    //         const rowNode = controller.getRowNode();\n    //         const rowMeta = rowNode.getRowMeta() as RowPositionType;\n    //         cellPosition = {\n    //             ...rowMeta,\n    //             columnID\n    //         }\n    //     }else {\n    //         cellPosition = controller.getCellPosition();\n    //     }\n\n    //     const row = backward ? this.cellNavigationHandler.getRowBelow(cellPosition) : this.cellNavigationHandler.getRowAbove(cellPosition);\n\n    //     if(!row) {\n    //         return false;\n    //     }\n\n    //     const nextCell = {\n    //         ...row,\n    //         columnID : cellPosition.columnID\n    //     }\n    //     if(nextCell) {\n    //         this.ensureCellVisible(nextCell);\n    //         this.focusPosition(nextCell, event);\n    //     }\n\n    //     return nextCell !== null;\n    // }\n}","import { IModule } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\nimport { NavigationService } from \"./navigation-handler\";\nimport { CellNavigation } from \"./cell-navigation\";\nimport { RowNavigation } from \"./row-navigation\";\nimport { CellNavigationHandler } from \"./cell-navigation-handler\";\n\nexport const NavigationModule : IModule = {\n\tmoduleName: 'navigation',\n\tversion: '1.0.0',\n    beans : [NavigationService, CellNavigation, RowNavigation, CellNavigationHandler]\n}\n","import { AutoWired, Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { RowController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { IFocusHandler } from \"../Grid/Core/Navigation/focus-handler.types\";\nimport { INavigationHandler } from \"../Grid/Core/Navigation/navigation-handler.types\";\nimport { INavigationActions } from \"../Grid/Core/Navigation/navigation-actions.types\";\n\n@Bean('rowNavigation')\nexport class RowNavigation extends EventEmitter implements INavigationActions<RowController> {\n    @AutoWired('navigationService') navigationService: INavigationHandler;\n    @AutoWired('focusHandler') focusHandler: IFocusHandler;\n\n\n    navigateToCellUp(rowController : RowController, event : KeyboardEvent | null) : void {\n        if(rowController && rowController.isFullWidth()) {\n            const cellPosition = rowController.getRowFocusedPosition();\n            this.navigationService.navigateToCellUp(cellPosition, event);\n        } \n    }\n\n    navigateToCellDown(rowController : RowController,event : KeyboardEvent | null) : void {\n        if(rowController && rowController.isFullWidth()) {\n            const cellPosition = rowController.getRowFocusedPosition();\n            this.navigationService.navigateToCellDown(cellPosition, event);\n        } \n    }\n\n    navigateToCellLeft(rowController : RowController, event : KeyboardEvent | null) : void {\n        if(rowController && rowController.isFullWidth()) {\n            const cellPosition = rowController.getRowFocusedPosition();\n            this.navigationService.navigateToCellLeft(cellPosition, event);\n        } \n    }\n\n    navigateToCellRight(rowController : RowController,event : KeyboardEvent | null) : void {\n        if(rowController && rowController.isFullWidth()) {\n            const cellPosition = rowController.getRowFocusedPosition();\n            this.navigationService.navigateToCellRight(cellPosition, event);\n        } \n    }\n\n\n    navigateToFirstCellInColumn(rowController : RowController, event : KeyboardEvent | null) : void {\n        if(rowController && rowController.isFullWidth()) {\n            const cellPosition = rowController.getRowFocusedPosition();\n            this.navigationService.navigateToFirstCellInColumn(cellPosition, event);\n        } \n    }\n\n    navigateToLastCellInColumn(rowController : RowController,event : KeyboardEvent | null) : void {\n        if(rowController && rowController.isFullWidth()) {\n            const cellPosition = rowController.getRowFocusedPosition();\n            this.navigationService.navigateToLastCellInColumn(cellPosition, event);\n        } \n    }\n\n    navigatePreviousCellToFocus(rowController : RowController, event : KeyboardEvent) : void {\n        if(rowController && rowController.isFullWidth()) {\n            this.navigationService.navigatePreviousCellToFocus(rowController, event);\n        }\n    }\n\n    navigateNextCellToFocus(rowController : RowController, event : KeyboardEvent) : void {\n        if(rowController && rowController.isFullWidth()) {\n            this.navigationService.navigateNextCellToFocus(rowController, event);\n        }\n    }\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { IBaseSelectionRangeHandler } from \"./column-selection-range-handler.types\";\n\nexport interface IPartition { keep: string[]; discard: string[] }\nexport interface IIdsRange {\n    ranges : string[],\n    partition ?: IPartition,\n    newValue ?: boolean\n};\n\nexport abstract class BaseSelectionRangeHandler extends EventEmitter implements IBaseSelectionRangeHandler {\n    protected root: string | null = null;\n    protected end: string | null = null;\n    protected cachedRange: string[] = [];\n    \n    // Abstract method to be implemented by subclasses or users\n    protected abstract calculateIdsBetween(startId: string, endId: string): IIdsRange;\n    protected abstract isIdPresented(id: string)                          : boolean;\n    protected abstract getRanges(startId: string, endId: string)          : string[];\n\n    reset(): void {\n        this.root = null;\n        this.end = null;\n        this.cachedRange.length = 0;\n    }\n\n    setRoot(node: string): void {\n        this.root = node;\n        this.end = null;\n        this.cachedRange.length = 0;\n    }\n\n    setEndRange(end: string): void {\n        this.end = end;\n        this.cachedRange.length = 0;\n    }\n\n    getRoot(): string | null {\n        return this.root;\n    }\n\n    getRange(): string[] {\n        if (this.cachedRange.length === 0) {\n            if (this.root == null || this.end == null) {\n                return this.cachedRange;\n            }\n\n            this.cachedRange = this.getRanges(this.root, this.end);\n        }\n\n        return this.cachedRange;\n    }\n\n    isInRange(node: string): boolean {\n        if (this.root === null) {\n            return false;\n        }\n\n        return this.getRange().some((id) => id === node);\n    }\n\n    truncate(node: string): { keep: string[]; discard: string[] } {\n        const range = this.getRange();\n\n        if (range.length === 0) {\n            return { keep: [], discard: [] };\n        }\n\n        const discardAfter = range[0] === this.root!;\n        const idx = range.findIndex((id) => id === node);\n\n        if (idx > -1) {\n            const above = range.slice(0, idx);\n            const below = range.slice(idx + 1);\n            this.setEndRange(node);\n            return discardAfter ? { keep: above, discard: below } : { keep: below, discard: above };\n        } else {\n            return { keep: range, discard: [] };\n        }\n    }\n\n    extend(id: string): { keep: string[]; discard: string[] } {\n        if (this.root == null) {\n            const keep = this.getRange().slice(); \n            if (id) {\n                keep.push(id);\n            }\n\n            this.setRoot(id);\n            return { keep, discard: [] };\n        }\n\n        const {ranges, newValue, partition} = this.calculateIdsBetween(this.root, id);\n\n        if(newValue) {\n            return partition;\n        }\n\n        if (ranges.includes(this.end!)) {\n            this.setEndRange(id);\n            return { keep: this.getRange(), discard: [] };\n        } else {\n            const discard = this.getRange().slice();\n            this.setEndRange(id);\n            return { keep: this.getRange(), discard };\n        }\n    }\n}\n","import { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { BaseSelectionRangeHandler, IIdsRange } from \"./base-range-selection-handler\";\n\nexport class ColumnSelectionRangeHandler extends BaseSelectionRangeHandler {\n    private fieldHandler : FieldHandler;\n\n    init(handler : FieldHandler) {\n        this.fieldHandler = handler;\n    }\n\n    calculateIdsBetween(columnFromID: string, columnToID: string): IIdsRange {\n        const allColumns = this.fieldHandler.getAllDisplayedColumnIDs();\n        const isSameColumn = columnFromID === columnToID;\n        const fromIndex = allColumns.indexOf(columnFromID);\n\n        if (fromIndex < 0) {\n            console.warn(`Column ${columnFromID} is not visible.`);\n            return null;\n        }\n\n        const toIndex = isSameColumn ? fromIndex : allColumns.indexOf(columnToID);\n\n        if (toIndex < 0) {\n            console.warn(`Column ${columnToID} is not visible.`);\n            return null;\n        }\n\n        if (isSameColumn) {\n            return {\n                ranges : [columnFromID]\n            };\n        }\n\n        const firstIndex = Math.min(fromIndex, toIndex);\n        const lastIndex = firstIndex === fromIndex ? toIndex : fromIndex;\n        const columns: string[] = [];\n\n        for (let i = firstIndex; i <= lastIndex; i++) {\n            columns.push(allColumns[i]);\n        }\n\n        return {\n            ranges : columns\n        };\n    }\n\n    protected isIdPresented(id: string): boolean {\n        return !!this.fieldHandler.getColumnNodeByID(id);\n    }\n\n    protected getRanges(startId: string, endId: string): string[] {\n        return this.calculateIdsBetween(startId, endId).ranges;\n    }\n}","import { AutoWired, Bean, EventEmitter, PostConstruct } from '@dg/corecomponent';\nimport { IColumnSelection, IColumnSelectionHookWrapper, ICommonColumnSelectionParams, ISetColumnGroupSelectionParams, ISetSelectionsParams } from './column-selection.types';\nimport { IColumnNode } from '../Grid/Main';\nimport { GRID_BEAN_NAME } from '../Grid/Core/Constants/BeanName';\nimport { FieldHandler } from '../Grid/Core/Columns/FieldHandler';\nimport { ColumnSelectionRangeHandler } from './column-selection-range-handler';\nimport { ISelectionRangeHandler } from './column-selection-range-handler.types';\nimport { IHookManager } from '../Grid/Core/Hooks/Interface/IHookManager';\nimport { HookEventsName } from '../Grid/Core/Hooks/Constants/HookEventsName';\nimport { Events } from '../Grid/Core/Constants/Events';\nimport type { ColumnTreeModel } from '../nested-header/column-tree-model';\n\n@Bean('columnSelection')\nexport class ColumnSelection extends EventEmitter implements IColumnSelection {\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER)\n    private fieldHandler: FieldHandler;\n\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) hookManager: IHookManager;\n\n    @AutoWired(GRID_BEAN_NAME.COLUMN_TREE_MODEL) private columnTreeModel?: ColumnTreeModel;\n\n    private selectedColumns: string[] = [];\n    private columnSelectRange: ISelectionRangeHandler<FieldHandler>;\n\n    private columnSelectionHookWrapper : IColumnSelectionHookWrapper;\n\n    public allowSingleActionStarted : boolean = false;\n\n    @PostConstruct()\n    init(): void {\n        this.columnSelectRange = new ColumnSelectionRangeHandler();\n        this.columnSelectRange.init(this.fieldHandler);\n\n        this.columnSelectionHookWrapper = new ColumnSelection.ColumnSelectionHookWrapper(this.hookManager);\n\n        this.addDestroyFunc(() => {\n            this.columnSelectionHookWrapper = null;\n        })\n\n        const removeCallback = () => {\n            const isAllowMultipleTypeSelection = this.optionsHandler.isAllowMultipleTypeSelection();\n            if(!isAllowMultipleTypeSelection && !this.allowSingleActionStarted) {\n                this.clearSelection({\n                    source  : 'ui'\n                })\n            }\n        }\n        this.addListener(this.eventHandler, Events.EVENT_RANGE_SELECTION_CHANGED, removeCallback);\n        this.addListener(this.eventHandler, 'rowSelectionChanged', removeCallback);\n    }\n\n    setColumnSelected(params: ISetSelectionsParams): void {\n        if(this.isSelectionNone()) {\n            return;\n        }\n\n        const { ids, clearSelection, rangeSelect , ctrlSelect} = params;\n\n        const isSingleOrMultipleCtrl = this.isSingleOrMultipleCtrl();\n\n        if (clearSelection) {\n            this.clearSelection(params as ICommonColumnSelectionParams);\n            return;\n        }\n\n        if (!ids || ids.length === 0) return;\n\n        if (rangeSelect) {\n            this.handleRangeSelection(ids, params);\n            return;\n        }\n\n        if(isSingleOrMultipleCtrl && ctrlSelect) {\n            const selectedIDs: string[] = [];\n            const deSelectedIDs: string[] = [];\n\n            ids.forEach((id) => {\n                if (this.isColumnSelected(id)) {\n                    deSelectedIDs.push(id);\n                } else {\n                    selectedIDs.push(id);\n                }\n            });\n\n            if (selectedIDs.length > 0) {\n                this.selectRange(selectedIDs, true, params);\n            }\n            if (deSelectedIDs.length > 0) {\n                this.selectRange(deSelectedIDs, false, params);\n            }\n            // this.selectRange(ids, true, params);\n        }else {\n            this.selectRange(ids, params.newValue, params);\n        }\n\n        this.dispatchSelectionChanged();\n    }\n\n    public clearSelection(params : ICommonColumnSelectionParams): void {\n        const callback = () => {\n            this.selectedColumns = [];\n            this.columnSelectRange.reset();\n            this.dispatchSelectionChanged();\n        }\n\n        this.columnSelectionHookWrapper.onColumnDeselect(this.selectedColumns, callback, params)\n        \n    }\n\n    private handleRangeSelection(ids: string[], params : ISetSelectionsParams): void {\n        const isMultiSelection  = this.isMultiSelection();\n        const isSingleSelection = this.isSingleSelection();\n        if (ids.length !== 1 && isMultiSelection) {\n            throw new Error('Cannot select multiple columns when using rangeSelect');\n        }\n\n        const id = ids[0];\n\n        if(isSingleSelection) {\n            this.columnSelectRange.setRoot(id);\n            this.selectRange([id], true, params);\n        }else if (this.columnSelectRange.isInRange(id)) {\n            const partition = this.columnSelectRange.truncate(id);\n            this.selectRange(partition.discard, false, params);\n            this.selectRange(partition.keep, true, params);\n        } else {\n            const fromId = this.columnSelectRange.getRoot();\n            if (fromId && fromId !== id) {\n                const partition = this.columnSelectRange.extend(id);\n                this.selectRange(partition.discard, false, params);\n                this.selectRange(partition.keep, true, params);\n            } else {\n                this.columnSelectRange.setRoot(id);\n                this.selectRange([id], true, params);\n            }\n        }\n\n        this.dispatchSelectionChanged();\n    }\n\n    private selectRange(ids: string[], newValue: boolean, params : ISetSelectionsParams): void {\n        newValue ? this.selectColumns(ids, params) : this.deSelectColumns(ids, params);\n    }\n\n    private selectColumns(ids : string[], params : ISetSelectionsParams) : void {\n        if(this.isSelectionNone()) {\n            return;\n        }\n        const {ctrlSelect, rangeSelect}           = params;\n        const isMultiSelection       = this.isMultiSelection();\n        const isSingleOrMultipleCtrl = this.isSingleOrMultipleCtrl();\n\n        if(!isMultiSelection && !isSingleOrMultipleCtrl) {\n            this.clearSelection(params);\n        }\n\n        if(isSingleOrMultipleCtrl && !ctrlSelect && !rangeSelect) {\n            this.clearSelection(params);\n        }\n\n        const callBack = ({columnIds}) => {\n            this.selectedColumns.push(...columnIds.filter(id => !this.isColumnSelected(id)));\n            !params.rangeSelect && this.columnSelectRange.setRoot(ids[ids.length - 1]);\n        }\n\n        this.columnSelectionHookWrapper.onColumnSelect(ids, callBack, params as ICommonColumnSelectionParams)\n\n    }\n\n    private deSelectColumns(ids : string[], params : ISetSelectionsParams) : void {\n        const callBack = ({columnIds}) => {\n            this.selectedColumns = this.selectedColumns.filter(id => !columnIds.includes(id));\n            !params.rangeSelect && this.columnSelectRange.setRoot(ids[ids.length - 1]);\n        }\n\n        this.columnSelectionHookWrapper.onColumnDeselect(ids, callBack, params as ICommonColumnSelectionParams)\n\n    }\n\n    private dispatchSelectionChanged(): void {\n        this.allowSingleActionStarted = true;\n        this.dispatchEvent({\n            type: 'columnSelectionChanged',\n        });\n        this.allowSingleActionStarted = false;\n    }\n\n    getSelectedColumns(): string[] {\n        return this.selectedColumns;\n    }\n\n    getSelectedColumnNodes(): IColumnNode[] {\n        return this.selectedColumns\n            .map(columnId => this.fieldHandler.getColumnNodeByID(columnId))\n            .filter(Boolean) as IColumnNode[];\n    }\n\n    getSelectionCount(): number {\n        return this.selectedColumns.length;\n    }\n\n    isEmpty(): boolean {\n        return this.selectedColumns.length === 0;\n    }\n\n    isColumnSelected(id: string): boolean {\n        return this.selectedColumns.includes(id);\n    }\n\n    setColumnGroupSelected(params: ISetColumnGroupSelectionParams): void {\n        if (this.isSelectionNone() || !this.columnTreeModel) return;\n        const group = this.columnTreeModel.getGroupById(params.groupId);\n        if (!group) return;\n        const leafIds = group.getDisplayedLeafColumns().map((c) => (c as IColumnNode).getID()).filter(Boolean);\n        if (leafIds.length === 0) return;\n        this.setColumnSelected({\n            ids: leafIds,\n            newValue: params.newValue,\n            source: (params.source === 'api' || params.source === 'ui' ? params.source : 'api'),\n            event: params.event,\n            clearSelection: false,\n        });\n    }\n\n    isColumnGroupSelected(groupId: string): boolean {\n        if (!this.columnTreeModel) return false;\n        const group = this.columnTreeModel.getGroupById(groupId);\n        if (!group) return false;\n        const leafIds = group.getDisplayedLeafColumns().map((c) => (c as IColumnNode).getID()).filter(Boolean);\n        return leafIds.length > 0 && leafIds.every((id) => this.isColumnSelected(id));\n    }\n\n    isColumnGroupPartiallySelected(groupId: string): boolean {\n        if (!this.columnTreeModel) return false;\n        const group = this.columnTreeModel.getGroupById(groupId);\n        if (!group) return false;\n        const leafIds = group.getDisplayedLeafColumns().map((c) => (c as IColumnNode).getID()).filter(Boolean);\n        const selectedCount = leafIds.filter((id) => this.isColumnSelected(id)).length;\n        return selectedCount > 0 && selectedCount < leafIds.length;\n    }\n\n    private isSelectionNone() : boolean {\n        return this.optionsHandler.getColumnSelection() === 'none';\n    }\n\n    private isMultiSelection() : boolean {\n        return this.optionsHandler.getColumnSelection() === 'multiple';\n    }\n\n    private isSingleOrMultipleCtrl() : boolean {\n        return this.optionsHandler.getColumnSelection() === 'singleOrMultiCtrl';\n    }\n\n    private isSingleSelection() : boolean {\n        return this.optionsHandler.getColumnSelection() === 'single';\n    }\n\n    /** @internal */\n    static ColumnSelectionHookWrapper = class implements IColumnSelectionHookWrapper {\n        constructor(private hookManager : IHookManager) {}\n        onColumnSelect(ids : string[], callBack : (ids : string[]) => void,params : ICommonColumnSelectionParams) : void {\n            const hookParams = this.createColumnSelectionHookParams(ids,params);\n\n            const api = (params : any) => {\n                callBack(params);\n            }\n            this.hookManager.executeHook(HookEventsName.onBeforeColumnSelect, HookEventsName.onAfterColumnSelect, api, hookParams);\n        }\n\n        onColumnDeselect(ids : string[], callBack : (ids: string[]) => void,params : ICommonColumnSelectionParams) : void {\n            const hookParams = this.createColumnSelectionHookParams(ids,params);\n            const api = (params : any) => {\n                callBack(params);\n            }\n            this.hookManager.executeHook(HookEventsName.onBeforeColumnDeselect, HookEventsName.onAfterColumnDeselect, api, hookParams);\n        }\n\n        private createColumnSelectionHookParams(ids : string[],params : ICommonColumnSelectionParams) : any {\n            return {\n                columnIds: ids,\n                eventOrigin: params.source,\n                event    : params.event\n            }\n        }\n    }\n}\n","import { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { BaseSelectionRangeHandler, IIdsRange } from \"./base-range-selection-handler\";\n\nexport class RowSelectionRangeHandler extends BaseSelectionRangeHandler {\n    private recordHandler : IRecordHandler;\n\n    init(handler : IRecordHandler) {\n        this.recordHandler = handler;\n    }\n    \n    calculateIdsBetween(startId: string, endId: string): IIdsRange {\n        const startRowNode = this.recordHandler.getRowNodeById(startId);\n        const endRowNode   = this.recordHandler.getRowNodeById(endId);\n\n        if(!endRowNode) {\n            return {\n                partition : {\n                    keep : this.getRange(),\n                    discard : []\n                },\n                ranges : [],\n                newValue : true\n            }\n        }\n\n        if(!startRowNode) {\n            return {\n                partition : { keep: this.getRange().concat(endId), discard: [] },\n                newValue : true,\n                ranges : []\n            }\n        }\n\n\n        const rows = this.recordHandler.getSequenceRowsById(startId, endId);\n        if(rows.length === 0) {\n            rows.push(endId);\n        }\n        return {\n            ranges : rows\n        };\n    }\n\n    protected isIdPresented(id: string): boolean {\n        return !!this.recordHandler.getRowNodeById(id);\n    }\n\n    protected getRanges(startId: string, endId: string): string[] {\n        return this.calculateIdsBetween(startId, endId).ranges;\n    }\n}","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IClearRowSelection, ICommonRowSelctionParams, IRowSelectionHandler, ISelectAllParams, ISetRowSelectionsParams, SelectionState } from \"./row-selection-handler.types\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IGroupedRowNodeCore } from \"../DataStore/group-rownode.types\";\nimport { GroupRowNode } from \"../DataStore/GroupRowNode\";\nimport { RowSelectionRangeHandler } from \"./row-range-selection-handler\";\nimport { ISelectionRangeHandler } from \"./column-selection-range-handler.types\";\nimport { IHookManager } from \"../Grid/Core/Hooks/Interface/IHookManager\";\nimport { HookInitiator, IRowAPIManager } from \"../Grid/Main\";\nimport { IRowSelectionHookWrapper, RowIdType, RowType } from \"./row-selection/row-selection.types\";\nimport { RowSelectionHookWrapper } from \"./row-selection-hooks\";\nimport { Events } from \"../Grid/Core/Constants/Events\";\nimport { RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\n\n@Bean('RowSelectionHandler')\nexport class ServerSideRowSelectionHandler extends EventEmitter implements IRowSelectionHandler {\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler: IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) hookManager: IHookManager;\n    @AutoWired(GRID_BEAN_NAME.ROW_API) private rowAPI: IRowAPIManager;\n    private selectedState: SelectionState = { selectAllChildren: false, toggledNodes: new Map() };\n    private lastSelected : string | null = null;\n\n    private selectRangeHandler : ISelectionRangeHandler<IRecordHandler>;\n\n    private rowSelectionHookWrapper : IRowSelectionHookWrapper;\n\n    private selectedRows: Set<string> = new Set();\n\n    public allowSingleActionStarted : boolean = false;\n\n    @PostConstruct()\n    init() : void {\n        this.selectRangeHandler = new RowSelectionRangeHandler();\n        this.selectRangeHandler.init(this.recordHandler);\n\n        this.rowSelectionHookWrapper = new RowSelectionHookWrapper(this.hookManager);\n\n        this.addDestroyFunc(() => {\n            this.rowSelectionHookWrapper = null;\n        })\n\n        const removeCallback = () => {\n            const isAllowMultipleTypeSelection = this.optionsHandler.isAllowMultipleTypeSelection();\n            if(!isAllowMultipleTypeSelection && !this.allowSingleActionStarted) {\n                this.clearSelection({\n                    source  : 'ui'\n                })\n            }\n        }\n        this.addListener(this.eventHandler, Events.EVENT_RANGE_SELECTION_CHANGED, removeCallback)\n        this.addListener(this.eventHandler, 'columnSelectionChanged', removeCallback)\n    }\n\n    public clearSelection(params : IClearRowSelection) {\n        const callBack = () => {\n            this.selectedState = { selectAllChildren: false, toggledNodes: new Map() }\n            this.lastSelected = null;\n            this.selectedRows.clear();\n            this.dispatchSelectionChanged();\n        }\n        this.rowSelectionHookWrapper.onRowDeselect({rowIDs : this.getSelectedRowIds()}, callBack, params as ICommonRowSelctionParams, 'id');\n    }\n\n    public setRowSelected(params: ISetRowSelectionsParams): void {\n        if(this.isSelectionNone()) {\n            return;\n        }\n        const { values, clearSelection, selected } = params;\n        const ids = values.map((meta) => meta.rowID);\n        if(clearSelection) {\n            this.clearSelection(params as ICommonRowSelctionParams)\n        }\n        if (ids.length === 0) return;\n\n        \n        const isMultiSelection = this.isMultiSelection();\n    \n        if (params.rangeSelect) {\n            if (ids.length > 1 && !isMultiSelection) {\n                throw new Error('cannot select multiple rows when using rangeSelect');\n            }\n    \n            const id = ids[0];\n\n            if(!isMultiSelection) {\n\n            }else if (this.selectRangeHandler.isInRange(id)) {\n                const partition = this.selectRangeHandler.truncate(id);\n                this.selectRange(partition.discard, false, params);\n                this.selectRange(partition.keep, true, params);\n            } else {\n                const fromId = this.selectRangeHandler.getRoot();\n                if (fromId && fromId !== id) {\n                    const partition = this.selectRangeHandler.extend(id);\n                    this.selectRange(partition.discard, false, params);\n                    this.selectRange(partition.keep, true, params);\n                } else {\n                    this.selectRangeHandler.setRoot(id);\n                    this.selectRange([id], true, params);\n                }\n            }\n            this.dispatchSelectionChanged();\n            return;\n        }\n    \n        // ids.forEach(id => {\n        //     const idPathToNode = this.getRouteToId(id);\n        //     this.recursivelySelectRow(idPathToNode, this.selectedState, { newValue, source, id });\n        // });\n\n        this.selectRange(ids,selected, params);\n    \n        this.selectRangeHandler.setRoot(ids[ids.length - 1]);\n        this.dispatchSelectionChanged();\n        return;\n    }\n\n    private selectRange(ids: string[], newValue : boolean, params : ISetRowSelectionsParams) {\n\n        if(newValue) {\n            const isMultiSelection = this.isMultiSelection();\n            if (ids.length !== 1 && isMultiSelection) {\n                console.error('Cannot select multiple rows');\n                return;\n            }\n    \n            if(!isMultiSelection) {\n                this.clearSelection(params);\n            }\n        }\n        \n\n        const callBack = ({values : ids}) => {\n            if(newValue) {\n                this.lastSelected = ids.length > 0 ? ids[ids.length - 1] : null;\n            }else {\n                this.lastSelected = null;\n            }\n            const id = ids[0];\n            const getRoutes = (id : string) => {\n                return this.getRouteToId(id);\n            }\n            const routes = ids.map(getRoutes).sort((a, b) => b.length - a.length);\n        \n            const completedNodes: Set<string> = new Set();\n            routes.forEach(route => {\n                const lastNodeInRoute = route[route.length - 1];\n\n                if (completedNodes.has(lastNodeInRoute)) {\n                    return;\n                }\n\n                route.forEach(part => completedNodes.add(part));\n                this.recursivelySelectRow(route, this.selectedState, { id, newValue, source  : params.source });\n\n                if (newValue) {\n                    this.recordHandler.addStaticRowById(lastNodeInRoute); \n                    this.selectedRows.add(lastNodeInRoute);\n                } else {\n                    this.recordHandler.removeStaticRowById(lastNodeInRoute); \n                    this.selectedRows.delete(lastNodeInRoute);\n                }\n            });\n\n            this.updateState();\n        }\n\n        newValue ? this.rowSelectionHookWrapper.onRowSelect({rowIDs : ids}, callBack, params as ICommonRowSelctionParams, 'id') : this.rowSelectionHookWrapper.onRowDeselect({rowIDs : ids}, callBack, params as ICommonRowSelctionParams, 'id');\n        \n    }\n\n    private getRouteToId(id : string) : string[] {\n        const node = this.recordHandler.getRowNodeById(id);\n        const parentNodes = (node as any)?.getAncestors() ;\n        let parentIds = [];\n        parentIds.push(id);\n        if(parentNodes) {\n            parentNodes.forEach(node => {\n                parentIds.push(node.getId());\n            })\n        }\n        \n        return parentIds.reverse();\n    }\n\n    private dispatchSelectionChanged(lastSelection : boolean = true) : void {\n        this.allowSingleActionStarted = true;\n        this.dispatchEvent({\n            type : 'rowSelectionChanged',\n            lastSelection\n        })\n        this.allowSingleActionStarted = false;\n    }\n    \n    private recursivelySelectRow( [nextId, ...remainingIds]: string[], selectedState: SelectionState, params: { newValue: boolean; source: 'api' | 'ui'; event?: Event; id: string } ) {\n        if (!nextId) {\n            return;  \n        }\n    \n        const isLastNode = remainingIds.length === 0;\n    \n        if (isLastNode) {\n            const doesNodeConform = selectedState.selectAllChildren === params.newValue;\n    \n            if (doesNodeConform) {\n                selectedState.toggledNodes.delete(nextId);\n            } else {\n                selectedState.toggledNodes.set(nextId, {\n                    selectAllChildren: params.newValue,\n                    toggledNodes: new Map(),\n                });\n            }\n            return;\n        }\n    \n        let childState = selectedState.toggledNodes.get(nextId);\n    \n        if (!childState) {\n            childState = {\n                selectAllChildren: selectedState.selectAllChildren,\n                toggledNodes: new Map(),\n            };\n            selectedState.toggledNodes.set(nextId, childState);\n        }\n    \n        this.recursivelySelectRow(remainingIds, childState, params);\n    \n        if (childState.toggledNodes.size === 0 && childState.selectAllChildren === selectedState.selectAllChildren) {\n            selectedState.toggledNodes.delete(nextId);\n        }\n    }\n\n    public isRowSelected(rowMeta: RowIdType): boolean | undefined {\n        const path = this.getRouteToId(rowMeta.rowID);\n        return this.isIdPathSelected(path, this.selectedState);\n    }\n\n    private isIdPathSelected([nextId, ...remainingIds]: string[], state: SelectionState): boolean | undefined {\n        if (remainingIds.length === 0) {\n            const isToggled = state.toggledNodes.has(nextId!);\n            const nextNode = this.recordHandler.getRowNodeById(nextId);\n            if ((nextNode as any)?.hasChildren?.()) {\n                const groupState = state.toggledNodes.get(nextId!);\n                if (groupState && groupState.toggledNodes.size) {\n                    return undefined;\n                }\n            }\n            return state.selectAllChildren ? !isToggled : isToggled;\n        }\n\n        if (state.toggledNodes.has(nextId)) {\n            const nextState = state.toggledNodes.get(nextId);\n            if (nextState) {\n                return this.isIdPathSelected(remainingIds, nextState);\n            }\n        }\n\n        return state.selectAllChildren;\n    }\n\n    private updateState() {\n        const forEachStateDepthFirst = ( state: SelectionState = this.selectedState, id?: string, parentState?: SelectionState ) => {\n            state.toggledNodes.forEach((childState, key) => {\n                forEachStateDepthFirst(childState, key, state);\n            });\n    \n            if (id) {\n                const thisRow = this.recordHandler.getRowNodeById(id);\n                if (thisRow) { \n                    let allChildrenToggled = true;\n\n                    const possibleAllNodesToggled = state.toggledNodes.size >= (thisRow as IGroupedRowNodeCore)!.getChildCount();\n                    if(possibleAllNodesToggled) {\n                        for (const [key, value] of state.toggledNodes.entries()) {\n                            if (value.toggledNodes.size > 0) {\n                                allChildrenToggled = false;\n                                break;\n                            }\n        \n                            const rowDoesNotExist = !this.recordHandler.getRowNodeById(key);\n                            if (rowDoesNotExist) {\n                                allChildrenToggled = false;\n                                break;\n                            }\n                        }\n        \n                        if (allChildrenToggled && thisRow instanceof GroupRowNode) {\n                            state.selectAllChildren = !state.selectAllChildren;\n                            state.toggledNodes.clear();\n                        }\n                    }\n                }\n            }\n    \n            const hasNoToggledRows = state.toggledNodes.size === 0;\n            const isIdenticalToParent = parentState?.selectAllChildren === state.selectAllChildren;\n            if (hasNoToggledRows && isIdenticalToParent) {\n                parentState?.toggledNodes.delete(id!);\n            }\n        };\n    \n        forEachStateDepthFirst();\n    }\n    \n    \n    \n    getSelectedNodes(): IRowNodeCore[] {\n        throw new Error(\"Method not implemented.\");\n    }\n    getSelectedRows(): string[] {\n       return Array.from(this.selectedRows);\n    }\n    getSelectionCount(): number {\n        return -1;\n    }\n    isEmpty(): boolean {\n        return !this.selectedState.selectAllChildren && !this.selectedState.toggledNodes?.size;\n    }\n    getSelectAllState(_justFiltered?: boolean, _justCurrentPage?: boolean): boolean | null {\n        if (this.selectedState.selectAllChildren) {\n            if (this.selectedState.toggledNodes.size > 0) {\n                return null;\n            }\n            return true;\n        }\n\n        if (this.selectedState.toggledNodes.size > 0) {\n            return null;\n        }\n        return false;\n    }\n    selectAllRows(_params: ISelectAllParams): void {\n        this.selectedState = { selectAllChildren: true, toggledNodes: new Map() };\n        this.dispatchSelectionChanged(false);\n    }\n    deselectAllRows(_params: ISelectAllParams): void {\n        this.selectedState = { selectAllChildren: false, toggledNodes: new Map() };\n        this.dispatchSelectionChanged();\n    }\n\n    getLastSelectedId() : string | null {\n        return this.lastSelected;\n    }\n\n    getSelectedRowIds(): string[] {\n        const selectedIds: string[] = [];\n    \n        const collectSelectedIds = (state: SelectionState, path: string[]) => {\n            state.toggledNodes.forEach((childState, id) => {\n                const newPath = [...path, id];\n                \n                if (childState.toggledNodes.size > 0) {\n                    // Traverse into children if there are more toggled nodes\n                    collectSelectedIds(childState, newPath);\n                } else {\n                    // Leaf node, check if it conforms to the selection state\n                    if (childState.selectAllChildren) {\n                        selectedIds.push(id);\n                    } else if (state.selectAllChildren !== childState.selectAllChildren) {\n                        selectedIds.push(id);\n                    }\n                }\n            });\n    \n            if (state.selectAllChildren) {\n                // If all children are selected, add the current path\n                selectedIds.push(...path);\n            }\n        };\n    \n        collectSelectedIds(this.selectedState, []);\n    \n        return selectedIds;\n    }\n\n    public clearRowsCellValues(eventOrigin : HookInitiator, event : Event) : void {\n        this.rowAPI.clearRowsDataById(Array.from(this.selectedRows),{},  { eventOrigin, action : 'clear',event });\n    }\n\n    forEachSelectedRow(callback: (rowMeta: RowType) => void): void {\n        this.selectedRows.forEach((row) => {\n            const rowNode = this.recordHandler.getRowNodeById(row);\n            if(!rowNode) {\n                return;\n            }\n            const rowMeta = rowNode.getRowMeta();\n            const rowType : RowType = {\n                rowID      : row,\n                pinPosition: rowMeta.pinPosition,\n                parentKeys : rowMeta.parentKeys,\n                rowIndex   : rowMeta.rowIndex,\n            }\n            callback(rowType)\n        })\n    }\n    getSelectionType(): \"index\" | \"id\" {\n        return 'id';\n    }\n\n    getLastSelectedRow(): RowPositionType | null {\n        const rowID =  this.lastSelected;\n        if(rowID) {\n            const rowMeta = this.recordHandler.getIndexMetaById(rowID);\n            return rowMeta as RowPositionType;\n        }\n        return null;\n    }\n\n    private isMultiSelection() : boolean {\n        return this.optionsHandler.getRowSelection() === 'multiple';\n    }\n\n    private isSelectionNone() : boolean {\n        return this.optionsHandler.getRowSelection() === 'none';\n    }\n}","import { HookEventsName } from \"../Grid/Core/Hooks/Constants/HookEventsName\";\nimport { IHookManager } from \"../Grid/Core/Hooks/Interface/IHookManager\";\nimport { IRowSelectionHookWrapper, RowSelect } from \"./row-selection/row-selection.types\";\n\nexport class RowSelectionHookWrapper implements IRowSelectionHookWrapper {\n    constructor(private hookManager : IHookManager) {}\n    onRowSelect(rowSelect : RowSelect, callBack : (rowSelect : RowSelect) => void,params : any, type :  'index' | 'id') : void {\n        const hookParams = this.createRowSelectionHookParams(rowSelect,params, type);\n\n        const api = (params : any) => {\n            callBack(params);\n        }\n        const values = type === 'index' ? rowSelect.rowIndexes: rowSelect.rowIDs\n        values.length > 0 && this.hookManager.executeHook(HookEventsName.onBeforeRowSelect, HookEventsName.onAfterRowSelect, api, hookParams);\n    }\n\n    onRowDeselect(rowSelect : RowSelect, callBack : (rowSelect: RowSelect) => void,params : any, type : 'index' | 'id') : void {\n        const hookParams = this.createRowSelectionHookParams(rowSelect,params, type);\n        const api = (params : any) => {\n            callBack(params);\n        }\n        const values = type === 'index' ? rowSelect.rowIndexes: rowSelect.rowIDs\n        values.length > 0 && this.hookManager.executeHook(HookEventsName.onBeforeRowDeselect, HookEventsName.onAfterRowDeselect, api, hookParams);\n    }\n\n    private createRowSelectionHookParams(rowSelect : RowSelect,params : any, type : 'index' | 'id') : any {\n        return {\n            eventOrigin   : params.source,\n            event         : params.event,\n            selectionModel: type,\n            type          : 'rowSelection',\n            values        : type === 'index' ? rowSelect.rowIndexes: rowSelect.rowIDs\n        }\n    }\n}","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { ISelectionRangeHandler } from \"./column-selection-range-handler.types\";\nimport { RowSelectionRangeHandler } from \"./row-range-selection-handler\";\nimport { IClearRowSelection, ICommonRowSelctionParams, IRowSelectionHandler, ISelectAllParams, ISetRowSelectionsParams } from \"./row-selection-handler.types\";\nimport { HookInitiator, IRowAPIManager, IRowNode } from \"../Grid/Main\";\nimport { IHookManager } from \"../Grid/Core/Hooks/Interface/IHookManager\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { IRowSelectionHookWrapper, RowIdType, RowType } from \"./row-selection/row-selection.types\";\nimport { RowSelectionHookWrapper } from \"./row-selection-hooks\";\nimport { Events } from \"../Grid/Core/Constants/Events\";\nimport { RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\n\n@Bean('RowSelectionHandler')\nexport class RowSelection extends EventEmitter implements IRowSelectionHandler {\n    public allowSingleActionStarted  : boolean = false;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler: IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) hookManager: IHookManager;\n    @AutoWired(GRID_BEAN_NAME.ROW_API) private rowAPI: IRowAPIManager;\n    private selectedRows: string[] = [];\n    private selectionRange: ISelectionRangeHandler<IRecordHandler>;\n\n    private rowSelectionHookWrapper: IRowSelectionHookWrapper;\n    @PostConstruct()\n    init() : void {\n        this.selectionRange = new RowSelectionRangeHandler();\n        this.selectionRange.init(this.recordHandler);\n\n        this.rowSelectionHookWrapper = new RowSelectionHookWrapper(this.hookManager);\n\n        this.addDestroyFunc(() => {\n            this.rowSelectionHookWrapper = null;\n        })\n\n        const removeCallback = () => {\n            const isAllowMultipleTypeSelection = this.optionsHandler.isAllowMultipleTypeSelection();\n            if(!isAllowMultipleTypeSelection && !this.allowSingleActionStarted) {\n                this.clearSelection({\n                    source  : 'ui'\n                })\n            }\n        }\n\n        this.addListener(this.eventHandler, Events.EVENT_RANGE_SELECTION_CHANGED, removeCallback)\n\n        this.addListener(this.eventHandler, 'columnSelectionChanged', removeCallback)\n    }\n\n    public setRowSelected(params: ISetRowSelectionsParams): void {\n        if(this.isSelectionNone()) {\n            return;\n        }\n        const { values, clearSelection } = params;\n\n        const ids = values.map((meta) => meta.rowID);\n\n        if(clearSelection) {\n            this.clearSelection(params as ICommonRowSelctionParams);\n        }\n        if (ids && ids.length === 0) return;\n    \n        if (params.rangeSelect) {\n            this.handleRangeSelection(ids, params);\n            return;\n        }\n    \n        this.selectRange(ids, params.selected, params);\n        this.selectionRange.setRoot(ids[ids.length - 1]);\n        this.dispatchSelectionChanged();\n        return;\n    }\n\n    private handleRangeSelection(ids: string[], params : ISetRowSelectionsParams): void {\n        const isMultiSelection = this.isMultiSelection();\n\n        if (!isMultiSelection && ids.length > 1) {\n            console.error('Cannot select multiple rows when using rangeSelect');\n            return;\n        }\n\n        const id = ids[0];\n\n        if(!isMultiSelection) {\n\n        }else if (this.selectionRange.isInRange(id)) {\n            const partition = this.selectionRange.truncate(id);\n            this.selectRange(partition.discard, false, params);\n            this.selectRange(partition.keep, true, params);\n        } else {\n            const fromId = this.selectionRange.getRoot();\n            if (fromId && fromId !== id) {\n                const partition = this.selectionRange.extend(id);\n                this.selectRange(partition.discard, false, params);\n                this.selectRange(partition.keep, true, params);\n            } else {\n                this.selectionRange.setRoot(id);\n                this.selectRange([id], true, params);\n            }\n        }\n\n        this.dispatchSelectionChanged();\n    }\n\n    private selectRange(ids: string[], newValue: boolean, params : ISetRowSelectionsParams): void {\n\n        if (newValue) {\n            this.selectRows(ids, params);\n        } else {\n            this.deSelectRows(ids, params);\n        }\n    }\n\n    private selectRows(ids : string[], params : ISetRowSelectionsParams) : void {\n        const isMultiSelection = this.isMultiSelection();\n        if (!isMultiSelection && ids.length > 1) {\n            console.error('Multiple row selection is not allowed');\n            return;\n        }\n\n        if(!isMultiSelection) {\n            this.clearSelection(params);\n        }\n        const callBack = ({values}) => {\n            this.selectedRows.push(...values.filter(id => !this.isRowSelected({\n                rowID : id\n            })));\n            !params.rangeSelect && this.selectionRange.setRoot(ids[ids.length - 1]);\n        }\n\n        this.rowSelectionHookWrapper.onRowSelect({rowIDs : ids}, callBack, params as ICommonRowSelctionParams, 'id');\n\n    }\n\n    private deSelectRows(ids : string[], params : ISetRowSelectionsParams) : void {\n        const callBack = ({values}) => {\n            this.selectedRows = this.selectedRows.filter(id => !values.includes(id));\n            !params.rangeSelect && this.selectionRange.setRoot(ids[ids.length - 1]);\n        }\n\n        this.rowSelectionHookWrapper.onRowDeselect({rowIDs : ids}, callBack, params as ICommonRowSelctionParams, 'id');\n    }\n\n    private dispatchSelectionChanged(lastSelection : boolean = true) : void {\n        this.allowSingleActionStarted = true;\n        this.dispatchEvent({\n            type : 'rowSelectionChanged',\n            lastSelection\n        })\n        this.allowSingleActionStarted = false;\n    }\n\n    clearSelection(params : IClearRowSelection): void {\n        const callBack = () => {\n            this.selectedRows = [];\n            this.selectionRange.reset();\n            this.dispatchSelectionChanged();\n        }\n        this.rowSelectionHookWrapper.onRowDeselect({rowIDs : this.selectedRows}, callBack, params, 'id')\n    }\n\n    isRowSelected(rowMeta: RowIdType): boolean {\n        const  rowNode = this.recordHandler.getRowNodeById(rowMeta.rowID);\n        if(rowNode.getPinnedPosition() === 'topDraftRow' || rowNode.getPinnedPosition() === 'bottomDraftRow'){\n            return false;\n        }\n        const ancestor = rowNode?.getAncestors() ?? [];\n        ancestor.push(rowNode);\n\n        let isSelected = false;\n\n        for (let i = 0; i < ancestor.length; i++) {\n            const rowNode = ancestor[i];\n            if (this.selectedRows.includes(rowNode?.getId())) {\n                isSelected = true;\n                break;\n            }\n        }\n        \n        return isSelected;\n    }\n\n    getSelectedRows(): string[] {\n        return this.selectedRows;\n    }\n\n    getSelectedRowNodes(): IRowNode[] {\n        return this.selectedRows .map(columnId => this.recordHandler.getRowNodeById(columnId)) .filter(Boolean) as IRowNode[];\n    }\n\n    getSelectionCount(): number {\n        return this.selectedRows.length;\n    }\n\n    isEmpty(): boolean {\n        return this.selectedRows.length === 0;\n    }\n\n    selectAllRows(_params: ISelectAllParams): void {\n        if(this.isSelectionNone()) {\n            return;\n        }\n        const handlers = [this.recordHandler.getTopHandler(), this.recordHandler.getMiddleHandler(), this.recordHandler.getBottomHandler()];\n        const rowIds: string[] = [];\n        handlers.forEach(handler => {\n            rowIds.push(...handler.getAllRowNodes().map(rowNode => rowNode.getId()));\n        });\n\n        const callBack = ({ values }) => {\n            this.selectedRows = [];\n            this.selectedRows.push(...values);\n            if (values.length) {\n                this.selectionRange.setRoot(values[0]);\n            }\n            this.dispatchSelectionChanged(false);\n        };\n\n        this.rowSelectionHookWrapper.onRowSelect({ rowIDs: rowIds }, callBack, _params as ICommonRowSelctionParams, 'id');\n    }\n    deselectAllRows(_params: ISelectAllParams): void {\n        const callBack = () => {\n            this.selectedRows = [];\n            this.selectionRange.reset();\n            this.dispatchSelectionChanged();\n        };\n\n        this.rowSelectionHookWrapper.onRowDeselect({ rowIDs: this.selectedRows }, callBack, _params as ICommonRowSelctionParams, 'id');\n    }\n\n\n    public clearRowsCellValues(eventOrigin : HookInitiator, event : Event) : void {\n        this.rowAPI.clearRowsDataById(this.selectedRows, {}, { eventOrigin, action : 'clear', event });\n    }\n\n    getSelectedNodes(): IRowNodeCore[] {\n        throw new Error(\"Method not implemented.\");\n    }\n    public getSelectAllState( _justFiltered?: boolean | undefined, _justCurrentPage?: boolean | undefined ): boolean | null {\n        const totalCount = this.recordHandler.getTotalCount();\n        const selectedCount = this.selectedRows.length;\n        if(selectedCount <= 0) {\n            return false;\n        }\n\n        if(selectedCount > 0 && selectedCount < totalCount) {\n            return null;\n        }\n        return totalCount === selectedCount;\n    }\n\n    forEachSelectedRow(callback: (rowMeta: RowType) => void): void {\n        this.selectedRows.forEach((row) => {\n            const rowNode = this.recordHandler.getRowNodeById(row);\n            if(!rowNode) {\n                return;\n            }\n            const rowMeta = rowNode.getRowMeta();\n            const rowType : RowType = {\n                rowID      : row,\n                pinPosition: rowMeta.pinPosition,\n                parentKeys : rowMeta.parentKeys,\n                rowIndex   : rowMeta.rowIndex,\n            }\n            callback(rowType)\n        })\n    }\n\n    getSelectionType(): \"index\" | \"id\" {\n        return 'id';\n    }\n\n    getLastSelectedRow(): RowPositionType {\n        const rowID =  this.selectedRows[this.selectedRows.length - 1];\n        const rowMeta = this.recordHandler.getIndexMetaById(rowID);\n        return rowMeta as RowPositionType;\n    }\n    private isMultiSelection() : boolean {\n        return this.optionsHandler.getRowSelection() === 'multiple';\n    }\n\n    private isSelectionNone() : boolean {\n        return this.optionsHandler.getRowSelection() === 'none';\n    }\n}","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { IRowSelectionHookWrapper, RowIndexType, RowSelectionParamsType, RowType, SelectedRowRange } from \"./row-selection.types\";\nimport { GRID_BEAN_NAME } from \"../../Grid/Core/Constants/BeanName\";\nimport { areArraysEqual } from \"../../Grid/Core/utils/Object\";\nimport { GroupRowNode } from \"../../DataStore/GroupRowNode\";\nimport { IGroupedRowNodeCore } from \"../../DataStore/group-rownode.types\";\nimport { IHookManager } from \"../../Grid/Core/Hooks/Interface/IHookManager\";\nimport { RowSelectionHookWrapper } from \"../row-selection-hooks\";\nimport { IRowSelectionHandler, ISelectAllParams } from \"../row-selection-handler.types\";\nimport { IRowNodeCore } from \"../../DataStore/rownode.types\";\nimport { HookInitiator, IRowAPIManager } from \"../../Grid/Main\";\nimport { Events, ROW_REORDER_EVENT } from \"../../Grid/Core/Constants/Events\";\nimport { RowPositionType } from \"../../Grid/Core/Navigation/cell-position.types\";\nimport { IRecordHandler } from \"../../Grid/Core/Rows/RecordHandler.types\";\nimport { TreeGridRemoteDataBlock } from \"DataStore/Remote/TreeGridRemoteDataBlock\";\nimport { IFloatingRecordHandler } from \"../../Grid/FloatingRecords/Interface/IFloatingRecordHandler\";\n\n@Bean('RowSelectionHandler')\nexport class RowSelectionIndexHandler extends EventEmitter implements IRowSelectionHandler {\n    public allowSingleActionStarted : boolean = false;\n\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler: IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) private hookManager: IHookManager;\n    @AutoWired(GRID_BEAN_NAME.ROW_API) private rowAPI: IRowAPIManager;\n    @AutoWired(GRID_BEAN_NAME.FLOATING_RECORD_HANDLER) private floatingRecordHandler: IFloatingRecordHandler;\n\n\n    private selectedRanges : SelectedRowRange[]         = [];\n    private lastSelectedRange : SelectedRowRange | null = null;\n\n    private rowSelectionHookWrapper : IRowSelectionHookWrapper;\n\n    @PostConstruct()\n    init() : void {\n\n        this.rowSelectionHookWrapper = new RowSelectionHookWrapper(this.hookManager);\n\n        this.addDestroyFunc(() => {\n            this.rowSelectionHookWrapper = null;\n        })\n\n        this.addListener(this.eventHandler, ROW_REORDER_EVENT.EVENT_ROW_REORDERED, this.deselectAllRows.bind(this));\n        const removeCallback = () => {\n            const isAllowMultipleTypeSelection = this.optionsHandler.isAllowMultipleTypeSelection();\n            if(!isAllowMultipleTypeSelection && !this.allowSingleActionStarted) {\n                this.clearSelection({\n                    source  : 'ui',\n                    selected: false,\n                    values  : []\n                })\n            }\n        }\n        this.addListener(this.eventHandler, Events.EVENT_RANGE_SELECTION_CHANGED, removeCallback);\n        this.addListener(this.eventHandler, 'columnSelectionChanged', removeCallback);\n\n        this.addListener(this.eventHandler, 'EVENT_BEFORE_RECORD_REMOVED', this.deselectAllRows.bind(this));\n        this.addListener(this.eventHandler, 'EVENT_BEFORE_RECORD_INSERTED', this.deselectAllRows.bind(this));\n        this.addListener(this.eventHandler, Events.EVENT_ROW_RESETED, (params)=>{\n            params = { ...params, source : 'resetRow'};\n            this.deselectAllRows(params);\n        });\n\n    }\n    private getAbsoluteIndex(row: RowIndexType): number {\n        if(row.pinPosition === 'FloatingRecord') {\n            return this.floatingRecordHandler.getTargetIndex();\n        }\n        return this.recordHandler.getIndexByMeta(row.rowIndex, row.pinPosition, row.parentKeys);\n    }\n\n    private getMaxRange(from : RowIndexType, to : RowIndexType, value : RowIndexType) : RowIndexType {\n        return this.getAbsoluteIndex(from) > this.getAbsoluteIndex(value) ? to : from;\n    }\n\n    private rangesOverlap(range1: SelectedRowRange, range2: SelectedRowRange): boolean {\n        const range1FromIndex = Math.min(\n            this.getAbsoluteIndex(range1.from),\n            this.getAbsoluteIndex(range1.to)\n        );\n        const range1ToIndex = Math.max(\n            this.getAbsoluteIndex(range1.from),\n            this.getAbsoluteIndex(range1.to)\n        );\n    \n        const range2FromIndex = Math.min(\n            this.getAbsoluteIndex(range2.from),\n            this.getAbsoluteIndex(range2.to)\n        );\n        const range2ToIndex = Math.max(\n            this.getAbsoluteIndex(range2.from),\n            this.getAbsoluteIndex(range2.to)\n        );\n    \n        return range1FromIndex <= range2ToIndex && range1ToIndex >= range2FromIndex;\n    }\n\n    private mergeRanges(range1: SelectedRowRange, range2: SelectedRowRange): SelectedRowRange {\n        const range1FromIndex = Math.min(\n            this.getAbsoluteIndex(range1.from),\n            this.getAbsoluteIndex(range1.to)\n        );\n        const range1ToIndex = Math.max(\n            this.getAbsoluteIndex(range1.from),\n            this.getAbsoluteIndex(range1.to)\n        );\n    \n        const range2FromIndex = Math.min(\n            this.getAbsoluteIndex(range2.from),\n            this.getAbsoluteIndex(range2.to)\n        );\n        const range2ToIndex = Math.max(\n            this.getAbsoluteIndex(range2.from),\n            this.getAbsoluteIndex(range2.to)\n        );\n\n        if (range1FromIndex >= range2FromIndex && range1ToIndex <= range2ToIndex) {\n            return range2;\n        }\n    \n        return {\n            from: range1FromIndex <= range2ToIndex ? range1.from : range2.from,\n            to: range1ToIndex >= range2FromIndex ? range1.to : range2.to\n        };\n    }\n    public addRange(newRange: SelectedRowRange[], params : RowSelectionParamsType, lastSelection : boolean = true): void {\n        if(this.isSelectionNone()) {\n            return;\n        }\n        const isMultiSelection = this.isMultiSelection();\n\n        if(!isMultiSelection) {\n            this.clearSelection(params);\n        }\n        const callBack = (rowSelectParams) => {\n            let ranges = rowSelectParams.values;\n\n            if(!ranges) {\n                return;\n            }\n\n            for(let i = 0 ;i < ranges.length; i++) {\n                let range = ranges[i];\n                range = this.swapRange(range.from, range.to);\n                range = this.extendSelectionRangeToLeafEndpoints(range);\n\n                const newRanges: SelectedRowRange[] = [];\n                let mergedRange = range;\n                const deSelectRange : SelectedRowRange[] = [];\n    \n                for (const range1 of this.selectedRanges) {\n                    if (this.rangesOverlap(mergedRange, range1)) {\n                        mergedRange = this.mergeRanges(mergedRange, range1);\n                    } else {\n                        newRanges.push(range1);\n                    }\n                    deSelectRange.push(range1);\n                }\n    \n                newRanges.push(mergedRange);\n                // newRanges.sort((a, b) => this.getAbsoluteIndex(a.from) - this.getAbsoluteIndex(b.from));\n                this.selectedRanges = newRanges;\n                this.lastSelectedRange = range;\n    \n                this.updateSelectionState(deSelectRange, false);\n                this.updateSelectionState(newRanges, true);\n                this.dispatchRowSelectionEvent(lastSelection);\n            }\n        }\n\n        this.rowSelectionHookWrapper.onRowSelect({ rowIndexes : newRange }, callBack, params, 'index');\n    }\n\n    public setRowSelected(selectedParams : RowSelectionParamsType) : void {\n        const {selected, values, clearSelection, rangeSelect} = selectedParams;\n\n\n        if(clearSelection) {\n            this.clearSelection(selectedParams);\n            return;\n        }\n\n        const isMultiSelection = this.isMultiSelection();\n        for(let i = 0 ; i < values.length ; i++) {\n            const value = values[i];\n\n            if(selected) {\n                let range: SelectedRowRange;\n                if (rangeSelect) {\n                    range = isMultiSelection && this.lastSelectedRange ? this.swapRange( this.getMaxRange( this.lastSelectedRange.from, this.lastSelectedRange.to, value ), value ) : { from: value, to: value };\n                } else {\n                    range = { from: value, to: value, };\n                }\n                this.addRange([range], selectedParams);\n            }else {\n                this.deSelectRow([{ from : value, to : value }], selectedParams);\n            }\n        }\n\n        \n    }\n\n    public deSelectRow(rowRange : SelectedRowRange[], params : RowSelectionParamsType) : void {\n        const callBack = (rowSelect) => {\n            const deSelectRow = rowSelect.values;\n            for(let i = 0; i < deSelectRow.length; i++) {\n                const row = deSelectRow[i];\n                const updatedRanges: SelectedRowRange[] = [];\n                let lastSelectedRange : SelectedRowRange | null = null;\n                this.forEachRowRange((range : SelectedRowRange) => {\n                    if(this.rangesOverlap(range, row)) {\n                        const fromIndex    = this.getAbsoluteIndex(range.from);\n                        const toIndex      = this.getAbsoluteIndex(range.to);\n                        const fromRowIndex = this.getAbsoluteIndex(row.from);\n                        const toRowIndex   = this.getAbsoluteIndex(row.to);\n\n        \n                        if(fromIndex===fromRowIndex && toIndex===toRowIndex) {\n                            lastSelectedRange = null;\n                        }\n                        else if (fromRowIndex > fromIndex && toRowIndex < toIndex) {\n                            const leftTo = this.getAdjacentLeafRowMeta(row.from, -1) as RowIndexType | null;\n                            const rightFrom = this.getAdjacentLeafRowMeta(row.to, 1) as RowIndexType | null;\n\n                            if (leftTo != null) {\n                                const leftRange = { from: range.from, to: leftTo };\n                                updatedRanges.push(leftRange);\n                                if (!this.lastSelectedRange || this.areRowRangeEqual(this.lastSelectedRange, range)) {\n                                    lastSelectedRange = leftRange;\n                                }\n                            }\n                            if (rightFrom != null) {\n                                const rightRange = { from: rightFrom, to: range.to };\n                                updatedRanges.push(rightRange);\n                                if (\n                                    (!this.lastSelectedRange || this.areRowRangeEqual(this.lastSelectedRange, range)) &&\n                                    leftTo == null\n                                ) {\n                                    lastSelectedRange = rightRange;\n                                }\n                            }\n        \n                        } else if (fromRowIndex === fromIndex) {\n                            const newFrom = this.getAdjacentLeafRowMeta(row.to, 1) as RowIndexType | null;\n                            if (newFrom != null) {\n                                const updatedRange = { from: newFrom, to: range.to };\n                                if (!this.lastSelectedRange || this.areRowRangeEqual(this.lastSelectedRange, range)) {\n                                    lastSelectedRange = updatedRange;\n                                }\n                                updatedRanges.push(updatedRange);\n                            }\n                        } else if (toRowIndex === toIndex) {\n                            const newTo = this.getAdjacentLeafRowMeta(row.from, -1) as RowIndexType | null;\n                            if (newTo != null) {\n                                const updatedRange = { from: range.from, to: newTo };\n                                if (!this.lastSelectedRange || this.areRowRangeEqual(this.lastSelectedRange, range)) {\n                                    lastSelectedRange = updatedRange;\n                                }\n                                updatedRanges.push(updatedRange);\n                            }\n                        }\n                    }else {\n                        updatedRanges.push(range);\n                    }\n                })\n        \n                // updatedRanges.sort((a, b) => this.getAbsoluteIndex(a.from) - this.getAbsoluteIndex(b.from));\n                this.selectedRanges    = updatedRanges;\n                this.lastSelectedRange = lastSelectedRange;\n        \n                this.updateSelectionState(rowRange, false);\n                this.dispatchRowSelectionEvent();\n            }\n        }\n\n        this.rowSelectionHookWrapper.onRowDeselect({ rowIndexes : rowRange }, callBack, params, 'index');\n        \n    }\n\n    private dispatchRowSelectionEvent(lastSelection : boolean = true) : void {\n        this.allowSingleActionStarted = true;\n        this.dispatchEvent({\n            type: 'rowSelectionChanged',\n            lastSelection\n        })\n        this.allowSingleActionStarted = false;\n    }\n\n    public isRowSelected(row : RowType) : boolean {\n        const isFloating = row.pinPosition === 'FloatingRecord';\n\n        if(this.isDraftRowMeta(row)) {\n            return false;\n        }\n        const rowID      = isFloating ? this.floatingRecordHandler.getTargetRowId() :this.recordHandler.getId(row.rowIndex, row.pinPosition, row.parentKeys);\n        const rowNode    = this.recordHandler.getRowNodeById(rowID);\n\n        if(rowNode) {\n            const ancestorNodes = rowNode.getAncestors();\n            for(let i = ancestorNodes.length - 1 ; i >= 0; i--) {\n                const node     = ancestorNodes[i] as GroupRowNode;\n                const selected = node.getSelected();\n                if(selected === 'all') {\n                    return true;\n                }\n            }\n        }\n\n        for (const range of this.selectedRanges) {\n            if (this.rangesOverlap(range, { from: row, to: row })) {\n                return true;\n            }\n        }\n        return false; \n    }\n\n    private forEachRowRange(callBack : (range : SelectedRowRange) => void) : void {\n        for(let i = 0; i<= this.selectedRanges.length - 1; i++) {\n            callBack(this.selectedRanges[i]);\n        }\n    }\n\n    public clearSelection(params :RowSelectionParamsType) : void {\n        this.deSelectRow(this.selectedRanges, params)\n        this.lastSelectedRange     = null;\n    }\n\n    public getLastSelectedRange() : SelectedRowRange {\n        return this.lastSelectedRange;\n    }\n\n    private swapRange(from : RowIndexType, to : RowIndexType) : SelectedRowRange {\n        const fromIndex = this.getAbsoluteIndex(from);\n        const toIndex = this.getAbsoluteIndex(to);\n        return {\n            from : fromIndex < toIndex ? from : to,\n            to : fromIndex > toIndex ? from : to\n        }\n    }\n\n    private areRowRangeEqual(from: SelectedRowRange, to: SelectedRowRange): boolean {\n        if(!from || !to) {\n            return false;\n        }\n        return (\n            this.areRowsEqual(from.from, to.from) &&\n            this.areRowsEqual(from.to, to.to)\n        );\n    }\n    \n    private areRowsEqual(row1: RowIndexType, row2: RowIndexType): boolean {\n        return (\n            row1.rowIndex === row2.rowIndex &&\n            row1.pinPosition === row2.pinPosition &&\n            areArraysEqual(row1.parentKeys, row2.parentKeys)\n        );\n    }\n\n    private isDraftRowMeta(row: RowIndexType): boolean {\n        return row.pinPosition === 'topDraftRow' || row.pinPosition === 'bottomDraftRow';\n    }\n\n    private getAdjacentLeafRowMeta(row: RowIndexType, direction: -1 | 1): RowIndexType | null {\n        let step = this.recordHandler.getRelativeRowMeta(row, direction) as RowIndexType | null;\n        while (step != null) {\n            if (!this.isGroupRowMeta(step)) {\n                return step;\n            }\n            step = this.recordHandler.getRelativeRowMeta(step, direction) as RowIndexType | null;\n        }\n        return null;\n    }\n\n    private isGroupRowMeta(row: RowIndexType): boolean {\n        if (row.pinPosition === 'FloatingRecord') {\n            return false;\n        }\n\n        if (this.isDraftRowMeta(row)) {\n            return true;\n        }\n        const node = this.recordHandler.getRowNodeByMeta(row);\n        return Boolean(node?.isGroupRow());\n    }\n\n    private getLastDescendantRowMetaForGroupHeader(groupMeta: RowIndexType): RowIndexType | null {\n        if (groupMeta.pinPosition !== 'middle') {\n            return null;\n        }\n        const mh = this.recordHandler.getMiddleHandler() as TreeGridRemoteDataBlock;\n        if (typeof mh.getLastRowInGroup !== 'function' || typeof mh.getIdByIndex !== 'function') {\n            return null;\n        }\n        const groupNode = this.recordHandler.getRowNodeByMeta(groupMeta);\n        const id =\n            groupNode?.getId?.() ??\n            this.recordHandler.getId(groupMeta.rowIndex, groupMeta.pinPosition, groupMeta.parentKeys);\n        if (id == null || id === '') {\n            return null;\n        }\n        const lastFlatIndex = mh.getLastRowInGroup(id, true);\n        if (lastFlatIndex == null || lastFlatIndex < 0) {\n            return null;\n        }\n        const lastRowId = mh.getIdByIndex(lastFlatIndex);\n        if (!lastRowId) {\n            return null;\n        }\n        const rowNode = this.recordHandler.getRowNodeById(lastRowId);\n        const meta = rowNode?.getRowMeta?.() as RowIndexType | undefined;\n        return meta ?? null;\n    }\n\n    /** Snap group (and other non-leaf) endpoints to leaf/draft rows so selection matches deSelectRow / tree semantics. */\n    private extendSelectionRangeToLeafEndpoints(range: SelectedRowRange): SelectedRowRange {\n        let { from, to } = range;\n        const fromAbs = this.getAbsoluteIndex(from);\n        const toAbs = this.getAbsoluteIndex(to);\n        const lowAbs = Math.min(fromAbs, toAbs);\n        const highAbs = Math.max(fromAbs, toAbs);\n\n        if (lowAbs === highAbs && this.isGroupRowMeta(from)) {\n            const leaf = this.getAdjacentLeafRowMeta(from, 1);\n            if (leaf != null) {\n                return { from: leaf, to: leaf };\n            }\n            return range;\n        }\n\n        let lowMeta = fromAbs <= toAbs ? from : to;\n        let highMeta = fromAbs <= toAbs ? to : from;\n\n        if (this.isGroupRowMeta(lowMeta)) {\n            const nextLeaf = this.getAdjacentLeafRowMeta(lowMeta, 1);\n            if (nextLeaf != null) {\n                const na = this.getAbsoluteIndex(nextLeaf);\n                if (na <= highAbs) {\n                    lowMeta = nextLeaf;\n                }\n            }\n        }\n\n        if (this.isGroupRowMeta(highMeta)) {\n            if (this.isGroupRowMeta(highMeta)) {\n                const lastInSubtree = this.getLastDescendantRowMetaForGroupHeader(highMeta);\n                if (lastInSubtree != null) {\n                    const la = this.getAbsoluteIndex(lastInSubtree);\n                    const newLowAbs = this.getAbsoluteIndex(lowMeta);\n                    // Last row in subtree is after the group header in flat order (la > highAbs), not <=.\n                    if (la >= newLowAbs) {\n                        highMeta = lastInSubtree;\n                    }\n                }\n            } else {\n                const prevLeaf = this.getAdjacentLeafRowMeta(highMeta, -1);\n                if (prevLeaf != null) {\n                    const pa = this.getAbsoluteIndex(prevLeaf);\n                    const newLowAbs = this.getAbsoluteIndex(lowMeta);\n                    if (pa >= newLowAbs && pa <= highAbs) {\n                        highMeta = prevLeaf;\n                    }\n                }\n            }\n        }\n\n        return this.swapRange(lowMeta, highMeta);\n    }\n\n    private updateSelectionState(ranges : SelectedRowRange[], value : boolean) : void {\n        for(let i = 0 ;i< ranges.length ;i++) {\n            const selectedRow = ranges[i];\n            this.updateSelectionStateForRange(selectedRow.from, selectedRow.to, value);\n        }\n    }\n\n    private updateSelectionStateForRange(from: RowIndexType, to: RowIndexType, value : boolean): void { \n\n        const isSameGroup = areArraysEqual(from.parentKeys, to.parentKeys);\n\n        const ranges = this.splitRangeToPinPosition(from, to);\n\n        if(isSameGroup) {\n            for(let i = 0; i < ranges.length; i++) {\n                const {from : actualFrom, to : actualTo} = ranges[i];\n                const fromParentNode = this.getRootNode(actualFrom);\n                const selectedCount  = actualTo.rowIndex - actualFrom.rowIndex + 1;\n                const diff = value ? 1 :  -1\n                fromParentNode.updateSelectedCount(diff * selectedCount);\n            }\n            \n            return;\n        }\n\n        this.iterateSelectedRange(from, to, value);\n    }\n\n    private splitRangeToPinPosition(from: RowIndexType, to: RowIndexType): SelectedRowRange[] {\n        if (from.pinPosition === to.pinPosition) {\n            return [{ from, to }];\n        }\n    \n        const topHandler = this.recordHandler.getTopHandler();\n        const middleHandler = this.recordHandler.getMiddleHandler();\n        const bottomHandler = this.recordHandler.getBottomHandler();\n    \n        const selectedRanges: SelectedRowRange[] = [];\n    \n        const createRange = (start: RowIndexType, end: RowIndexType): SelectedRowRange => ({\n            from: start,\n            to: end,\n        });\n    \n        if (from.pinPosition === 'top') {\n            const topLastMeta = topHandler.getLastRowMeta();\n            selectedRanges.push(createRange(from, topLastMeta as RowIndexType));\n    \n            from = middleHandler.getFirstRowMeta() as RowIndexType; \n        }\n    \n        if (to.pinPosition === 'bottom') {\n            const lastMiddleMeta = middleHandler.getLastRowMeta();\n            selectedRanges.push(createRange(from, lastMiddleMeta as RowIndexType));\n    \n            from = bottomHandler.getFirstRowMeta() as RowIndexType; \n            selectedRanges.push(createRange(from, to));\n        } else {\n            selectedRanges.push(createRange(from, to));\n        }\n    \n        return selectedRanges;\n    }\n    \n\n    private iterateSelectedRange(from: RowIndexType, to:RowIndexType, value : boolean) : void {\n        const hasFullTreeStructure = this.optionsHandler.hasFullTreeStructureProvided();\n        if(hasFullTreeStructure) {\n            return;\n        }\n        const fromParentNode = this.findParentNodeByMeta(from);\n        const toParentNode   = this.findParentNodeByMeta(to);\n\n        let   currentRowMeta = this.findNodeMeta(fromParentNode);\n        const toRowMeta      = this.findNodeMeta(toParentNode);\n\n        const fromRowMeta = this.findNodeMeta(fromParentNode);\n\n        while (currentRowMeta && (currentRowMeta.rowIndex <= toRowMeta.rowIndex)) {\n\n            if(this.areRowsEqual(currentRowMeta, fromRowMeta)) {\n                this.handleGroupSelection(currentRowMeta, value, from, to, 'from');\n            }else if(this.areRowsEqual(currentRowMeta, toRowMeta)) {\n                this.handleGroupSelection(currentRowMeta, value, from, to, 'to');\n            }else {\n                this.handleGroupSelection(currentRowMeta, value, from, to, 'intermediate');\n\n            }\n\n            currentRowMeta = this.getNextGroupMeta(currentRowMeta);\n        }\n\n\n\n\n    }\n\n    private handleGroupSelection(rowMeta: RowIndexType, value : boolean, from : RowIndexType, to : RowIndexType, type : \"from\" | \"to\" | \"intermediate\"): void {\n        if(type === 'from' || type === 'to') {\n            const row            = type === 'from' ? from : to\n            const rowID          = this.recordHandler.getId(rowMeta.rowIndex, rowMeta.pinPosition, rowMeta.parentKeys);\n            const rowNode        = this.recordHandler.getRowNodeById(rowID);\n            const directChildren = rowNode.getDirectChildrenCount();\n            const count          = type === 'to' ? row.rowIndex + 1 :directChildren - row.rowIndex;\n            const diff           = value ? 1 :  -1\n\n            rowNode.updateSelectedCount(diff * count);\n        }else {\n\n        }\n    }\n    \n    private getNextGroupMeta(currentMeta: RowIndexType): RowIndexType | null {\n        const parentNode = this.findParentNodeByMeta(currentMeta);\n        const directChildCount = parentNode.getDirectChildrenCount();\n        currentMeta.rowIndex++;\n        return  currentMeta.rowIndex < directChildCount ? currentMeta : null;\n\n    }\n\n    private findParentNodeByMeta(row : RowIndexType) : IGroupedRowNodeCore {\n        const rowID = this.recordHandler.getId(row.rowIndex, row.pinPosition, row.parentKeys);\n        const rowNode = this.recordHandler.getRowNodeById(rowID);\n\n        return rowNode.getParentNode();\n    }\n\n    private getRootNode(row : RowIndexType) : IGroupedRowNodeCore {\n        switch(row.pinPosition) {\n            case 'top':\n                return this.recordHandler.getTopHandler().getRootNode();\n            case 'bottom':\n                return this.recordHandler.getBottomHandler().getRootNode();\n            default:\n                return this.recordHandler.getMiddleHandler().getRootNode();\n        }\n    }\n\n    private findNodeMeta(rowNode : IGroupedRowNodeCore) : RowIndexType {\n        return rowNode.getRowMeta() as RowIndexType;\n    }\n\n    public getSelectAllState(): boolean | null {\n        const fullTreeStructure = this.optionsHandler.hasFullTreeStructureProvided();\n        if(fullTreeStructure) {\n            let count = 0;\n            const middleHandler  = this.recordHandler.getMiddleHandler() as TreeGridRemoteDataBlock;\n            const selectedRows   = this.getSelectedRows();\n            const firstIndexMeta = middleHandler.getFirstLeafRowMeta(false);\n            const lastIndexMeta  = middleHandler.getLastLeafRowMeta(false);\n            selectedRows.forEach((row) => {\n                const isSameGroup = areArraysEqual(row.from.parentKeys, row.to.parentKeys) && row.from.pinPosition === row.to.pinPosition;\n                if (isSameGroup) {\n                    count += Math.abs(row.to.rowIndex - row.from.rowIndex) + 1;\n                } else {\n                    count += middleHandler.getLeafChildCountIncludingCollapsed(row.from, row.to);\n                }\n            })\n            \n            const totalCount = middleHandler.getLeafChildCountIncludingCollapsed(firstIndexMeta, lastIndexMeta);\n            if (count === 0) {\n                return false; \n            }\n            if (count === totalCount) {\n                return true; \n            }\n            return null; \n        }\n        const topHandler = this.recordHandler.getTopHandler();\n        const middleHandler = this.recordHandler.getMiddleHandler() as any;\n        const bottomHandler = this.recordHandler.getBottomHandler();\n    \n        const topHasRows = topHandler.getRowCount() > 0;\n        const bottomHasRows = bottomHandler.getRowCount() > 0;\n    \n        const topSelected = topHasRows ? topHandler.getRootNode().getSelected() : null;\n        const middleSelected = middleHandler.getRootNode().getSelected();\n        const bottomSelected = bottomHasRows ? bottomHandler.getRootNode().getSelected() : null;\n    \n        const selectedStates = [topSelected, middleSelected, bottomSelected].filter(\n            (state) => state !== null\n        );\n    \n        if (selectedStates.every((state) => state === 'all')) {\n            return true;\n        }\n    \n        if (selectedStates.every((state) => state === 'none')) {\n            return false;\n        }\n    \n\n        return null;\n    }\n    \n    \n\n    getSelectedNodes(): IRowNodeCore[] {\n        return [];\n    }\n    getSelectedRows(): SelectedRowRange[] {\n        return this.selectedRanges;\n    }\n    getSelectionCount(): number {\n        let count = 0;\n    \n        for (let i = 0; i < this.selectedRanges.length; i++) {\n            const { from, to } = this.selectedRanges[i];\n    \n            const splittedRanges = this.splitRangeToPinPosition(from, to);\n    \n            for (let j = 0; j < splittedRanges.length; j++) {\n                const {from : splitFrom, to : splitTo} = splittedRanges[j];\n    \n                const absoluteFromRowIndex = this.recordHandler.getIndexByMeta( splitFrom.rowIndex, splitFrom.pinPosition, splitFrom.parentKeys );\n    \n                const absoluteToRowIndex = this.recordHandler.getIndexByMeta( splitTo.rowIndex, splitTo.pinPosition, splitTo.parentKeys );\n                count += Math.abs(absoluteToRowIndex - absoluteFromRowIndex) + 1;\n            }\n        }\n    \n        return count;\n    }\n    \n    isEmpty(): boolean {\n        return this.selectedRanges.length === 0;\n    }\n    selectAllRows(params: ISelectAllParams): void {\n        const hasFullTreeStructure = this.optionsHandler.hasFullTreeStructureProvided();\n        const firstIndexMeta = !hasFullTreeStructure ? this.recordHandler.getFirstIndexMeta() : this.recordHandler.getFirstLeafRowMeta(false);\n        const lastIndexMeta = !hasFullTreeStructure ? this.recordHandler.getLastIndexMeta() : this.recordHandler.getLastLeafRowMeta(false);\n\n        this.addRange([{ from : firstIndexMeta as RowIndexType, to : lastIndexMeta as RowIndexType }], params as any, false)\n\n    }\n    deselectAllRows(params: ISelectAllParams): void {\n        this.clearSelection(params as any);\n    }\n    clearRowsCellValues(eventOrigin: HookInitiator, event : Event): void {\n        const dataRowRanges  = [];\n        this.selectedRanges.forEach((range) => {\n            const sequenceRowNodes = this.recordHandler.getSequenceRowNodes(range.from, range.to);\n            sequenceRowNodes.forEach((node) => {\n                const rowMeta = node.getRowMeta();\n                dataRowRanges.push(rowMeta)\n            })\n        })\n\n        this.rowAPI.clearRowsData(dataRowRanges, {}, { eventOrigin, action : 'clear', event });\n    }\n\n    forEachSelectedRow(callback: (rowMeta: RowType) => void): void {\n        this.selectedRanges.forEach((row) => {\n            const sequenceRowNodes = this.recordHandler.getSequenceRowNodes(row.from, row.to);\n            sequenceRowNodes.forEach((node) => {\n                const rowMeta = node.getRowMeta();\n                const rowType : RowType = {\n                    rowID      : node.getId(),\n                    pinPosition: rowMeta.pinPosition,\n                    parentKeys : rowMeta.parentKeys,\n                    rowIndex   : rowMeta.rowIndex,\n                }\n                callback(rowType)\n\n            })\n        })\n    }\n\n    getSelectionType(): \"index\" | \"id\" {\n        return 'index';\n    }\n\n    getLastSelectedRow(): RowPositionType {\n            const lastSelectedRange = this.lastSelectedRange;\n            if(lastSelectedRange) {\n                return lastSelectedRange.to;\n            }\n            return null;\n        }\n\n    private isMultiSelection() : boolean {\n        return this.optionsHandler.getRowSelection() === 'multiple';\n    }\n\n    private isSelectionNone() : boolean {\n        return this.optionsHandler.getRowSelection() === 'none';\n    }\n}","\n\n\n\n\n// import { Bean, PostConstruct } from '@dg/corecomponent';\n// import { GRID_BEAN_NAME } from './../Grid/Core/Constants/BeanName';\nimport { DateTime, Duration } from 'luxon';\nimport { IDateUtils, IDateTimeBreakdown, DurationOptions, DurationUnit } from './IDateUtils';\nimport { GANTT_BEAN_NAME } from '../GanttModelClasses/Constant/GanttBeanNameConstant';\nimport { Bean, PostConstruct, AutoWired, BEAN_NAME } from '@dg/corecomponent';\nimport { IGanttOptionsHandler } from '../GanttModelClasses/Core/OptionsHandler/IGanttOptionsHandler';\n\n\n@Bean(GANTT_BEAN_NAME.DATE_UTILS)\nexport class DateUtils implements IDateUtils{\n    private timezone: string | null = null; // IANA timezone string or null for system timezone\n    \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler?: IGanttOptionsHandler;\n\n    /**\n     * Initialize timezone from configuration after bean is created\n     */\n    @PostConstruct()\n    init(): void {\n        if (this.optionHandler) {\n            const timezone = this.optionHandler.getTimezone();\n            if (timezone !== null) {\n                this.setTimezone(timezone);\n            }\n        }\n    }\n\n    /**\n     * Set the timezone for all date operations\n     * @param timezone - IANA timezone string (e.g., 'America/New_York', 'Europe/London') or 'system' for system timezone\n     */\n    setTimezone(timezone: string | null): void {\n        if (timezone === 'system' || timezone === null) {\n            this.timezone = null;\n        } else {\n            this.timezone = timezone;\n        }\n    }\n\n    /**\n     * Get the current timezone setting\n     * @returns IANA timezone string or null for system timezone\n     */\n    getTimezone(): string | null {\n        return this.timezone;\n    }\n\n    /**\n     * Apply timezone to a DateTime object\n     * @param dt - DateTime object to apply timezone to\n     * @returns DateTime object with timezone applied\n     */\n    private applyTimezone(dt: DateTime): DateTime {\n        if (this.timezone && dt.isValid) {\n            return dt.setZone(this.timezone);\n        }\n        return dt;\n    }\n   \n     parseDate(date: string | number | Date | DateTime, format?: string): DateTime {\n        let result: DateTime;\n\n        // 1. Already a DateTime\n        if (DateTime.isDateTime(date)) {\n            result = date as DateTime;\n        }\n        // 2. Luxon-like plain object (e.g., JSON deserialized)\n        else if (typeof date === \"object\" && date !== null) {\n            const anyDate = date as any;\n\n            if (anyDate.isLuxonDateTime && typeof anyDate.ts === \"number\") {\n                result = DateTime.fromMillis(anyDate.ts);\n            }\n            // If it's a real JS Date\n            else if (date instanceof Date) {\n                result = DateTime.fromJSDate(date);\n            } else {\n                throw new Error(\"Invalid date format provided\");\n            }\n        }\n        // 3. Number → treat as timestamp (ms)\n        else if (typeof date === \"number\") {\n            result = DateTime.fromMillis(date);\n        }\n        // 4. String handling\n        else if (typeof date === \"string\") {\n            // 4a. If numeric string → timestamp\n            if (/^\\d+$/.test(date)) {\n                result = DateTime.fromMillis(Number(date));\n            }\n            // 4b. If custom format provided\n            else if (format) {\n                result = DateTime.fromFormat(date, format);\n            }\n            // 4c. Default to ISO\n            else {\n                result = DateTime.fromISO(date);\n            }\n        } else {\n            throw new Error(\"Invalid date format provided\");\n        }\n\n        // Apply timezone if configured\n        return this.applyTimezone(result);\n    }\n\n\n\n     /**\n     * Calculate the number of days between two dates\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @param inclusive - Whether to include both start and end dates in the count (default: false)\n     * @returns Number of days between the dates\n     */\n    daysBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime, inclusive: boolean = false): number {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        const daysDiff = Math.abs(end.diff(start, 'days').days);\n        \n        if (inclusive) {\n            return daysDiff + 1; // Add 1 to include both start and end dates\n        }\n        \n        return daysDiff;\n    }\n\n    /**\n     * Check if the first date is before the second date\n     * @param date1 - First date to compare\n     * @param date2 - Second date to compare against\n     * @returns True if date1 is before date2\n     */\n      isBefore(date1: string | Date | DateTime, date2: string | Date | DateTime): boolean {\n        const firstDate = this.parseDate(date1);\n        const secondDate = this.parseDate(date2);\n        \n        if (!firstDate.isValid || !secondDate.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        return firstDate < secondDate;\n    }\n\n    /**\n     * Check if the first date is after the second date\n     * @param date1 - First date to compare\n     * @param date2 - Second date to compare against\n     * @returns True if date1 is after date2\n     */\n      isAfter(date1: string | Date | DateTime, date2: string | Date | DateTime): boolean {\n        const firstDate = this.parseDate(date1);\n        const secondDate = this.parseDate(date2);\n        \n        if (!firstDate.isValid || !secondDate.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        return firstDate > secondDate;\n    }\n\n    /**\n     * Check if two dates are equal (ignoring time)\n     * @param date1 - First date to compare\n     * @param date2 - Second date to compare\n     * @returns True if dates are equal\n     */\n      isEqual(date1: string | Date | DateTime, date2: string | Date | DateTime): boolean {\n        const firstDate = this.parseDate(date1);\n        const secondDate = this.parseDate(date2);\n        \n        if (!firstDate.isValid || !secondDate.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        return firstDate.hasSame(secondDate, 'day');\n    }\n\n    /**\n     * Add days to a date\n     * @param date - Base date\n     * @param days - Number of days to add (can be negative)\n     * @returns New DateTime object\n     */\n      addDays(date: string | Date | DateTime, days: number): DateTime {\n        const baseDate = this.parseDate(date);\n        \n        if (!baseDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return baseDate.plus({ days });\n    }\n\n    /**\n     * Add weeks to a date\n     */\n    addWeeks(date: string | Date | DateTime, weeks: number): DateTime {\n        const baseDate = this.parseDate(date);\n        \n        if (!baseDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return baseDate.plus({ weeks });\n    }\n\n    /**\n     * Add months to a date\n     */\n    addMonths(date: string | Date | DateTime, months: number): DateTime {\n        const baseDate = this.parseDate(date);\n        \n        if (!baseDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return baseDate.plus({ months });\n    }\n\n    /**\n     * Add years to a date\n     */\n    addYears(date: string | Date | DateTime, years: number): DateTime {\n        const baseDate = this.parseDate(date);\n        \n        if (!baseDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return baseDate.plus({ years });\n    }\n\n    /**\n     * Subtract days from a date\n     * @param date - Base date\n     * @param days - Number of days to subtract\n     * @returns New DateTime object\n     */\n      subtractDays(date: string | Date | DateTime, days: number): DateTime {\n        return this.addDays(date, -days);\n    }\n\n    /**\n     * Add weeks to a date and return native JS Date\n     */\n    addWeeksAsDate(date: string | Date | DateTime, weeks: number): Date {\n        return this.addWeeks(date, weeks).toJSDate();\n    }\n\n    /**\n     * Add months to a date and return native JS Date\n     */\n    addMonthsAsDate(date: string | Date | DateTime, months: number): Date {\n        return this.addMonths(date, months).toJSDate();\n    }\n\n    /**\n     * Add years to a date and return native JS Date\n     */\n    addYearsAsDate(date: string | Date | DateTime, years: number): Date {\n        return this.addYears(date, years).toJSDate();\n    }\n\n    /**\n     * Get the start of day for a given date\n     * @param date - Date to get start of day for\n     * @returns DateTime at start of day (00:00:00)\n     */\n      startOfDay(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.startOf('day');\n    }\n\n    /**\n     * Get the end of day for a given date\n     * @param date - Date to get end of day for\n     * @returns DateTime at end of day (23:59:59.999)\n     */\n      endOfDay(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.endOf('day');\n    }\n\n    /**\n     * Format a date to a specific format\n     * @param date - Date to format\n     * @param format - Format string (e.g., 'yyyy-MM-dd', 'dd/MM/yyyy')\n     * @returns Formatted date string\n     */\n      formatDate(date: string | Date | DateTime, format: string): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.toFormat(format);\n    }\n\n    /**\n     * Get current date and time\n     * @returns Current DateTime with timezone applied\n     */\n      now(): DateTime {\n        let dt = DateTime.now();\n        return this.applyTimezone(dt);\n    }\n\n    /**\n     * Get current date (start of day)\n     * @returns Current date at start of day with timezone applied\n     */\n      today(): DateTime {\n        let dt = DateTime.now().startOf('day');\n        return this.applyTimezone(dt);\n    }\n\n    /**\n     * Check if a date is today\n     * @param date - Date to check\n     * @returns True if the date is today\n     */\n      isToday(date: string | Date | DateTime): boolean {\n        const parsedDate = this.parseDate(date);\n        const today = this.today();\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.hasSame(today, 'day');\n    }\n\n    /**\n     * Check if a date is in the past\n     * @param date - Date to check\n     * @returns True if the date is in the past\n     */\n      isPast(date: string | Date | DateTime): boolean {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate < DateTime.now();\n    }\n\n    /**\n     * Check if a date is in the future\n     * @param date - Date to check\n     * @returns True if the date is in the future\n     */\n      isFuture(date: string | Date | DateTime): boolean {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate > DateTime.now();\n    }\n\n    /**\n     * Get the difference between two dates in various units\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @param unit - Unit of measurement ('days', 'hours', 'minutes', 'seconds', 'milliseconds')\n     * @returns Duration object\n     */\n      getDifference(startDate: string | Date | DateTime, endDate: string | Date | DateTime, unit: 'days' | 'hours' | 'minutes' | 'seconds' | 'milliseconds' = 'days'): Duration {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        return end.diff(start, unit);\n    }\n\n    /**\n     * Check if a date falls within a date range (inclusive)\n     * @param date - Date to check\n     * @param startDate - Range start date\n     * @param endDate - Range end date\n     * @returns True if date is within the range\n     */\n      isInRange(date: string | Date | DateTime, startDate: string | Date | DateTime, endDate: string | Date | DateTime): boolean {\n        const checkDate = this.parseDate(date);\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!checkDate.isValid || !start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        return checkDate >= start && checkDate <= end;\n    }\n\n    /**\n     * Convert DateTime to JavaScript Date object\n     * @param date - DateTime to convert\n     * @returns JavaScript Date object\n     */\n      toJSDate(date: string | Date | DateTime): Date {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.toJSDate();\n    }\n\n    /**\n     * Parse Luxon DateTime to native JS Date\n     * @param dateTime - Luxon DateTime instance\n     * @returns JavaScript Date object\n     */\n     parseDateTimeToJSDate(dateTime: DateTime): Date {\n        if (!DateTime.isDateTime(dateTime)) {\n            throw new Error('Input must be a Luxon DateTime');\n        }\n        if (!dateTime.isValid) {\n            throw new Error('Invalid DateTime provided');\n        }\n        return dateTime.toJSDate();\n    }\n\n    /**\n     * Convert DateTime to ISO string\n     * @param date - DateTime to convert\n     * @returns ISO string representation\n     */\n    toISOString(date: string | Date | DateTime): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.toISO();\n    }\n\n    /**\n     * Generate an array of dates between two given dates (inclusive)\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of dates between start and end dates\n     */\n    getDateRange(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string): (DateTime | string)[] {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        const dates: (DateTime | string)[] = [];\n        let currentDate = start.startOf('day');\n        const endOfRange = end.startOf('day');\n        \n        // Ensure we iterate in the correct direction\n        const step = currentDate <= endOfRange ? 1 : -1;\n        \n        while (currentDate <= endOfRange || currentDate >= endOfRange) {\n            if (format) {\n                dates.push(currentDate.toFormat(format));\n            } else {\n                dates.push(currentDate);\n            }\n            \n            currentDate = currentDate.plus({ days: step });\n            \n            // Break if we've gone past the end date\n            if (step > 0 && currentDate > endOfRange) {\n                break;\n            }\n            if (step < 0 && currentDate < endOfRange) {\n                break;\n            }\n        }\n        \n        return dates;\n    }\n\n    /**\n     * Generate an array of dates between two given dates (inclusive) as DateTime objects\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @returns Array of DateTime objects between start and end dates\n     */\n    getDateRangeAsDateTime(startDate: string | Date | DateTime, endDate: string | Date | DateTime): DateTime[] {\n        return this.getDateRange(startDate, endDate) as DateTime[];\n    }\n\n    /**\n     * Generate an array of dates between two given dates (inclusive) as formatted strings\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @param format - Format string for the returned dates (default: 'yyyy-MM-dd')\n     * @returns Array of formatted date strings between start and end dates\n     */\n    getDateRangeAsStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: string = 'yyyy-MM-dd'): string[] {\n        return this.getDateRange(startDate, endDate, format) as string[];\n    }\n\n    /**\n     * Generate an array of dates between two given dates (inclusive) as JavaScript Date objects\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @returns Array of JavaScript Date objects between start and end dates\n     */\n    getDateRangeAsJSDate(startDate: string | Date | DateTime, endDate: string | Date | DateTime): Date[] {\n        const dateTimes = this.getDateRangeAsDateTime(startDate, endDate);\n        return dateTimes.map(dateTime => dateTime.toJSDate());\n    }\n\n    /**\n     * Get the total number of days in the month from the given date\n     * @param date - Date to get the month from\n     * @returns Number of days in the month\n     */\n    getDaysInMonth(date: string | Date | DateTime): number {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.daysInMonth;\n    }\n\n    /**\n     * Get the total number of days in the month from the given year and month\n     * @param year - Year\n     * @param month - Month (1-12)\n     * @returns Number of days in the month\n     */\n    getDaysInMonthByYearMonth(year: number, month: number): number {\n        if (month < 1 || month > 12) {\n            throw new Error('Month must be between 1 and 12');\n        }\n        \n        if (year < 1) {\n            throw new Error('Year must be a positive number');\n        }\n        \n        const date = DateTime.fromObject({ year, month, day: 1 });\n        \n        if (!date.isValid) {\n            throw new Error('Invalid year or month provided');\n        }\n        \n        return date.daysInMonth;\n    }\n\n    /**\n     * Check if the given year is a leap year\n     * @param year - Year to check\n     * @returns True if the year is a leap year\n     */\n    isLeapYear(year: number): boolean {\n        if (year < 1) {\n            throw new Error('Year must be a positive number');\n        }\n        \n        const date = DateTime.fromObject({ year, month: 2, day: 1 });\n        \n        if (!date.isValid) {\n            throw new Error('Invalid year provided');\n        }\n        \n        return date.daysInMonth === 29;\n    }\n\n    /**\n     * Get the first day of the month from the given date\n     * @param date - Date to get the first day of month from\n     * @returns DateTime object representing the first day of the month\n     */\n    getFirstDayOfMonth(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.startOf('month');\n    }\n\n    /**\n     * Get the last day of the month from the given date\n     * @param date - Date to get the last day of month from\n     * @returns DateTime object representing the last day of the month\n     */\n    getLastDayOfMonth(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.endOf('month');\n    }\n\n    /**\n     * Get all days of the month from the given date\n     * @param date - Date to get the month from\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of all days in the month\n     */\n    getAllDaysInMonth(date: string | Date | DateTime, format?: string): (DateTime | string)[] {\n        const firstDay = this.getFirstDayOfMonth(date);\n        const lastDay = this.getLastDayOfMonth(date);\n        \n        return this.getDateRange(firstDay, lastDay, format);\n    }\n\n    /**\n     * Get all days of the month from the given date as DateTime objects\n     * @param date - Date to get the month from\n     * @returns Array of DateTime objects for all days in the month\n     */\n    getAllDaysInMonthAsDateTime(date: string | Date | DateTime): DateTime[] {\n        return this.getAllDaysInMonth(date) as DateTime[];\n    }\n\n    /**\n     * Get all days of the month from the given date as formatted strings\n     * @param date - Date to get the month from\n     * @param format - Format string for the returned dates (default: 'yyyy-MM-dd')\n     * @returns Array of formatted date strings for all days in the month\n     */\n    getAllDaysInMonthAsStrings(date: string | Date | DateTime, format: string = 'yyyy-MM-dd'): string[] {\n        return this.getAllDaysInMonth(date, format) as string[];\n    }\n\n    /**\n     * Get array of indices representing weekends (Saturday and Sunday) for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of numbers representing the indices of weekend days (0-based)\n     */\n    getWeekendIndices(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        const weekendIndices: number[] = [];\n        \n        dateRange.forEach((date, index) => {\n            // Luxon uses 1-7 for weekdays (1=Monday, 7=Sunday)\n            // Saturday = 6, Sunday = 7\n            if (date.weekday === 6 || date.weekday === 7) {\n                weekendIndices.push(index);\n            }\n        });\n        \n        return weekendIndices;\n    }\n\n    /**\n     * Get array of indices representing weekdays (Monday to Friday) for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of numbers representing the indices of weekday days (0-based)\n     */\n    getWeekdayIndices(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        const weekdayIndices: number[] = [];\n        \n        dateRange.forEach((date, index) => {\n            // Luxon uses 1-7 for weekdays (1=Monday, 7=Sunday)\n            // Weekdays = 1-5 (Monday to Friday)\n            if (date.weekday >= 1 && date.weekday <= 5) {\n                weekdayIndices.push(index);\n            }\n        });\n        \n        return weekdayIndices;\n    }\n\n    /**\n     * Get array of indices representing specific weekdays for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param weekdays - Array of weekday numbers (1=Monday, 2=Tuesday, ..., 7=Sunday)\n     * @returns Array of numbers representing the indices of specified weekdays (0-based)\n     */\n    getSpecificWeekdayIndices(startDate: string | Date | DateTime, endDate: string | Date | DateTime, weekdays: number[]): number[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        const specificWeekdayIndices: number[] = [];\n        \n        // Validate weekday numbers\n        const validWeekdays = weekdays.filter(day => day >= 1 && day <= 7);\n        if (validWeekdays.length === 0) {\n            throw new Error('At least one valid weekday (1-7) must be provided');\n        }\n        \n        dateRange.forEach((date, index) => {\n            if (validWeekdays.includes(date.weekday)) {\n                specificWeekdayIndices.push(index);\n            }\n        });\n        \n        return specificWeekdayIndices;\n    }\n\n    /**\n     * Check if a specific date is a weekend\n     * @param date - Date to check\n     * @returns True if the date is Saturday or Sunday\n     */\n    isWeekend(date: string | Date | DateTime): boolean {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        // Luxon uses 1-7 for weekdays (1=Monday, 7=Sunday)\n        // Saturday = 6, Sunday = 7\n        return parsedDate.weekday === 6 || parsedDate.weekday === 7;\n    }\n\n    /**\n     * Check if a specific date is a weekday\n     * @param date - Date to check\n     * @returns True if the date is Monday to Friday\n     */\n    isWeekday(date: string | Date | DateTime): boolean {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        // Luxon uses 1-7 for weekdays (1=Monday, 7=Sunday)\n        // Weekdays = 1-5 (Monday to Friday)\n        return parsedDate.weekday >= 1 && parsedDate.weekday <= 5;\n    }\n\n    /**\n     * Get the weekday name for a given date\n     * @param date - Date to get weekday name for\n     * @param format - Format for weekday name ('long', 'short', 'narrow')\n     * @returns Weekday name\n     */\n    getWeekdayName(date: string | Date | DateTime, format: 'long' | 'short' | 'narrow' = 'long'): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.toFormat(format === 'long' ? 'cccc' : format === 'short' ? 'ccc' : 'ccccc');\n    }\n\n    /**\n     * Get array of weekend dates for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of weekend dates\n     */\n    getWeekendDates(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string): (DateTime | string)[] {\n        const weekendDates: (DateTime | string)[] = [];\n        \n        const dateRangeAsDateTime = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        dateRangeAsDateTime.forEach((date) => {\n            if (date.weekday === 6 || date.weekday === 7) {\n                weekendDates.push(format ? date.toFormat(format) : date);\n            }\n        });\n        \n        return weekendDates;\n    }\n\n    /**\n     * Get array of week start dates (Monday) for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of week start dates\n     */\n    getWeekStartDates(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string, weekStart: 'monday' | 'sunday' = 'sunday'): (DateTime | string)[] {\n        const target = weekStart === 'sunday' ? 7 : 1; // 7=Sunday, 1=Monday\n        const weekStartDates: (DateTime | string)[] = [];\n        \n        const dateRangeAsDateTime = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        dateRangeAsDateTime.forEach((date) => {\n            if (date.weekday === target) {\n                weekStartDates.push(format ? date.toFormat(format) : date);\n            }\n        });\n        \n        return weekStartDates;\n    }\n\n    /**\n     * Get array of week start dates (Monday) for a given date range as DateTime objects\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of DateTime objects representing week start dates\n     */\n    getWeekStartDatesAsDateTime(startDate: string | Date | DateTime, endDate: string | Date | DateTime, weekStart: 'monday' | 'sunday' = 'sunday', inclusive: boolean = false): DateTime[] {\n        const starts = this.getWeekStartDates(startDate, endDate, undefined, weekStart) as DateTime[];\n        if (!inclusive) return starts;\n\n        // Ensure the start of the week containing startDate is included\n        const anchor = this.getStartOfWeek(startDate, weekStart);\n        if (starts.length === 0 || !starts[0].hasSame(anchor, 'day')) {\n            return [anchor, ...starts];\n        }\n        return starts;\n    }\n\n    /**\n     * Get array of week start dates (Monday) for a given date range as formatted strings\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Format string for the returned dates (default: 'yyyy-MM-dd')\n     * @returns Array of formatted date strings representing week start dates\n     */\n    getWeekStartDatesAsStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: string = 'yyyy-MM-dd', weekStart: 'monday' | 'sunday' = 'sunday'): string[] {\n        return this.getWeekStartDates(startDate, endDate, format, weekStart) as string[];\n    }\n\n    /**\n     * Get array of week end dates (Sunday) for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of week end dates\n     */\n    getWeekEndDates(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string, weekStart: 'monday' | 'sunday' = 'monday'): (DateTime | string)[] {\n        const starts = this.getWeekStartDatesAsDateTime(startDate, endDate, weekStart);\n        const ends = starts.map(s => s.plus({ days: 6 }).endOf('day'));\n        return ends.map(d => format ? d.toFormat(format) : d);\n    }\n\n    /**\n     * Get the start of the week (Monday) for a given date\n     * @param date - Date to get week start for\n     * @returns DateTime object representing the start of the week\n     */\n    getStartOfWeek(date: string | Date | DateTime, weekStart: 'monday' | 'sunday' = 'monday'): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        if (weekStart === 'monday') return parsedDate.startOf('week');\n        const daysToSub = parsedDate.weekday % 7; // 0 if Sunday(7), 1 if Monday(1), ..., 6 if Saturday(6)\n        return parsedDate.minus({ days: daysToSub }).startOf('day');\n    }\n\n    /**\n     * Get the end of the week (Sunday) for a given date\n     * @param date - Date to get week end for\n     * @returns DateTime object representing the end of the week\n     */\n    getEndOfWeek(date: string | Date | DateTime, weekStart: 'monday' | 'sunday' = 'monday'): DateTime {\n        const start = this.getStartOfWeek(date, weekStart);\n        return start.plus({ days: 6 }).endOf('day');\n    }\n\n    /**\n     * Get the start date of the week for a single date\n     * @param date - Anchor date\n     * @param weekStart - 'monday' | 'sunday' (default: 'monday')\n     * @returns DateTime representing start of the week\n     */\n     getWeekStartDate(date: string | Date | DateTime, weekStart: 'monday' | 'sunday' = 'monday'): DateTime {\n        return this.getStartOfWeek(date, weekStart);\n    }\n\n    /**\n     * Get all days of the week for a given date\n     * @param date - Date to get the week from\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of all days in the week (Monday to Sunday)\n     */\n    getAllDaysInWeek(date: string | Date | DateTime, format?: string): (DateTime | string)[] {\n        const startOfWeek = this.getStartOfWeek(date);\n        const endOfWeek = this.getEndOfWeek(date);\n        \n        return this.getDateRange(startOfWeek, endOfWeek, format);\n    }\n\n    /**\n     * Get all days of the week for a given date as DateTime objects\n     * @param date - Date to get the week from\n     * @returns Array of DateTime objects for all days in the week\n     */\n    getAllDaysInWeekAsDateTime(date: string | Date | DateTime): DateTime[] {\n        return this.getAllDaysInWeek(date) as DateTime[];\n    }\n\n    /**\n     * Get all days of the week for a given date as formatted strings\n     * @param date - Date to get the week from\n     * @param format - Format string for the returned dates (default: 'yyyy-MM-dd')\n     * @returns Array of formatted date strings for all days in the week\n     */\n    getAllDaysInWeekAsStrings(date: string | Date | DateTime, format: string = 'yyyy-MM-dd'): string[] {\n        return this.getAllDaysInWeek(date, format) as string[];\n    }\n\n    /**\n     * Calculate the number of weeks between two dates\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @param includePartialWeeks - Whether to include partial weeks (default: false)\n     * @returns Number of weeks between the dates\n     */\n    weeksBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime, includePartialWeeks: boolean = false): number {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        if (includePartialWeeks) {\n            // Calculate total days and divide by 7, rounding up for partial weeks\n            const totalDays = Math.abs(end.diff(start, 'days').days);\n            return Math.ceil(totalDays / 7);\n        } else {\n            // Calculate complete weeks only\n            const startOfWeekStart = start.startOf('week');\n            const startOfWeekEnd = end.startOf('week');\n            \n            const diffInWeeks = Math.abs(startOfWeekEnd.diff(startOfWeekStart, 'weeks').weeks);\n            return diffInWeeks;\n        }\n    }\n\n    /**\n     * Calculate the number of complete weeks between two dates\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @returns Number of complete weeks between the dates\n     */\n    completeWeeksBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number {\n        return this.weeksBetween(startDate, endDate, false);\n    }\n\n    /**\n     * Calculate the number of weeks between two dates including partial weeks\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @returns Number of weeks between the dates (including partial weeks)\n     */\n    totalWeeksBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number {\n        return this.weeksBetween(startDate, endDate, true);\n    }\n\n    /**\n     * Get the week number of the year for a given date\n     * @param date - Date to get week number for\n     * @returns Week number of the year (1-53)\n     */\n    getWeekOfYear(date: string | Date | DateTime): number {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.weekNumber;\n    }\n\n    /**\n     * Get the year and week number for a given date\n     * @param date - Date to get year and week for\n     * @returns Object with year and week number\n     */\n    getYearWeek(date: string | Date | DateTime): { year: number; week: number } {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return {\n            year: parsedDate.year,\n            week: parsedDate.weekNumber\n        };\n    }\n\n    /**\n     * Get the ISO week date string for a given date\n     * @param date - Date to get ISO week date for\n     * @returns ISO week date string (e.g., \"2024-W01\")\n     */\n    getISOWeekDate(date: string | Date | DateTime): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.toFormat('yyyy-\\'W\\'WW');\n    }\n\n    /**\n     * Check if two dates are in the same week\n     * @param date1 - First date to compare\n     * @param date2 - Second date to compare\n     * @returns True if both dates are in the same week\n     */\n    isSameWeek(date1: string | Date | DateTime, date2: string | Date | DateTime): boolean {\n        const firstDate = this.parseDate(date1);\n        const secondDate = this.parseDate(date2);\n        \n        if (!firstDate.isValid || !secondDate.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        return firstDate.hasSame(secondDate, 'week');\n    }\n\n    /**\n     * Get the week start and end dates for a given week number and year\n     * @param year - Year\n     * @param weekNumber - Week number (1-53)\n     * @returns Object with week start and end dates\n     */\n    getWeekByNumber(year: number, weekNumber: number): { start: DateTime; end: DateTime } {\n        if (weekNumber < 1 || weekNumber > 53) {\n            throw new Error('Week number must be between 1 and 53');\n        }\n        \n        if (year < 1) {\n            throw new Error('Year must be a positive number');\n        }\n        \n        // Create a date for the first day of the year\n        const firstDayOfYear = DateTime.fromObject({ year, month: 1, day: 1 });\n        \n        if (!firstDayOfYear.isValid) {\n            throw new Error('Invalid year provided');\n        }\n        \n        // Find the first Monday of the year (or the Monday of the first week)\n        const firstMonday = firstDayOfYear.startOf('week');\n        \n        // Calculate the start date of the requested week\n        const weekStart = firstMonday.plus({ weeks: weekNumber - 1 });\n        const weekEnd = weekStart.endOf('week');\n        \n        return {\n            start: weekStart,\n            end: weekEnd\n        };\n    }\n\n    /**\n     * Get array of weekday names for a given week\n     * @param format - Format for weekday names ('long', 'short', 'narrow')\n     * @param weekStart - Optional week start date (default: current week)\n     * @returns Array of weekday names ['Monday', 'Tuesday', ..., 'Sunday'] or ['M', 'T', 'W', 'T', 'F', 'S', 'S']\n     */\n    getWeekdayNames(format: 'long' | 'short' | 'narrow' = 'short', weekStart?: string | Date | DateTime): string[] {\n        let startDate: DateTime;\n        \n        if (weekStart) {\n            const parsedDate = this.parseDate(weekStart);\n            if (!parsedDate.isValid) {\n                throw new Error('Invalid week start date provided');\n            }\n            startDate = parsedDate.startOf('week');\n        } else {\n            startDate = DateTime.now().startOf('week');\n        }\n        \n        const weekdayNames: string[] = [];\n        \n        // Generate weekday names for the week (Monday to Sunday)\n        for (let i = 0; i < 7; i++) {\n            const currentDate = startDate.plus({ days: i });\n            let weekdayName: string;\n            \n            switch (format) {\n                case 'long':\n                    weekdayName = currentDate.toFormat('cccc'); // Monday, Tuesday, etc.\n                    break;\n                case 'short':\n                    weekdayName = currentDate.toFormat('ccc'); // Mon, Tue, etc.\n                    break;\n                case 'narrow':\n                    weekdayName = currentDate.toFormat('ccccc'); // M, T, W, T, F, S, S\n                    break;\n                default:\n                    weekdayName = currentDate.toFormat('ccc');\n            }\n            \n            weekdayNames.push(weekdayName);\n        }\n        \n        return weekdayNames;\n    }\n\n    /**\n     * Get array of weekday names starting from Sunday (US format)\n     * @param format - Format for weekday names ('long', 'short', 'narrow')\n     * @param weekStart - Optional week start date (default: current week)\n     * @returns Array of weekday names ['Sunday', 'Monday', ..., 'Saturday']\n     */\n    getWeekdayNamesUSFormat(format: 'long' | 'short' | 'narrow' = 'short', weekStart?: string | Date | DateTime): string[] {\n        let startDate: DateTime;\n        \n        if (weekStart) {\n            const parsedDate = this.parseDate(weekStart);\n            if (!parsedDate.isValid) {\n                throw new Error('Invalid week start date provided');\n            }\n            // Adjust to Sunday start\n            startDate = parsedDate.startOf('week').minus({ days: 1 });\n        } else {\n            startDate = DateTime.now().startOf('week').minus({ days: 1 });\n        }\n        \n        const weekdayNames: string[] = [];\n        \n        // Generate weekday names for the week (Sunday to Saturday)\n        for (let i = 0; i < 7; i++) {\n            const currentDate = startDate.plus({ days: i });\n            let weekdayName: string;\n            \n            switch (format) {\n                case 'long':\n                    weekdayName = currentDate.toFormat('cccc'); // Sunday, Monday, etc.\n                    break;\n                case 'short':\n                    weekdayName = currentDate.toFormat('ccc'); // Sun, Mon, etc.\n                    break;\n                case 'narrow':\n                    weekdayName = currentDate.toFormat('ccccc'); // S, M, T, W, T, F, S\n                    break;\n                default:\n                    weekdayName = currentDate.toFormat('ccc');\n            }\n            \n            weekdayNames.push(weekdayName);\n        }\n        \n        return weekdayNames;\n    }\n\n    /**\n     * Get array of weekday names with custom format\n     * @param format - Custom format string (e.g., 'EEEE', 'EEE', 'E')\n     * @param weekStart - Optional week start date (default: current week)\n     * @returns Array of weekday names with custom format\n     */\n    getWeekdayNamesCustomFormat(format: string, weekStart?: string | Date | DateTime): string[] {\n        let startDate: DateTime;\n        \n        if (weekStart) {\n            const parsedDate = this.parseDate(weekStart);\n            if (!parsedDate.isValid) {\n                throw new Error('Invalid week start date provided');\n            }\n            startDate = parsedDate.startOf('week');\n        } else {\n            startDate = DateTime.now().startOf('week');\n        }\n        \n        const weekdayNames: string[] = [];\n        \n        // Generate weekday names for the week (Monday to Sunday)\n        for (let i = 0; i < 7; i++) {\n            const currentDate = startDate.plus({ days: i });\n            const weekdayName = currentDate.toFormat(format);\n            weekdayNames.push(weekdayName);\n        }\n        \n        return weekdayNames;\n    }\n\n    /**\n     * Get weekday names with day numbers\n     * @param format - Format for weekday names ('long', 'short', 'narrow')\n     * @param weekStart - Optional week start date (default: current week)\n     * @returns Array of weekday names with day numbers ['Mon 1', 'Tue 2', ...]\n     */\n    getWeekdayNamesWithNumbers(format: 'long' | 'short' | 'narrow' = 'short', weekStart?: string | Date | DateTime): string[] {\n        let startDate: DateTime;\n        \n        if (weekStart) {\n            const parsedDate = this.parseDate(weekStart);\n            if (!parsedDate.isValid) {\n                throw new Error('Invalid week start date provided');\n            }\n            startDate = parsedDate.startOf('week');\n        } else {\n            startDate = DateTime.now().startOf('week');\n        }\n        \n        const weekdayNames: string[] = [];\n        \n        // Generate weekday names with day numbers for the week (Monday to Sunday)\n        for (let i = 0; i < 7; i++) {\n            const currentDate = startDate.plus({ days: i });\n            let weekdayName: string;\n            \n            switch (format) {\n                case 'long':\n                    weekdayName = currentDate.toFormat('cccc d'); // Monday 1, Tuesday 2, etc.\n                    break;\n                case 'short':\n                    weekdayName = currentDate.toFormat('ccc d'); // Mon 1, Tue 2, etc.\n                    break;\n                case 'narrow':\n                    weekdayName = currentDate.toFormat('ccccc d'); // M 1, T 2, etc.\n                    break;\n                default:\n                    weekdayName = currentDate.toFormat('ccc d');\n            }\n            \n            weekdayNames.push(weekdayName);\n        }\n        \n        return weekdayNames;\n    }\n\n    /**\n     * Calculate the number of months between two dates\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @param includePartialMonths - Whether to include partial months (default: false)\n     * @returns Number of months between the dates\n     */\n    monthsBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime, includePartialMonths: boolean = false): number {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        if (includePartialMonths) {\n            // Calculate total months including partial months\n            const diffInMonths = Math.abs(end.diff(start, 'months').months);\n            return Math.ceil(diffInMonths);\n        } else {\n            // Calculate complete months only\n            const startOfMonthStart = start.startOf('month');\n            const startOfMonthEnd = end.startOf('month');\n            \n            const diffInMonths = Math.abs(startOfMonthEnd.diff(startOfMonthStart, 'months').months);\n            return diffInMonths;\n        }\n    }\n\n    /**\n     * Calculate the number of complete months between two dates\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @returns Number of complete months between the dates\n     */\n    completeMonthsBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number {\n        return this.monthsBetween(startDate, endDate, false);\n    }\n\n    /**\n     * Calculate the number of months between two dates including partial months\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @returns Number of months between the dates (including partial months)\n     */\n    totalMonthsBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number {\n        return this.monthsBetween(startDate, endDate, true);\n    }\n\n    /**\n     * Get array of month start dates for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of month start dates\n     */\n    getMonthStartDates(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string): (DateTime | string)[] {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        const monthStartDates: (DateTime | string)[] = [];\n        let currentMonth = start.startOf('month');\n        const endMonth = end.startOf('month');\n        \n        // Ensure we iterate in the correct direction\n        const step = currentMonth <= endMonth ? 1 : -1;\n        \n        while (currentMonth <= endMonth || currentMonth >= endMonth) {\n            if (format) {\n                monthStartDates.push(currentMonth.toFormat(format));\n            } else {\n                monthStartDates.push(currentMonth);\n            }\n            \n            currentMonth = currentMonth.plus({ months: step });\n            \n            // Break if we've gone past the end month\n            if (step > 0 && currentMonth > endMonth) {\n                break;\n            }\n            if (step < 0 && currentMonth < endMonth) {\n                break;\n            }\n        }\n        \n        return monthStartDates;\n    }\n\n    /**\n     * Get array of month start dates for a given date range as DateTime objects\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of DateTime objects representing month start dates\n     */\n    getMonthStartDatesAsDateTime(startDate: string | Date | DateTime, endDate: string | Date | DateTime): DateTime[] {\n        return this.getMonthStartDates(startDate, endDate) as DateTime[];\n    }\n\n    /**\n     * Get array of month start dates for a given date range as native JS Date objects\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of JavaScript Date objects representing month start dates\n     */\n    getMonthStartDatesAsJSDate(startDate: string | Date | DateTime, endDate: string | Date | DateTime): Date[] {\n        const dts = this.getMonthStartDatesAsDateTime(startDate, endDate);\n        return dts.map(dt => dt.toJSDate());\n    }\n\n    /**\n     * Get array of month start dates for a given date range as formatted strings\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Optional format string (defaults to ISO date if not provided)\n     * @returns Array of formatted date strings representing month start dates\n     */\n    getMonthStartDatesAsStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string): string[] {\n        const dts = this.getMonthStartDatesAsDateTime(startDate, endDate);\n        return dts.map(dt => format ? dt.toFormat(format) : dt.toISODate());\n    }\n\n    // Removed duplicate getMonthStartDatesAsStrings (kept the more flexible version above)\n\n    /**\n     * Get array of month end dates for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of month end dates\n     */\n    getMonthEndDates(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string): (DateTime | string)[] {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        const monthEndDates: (DateTime | string)[] = [];\n        let currentMonth = start.startOf('month');\n        const endMonth = end.startOf('month');\n        \n        // Ensure we iterate in the correct direction\n        const step = currentMonth <= endMonth ? 1 : -1;\n        \n        while (currentMonth <= endMonth || currentMonth >= endMonth) {\n            const monthEnd = currentMonth.endOf('month');\n            \n            if (format) {\n                monthEndDates.push(monthEnd.toFormat(format));\n            } else {\n                monthEndDates.push(monthEnd);\n            }\n            \n            currentMonth = currentMonth.plus({ months: step });\n            \n            // Break if we've gone past the end month\n            if (step > 0 && currentMonth > endMonth) {\n                break;\n            }\n            if (step < 0 && currentMonth < endMonth) {\n                break;\n            }\n        }\n        \n        return monthEndDates;\n    }\n\n    /**\n     * Get the start of the month for a given date\n     * @param date - Date to get month start for\n     * @returns DateTime object representing the start of the month\n     */\n    getStartOfMonth(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.startOf('month');\n    }\n\n    /**\n     * Get the start of the month for a given date as native JS Date\n     * @param date - Date to get month start for\n     * @returns JavaScript Date representing the start of the month\n     */\n    getStartOfMonthAsDate(date: string | Date | DateTime): Date {\n        const dt = this.getStartOfMonth(date);\n        return dt.toJSDate();\n    }\n\n    /**\n     * Get the end of the month for a given date\n     * @param date - Date to get month end for\n     * @returns DateTime object representing the end of the month\n     */\n    getEndOfMonth(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.endOf('month');\n    }\n\n    /**\n     * Get the end of the month for a given date as native JS Date\n     * @param date - Date to get month end for\n     * @returns JavaScript Date representing the end of the month\n     */\n    getEndOfMonthAsDate(date: string | Date | DateTime): Date {\n        const dt = this.getEndOfMonth(date);\n        return dt.toJSDate();\n    }\n\n    /**\n     * Get the first and last dates of the month for a given date\n     * @param date - Date to get month bounds for\n     * @returns Object with start (first day startOf day) and end (last day endOf day)\n     */\n    getMonthBounds(date: string | Date | DateTime): { start: Date; end: Date } {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        const start = parsedDate.startOf('month').toJSDate();\n        const end = parsedDate.endOf('month').toJSDate();\n        return { start, end };\n    }\n\n    /**\n     * Get the start of the quarter for a given date as Luxon DateTime\n     * @param date - Date to derive quarter start from\n     */\n    getQuarterStartDate(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n\n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n\n        return parsedDate.startOf('quarter');\n    }\n\n    /**\n     * Get the start of the quarter for a given date as native JS Date\n     * @param date - Date to derive quarter start from\n     */\n    getQuarterStartDateAsDate(date: string | Date | DateTime): Date {\n        return this.getQuarterStartDate(date).toJSDate();\n    }\n\n    /**\n     * Get start dates for each month in the quarter containing the given date\n     * @param date - Date used to determine quarter\n     */\n    getQuarterMonthStartDates(date: string | Date | DateTime): DateTime[] {\n        const quarterStart = this.getQuarterStartDate(date);\n        return [0, 1, 2].map(offset => quarterStart.plus({ months: offset }));\n    }\n\n    /**\n     * Get start dates for each month in the quarter as native JS Dates\n     * @param date - Date used to determine quarter\n     */\n    getQuarterMonthStartDatesAsDates(date: string | Date | DateTime): Date[] {\n        return this.getQuarterMonthStartDates(date).map(dt => dt.toJSDate());\n    }\n\n    /**\n     * Check if two dates are in the same month\n     * @param date1 - First date to compare\n     * @param date2 - Second date to compare\n     * @returns True if both dates are in the same month\n     */\n    isSameMonth(date1: string | Date | DateTime, date2: string | Date | DateTime): boolean {\n        const firstDate = this.parseDate(date1);\n        const secondDate = this.parseDate(date2);\n        \n        if (!firstDate.isValid || !secondDate.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        return firstDate.hasSame(secondDate, 'month');\n    }\n\n    /**\n     * Get month name for a given date\n     * @param date - Date to get month name for\n     * @param format - Format for month name ('long', 'short', 'narrow')\n     * @returns Month name\n     */\n    getMonthName(date: string | Date | DateTime, format: 'long' | 'short' | 'narrow' = 'long'): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.toFormat(format === 'long' ? 'MMMM' : format === 'short' ? 'MMM' : 'MMMMM');\n    }\n\n    /**\n     * Get array of month names for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Format for month names ('long', 'short', 'narrow')\n     * @returns Array of month names\n     */\n    getMonthNames(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: 'long' | 'short' | 'narrow' = 'long'): string[] {\n        const monthStartDates = this.getMonthStartDatesAsDateTime(startDate, endDate);\n        \n        return monthStartDates.map(date => {\n            switch (format) {\n                case 'long':\n                    return date.toFormat('MMMM'); // January, February, etc.\n                case 'short':\n                    return date.toFormat('MMM'); // Jan, Feb, etc.\n                case 'narrow':\n                    return date.toFormat('MMMMM'); // J, F, etc.\n                default:\n                    return date.toFormat('MMMM');\n            }\n        });\n    }\n\n    /**\n     * Get default array of month names for a given format\n     * @param format - Format for month names ('long', 'short', 'narrow')\n     * @returns Array of all 12 month names\n     */\n    getDefaultMonthNames(format: 'long' | 'short' | 'narrow' = 'long'): string[] {\n        const months: string[] = [];\n        \n        // Use current year to get month names\n        const currentYear = DateTime.now().year;\n        \n        for (let month = 1; month <= 12; month++) {\n            const date = DateTime.fromObject({ year: currentYear, month, day: 1 });\n            \n            switch (format) {\n                case 'long':\n                    months.push(date.toFormat('MMMM')); // January, February, etc.\n                    break;\n                case 'short':\n                    months.push(date.toFormat('MMM')); // Jan, Feb, etc.\n                    break;\n                case 'narrow':\n                    months.push(date.toFormat('MMMMM')); // J, F, etc.\n                    break;\n                default:\n                    months.push(date.toFormat('MMMM'));\n            }\n        }\n        \n        return months;\n    }\n\n    /**\n     * Get array of day numbers for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Format for day numbers ('numeric', 'zero-padded', 'ordinal')\n     * @returns Array of day numbers as strings ['1', '2', '3', ...]\n     */\n    getDayNumbers(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric'): string[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        return dateRange.map(date => {\n            switch (format) {\n                case 'numeric':\n                    return date.day.toString(); // 1, 2, 3, ..., 31\n                case 'zero-padded':\n                    return date.toFormat('dd'); // 01, 02, 03, ..., 31\n                case 'ordinal':\n                    return date.toFormat('do'); // 1st, 2nd, 3rd, ..., 31st\n                default:\n                    return date.day.toString();\n            }\n        });\n    }\n\n    /**\n     * Get array of day numbers with zero padding for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of zero-padded day numbers ['01', '02', '03', ...]\n     */\n    getDayNumbersZeroPadded(startDate: string | Date | DateTime, endDate: string | Date | DateTime): string[] {\n        return this.getDayNumbers(startDate, endDate, 'zero-padded');\n    }\n\n    /**\n     * Get array of ordinal day numbers for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of ordinal day numbers ['1st', '2nd', '3rd', ...]\n     */\n    getDayNumbersOrdinal(startDate: string | Date | DateTime, endDate: string | Date | DateTime): string[] {\n        return this.getDayNumbers(startDate, endDate, 'ordinal');\n    }\n\n    /**\n     * Get array of day numbers with weekday names for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param dayFormat - Format for day numbers ('numeric', 'zero-padded', 'ordinal')\n     * @param weekdayFormat - Format for weekday names ('long', 'short', 'narrow')\n     * @returns Array of day numbers with weekday names ['Mon 1', 'Tue 2', ...]\n     */\n    getDayNumbersWithWeekdays(startDate: string | Date | DateTime, endDate: string | Date | DateTime, dayFormat: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric', weekdayFormat: 'long' | 'short' | 'narrow' = 'short'): string[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        return dateRange.map(date => {\n            let dayStr: string;\n            let weekdayStr: string;\n            \n            // Format day number\n            switch (dayFormat) {\n                case 'numeric':\n                    dayStr = date.day.toString();\n                    break;\n                case 'zero-padded':\n                    dayStr = date.toFormat('dd');\n                    break;\n                case 'ordinal':\n                    dayStr = date.toFormat('do');\n                    break;\n                default:\n                    dayStr = date.day.toString();\n            }\n            \n            // Format weekday name\n            switch (weekdayFormat) {\n                case 'long':\n                    weekdayStr = date.toFormat('cccc');\n                    break;\n                case 'short':\n                    weekdayStr = date.toFormat('ccc');\n                    break;\n                case 'narrow':\n                    weekdayStr = date.toFormat('ccccc');\n                    break;\n                default:\n                    weekdayStr = date.toFormat('ccc');\n            }\n            \n            return `${weekdayStr} ${dayStr}`;\n        });\n    }\n\n    /**\n     * Get array of day numbers with month names for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param dayFormat - Format for day numbers ('numeric', 'zero-padded', 'ordinal')\n     * @param monthFormat - Format for month names ('long', 'short', 'narrow')\n     * @returns Array of day numbers with month names ['Jan 1', 'Jan 2', ...]\n     */\n    getDayNumbersWithMonths(startDate: string | Date | DateTime, endDate: string | Date | DateTime, dayFormat: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric', monthFormat: 'long' | 'short' | 'narrow' = 'short'): string[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        return dateRange.map(date => {\n            let dayStr: string;\n            let monthStr: string;\n            \n            // Format day number\n            switch (dayFormat) {\n                case 'numeric':\n                    dayStr = date.day.toString();\n                    break;\n                case 'zero-padded':\n                    dayStr = date.toFormat('dd');\n                    break;\n                case 'ordinal':\n                    dayStr = date.toFormat('do');\n                    break;\n                default:\n                    dayStr = date.day.toString();\n            }\n            \n            // Format month name\n            switch (monthFormat) {\n                case 'long':\n                    monthStr = date.toFormat('MMMM');\n                    break;\n                case 'short':\n                    monthStr = date.toFormat('MMM');\n                    break;\n                case 'narrow':\n                    monthStr = date.toFormat('MMMMM');\n                    break;\n                default:\n                    monthStr = date.toFormat('MMM');\n            }\n            \n            return `${monthStr} ${dayStr}`;\n        });\n    }\n\n    /**\n     * Get array of day numbers with full date info for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Format string for the full date (default: 'MMM dd')\n     * @returns Array of formatted dates ['Jan 01', 'Jan 02', ...]\n     */\n    getDayNumbersWithFullDate(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: string = 'MMM dd'): string[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        return dateRange.map(date => date.toFormat(format));\n    }\n\n    /**\n     * Get day number for a single given date\n     * @param date - Single date\n     * @param format - Format for day number ('numeric', 'zero-padded', 'ordinal')\n     * @returns Day number as string\n     */\n    getDayNumber(date: string | Date | DateTime, format: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric'): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        switch (format) {\n            case 'numeric':\n                return parsedDate.day.toString(); // 1, 2, 3, ..., 31\n            case 'zero-padded':\n                return parsedDate.toFormat('dd'); // 01, 02, 03, ..., 31\n            case 'ordinal':\n                return parsedDate.toFormat('do'); // 1st, 2nd, 3rd, ..., 31st\n            default:\n                return parsedDate.day.toString();\n        }\n    }\n\n    /**\n     * Get zero-padded day number for a single given date\n     * @param date - Single date\n     * @returns Zero-padded day number as string\n     */\n    getDayNumberZeroPadded(date: string | Date | DateTime): string {\n        return this.getDayNumber(date, 'zero-padded');\n    }\n\n    /**\n     * Get ordinal day number for a single given date\n     * @param date - Single date\n     * @returns Ordinal day number as string\n     */\n    getDayNumberOrdinal(date: string | Date | DateTime): string {\n        return this.getDayNumber(date, 'ordinal');\n    }\n\n    /**\n     * Get day number with weekday name for a single given date\n     * @param date - Single date\n     * @param dayFormat - Format for day number ('numeric', 'zero-padded', 'ordinal')\n     * @param weekdayFormat - Format for weekday name ('long', 'short', 'narrow')\n     * @returns Day number with weekday name\n     */\n    getDayNumberWithWeekday(date: string | Date | DateTime, dayFormat: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric', weekdayFormat: 'long' | 'short' | 'narrow' = 'short'): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        let dayStr: string;\n        let weekdayStr: string;\n        \n        // Format day number\n        switch (dayFormat) {\n            case 'numeric':\n                dayStr = parsedDate.day.toString();\n                break;\n            case 'zero-padded':\n                dayStr = parsedDate.toFormat('dd');\n                break;\n            case 'ordinal':\n                dayStr = parsedDate.toFormat('do');\n                break;\n            default:\n                dayStr = parsedDate.day.toString();\n        }\n        \n        // Format weekday name\n        switch (weekdayFormat) {\n            case 'long':\n                weekdayStr = parsedDate.toFormat('cccc');\n                break;\n            case 'short':\n                weekdayStr = parsedDate.toFormat('ccc');\n                break;\n            case 'narrow':\n                weekdayStr = parsedDate.toFormat('ccccc');\n                break;\n            default:\n                weekdayStr = parsedDate.toFormat('ccc');\n        }\n        \n        return `${weekdayStr} ${dayStr}`;\n    }\n\n    /**\n     * Get day number with month name for a single given date\n     * @param date - Single date\n     * @param dayFormat - Format for day number ('numeric', 'zero-padded', 'ordinal')\n     * @param monthFormat - Format for month name ('long', 'short', 'narrow')\n     * @returns Day number with month name\n     */\n    getDayNumberWithMonth(date: string | Date | DateTime, dayFormat: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric', monthFormat: 'long' | 'short' | 'narrow' = 'short'): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        let dayStr: string;\n        let monthStr: string;\n        \n        // Format day number\n        switch (dayFormat) {\n            case 'numeric':\n                dayStr = parsedDate.day.toString();\n                break;\n            case 'zero-padded':\n                dayStr = parsedDate.toFormat('dd');\n                break;\n            case 'ordinal':\n                dayStr = parsedDate.toFormat('do');\n                break;\n            default:\n                dayStr = parsedDate.day.toString();\n        }\n        \n        // Format month name\n        switch (monthFormat) {\n            case 'long':\n                monthStr = parsedDate.toFormat('MMMM');\n                break;\n            case 'short':\n                monthStr = parsedDate.toFormat('MMM');\n                break;\n            case 'narrow':\n                monthStr = parsedDate.toFormat('MMMMM');\n                break;\n            default:\n                monthStr = parsedDate.toFormat('MMM');\n        }\n        \n        return `${monthStr} ${dayStr}`;\n    }\n\n    /**\n     * Get day number with full date info for a single given date\n     * @param date - Single date\n     * @param format - Format string for the full date (default: 'MMM dd')\n     * @returns Formatted date string\n     */\n    getDayNumberWithFullDate(date: string | Date | DateTime, format: string = 'MMM dd'): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.toFormat(format);\n    }\n\n    /**\n     * Get day number with year for a single given date\n     * @param date - Single date\n     * @param dayFormat - Format for day number ('numeric', 'zero-padded', 'ordinal')\n     * @param yearFormat - Format for year ('numeric', 'two-digit')\n     * @returns Day number with year\n     */\n    getDayNumberWithYear(date: string | Date | DateTime, dayFormat: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric', yearFormat: 'numeric' | 'two-digit' = 'numeric'): string {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        let dayStr: string;\n        let yearStr: string;\n        \n        // Format day number\n        switch (dayFormat) {\n            case 'numeric':\n                dayStr = parsedDate.day.toString();\n                break;\n            case 'zero-padded':\n                dayStr = parsedDate.toFormat('dd');\n                break;\n            case 'ordinal':\n                dayStr = parsedDate.toFormat('do');\n                break;\n            default:\n                dayStr = parsedDate.day.toString();\n        }\n        \n        // Format year\n        switch (yearFormat) {\n            case 'numeric':\n                yearStr = parsedDate.year.toString();\n                break;\n            case 'two-digit':\n                yearStr = parsedDate.toFormat('yy');\n                break;\n            default:\n                yearStr = parsedDate.year.toString();\n        }\n        \n        return `${dayStr} ${yearStr}`;\n    }\n\n    /**\n     * Get array of date strings for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Format for date strings ('iso', 'short', 'long', 'custom')\n     * @param customFormat - Custom format string (used when format is 'custom')\n     * @returns Array of date strings ['2024-01-01', '2024-01-02', ...]\n     */\n    getDateStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: 'iso' | 'short' | 'long' | 'custom' = 'iso', customFormat?: string): string[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        return dateRange.map(date => {\n            switch (format) {\n                case 'iso':\n                    return date.toISODate(); // 2024-01-01\n                case 'short':\n                    return date.toFormat('MM/dd/yyyy'); // 01/01/2024\n                case 'long':\n                    return date.toFormat('MMMM dd, yyyy'); // January 01, 2024\n                case 'custom':\n                    if (!customFormat) {\n                        throw new Error('Custom format string is required when format is \"custom\"');\n                    }\n                    return date.toFormat(customFormat);\n                default:\n                    return date.toISODate();\n            }\n        });\n    }\n\n    /**\n     * Get array of ISO date strings for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of ISO date strings ['2024-01-01', '2024-01-02', ...]\n     */\n    getISODateStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime): string[] {\n        return this.getDateStrings(startDate, endDate, 'iso');\n    }\n\n    /**\n     * Get array of short date strings for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of short date strings ['01/01/2024', '01/02/2024', ...]\n     */\n    getShortDateStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime): string[] {\n        return this.getDateStrings(startDate, endDate, 'short');\n    }\n\n    /**\n     * Get array of long date strings for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of long date strings ['January 01, 2024', 'January 02, 2024', ...]\n     */\n    getLongDateStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime): string[] {\n        return this.getDateStrings(startDate, endDate, 'long');\n    }\n\n    /**\n     * Get array of custom formatted date strings for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Custom format string (e.g., 'dd/MM/yyyy', 'MMM dd', 'yyyy-MM-dd')\n     * @returns Array of custom formatted date strings\n     */\n    getCustomDateStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: string): string[] {\n        return this.getDateStrings(startDate, endDate, 'custom', format);\n    }\n\n    /**\n     * Get array of date strings with weekday names for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param weekdayFormat - Format for weekday names ('long', 'short', 'narrow')\n     * @param dateFormat - Format for date part ('iso', 'short', 'long', 'custom')\n     * @param customDateFormat - Custom format string for date part\n     * @returns Array of date strings with weekdays ['Mon 2024-01-01', 'Tue 2024-01-02', ...]\n     */\n    getDateStringsWithWeekdays(startDate: string | Date | DateTime, endDate: string | Date | DateTime, weekdayFormat: 'long' | 'short' | 'narrow' = 'short', dateFormat: 'iso' | 'short' | 'long' | 'custom' = 'iso', customDateFormat?: string): string[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        return dateRange.map(date => {\n            let weekdayStr: string;\n            let dateStr: string;\n            \n            // Format weekday name\n            switch (weekdayFormat) {\n                case 'long':\n                    weekdayStr = date.toFormat('cccc');\n                    break;\n                case 'short':\n                    weekdayStr = date.toFormat('ccc');\n                    break;\n                case 'narrow':\n                    weekdayStr = date.toFormat('ccccc');\n                    break;\n                default:\n                    weekdayStr = date.toFormat('ccc');\n            }\n            \n            // Format date part\n            switch (dateFormat) {\n                case 'iso':\n                    dateStr = date.toISODate();\n                    break;\n                case 'short':\n                    dateStr = date.toFormat('MM/dd/yyyy');\n                    break;\n                case 'long':\n                    dateStr = date.toFormat('MMMM dd, yyyy');\n                    break;\n                case 'custom':\n                    if (!customDateFormat) {\n                        throw new Error('Custom format string is required when dateFormat is \"custom\"');\n                    }\n                    dateStr = date.toFormat(customDateFormat);\n                    break;\n                default:\n                    dateStr = date.toISODate();\n            }\n            \n            return `${weekdayStr} ${dateStr}`;\n        });\n    }\n\n    /**\n     * Get array of date strings with month names for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param monthFormat - Format for month names ('long', 'short', 'narrow')\n     * @param dateFormat - Format for date part ('iso', 'short', 'long', 'custom')\n     * @param customDateFormat - Custom format string for date part\n     * @returns Array of date strings with months ['Jan 2024-01-01', 'Jan 2024-01-02', ...]\n     */\n    getDateStringsWithMonths(startDate: string | Date | DateTime, endDate: string | Date | DateTime, monthFormat: 'long' | 'short' | 'narrow' = 'short', dateFormat: 'iso' | 'short' | 'long' | 'custom' = 'iso', customDateFormat?: string): string[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        return dateRange.map(date => {\n            let monthStr: string;\n            let dateStr: string;\n            \n            // Format month name\n            switch (monthFormat) {\n                case 'long':\n                    monthStr = date.toFormat('MMMM');\n                    break;\n                case 'short':\n                    monthStr = date.toFormat('MMM');\n                    break;\n                case 'narrow':\n                    monthStr = date.toFormat('MMMMM');\n                    break;\n                default:\n                    monthStr = date.toFormat('MMM');\n            }\n            \n            // Format date part\n            switch (dateFormat) {\n                case 'iso':\n                    dateStr = date.toISODate();\n                    break;\n                case 'short':\n                    dateStr = date.toFormat('MM/dd/yyyy');\n                    break;\n                case 'long':\n                    dateStr = date.toFormat('MMMM dd, yyyy');\n                    break;\n                case 'custom':\n                    if (!customDateFormat) {\n                        throw new Error('Custom format string is required when dateFormat is \"custom\"');\n                    }\n                    dateStr = date.toFormat(customDateFormat);\n                    break;\n                default:\n                    dateStr = date.toISODate();\n            }\n            \n            return `${monthStr} ${dateStr}`;\n        });\n    }\n\n    /**\n     * Get array of compact date strings for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Format for compact dates ('day-month', 'month-day', 'day-month-year', 'month-day-year')\n     * @returns Array of compact date strings ['01 Jan', '02 Jan', ...]\n     */\n    getCompactDateStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: 'day-month' | 'month-day' | 'day-month-year' | 'month-day-year' = 'day-month'): string[] {\n        const dateRange = this.getDateRangeAsDateTime(startDate, endDate);\n        \n        return dateRange.map(date => {\n            switch (format) {\n                case 'day-month':\n                    return date.toFormat('dd MMM'); // 01 Jan\n                case 'month-day':\n                    return date.toFormat('MMM dd'); // Jan 01\n                case 'day-month-year':\n                    return date.toFormat('dd MMM yyyy'); // 01 Jan 2024\n                case 'month-day-year':\n                    return date.toFormat('MMM dd, yyyy'); // Jan 01, 2024\n                default:\n                    return date.toFormat('dd MMM');\n            }\n        });\n    }\n\n    /**\n     * Get the number of days in the month for a single given date\n     * @param date - Single date to get the month from\n     * @returns Number of days in the month (28, 29, 30, or 31)\n     */\n    getDaysInMonthCount(date: string | Date | DateTime): number {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.daysInMonth;\n    }\n\n    /**\n     * Get array of all days in the month for a single given date\n     * @param date - Single date to get the month from\n     * @param format - Format for the returned days ('numeric', 'zero-padded', 'ordinal', 'date-string', 'custom')\n     * @param customFormat - Custom format string (used when format is 'custom')\n     * @returns Array of days in the month ['1', '2', '3', ..., '31'] or ['01', '02', ..., '31']\n     */\n    getDaysInMonthArray(date: string | Date | DateTime, format: 'numeric' | 'zero-padded' | 'ordinal' | 'date-string' | 'custom' = 'numeric', customFormat?: string): string[] {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        const firstDayOfMonth = parsedDate.startOf('month');\n        const daysInMonth = parsedDate.daysInMonth;\n        \n        const daysArray: string[] = [];\n        \n        for (let i = 0; i < daysInMonth; i++) {\n            const currentDay = firstDayOfMonth.plus({ days: i });\n            \n            switch (format) {\n                case 'numeric':\n                    daysArray.push(currentDay.day.toString()); // 1, 2, 3, ..., 31\n                    break;\n                case 'zero-padded':\n                    daysArray.push(currentDay.toFormat('dd')); // 01, 02, 03, ..., 31\n                    break;\n                case 'ordinal':\n                    daysArray.push(currentDay.toFormat('do')); // 1st, 2nd, 3rd, ..., 31st\n                    break;\n                case 'date-string':\n                    daysArray.push(currentDay.toISODate()); // 2024-01-01, 2024-01-02, ..., 2024-01-31\n                    break;\n                case 'custom':\n                    if (!customFormat) {\n                        throw new Error('Custom format string is required when format is \"custom\"');\n                    }\n                    daysArray.push(currentDay.toFormat(customFormat));\n                    break;\n                default:\n                    daysArray.push(currentDay.day.toString());\n            }\n        }\n        \n        return daysArray;\n    }\n\n    /**\n     * Get array of zero-padded days in the month for a single given date\n     * @param date - Single date to get the month from\n     * @returns Array of zero-padded days ['01', '02', '03', ..., '31']\n     */\n    getDaysInMonthArrayZeroPadded(date: string | Date | DateTime): string[] {\n        return this.getDaysInMonthArray(date, 'zero-padded');\n    }\n\n    /**\n     * Get array of ordinal days in the month for a single given date\n     * @param date - Single date to get the month from\n     * @returns Array of ordinal days ['1st', '2nd', '3rd', ..., '31st']\n     */\n    getDaysInMonthArrayOrdinal(date: string | Date | DateTime): string[] {\n        return this.getDaysInMonthArray(date, 'ordinal');\n    }\n\n    /**\n     * Get array of date strings for all days in the month for a single given date\n     * @param date - Single date to get the month from\n     * @returns Array of date strings ['2024-01-01', '2024-01-02', ..., '2024-01-31']\n     */\n    getDaysInMonthArrayAsDateStrings(date: string | Date | DateTime): string[] {\n        return this.getDaysInMonthArray(date, 'date-string');\n    }\n\n    /**\n     * Get array of days with weekday names for all days in the month for a single given date\n     * @param date - Single date to get the month from\n     * @param dayFormat - Format for day numbers ('numeric', 'zero-padded', 'ordinal')\n     * @param weekdayFormat - Format for weekday names ('long', 'short', 'narrow')\n     * @returns Array of days with weekdays ['Mon 1', 'Tue 2', ..., 'Wed 31']\n     */\n    getDaysInMonthArrayWithWeekdays(date: string | Date | DateTime, dayFormat: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric', weekdayFormat: 'long' | 'short' | 'narrow' = 'short'): string[] {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        const firstDayOfMonth = parsedDate.startOf('month');\n        const daysInMonth = parsedDate.daysInMonth;\n        \n        const daysArray: string[] = [];\n        \n        for (let i = 0; i < daysInMonth; i++) {\n            const currentDay = firstDayOfMonth.plus({ days: i });\n            \n            let dayStr: string;\n            let weekdayStr: string;\n            \n            // Format day number\n            switch (dayFormat) {\n                case 'numeric':\n                    dayStr = currentDay.day.toString();\n                    break;\n                case 'zero-padded':\n                    dayStr = currentDay.toFormat('dd');\n                    break;\n                case 'ordinal':\n                    dayStr = currentDay.toFormat('do');\n                    break;\n                default:\n                    dayStr = currentDay.day.toString();\n            }\n            \n            // Format weekday name\n            switch (weekdayFormat) {\n                case 'long':\n                    weekdayStr = currentDay.toFormat('cccc');\n                    break;\n                case 'short':\n                    weekdayStr = currentDay.toFormat('ccc');\n                    break;\n                case 'narrow':\n                    weekdayStr = currentDay.toFormat('ccccc');\n                    break;\n                default:\n                    weekdayStr = currentDay.toFormat('ccc');\n            }\n            \n            daysArray.push(`${weekdayStr} ${dayStr}`);\n        }\n        \n        return daysArray;\n    }\n\n    /**\n     * Get array of days with month names for all days in the month for a single given date\n     * @param date - Single date to get the month from\n     * @param dayFormat - Format for day numbers ('numeric', 'zero-padded', 'ordinal')\n     * @param monthFormat - Format for month names ('long', 'short', 'narrow')\n     * @returns Array of days with months ['Jan 1', 'Jan 2', ..., 'Jan 31']\n     */\n    getDaysInMonthArrayWithMonths(date: string | Date | DateTime, dayFormat: 'numeric' | 'zero-padded' | 'ordinal' = 'numeric', monthFormat: 'long' | 'short' | 'narrow' = 'short'): string[] {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        const firstDayOfMonth = parsedDate.startOf('month');\n        const daysInMonth = parsedDate.daysInMonth;\n        \n        const daysArray: string[] = [];\n        \n        for (let i = 0; i < daysInMonth; i++) {\n            const currentDay = firstDayOfMonth.plus({ days: i });\n            \n            let dayStr: string;\n            let monthStr: string;\n            \n            // Format day number\n            switch (dayFormat) {\n                case 'numeric':\n                    dayStr = currentDay.day.toString();\n                    break;\n                case 'zero-padded':\n                    dayStr = currentDay.toFormat('dd');\n                    break;\n                case 'ordinal':\n                    dayStr = currentDay.toFormat('do');\n                    break;\n                default:\n                    dayStr = currentDay.day.toString();\n            }\n            \n            // Format month name\n            switch (monthFormat) {\n                case 'long':\n                    monthStr = currentDay.toFormat('MMMM');\n                    break;\n                case 'short':\n                    monthStr = currentDay.toFormat('MMM');\n                    break;\n                case 'narrow':\n                    monthStr = currentDay.toFormat('MMMMM');\n                    break;\n                default:\n                    monthStr = currentDay.toFormat('MMM');\n            }\n            \n            daysArray.push(`${monthStr} ${dayStr}`);\n        }\n        \n        return daysArray;\n    }\n\n    /**\n     * Get array of custom formatted days for all days in the month for a single given date\n     * @param date - Single date to get the month from\n     * @param format - Custom format string (e.g., 'dd/MM/yyyy', 'MMM dd', 'EEEE, MMM dd')\n     * @returns Array of custom formatted days\n     */\n    getDaysInMonthArrayCustomFormat(date: string | Date | DateTime, format: string): string[] {\n        return this.getDaysInMonthArray(date, 'custom', format);\n    }\n\n    /**\n     * Calculate the number of years between two dates\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @param includePartialYears - Whether to include partial years (default: false)\n     * @returns Number of years between the dates\n     */\n    yearsBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime, includePartialYears: boolean = false): number {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        if (includePartialYears) {\n            // Calculate total years including partial years\n            const diffInYears = Math.abs(end.diff(start, 'years').years);\n            return Math.ceil(diffInYears);\n        } else {\n            // Calculate complete years only\n            const startOfYearStart = start.startOf('year');\n            const startOfYearEnd = end.startOf('year');\n            \n            const diffInYears = Math.abs(startOfYearEnd.diff(startOfYearStart, 'years').years);\n            return diffInYears;\n        }\n    }\n\n    /**\n     * Calculate the number of complete years between two dates\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @returns Number of complete years between the dates\n     */\n    completeYearsBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number {\n        return this.yearsBetween(startDate, endDate, false);\n    }\n\n    /**\n     * Calculate the number of years between two dates including partial years\n     * @param startDate - Start date\n     * @param endDate - End date\n     * @returns Number of years between the dates (including partial years)\n     */\n    totalYearsBetween(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number {\n        return this.yearsBetween(startDate, endDate, true);\n    }\n\n    /**\n     * Get array of year start dates for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of year start dates\n     */\n    getYearStartDates(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string): (DateTime | string)[] {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        const yearStartDates: (DateTime | string)[] = [];\n        let currentYear = start.startOf('year');\n        const endYear = end.startOf('year');\n        \n        // Ensure we iterate in the correct direction\n        const step = currentYear <= endYear ? 1 : -1;\n        \n        while (currentYear <= endYear || currentYear >= endYear) {\n            if (format) {\n                yearStartDates.push(currentYear.toFormat(format));\n            } else {\n                yearStartDates.push(currentYear);\n            }\n            \n            currentYear = currentYear.plus({ years: step });\n            \n            // Break if we've gone past the end year\n            if (step > 0 && currentYear > endYear) {\n                break;\n            }\n            if (step < 0 && currentYear < endYear) {\n                break;\n            }\n        }\n        \n        return yearStartDates;\n    }\n\n    /**\n     * Get array of year start dates for a given date range as DateTime objects\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of DateTime objects representing year start dates\n     */\n    getYearStartDatesAsDateTime(startDate: string | Date | DateTime, endDate: string | Date | DateTime): DateTime[] {\n        return this.getYearStartDates(startDate, endDate) as DateTime[];\n    }\n\n    /**\n     * Get array of year start dates for a given date range as formatted strings\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Format string for the returned dates (default: 'yyyy-MM-dd')\n     * @returns Array of formatted date strings representing year start dates\n     */\n    getYearStartDatesAsStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: string = 'yyyy-MM-dd'): string[] {\n        return this.getYearStartDates(startDate, endDate, format) as string[];\n    }\n\n    /**\n     * Get array of year end dates for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Optional format for the returned dates (default: DateTime objects)\n     * @returns Array of year end dates\n     */\n    getYearEndDates(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format?: string): (DateTime | string)[] {\n        const start = this.parseDate(startDate);\n        const end = this.parseDate(endDate);\n        \n        if (!start.isValid || !end.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        const yearEndDates: (DateTime | string)[] = [];\n        let currentYear = start.startOf('year');\n        const endYear = end.startOf('year');\n        \n        // Ensure we iterate in the correct direction\n        const step = currentYear <= endYear ? 1 : -1;\n        \n        while (currentYear <= endYear || currentYear >= endYear) {\n            const yearEnd = currentYear.endOf('year');\n            \n            if (format) {\n                yearEndDates.push(yearEnd.toFormat(format));\n            } else {\n                yearEndDates.push(yearEnd);\n            }\n            \n            currentYear = currentYear.plus({ years: step });\n            \n            // Break if we've gone past the end year\n            if (step > 0 && currentYear > endYear) {\n                break;\n            }\n            if (step < 0 && currentYear < endYear) {\n                break;\n            }\n        }\n        \n        return yearEndDates;\n    }\n\n    /**\n     * Get the start of the year for a given date\n     * @param date - Date to get year start for\n     * @returns DateTime object representing the start of the year\n     */\n    getStartOfYear(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.startOf('year');\n    }\n\n    /**\n     * Get the end of the year for a given date\n     * @param date - Date to get year end for\n     * @returns DateTime object representing the end of the year\n     */\n    getEndOfYear(date: string | Date | DateTime): DateTime {\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        return parsedDate.endOf('year');\n    }\n\n    /**\n     * Check if two dates are in the same year\n     * @param date1 - First date to compare\n     * @param date2 - Second date to compare\n     * @returns True if both dates are in the same year\n     */\n    isSameYear(date1: string | Date | DateTime, date2: string | Date | DateTime): boolean {\n        const firstDate = this.parseDate(date1);\n        const secondDate = this.parseDate(date2);\n        \n        if (!firstDate.isValid || !secondDate.isValid) {\n            throw new Error('Invalid dates provided');\n        }\n        \n        return firstDate.hasSame(secondDate, 'year');\n    }\n\n    /**\n     * Get array of year numbers for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @returns Array of year numbers\n     */\n    getYearNumbers(startDate: string | Date | DateTime, endDate: string | Date | DateTime): number[] {\n        const yearStartDates = this.getYearStartDatesAsDateTime(startDate, endDate);\n        \n        return yearStartDates.map(date => date.year);\n    }\n\n    /**\n     * Get array of year strings for a given date range\n     * @param startDate - Start date of the range\n     * @param endDate - End date of the range\n     * @param format - Format for year strings ('numeric', 'two-digit')\n     * @returns Array of year strings\n     */\n    getYearStrings(startDate: string | Date | DateTime, endDate: string | Date | DateTime, format: 'numeric' | 'two-digit' = 'numeric'): string[] {\n        const yearStartDates = this.getYearStartDatesAsDateTime(startDate, endDate);\n        \n        return yearStartDates.map(date => {\n            switch (format) {\n                case 'numeric':\n                    return date.year.toString(); // 2024, 2025, etc.\n                case 'two-digit':\n                    return date.toFormat('yy'); // 24, 25, etc.\n                default:\n                    return date.year.toString();\n            }\n        });\n    }\n\n    /**\n     * Compute left position by date range using width-per-day scale\n     * All date operations are timezone-aware using DateTime internally\n     * @param startDate - Start date (anchor) - can be Date, string, number (timestamp), or DateTime\n     * @param endDate - End date (target) - can be Date, string, number (timestamp), or DateTime\n     * @param widthPerDay - Number of pixels per day\n     * @param inclusive - Whether to include both start and end (default: false)\n     * @returns left position in pixels (non-negative)\n     */\n    GetLeftByDate(startDate: string | Date | DateTime | number, endDate: string | Date | DateTime | number, widthPerDay: number, inclusive: boolean = false): number {\n        if (typeof widthPerDay !== 'number' || !isFinite(widthPerDay) || widthPerDay < 0) {\n            throw new Error('widthPerDay must be a non-negative finite number');\n        }\n        \n        // Parse dates to DateTime with timezone support\n        // daysBetween internally uses parseDate which applies timezone, so this is already timezone-aware\n        const days = Math.floor(this.daysBetween(startDate, endDate, inclusive));\n        return days * widthPerDay;\n    }\n\n    /**\n     * Convert timestamp or date to timezone object with structured date information\n     * @param date - Timestamp (number), date string, Date object, or DateTime object\n     * @param timezone - Optional IANA timezone string (e.g., 'America/New_York', 'Europe/London') or null for system timezone. If not provided, uses class-level timezone setting\n     * @returns IDateTimeBreakdown object with targetDate containing year, month, day, hour, minute, second, and offset\n     */\n    convertToTimezoneObject(date: string | Date | DateTime | number, timezone?: string | null): IDateTimeBreakdown {\n        // Parse date first without applying class timezone\n        let parsedDate: DateTime;\n        \n        if (DateTime.isDateTime(date)) {\n            parsedDate = date;\n        } else if (typeof date === 'object' && date !== null) {\n            const anyDate = date as any;\n            if (anyDate.isLuxonDateTime && typeof anyDate.ts === 'number') {\n                parsedDate = DateTime.fromMillis(anyDate.ts);\n            } else if (date instanceof Date) {\n                parsedDate = DateTime.fromJSDate(date);\n            } else {\n                throw new Error('Invalid date format provided');\n            }\n        } else if (typeof date === 'number') {\n            parsedDate = DateTime.fromMillis(date);\n        } else if (typeof date === 'string') {\n            if (/^\\d+$/.test(date)) {\n                parsedDate = DateTime.fromMillis(Number(date));\n            } else {\n                parsedDate = DateTime.fromISO(date);\n            }\n        } else {\n            throw new Error('Invalid date format provided');\n        }\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        // Apply the provided timezone or use class-level timezone\n        let timezoneToUse: string | null = null;\n        if (timezone !== undefined) {\n            timezoneToUse = timezone === 'system' ? null : timezone;\n        } else {\n            timezoneToUse = this.timezone;\n        }\n        \n        // Apply timezone if specified\n        if (timezoneToUse) {\n            parsedDate = parsedDate.setZone(timezoneToUse);\n        }\n        \n        // Get offset in format like \"-06:00\" or \"+05:30\"\n        const offsetMinutes = parsedDate.offset;\n        const offsetHours = Math.floor(Math.abs(offsetMinutes) / 60);\n        const offsetMins = Math.abs(offsetMinutes) % 60;\n        const offsetSign = offsetMinutes >= 0 ? '+' : '-';\n        const offsetString = `${offsetSign}${String(offsetHours).padStart(2, '0')}:${String(offsetMins).padStart(2, '0')}`;\n        \n        return {\n                year       : parsedDate.year,\n                month      : parsedDate.month - 1,\n                day        : parsedDate.day,\n                hour       : parsedDate.hour,\n                minute     : parsedDate.minute,\n                second     : parsedDate.second,\n                millisecond: parsedDate.millisecond,\n                offset     : offsetString\n        };\n        \n    }\n\n    convertDateToTimezone(date: string | Date | DateTime | number, timezone?: string | null): Date {\n        const timezoneObject = this.convertToTimezoneObject(date, timezone);\n        return new Date(timezoneObject.year, timezoneObject.month, timezoneObject.day, timezoneObject.hour, timezoneObject.minute, timezoneObject.second, timezoneObject.millisecond);\n    }\n\n    /**\n     * Convert a UTC timestamp to a timezone-based timestamp\n     * The timestamp itself remains UTC (milliseconds since epoch), but the DateTime is set to the specified timezone\n     * @param utcTimestamp - UTC timestamp in milliseconds since epoch, or a Date object\n     * @param timezone - Optional IANA timezone string (e.g., 'America/New_York', 'Europe/London') or null for system timezone. If not provided, uses class-level timezone setting\n     * @returns DateTime object representing the UTC timestamp in the specified timezone\n     */\n    convertUTCTimestampToTimezone(utcTimestamp: number | Date, timezone?: string | null): DateTime {\n        // Handle Date objects by converting to timestamp\n        let timestamp: number;\n        if (utcTimestamp instanceof Date) {\n            timestamp = utcTimestamp.getTime();\n        } else if (typeof utcTimestamp === 'number') {\n            timestamp = utcTimestamp;\n        } else {\n            throw new Error('utcTimestamp must be a finite number or a Date object');\n        }\n\n        if (!isFinite(timestamp)) {\n            throw new Error('utcTimestamp must be a finite number');\n        }\n\n        // Create DateTime from UTC timestamp\n        let dateTime = DateTime.fromMillis(timestamp, { zone: 'utc' });\n\n        if (!dateTime.isValid) {\n            throw new Error('Invalid UTC timestamp provided');\n        }\n\n        // Determine which timezone to use\n        let timezoneToUse: string | null = null;\n        if (timezone !== undefined) {\n            timezoneToUse = timezone === 'system' ? null : timezone;\n        } else {\n            timezoneToUse = this.timezone;\n        }\n\n        // Convert to the specified timezone\n        if (timezoneToUse) {\n            dateTime = dateTime.setZone(timezoneToUse);\n        }\n\n        return dateTime;\n    }\n\n    /**\n     * Convert a UTC timestamp to a timezone-based timestamp (returns timestamp as number)\n     * Note: The timestamp value remains the same (UTC), but this method provides timezone context\n     * @param utcTimestamp - UTC timestamp in milliseconds since epoch\n     * @param timezone - Optional IANA timezone string (e.g., 'America/New_York', 'Europe/London') or null for system timezone. If not provided, uses class-level timezone setting\n     * @returns Timestamp in milliseconds (same value, but with timezone context applied)\n     */\n    convertUTCTimestampToTimezoneTimestamp(utcTimestamp: number, timezone?: string | null): number {\n        const dateTime = this.convertUTCTimestampToTimezone(utcTimestamp, timezone);\n        // Return the timestamp - it's still UTC, but the DateTime has timezone context\n        return dateTime.toMillis();\n    }\n\n    convertUTCTimestampToTimezoneDateTime(utcTimestamp: number, timezone?: string | null): DateTime {\n        const dateTime = this.convertUTCTimestampToTimezone(utcTimestamp, timezone);\n        // Return the timestamp - it's still UTC, but the DateTime has timezone context\n        return dateTime;\n    }\n\n    /**\n     * Convert a timezone-based timestamp to UTC timestamp\n     * Takes a timestamp that represents a moment in the specified timezone and returns its UTC equivalent.\n     * This is useful when you have a timestamp that was created from local time in a timezone and need the UTC timestamp.\n     * @param timezoneTimestamp - Timestamp in milliseconds that represents a moment in the given timezone\n     * @param timezone - IANA timezone string (e.g., 'America/New_York', 'Europe/London') or null for system timezone\n     * @returns UTC timestamp in milliseconds\n     */\n    convertTimezoneTimestampToUTC(timezoneTimestamp: number, timezone: string | null): number {\n        if (typeof timezoneTimestamp !== 'number' || !isFinite(timezoneTimestamp)) {\n            throw new Error('timezoneTimestamp must be a finite number');\n        }\n\n        // Determine which timezone to use\n        let timezoneToUse: string | null = null;\n        if (timezone !== undefined && timezone !== null) {\n            timezoneToUse = timezone === 'system' ? null : timezone;\n        } else {\n            timezoneToUse = this.timezone;\n        }\n\n        // Create DateTime from the timestamp, interpreting it as being in the specified timezone\n        // We first create it in UTC, then convert to the timezone to get local components,\n        // then recreate in that timezone and convert back to UTC\n        const dateTimeUTC = DateTime.fromMillis(timezoneTimestamp, { zone: timezoneToUse });\n\n        if (!dateTimeUTC.isValid) {\n            throw new Error('Invalid timezone timestamp provided');\n        }\n\n        if (timezoneToUse) {\n            // Get the local time representation in the target timezone\n            const localDateTime = dateTimeUTC.setZone('utc');\n            \n            // Create a new DateTime with the same local time components in the target timezone\n            // This effectively treats the timestamp as if it were created from local time in that timezone\n            const dateTimeInTimezone = DateTime.fromObject({\n                year: localDateTime.year,\n                month: localDateTime.month,\n                day: localDateTime.day,\n                hour: localDateTime.hour,\n                minute: localDateTime.minute,\n                second: localDateTime.second,\n                millisecond: localDateTime.millisecond\n            }, { zone: timezoneToUse });\n\n            if (!dateTimeInTimezone.isValid) {\n                throw new Error('Invalid date/time components in timezone');\n            }\n\n            // Convert to UTC and return the UTC timestamp\n            return dateTimeInTimezone.toUTC().toMillis();\n        } else {\n            // For system timezone, the timestamp is already in UTC, so return as-is\n            // Or if we want to treat it as system local time, we'd do similar conversion\n            // For now, returning the UTC timestamp directly since system timezone handling\n            // would require knowing the actual system timezone offset at that moment\n            return dateTimeUTC.toMillis();\n        }\n    }\n\n    /**\n     * Get the end of day for a UTC timestamp in the given timezone\n     * @param utcTimestamp - UTC timestamp in milliseconds since epoch\n     * @param timezone - Optional IANA timezone string (e.g., 'America/New_York', 'Europe/London') or null for system timezone. If not provided, uses class-level timezone setting\n     * @returns DateTime object representing the end of day (23:59:59.999) in the specified timezone\n     */\n    getEndOfDayForUTCTimestamp(utcTimestamp: number, timezone?: string | null): DateTime {\n        if (typeof utcTimestamp !== 'number' || !isFinite(utcTimestamp)) {\n            throw new Error('utcTimestamp must be a finite number');\n        }\n\n        // Convert UTC timestamp to DateTime in the specified timezone\n        const dateTime = this.convertUTCTimestampToTimezone(utcTimestamp, timezone);\n\n        if (!dateTime.isValid) {\n            throw new Error('Invalid UTC timestamp provided');\n        }\n\n        // Return the end of day for the DateTime in the timezone\n        return dateTime.endOf('day');\n    }\n\n    /**\n     * Get the end of day for a UTC timestamp in the given timezone as a timestamp\n     * @param utcTimestamp - UTC timestamp in milliseconds since epoch\n     * @param timezone - Optional IANA timezone string (e.g., 'America/New_York', 'Europe/London') or null for system timezone. If not provided, uses class-level timezone setting\n     * @returns Timestamp in milliseconds representing the end of day (23:59:59.999) in the specified timezone\n     */\n    getEndOfDayForUTCTimestampAsTimestamp(utcTimestamp: number, timezone?: string | null): number {\n        const endOfDayDateTime = this.getEndOfDayForUTCTimestamp(utcTimestamp, timezone);\n        return endOfDayDateTime.toMillis();\n    }\n\n    /**\n     * Get the start of day for a UTC timestamp in the given timezone\n     * @param utcTimestamp - UTC timestamp in milliseconds since epoch\n     * @param timezone - Optional IANA timezone string (e.g., 'America/New_York', 'Europe/London') or null for system timezone. If not provided, uses class-level timezone setting\n     * @returns DateTime object representing the start of day (00:00:00.000) in the specified timezone\n     */\n    getStartOfDayForUTCTimestamp(utcTimestamp: number, timezone?: string | null): DateTime {\n        if (typeof utcTimestamp !== 'number' || !isFinite(utcTimestamp)) {\n            throw new Error('utcTimestamp must be a finite number');\n        }\n\n        // Convert UTC timestamp to DateTime in the specified timezone\n        const dateTime = this.convertUTCTimestampToTimezone(utcTimestamp, timezone);\n\n        if (!dateTime.isValid) {\n            throw new Error('Invalid UTC timestamp provided');\n        }\n\n        // Return the start of day for the DateTime in the timezone\n        return dateTime.startOf('day');\n    }\n\n    getStartOfDayForUTCTimestampAsTimestamp(utcTimestamp: number, timezone?: string | null): number {\n        const startOfDayDateTime = this.getStartOfDayForUTCTimestamp(utcTimestamp, timezone);\n        return startOfDayDateTime.toMillis();\n    }\n\n    /**\n     * Get timestamp (milliseconds since epoch) for a given date\n     * @param date - Timestamp (number), date string, Date object, or DateTime object\n     * @returns Timestamp in milliseconds\n     */\n    getTimestamp(date: string | Date | DateTime | number): number {\n        // If already a number (timestamp), return it\n        if (typeof date === 'number') {\n            return date;\n        }\n        \n        // Parse the date\n        const parsedDate = this.parseDate(date);\n        \n        if (!parsedDate.isValid) {\n            throw new Error('Invalid date provided');\n        }\n        \n        // Return timestamp in milliseconds\n        return parsedDate.toMillis();\n    }\n\n\n\n    getDurationToHumanReadable( dateValue1: Date | string | number, dateValue2: Date | string | number, locale: string = 'en-US', options: DurationOptions = {} ): string {\n        const { showSeconds = true, unitDisplay = 'long' } = options;\n\n        const d1 = new Date(dateValue1);\n        const d2 = new Date(dateValue2);\n\n        if (isNaN(d1.getTime()) || isNaN(d2.getTime())) {\n            return 'Invalid Date';\n        }\n\n        const TIME_UNITS: Array<[number, DurationUnit]> = [\n            [86400000, 'day'],   \n            [3600000, 'hour'],   \n            [60000, 'minute'],  \n            [1000, 'second']    \n        ];\n\n        let remainingMs = Math.abs(d1.getTime() - d2.getTime());\n\n        const parts: string[] = TIME_UNITS.reduce<string[]>((acc, [ms, unit]) => {\n            if (unit === 'second' && !showSeconds && acc.length > 0) {\n            return acc;\n            }\n\n            const value = Math.floor(remainingMs / ms);\n            remainingMs %= ms;\n\n            if (value > 0 || (unit === 'second' && acc.length === 0)) {\n            acc.push(\n                new Intl.NumberFormat(locale, {\n                style: 'unit',\n                unit,\n                unitDisplay\n                }).format(value)\n            );\n            }\n\n            return acc;\n        }, []);\n\n        return new (Intl as any).ListFormat(locale, { style: \"narrow\", type: \"unit\" }).format(parts);\n    }\n\n}\n\nexport function toNativeDate(parsed) {\n    const {\n        year,\n        month,\n        day,\n        hour,\n        minute,\n        second,\n        offset\n    } = parsed;\n\n    // Parse offset: \"+05:30\" → hours: 5, minutes: 30\n    const sign = offset.startsWith(\"-\") ? -1 : 1;\n    const [offH, offM] = offset.substring(1).split(\":\").map(Number);\n\n    // Convert offset to minutes\n    const offsetMinutes = sign * (offH * 60 + offM);\n\n    // Build a UTC timestamp by subtracting the offset\n    const timestamp = Date.UTC(\n        year,\n        month - 1,\n        day,\n        hour,\n        minute - offsetMinutes,\n        second,\n        0\n    );\n\n    return new Date(timestamp);\n}\n","import { Bean, AutoWired } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../constant/vertical-calendar-bean-name-constant\";\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { VerticalCalendarAPITypes } from \"./vertical-calendar-api.types\";\nimport { ButtonNavigatorTypes } from \"../core/button-interactor/button-interactor.types\";\nimport { IEventData, VerticalCalendarConfigurationType } from \"../vertical-calendar-configuration\";\nimport { IEventObject } from \"../data-structure/event-object.types\";\nimport { IEventDataManager } from \"../data-structure/events-data-manager/events-data-manager.types\";\nimport { ICalendarEventStore } from \"../core/event-handler/new/event-store.type\";\nimport { VERTICAL_CALENDAR_EVENT_NAME } from \"../constant/vertical-calendar-event-name\";\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.API)\nclass VerticalCalendarApi extends EventEmitter implements VerticalCalendarAPITypes {\n\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.BUTTON_NAVIGATOR) private buttonNavigator!: ButtonNavigatorTypes;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.EVENT_MANGER) protected eventDataManager!: IEventDataManager;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.EVENT_STORE) protected eventStore!: ICalendarEventStore;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.CONFIGURATION) protected configuration !: VerticalCalendarConfigurationType\n\n\n    goToNextMonth(): void {\n\n        this.buttonNavigator.goToNextMonth();\n        // this.dataBlock.goToNextMonth();\n        // this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.INITIALIZE_MONTHS});\n        // // this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.VIEW_PORT_CHANGE});\n\n        // console.log('next month');\n        // This is a dummy method to ensure the class is not empty.\n    }\n\n    updateProperties(properties : VerticalCalendarConfigurationType){\n        if(properties.timezone){\n            this.configuration.timezone = properties.timezone\n        }\n\n        this.dispatchEvent({type : VERTICAL_CALENDAR_EVENT_NAME.UPDATE_TIMEZONE})\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED});\n        \n    }\n\n    gotoPrevious(){\n        this.buttonNavigator.goToPreviousMonth();\n    }\n\n    addEvents(events : IEventData[], onSuccessCallback: (eventObject : IEventObject) => void , onFailureCallback : () => void){\n        this.eventDataManager.addEvents(events, (event : IEventObject) => {\n\n                this.eventStore.addOrUpdateEvent(event)\n\n            this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED});\n            onSuccessCallback(event);\n\n\n        },()=>{\n            onFailureCallback()\n        })\n    }\n\n    updateEvents(events : IEventData[], onSuccessCallback: (eventObject : IEventObject) => void , onFailureCallback : () => void){\n        this.eventDataManager.updateEvents(events, (event : IEventObject) => {\n\n            this.eventStore.addOrUpdateEvent(event)\n\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED});\n        onSuccessCallback(event);\n\n\n    },()=>{\n        onFailureCallback()\n    })\n    }\n\n    removeEvents(ids : string[], onSuccessCallback: () => void , onFailureCallback : () => void){\n        ids.forEach((id)=>{\n                    this.eventDataManager.removeEvents([id],()=>{\n                        this.eventStore.removeEvent(id)\n                    this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED});\n\n                     onSuccessCallback()\n                    },\n                    ()=>{\n                    onFailureCallback()\n                })\n            })\n    }\n\n}\n\n\n\nexport{\n    VerticalCalendarApi\n}","export const VERTICAL_CALENDAR_BEAN_NAME = {\n\n    API                   : 'vertical_calendar_api',\n    CONFIGURATION         : 'configuration',\n    CONTROLLER_HANDLER    : 'vertical_calendar_controller_handler',\n    DATA_BLOCK            : 'vertical_calendar_data_block',\n    NAVIGATOR_INTERACTOR  : 'vertical_calendar_navigator_interactor',\n    ROW_RENDERER          : 'ertical_calendar_row_renderer',\n    BUTTON_NAVIGATOR      : 'vertical_calendar_button_navigator',\n    EVENT_MANGER          : 'vertical_calendar_event_manager',\n    AXIS_HANDLER          : 'vertical_calendar_axis_handler',\n    EVENT_POSITION_HANLDER: 'vertical_calendar_event_position_handler',\n    EVENT_STORE           : 'vertical_calendar_event_store',\n    PREVIEW_EVENT_STORE   : 'vertical_calendar_preview_event_store',\n    DATE_PARSER           : 'date_parser',\n\n\n\n\n\n\n}","\n\n\nexport const VERTICAL_CALENDAR_EVENT_NAME = {\n    SET_INNER_LAYER_TOP    : 'SET_INNER_LAYER_TOP',\n    INITIALIZE_ROWS        : 'INITIALIZE_ROWS',\n    INITIALIZE_CELLS       : 'INITIALIZE_CELLS',\n    DISPLAY_ROWS           : 'DISPLAY_ROWS',\n    VIEW_PORT_CHANGE       : 'VIEW_PORT_CHANGE',\n    UPDATE_SCROLLTOP       : 'UPDATE_SCROLLTOP',\n    INITIALIZE_MONTHS      : 'INITIALIZE_MONTHS',\n    DESTROY_ROWS_CONTROLERS: 'DESTROY_ROWS_CONTROLERS',\n    DESTROY_ROWS_COMPONENTS: 'DESTROY_ROWS_COMPONENTS',\n    MONTH_UPDATED          : 'MONTH_UPDATED',\n    EVENTS_DATA_LOADED     : 'EVENTS_DATA_LOADED',\n    LOAD_EVENTS            : 'LOAD_EVENTS',\n    UPDATE_TIMEZONE        : 'UPDATE_TIMEZONE',\n    HIEGHT_UPDATED         : 'HIEGHT_UPDATED'\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { CalendarAxisHandlerType, IMonthGridAxis } from \"./axis-handler.types\";\nimport { AutoWired, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\nimport { ICalendarDataStore } from \"../../data-structure/calendar-data-store.types\";\n\n\nconst eventHeight = 20;\nconst bufferTop = 4;\nconst totalEventHeight = eventHeight + bufferTop;\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.AXIS_HANDLER)\nexport class CalendarAxisHandler extends EventEmitter implements CalendarAxisHandlerType {\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK) private calendarDataManager!: ICalendarDataStore;\n\n\n    @PostConstruct()\n    init():void{\n        \n    }\n\n    getRowHeight(_index: number): number {\n        return  125.16;\n    }\n    getColumnWidth(_index : number): number {\n        return 98;\n    }\n    getRowCount() { \n        return this.calendarDataManager.getRowCount();\n    }\n    getColumnCount() {\n        return this.calendarDataManager.getColumnCount();\n    }\n\n    getCalendarAxis(): IMonthGridAxis{\n        return {\n            getRowHeight : this.getRowHeight.bind(this),\n            getColumnWidth : this.getColumnWidth.bind(this),\n            getRowCount : this.getRowCount.bind(this),\n            getColumnCount : this.getColumnCount.bind(this),\n            getEventHeight : () => {\n                return eventHeight;\n            },\n            getEventHeightWithBuffer : () => {\n                return totalEventHeight;\n            },\n            getTopBuffer : () => {\n                return bufferTop / 2;\n            }\n        }\n    }\n\n}","import { AutoWired, Bean } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { ButtonNavigatorTypes } from \"./button-interactor.types\";\nimport { CalendarNavigatorInteractor } from \"../navigators/calendar-navigator-interactor\";\n\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.BUTTON_NAVIGATOR)\nexport class ButtonInteractor extends EventEmitter implements ButtonNavigatorTypes{\n\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.NAVIGATOR_INTERACTOR) private navigationInteractor!: CalendarNavigatorInteractor;\n\n\n    goToNextMonth(): void {\n        this.navigationInteractor.gotoNext();\n       \n    }\n    goToPreviousMonth(): void {\n        this.navigationInteractor.gotoPrevious();\n    }\n\n\n    goToToday(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    goToSelectedDate(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    goToDate(_date: Date): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    goToNextYear(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    goToPreviousYear(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    goToNextWeek(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n    goToPreviousWeek(): void {\n        throw new Error(\"Method not implemented.\");\n    }\n\n\n\n\n    \n}","import { PostConstruct } from \"@dg/corecomponent\";\nimport { IEventObject } from \"../../data-structure/event-object.types\";\nimport { IEventData } from \"../../vertical-calendar-configuration\";\nimport { IAdaptor } from \"../event-handler/adaptor/adaptor.types\";\nimport { EventManager } from \"../event-handler/adaptor/events-manager\";\nimport { EventsManagerType } from \"../event-handler/adaptor/events.manager.types\";\nimport { CacheManagerTypes } from \"./cache-manager.types\";\nimport { EventEmitter } from \"@dg/corecomponent\";\n\n\nexport class CacheManager extends EventEmitter implements CacheManagerTypes {\n  private extraFetch: number;\n  private periodType: 'month' | 'week' | 'year';\n  private cache: { startDate: Date | null, endDate: Date | null } = { startDate: null, endDate: null };\n  private eventManager!: EventsManagerType;\n  private adaptor : IAdaptor;\n\n  constructor(extraFetch: number, periodType: 'month' | 'week' | 'year', adaptor: IAdaptor) {\n    super();\n    this.extraFetch = extraFetch;\n    this.periodType = periodType;\n    this.adaptor    = adaptor;\n    \n  }\n\n  @PostConstruct()\n  init() {\n    this.eventManager = this.createManagedBean(new EventManager(this.adaptor));\n  }\n\n\n\n  private calculateRange(currentDate: Date): { startDate: Date, endDate: Date } {\n    const startDate = new Date(currentDate);\n    const endDate   = new Date(currentDate);\n\n    if (this.periodType === 'month') {\n      startDate.setDate(1);\n      startDate.setMonth(startDate.getMonth() - this.extraFetch);\n      endDate.setMonth(endDate.getMonth() + this.extraFetch + 1);\n      endDate.setDate(0);\n    } else if (this.periodType === 'week') {\n      startDate.setDate(startDate.getDate() - startDate.getDay());\n      startDate.setDate(startDate.getDate() - this.extraFetch * 7);\n      endDate.setDate(endDate.getDate() + (6 - endDate.getDay()));\n      endDate.setDate(endDate.getDate() + this.extraFetch * 7);\n    } else if (this.periodType === 'year') {\n      startDate.setMonth(0);\n      startDate.setDate(1);\n      startDate.setFullYear(startDate.getFullYear() - this.extraFetch);\n      endDate.setMonth(11);\n      endDate.setDate(31);\n      endDate.setFullYear(endDate.getFullYear() + this.extraFetch);\n    } else {\n      throw new Error('Invalid period type. Use \"month\", \"week\", or \"year\".');\n    }\n\n    return { startDate, endDate };\n  }\n\n  private isInCache(date: Date): boolean {\n    return this.cache.startDate !== null && this.cache.endDate !== null && date >= this.cache.startDate && date <= this.cache.endDate;\n  }\n\n  private fetchRange(currentDate: Date): { startDate: Date, endDate: Date, periodsToFetch: { startDate: Date, endDate: Date }[] } {\n    const { startDate, endDate } = this.calculateRange(currentDate);\n\n    if (this.isInCache(startDate) && this.isInCache(endDate)) {\n      return { startDate: this.cache.startDate!, endDate: this.cache.endDate!, periodsToFetch: [] };\n    }\n\n    const periodsToFetch: { startDate: Date, endDate: Date }[] = [];\n    if (this.cache.startDate && this.cache.endDate) {\n      if (!(this.isInCache(startDate) || this.isInCache(endDate))) {\n        periodsToFetch.push({ startDate, endDate });\n      } else if (startDate < this.cache.startDate) {\n        periodsToFetch.push({ startDate, endDate: this.cache.startDate });\n      } else if (endDate > this.cache.endDate) {\n        periodsToFetch.push({ startDate: this.cache.endDate, endDate });\n      }\n    } else {\n      periodsToFetch.push({ startDate, endDate });\n    }\n\n    return { startDate, endDate, periodsToFetch };\n  }\n\n  private checkFetchPeriods(newDate: Date): { startDate: Date, endDate: Date, periodsToFetch: { startDate: Date, endDate: Date }[] } {\n    const { startDate, endDate, periodsToFetch } = this.fetchRange(newDate);\n\n    this.cache.startDate = new Date(startDate);\n    this.cache.endDate = new Date(endDate);\n\n    this.eventManager.cleanupEvents(startDate, endDate);\n\n    return {\n      startDate: this.cache.startDate,\n      endDate: this.cache.endDate,\n      periodsToFetch,\n    };\n  }\n\n  private fetchAndStoreEvents(startDate: Date, endDate: Date,onSuccessCallback: (events: IEventObject[]) => void, onFailureCallback: (error: Error) => void): void {\n    this.eventManager.fetchEvents(\n      startDate,\n      endDate,\n      (_events) => {\n        onSuccessCallback(this.eventManager.getEvents(startDate, endDate));\n      },\n      (error) => {\n        onFailureCallback(error);\n      }\n    );\n  }\n\n  fetchEvents(newDate: Date, onSuccessCallback: (events: IEventObject[]) => void, onFailureCallback : () => void): void {\n    const { startDate, endDate, periodsToFetch } = this.checkFetchPeriods(newDate);\n\n    if (periodsToFetch.length === 0) {\n      onSuccessCallback(this.eventManager.getEvents(startDate, endDate));\n    } else {\n      periodsToFetch.forEach((period) => {\n        this.fetchAndStoreEvents(period.startDate, period.endDate, onSuccessCallback, onFailureCallback);\n      });\n    }\n  }\n\n  getEvents(startDate: Date, endDate: Date, date: Date, onSuccessCallback: (events: IEventObject[]) => void, onFailureCallback: (error: Error) => void): void {\n    const { periodsToFetch } = this.checkFetchPeriods(date);\n\n    if (periodsToFetch.length === 0) {\n      onSuccessCallback(this.eventManager.getEvents(startDate, endDate));\n    } else {\n      periodsToFetch.forEach((period) => {\n        this.fetchAndStoreEvents(period.startDate, period.endDate, (_events) => {\n          onSuccessCallback(this.eventManager.getEvents(startDate, endDate));\n        },\n        (error) => {\n          onFailureCallback(error);\n        });\n      });\n    }\n  }\n\n  getEventByID(id: string): IEventObject | undefined {\n    return this.eventManager.getEventByID(id);\n  }\n\n  addEvents(events: IEventData[], onSuccessCallback: (eventObject : IEventObject) => void, onFailureCallback: (error: Error) => void): void {\n    try {\n      events.forEach(event => this.eventManager.addEvent(event, \n        (eventData) => onSuccessCallback(eventData),\n        onFailureCallback\n      ));\n    } catch (error) {\n      onFailureCallback(error as Error);\n    }\n  }\n\n  removeEvents(ids: string[], onSuccessCallback: () => void, onFailureCallback: (error: Error) => void): void {\n    try {\n      ids.forEach(id => this.eventManager.deleteEvent(id, onSuccessCallback, onFailureCallback));\n    } catch (error) {\n      onFailureCallback(error as Error);\n    }\n  }\n\n  updateEvents(events: IEventData[], onSuccessCallback: (eventData : IEventObject) => void, onFailureCallback: (error: Error) => void): void {\n    try {\n      events.forEach(event => this.eventManager.updateEvent(event,\n        (eventData) => onSuccessCallback(eventData),\n        onFailureCallback\n      ));\n    } catch (error) {\n      onFailureCallback(error as Error);\n    }\n  }\n\n  updatePeriodType(periodType : 'week' | 'month' | 'year'): void {\n    this.periodType = periodType;\n  }\n\n  updateExtraFetch(extraFetch : number) : void {\n    this.extraFetch = extraFetch;\n  }\n}\n","import { Bean } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../../constant/vertical-calendar-bean-name-constant\";\nimport { IControllerHandler } from \"./controller-handler.types\";\n\n\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.CONTROLLER_HANDLER)\nclass ControllerHandler extends EventEmitter implements IControllerHandler{\n\n    private controller :any\n    private ready : boolean = false;\n    private readyCallbacks: ((param: any) => void)[] = [];\n\n\n    registerController(controller:any): void {\n        this.controller = controller;\n        this.checkPaneIsReady();\n\n\n    }\n\n    getController(): any {\n        return this.controller;\n    }\n\n    onAfterReady(callback: (param:any) => void): void {\n        if (this.ready) {\n            callback(this.createPaneController());\n\n        } else {\n            this.readyCallbacks.push(callback);\n        }\n    }\n\n    private checkPaneIsReady(): void {\n       this.ready = this.controller != null;\n\n        if (this.ready) {\n            const param = this.createPaneController();\n            this.readyCallbacks.forEach(callback => callback(param));\n            this.readyCallbacks.length = 0;\n        }\n    }\n\n    private createPaneController(){\n        return {\n            controller: this.controller\n        };\n    }\n    \n\n\n}\n\nexport {\n    ControllerHandler\n}","\nimport { VerticalCalendarRowComponentTypes, VerticalCalendarRowControllerTypes } from \"../../../vertical-calendar-component/vertical-calendar-row-component/vertical-calendar-row-component.types\";\n\n\n\nexport interface IRowControllerWrapper {\n    setComponent(component : VerticalCalendarRowComponentTypes): void;\n    getInstanceId(): string\n\n}\nexport function RowControllerWrapper(rowController : VerticalCalendarRowControllerTypes) : IRowControllerWrapper {\n    return {\n        setComponent(component : VerticalCalendarRowComponentTypes) : void {\n            return rowController.setComponent(component)\n        },\n\n        getInstanceId(): string {\n            return rowController.getInstanceId()\n        }\n\n    }\n}\n\n","import { EventEmitter } from \"@dg/corecomponent\";\n\n\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../../constant/vertical-calendar-bean-name-constant\";\nimport { AutoWired, Bean, BEAN_NAME, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { ICalendarDataStore } from \"../../../data-structure/calendar-data-store.types\";\nimport { RowRendererTypes } from \"./row-renderer-controller.types\";\nimport { VERTICAL_CALENDAR_EVENT_NAME } from \"../../../constant/vertical-calendar-event-name\";\nimport { VerticalCalendarRowController } from \"../../../vertical-calendar-component/vertical-calendar-row-component/vertical-calendar-row-controller\";\nimport { CalendarType } from \"../../../vertical-calendar-configuration\";\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.ROW_RENDERER)\nexport class RowRendererController extends EventEmitter implements RowRendererTypes {\n\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK) private dataBlock!: ICalendarDataStore;\n\t@AutoWired(BEAN_NAME.BEANS) getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\n    private rowControllers : Map<number, VerticalCalendarRowController> = new Map();\n    private startTimeStamp!: number;\n    private endTimeStamp!  : number;\n\n\n    @PostConstruct()\n    init() {\n        this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.INITIALIZE_ROWS, this.initializeRows.bind(this));\n        this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.VIEW_PORT_CHANGE, this.updateRowControllers.bind(this));\n        // this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.DESTROY_ROWS, this.destroy.bind(this));\n\n    }\n\n    initializeRows() {\n\n        const weekNodes = this.dataBlock.getAllWeekNodes();\n        \n\n        weekNodes.forEach((weekNode) => {\n            const timeStamp = weekNode.getTimeStamp();\n            this.rowControllers.set(timeStamp, new VerticalCalendarRowController(weekNode, timeStamp.toString(), this.getBeanInstanceByBeanName));\n        });\n\n        this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.DISPLAY_ROWS});\n        this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.MONTH_UPDATED});\n    }\n\n    getRowControllers(): VerticalCalendarRowController[] {\n        return Array.from(this.rowControllers.values());\n    }\n\n    updateRowControllers(): void {\n        const weekNodes = this.dataBlock.getWeekNodesInSortedOrder();\n\n\n\n\n        const startTimeStamp = weekNodes[0].getTimeStamp();\n        const endTimeStamp = weekNodes[weekNodes.length - 1].getTimeStamp();\n\n        if(this.startTimeStamp === startTimeStamp && this.endTimeStamp === endTimeStamp) {\n            return\n        }\n\n        this.startTimeStamp = startTimeStamp;\n        this.endTimeStamp = endTimeStamp;\n\n        const calendarType = this.optionsHandler.getCalendarType();\n        if(calendarType === CalendarType.horizontalMonth){\n            this.destroyContollers(this.rowControllers, new Set<number>());\n\n        }\n\n\n\n        weekNodes.forEach((weekNode) => {\n            const timeStamp = weekNode.getTimeStamp();\n            // const date = new Date(timeStamp);\n\n            // console.log(`Updated row controllers  ${weekNode} date ${date}.`);\n\n            if (!this.rowControllers.has(timeStamp)) {\n                this.rowControllers.set(timeStamp, new VerticalCalendarRowController(weekNode, timeStamp.toString(), this.getBeanInstanceByBeanName));\n            }\n        });\n\n\n        if(calendarType === CalendarType.verticalMonth){\n            const weekTimeStamps = new Set(weekNodes.map(node => node.getTimeStamp())) as Set<number>;\n\n            this.destroyContollers(this.rowControllers,weekTimeStamps);\n\n        }\n\n      \n        // for (const [timeStamp, _controller] of this.rowControllers) {\n        //     if (!weekTimeStamps.has(timeStamp)) {\n        //         this.rowControllers.get(timeStamp)?.destroy();\n        //         this.rowControllers.delete(timeStamp);\n        //     }\n        // }\n\n\n        this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.DISPLAY_ROWS});\n        this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.MONTH_UPDATED});\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.LOAD_EVENTS});\n\n\n    }\n\n\n    protected destroy(): void {\n\n        this.rowControllers.forEach((controller) => controller.destroy());\n        this.rowControllers.clear();\n        this.startTimeStamp = 0;\n        this.endTimeStamp   = 0;\n    }\n    destroyContollers(controllers:  Map<number, VerticalCalendarRowController>,weekTimeStamps : Set<number>): void {\n        const calendarType = this.optionsHandler.getCalendarType();\n        let destroyAll = false;\n        if(calendarType === CalendarType.horizontalMonth){\n            destroyAll = true;\n\n        }\n    \n\n        if(controllers){\n            for (const [timeStamp, _controller] of this.rowControllers) {\n                if (destroyAll || !weekTimeStamps.has(timeStamp)) {\n                    const controller = this.rowControllers.get(timeStamp)\n                    controller?.destroy();\n                    this.rowControllers.delete(timeStamp);\n                }\n            }\n        }\n       \n    }\n\n}\n","\n\nimport { IGenericDataStore } from \"./generic-data-store.types\";\n\n\nexport class GenericDataStore<T> implements IGenericDataStore<T> {\n    private dataMap: Map<string, T>;\n    private order: string[];\n  \n    constructor() {\n      this.dataMap = new Map();\n      this.order = [];\n    }\n  \n    /**\n     * Add a new data item to the store.\n     * @param id - Unique identifier for the data item.\n     * @param data - Data item to store.\n     */\n    addData(id: string, data: T): void {\n      if (!this.dataMap.has(id)) {\n        this.dataMap.set(id, data);\n        this.order.push(id);\n      }\n    }\n  \n    /**\n     * Retrieve a data item by its ID.\n     * @param id - The ID of the data item.\n     */\n    getData(id: string): T | undefined {\n      return this.dataMap.get(id);\n    }\n  \n    /**\n     * Remove a data item by its ID.\n     * @param id - The ID of the data item to remove.\n     * @returns True if the data was removed, false otherwise.\n     */\n    removeData(id: string): boolean {\n      if (this.dataMap.has(id)) {\n        this.dataMap.delete(id);\n        this.order = this.order.filter((orderId) => orderId !== id);\n        return true;\n      }\n      return false;\n    }\n  \n    /**\n     * Check if a data item exists in the store.\n     * @param id - The ID to check.\n     */\n    hasData(id: string): boolean {\n      return this.dataMap.has(id);\n    }\n  \n    /**\n     * Get all data items in order.\n     */\n    getAllData(): T[] {\n      return this.order.map((id) => this.dataMap.get(id)!) as T[];\n    }\n  \n    /**\n     * Insert a new data item after an existing one.\n     * @param existingId - The ID of the existing data item.\n     * @param newId - The ID of the new data item.\n     * @param newData - The new data item.\n     */\n    insertDataAfterId(existingId: string, newId: string, newData: T): boolean {\n      const index = this.order.indexOf(existingId);\n      if (index === -1 || this.dataMap.has(newId)) {\n        return false;\n      }\n  \n      this.order.splice(index + 1, 0, newId);\n      this.dataMap.set(newId, newData);\n      return true;\n    }\n  \n    /**\n     * Insert a new data item before an existing one.\n     * @param existingId - The ID of the existing data item.\n     * @param newId - The ID of the new data item.\n     * @param newData - The new data item.\n     */\n    insertDataBeforeId(existingId: string, newId: string, newData: T): boolean {\n      const index = this.order.indexOf(existingId);\n      if (index === -1 || this.dataMap.has(newId)) {\n        return false;\n      }\n  \n      this.order.splice(index, 0, newId);\n      this.dataMap.set(newId, newData);\n      return true;\n    }\n  \n    /**\n     * Delete all data items after a specific ID.\n     * @param id - The ID after which data items should be deleted.\n     */\n    deleteDataAfterId(id: string): void {\n      const index = this.order.indexOf(id);\n      if (index !== -1 && index < this.order.length - 1) {\n        const idsToDelete = this.order.splice(index + 1);\n        idsToDelete.forEach((deleteId) => this.dataMap.delete(deleteId));\n      }\n    }\n  \n    /**\n     * Delete all data items before a specific ID.\n     * @param id - The ID before which data items should be deleted.\n     */\n    deleteDataBeforeId(id: string): void {\n      const index = this.order.indexOf(id);\n      if (index !== -1 && index > 0) {\n        const idsToDelete = this.order.splice(0, index);\n        idsToDelete.forEach((deleteId) => this.dataMap.delete(deleteId));\n      }\n    }\n  \n    /**\n     * Retrieve data items within a range of indices.\n     * @param fromIndex - The start index (inclusive).\n     * @param toIndex - The end index (inclusive).\n     */\n    getDataInRange(fromIndex: number, toIndex: number): T[] {\n      if (fromIndex < 0 || toIndex >= this.order.length || fromIndex > toIndex) {\n        return [];\n      }\n  \n      const idsInRange = this.order.slice(fromIndex, toIndex + 1);\n      return idsInRange.map((id) => this.dataMap.get(id)!) as T[];\n    }\n\n    getNextId(id: string): string | null {\n        let index = this.order.findIndex((existingId) => existingId === id);\n    \n        if (index !== -1) {\n            \n            if (index + 1 < this.order.length) {\n                return this.order[index + 1]; \n            }\n        }\n    \n        return null; \n    }\n\n    getPreviousId(id: string): string | null {\n        let index = this.order.findIndex((existingId) => existingId === id);\n    \n        if (index > 0) {\n            return this.order[index - 1]; \n        }\n    \n        return null; \n    }\n\n    getFirstId(): string | null {\n        if (this.order.length > 0) {\n            return this.order[0]; \n        }\n    \n        return null; \n    }\n\n    getLastId(): string | null {\n        if (this.order.length > 0) {\n            return this.order[this.order.length - 1]; \n        }\n    \n        return null; \n    }\n\n    getOrders(): string[] {\n      return this.order ?? [];\n    }\n\n    updateData(id: string, data: T): void {\n      if(this.dataMap.has(id)){\n        this.dataMap.set(id, data);\n      }\n    }\n  }\n  ","import { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { AutoScrollHandler } from \"../../utils/auto-scroll-handler\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\n\ntype EventDropCallback = (\n  eventId: string,\n  newStart: string,\n  newEnd: string\n) => void;\n\ninterface CalendarEventDragDropOptions {\n  calendarElement: HTMLElement; // The calendar container element\n  onEventDrop: EventDropCallback;\n}\n\nexport class CalendarEventDragDrop {\n  private options: CalendarEventDragDropOptions;\n  private dragState: any = null;\n  private ghostElement: HTMLElement | null = null;\n  private autoScrollHandler: AutoScrollHandler;\n  private readonly DRAG_THRESHOLD = 5; // pixels to move before considering it a drag\n  private isDragging = false;\n  private initialX = 0;\n  private initialY = 0;\n  private lastHoverDates: string[] = [];\n  private getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\n  constructor(options: CalendarEventDragDropOptions, getBeanInstanceByBeanName:getBeanInstanceByBeanName) {\n    this.options = options;\n    this.autoScrollHandler = new AutoScrollHandler({\n      calendarElement: options.calendarElement\n    });\n    this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n    this.attachListeners();\n  }\n\n  private attachListeners() {\n    const calendar = this.options.calendarElement;\n    if (!calendar) {\n      console.warn('Calendar element not provided');\n      return;\n    }\n\n    // Use event delegation for better performance\n    calendar.addEventListener('mousedown', this.onMouseDown as EventListener);\n    calendar.addEventListener('touchstart', this.onTouchStart as EventListener, { passive: false });\n  }\n\n  private onMouseDown = (e: MouseEvent) => {\n    // Try to find a time-based event first\n    let eventEl = (e.target as HTMLElement).closest('.dg-calendar-time-event') as HTMLElement;\n    let isTimeEvent = true;\n    if (!eventEl) {\n      // Fallback to all-day event\n      eventEl = (e.target as HTMLElement).closest('.dg-calendar-event') as HTMLElement;\n      isTimeEvent = false;\n    }\n    if (!eventEl) return;\n\n    // Check if event is readonly (you might need to adjust this based on your data structure)\n    if (eventEl.dataset.readonly === \"true\") return;\n\n    e.preventDefault();\n    \n    // Store initial position for drag detection\n    this.initialX = e.clientX;\n    this.initialY = e.clientY;\n    this.isDragging = false;\n    \n    // Determine which segment date was clicked (for multi-day events)\n    const segmentDate = eventEl.dataset.segmentDate || eventEl.dataset.startDate;\n    const originalStartDate = eventEl.dataset.startDate;\n\n    // Calculate offsetDays at drag start (for all-day events)\n    let offsetDays = 0;\n    if (!isTimeEvent && segmentDate && originalStartDate) {\n      const segment = new Date(segmentDate);\n      const originalStart = new Date(originalStartDate);\n      offsetDays = Math.round((segment.getTime() - originalStart.getTime()) / (1000 * 60 * 60 * 24));\n    }\n\n    // Store event element for potential drag\n    this.dragState = {\n      eventEl,\n      isTimeEvent,\n      eventId: eventEl.dataset.eventId,\n      originalEventData: {\n        startDate: eventEl.dataset.startDate,\n        endDate: eventEl.dataset.endDate,\n        segmentDate: segmentDate,\n        startTime: eventEl.dataset.startTime, // for time events\n        endTime: eventEl.dataset.endTime // for time events\n      },\n      offsetDays // <--- store this!\n    };\n    \n    document.addEventListener('mousemove', this.onMouseMove as EventListener);\n    document.addEventListener('mouseup', this.onMouseUp as EventListener);\n  };\n\n  private onTouchStart = (e: TouchEvent) => {\n    const touch = e.touches[0];\n    const eventEl = (e.target as HTMLElement).closest('.dg-calendar-event') as HTMLElement;\n    if (!eventEl) return;\n\n    if (eventEl.dataset.readonly === \"true\") return;\n\n    e.preventDefault();\n    \n    // Store initial position for drag detection\n    this.initialX = touch.clientX;\n    this.initialY = touch.clientY;\n    this.isDragging = false;\n    \n    // Determine which segment date was clicked (for multi-day events)\n    const segmentDate = eventEl.dataset.segmentDate || eventEl.dataset.startDate;\n\n    // Store event element for potential drag\n    this.dragState = {\n      eventEl,\n      eventId: eventEl.dataset.eventId,\n      originalEventData: {\n        startDate: eventEl.dataset.startDate,\n        endDate: eventEl.dataset.endDate,\n        segmentDate: segmentDate\n      }\n    };\n    \n    document.addEventListener('touchmove', this.onTouchMove as EventListener, { passive: false });\n    document.addEventListener('touchend', this.onTouchEnd as EventListener);\n  };\n\n  private startDrag(eventEl: HTMLElement, clientX: number, clientY: number) {\n    // Add dragging class to the event\n    eventEl.classList.add('dragging');\n\n    // Create ghost element\n    const ghost = eventEl.cloneNode(true) as HTMLElement;\n    ghost.classList.add('drag-ghost');\n    ghost.classList.remove('dragging');\n\n    // Position ghost absolutely\n    ghost.style.position = 'fixed';\n    ghost.style.pointerEvents = 'none';\n    ghost.style.zIndex = '1000';\n    ghost.style.opacity = '0.7';\n\n    // Get the actual computed width of the original event element\n    const computedStyle = window.getComputedStyle(eventEl);\n    const originalWidth = computedStyle.width;\n    const originalPadding = eventEl.dataset.padding || '0';\n\n    // Store original event data for proper width calculation\n    const originalStartDate = eventEl.dataset.startDate;\n    const originalEndDate = eventEl.dataset.endDate;\n\n    // Set the ghost element width to match the original event\n    ghost.style.width = originalWidth;\n\n    // Also copy other relevant styles to maintain visual consistency\n    ghost.style.height = computedStyle.height;\n    ghost.style.padding = computedStyle.padding;\n    ghost.style.margin = computedStyle.margin;\n    ghost.style.borderRadius = computedStyle.borderRadius;\n    ghost.style.backgroundColor = computedStyle.backgroundColor;\n    ghost.style.color = computedStyle.color;\n    ghost.style.fontSize = computedStyle.fontSize;\n    ghost.style.fontWeight = computedStyle.fontWeight;\n\n    // Store the original width calculation for later use\n    const widthPercent = eventEl.dataset.widthPercent;\n    const paddingValue = eventEl.dataset.paddingValue;\n\n    // Add ghost to DOM and store reference\n    document.body.appendChild(ghost);\n    this.ghostElement = ghost;\n\n    const rect = eventEl.getBoundingClientRect();\n\n    // Store drag state (without ghost element reference)\n    this.dragState = {\n      eventEl,\n      offsetX: clientX - rect.left,\n      offsetY: clientY - rect.top,\n      originalParent: eventEl.parentElement,\n      lastHoverCell: null,\n      eventId: eventEl.dataset.eventId,\n      // Store original event data for proper calculations\n      originalEventData: {\n        startDate: originalStartDate,\n        endDate: originalEndDate,\n        width: originalWidth,\n        padding: originalPadding,\n        widthPercent: widthPercent,\n        paddingValue: paddingValue\n      },\n      // Store original positioning data\n      originalStyle: {\n        width: eventEl.style.width,\n        top: eventEl.style.top,\n        left: eventEl.style.left,\n        position: eventEl.style.position\n      }\n    };\n  }\n\n  private onMouseMove = (e: MouseEvent) => {\n    if (!this.dragState) return;\n    \n    // Check if we should start dragging\n    if (!this.isDragging) {\n      const deltaX = Math.abs(e.clientX - this.initialX);\n      const deltaY = Math.abs(e.clientY - this.initialY);\n      \n      if (deltaX > this.DRAG_THRESHOLD || deltaY > this.DRAG_THRESHOLD) {\n        this.isDragging = true;\n        this.startDrag(this.dragState.eventEl, e.clientX, e.clientY);\n      }\n      return;\n    }\n    \n    this.handleDrag(e.clientX, e.clientY);\n  };\n\n  private onTouchMove = (e: TouchEvent) => {\n    const touch = e.touches[0];\n    if (!this.dragState) return;\n    \n    // Check if we should start dragging\n    if (!this.isDragging) {\n      const deltaX = Math.abs(touch.clientX - this.initialX);\n      const deltaY = Math.abs(touch.clientY - this.initialY);\n      \n      if (deltaX > this.DRAG_THRESHOLD || deltaY > this.DRAG_THRESHOLD) {\n        this.isDragging = true;\n        this.startDrag(this.dragState.eventEl, touch.clientX, touch.clientY);\n      }\n      return;\n    }\n    \n    this.handleDrag(touch.clientX, touch.clientY);\n    e.preventDefault();\n  };\n\n  private handleDrag(clientX: number, clientY: number) {\n    if (!this.dragState || !this.ghostElement) return;\n\n    const { offsetX, offsetY, isTimeEvent } = this.dragState;\n\n    // Move ghost with cursor\n    this.ghostElement.style.left = (clientX - offsetX) + 'px';\n    this.ghostElement.style.top = (clientY - offsetY) + 'px';\n\n    // Find cell holder under cursor\n    const el = document.elementFromPoint(clientX, clientY);\n    const cellHolder = el && el.closest('.dg-calendar-cell-holder');\n\n    // --- HOVER DATE RANGE LOGIC ---\n    let hoverStartDate: string | null = null;\n    let hoverEndDate: string | null = null;\n    let hoverDates: string[] = [];\n    // let hoverTime: string | null = null;\n\n    if (cellHolder) {\n        const cellElement = cellHolder.querySelector('.dg-calendar-cell[data-date]');\n        const targetDate = cellElement?.getAttribute('data-date');\n\n        if (isTimeEvent && targetDate) {\n          // Time-based event drag logic\n          const cellRect = (cellElement as HTMLElement).getBoundingClientRect();\n          const yInCell = clientY - cellRect.top;\n          const cellHeight = cellRect.height;\n          const minutesInDay = 24 * 60;\n          const slotMinutes = 30;\n          const totalSlots = minutesInDay / slotMinutes;\n          const slotHeight = cellHeight / totalSlots;\n          const slotIndex = Math.floor(yInCell / slotHeight);\n          const minutes = slotIndex * slotMinutes;\n          const hours = Math.floor(minutes / 60);\n          const mins = minutes % 60;\n\n          // Build the new start time\n          const newStart = new Date(targetDate);\n          newStart.setHours(hours, mins, 0, 0);\n          // hoverTime = `${String(hours).padStart(2, '0')}:${String(mins).padStart(2, '0')}`;\n          hoverStartDate = newStart.toISOString(); // full ISO with time\n          hoverEndDate = hoverStartDate; // For single-slot events, or calculate duration if needed\n          hoverDates = [hoverStartDate];\n          // Optionally, preview the time event visually here\n        } else if (targetDate && this.dragState.originalEventData) {\n          // All-day event drag logic (unchanged)\n          const originalStart = new Date(this.dragState.originalEventData.startDate);\n          const originalEnd = new Date(this.dragState.originalEventData.endDate);\n\n          // Duration in days (inclusive)\n          const durationMs = originalEnd.getTime() - originalStart.getTime();\n          const durationDays = Math.ceil(durationMs / (1000 * 60 * 60 * 24)) + 1;\n\n          // Use the offsetDays from dragState\n          const offsetDays = this.dragState.offsetDays || 0;\n\n          // The new start date is the drop cell's date minus the offset\n          const dropDate = new Date(targetDate);\n          dropDate.setDate(dropDate.getDate() - offsetDays);\n\n          hoverStartDate = dropDate.toISOString().slice(0, 10);\n\n          // Calculate new end date based on the new start date and original duration\n          const newEnd = new Date(dropDate);\n          newEnd.setDate(dropDate.getDate() + durationDays - 1);\n          hoverEndDate = newEnd.toISOString().slice(0, 10);\n\n          // Get the array of dates in the range\n          hoverDates = getDateRangeArray(hoverStartDate, hoverEndDate);\n        }\n\n        // Highlight logic (unchanged)\n        const calendarDataStore = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK);\n        if(this.lastHoverDates){\n          this.lastHoverDates.forEach(date => {\n            calendarDataStore.toggleHoverEffect(new Date(date),false)\n          })\n        }\n        hoverDates.forEach(date => {\n          calendarDataStore.toggleHoverEffect(new Date(date),true)\n        })\n        this.lastHoverDates = hoverDates;\n    }\n\n    if (cellHolder !== this.dragState.lastHoverCell) {\n      // Remove highlight from previous cell\n      if (this.dragState.lastHoverCell) {\n        this.dragState.lastHoverCell.classList.remove('drag-hover');\n      }\n\n      // Add highlight to new cell\n      if (cellHolder) {\n        cellHolder.classList.add('drag-hover');\n      }\n\n      this.dragState.lastHoverCell = cellHolder;\n    }\n\n    // Update auto-scroll using the utility\n    this.autoScrollHandler.update(clientY, clientX);\n  }\n\n  private onMouseUp = (_e: MouseEvent) => {\n    if (this.isDragging) {\n      this.handleDrop();\n    } else {\n      // No drag occurred, just clean up\n      this.dragState = null;\n    }\n    \n    // Reset drag state\n    this.isDragging = false;\n    this.initialX = 0;\n    this.initialY = 0;\n    \n    // Stop auto-scroll\n    this.autoScrollHandler.stop();\n    \n    document.removeEventListener('mousemove', this.onMouseMove as EventListener);\n    document.removeEventListener('mouseup', this.onMouseUp as EventListener);\n  };\n\n  private onTouchEnd = (_e: TouchEvent) => {\n    if (this.isDragging) {\n      this.handleDrop();\n    } else {\n      // No drag occurred, just clean up\n      this.dragState = null;\n    }\n    \n    // Reset drag state\n    this.isDragging = false;\n    this.initialX = 0;\n    this.initialY = 0;\n    \n    // Stop auto-scroll\n    this.autoScrollHandler.stop();\n    \n    document.removeEventListener('touchmove', this.onTouchMove as EventListener);\n    document.removeEventListener('touchend', this.onTouchEnd as EventListener);\n  };\n\n  private cleanupGhostElements() {\n    // Remove ghost element if it exists\n    try {\n      if (this.ghostElement && this.ghostElement.parentNode) {\n        this.ghostElement.remove();\n        this.ghostElement = null;\n      }\n    } catch (error) {\n      console.warn('Error cleaning up ghost element:', error);\n    }\n  }\n\n  private handleDrop() {\n    if (!this.dragState) return;\n\n    const { eventEl, lastHoverCell, eventId, originalEventData, offsetDays, isTimeEvent } = this.dragState;\n\n    // Destroy ghost element first\n    if (this.ghostElement && this.ghostElement.parentNode) {\n      this.ghostElement.remove();\n      this.ghostElement = null;\n    }\n    eventEl.classList.remove('dragging');\n\n    // Remove dragging class from original event\n\n    // Check if dropped outside container boundary\n    if (!lastHoverCell) {\n      // Dropped outside container, just clean up without processing\n      this.dragState = null;\n      this.autoScrollHandler.stop();\n      return;\n    }\n\n    // Remove hover highlight from cell\n    if (lastHoverCell) {\n      lastHoverCell.classList.remove('drag-hover');\n    }\n\n    // Call callback with event data\n    if (typeof this.options.onEventDrop === 'function' && lastHoverCell) {\n      // Find the cell element within the cell holder to get the date\n      const cellElement = lastHoverCell.querySelector('.dg-calendar-cell[data-date]');\n      const targetDate = cellElement?.getAttribute('data-date');\n\n      if (isTimeEvent && targetDate) {\n        // Time-based event drop logic\n        const cellRect = (cellElement as HTMLElement).getBoundingClientRect();\n        // Use the last known mouse Y position (from ghost?) or store it in dragState\n        // For now, use the center of the event element\n        const eventRect = eventEl.getBoundingClientRect();\n        const yInCell = (eventRect.top + eventRect.height / 2) - cellRect.top;\n        const cellHeight = cellRect.height;\n        const minutesInDay = 24 * 60;\n        const slotMinutes = 30;\n        const totalSlots = minutesInDay / slotMinutes;\n        const slotHeight = cellHeight / totalSlots;\n        const slotIndex = Math.floor(yInCell / slotHeight);\n        const minutes = slotIndex * slotMinutes;\n        const hours = Math.floor(minutes / 60);\n        const mins = minutes % 60;\n        const newStart = new Date(targetDate);\n        newStart.setHours(hours, mins, 0, 0);\n        // Call the drop callback with the new start time (and optionally end time)\n        this.options.onEventDrop(eventId, newStart.toISOString(), newStart.toISOString());\n        eventEl.style.display = 'none';\n      } else if (targetDate) {\n        // All-day event drop logic (unchanged)\n        const dropDate = new Date(targetDate);\n        dropDate.setDate(dropDate.getDate() - (offsetDays || 0));\n        const newStartDate = dropDate.toISOString().slice(0, 10);\n        const newEndDate = this.calculateEndDate(newStartDate, originalEventData);\n\n        // Only call the callback if the date range has changed\n        if (\n          newStartDate !== originalEventData.startDate ||\n          newEndDate !== originalEventData.endDate\n        ) {\n          this.options.onEventDrop(eventId, newStartDate, newEndDate);\n          eventEl.style.display = 'none';\n        }\n      }\n    }\n\n    // Clear drag state\n    this.dragState = null;\n    this.autoScrollHandler.stop();\n    const calendarDataStore = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK);\n\n    if(this.lastHoverDates){\n      this.lastHoverDates.forEach(date => {\n        calendarDataStore.toggleHoverEffect(new Date(date),false)\n      })\n    }\n  }\n\n  private calculateEndDate(startDate: string, originalEventData: any): string {\n    // Calculate the original event duration in days\n    const originalStart = new Date(originalEventData.startDate);\n    const originalEnd = new Date(originalEventData.endDate);\n\n    // Calculate duration in days (inclusive of both start and end dates)\n    const durationMs = originalEnd.getTime() - originalStart.getTime();\n    const durationDays = Math.ceil(durationMs / (1000 * 60 * 60 * 24)) + 1; // +1 because both start and end dates count\n\n    // Handle edge case where duration calculation might be 0 or negative\n    const finalDuration = Math.max(1, durationDays);\n\n    // Calculate new end date based on the new start date and original duration\n    const newStart = new Date(startDate);\n    const newEnd = new Date(newStart);\n    newEnd.setDate(newStart.getDate() + finalDuration - 1); // -1 because start date counts as day 1\n\n    return newEnd.toISOString().slice(0, 10);\n  }\n\n  // Public method to destroy the instance\n  public destroy() {\n    if (this.dragState) {\n      this.handleDrop();\n    }\n\n    // Clean up any remaining ghost elements\n    this.cleanupGhostElements();\n\n    // Stop auto-scroll\n    this.autoScrollHandler.stop();\n\n    const calendar = this.options.calendarElement;\n    if (calendar) {\n      calendar.removeEventListener('mousedown', this.onMouseDown as EventListener);\n      calendar.removeEventListener('touchstart', this.onTouchStart as EventListener);\n    }\n  }\n}\n\nfunction getDateRangeArray(start: string, end: string): string[] {\n  const result: string[] = [];\n  let current = new Date(start);\n  const endDate = new Date(end);\n\n  while (current <= endDate) {\n    result.push(current.toISOString().slice(0, 10));\n    current.setDate(current.getDate() + 1);\n  }\n  return result;\n}\n","import { EventEmitter } from \"@dg/corecomponent\";\nimport { EventObject } from \"../../../data-structure/event-object\";\nimport { IEventObject } from \"../../../data-structure/event-object.types\";\nimport { IEventData } from \"../../../vertical-calendar-configuration\";\nimport { IAdaptor } from \"./adaptor.types\";\nimport { EventsManagerType } from \"./events.manager.types\";\nimport { AutoWired, PostConstruct } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_EVENT_NAME } from \"../../../constant/vertical-calendar-event-name\";\nimport { IGenericDataStore } from \"../../data-store/generic-data-store.types\";\nimport { GenericDataStore } from \"../../data-store/generic-data-store\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../../constant/vertical-calendar-bean-name-constant\";\nimport { ICalendarEventStore } from \"../new/event-store.type\";\n\n\nexport class EventManager extends EventEmitter implements EventsManagerType {\n  private adaptor: IAdaptor;\n  private events:IGenericDataStore<IEventObject> = new GenericDataStore();\n  private timezone !: string\n\n  @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.EVENT_STORE) protected eventStore!: ICalendarEventStore\n  \n\n  constructor(adaptor: IAdaptor) {\n    super()\n    this.adaptor = adaptor;\n  }\n   @PostConstruct()\n  init() {\n    this.timezone = this.optionsHandler.getTimezone();\n    this.addListener(this.eventHandler,VERTICAL_CALENDAR_EVENT_NAME.UPDATE_TIMEZONE,this.updateEventAfterTimezonUpdate.bind(this))\n   \n  }\n\n  private updateEventAfterTimezonUpdate(){\n    this.timezone = this.optionsHandler.getTimezone();\n\n    const eventDatas = this.events.getAllData();\n\n    for (let i = 0; i < eventDatas.length; i++) {\n      const event = eventDatas[i];\n      this.updateEvent(event.getEventData(),(event)=>{\n        this.eventStore.addOrUpdateEvent(event)\n      },()=>{});\n    }\n   \n  }\n\n\n  fetchEvents( startDate: Date, endDate: Date, onSuccess: (events: IEventData[]) => void, onFailure: (error: Error) => void ): void {\n    this.adaptor.fetchEvents(\n      { startDate, endDate },\n      (fetchedEvents: IEventData[]) => { \n        this.storeEvents(fetchedEvents);\n        onSuccess(fetchedEvents);\n      },\n      onFailure\n    );\n  }\n\n  private storeEvents(newEvents: IEventData[]): void {\n    newEvents.forEach((eventData) => {\n      const event = new EventObject(\n        eventData.id,\n        eventData.title,\n        eventData.startTime,\n        eventData.endTime,\n        eventData.isAllDay,\n        eventData.color!,\n        this.timezone\n      );\n      this.events.addData(event.id,event)\n    });\n  }\n\n  addEvent( eventData: IEventData, onSuccess: (event: IEventObject) => void, onFailure: (error: Error) => void ): void {\n    this.adaptor.addEvent( eventData, (addedEventData) => {\n        const addedEvent = new EventObject(\n          addedEventData.id,\n          addedEventData.title,\n          addedEventData.startTime,\n          addedEventData.endTime,\n          addedEventData.isAllDay,\n          eventData.color!,\n          this.timezone\n        );\n        this.events.addData(addedEvent.id,addedEvent)\n\n        onSuccess(addedEvent);\n      },\n      onFailure\n    );\n  }\n\n  deleteEvent( eventId: string, onSuccessCallback: (eventId: string) => void, onFailureCallback: (error: Error) => void ): void {\n    this.adaptor.deleteEvent(\n      eventId,\n      (deletedEventId) => {\n        this.events.removeData(deletedEventId);\n        onSuccessCallback(deletedEventId);\n      },\n      onFailureCallback\n    );\n  }\n\n  updateEvent( updatedEventData: IEventData, onSuccess: (event: IEventObject) => void, onFailure: (error: Error) => void ): void {\n    this.adaptor.updateEvent( updatedEventData, (eventData : IEventData) => { \n      const updatedEvent = new EventObject(\n        eventData.id,\n        eventData.title,\n        eventData.startTime,\n        eventData.endTime,\n        eventData.isAllDay,\n        eventData.color!,\n        this.timezone\n      ); \n      this.events.updateData(updatedEvent.id,updatedEvent) \n      onSuccess(updatedEvent); \n    }, onFailure );\n  }\n\n  cleanupEvents(startDate: Date, endDate: Date): void {\n    const eventDatas = this.events.getAllData()\n\n    for (let i = 0; i < eventDatas.length; i++) {\n      const event = eventDatas[i];\n      if (event.endTime < startDate || event.startTime > endDate) {\n         this.events.removeData(event.id);\n      }\n    }\n    \n  }\n\n  getEvents(startDate: Date, endDate: Date): IEventObject[] {\n    return this.events.getAllData().filter(\n      (event) => event.startTime >= startDate && event.endTime <= endDate\n    );\n  }\n\n  getEventByID(id: string): IEventObject | undefined {\n    return this.events.getData(id);\n  }\n\n}\n","import { IEventData } from \"../../../vertical-calendar-configuration\";\nimport { IAdaptor } from \"./adaptor.types\";\n\n\nexport interface FetchSourceFunctionParams {\n    startDate : Date;\n    endDate   : Date;\n    operation ?: 'fetch' | 'add' | 'delete' | 'update';\n    event    ?: any;\n}\n\nexport type FetchSourceFunction = ( params: FetchSourceFunctionParams, onSuccess: (result: any) => void, onFailure: (error: Error) => void ) => void;\n\nexport class FetchSourceAdaptor implements IAdaptor {\n    private fetchSourceFunction: FetchSourceFunction;\n\n    constructor(fetchSourceFunction: FetchSourceFunction) {\n        this.fetchSourceFunction = fetchSourceFunction;\n    }\n\n    fetchEvents( range :{startDate: Date, endDate?: Date}, onSuccessCallback: (events: any[]) => void, onFailureCallback: (error: Error) => void ): void {\n        this.fetchSourceFunction( { startDate : range.startDate, endDate : range.endDate!, operation: 'fetch' }, onSuccessCallback, onFailureCallback );\n    }\n\n    addEvent( event: IEventData, onSuccessCallback: (event: any) => void, onFailureCallback: (error: Error) => void ): void {\n        this.fetchSourceFunction( { startDate: new Date(), endDate: new Date(), operation: 'add', event }, onSuccessCallback, onFailureCallback );\n    }\n\n    deleteEvent( eventId: string, onSuccessCallback: (eventId: string) => void, onFailureCallback: (error: Error) => void ): void {\n        this.fetchSourceFunction( { startDate: new Date(), endDate: new Date(), operation: 'delete', event: { id: eventId } }, onSuccessCallback, onFailureCallback );\n    }\n\n    updateEvent( event: IEventData, onSuccessCallback: (event: any) => void, onFailureCallback: (error: Error) => void ): void {\n        this.fetchSourceFunction( { startDate: new Date(), endDate: new Date(), operation: 'update', event }, onSuccessCallback, onFailureCallback );\n    }\n}\n","import { IEventData } from \"../../../vertical-calendar-configuration\";\nimport { IAdaptor } from \"./adaptor.types\";\n\nexport class JsonAdaptor implements IAdaptor {\n  private events: any[] = []; \n\n  constructor(events : IEventData[]) {\n    this.events = events;\n  }\n\nfetchEvents(range :{startDate: Date, endDate?: Date}, onSuccess: (events: any[]) => void, onFailure: (error: Error) => void): void {\n    // setTimeout(() => {\n      try {\n        const events = this.events.filter(e => {\n          const eventStartTime = new Date(e.startTime);\n          const eventEndTime = new Date(e.endTime);\n          return eventStartTime >= range.startDate && eventEndTime <= range.endDate!;\n        });\n        onSuccess(events);\n      } catch (error) {\n        onFailure(new Error('Failed to fetch events'));\n      }\n    // }, 500);\n  }\n\n  addEvent(event: any, onSuccess: (event: any) => void, onFailure: (error: Error) => void): void {\n    // setTimeout(() => {\n      try {\n        this.events.push(event);\n        onSuccess(event);\n      } catch (error) {\n        onFailure(new Error('Failed to add event'));\n      }\n    // }, 500);\n  }\n\n  deleteEvent(eventId: string, onSuccess: (eventId: string) => void, onFailure: (error: Error) => void): void {\n    // setTimeout(() => {\n      try {\n        this.events = this.events.filter(e => e.id !== eventId);\n        onSuccess(eventId);\n      } catch (error) {\n        onFailure(new Error('Failed to delete event'));\n      }\n    // }, 500);\n  }\n\n  updateEvent(event: any, onSuccess: (event: any) => void, onFailure: (error: Error) => void): void {\n    // setTimeout(() => {\n      try {\n        const index = this.events.findIndex(e => e.id === event.id);\n        if (index !== -1) {\n          this.events[index] = event;\n          onSuccess(event);\n        } else {\n          throw new Error('Event not found');\n        }\n      } catch (error) {\n        onFailure(new Error('Failed to update event'));\n      }\n    // }, 500);\n  }\n}\n","export class CustomArray<T> extends Array<T | null> {\n    constructor(...args: (T | null)[]) {\n        super(...args);\n    }\n\n    // Method to get the original length excluding null slots\n    getOriginalLength(): number {\n        return this.filter(item => item !== null).length;\n    }\n\n    // Method to splice and insert null slots if needed\n    customSplice(index: number, deleteCount: number, ...items: (T | null)[]): void {\n        // Ensure there are enough null slots before the index\n        if (index > this.length) {\n            // Fill the array with null values up to the desired index\n            for (let i = this.length; i < index; i++) {\n                this.push(null);\n            }\n        }\n\n        // If the target index is null, directly assign the new item(s) without shifting\n        if (items.length > 0 && this[index] === null) {\n            for (let i = 0; i < items.length; i++) {\n                this[index + i] = items[i];\n            }\n        } else {\n            // Use the default splice to handle both insertion and deletion\n            super.splice(index, deleteCount, ...items);\n        }\n\n        // Remove trailing null slots if elements were deleted\n        if (deleteCount > 0 && items.length === 0) {\n            this.removeTrailingNulls();\n        }\n    }\n\n    // Helper method to remove trailing nulls after deletions\n    private removeTrailingNulls(): void {\n        while (this.length > 0 && this[this.length - 1] === null) {\n            this.pop();\n        }\n    }\n}\n","import { IEventObject } from \"../../data-structure/event-object.types\";\n\nimport { IEventBlock } from \"./event-block-types\";\n// import { IEventCoordinate, IRootCellCordinates } from \"./event-coordinates.types\";\n\nexport class EventBlock implements IEventBlock{\n    private eventData : IEventObject;\n    private startCellRowIndex : number;\n    private startCellColumnIndex : number;\n    private endCellRowIndex : number;\n    private endCellColumnIndex : number;\n    constructor(eventData : IEventObject, startCellRowIndex : number, startCellColumnIndex : number, endCellRowIndex : number, endCellColumnIndex : number) {\n        this.eventData = eventData;\n        this.startCellRowIndex = startCellRowIndex;\n        this.endCellRowIndex = endCellRowIndex;\n        this.startCellColumnIndex = startCellColumnIndex;\n        this.endCellColumnIndex = endCellColumnIndex;\n    }\n    updateEventData(eventData : IEventObject){\n        this.eventData = eventData;\n    }\n    getStartDate(){\n        return this.eventData.startTime;\n    }\n    getEndDate(){\n        return this.eventData.endTime;\n    }\n    getStartCellRowIndex(){\n        return this.startCellRowIndex;\n    }\n    getEndCellRowIndex(){\n        return this.endCellRowIndex;\n    }\n    getStartCellColumnIndex(){\n        return this.startCellColumnIndex;\n    }\n    getEndCellColumnIndex(){\n        return this.endCellColumnIndex;\n    }\n    setStartCellRowIndex(startCellRowIndex : number) {\n        this.startCellRowIndex = startCellRowIndex;\n    }\n    setEndCellRowIndex(endCellRowIndex : number) {\n        this.endCellRowIndex = endCellRowIndex;\n    }\n    setStartCellColumnIndex(startCellColumnIndex : number) {\n        this.startCellColumnIndex = startCellColumnIndex;\n    }\n    setEndCellColumnIndex(endCellColumnIndex : number) {\n        this.endCellColumnIndex = endCellColumnIndex;\n    }\n    getID(){\n        return this.eventData.id;\n    }\n    destroy(){\n        // Need to implement\n    }\n    getEventData() : IEventObject {\n        return this.eventData;\n    }\n}","import { IEventCoordinate } from \"./event-coordinates.types\";\n\nexport class EventCoordinate implements IEventCoordinate{\n    private id : string;\n    private top : number;\n    private left : number;\n    private width : number;\n    private height : number;\n    private columnindex : number;\n    private rowindex : number;\n    private cellBlockIndex : number;\n    constructor(id : string){\n        this.id = id;\n        this.top = 0;\n        this.left = 0;\n        this.width = 0;\n        this.height = 0;\n        this.columnindex = -1;\n        this.rowindex = -1;\n        this.cellBlockIndex = -1;\n    }\n    setTop(top: number): void {\n        this.top = top;\n    }\n    setWidth(width: number): void {\n        this.width = width;\n    }\n    setHeight(height: number): void {\n        this.height = height;\n    }\n    setColumnIndex(columnindex: number): void {\n        this.columnindex = columnindex;\n    }\n    setRowIndex(rowindex: number): void {\n        this.rowindex = rowindex;\n    }\n    setCellBlockIndex(cellBlockindex: number): void {\n        this.cellBlockIndex = cellBlockindex;\n    }\n    setLeft(left: number): void {\n        this.left = left;\n    }\n    getTop(): number {\n        return this.top;\n    }\n    getWidth(): number {\n        return this.width;\n    }\n    getHeight(): number {\n        return this.height;\n    }\n    getColumnIndex(): number {\n        return this.columnindex;\n    }\n    getRowIndex(): number {\n        return this.rowindex;\n    }\n    getLeft(): number {\n        return this.left;\n    }\n    getCellBlockIndex(): number {\n        return this.cellBlockIndex;\n    }\n    getID(): string {\n        return this.id;\n    }\n}","import { ICalendarDataStore } from \"../../data-structure/calendar-data-store.types\";\nimport { IEventObject } from \"../../data-structure/event-object.types\";\nimport { IEventData } from \"../../vertical-calendar-configuration\";\nimport { EventIndexMeta } from \"./event-axis.types\";\nimport { IMonthEventAxis } from \"./month-event-axis.types\";\n\nimport { IMonthGridAxis } from \"./month-grid-axis.types\";\n\nexport class MonthEventAxis implements IMonthEventAxis{\n    calendarDataManager: ICalendarDataStore\n    gridAxis : IMonthGridAxis\n    constructor(calendarDataManager: ICalendarDataStore, gridAxis: IMonthGridAxis){\n        this.calendarDataManager = calendarDataManager;\n        this.gridAxis = gridAxis;\n    }\n    getLeftPercent(columnIndex : number): number {\n        return Number((columnIndex / this.getColumnCount()).toFixed(4)); // Buffer added may be need to change\n    }\n    getWidthPercent(startColumnIndex: number, endColumnIndex: number): number {\n        return (endColumnIndex - startColumnIndex + 1) / this.getColumnCount();\n        // return Number(((endColumnIndex - startColumnIndex + 1) / this.getColumnCount()).toFixed(4)); // Buffer added may be need to change\n    }\n    getTopBuffer(){\n        return this.gridAxis.getTopBuffer();\n    }\n    getColumnWidth(index: number): number {\n        return this.gridAxis.getColumnWidth(index);\n    }\n    getEventHeight(_event : IEventObject) : number{\n        return this.gridAxis.getEventHeight();\n    }\n    getEventHeightWithBuffer() : number{\n        return this.gridAxis.getEventHeightWithBuffer();\n    }\n    findIndexForEvent(event : IEventObject) : EventIndexMeta{\n        const currentStartDate     = new Date(event.startTime);\n        const currentEndDate       = new Date(event.endTime);\n        const originalStartDateObj = this.calendarDataManager.getCurrentFirstDay();\n        const maxDateCount         = this.calendarDataManager.getColumnCount() * this.calendarDataManager.getRowCount();\n        const startIndex           = this.getDaysDifference(currentStartDate, originalStartDateObj);\n        const endIndex             = this.getDaysDifference(currentEndDate, originalStartDateObj);\n\n        return {\n            startIndex : Math.max(0, startIndex),\n            endIndex : Math.min(maxDateCount, endIndex),\n        }\n    }\n\n    private getDaysDifference(_date1: Date, _date2: Date): number {\n        // const diffInMs = Math.abs(date2 - date1);\n\n        // const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24));\n        return 20\n    }\n\n    isEventWithinRange(event: IEventData): boolean {\n        const currentStartDate = new Date(event.startTime);\n        const currentEndDate = new Date(event.endTime);\n        const originalStartDate = new Date(this.calendarDataManager.getCurrentFirstDay());\n        const originalEndDate = new Date(this.calendarDataManager.getCurrentLastDay());\n\n        // Check if the event is within the range\n        const isStartWithinRange = currentStartDate.getTime() === originalStartDate.getTime() || \n                                  (currentStartDate.getTime() > originalStartDate.getTime() && currentStartDate.getTime() < originalEndDate.getTime());\n        const isEndWithinRange = currentEndDate.getTime() === originalEndDate.getTime() || \n                                (currentEndDate.getTime() > originalStartDate.getTime() && currentEndDate.getTime() < originalEndDate.getTime());\n        const doesSpanRange = currentStartDate.getTime() < originalStartDate.getTime() && currentEndDate.getTime() > originalEndDate.getTime();\n\n        return isStartWithinRange || isEndWithinRange || doesSpanRange;\n    }\n   \n    getRowCount(): number {\n        return this.calendarDataManager.getRowCount();\n    }\n    getColumnCount(): number {\n        return this.calendarDataManager.getColumnCount();\n    }\n}","\n\nimport { IEventObject } from \"../../data-structure/event-object.types\";\nimport { EventBlock } from \"./event-block\";\nimport { IEventCoordinate, IRootCellCordinates } from \"./event-coordinates.types\";\nimport { IMonthEventBlock } from \"./month-event-block.types\";\n\n\n\nexport class MonthEventBlock extends EventBlock implements IMonthEventBlock{\n    private rootCells : IRootCellCordinates | null = null;\n    constructor(eventData : IEventObject, startCellRowIndex : number, startCellColumnIndex : number, endCellRowIndex : number, endCellColumnIndex : number){\n        super(eventData, startCellRowIndex, startCellColumnIndex, endCellRowIndex, endCellColumnIndex)\n        this.rootCells = {}\n    }\n    getRootCellCoordinate(rowIndex: number) : IEventCoordinate{\n        return this.rootCells![rowIndex];\n    }\n    setRootCell(rowIndex: number, eventCoordinates : IEventCoordinate){\n        this.rootCells![rowIndex] = eventCoordinates;\n    }\n    clearRootCellCoordinate(rowIndex : number){\n        delete this.rootCells![rowIndex];\n    }\n    getAllCoordinates() : IRootCellCordinates{\n        return this.rootCells!;\n    }\n    destroy(): void {\n        this.rootCells = null;\n    }\n}","import { IMonthEventAxis } from \"./month-event-axis.types\";\nimport { IMonthEventPositionHandler } from \"./month-event-position-handler.types\";\nimport { MonthEventBlockController } from \"./utils/month-event-block-controller\";\nimport { IMonthEventBlockController } from \"./utils/month-event-block-controller.types\";\nimport { MonthEventBlock } from \"./month-event-block\";\nimport { IMonthEventBlock, IMonthEventUpdateCallback } from \"./month-event-block.types\";\nimport { IRootCellCordinates } from \"./event-coordinates.types\";\nimport { IEventData } from \"../../vertical-calendar-configuration\";\nimport { AutoWired, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\nimport { MonthEventAxis } from \"./month-event-axis\";\nimport { ICalendarDataStore } from \"../../data-structure/calendar-data-store.types\";\nimport { CalendarAxisHandlerType } from \"../axis-handler/axis-handler.types\";\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { IEventObject } from \"../../data-structure/event-object.types\";\nimport { TimeStampMs } from \"../navigators/typeDef\";\n\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.EVENT_POSITION_HANLDER)\nexport class MonthEventPositionHandler extends EventEmitter implements IMonthEventPositionHandler{\n\n\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK) private dataStore!: ICalendarDataStore;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.AXIS_HANDLER) private calendarAxisHandler!: CalendarAxisHandlerType;\n\n\n    eventBlockController !: IMonthEventBlockController;\n    eventBlocks !: Map<string, IMonthEventBlock>\n    eventAxis !: IMonthEventAxis\n\n    @PostConstruct()\n    init(){\n        this.eventAxis = new MonthEventAxis(this.dataStore, this.calendarAxisHandler.getCalendarAxis());\n        this.eventBlocks = new Map();\n        this.eventBlockController = new MonthEventBlockController(this.eventAxis);\n    }\n    addEvent(eventData: IEventObject, callback: CallableFunction) {\n        // const isEventWithinRange = this.eventAxis.isEventWithinRange(eventData);\n    \n        // if (!isEventWithinRange) {\n        //     return;\n        // }\n    \n        if (this.isEventAvailable(eventData.id)) {\n            return;\n        }\n    \n        const { startIndex, endIndex } = this.eventAxis.findIndexForEvent(eventData);\n        const { startRowIndex, startColumnIndex, endRowIndex, endColumnIndex }  = this.findBoundaryForEvent(startIndex, endIndex);\n    \n        const eventID = eventData.id;\n        const eventBlock = new MonthEventBlock(eventData, startRowIndex, startColumnIndex, endRowIndex, endColumnIndex);\n        this.eventBlocks.set(eventID, eventBlock);\n\n        // Map to track indexes of events across cells\n        const eventIndexMap = new Map<string, number>();\n        // Set to track IDs of events whose positions have changed\n        const changedEventIds = new Map<string, IMonthEventUpdateCallback>();\n\n        this.eventBlockController.addBlock(eventBlock, eventIndexMap, changedEventIds);\n        // this.addEventBlockInRange(startRowTimestamp, startCellTimestamp, endRowTimestamp, endCellTimestamp, eventBlock, eventIndexMap, changedEventIds);\n    \n\n        //coordinates of events whose positions were changed\n        changedEventIds.forEach(event => {\n            callback(event);\n        });\n    }\n    updateEvent(eventData : IEventObject, callback : CallableFunction){\n        this.removeEvent(eventData.id, (event: any) => {\n            callback(event);\n        });\n        this.addEvent(eventData, (event: any) => {\n            callback(event)\n        });\n    }\n    removeEvent(eventID: string, callback : CallableFunction){\n        if (this.eventBlocks.has(eventID)) {\n            const eventBlock = this.eventBlocks.get(eventID);\n            \n            if (eventBlock) {\n                // Map to track indexes of events across cells\n                const eventIndexMap = new Map<string, number>();\n                // Set to track IDs of events whose positions have changed\n                const changedEventIDs = new Map<string, IMonthEventUpdateCallback>();\n\n                this.eventBlockController.removeBlock(eventBlock, eventIndexMap, changedEventIDs)\n                // this.removeEventBlocksInRange(startRowTimestamp, startCellTimestamp, endRowTimestamp, endCellTimestamp, eventBlock, eventIndexMap, changedEventIDs);\n                changedEventIDs.forEach(event => {\n                    callback(event);\n                });\n                this.eventBlocks.delete(eventID);\n            }\n        }\n    }\n    getEventCoordinates(eventID : string): IRootCellCordinates {\n        const eventBlock = this.eventBlocks.get(eventID);\n        if(eventBlock){\n            return eventBlock.getAllCoordinates();\n        }\n        return {};\n    }\n    getEventDuration(event: IEventData): number {\n        const start = new Date(event.startTime);\n        const end = event.endTime ? new Date(event.endTime) : this.getEndOfDay(start);\n        return end.getTime() - start.getTime();\n    }\n\n    getEvents(rowTimeStamp: TimeStampMs, columnTimeStamp: TimeStampMs): IMonthEventBlock[] {\n        return this.eventBlockController.getBlock(rowTimeStamp, columnTimeStamp) ?? [];\n    }\n    \n    private getEndOfDay(date: Date): Date {\n        const result = new Date(date);\n        result.setHours(23, 59, 59, 999);\n        return result;\n    }\n    \n    isEventAvailable(id : string) : boolean {\n        return this.eventBlocks.has(id);\n    }\n    findBoundaryForEvent(startIndex : number, endIndex : number){\n        const columnCount = this.eventAxis.getColumnCount();\n    \n        const startRowIndex = Math.floor(startIndex / columnCount);\n        const startColumnIndex = Math.floor(startIndex % columnCount);\n        const endRowIndex = Math.floor(endIndex / columnCount);\n        const endColumnIndex = Math.floor(endIndex % columnCount);\n\n        return {\n            startRowIndex,\n            startColumnIndex,\n            endRowIndex,\n            endColumnIndex\n        }\n    }\n    getEventsCount(rowTimestamp: number, cellTimestamp: number): number {\n        return this.eventBlockController.getBlocksCount(rowTimestamp, cellTimestamp);\n    }\n}\n","// Interface for EventSegment\n\nimport { IEventSegment } from \"./event-segment.type\";\n\n\nexport class EventSegment implements IEventSegment {\n    private id          : string;\n    private parentId    : string;\n    private date        : Date;\n    private isStart     : boolean;\n    private isEnd       : boolean;\n    private top         : number | undefined;\n    private width       : number | undefined;\n    private height       : number | undefined;\n    private shouldRender: boolean;\n    private padding :number = 0;\n    private isSameRowInWeek: boolean;\n    private isOutOfRenderLimit !:  boolean;\n\n    constructor(id: string, parentId :string, date: Date, isStart : boolean, isEnd: boolean, isSameRowInWeek: boolean,isOutOfRenderLimit :boolean =  false) {\n      this.id = id;\n      this.parentId = parentId;\n      this.date = date;\n      this.isStart = isStart;\n      this.isEnd = isEnd;\n      this.top = undefined;\n      this.width = undefined;\n      this.height = undefined;\n      this.shouldRender = false;\n      this.padding = 0; // Default padding value\n      this.isSameRowInWeek = isSameRowInWeek;\n      this.isOutOfRenderLimit = isOutOfRenderLimit\n    }\n  \n    updatePosition(top : number, width : number,padding?: number,height?: number, ): void {\n      this.top = top;\n      this.width = width;\n      this.padding = padding ?? 0\n      this.height = height;\n    }\n\n    updateTop(top: number): void {\n      this.top = top;\n    }\n\n    // Getter methods for all properties\n    getId(): string {\n      return this.id;\n    }\n\n\n    getHeight(): number | undefined {\n      return this.height;\n    }\n\n    getParentId(): string {\n      return this.parentId;\n    }\n\n    getDate(): Date {\n      return this.date;\n    }\n\n    isStartSegment(): boolean {\n      return this.isStart;\n    }\n\n    isEndSegment(): boolean {\n      return this.isEnd;\n    }\n\n    getTop(): number | undefined {\n      return this.top;\n    }\n\n    getWidth(): number | undefined {\n      return this.width;\n    }\n\n    shouldRenderSegment(): boolean {\n      return this.shouldRender;\n    }\n\n    // Setter methods for mutable properties\n    setShouldRender(shouldRender: boolean): void {\n      this.shouldRender = shouldRender;\n    }\n\n    setDate(date: Date): void {\n      this.date = date;\n    }\n\n    getPadding(): number {  \n      return this.padding;\n    }\n\n    getIsSameRowInWeek(): boolean {\n      return this.isSameRowInWeek;\n    }\n\n    setIsSameRowInWeek(val: boolean): void {\n      this.isSameRowInWeek = val;\n    }\n\n    getisOutOfRenderLimit() :boolean{\n      return this.isOutOfRenderLimit\n\n    }\n\n    setisOutOfRenderLimit(val : boolean):void{\n      this.isOutOfRenderLimit = val\n    }\n  }\n  ","import {  AutoWired, Bean, PostConstruct } from '@dg/corecomponent';\nimport { EventSegment } from './event-segment';\nimport { IEventSegment } from './event-segment.type';\nimport { ICalendarEventStore } from './event-store.type';\nimport { VERTICAL_CALENDAR_BEAN_NAME } from '../../../constant/vertical-calendar-bean-name-constant';\nimport { IEventObject } from '../../../data-structure/event-object.types';\nimport { DAY_WIDTH, PADDING, ROW_HEIGHT, ROW_PADDING } from '../../../data-structure/calendar-data-store';\nimport { EventEmitter } from '@dg/corecomponent';\nimport { ICalendarDataStore } from '../../../data-structure/calendar-data-store.types';\n\n\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.EVENT_STORE)\nexport class CalendarEventStore extends EventEmitter implements ICalendarEventStore {\n@AutoWired(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK) private dataStore !:ICalendarDataStore;\n   \n    private visibleDays!   : string[];\n    private eventMap!      : Map<string, any>;\n    private segmentMap!    : Map<string, IEventSegment[]>;\n    private dateToSegments!: Map<string, IEventSegment[]>;\n    private weekToSegments = new Map<string, IEventSegment[]>();\n    private weekRowMap     = new Map<string, Map<string, number>>();\n\n\n\n    @PostConstruct()\n    init(): void {\n        this.visibleDays = ['sun', 'mon', 'tues', 'wed', 'thurs', 'fri', 'sat'];\n        this.eventMap = new Map();\n        this.segmentMap = new Map();\n        this.dateToSegments = new Map();\n\n    \n    }\n\n   \n    getDayString(date : Date) {\n      return ['sun', 'mon', 'tues', 'wed', 'thurs', 'fri', 'sat'][date.getDay()];\n    }\n  \n    toDateKey(date : Date) {\n      return date.toDateString();\n    }\n  \n    getWeekRange(date : Date, weekStartDay = 0) {\n      const start = new Date(date);\n      const offset = (start.getDay() - weekStartDay + 7) % 7;\n      start.setDate(start.getDate() - offset);\n      start.setHours(0, 0, 0, 0);\n      const end = new Date(start);\n      end.setDate(start.getDate() + 6);\n      return [start, end];\n    }\n\n    // Move these functions into the class as private methods\n    private getRowStartDate(TimeStamp: number): number {\n      const date = new Date(TimeStamp);\n      const dayOrder = [0, 1, 2, 3, 4, 5, 6]; \n      const year = date.getFullYear();\n      const monthIndex = date.getMonth();\n      const day = date.getDay();\n      const dateOfMonth = date.getDate();\n      const index = dayOrder.indexOf(day);\n      const convertedDate = dateOfMonth - index;\n      const RowDate = new Date(year, monthIndex, convertedDate, 0, 0, 0, 0);\n      return RowDate.getTime();\n    }\n\n    private getRowLastDate(TimeStamp: number): number {\n      const RowDate = new Date(this.getRowStartDate(TimeStamp));\n      const year = RowDate.getFullYear();\n      const monthIndex = RowDate.getMonth();\n      const dateOfMonth = RowDate.getDate();\n      const nextRowDate = new Date(year, monthIndex, dateOfMonth + 6, 23, 59, 59, 999);\n      return nextRowDate.getTime();\n    }\n  \n    splitEventByDays(event : IEventObject) {\n      const segments: IEventSegment[] = [];\n      const current = new Date(event.startTime);\n      const end = new Date(event.endTime);\n      current.setHours(0, 0, 0, 0);\n      end.setHours(0, 0, 0, 0);\n  \n      const startKey = this.toDateKey(event.startTime);\n      const endKey = this.toDateKey(event.endTime);\n      \n      \n      \n  \n      while (current <= end) {\n        const dateKey = this.toDateKey(current);\n        const dayStr = this.getDayString(current);\n        if (this.visibleDays.includes(dayStr)) {\n          // Determine if this segment is in the same row in the week (not the first in its week)\n\n          const currentLastRowInWeek = this.getRowLastDate(current.getTime());\n          \n          const endLastRowInWeek = this.getRowLastDate(end.getTime());\n\n          const isSameRowInWeek = currentLastRowInWeek === endLastRowInWeek;\n\n\n          const seg = new EventSegment(\n            `${event.id}-${event.title}-${dateKey}`,\n            event.id,\n            new Date(current),\n            dateKey === startKey,\n            dateKey === endKey,\n            isSameRowInWeek\n          );\n          segments.push(seg);\n        }\n        current.setDate(current.getDate() + 1);\n      }\n  \n      const weekGroup = new Map<string, IEventSegment[]>();\n      for (const seg of segments) {\n        const [weekStart] = this.getWeekRange(seg.getDate());\n        const weekKey = this.toDateKey(weekStart);\n        if (!weekGroup.has(weekKey)) weekGroup.set(weekKey, []);\n        weekGroup.get(weekKey)!.push(seg);\n      }\n  \n      for (const segs of weekGroup.values()) {\n        segs.sort((a: IEventSegment, b: IEventSegment) => a.getDate().getTime() - b.getDate().getTime());\n        const firstSeg = segs[0];\n        firstSeg.setShouldRender(true);\n  \n        const weekStartDate = this.getWeekRange(firstSeg.getDate())[0];\n        if (event.startTime < weekStartDate) {\n          // Note: isStart is private, would need a setter method to modify it\n        }\n      }\n  \n      return segments;\n    }\n\n    createTimedEventSegment(event: IEventObject): IEventSegment {\n      const dateKey = this.toDateKey(event.startTime);\n      const dayStr = this.getDayString(event.startTime);\n      \n      if (!this.visibleDays.includes(dayStr)) {\n        // If the event is not on a visible day, create a segment but mark it as not renderable\n        const seg = new EventSegment(\n          `${event.id}-${event.title}-${dateKey}`,\n          event.id,\n          new Date(event.startTime),\n          true,\n          true,\n          false\n        );\n        seg.setShouldRender(false);\n        return seg;\n      }\n\n      const seg = new EventSegment(\n        `${event.id}-${event.title}-${dateKey}`,\n        event.id,\n        new Date(event.startTime),\n        true,\n        true,\n        false\n      );\n      seg.setShouldRender(true);\n      return seg;\n    }\n\n    isAllDayEvent(event: IEventObject): boolean {\n      if (event.isAllDay !== undefined) return event.isAllDay();\n\n      const start = new Date(event.startTime);\n      const end = new Date(event.endTime);\n      return (\n        start.getHours() === 0 && start.getMinutes() === 0 &&\n        end.getHours() === 0 && end.getMinutes() === 0\n      );\n    }\n\n    addOrUpdateEvent(event: IEventObject) {\n      // 1. Collect old weeks/dates before removal\n      const oldSegments = this.segmentMap.get(event.id) || [];\n      const oldWeeks = new Set<string>();\n      const oldDates = new Set<string>();\n      for (const seg of oldSegments) {\n        const dateKey = this.toDateKey(seg.getDate());\n        const [weekStart] = this.getWeekRange(seg.getDate());\n        const weekKey = this.toDateKey(weekStart);\n        oldWeeks.add(weekKey);\n        oldDates.add(dateKey);\n      }\n\n      // 2. Remove old segments\n      this.eventMap.set(event.id, event);\n      this.removeSegments(event.id);\n\n      // 3. Add new segments\n      const isAllDay = this.isAllDayEvent(event);\n      const newSegments = isAllDay ? this.splitEventByDays(event) : [this.createTimedEventSegment(event)];\n      this.segmentMap.set(event.id, newSegments);\n\n      const newWeeks = new Set<string>();\n      const newDates = new Set<string>();\n      for (const seg of newSegments) {\n        const dateKey = this.toDateKey(seg.getDate());\n        const [weekStart] = this.getWeekRange(seg.getDate());\n        const weekKey = this.toDateKey(weekStart);\n\n        if (!this.dateToSegments.has(dateKey)) this.dateToSegments.set(dateKey, []);\n        this.dateToSegments.get(dateKey)!.push(seg);\n        newDates.add(dateKey);\n\n        if (!this.weekToSegments.has(weekKey)) this.weekToSegments.set(weekKey, []);\n        this.weekToSegments.get(weekKey)!.push(seg);\n        newWeeks.add(weekKey);\n      }\n\n      // 4. Union of all affected weeks/dates\n      const affectedWeeks = new Set([...oldWeeks, ...newWeeks]);\n      const affectedDates = new Set([...oldDates, ...newDates]);\n\n      // Add all dates in affected weeks to affectedDates\n      for (const weekKey of affectedWeeks) {\n        const weekStartDate = new Date(weekKey);\n        const [weekStart, weekEnd] = this.getWeekRange(weekStartDate);\n        for (let d = new Date(weekStart); d <= weekEnd; d.setDate(d.getDate() + 1)) {\n          const dateKey = this.toDateKey(d);\n          const dayStr = this.getDayString(d);\n          if (this.visibleDays.includes(dayStr)) {\n            affectedDates.add(dateKey);\n          }\n        }\n      }\n\n      // 5. Recalculate layout for all affected weeks and dates\n      for (const weekKey of affectedWeeks) {\n        this.layoutSegmentsForWeek(weekKey);\n      }\n      for (const dateKey of affectedDates) {\n        this.layoutSegmentsForDate(dateKey);\n      }\n    }\n  \n    removeSegments(eventId : string) {\n      const segments = this.segmentMap.get(eventId);\n      if (!segments) return;\n\n      const affectedWeeks = new Set<string>();\n      const affectedDates = new Set<string>();\n\n      // Collect affected weeks and dates before removing segments\n      for (const segment of segments) {\n        const key = this.toDateKey(segment.getDate());\n        const arr = this.dateToSegments.get(key);\n        if (arr) {\n          const filtered = arr.filter(s => s.getParentId() !== eventId);\n          if (filtered.length > 0) {\n            this.dateToSegments.set(key, filtered);\n          } else {\n            this.dateToSegments.delete(key);\n          }\n        }\n        affectedDates.add(key);\n\n        // Also collect affected weeks\n        const [weekStart] = this.getWeekRange(segment.getDate());\n        const weekKey = this.toDateKey(weekStart);\n        affectedWeeks.add(weekKey);\n      }\n\n      // Remove from weekToSegments\n      for (const weekKey of affectedWeeks) {\n        const weekSegments = this.weekToSegments.get(weekKey);\n        if (weekSegments) {\n          const filtered = weekSegments.filter(seg => seg.getParentId() !== eventId);\n          if (filtered.length > 0) {\n            this.weekToSegments.set(weekKey, filtered);\n          } else {\n            this.weekToSegments.delete(weekKey);\n          }\n        }\n      }\n\n      // Remove from weekRowMap\n      for (const weekKey of affectedWeeks) {\n        const weekRowMap = this.weekRowMap.get(weekKey);\n        if (weekRowMap) {\n          weekRowMap.delete(eventId);\n          if (weekRowMap.size === 0) {\n            this.weekRowMap.delete(weekKey);\n          }\n        }\n      }\n\n      this.segmentMap.delete(eventId);\n    }\n    removeEvent(eventId: string): void {\n      // Get the event to determine affected weeks and dates\n      const event = this.eventMap.get(eventId);\n      if (!event) return;\n\n      const affectedWeeks = new Set<string>();\n      const affectedDates = new Set<string>();\n\n      // Collect affected weeks and dates before removing segments\n      const segments = this.segmentMap.get(eventId);\n      if (segments) {\n        for (const segment of segments) {\n          const dateKey = this.toDateKey(segment.getDate());\n          const [weekStart] = this.getWeekRange(segment.getDate());\n          const weekKey = this.toDateKey(weekStart);\n          \n          affectedDates.add(dateKey);\n          affectedWeeks.add(weekKey);\n        }\n      }\n\n      // Add all dates in affected weeks to affectedDates\n      for (const weekKey of affectedWeeks) {\n        const weekStartDate = new Date(weekKey);\n        const [weekStart, weekEnd] = this.getWeekRange(weekStartDate);\n        \n        // Add all dates in this week to affectedDates\n        for (let d = new Date(weekStart); d <= weekEnd; d.setDate(d.getDate() + 1)) {\n          const dateKey = this.toDateKey(d);\n          const dayStr = this.getDayString(d);\n          if (this.visibleDays.includes(dayStr)) {\n            affectedDates.add(dateKey);\n          }\n        }\n      }\n\n      // Remove from all data structures\n      this.eventMap.delete(eventId);\n      this.removeSegments(eventId);\n\n      // Recalculate layout for affected weeks and dates\n      for (const weekKey of affectedWeeks) {\n        this.layoutSegmentsForWeek(weekKey);\n      }\n\n      for (const dateKey of affectedDates) {\n        this.layoutSegmentsForDate(dateKey);\n      }\n    }\n  \n    segmentsOverlap(segA: IEventSegment, segB: IEventSegment): boolean {\n      const eventA = this.eventMap.get(segA.getParentId());\n      const eventB = this.eventMap.get(segB.getParentId());\n      if (!eventA || !eventB) return false;\n\n      const startA = new Date(eventA.startTime).setHours(0, 0, 0, 0);\n      const endA = new Date(eventA.endTime).setHours(0, 0, 0, 0);\n      const startB = new Date(eventB.startTime).setHours(0, 0, 0, 0);\n      const endB = new Date(eventB.endTime).setHours(0, 0, 0, 0);\n\n      return startA <= endB && endA >= startB;\n    }\n\n    private layoutSegmentsForWeek(weekKey: string) {\n  const segments = this.weekToSegments.get(weekKey);\n  if (!segments || segments.length === 0) return;\n\n  // Use only first segment per event (start of the week)\n  const uniqueEventSegments = new Map<string, IEventSegment>();\n  for (const seg of segments) {\n    if (!uniqueEventSegments.has(seg.getParentId())) {\n      uniqueEventSegments.set(seg.getParentId(), seg);\n    }\n  }\n\n  const layoutList = Array.from(uniqueEventSegments.values());\n\n  // Sort: earliest start first, then longest duration\n  layoutList.sort((a, b) => {\n    const eventA = this.eventMap.get(a.getParentId());\n    const eventB = this.eventMap.get(b.getParentId());\n    if (!eventA || !eventB) return 0;\n    \n    const startTimeA = new Date(eventA.startTime).getTime();\n    const startTimeB = new Date(eventB.startTime).getTime();\n    \n    // First sort by start time (earliest first)\n    if (startTimeA !== startTimeB) {\n      return startTimeA - startTimeB;\n    }\n    \n    // If start times are equal, sort by duration (longest first)\n    const spanA = new Date(eventA.endTime).getTime() - startTimeA;\n    const spanB = new Date(eventB.endTime).getTime() - startTimeB;\n    return spanB - spanA;\n  });\n\n  // For each date in the week, track which rows are occupied\n  const rowOccupiedByDate = new Map<string, Set<number>>(); // dateKey → used rows\n  const weekRowMap = new Map<string, number>();\n\n  for (const seg of layoutList) {\n    const eventId = seg.getParentId();\n    const event = this.eventMap.get(eventId);\n    if (!event) continue;\n    const spanDates = this.getEventSpanDates(event);\n\n    // Find the first row index that is free for all days in the event's span\n    let rowIndex = 0;\n    while (\n      spanDates.some(date => rowOccupiedByDate.get(date)?.has(rowIndex))\n    ) {\n      rowIndex++;\n    }\n\n    // Mark this row as used for all days in the event's span\n    for (const date of spanDates) {\n      if (!rowOccupiedByDate.has(date)) {\n        rowOccupiedByDate.set(date, new Set());\n      }\n      rowOccupiedByDate.get(date)!.add(rowIndex);\n    }\n\n    weekRowMap.set(eventId, rowIndex);\n  }\n\n  this.weekRowMap.set(weekKey, weekRowMap);\n}\n\n\nlayoutSegmentsForDate(dateKey: string) {\n  const segList = this.dateToSegments.get(dateKey);\n  if (!segList || segList.length === 0) return;\n\n  const totalRowHeight = ROW_HEIGHT + ROW_PADDING;\n\n  const [weekStart] = this.getWeekRange(new Date(dateKey));\n  const weekKey = this.toDateKey(weekStart);\n  const rowMap = this.weekRowMap.get(weekKey);\n\n  if (!rowMap) return;\n\n  // Sort segments by the start date of their events\n  const sortedSegList = segList.sort((a, b) => {\n    const eventA = this.eventMap.get(a.getParentId());\n    const eventB = this.eventMap.get(b.getParentId());\n    \n    if (!eventA || !eventB) return 0;\n    \n    const startTimeA = new Date(eventA.startTime).getTime();\n    const startTimeB = new Date(eventB.startTime).getTime();\n    \n    return startTimeA - startTimeB;\n  });\n\n  const maxVisible = this.dataStore.getMaxVisibleEventsWithDynamicHieght()\n\n\n  for (let i=0 ; i<sortedSegList.length; i++) {\n    const seg = segList[i]\n    const eventId = seg.getParentId();\n    const event = this.eventMap.get(eventId);\n    if (!event || !rowMap.has(eventId)) continue;\n\n    const rowIndex = rowMap.get(eventId)!;\n    const top = rowIndex * totalRowHeight;\n\n    const startDate = seg.getDate();\n    const endDate = new Date(event.endTime);\n\n    const spanDates = this.getEventSpanDatesForWidthCalculation({startTime: startDate, endTime: endDate});\n    const spanLength = spanDates.length;\n    \n    const width = spanLength * DAY_WIDTH;\n    const totalPadding = (spanLength - 1) * PADDING;\n\n   if(i === maxVisible){\n    seg.setisOutOfRenderLimit(true);\n   }\n\n    seg.updatePosition(top, width, totalPadding);\n  }\n}\n\nprivate getEventSpanDates(event: IEventObject): string[] {\n  const dates: string[] = [];\n  const current = new Date(event.startTime);\n  const end = new Date(event.endTime);\n  current.setHours(0, 0, 0, 0);\n  end.setHours(0, 0, 0, 0);\n\n  while (current <= end) {\n    const dKey = this.toDateKey(current);\n    const dayStr = this.getDayString(current);\n    if (this.visibleDays.includes(dayStr)) {\n      dates.push(dKey);\n    }\n    current.setDate(current.getDate() + 1);\n  }\n\n  return dates;\n}\n\n\nprivate getEventSpanDatesForWidthCalculation(event: any): string[] {\n  const dates: string[] = [];\n  const current = new Date(event.startTime);\n  let end = new Date(event.endTime);\n\n  // Normalize time\n  current.setHours(0, 0, 0, 0);\n  end.setHours(0, 0, 0, 0);\n\n  // Get end of week for the event's start date\n  const [weekEnd] = this.getWeekEnd(current);\n\n  // Clamp end date to week end\n  if (end > weekEnd) {\n    end = new Date(weekEnd);\n  }\n\n  while (current <= end) {\n    const dKey = this.toDateKey(current);\n    const dayStr = this.getDayString(current);\n    if (this.visibleDays.includes(dayStr)) {\n      dates.push(dKey);\n    }\n    current.setDate(current.getDate() + 1);\n  }\n\n  return dates;\n}\n\nprivate getWeekEnd(startDate: Date): [Date] {\n  const endOfWeek = new Date(startDate);\n  const day = startDate.getDay(); // 0 = Sunday, 6 = Saturday\n  const daysToSaturday = (6 - day);\n  endOfWeek.setDate(startDate.getDate() + daysToSaturday);\n  endOfWeek.setHours(0, 0, 0, 0);\n  return [endOfWeek];\n}\n\n\n    areOverlapping(a: IEventSegment, b: IEventSegment) {\n      const aStart = this.eventMap.get(a.getParentId())?.startTime?.getTime() ?? 0;\n      const aEnd = this.eventMap.get(a.getParentId())?.endTime?.getTime() ?? 0;\n      const bStart = this.eventMap.get(b.getParentId())?.startTime?.getTime() ?? 0;\n      const bEnd = this.eventMap.get(b.getParentId())?.endTime?.getTime() ?? 0;\n      return aStart < bEnd && bStart < aEnd;\n    }\n  \n    getOrderedSegmentMapForWeek(date : Date) {\n      const [start, end] = this.getWeekRange(date);\n      const map = new Map();\n  \n      for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {\n        const key = this.toDateKey(d);\n        if (!this.visibleDays.includes(this.getDayString(d))) continue;\n        const segments = (this.dateToSegments.get(key) || []).filter(seg => seg.shouldRenderSegment());\n        map.set(key, segments);\n      }\n  \n      return map;\n    }\n  \n    getEventsForDay(date :Date) {\n      const key = this.toDateKey(date);\n      const allSegments = this.dateToSegments.get(key) || [];\n      const filteredSegments = allSegments.filter(seg => seg.shouldRenderSegment());\n      const overlappedEvents = allSegments.length - filteredSegments.length;\n      const renderingOverlappedEvents =  allSegments.filter(seg => seg.getisOutOfRenderLimit()).length ;\n\n      \n      // Sort by top position to ensure proper order\n      const sortByTopPosition = (a: any, b: any) => {\n        const topA = a.segment.getTop() ?? 0;\n        const topB = b.segment.getTop() ?? 0;\n        return topA - topB;\n      };\n      \n      return {\n        events: filteredSegments\n          .map(seg => ({ segment: seg, event: this.eventMap.get(seg.getParentId()) }))\n          .sort(sortByTopPosition),\n        unfilteredEvents: allSegments\n          .map(seg => ({ segment: seg, event: this.eventMap.get(seg.getParentId()) }))\n          .sort(sortByTopPosition),\n        overlappedEvents: overlappedEvents,\n        renderingOverlappedEvents: renderingOverlappedEvents\n      };\n    }\n  \n\n  }\n  \n\n\n  export function previewEventSegmentsForMonthGrid(\n    event: IEventObject,\n    visibleDays: string[],\n    weekStartDay = 0\n  ): IEventSegment[] {\n    const toDateKey = (date: Date) => date.toDateString();\n    const getDayString = (date: Date) =>\n      ['sun', 'mon', 'tues', 'wed', 'thurs', 'fri', 'sat'][date.getDay()];\n  \n    const getWeekRange = (date: Date): [Date, Date] => {\n      const start = new Date(date);\n      const offset = (start.getDay() - weekStartDay + 7) % 7;\n      start.setDate(start.getDate() - offset);\n      start.setHours(0, 0, 0, 0);\n      const end = new Date(start);\n      end.setDate(start.getDate() + 6);\n      return [start, end];\n    };\n  \n    const getWeekEnd = (startDate: Date): Date => {\n      const endOfWeek = new Date(startDate);\n      const day = startDate.getDay(); // 0 = Sunday, 6 = Saturday\n      const daysToSaturday = 6 - day;\n      endOfWeek.setDate(startDate.getDate() + daysToSaturday);\n      endOfWeek.setHours(0, 0, 0, 0);\n      return endOfWeek;\n    };\n  \n    const getEventSpanDatesForWidth = (start: Date, end: Date): string[] => {\n      const dates: string[] = [];\n      const current = new Date(start);\n      const clampedEnd = new Date(end);\n  \n      const weekEnd = getWeekEnd(start);\n      if (clampedEnd > weekEnd) clampedEnd.setTime(weekEnd.getTime());\n  \n      while (current <= clampedEnd) {\n        if (visibleDays.includes(getDayString(current))) {\n          dates.push(toDateKey(current));\n        }\n        current.setDate(current.getDate() + 1);\n      }\n      return dates;\n    };\n  \n    const allSegments: IEventSegment[] = [];\n    const current = new Date(event.startTime);\n    const end = new Date(event.endTime);\n    current.setHours(0, 0, 0, 0);\n    end.setHours(0, 0, 0, 0);\n  \n    const startKey = toDateKey(event.startTime);\n    const endKey = toDateKey(event.endTime);\n  \n    while (current <= end) {\n      const dateKey = toDateKey(current);\n      const dayStr = getDayString(current);\n      if (visibleDays.includes(dayStr)) {\n        const seg = new EventSegment(\n          `${event.id}-${event.title}-${dateKey}-preview`,\n          event.id,\n          new Date(current),\n          dateKey === startKey,\n          dateKey === endKey,\n          false\n        );\n        allSegments.push(seg);\n      }\n      current.setDate(current.getDate() + 1);\n    }\n  \n    const weekGroups = new Map<string, IEventSegment[]>();\n    for (const seg of allSegments) {\n      const [weekStart] = getWeekRange(seg.getDate());\n      const weekKey = toDateKey(weekStart);\n      if (!weekGroups.has(weekKey)) weekGroups.set(weekKey, []);\n      weekGroups.get(weekKey)!.push(seg);\n    }\n  \n    for (const segs of weekGroups.values()) {\n      segs.sort((a, b) => a.getDate().getTime() - b.getDate().getTime());\n      const firstSeg = segs[0];\n      firstSeg.setShouldRender(true);\n  \n      const spanDates = getEventSpanDatesForWidth(firstSeg.getDate(), event.endTime);\n      const spanLength = spanDates.length;\n      const width = spanLength * DAY_WIDTH;\n      const padding = (spanLength - 1) * PADDING;\n  \n      firstSeg.updatePosition(0, width, padding);\n    }\n  \n    return allSegments;\n  }","import { Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../../constant/vertical-calendar-bean-name-constant\";\nimport { DAY_WIDTH, PADDING, ROW_HEIGHT, ROW_PADDING } from \"../../../data-structure/calendar-data-store\";\nimport { IEventObject } from \"../../../data-structure/event-object.types\";\nimport { EventSegment } from \"./event-segment\";\nimport { IEventSegment } from \"./event-segment.type\";\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.PREVIEW_EVENT_STORE)\nexport class PreviewEventStore {\n    private visibleDays           !: string[]\n    private previewEventMap!      : Map<string, any>;\n    private previewSegmentMap!    : Map<string, IEventSegment[]>;\n    private previewDateToSegments!: Map<string, IEventSegment[]>;\n    private previewWeekToSegments = new Map<string, IEventSegment[]>();\n    private previewWeekRowMap     = new Map<string, Map<string, number>>();\n\n\n    @PostConstruct()\n    init(){\n        this.visibleDays = ['sun', 'mon', 'tues', 'wed', 'thurs', 'fri', 'sat'];\n        this.previewEventMap = new Map();\n        this.previewSegmentMap = new Map();\n        this.previewDateToSegments = new Map();\n    }\n\n    toDateKey(date : Date) {\n        return date.toDateString();\n      }\n  \n      getDayString(date : Date) {\n        return ['sun', 'mon', 'tues', 'wed', 'thurs', 'fri', 'sat'][date.getDay()];\n      }\n\n      getWeekRange(date : Date, weekStartDay = 0) {\n        const start = new Date(date);\n        const offset = (start.getDay() - weekStartDay + 7) % 7;\n        start.setDate(start.getDate() - offset);\n        start.setHours(0, 0, 0, 0);\n        const end = new Date(start);\n        end.setDate(start.getDate() + 6);\n        return [start, end];\n      }\n\n    splitEventByDays(event : IEventObject) {\n        const segments: IEventSegment[] = [];\n        const current = new Date(event.startTime);\n        const end = new Date(event.endTime);\n        current.setHours(0, 0, 0, 0);\n        end.setHours(0, 0, 0, 0);\n    \n        const startKey = this.toDateKey(event.startTime);\n        const endKey = this.toDateKey(event.endTime);\n    \n        while (current <= end) {\n          const dateKey = this.toDateKey(current);\n          const dayStr = this.getDayString(current);\n          if (this.visibleDays.includes(dayStr)) {\n            const seg = new EventSegment(\n              `${event.id}-${event.title}-${dateKey}`,\n              event.id,\n              new Date(current),\n              dateKey === startKey,\n              dateKey === endKey,\n              false\n            );\n            segments.push(seg);\n          }\n          current.setDate(current.getDate() + 1);\n        }\n    \n        const weekGroup = new Map<string, IEventSegment[]>();\n        for (const seg of segments) {\n          const [weekStart] = this.getWeekRange(seg.getDate());\n          const weekKey = this.toDateKey(weekStart);\n          if (!weekGroup.has(weekKey)) weekGroup.set(weekKey, []);\n          weekGroup.get(weekKey)!.push(seg);\n        }\n    \n        for (const segs of weekGroup.values()) {\n          segs.sort((a: IEventSegment, b: IEventSegment) => a.getDate().getTime() - b.getDate().getTime());\n          const firstSeg = segs[0];\n          firstSeg.setShouldRender(true);\n    \n          const weekStartDate = this.getWeekRange(firstSeg.getDate())[0];\n          if (event.startTime < weekStartDate) {\n            // Note: isStart is private, would need a setter method to modify it\n          }\n        }\n    \n        return segments;\n      }\n\n\n    addOrUpdateEvent(event: IEventObject) {\n        this.previewEventMap.set(event.id, event);\n        this.removeSegments(event.id);\n      \n        const newSegments = this.splitEventByDays(event);\n        this.previewSegmentMap.set(event.id, newSegments);\n      \n        const affectedWeeks = new Set<string>();\n        const affectedDates = new Set<string>();\n      \n        for (const seg of newSegments) {\n          const dateKey = this.toDateKey(seg.getDate());\n          const [weekStart] = this.getWeekRange(seg.getDate());\n          const weekKey = this.toDateKey(weekStart);\n      \n          if (!this.previewDateToSegments.has(dateKey)) this.previewDateToSegments.set(dateKey, []);\n          this.previewDateToSegments.get(dateKey)!.push(seg);\n          affectedDates.add(dateKey);\n      \n          if (!this.previewWeekToSegments.has(weekKey)) this.previewWeekToSegments.set(weekKey, []);\n          this.previewWeekToSegments.get(weekKey)!.push(seg);\n          affectedWeeks.add(weekKey);\n        }\n      \n        // Compute row placement for each week\n        for (const weekKey of affectedWeeks) {\n          this.layoutSegmentsForWeek(weekKey);\n        }\n      \n        // Apply rowIndex/top for each date in that week\n        for (const dateKey of affectedDates) {\n          this.layoutSegmentsForDate(dateKey);\n        }\n      }\n\n      private layoutSegmentsForWeek(weekKey: string) {\n        const segments = this.previewWeekToSegments.get(weekKey);\n        if (!segments || segments.length === 0) return;\n      \n        // Use only first segment per event (start of the week)\n        const uniqueEventSegments = new Map<string, IEventSegment>();\n        for (const seg of segments) {\n          if (!uniqueEventSegments.has(seg.getParentId())) {\n            uniqueEventSegments.set(seg.getParentId(), seg);\n          }\n        }\n      \n        const layoutList = Array.from(uniqueEventSegments.values());\n      \n        // Sort: longest duration first, then earliest start\n        layoutList.sort((a, b) => {\n          const eventA = this.previewEventMap.get(a.getParentId());\n          const eventB = this.previewEventMap.get(b.getParentId());\n          const spanA = new Date(eventA.endTime).getTime() - new Date(eventA.startTime).getTime();\n          const spanB = new Date(eventB.endTime).getTime() - new Date(eventB.startTime).getTime();\n      \n          if (spanA !== spanB) return spanB - spanA;\n          return new Date(eventA.startTime).getTime() - new Date(eventB.startTime).getTime();\n        });\n      \n        const weekRowMap = new Map<string, number>();\n        const rowOccupiedByDate = new Map<string, Set<number>>(); // dateKey → used rows\n      \n        for (const seg of layoutList) {\n          const eventId = seg.getParentId();\n          const event = this.previewEventMap.get(eventId);\n          const spanDates = this.getEventSpanDates(event);\n      \n          // Try to find the first row index that is free across all spanDates\n          let rowIndex = 0;\n          while (\n            spanDates.some(date => rowOccupiedByDate.get(date)?.has(rowIndex))\n          ) {\n            rowIndex++;\n          }\n      \n          // Mark row as used for each date\n          for (const date of spanDates) {\n            if (!rowOccupiedByDate.has(date)) {\n              rowOccupiedByDate.set(date, new Set());\n            }\n            rowOccupiedByDate.get(date)!.add(rowIndex);\n          }\n      \n          weekRowMap.set(eventId, rowIndex);\n        }\n      \n        this.previewWeekRowMap.set(weekKey, weekRowMap);\n      }\n\n      removeSegments(eventId : string) {\n        const segments = this.previewSegmentMap.get(eventId);\n        if (!segments) return;\n    \n        for (const segment of segments) {\n          const key = this.toDateKey(segment.getDate());\n          const arr = this.previewDateToSegments.get(key);\n          if (arr) {\n            const filtered = arr.filter(s => s.getParentId() !== eventId);\n            if (filtered.length > 0) {\n              this.previewDateToSegments.set(key, filtered);\n            } else {\n              this.previewDateToSegments.delete(key);\n            }\n          }\n        }\n    \n        this.previewSegmentMap.delete(eventId);\n      }\n      removeEvent(eventId: string): void {\n        // Get the event to determine affected weeks and dates\n        const event = this.previewEventMap.get(eventId);\n        if (!event) return;\n  \n        const affectedWeeks = new Set<string>();\n        const affectedDates = new Set<string>();\n  \n        // Collect affected weeks and dates before removing segments\n        const segments = this.previewSegmentMap.get(eventId);\n        if (segments) {\n          for (const segment of segments) {\n            const dateKey = this.toDateKey(segment.getDate());\n            const [weekStart] = this.getWeekRange(segment.getDate());\n            const weekKey = this.toDateKey(weekStart);\n            \n            affectedDates.add(dateKey);\n            affectedWeeks.add(weekKey);\n          }\n        }\n  \n        // Remove from all data structures\n        this.previewEventMap.delete(eventId);\n        this.removeSegments(eventId);\n  \n        // Remove from previewWeekToSegments\n        for (const weekKey of affectedWeeks) {\n          const weekSegments = this.previewWeekToSegments.get(weekKey);\n          if (weekSegments) {\n            const filtered = weekSegments.filter(seg => seg.getParentId() !== eventId);\n            if (filtered.length > 0) {\n              this.previewWeekToSegments.set(weekKey, filtered);\n            } else {\n              this.previewWeekToSegments.delete(weekKey);\n            }\n          }\n        }\n  \n        // Remove from weekRowMap and recalculate layout for affected weeks\n        for (const weekKey of affectedWeeks) {\n          const weekRowMap = this.previewWeekRowMap.get(weekKey);\n          if (weekRowMap) {\n            weekRowMap.delete(eventId);\n            if (weekRowMap.size === 0) {\n              this.previewWeekRowMap.delete(weekKey);\n            } else {\n              // Recalculate layout for the remaining events in this week\n              this.layoutSegmentsForWeek(weekKey);\n            }\n          }\n        }\n  \n        // Recalculate layout for affected dates\n        for (const dateKey of affectedDates) {\n          this.layoutSegmentsForDate(dateKey);\n        }\n      }\n      \n      layoutSegmentsForDate(dateKey: string) {\n        const segList = this.previewDateToSegments.get(dateKey);\n        if (!segList || segList.length === 0) return;\n      \n      \n        const totalRowHeight = ROW_HEIGHT + ROW_PADDING;\n      \n        const [weekStart] = this.getWeekRange(new Date(dateKey));\n        const weekKey = this.toDateKey(weekStart);\n        const rowMap = this.previewWeekRowMap.get(weekKey);\n      \n        for (const seg of segList) {\n          const eventId = seg.getParentId();\n          const event = this.previewEventMap.get(eventId);\n          if (!event || !rowMap?.has(eventId)) continue;\n      \n          const rowIndex = rowMap.get(eventId)!;\n          const top = rowIndex * totalRowHeight;\n      \n          const startDate = seg.getDate();\n          const endDate = new Date(event.endTime);\n      \n      \n          const spanDates = this.getEventSpanDatesForWidthCalculation({startTime :startDate,endTime: endDate })\n          const spanLenght =spanDates.length;\n          \n          const width = spanLenght * DAY_WIDTH;\n          const totalPadding = (spanLenght - 1) * PADDING;\n      \n      \n          seg.updatePosition(top, width,totalPadding);\n      \n      \n        }\n      }\n\n      private getEventSpanDatesForWidthCalculation(event: any): string[] {\n        const dates: string[] = [];\n        const current = new Date(event.startTime);\n        let end = new Date(event.endTime);\n      \n        // Normalize time\n        current.setHours(0, 0, 0, 0);\n        end.setHours(0, 0, 0, 0);\n      \n        // Get end of week for the event's start date\n        const [weekEnd] = this.getWeekEnd(current);\n      \n        // Clamp end date to week end\n        if (end > weekEnd) {\n          end = new Date(weekEnd);\n        }\n      \n        while (current <= end) {\n          const dKey = this.toDateKey(current);\n          const dayStr = this.getDayString(current);\n          if (this.visibleDays.includes(dayStr)) {\n            dates.push(dKey);\n          }\n          current.setDate(current.getDate() + 1);\n        }\n      \n        return dates;\n      }\n      private getWeekEnd(startDate: Date): [Date] {\n        const endOfWeek = new Date(startDate);\n        const day = startDate.getDay(); // 0 = Sunday, 6 = Saturday\n        const daysToSaturday = (6 - day);\n        endOfWeek.setDate(startDate.getDate() + daysToSaturday);\n        endOfWeek.setHours(0, 0, 0, 0);\n        return [endOfWeek];\n      }\n\n      private getEventSpanDates(event: IEventObject): string[] {\n        const dates: string[] = [];\n        const current = new Date(event.startTime);\n        const end = new Date(event.endTime);\n        current.setHours(0, 0, 0, 0);\n        end.setHours(0, 0, 0, 0);\n      \n        while (current <= end) {\n          const dKey = this.toDateKey(current);\n          const dayStr = this.getDayString(current);\n          if (this.visibleDays.includes(dayStr)) {\n            dates.push(dKey);\n          }\n          current.setDate(current.getDate() + 1);\n        }\n      \n        return dates;\n      }\n\n      getEventsForDay(date :Date) {\n        const key = this.toDateKey(date);\n        const allSegments = this.previewDateToSegments.get(key) || [];\n        const filteredSegments = allSegments.filter(seg => seg.shouldRenderSegment());\n        return {\n          events: filteredSegments\n            .map(seg => ({ segment: seg, event: this.previewEventMap.get(seg.getParentId()) }))\n            .sort((a, b) => {\n              const topA = a.segment.getTop() ?? 0;\n              const topB = b.segment.getTop() ?? 0;\n              return topA - topB;\n            }),\n        };\n      }\n\n      getEvents(){\n        const uniqueEvents:any = [];\n        for (const segments of this.previewDateToSegments.values()) {\n            for (const seg of segments) {\n                if (seg.shouldRenderSegment()) {\n                            uniqueEvents.push(seg);\n                }\n            }\n        }\n        return uniqueEvents;\n      }\n\n     getEventsMap(){\n        return this.previewEventMap\n     }\n\n     destroy(){\n        this.previewDateToSegments = new Map();\n        this.previewEventMap       = new Map();\n        this.previewSegmentMap     = new Map();\n        this.previewWeekRowMap     = new Map();\n        this.previewWeekToSegments = new Map();\n     }\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { IChangedEventIds, IEventIndexMap, IMonthEventBlockController } from \"./month-event-block-controller.types\";\n// import dayjs from \"dayjs\";\n\nimport { DGDate } from \"../../../utility/dg-date/DGDate\";\nimport { IMonthEventBlock, IMonthEventUpdateCallback } from \"../month-event-block.types\";\nimport { IMonthEventAxis } from \"../month-event-axis.types\";\nimport { CustomArray } from \"../custom-cellblock-array\";\nimport { IEventData } from \"../../../vertical-calendar-configuration\";\nimport { EventCoordinate } from '../event-coordinates';\nimport { IEventCoordinate } from '../event-coordinates.types';\n\nexport class MonthEventBlockController implements IMonthEventBlockController{\n    cellBlocks : { [key: number]: { [key: number]: CustomArray<IMonthEventBlock | null> } } = {}\n    eventAxis : IMonthEventAxis\n    constructor(eventAxis : IMonthEventAxis){\n        this.cellBlocks = {};\n        this.eventAxis = eventAxis;\n    }\n    addBlock(eventBlock: IMonthEventBlock, eventIndexMap : IEventIndexMap, changedEventIds : IChangedEventIds): void {\n        const startRowIndex = eventBlock.getStartCellRowIndex();\n        const endRowIndex = eventBlock.getEndCellRowIndex();\n        const startColumnIndex = eventBlock.getStartCellColumnIndex();\n        const endColumnIndex = eventBlock.getEndCellColumnIndex();\n\n        this.addEventBlockInRange(startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, eventBlock, eventIndexMap, changedEventIds);\n    }\n    removeBlock(eventBlock: IMonthEventBlock, eventIndexMap : IEventIndexMap, changedEventIds : IChangedEventIds): void {\n        const startRowIndex = eventBlock.getStartCellRowIndex();\n        const endRowIndex = eventBlock.getEndCellRowIndex();\n        const startColumnIndex = eventBlock.getStartCellColumnIndex();\n        const endColumnIndex = eventBlock.getEndCellColumnIndex();\n        \n        this.removeEventBlocksInRange(startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, eventBlock, eventIndexMap, changedEventIds);\n    }\n    getBlock(rowTimestamp: number, cellTimestamp: number): IMonthEventBlock[] | null {\n        const rowBlock = this.cellBlocks[rowTimestamp];\n        if(rowBlock) {\n            return (rowBlock[cellTimestamp] ?? []) as any;\n        }\n        return [];\n    }\n    getBlockIfNotCreated(rowTimestamp : number, cellTimestamp : number) : CustomArray<IMonthEventBlock | null>{\n        if(this.cellBlocks[rowTimestamp] === undefined){\n            this.cellBlocks[rowTimestamp] = {};\n        }\n        if(this.cellBlocks[rowTimestamp][cellTimestamp] === undefined){\n            this.cellBlocks[rowTimestamp][cellTimestamp] = new CustomArray<IMonthEventBlock | null>();\n        }\n        return this.cellBlocks[rowTimestamp][cellTimestamp];\n    }\n    getBlocks(rowTimestamp : number, cellTimestamp : number) : CustomArray<IMonthEventBlock | null>{\n        return this.cellBlocks[rowTimestamp]?.[cellTimestamp];\n    }\n    setBlocks(rowTimestamp : number, cellTimestamp : number, eventBlock : CustomArray<IMonthEventBlock | null>){\n        this.getBlockIfNotCreated(rowTimestamp, cellTimestamp);\n        this.cellBlocks[rowTimestamp][cellTimestamp] = eventBlock;\n    }\n    getBlocksCount(rowTimestamp : number, cellTimestamp : number) : number{\n        const block = this.getBlockIfNotCreated(rowTimestamp, cellTimestamp);\n        if(block){\n            return block.length;\n        }\n        return 0;\n    }\n    fillRemainingAffectedBlocks(rowTimestamp : number, cellTimestamp : number, cellBlocks : CustomArray<IMonthEventBlock | null>, eventIndexMap: Map<string, number>, changedEventIDs: Map<string, IMonthEventUpdateCallback>){\n        if(!cellBlocks){\n            return\n        }\n        const newBlocks = new CustomArray<IMonthEventBlock>();\n        const remainingBlocks = new CustomArray<IMonthEventBlock>();\n        let maxIndex = -1;\n        for (let i = 0; i < cellBlocks.length; i++) {\n            const cellBlock = cellBlocks[i];\n            if (cellBlock) {\n                const eventID = cellBlock.getID();\n                const coordinate = cellBlock.getRootCellCoordinate(rowTimestamp);\n                const coordinateID = coordinate.getID();\n                if (eventIndexMap.has(coordinateID)) {\n                    const cachedIndex = eventIndexMap.get(coordinateID);\n                    if (cachedIndex !== undefined) {\n                        newBlocks[cachedIndex] = cellBlock;\n                        coordinate.setTop(cachedIndex * this.eventAxis.getEventHeightWithBuffer());\n                        changedEventIDs.set(coordinateID, {\n                            type: 'update',\n                            eventID,\n                            coordinate\n                        })\n                        maxIndex = cachedIndex;\n                    }\n                } else {\n                    remainingBlocks.push(cellBlock);\n                }\n            }\n        }\n        maxIndex = Math.max(maxIndex + 1, cellBlocks.length);\n        for (let i = 0, tempIndex = 0; i < maxIndex; i++) {\n            if (newBlocks[i] === undefined) {\n                const remainingBlock = remainingBlocks[tempIndex];\n                if (!remainingBlock) {\n                    break\n                }\n                const eventID = remainingBlock.getID();\n                const coordinate = remainingBlock.getRootCellCoordinate(rowTimestamp);\n                const coordinateID = coordinate.getID();\n                coordinate.setTop(i * this.eventAxis.getEventHeightWithBuffer());\n                eventIndexMap.set(coordinateID, i);\n                coordinate.setCellBlockIndex(i);\n                newBlocks[i] = remainingBlock;\n                changedEventIDs.set(coordinateID, {\n                    type: 'update',\n                    eventID,\n                    coordinate\n                })\n                tempIndex++;\n            }\n        }\n        this.setBlocks(rowTimestamp, cellTimestamp, newBlocks);\n    }\n    cachePreviousIndexForBlocks(rowTimestamp : number,  cellBlocks : CustomArray<IMonthEventBlock | null>, eventIndexMap: Map<string, number>){\n        if(!cellBlocks){\n            return\n        }\n        for (let i = 0; i < cellBlocks.length; i++) {\n            const cellBlock = cellBlocks[i];\n            if (cellBlock) {\n                const coordinate = cellBlock.getRootCellCoordinate(rowTimestamp);\n                const coordinateID = coordinate.getID();\n                if (!eventIndexMap.has(coordinateID)) {\n                    eventIndexMap.set(coordinateID, i);\n                }\n            }\n        }\n    }\n    cachePreviousAffectedBlockInRange(rowTimestamp: number, startColumnIndex: number, endColumnIndex: number, eventIndexMap: Map<string, number>){\n        for (let currentColumnIndex = startColumnIndex; currentColumnIndex <= endColumnIndex; currentColumnIndex++) {\n            const cellBlocks = this.getBlocks(rowTimestamp, currentColumnIndex);\n            if(cellBlocks){\n                this.cachePreviousIndexForBlocks(rowTimestamp, cellBlocks, eventIndexMap);\n            }\n        }\n    }\n    fillRemainingAffectedBlocksInRange(rowTimestamp: number, startColumnIndex: number, endColumnIndex: number, eventIndexMap: Map<string, number>, changedEventIDs: Map<string, IMonthEventUpdateCallback>) {\n        for (let currentColumnIndex = startColumnIndex; currentColumnIndex <= endColumnIndex; currentColumnIndex++) {\n            const cellBlocks = this.getBlocks(rowTimestamp, currentColumnIndex);\n            if(cellBlocks){\n                this.fillRemainingAffectedBlocks(rowTimestamp, currentColumnIndex, cellBlocks, eventIndexMap, changedEventIDs);\n            }\n        }\n    }\n    addEventBlockInRange(startRowIndex : number, startColumnIndex : number, endRowIndex : number, endColumnIndex : number, eventBlock : IMonthEventBlock, eventIndexMap: Map<string, number>, changedEventIDs: Map<string, IMonthEventUpdateCallback>){\n        const eventData = eventBlock.getEventData();\n        const columnCount = this.eventAxis.getColumnCount();\n\n        // To update first row of current added event for remaining blocks\n        this.cachePreviousAffectedBlockInRange(startRowIndex, 0, startColumnIndex - 1, eventIndexMap);\n\n        this.iterateOverIndexes(startRowIndex, startColumnIndex, endRowIndex, endColumnIndex, (currentRowIndex: number, currentStartColumnIndex: number, currentEndColumnIndex: number) => {\n            const widthPercent = this.eventAxis.getWidthPercent(currentStartColumnIndex, currentEndColumnIndex);\n            const height = this.eventAxis.getEventHeight(eventBlock.getEventData());\n            const eventCoordinateID = this.generateUniqueIdForCoordinates(eventData.id);\n            const eventCoordinate = new EventCoordinate(eventCoordinateID);\n            eventCoordinate.setWidth(widthPercent);\n            eventCoordinate.setHeight(height);\n            eventCoordinate.setColumnIndex(currentStartColumnIndex);\n            eventCoordinate.setRowIndex(currentRowIndex);\n    \n            eventBlock.setRootCell(currentRowIndex, eventCoordinate);\n    \n            for (let columnIndex = currentStartColumnIndex; columnIndex <= currentEndColumnIndex; columnIndex++) {\n                let cellBlocks = this.getBlockIfNotCreated(currentRowIndex, columnIndex);\n                this.addEventBlockInCell(cellBlocks, eventBlock, eventCoordinate,  currentRowIndex, eventIndexMap, changedEventIDs);\n                // const insertedIndex = eventCoordinate.getCellBlockIndex();\n                this.updateNextEventPositions(0, cellBlocks, currentRowIndex, eventIndexMap, changedEventIDs);\n            }\n            // Update remainng cell blocks in row because of currentEvent change\n            this.fillRemainingAffectedBlocksInRange(currentRowIndex, currentEndColumnIndex + 1, columnCount - 1, eventIndexMap, changedEventIDs);\n        });\n    }\n\n    addEventBlockInCell(cellBlocks : CustomArray<IMonthEventBlock | null>, eventBlock: IMonthEventBlock, eventCoordinate : IEventCoordinate, currentRowIndex : number, eventIndexMap: Map<string, number>, changedEventIDs: Map<string, IMonthEventUpdateCallback>){\n        const eventCoordinateID = eventCoordinate.getID();\n        const startDate = eventBlock.getStartDate();\n        let insertingIndex = 0;\n        if (!eventIndexMap.has(eventCoordinateID)) {\n            for (let i = 0; i < cellBlocks.length; i++) {\n                const currentBlock = cellBlocks[i];\n                insertingIndex = i + 1;\n                // If block is null we can just insert in that position and update top\n                if (currentBlock === null) {\n                    insertingIndex = i;\n                    break;\n                }\n                // Calculate index for currentBlock\n                const currentBlockStartDate = currentBlock.getStartDate();\n                if (new DGDate(startDate).isBefore(new DGDate(currentBlockStartDate))) {\n                    insertingIndex = i;\n                    break;\n                }\n                const currentBlockCoordinate = currentBlock.getRootCellCoordinate(currentRowIndex);\n                eventIndexMap.set(currentBlockCoordinate.getID(), i);\n            }\n            eventIndexMap.set(eventCoordinateID, insertingIndex);\n            eventCoordinate.setCellBlockIndex(insertingIndex);\n            eventCoordinate.setTop(insertingIndex * this.eventAxis.getEventHeightWithBuffer())\n            changedEventIDs.set(eventCoordinateID, {\n                type : 'add',\n                eventID : eventBlock.getID(),\n                coordinate : eventCoordinate\n            })\n        } else {\n            const cachedIndex = eventIndexMap.get(eventCoordinateID);\n            if (cachedIndex !== undefined) {\n                insertingIndex = cachedIndex;\n            }\n        }\n        cellBlocks.customSplice(insertingIndex, 0, eventBlock);\n    }\n\n    removeEventBlocksInRange(startRowIndex : number, startColumnIndex : number, endRowIndex : number, endColumnIndex : number, eventBlock : IMonthEventBlock, eventIndexMap: Map<string, number>, changedEventIDs: Map<string, IMonthEventUpdateCallback>){\n        const columnCount = this.eventAxis.getColumnCount();\n        // To update first row of current deleted event for remaining blocks\n        this.fillRemainingAffectedBlocksInRange(startRowIndex, 0, startColumnIndex, eventIndexMap, changedEventIDs);\n        this.iterateOverIndexes(startRowIndex, startColumnIndex, endRowIndex, endColumnIndex,(currentRowIndex: number, currentStartColumnIndex: number, currentEndColumnIndex: number) => {\n            const eventCordinate = eventBlock.getRootCellCoordinate(currentRowIndex);\n            changedEventIDs.set(eventCordinate.getID(), {\n                eventID : eventBlock.getID(),\n                type: 'remove',\n                coordinate: eventCordinate\n            })\n            const cellRowIndex = eventCordinate.getCellBlockIndex();\n            for (let columnIndex = currentStartColumnIndex; columnIndex <= currentEndColumnIndex; columnIndex++) {\n                this.removeEventBlockInCell(currentRowIndex, columnIndex, cellRowIndex, eventIndexMap, changedEventIDs);\n                const cellBlocks = this.getBlocks(currentRowIndex, columnIndex);\n                this.updateNextEventPositions(cellRowIndex, cellBlocks, currentRowIndex, eventIndexMap, changedEventIDs);\n            }\n            // To update last row of current deleted event for remaining blocks\n            this.fillRemainingAffectedBlocksInRange(currentRowIndex, currentEndColumnIndex + 1, columnCount - 1, eventIndexMap, changedEventIDs);\n        });\n    }\n    removeEventBlockInCell(currentRowIndex : number, columnIndex : number, cellRowIndex : number, _eventIndexMap: Map<string, number>, _changedEventIDs: Map<string, IMonthEventUpdateCallback>){\n        const cellBlocks = this.getBlocks(currentRowIndex, columnIndex);\n        cellBlocks.splice(cellRowIndex, 1);\n    }\n    updateNextEventPositions(cellRowIndex : number, cellBlocks : CustomArray<IMonthEventBlock | null>, currentRowIndex : number, eventIndexMap: Map<string, number>, changedEventIDs: Map<string, IMonthEventUpdateCallback>){\n        for (let i = cellRowIndex; i < cellBlocks.length; i++) {\n            const cellBlock = cellBlocks[i];\n            if(!cellBlock){\n                continue\n            }\n            const eventID = cellBlock.getID();\n            const coordinate = cellBlock.getRootCellCoordinate(currentRowIndex);\n            const coordinateID = coordinate.getID();\n            if (!eventIndexMap.has(coordinateID)) {\n                coordinate.setTop(i * this.eventAxis.getEventHeightWithBuffer());\n                eventIndexMap.set(coordinateID, i);\n                coordinate.setCellBlockIndex(i);\n                changedEventIDs.set(coordinateID, {\n                    type: 'update',\n                    eventID,\n                    coordinate\n                })\n            }\n        }\n    }\n    getEventIndexInBlock(rowTimestamp : number, cellTimestamp : number, eventData : IEventData) : number{\n        const blocks = this.getBlockIfNotCreated(rowTimestamp, cellTimestamp);\n        const eventID = eventData.id;\n        for(let i = 0; i < blocks.length; i++){\n            const block = blocks[i];\n            if (block !== null) {\n                const currentEventID = block.getID();\n                if(currentEventID === eventID){\n                    return i;\n                }\n            }\n        }\n        return -1;\n    }\n    private iterateOverIndexes(startRowIndex : number, startColumnIndex : number, endRowIndex : number, endColumnIndex : number, callback : CallableFunction){\n        const columnCount = this.eventAxis.getColumnCount();\n        for (let i = startRowIndex; i <= endRowIndex; i++) {\n            if (i === startRowIndex) {\n                if (i !== endRowIndex) {\n                    callback(i, startColumnIndex, columnCount - 1);\n                } else {\n                    callback(i, startColumnIndex, endColumnIndex);\n                }\n            } else if (i === endRowIndex) {\n                if (i !== startRowIndex) {\n                    callback(i, 0, endColumnIndex)\n                } else {\n                    callback(i, 0, columnCount - 1);\n                }\n            } else {\n                callback(i, 0, columnCount - 1);\n            }\n        }\n    }\n    generateUniqueIdForCoordinates(_id : string) : string{\n        return uuidv4();\n    }\n}\n\n// getBoundaryForEventBlock(eventBlock  : IMonthEventBlock){\n//     const startRowIndex = eventBlock.getStartCellRowIndex();\n//     const startColumnIndex = eventBlock.getStartCellColumnIndex();\n//     const endRowIndex = eventBlock.getEndCellRowIndex();\n//     const endColumnIndex = eventBlock.getEndCellColumnIndex();\n\n//     return { startRowIndex, startColumnIndex, endRowIndex, endColumnIndex};\n// }","import { EventEmitter } from \"@dg/corecomponent\";\nimport { IEventBlock } from \"../../core/event-handler/event-block-types\";\nimport { IEventObject } from \"../../data-structure/event-object.types\";\nimport { PreviewEventStore } from \"../event-handler/new/preview-event-store\";\nimport {  BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\nimport { EventHandler } from \"@dg/corecomponent\";\nimport { IEventData } from \"../../vertical-calendar-configuration\";\nimport { AutoScrollHandler } from \"../../utils/auto-scroll-handler\";\n\n\ntype ResizeDirection = \"start\" | \"end\" | null;\n\nexport interface ResizeEventPayload {\n    eventBlock: any;\n    newStartTime: Date;\n    newEndTime: Date;\n    direction: ResizeDirection;\n    originalEvent: IEventObject;\n    isValid: boolean;\n}\n\n/** Params passed to onResizeStart */\nexport interface ResizeStartPayload {\n    eventBlock: any;\n    direction: ResizeDirection;\n    originalEvent: IEventObject;\n}\n\n/** Params passed to onResizeEnd */\nexport interface ResizeEndPayload {\n    previousEventData: IEventObject;\n    currentEventData: IEventObject;\n}\n\n/** Callbacks for resize phases. Pass to registerResizeHandle. */\nexport interface ResizeCallbacks {\n    onResizeStart?: (params: ResizeStartPayload) => void;\n    onResize?: (params: ResizeEventPayload) => void;\n    onResizeEnd?: (params: ResizeEndPayload) => void;\n}\n\nexport class EventResizeController extends EventEmitter {\n    private isResizing: boolean = false;\n    private direction: ResizeDirection = null;\n    private eventBlock: any;\n    private originalEvent: IEventObject | null = null;\n    private startY: number = 0;\n    private startX: number = 0;\n    private initialScrollTop: number = 0; // Track initial scroll position\n    private minDurationMinutes: number = 15; // Example: 15 min minimum\n    private gridContainer: HTMLElement | null = null;\n    private calendarContainer: HTMLElement | null = null; // Calendar scroll container\n    private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    private clonedEvent !: IEventObject;\n    private autoScrollHandler: AutoScrollHandler | null = null;\n\n    private previewEventStore !: PreviewEventStore;\n    private lastPreviewEventSegments: any;\n    private resizeMoveRAF: number | null = null;\n    /** Day cell that contains the event segment; used for cell dimensions during resize */\n    private cellElement: HTMLElement | null = null;\n    /** Callbacks per direction so we invoke onEventStartDateResizeEnd vs onEventEndDateResizeEnd correctly */\n    private resizeCallbacksByDirection: Partial<Record<NonNullable<ResizeDirection>, ResizeCallbacks>> = {};\n\n    constructor(getBeanInstanceByBeanName: getBeanInstanceByBeanName){\n        super()\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName\n        this.previewEventStore = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.PREVIEW_EVENT_STORE)\n    }\n\n    /**\n     * Register a resize handle and optional callbacks for resize phases.\n     * @param callbacks - Optional: onResizeStart, onResize (while resizing), onResizeEnd. Same callbacks can be passed for both start and end handles.\n     */\n    public registerResizeHandle(\n        handleElement: HTMLElement,\n        eventBlock: IEventBlock,\n        direction: ResizeDirection,\n        cellElement: HTMLElement,\n        callbacks?: ResizeCallbacks\n    ) {\n        if (callbacks && direction) {\n            this.resizeCallbacksByDirection[direction] = callbacks;\n        }\n        handleElement.addEventListener(\"mousedown\", (e) => this.onResizeStart(e, eventBlock, direction, cellElement));\n        handleElement.addEventListener(\"touchstart\", (e) => this.onResizeStart(e, eventBlock, direction, cellElement), { passive: true });\n    }\n\n    private onResizeStart(\n        e: MouseEvent | TouchEvent,\n        eventBlock: any,\n        direction: ResizeDirection,\n        cellElement: HTMLElement\n    ) {\n        e.preventDefault();\n        e.stopPropagation();\n\n        this.isResizing = true;\n        this.direction = direction;\n        this.eventBlock = eventBlock;\n        this.cellElement = cellElement;\n        this.originalEvent = { ...eventBlock.event };\n        this.startY = this.getY(e);\n        this.startX = this.getX(e);\n\n        // Store initial scroll position\n        this.initializeAutoScroll();\n        if (this.calendarContainer) {\n            this.initialScrollTop = this.calendarContainer.scrollTop;\n        }\n\n        // Notify observer and optional callback\n        const params: ResizeStartPayload = {\n            eventBlock,\n            direction,\n            originalEvent: this.originalEvent!\n        };\n        this.dispatchResizeEvents('resizeStart', params);\n        this.resizeCallbacksByDirection[this.direction!]?.onResizeStart?.(params);\n\n        window.addEventListener(\"mousemove\", this.onResizeMove);\n        window.addEventListener(\"touchmove\", this.onResizeMove, { passive: false });\n        window.addEventListener(\"mouseup\", this.onResizeEnd);\n        window.addEventListener(\"touchend\", this.onResizeEnd);\n    }\n\n    private initializeAutoScroll(): void {\n        // Only enable auto-scroll for vertical_month calendar type\n        const optionsHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        if (optionsHandler && optionsHandler.getCalendarType() === 'vertical_month') {\n            const controllerHandler = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.CONTROLLER_HANDLER);\n            if (controllerHandler && controllerHandler.getController()) {\n                const calendarElement = controllerHandler.getController().getElement();\n                if (calendarElement) {\n                    this.calendarContainer = calendarElement;\n                    this.autoScrollHandler = new AutoScrollHandler({\n                        calendarElement: calendarElement\n                    });\n                }\n            }\n        }\n    }\n\n    private dispatchResizeEvents(type:string,params:any){\n        const eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER) as EventHandler;\n        eventHandler.dispatchEvent({type,...params})\n    }\n\n    private onResizeMove = (e: MouseEvent | TouchEvent) => {\n        if (!this.isResizing || !this.eventBlock || !this.originalEvent) return;\n        if (!this.gridContainer) return;\n        if (this.resizeMoveRAF !== null) return;\n        this.resizeMoveRAF = requestAnimationFrame(() => {\n            this.resizeMoveRAF = null;\n            this.applyResizeMove(e);\n        });\n    };\n\n    private applyResizeMove(e: MouseEvent | TouchEvent) {\n        if (!this.isResizing || !this.eventBlock || !this.originalEvent || !this.gridContainer) return;\n        const rect = this.gridContainer.getBoundingClientRect();\n        const { cellWidth, rowHeight } = this.getCellDimensionsFromElement();\n        const numColumns = 7;\n    \n        const currentX = this.getX(e);\n        const currentY = this.getY(e);\n\n        // Use scrollTop at start and current time for absolute Y positions\n        const currentScrollTop = this.autoScrollHandler ? this.autoScrollHandler.getScrollTop() : (this.calendarContainer ? this.calendarContainer.scrollTop : 0);\n        const startAbsoluteY = this.startY + this.initialScrollTop - rect.top;\n        const currentAbsoluteY = currentY + currentScrollTop - rect.top;\n\n        // Clamp pointer inside the grid bounds (in absolute coordinates)\n        const clampedX = Math.max(rect.left, Math.min(currentX, rect.right - 1));\n        // const clampedStartY = Math.max(0, Math.min(startAbsoluteY, rect.bottom - rect.top - 1));\n        // const clampedCurrentY = Math.max(0, Math.min(currentAbsoluteY, rect.bottom - rect.top - 1));\n\n        // Calculate row/column from cursor position so crossing a cell boundary updates the date immediately.\n        // E.g. when cursor moves above the top of the current cell, currentRow decreases and date updates.\n        const startCol = Math.floor((this.startX - rect.left) / cellWidth);\n        const currentCol = Math.floor((clampedX - rect.left) / cellWidth);\n        const startRow = Math.floor(startAbsoluteY / rowHeight);\n        const currentRow = Math.max(0, Math.floor(currentAbsoluteY / rowHeight));\n        const colDelta = currentCol - startCol;\n        const rowDelta = currentRow - startRow;\n        const daysDelta = colDelta + (rowDelta * numColumns);\n\n\n\n    \n        let newStartTime = this.originalEvent.startTime;\n        let newEndTime = this.originalEvent.endTime;\n    \n        if (this.direction === \"start\") {\n            newStartTime = new Date(this.originalEvent.startTime);\n            newStartTime.setDate(newStartTime.getDate() + daysDelta);\n    \n            // Prevent overlap with end\n            if (newStartTime >= newEndTime) {\n                newStartTime = new Date(newEndTime.getTime() - this.minDurationMinutes * 60000);\n            }\n        } else if (this.direction === \"end\") {\n            newEndTime = new Date(this.originalEvent.endTime);\n            newEndTime.setDate(newEndTime.getDate() + daysDelta);\n    \n            // Prevent overlap with start\n            if (newEndTime <= newStartTime) {\n                newEndTime = new Date(newStartTime.getTime() + this.minDurationMinutes * 60000);\n            }\n        }\n    \n        // Snap to nearest interval if needed\n        newStartTime = this.snapToInterval(newStartTime, this.minDurationMinutes);\n        newEndTime = this.snapToInterval(newEndTime, this.minDurationMinutes);\n    \n        const isValid = this.validateResize(newStartTime, newEndTime);\n    \n        const params: ResizeEventPayload = {\n            eventBlock: this.eventBlock,\n            newStartTime,\n            newEndTime,\n            direction: this.direction,\n            originalEvent: this.originalEvent,\n            isValid,\n        };\n\n         this.clonedEvent = { ...this.eventBlock.event };\n         this.clonedEvent.endTime = newEndTime;\n         this.clonedEvent.startTime = newStartTime;\n         this.clonedEvent.endTime.setHours(0,0,0,0);\n         this.clonedEvent.startTime.setHours(0,0,0,0);\n\n\n        const calendarDataStore = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK)\n\n         if(this.lastPreviewEventSegments){\n            for (let i = 0; i <  this.lastPreviewEventSegments.length; i++) {\n                const eventSeg =  this.lastPreviewEventSegments[i];\n                const date = eventSeg.getDate();\n                calendarDataStore.destroyPreviewEvent(date);\n            }\n            this.lastPreviewEventSegments = null\n         }\n\n        this.previewEventStore.addOrUpdateEvent(this.clonedEvent);\n\n       this.lastPreviewEventSegments =  this.previewEventStore.getEvents();\n        for (let i = 0; i <  this.lastPreviewEventSegments.length; i++) {\n            const eventSeg =  this.lastPreviewEventSegments[i];\n            const date = eventSeg.getDate();\n            calendarDataStore.togglePreviewEvent(date);\n        }\n        \n        // Update auto-scroll during resize\n        if (this.autoScrollHandler) {\n            this.autoScrollHandler.update(currentY, currentX);\n        }\n        \n        // Notify observer and optional callback (while resizing)\n        this.dispatchResizeEvents('preview', params);\n        this.resizeCallbacksByDirection[this.direction!]?.onResize?.(params);\n    }\n\n    /**\n     * Calculate the scroll offset since the resize started\n     * This accounts for auto-scrolling that may have occurred\n     */\n    // private calculateScrollOffset(): number {\n    //     if (!this.autoScrollHandler) return 0;\n        \n    //     const currentScrollTop = this.autoScrollHandler.getScrollTop();\n    //     return currentScrollTop - this.initialScrollTop;\n    // }\n    \n\n    private onResizeEnd = (_e: MouseEvent | TouchEvent) => {\n        if (!this.isResizing || !this.eventBlock || !this.originalEvent) return;\n\n        this.isResizing = false;\n        if (this.resizeMoveRAF !== null) {\n            cancelAnimationFrame(this.resizeMoveRAF);\n            this.resizeMoveRAF = null;\n        }\n\n        // Stop auto-scroll\n        if (this.autoScrollHandler) {\n            this.autoScrollHandler.stop();\n            this.autoScrollHandler = null;\n        }\n\n        // Observer should listen to this and commit/cancel the resize\n        if (this.clonedEvent) {\n            const params: ResizeEndPayload = {\n                previousEventData: this.originalEvent,\n                currentEventData: this.clonedEvent\n            };\n\n            const calendarAPI = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.API);\n            const eventData: IEventData = {\n                id: params.currentEventData.id,\n                isAllDay: params.currentEventData.allDay,\n                startTime: new Date(params.currentEventData.startTime).toISOString(),\n                endTime: new Date(params.currentEventData.endTime).toISOString(),\n                color: params.currentEventData.color,\n                title: params.currentEventData.title\n            };\n             // Invoke the correct config callback: onEventStartDateResizeEnd for start handle, onEventEndDateResizeEnd for end handle\n             this.resizeCallbacksByDirection[this.direction!]?.onResizeEnd?.(params);\n            calendarAPI.updateEvents([eventData], () => {}, () => {});\n            \n\n            // Clear preview event from DOM and store so the actual (updated) event is shown\n            \n            this.clearPreviewEvent();\n\n            this.dispatchResizeEvents('resizeEnd', params);\n           \n        }\n\n        window.removeEventListener(\"mousemove\", this.onResizeMove);\n        window.removeEventListener(\"touchmove\", this.onResizeMove);\n        window.removeEventListener(\"mouseup\", this.onResizeEnd);\n        window.removeEventListener(\"touchend\", this.onResizeEnd);\n\n        // Reset state\n        this.direction = null;\n        this.eventBlock = null;\n        this.originalEvent = null;\n        this.cellElement = null;\n        this.startY = 0;\n        this.startX = 0;\n        this.initialScrollTop = 0;\n        this.calendarContainer = null;\n    };\n\n    private getY(e: MouseEvent | TouchEvent): number {\n        if (e instanceof MouseEvent) return e.clientY;\n        if (e.touches && e.touches.length > 0) return e.touches[0].clientY;\n        return 0;\n    }\n\n    private getX(e: MouseEvent | TouchEvent): number {\n        if (e instanceof MouseEvent) return e.clientX;\n        if (e.touches && e.touches.length > 0) return e.touches[0].clientX;\n        return 0;\n    }\n\n    private snapToInterval(date: Date, intervalMinutes: number): Date {\n        const ms = date.getTime();\n        const snapped = Math.round(ms / (intervalMinutes * 60000)) * (intervalMinutes * 60000);\n        return new Date(snapped);\n    }\n\n    private validateResize(newStart: Date, newEnd: Date): boolean {\n        // Add business logic: min/max duration, overlap, calendar bounds, etc.\n        return newEnd > newStart && ((newEnd.getTime() - newStart.getTime()) / 60000) >= this.minDurationMinutes;\n    }\n\n    /**\n     * Removes the preview event from the DOM and preview store after resize is committed.\n     */\n    private clearPreviewEvent(): void {\n        const calendarDataStore = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK);\n        if (this.lastPreviewEventSegments) {\n            for (let i = 0; i < this.lastPreviewEventSegments.length; i++) {\n                const eventSeg = this.lastPreviewEventSegments[i];\n                const date = eventSeg.getDate();\n                calendarDataStore.destroyPreviewEvent(date);\n            }\n            this.lastPreviewEventSegments = null;\n        }\n        if (this.clonedEvent) {\n            this.previewEventStore.removeEvent(this.clonedEvent.id);\n        }\n    }\n\n    /**\n     * Derives cell width and row height from the day cell element that contains the event.\n     * Falls back to option handler / constants when cellElement is not set (e.g. before first move).\n     */\n    private getCellDimensionsFromElement(): { cellWidth: number; rowHeight: number } {\n        if (this.cellElement) {\n            const cr = this.cellElement.getBoundingClientRect();\n            return { cellWidth: cr.width, rowHeight: cr.height };\n        }\n        return { cellWidth: this.getCellWidthFallback(), rowHeight: this.getRowHeightFallback() };\n    }\n\n    private getCellWidthFallback(): number {\n        return 130.61;\n    }\n\n    private getRowHeightFallback(): number {\n        const optionsHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        return optionsHandler?.getDefaultRowHeight() ?? 125.15;\n    }\n\n    public setGridContainer(container: HTMLElement) {\n        this.gridContainer = container;\n    }\n\n    /**\n     * Removes window listeners and resets state. Call when the event controller is destroyed\n     * so a resize in progress does not leave listeners attached.\n     */\n    public destroy(): void {\n        window.removeEventListener(\"mousemove\", this.onResizeMove);\n        window.removeEventListener(\"touchmove\", this.onResizeMove);\n        window.removeEventListener(\"mouseup\", this.onResizeEnd);\n        window.removeEventListener(\"touchend\", this.onResizeEnd);\n        if (this.resizeMoveRAF !== null) {\n            cancelAnimationFrame(this.resizeMoveRAF);\n            this.resizeMoveRAF = null;\n        }\n        if (this.autoScrollHandler) {\n            this.autoScrollHandler.stop();\n            this.autoScrollHandler = null;\n        }\n        this.isResizing = false;\n        this.direction = null;\n        this.eventBlock = null;\n        this.originalEvent = null;\n        this.cellElement = null;\n        this.gridContainer = null;\n        this.calendarContainer = null;\n        this.startY = 0;\n        this.startX = 0;\n        this.initialScrollTop = 0;\n        this.lastPreviewEventSegments = null;\n        this.resizeCallbacksByDirection = {};\n    }\n}\n","import { EventEmitter } from \"@dg/corecomponent\";\nimport { Anchor, INavigator } from \"./abstract-navigator.types\";\n\nexport abstract class AbstractNavigator extends EventEmitter implements INavigator {\n  getAnchor(): Anchor {\n    return { id : 0 , offset : 0 }\n  }\n  gotoAction(): void {\n  }\n  gotoPreviousDate(_count: number): void {\n  }\n  gotoNextDate(_count: number): void {\n  }\n\n  initialGotoDate(_cellTimeStamp: number, _rowTimeStamp: number, _offset: number): void {}\n  getAnchorDate(): number {\n    return 0;\n  }\n\n  init(): void {}\n\n  getOffset(): number {\n    return 0;\n  }\n\n  gotoDate(_date: number, _offset: number): void {}\n\n  getTop(_rowTimeStamp: number): number | null {\n    return 0;\n  }\n\n  onScroll(): void {}\n\n  reset(): void {}\n\n\n\n  onWheel(_event: WheelEvent): boolean {\n    return true;\n  }\n}\n","\nimport { AbstractNavigator } from \"../abstract-navigator\";\nimport { CellTimeStamp, RowTimeStamp } from \"../calendar-navigator-interactor.types\";\nimport { IButtonNavigatorInteractor } from \"./button-navigator.types\";\n\nexport class ButtonNavigator extends AbstractNavigator {\n\n    private readonly interactor: IButtonNavigatorInteractor;\n    private anchor: RowTimeStamp;\n    private offset: 0;\n    private orderedRow: RowTimeStamp[];\n\n    constructor(interactor: IButtonNavigatorInteractor) {\n        super();\n        this.interactor = interactor;\n        this.anchor = 1;\n        this.offset = 0;\n        this.orderedRow = [];\n    }\n\n    setBuffer(buffer: number): void {\n        this.interactor.setBuffer(buffer);\n    }\n\n    reset() {\n        this.anchor = 1;\n        this.offset = 0;\n        this.orderedRow = [];\n    }\n\n    getAnchorDate(): number {\n        return this.anchor;\n    }\n\n    getOffset(): number {\n        return this.offset;\n    }\n\n    initialGotoDate(cellTimeStamp: number, rowTimeStamp: number, _offset: number): void {\n        this.gotoDate(cellTimeStamp, rowTimeStamp);\n    }\n\n    gotoDate(cellTimeStamp: CellTimeStamp, rowTimeStamp: RowTimeStamp): void {\n        const doesAlreadyPresent = this.doesAlreadyPresent(cellTimeStamp);\n        const doesExccedLimit = this.isDateExceedsLimit(rowTimeStamp);\n        if(!doesAlreadyPresent && !doesExccedLimit) {\n            this.clearPrsentedRows();\n            this.handleRequiredRows(cellTimeStamp);\n        }\n\n        const top = this.getTop(this.interactor.getRowStartDate(rowTimeStamp));\n        this.interactor.setScrollTop(top || 0);\n    }\n\n    getTop(rowTimeStamp: RowTimeStamp) {\n        const index = this.orderedRow.indexOf(rowTimeStamp);\n        if(index !== -1) {\n            const rowLength = this.interactor.getRowHeight();\n            const top = rowLength * index;\n            return top;\n        } else {\n            console.error(rowTimeStamp, \"getTop - not presented in row\");\n            return null;\n        }\n    }\n\n    private isDateExceedsLimit(date: number) {\n        return  this.isDateFallBehindStartLimit(date) || this.isDateExceedsEndLimit(date);\n    }\n\n    private isDateExceedsEndLimit(date: number) {\n        const endLimit = this.interactor.getEndLimit()\n        if(endLimit) {\n            if(endLimit <= date) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    private isDateFallBehindStartLimit(date: number) {\n        const startLimit = this.interactor.getStartLimit();\n        if(startLimit) {\n            if(startLimit > date) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    private clearPrsentedRows() {\n        const presentedRows = this.interactor.getPresentedRows();\n        this.clearRows(presentedRows);\n    }\n\n    private handleRequiredRows(cellTimeStamp: CellTimeStamp) {\n        const date = new Date(cellTimeStamp);\n        const monthIndex = date.getMonth();\n        const year = date.getFullYear();\n        const dateOfMonth = date.getDate();\n        const requiredMonthRowTimeStamp = this.getRequiredRowTimeStamps(monthIndex, year, dateOfMonth);\n\n        this.setOrderedRows(requiredMonthRowTimeStamp);\n        this.handleAnchorDate();\n        this.addRows(requiredMonthRowTimeStamp);\n    }\n\n    private handleAnchorDate() {\n        const orderedRow = this.orderedRow;\n        if(orderedRow.length>0 && orderedRow[0] !== this.getAnchorDate()) {\n            this.setAnchorDate(orderedRow[0]);\n    //         this.interactor.onAnchorChange(orderedRow[0]);\n        }\n    }\n\n    private setAnchorDate(anchor: RowTimeStamp) {\n        this.anchor = anchor;\n    }\n\n    private setOrderedRows(rowTimeStamps: RowTimeStamp[]) {\n        this.orderedRow = rowTimeStamps;\n    }\n\n    private addRows(rowTimeStamps: RowTimeStamp[]) {\n        for(let rowTimeStamp of rowTimeStamps) {\n            const top = this.getTop(rowTimeStamp) as number;\n            this.interactor.addRow(rowTimeStamp,top);\n        }\n    }\n\n    private clearRows(rowTimeStamps: RowTimeStamp[]) {\n        for(let rowTimeStamp of rowTimeStamps) {\n            this.interactor.removeRow(rowTimeStamp);\n        }\n    }\n\n    private doesAlreadyPresent(cellTimeStamp: CellTimeStamp) {\n        const presentedRows = this.interactor.getPresentedRows();\n        const date = new Date(cellTimeStamp);\n        const monthIndex = date.getMonth();\n        const year = date.getFullYear();\n        const dateOfMonth = date.getDate();\n        const requiredMonthRowTimeStamp = this.getRequiredRowTimeStamps(monthIndex, year, dateOfMonth);\n\n        const missingRows = this.getMissingRows(requiredMonthRowTimeStamp, presentedRows);\n\n        if(missingRows.length > 0) {\n            return false;\n        } else {\n            return true;\n        }\n    }\n\n    private getMissingRows(requiredMonthRowTimeStamp: RowTimeStamp[], presentedRowTimeStamps: RowTimeStamp[]) {\n        let missingRowTimeStamps: RowTimeStamp[] = [];\n        for(let i of requiredMonthRowTimeStamp) {\n            if(presentedRowTimeStamps.includes(i) === false) {\n                missingRowTimeStamps.push(i);\n            }\n        }\n        return missingRowTimeStamps;\n    }\n\n    private getRequiredRowTimeStamps(monthIndex: number, year: number, date: number) {\n        const startDate =this.interactor.getPeriodStartDate(new Date(year, monthIndex, date, 0, 0, 0, 0).getTime());\n        const endDate = this.interactor.getPeriodEndDate(new Date(year, monthIndex, date+8, 0, 0, 0, 0).getTime());\n\n        const monthRowTimeStamps = this.interactor.getRowsInBetweenDates(startDate, endDate);\n        const requiredlength = this.interactor.getBuffer();\n        while(requiredlength > monthRowTimeStamps.length) {\n            const lastItem = monthRowTimeStamps.slice(-1)[0];\n            const nextRow = this.interactor.getNextRow(lastItem);\n            monthRowTimeStamps.push(nextRow);\n        }\n\n        return [...monthRowTimeStamps];\n    }\n}\n","\nimport { ICalendarDataStore } from \"../../data-structure/calendar-data-store.types\";\nimport { ScrollNavigator } from \"./scroll-navigator/scroll-navigation-manager\";\nimport { TimeStampMs } from \"./typeDef\";\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { AutoWired, Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\nimport { IControllerHandler } from \"../common-controllers/controller-handler/controller-handler.types\";\nimport { VERTICAL_CALENDAR_EVENT_NAME } from \"../../constant/vertical-calendar-event-name\";\nimport {CalendarType} from \"../../vertical-calendar-configuration\"\nimport { ButtonNavigator } from \"./button-navigator/button-navigator\";\nimport { CellTimeStamp } from \"./calendar-navigator-interactor.types\";\nimport { IButtonNavigatorInteractor } from \"./button-navigator/button-navigator.types\";\nimport type { VerticalCalendarRowContainerControllerTypes } from \"../../vertical-calendar-component/vertical-calendar-rows-container-component/vertical-calendar-rows-container-componet.types\";\n\n\n\n\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.NAVIGATOR_INTERACTOR)\nexport class CalendarNavigatorInteractor extends EventEmitter {\n\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler!: IControllerHandler;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK) private dataStore!: ICalendarDataStore;\n\n\n\n    \n    private container !  : HTMLElement;\n    private controller ! : VerticalCalendarRowContainerControllerTypes;\n    private navigator !  : any;\n    private innerLayerTop: number = 0;\n    private rowHeight !  : number;\n    private buffer !     : number;\n    private scrollTop    : number = 0;\n\n    // private eventOverlayController ! : EventOverlayController;\n\n\n    @PostConstruct()\n    init() {\n\n        this.controllerHandler.onAfterReady(    (param: any) => {\n\n            this.controller    = param.controller;\n            this.container     = this.controller.getElement();\n            // this.navigator     = new ScrollNavigator(this);\n            this.createNavigator();\n            this.innerLayerTop = 0;\n            this.rowHeight     = this.optionsHandler.getDefaultRowHeight()\n            this.buffer        = 12;\n            this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.INITIALIZE_MONTHS, this.reInitialize.bind(this));\n\n            this.initialize();\n        })\n\n    }\n\n    createNavigator(): void {\n        const calendarType = this.optionsHandler.getCalendarType();\n        switch (calendarType) {\n            case CalendarType.verticalMonth:\n                this.navigator = new ScrollNavigator(this);\n                break;\n            \n            case CalendarType.horizontalMonth:\n                this.navigator = new ButtonNavigator(new CalendarNavigatorInteractor.ManagerAsButtonNavigationInteractor(this));\n                break;\n        }\n    }\n\n    setRowHeight(height: number): void {\n        this.rowHeight = height;\n    }\n\n\n    private static ManagerAsButtonNavigationInteractor = class implements IButtonNavigatorInteractor {\n        \n        private readonly context: any;\n        private   buffer: number;\n\n        constructor(context: any) {\n            this.context = context;\n            // this.buffer = this.context.dataStore.getRowCount() * this.context.optionsHandler.getBufferMonth();\n            // this.buffer = this.context.dataStore.getInitialBuffer() ;\n            this.buffer = 6 ;\n\n            this.context.setRowHeight()\n            \n        }\n\n        getPeriodStartDate(cellTimeStamp: CellTimeStamp) {\n            const startDate = this.context.dataStore.getPeriodStartDate(cellTimeStamp);\n            return startDate;\n        }\n\n        getPeriodEndDate(cellTimeStamp: CellTimeStamp) {\n            const endDate = this.context.dataStore.getPeriodEndDate(cellTimeStamp);\n            return endDate;\n        }\n\n        getStartLimit() {\n            // const zoomLevel = this.context.customizer.getZoomLevel();\n            // const limit = this.context.customizer.getStartLimit();\n            // if(limit) {\n            //     const timeLimit = this.context.convertToTimeStampMs(limit);\n            //     const startLimit = zoomLevel.getPeriodStartDate(timeLimit);\n            //     const rows = zoomLevel.getRowStartDate(startLimit);\n            //     return rows;\n            // } else {\n            //     return null;\n            // }\n            return this.context.getStartLimit()\n        }\n\n        getEndLimit() {\n            // const limit = this.context.customizer.getEndLimit();\n            // if(limit) {\n            //     const timeLimit = this.context.convertToTimeStampMs(limit);\n            //     return timeLimit;\n            // } else {\n            //     return null;\n            // }\n            return this.context.getEndLimit()\n\n        }\n\n        onAnchorChange(anchor: number): void {\n            this.context.handleAnchorChange(anchor);\n        }\n\n        setScrollTop(top: number) {\n            this.context.setScrollTop(top);\n        }\n\n        getpreviousRow(cellTimeStamp: number): number {\n            const previousRow = this.context.getpreviousRow(cellTimeStamp);\n            return previousRow;\n        }\n\n        getNextRow(cellTimeStamp: number): number {\n            const nextRow = this.context.getNextRow(cellTimeStamp);\n            return nextRow;\n        }\n\n        getRowsInBetweenDates(startDate: number, endDate: number): number[] {\n            const rowTimeStamps = this.context.getRowsInBetweenDates(startDate, endDate);\n            return rowTimeStamps;\n        }\n\n        getPresentedRows(): number[] {\n            const alive = this.context.getPresentedRows();\n            return alive;\n        }\n\n        addRow(rowTimeStamp: number,top:number): void {\n            this.context.addRow(rowTimeStamp, top);\n        }\n\n        removeRow(rowTimeStamp: number): void {\n            this.context.removeRow(rowTimeStamp);\n        }\n\n        getRowHeight(): number {\n            const height = this.context.getRowHeight();\n            return height;\n        }\n\n        getRowLastDate(timestamp : TimeStampMs):number{\n            return this.context.getRowLastDate(timestamp)\n        }\n        getRowStartDate(timestamp : TimeStampMs):number{\n            return this.context.getRowStartDate(timestamp)\n        }\n\n        getBuffer(): number {\n            return this.buffer;\n        }\n\n        setBuffer(buffer: number): void {\n            this.buffer = buffer;\n        }\n\n        getScrollTop(): number {\n            const top = this.context.getScrollTop();\n            return top;\n        }\n    }\n\n\n    \n\n    load():void{\n\n        this.navigator.reset();\n        this.handleInnerLayerTop(0);\n        this.scrollTop = 0;\n\n    }\n\n    getInnerLayerTopOffset(): number {\n        return this.innerLayerTop;\n    }\n    private initialize():void{\n        this.load();\n        const startRowTimeStamp = this.getInitialScrollStartTimeStamp();\n        this.navigator.initialGotoDate(startRowTimeStamp, startRowTimeStamp, 0);\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.INITIALIZE_ROWS});\n\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.LOAD_EVENTS});\n\n    }\n\n\n\n\n    private reInitialize(): void {\n        this.load();\n        const startRowTimeStamp = this.getInitialScrollStartTimeStamp();\n        this.navigator.initialGotoDate(startRowTimeStamp, startRowTimeStamp, 0);\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.DESTROY_ROWS_CONTROLERS});\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.VIEW_PORT_CHANGE});\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.LOAD_EVENTS});\n\n\n    }\n    onScroll(): void {\n        \n        this.navigator.onScroll();\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.VIEW_PORT_CHANGE});\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.LOAD_EVENTS});\n\n\n    }\n\n    getScrollPivotDate(): number {\n\n        const startLimit = this.dataStore.getStartDate();\n    if (startLimit) {\n      const startDateTime = this.convertToTimeStampMs(startLimit);\n      const rowTimeStamp =this.dataStore.getRowStartDate(startDateTime);\n      return rowTimeStamp;\n    }\n    const startDate = this.dataStore.getStartDate();\n    if (startDate) {\n      const startDateTime = this.convertToTimeStampMs(startDate);\n      const rowTimeStamp = this.dataStore.getRowStartDate(startDateTime);\n      return rowTimeStamp;\n    }\n    const endLimit = this.dataStore.getEndDate();\n    if (endLimit) {\n      const endDateTime = this.convertToTimeStampMs(endLimit);\n      const rowTimeStamp = this.dataStore.getRowStartDate(endDateTime);\n      return rowTimeStamp;\n    }\n    return new Date(2025, 3, 1, 0, 0, 0, 0).getTime();\n    }\n    private getInitialScrollStartTimeStamp():number{\n        const startDate = this.dataStore.getStartDate();\n    let startTimeStamp;\n    if (startDate) {\n      startTimeStamp = this.convertToTimeStampMs(startDate);\n    } else {\n      startTimeStamp = new Date().getTime();\n    }\n    const rowTimeStamp = this.getRowLastDate(startTimeStamp);\n    return rowTimeStamp;\n\n    }\n    getRowLastDate(timestamp : TimeStampMs):number{\n        return this.dataStore.getRowLastDate(timestamp);\n    }\n    \n    getRowStartDate(timestamp : TimeStampMs):number{\n        return this.dataStore.getRowStartDate(timestamp);\n    }\n\n    private convertToTimeStampMs(ZDCDateString2 :TimeStampMs) {\n        const timestamp = new Date(ZDCDateString2).getTime();\n        return timestamp;\n      }\n\n\n\n    getBuffer(): number {\n        return this.buffer;\n      }\n    private handleInnerLayerTop(top:number):void{\n        if (top < 0) {\n            this.setInnerLayerTop(-top);\n          } else {\n            this.setInnerLayerTop(top);\n          }\n    }\n\n    private setInnerLayerTop(top:number) {\n        this.innerLayerTop = top;\n      }\n\n\n\n    loadOrder(): number[] {\n        const weeks = this.dataStore.getAllWeekNodes();\n        return weeks.map((_week, index) => index);\n    }\n\n    getTop(id: number): number {\n        const weekNode = this.dataStore.getWeekNodeByIndex(id);\n        return weekNode ? weekNode.getTopPosition() : 0;\n    }\n\n    getParentTop(): number {\n        return this.container.scrollTop;\n    }\n\n    scrollParentTo(x: number, y: number): void {\n        this.container.scrollTo(x, y);\n    }\n\n    scrollToDom(id: number, _offset: number): void {\n        const weekNode = this.dataStore.getWeekNodeByIndex(id);\n        if (weekNode) {\n            weekNode.setTopPosition(weekNode.getTopPosition());\n        }\n    }\n\n \n    // addItem(position: \"top\" | \"bottom\"): void {\n    //     if (position === \"top\") {\n    //         const firstWeek = this.dataStore.getWeekNodeByIndex(0);\n    //         if (firstWeek && firstWeek.getData()[0]?.date) {\n    //             const firstDate = firstWeek.getData()[0].date as Date;\n    //             const date = new Date(firstDate);\n    //             date.setDate(date.getDate() - 7);\n    //             this.dataStore.loadMoreWeeks(0, 1);\n    //         }\n    //     } else {\n    //         const lastWeek = this.dataStore.getWeekNodeByIndex(this.dataStore.getTotalWeeks() - 1);\n    //         if (lastWeek && lastWeek.getData()[0]?.date) {\n    //             const lastDate = lastWeek.getData()[0].date as Date;\n\n    //             const date = new Date(lastDate);\n    //             date.setDate(date.getDate() + 7);\n    //             this.dataStore.loadMoreWeeks(this.dataStore.getTotalWeeks(), 1);\n    //         }\n    //     }\n    // }\n\n\n\n    // addItemNotInRange(id: number): void {\n    //     this.dataStore.loadMoreWeeks(id, 1);\n    // }\n\n\n\n\n    getpreviousRow(cellTimeStamp: number): number {\n       return this.dataStore.getPreviousRowStartDate(cellTimeStamp);\n    }\n\n    getNextRow(cellTimeStamp: number): number {\n        return this.dataStore.getNextRowStartDate(cellTimeStamp);\n    }\n\n    getRowsInBetweenDates(startDate: number, endDate: number): number[] {\n        return this.dataStore.getRowsInBetweenDates(startDate,endDate)\n    }\n\n    getPresentedRows(): number[] {\n        return this.dataStore.getAllWeekNodesIndexes();\n    }\n\n    addRow(rowTimeStamp: number,top:number): void {\n\n        this.dataStore.addWeek(rowTimeStamp,top);\n        // const date = new Date(rowTimeStamp).toLocaleDateString()\n        // console.log(`Date added ${date} at top of ${top}`);\n    }\n\n    removeRow(rowTimeStamp: number): void {\n        this.dataStore.removeWeek(rowTimeStamp);\n        \n\n        \n    }\n\n\n    setScrollTop(top: number): void {\n        this.scrollTop = top;\n        this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.UPDATE_SCROLLTOP});\n\n        // this.container.scrollTop = this.scrollTop\n\n    }\n\n    getScrollTop(): number {\n        return this.scrollTop;\n    }\n\n    getContainerScrollTop(): number {\n        return this.container.scrollTop;\n    }\n\n    getInnerLayerTop(): number {\n        return this.innerLayerTop;\n    }\n\n\n    setInnerlayerTop(top: number): void {\n            this.innerLayerTop = top;\n}\n\n    getRowTimeStampAtCount(rowTimeStamp: number, count: number): number {\n        let requiredTimeStamp = this.dataStore.getRowStartDate(rowTimeStamp);\n    if (count < 0) {\n      for (let i = 0; i < Math.abs(count); i++) {\n        const RowDate = new Date(requiredTimeStamp);\n        const year = RowDate.getFullYear();\n        const monthIndex = RowDate.getMonth();\n        const dateOfMonth = RowDate.getDate();\n        const nextRowDate = new Date(year, monthIndex, dateOfMonth - 7, 0, 0, 0, 0);\n        requiredTimeStamp = nextRowDate.getTime();\n      }\n    } else {\n      for (let i = 0; i < count; i++) {\n        const RowDate = new Date(requiredTimeStamp);\n        const year = RowDate.getFullYear();\n        const monthIndex = RowDate.getMonth();\n        const dateOfMonth = RowDate.getDate();\n        const nextRowDate = new Date(year, monthIndex, dateOfMonth + 7, 0, 0, 0, 0);\n        requiredTimeStamp = nextRowDate.getTime();\n      }\n    }\n    return requiredTimeStamp;\n        // \n    }\n\n    getPivotDate(): number {\n        const pivotDate = this.getScrollPivotDate();\n        return pivotDate;;\n    }\n\n    getRowHeight(): number {\n        return this.rowHeight;\n    }\n\n    getStartLimit(): number | null {\n        return null;\n    }\n\n    getEndLimit(): number | null {\n        return null;\n    }\n\n    gotoNext(){\n        const anchor = this.getAnchor();\n        const currentDate = this.dataStore.getRowLastDate(anchor);\n\n        let nextRowTimeStamp = this.dataStore.getNextPeriodStartDate(currentDate);\n\n        // const bufferRowTimeStamp = this.dataStore.getNextPeriodStartDate(anchor);\n        //  const rowStartDate = this.dataStore.getRowStartDate(bufferRowTimeStamp);\n        // const buffer =  this.dataStore.getNextBufferForButtonNavigator(rowStartDate);\n        const buffer =  6;\n\n        if (nextRowTimeStamp === anchor) {\n            nextRowTimeStamp = this.dataStore.getNextPeriodStartDate(nextRowTimeStamp);\n        }\n        this.gotoTime(nextRowTimeStamp,buffer);\n\n        this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.VIEW_PORT_CHANGE});\n\n    }\n\n    gotoPrevious() {\n        const anchor = this.getAnchor();\n        const currentDate = this.dataStore.getRowLastDate(anchor);\n\n        let previousstartRowTimeStamp = this.dataStore.getPreviousPeriodStartDate(currentDate);\n\n        // const bufferRowTimeStamp = this.dataStore.getPreviousPeriodStartDate(anchor);\n        //  const rowStartDate = this.dataStore.getRowStartDate(bufferRowTimeStamp);\n        // const buffer =  this.dataStore.getPreviousBufferForButtonNavigator(rowStartDate)\n        const buffer =  6\n\n\n        if(previousstartRowTimeStamp === anchor) {\n            previousstartRowTimeStamp = this.dataStore.getPeriodStartDate(anchor);\n        }\n        this.gotoTime(previousstartRowTimeStamp,buffer);\n        this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.VIEW_PORT_CHANGE});\n\n\n\n\n    }\n    gotoTime(cellTimeStamp:CellTimeStamp, buffer:number,offset = 0) {\n        const rowTimeStamp = this.dataStore.getRowStartDate(cellTimeStamp);\n        this.navigator.setBuffer(buffer);\n        this.navigator.gotoDate(cellTimeStamp, rowTimeStamp, offset);\n      }\n    getAnchor() {\n        const anchor = this.navigator.getAnchorDate();\n        return anchor;\n\n    }\n\n} \n","import { AbstractNavigator } from \"../abstract-navigator\";\nimport {  RowTimeStamp } from \"../calendar-navigator-interactor.types\";\nimport { TimeStampMs } from \"../typeDef\";\n\nexport class ScrollNavigator extends AbstractNavigator {\n    private readonly interactor: any;\n    private anchor: RowTimeStamp;\n    private offset: number;\n    private pivotDate: RowTimeStamp;\n    private anchorCount: number;\n    private isReset: boolean;\n\n    constructor(interactor: any) {\n        super();\n        this.interactor = interactor;\n        this.isReset = true; // to check the anchor is set but not fixed view port on reload;\n        this.anchor = this.interactor.getPivotDate();\n        this.pivotDate = this.interactor.getPivotDate();\n        this.offset = 0;\n        this.anchorCount = 0;\n    }\n \n\n\n    initialGotoDate(cellTimeStamp:TimeStampMs, rowTimeStamp:TimeStampMs, offset:number) {\n        this.gotoDate(cellTimeStamp, rowTimeStamp, offset);\n      }\n\n      gotoDate(_cellTimeStamp:TimeStampMs, rowTimeStamp:TimeStampMs, offset:number = 0) {\n        const presentedRows = this.interactor.getPresentedRows();\n        const index = presentedRows.indexOf(rowTimeStamp);\n        if (index === -1) {\n          const top = this.getTop(rowTimeStamp);\n          this.scrollAction(top);\n        }\n        this.scrollToDate(rowTimeStamp, offset);\n      }\n\n      scrollAction(top:number) {\n        const anchor = this.getAnchorDate();\n        this.fixAnchorDate(top);\n        if (anchor !== this.getAnchorDate() || this.isReset) {\n          this.isReset = false;\n          this.handleViewPort(this.getAnchorDate());\n        }\n        this.handleOffset(top, this.anchorCount);\n      }\n\n    init(): void {\n        this.reset();\n        this.onScroll();\n    }\n\n    getAnchorDate(): number {\n        return this.anchor;\n    }\n\n    getOffset(): number {\n        return this.offset;\n    }\n\n    \n\n    getTop(rowTimeStamp: number): number {\n        let top: number;\n        if(rowTimeStamp < this.anchor) {\n            top = this.getTopOfRowAtBefore(rowTimeStamp);\n        } else {\n            top = this.getTopOfRowAtNext(rowTimeStamp);\n        }\n        return top;\n    }\n\n    onScroll() {\n        const top = this.interactor.getContainerScrollTop();\n        const calculatedTop = this.getInnerLayerTopForTop(top);\n        this.scrollAction(calculatedTop);\n\n    }\n\n    reset() {\n        this.isReset = true;\n        this.anchor = this.interactor.getPivotDate();\n        this.pivotDate = this.interactor.getPivotDate();\n        this.offset = 0;\n        this.anchorCount = 0;\n    }\n\n    private handleOffset(top: number, count: number) {\n        const offset = top - (count * this.interactor.getRowHeight());\n        this.setOffset(offset);\n    }\n\n    private getTopOfRowAtBefore(rowTimeStamp: number) {\n        const inBetween = this.interactor.getRowsInBetweenDates(rowTimeStamp, this.anchor);\n        const rowCount = -(inBetween.length-1) + this.anchorCount; // as its rowTimeStampOccursBefore.\n        const top = rowCount * this.interactor.getRowHeight();\n        return top;\n    }\n\n    private getTopOfRowAtNext(rowTimeStamp: number) {\n        const inBetween = this.interactor.getRowsInBetweenDates(this.anchor, rowTimeStamp);\n        const rowCount = (inBetween.length-1) + this.anchorCount; // as its rowTimeStampOccursBefore.\n        const top = rowCount * this.interactor.getRowHeight();\n        return top;\n    }\n\n    private getInnerLayerTopForTop(top: number) {\n        const innerLayerTop = this.interactor.getInnerLayerTop();\n        const diff = top - innerLayerTop;\n        return diff;\n    }\n\n    \n\n    private scrollToDate(rowTimeStamp: RowTimeStamp, offset: number) {\n        const top = this.getTop(rowTimeStamp);\n        const containerTop = this.interactor.getInnerLayerTop() + top;\n\n\n        this.interactor.setScrollTop(containerTop + offset || 0);\n    }\n\n    private setAnchorCount(count: number) {\n        this.anchorCount = count;\n    }\n\n    private setAnchor(rowTimeStamp: RowTimeStamp) {\n        this.anchor = rowTimeStamp;\n    }\n\n    private setOffset(offset: number) {\n        this.offset = offset;\n    }\n\n    private fixViewport(index: number, rowTimeStamp: RowTimeStamp) {\n        this.handleRequiredViewPortAtTop(index);\n        const orderedRows = this.getOrderedRows();\n        const currentIndex = orderedRows.indexOf(rowTimeStamp);\n        this.handleRequiredViewPortAtBottom(currentIndex);\n    }\n\n    private handleRequiredViewPortAtTop(index: number) {\n        const buffer = this.interactor.getBuffer();\n        const orderedRows = this.getOrderedRows();\n        const totalLength = (3*buffer);\n        if(orderedRows.length>0) {\n            if(index < buffer) {\n                let topRow = orderedRows[0];\n                for(let i = 0; i < buffer; i++) {\n                    topRow = this.interactor.getpreviousRow(topRow);\n                    if(this.doesAllowAddRow(topRow)) {\n                        const top = this.getTop(topRow);\n                        this.interactor.addRow(topRow,top);\n                        const currentCount = this.anchorCount - i - index + 1;\n                        this.handleInnerLayerTop(topRow, currentCount);\n                    }\n                }\n            }\n\n            const currentOrderedRows = this.getOrderedRows();\n            if(currentOrderedRows.length > totalLength) {\n                const extraRowsCount = currentOrderedRows.length - totalLength;\n                let bottomRow = currentOrderedRows.slice(-1)[0];\n                for(let i = 0; i < extraRowsCount; i++) {\n                    this.interactor.removeRow(bottomRow);\n                    bottomRow = this.interactor.getpreviousRow(bottomRow);\n                }\n            }\n        }\n    }\n\n    private handleRequiredViewPortAtBottom(index: number) {\n        const buffer = this.interactor.getBuffer();\n        const orderedRows = this.getOrderedRows();\n        const totalLength = (3*buffer);\n        if(orderedRows.length > 0 ) {\n            if(index > (buffer*2)) {\n                let bottomRow = orderedRows.slice(-1)[0];\n                if(bottomRow) {\n                    for(let i = 0; i < buffer; i++) {\n                        bottomRow = this.interactor.getNextRow(bottomRow);\n                        if(this.doesAllowAddRow(bottomRow)) {\n                            const top = this.getTop(bottomRow);\n                            this.interactor.addRow(bottomRow,top);\n                            const currentCount = this.anchorCount + i + index - (buffer*2);\n                            this.handleInnerLayerTop(bottomRow, currentCount);\n                        }\n                    }\n                }\n            }\n\n            const currentOrderedRows = this.getOrderedRows();\n            if(currentOrderedRows.length > totalLength) {\n                const extraRowsCount = currentOrderedRows.length - totalLength;\n                let topRow = currentOrderedRows[0];\n                for(let i = 0; i < extraRowsCount; i++) {\n                    this.interactor.removeRow(topRow);\n                    topRow = this.interactor.getNextRow(topRow);\n                }\n            }\n        }\n    }\n\n     clearRows() {\n        const presentedRows = this.interactor.getPresentedRows()\n        for(let row of presentedRows) {\n            this.interactor.removeRow(row);\n        }\n    }\n\n     getBeforeRequiredRange(rowTimeStamp: RowTimeStamp) {\n        const buffer = this.interactor.getBuffer();\n        const required: RowTimeStamp[] = [];\n        let currentRow = rowTimeStamp;\n        for(let i = 0; i < buffer; i++) {\n            currentRow = this.interactor.getpreviousRow(currentRow)\n            required.push(currentRow);\n        }\n        return [...required];\n    }\n\n     getAfterRequiredRange(rowTimeStamp: RowTimeStamp) {\n        const buffer = this.interactor.getBuffer();\n        const required: RowTimeStamp[] = [];\n        let currentRow = rowTimeStamp;\n        for(let i = 0; i < buffer*2; i++) {\n            currentRow = this.interactor.getNextRow(currentRow);\n            required.push(currentRow);\n        }\n        return [...required];\n    }\n\n    private getDifferenceCount(top: number) {\n        const rowHeight = this.interactor.getRowHeight();\n        const differenceCount = (top / rowHeight);\n        const count = differenceCount;\n        return count;\n    }\n\n    private fixAnchorDate(top: number) {\n        const count = Math.floor(this.getDifferenceCount(top));\n        const rowTimeStamp = this.interactor.getRowTimeStampAtCount(this.getPivotDate(), count);\n        if (this.anchor !== rowTimeStamp) {\n          this.setAnchorCount(count);\n          this.handleOffset(top, count);\n          this.setAnchor(rowTimeStamp);\n        //   this.interactor.onAnchorChange(rowTimeStamp);\n            return\n        }\n    }    \n\n    getPivotDate(): RowTimeStamp {\n        return this.pivotDate;\n    }\n\n    private handleViewPort(rowTimeStamp: RowTimeStamp) {\n        const anchor = this.getAnchorDate();\n        const offset = this.getOffset();\n        const orderedRows = this.getOrderedRows();\n        const index = orderedRows.indexOf(rowTimeStamp);\n        if (index === -1) {\n          this.handleAnchorNotInRange(rowTimeStamp);\n        } else {\n          this.fixViewport(index, rowTimeStamp);\n        }\n        this.scrollToDate(anchor, offset);\n    }\n\n    handleAnchorNotInRange(rowTimeStamp : RowTimeStamp) {\n        this.clearRows();\n        const top  = this.getTop(rowTimeStamp);\n        this.interactor.addRow(rowTimeStamp,top);\n\n        const requiredBeforeRange = this.getBeforeRequiredRange(rowTimeStamp);\n        for (let row of requiredBeforeRange) {\n        const top  = this.getTop(row);\n          this.interactor.addRow(row,top);\n        }\n        const requiredAfterRange = this.getAfterRequiredRange(rowTimeStamp);\n        for (let row of requiredAfterRange) {\n        const top  = this.getTop(row);\n          this.interactor.addRow(row,top);\n        }\n        const order = this.getOrderedRows();\n        if (order.length > 0) {\n          const top = this.getTop(order[0]);\n          const count = this.getDifferenceCount(top);\n          this.handleInnerLayerTop(order[0], count);\n        }\n      }\n    private getOrderedRows(): RowTimeStamp[] {\n        const presentedRows = this.interactor.getPresentedRows();\n        const getOrderedRows = [...presentedRows].sort((a, b) => a - b);\n        return getOrderedRows;\n    }\n\n    private doesAllowAddRow(rowTimeStamp: RowTimeStamp): boolean {\n        return rowTimeStamp !== null && rowTimeStamp !== undefined;\n    }\n\n    private handleInnerLayerTop(_rowTimeStamp: RowTimeStamp, count: number) { //TODO: code clean\n        if(count < 0) {\n            const rowHeight = this.interactor.getRowHeight();\n            const top = count * rowHeight;\n            const currentTop = this.interactor.getInnerLayerTop();\n            if(top < currentTop) {\n                const anchor = this.getAnchorDate();\n                const offset = this.getOffset();\n                this.interactor.handleInnerLayerTop(top);\n                this.scrollToDate(anchor, offset);\n            }\n        }\n    }\n\n    gotoAction(): void {\n        // const top = this.interactor.getScrollTop();\n        this.onScroll();\n    }\n}\n\n","import { IFrameworkOverrides, VanillaFrameWorkOverrider } from \"@dg/corecomponent\";\nimport { IModule } from \"../modules/modules.types\";\nimport { Context } from \"@dg/corecomponent\";\n\nimport { ComponentsRegistry } from \"@dg/corecomponent\";\nimport { BEAN_NAME } from \"@dg/corecomponent\";\nimport { createComponentList } from \"../vertical-calendar-component-registry\";\nimport { VerticalCalendarOptionHandler } from \"./vertical-calendar-option-handler\";\nimport { VerticalCalendarEventHanlder } from \"../vertical-calendar-event-handler\";\nimport { VerticalCalendarApi } from \"../api/vertical-calendar-api\";\nimport { VerticalCalendarComponent } from \"../vertical-calendar-component/vertical-calendar-container-component/vertical-calendar-component\";\nimport { CalendarDataBlock } from \"../data-structure/calendar-data-store\";\nimport { ControllerHandler } from \"./common-controllers/controller-handler/controller-handler\";\nimport { RowRendererController } from \"./common-controllers/row/row-renderer-controller\";\nimport { ButtonInteractor } from \"./button-interactor/button-interactor\";\nimport { CalendarNavigatorInteractor } from \"./navigators/calendar-navigator-interactor\";\nimport { EventDataManager } from \"../data-structure/events-data-manager/events-data-manager\";\nimport { CalendarAxisHandler } from \"./axis-handler/axis-handler\";\nimport { MonthEventPositionHandler } from \"./event-handler/month-event-position-handler\";\nimport { CalendarEventStore } from \"./event-handler/new/event-store\";\nimport { PreviewEventStore } from \"./event-handler/new/preview-event-store\";\n\n\n interface IUserParams {\n\tglobalEventListener      ?: Function;\n\tframeworkOverrides       ?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n\tmodules                  ?: IModule[];\n}\n\n\nlet nextInstanceId = 1;\n\n\nclass VerticalCalendarCoreComponent {\n    public initializeVerticalCalendar(verticalCalendarElement: HTMLElement, verticalCalendarOptions : any, viewType : 'vertical' | 'horizontal'  , callback : CallableFunction, _params : IUserParams) : void {\n\t\tconst instanceID = verticalCalendarOptions.instanceID ?? String(nextInstanceId++);\n\n\t\tconst userConfigurations = this.createUserCongiguration(verticalCalendarElement, verticalCalendarOptions, viewType, instanceID);\n\t\t// const registeredModules  = this.getRegisteredModules(params, instanceID);\n\t\tconst beanClasses        = this.getBeanClasses();\n\n\t\tif (!beanClasses) {\n\t\t\treturn;\n\t\t}\n        const context = new Context();\n\n        context.registerBeanClasses(beanClasses, userConfigurations)\n        this.registerComponent(context);\n\n\n        \n        const verticalCalendarComponent = new VerticalCalendarComponent(verticalCalendarElement);\n\n        context.createBean(verticalCalendarComponent);\n\n        callback(context);\n\n\t\t(window as any).verticalCalendarContext = context;\n\n\n        \n\n    }\n\n    private getBeanClasses() {\n\t\tconst beans = new Set([\n\t\t\tComponentsRegistry,\n\t\t\tControllerHandler,\n            VerticalCalendarOptionHandler,\n            VerticalCalendarEventHanlder,\n            VerticalCalendarApi,\n\t\t\tCalendarDataBlock,\n\t\t\tCalendarNavigatorInteractor,\n            RowRendererController,\n            ButtonInteractor,\n            EventDataManager,\n            CalendarAxisHandler,\n            MonthEventPositionHandler,\n            CalendarEventStore,\n            PreviewEventStore,\n\n\t\t]);\n\n\t\treturn beans;\n\t}\n    private registerComponent(context : Context) {\n        const registry = context.getBean(BEAN_NAME.COMPONENT_REGISTRY) as ComponentsRegistry;\n        const components = createComponentList();\n        registry.setupComponents(components);\n    }\n\n    private createUserCongiguration(verticalCalendarElement : HTMLElement, configuration : any, viewType : 'vertical' | 'horizontal' , instanceID :string) : any {\n        let frameWorkOverrides = new VanillaFrameWorkOverrider();;\n        return {\n            verticalCalendarElement,\n            configuration,\n\t\t\tviewType,\n\t\t\tinstanceID,\n\t\t\tframeWorkOverrides,\n        }\n    }\n\n  \n\t\n}\n\n\n\nexport {\n    IUserParams,\n    VerticalCalendarCoreComponent\n}\n","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../constant/vertical-calendar-bean-name-constant\";\nimport { VerticalCalendarConfigurationType } from \"../vertical-calendar-configuration\";\nimport { IVerticalCalendarOptionHandler } from \"./vertical-calendar-option-handler.types\";\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class VerticalCalendarOptionHandler extends EventEmitter implements IVerticalCalendarOptionHandler {\n\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.CONFIGURATION) \n    private configuration!: VerticalCalendarConfigurationType;\n\n    public getConfiguration(): VerticalCalendarConfigurationType {\n        return this.configuration;\n    }\n\n    public getInitialDate(): Date | undefined {\n        if (this.configuration.initialDate) {\n            return this.configuration.initialDate;\n        }\n        \n        if (this.configuration.visibleDate) {\n            const { year, month, day = 1 } = this.configuration.visibleDate;\n            return new Date(year, month, day);\n        }\n\n        return undefined;\n    }\n\n    public getDefaultRowHeight(): number {\n        return this.configuration.defaultRowHeight || 125.16;\n    }\n\n    public getStartDayOfWeek(): number {\n        return this.configuration.startDayOfWeek || 0;\n    }\n\n    public getWeekStartsOn(): number {\n        return this.configuration.weekStartsOn || this.getStartDayOfWeek();\n    }\n\n    public shouldShowWeekends(): boolean {\n        return this.configuration.showWeekends !== false;\n    }\n\n    public getTimezone(): string {\n        return this.configuration.timezone || 'Asia/Kolkata';\n    }\n\n    public getLocale(): string {\n        return this.configuration.locale || Intl.DateTimeFormat().resolvedOptions().locale;\n    }\n\n    public getRangeFrom(): Date | undefined {\n        return this.configuration.rangeFrom;\n    }\n\n    public getRangeTo(): Date | undefined {\n        return this.configuration.rangeTo;\n    }\n\n    public getCalendarType(): string {\n        return this.configuration.calendarType || \"vertical_month\";\n    }\n\n    getBufferMonth(): number {\n        return this.configuration.bufferMonth || 1; // Default to 2 weeks if not specified\n    }\n\n    getMaxVisibleEvents(): number | undefined{\n        return this.configuration.maxVisibleEvents\n    }\n\n    onClickEventEllipsis(events:any):void{\n        if(this.configuration.onClickEventEllipsis){\n            this.configuration.onClickEventEllipsis(events)\n        }\n    }\n\n    onEventDrop(event:any):void{\n        if(this.configuration.onEventDrop){\n            this.configuration.onEventDrop(event)\n        }\n    }\n\n    getDateDisplayFormat():string{\n        return this.configuration.dateDisplayFormat ?? 'DD MMM YYYY'\n    }\n\n    onEventStartDateResize(event:any):void{\n        if(this.configuration.onEventStartDateResize){\n            this.configuration.onEventStartDateResize(event)\n        }\n    }\n\n    onEventEndDateResize(event: any): void {\n        if (this.configuration.onEventEndDateResize) {\n            this.configuration.onEventEndDateResize(event);\n        }\n    }\n\n    onEventStartDateResizeStart(event: any): void {\n        this.configuration.onEventStartDateResizeStart?.(event);\n    }\n\n    onEventEndDateResizeStart(event: any): void {\n        this.configuration.onEventEndDateResizeStart?.(event);\n    }\n\n    onEventStartDateResizeMove(event: any): void {\n        this.configuration.onEventStartDateResizeMove?.(event);\n    }\n\n    onEventEndDateResizeMove(event: any): void {\n        this.configuration.onEventEndDateResizeMove?.(event);\n    }\n\n    onEventStartDateResizeEnd(event: any): void {\n        this.configuration.onEventStartDateResizeEnd?.(event);\n    }\n\n    onEventEndDateResizeEnd(event: any): void {\n        this.configuration.onEventEndDateResizeEnd?.(event);\n    }\n}","import { EventEmitter } from '@dg/corecomponent';\nimport { WeekNode } from './calendar-weeknode';\nimport { VERTICAL_CALENDAR_BEAN_NAME } from '../constant/vertical-calendar-bean-name-constant';\nimport { ICalendarDataStore, CalendarDateType } from './calendar-data-store.types';\nimport { AutoWired, Bean, BEAN_NAME, PostConstruct } from '@dg/corecomponent';\nimport { IVerticalCalendarOptionHandler } from '../core/vertical-calendar-option-handler.types';\n\nimport { IWeekNode } from './calendar-weeknode.types';\nimport { TimeStampMs } from '../core/navigators/typeDef';\nimport { RowTimeStamp } from '../core/navigators/calendar-navigator-interactor.types';\nimport { IEventDataManager } from './events-data-manager/events-data-manager.types';\nimport { VERTICAL_CALENDAR_EVENT_NAME } from '../constant/vertical-calendar-event-name';\nimport { IEventObject } from './event-object.types';\nimport { CalendarNavigatorInteractor } from '../core/navigators/calendar-navigator-interactor';\nimport { ICalendarEventStore } from '../core/event-handler/new/event-store.type';\n\n\nexport const ROW_HEIGHT  = 20;\nexport const ROW_PADDING = 6;\nexport const PADDING     = 12;\nexport const DAY_WIDTH   = 100;\nexport const DAY_HIEGTH  = 19\n\n\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK)\nexport class CalendarDataBlock extends EventEmitter implements ICalendarDataStore {\n  \n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler!: IVerticalCalendarOptionHandler;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.EVENT_MANGER) protected eventDataManager!: IEventDataManager;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.EVENT_STORE) protected eventStore!: ICalendarEventStore;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.NAVIGATOR_INTERACTOR) protected navigationInteractor!: CalendarNavigatorInteractor;\n    \n\n    private dayOrder                           : number[] = [0, 1, 2, 3, 4, 5, 6];   // Sunday to Saturday\n    private weekNodes                          : Map<string, WeekNode> = new Map();\n    private currentDate!                       : Date | undefined;\n    private selectedDate                       : Date | null = null;\n    private weekHeight!                        : number;\n    private totalWeeks                         : number = 0;\n    private visibleWeeks                       : number = 0;\n    private startRowTimeStamp !                : TimeStampMs;\n    private endRowTimeStamp !                  : TimeStampMs;\n    private maxVisibleEventsWithDynamicHieght !: number;\n    private dayHieght                          : number = 20\n    // private currentRowEvents : any[] = []; // Store events for the current row\n    // private rangeFrom! : Date | undefined;\n    // private rangeTo! : Date | undefined;\n\n    @PostConstruct() \n    init(): void {\n        //   this.rangeFrom = this.optionsHandler.getRangeFrom() ;\n        //   this.rangeTo   = this.optionsHandler.getRangeTo() ;\n\n\n        this.setInitialDate()\n        this.weekHeight = this.optionsHandler.getDefaultRowHeight();\n\n        this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.LOAD_EVENTS, this.loadEvents.bind(this));\n        this.calculateMaxVisibleEventsWithDynamicHieght()\n\n    }\n\n    calculateMaxVisibleEventsWithDynamicHieght() :void{\n        const maxVisibleEvents = this.optionsHandler.getMaxVisibleEvents();\n        if(maxVisibleEvents){\n            this.maxVisibleEventsWithDynamicHieght = maxVisibleEvents\n        }else{\n            this.maxVisibleEventsWithDynamicHieght = Math.floor((this.weekHeight - this.dayHieght) / (ROW_HEIGHT + ROW_PADDING)) - 2;\n        }\n       \n    }\n\n    updateDayHieght(dayHieght : number):void{\n        this.dayHieght = dayHieght;\n        this.calculateMaxVisibleEventsWithDynamicHieght()\n    }\n\n    getMaxVisibleEventsWithDynamicHieght():number{\n        return this.maxVisibleEventsWithDynamicHieght\n    }\n\n\n    \n\n\n    setInitialDate(): void {\n        const date = this.optionsHandler.getInitialDate();\n        if(date){\n            this.currentDate = date;\n            const startDate = new Date(date.setDate(1))\n            this.startRowTimeStamp = this.getRowStartDate(startDate.getTime());\n            // console.log(this.currentDate);\n        // console.log(new Date(this.startRowTimeStamp));\n            return\n        }\n\n        // if(date === undefined && this.rangeFrom){\n        //     this.currentDate = this.rangeFrom;\n        //     this.startRowTimeStamp = this.getRowStartDate(this.currentDate.getTime());\n        //     console.log(this.currentDate);\n        // console.log(new Date(this.startRowTimeStamp));\n        //     return\n        // }\n\n        this.currentDate = new Date();\n        this.startRowTimeStamp = this.getRowStartDate(this.currentDate.getTime());\n\n\n\n    }\n\n    getInitialDate(): Date {\n        return this.currentDate as Date;\n    }\n\n   \n\n\n    public getStartDate(): number | null{\n        return this.startRowTimeStamp;\n    }\n\n    public getEndDate(): number | null{\n        return this.endRowTimeStamp;\n    }\n\n\n    addWeek(rowTimeStamp:RowTimeStamp,top :number):void{\n        const rowStartTimeStamp = this.getRowStartDate(rowTimeStamp);\n        // const rowEndTimeStamp  = this.getRowLastDate(rowTimeStamp);\n\n        // const rowStartDate = new Date(rowStartTimeStamp);\n        // const rowEndDate = new Date(rowEndTimeStamp);\n\n        const date = new Date(rowStartTimeStamp);\n\n\n\n    //    this.eventDataManager.getEvents(\n    //         rowStartDate,\n    //         rowEndDate,\n    //         rowStartDate,\n    //         (events:IEventObject[])=>{\n    //             this.dispatchEvent({type: VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED, data: events});\n\n    //             // this.currentRowEvents = events;\n              \n    //         },\n    //         (_error:any)=>{}\n\n    //     )\n\n        const weekData = this.createWeekData(date);\n        const timeStamp = date.getTime();\n        const timeStampString = date.getTime().toString();\n        const topPosition = top;\n       const format =  this.optionsHandler.getDateDisplayFormat()\n        const weekNode = new WeekNode(\n            timeStampString,\n            this.weekHeight,\n            weekData,\n            topPosition,\n            timeStamp,\n            format\n            // events,\n\n        );\n        weekNode.setDate(new Date(date));\n        this.weekNodes.set(timeStampString, weekNode);\n        this.totalWeeks++;\n\n\n       \n    }\n\n    loadEvents() : void {\n        this.sortWeekNodes();\n        const firstWeekNode = Array.from(this.weekNodes.values())[0] || null;\n\n        const lastWeekNode = Array.from(this.weekNodes.values())[this.weekNodes.size - 1] || null;\n\n        const date = this.navigationInteractor.getAnchor()\n       \n        const startRowTimeStamp = this.getRowStartDate(firstWeekNode!.getTimeStamp());\n        const endRowTimeStamp = this.getRowLastDate(lastWeekNode!.getTimeStamp());\n\n\n\n\n\n        this.eventDataManager.getEvents(new Date(startRowTimeStamp), new Date(endRowTimeStamp), new Date(date), (events : IEventObject[]) => {\n\n            // cut the events week by week\n            events.forEach((event)=>{\n                this.eventStore.addOrUpdateEvent(event)\n            })\n\n            this.dispatchEvent({type :VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED});\n\n        // const splittedEvents = this.eventPositionHandler.getEventsCount();\n            // const eventsSplitter = new EventsWeekSplitter();\n            // eventsSplitter.setData(events, new Date(startRowTimeStamp), new Date(endRowTimeStamp));\n            // const weekEventsData: WeekEventData[] = eventsSplitter.splitEventsByWeek();\n\n            // for(const weekEventData of weekEventsData) {\n            //     const startTimeStamp = weekEventData.weekStartDate.getTime().toString();\n            //     const weekNode = this.weekNodes.get(startTimeStamp);\n            //     if (weekNode) {\n            //         weekNode.setEvents(weekEventData.events);\n            //         // weekNode.setDate(weekEventData.startDate);\n            //     } else {\n            //         console.warn(`No week node found for date: ${weekEventData.weekStartDate}`);\n            //     }\n            // }\n\n            // console.log(weekEventsData);\n            // console.log(this.weekNodes)\n            \n            // this.dispatchEvent({\n            //     type: VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED, \n            //     // data: weekEventsData\n            // });\n        }, () => {})\n    }\n\n    sortWeekNodes(): void {\n        // Convert map entries to array and sort by timestamp key (chronological order)\n        const sortedEntries = Array.from(this.weekNodes.entries()).sort(\n            ([keyA], [keyB]) => parseInt(keyA) - parseInt(keyB)\n        );\n\n        // Recreate the map with sorted entries\n        this.weekNodes = new Map(sortedEntries);\n    }\n    \n\n    removeWeek(rowTimeStamp: RowTimeStamp): void{\n        const rowStartDate = this.getRowStartDate(rowTimeStamp);\n        const timeStampString = rowStartDate.toString();\n        if (this.weekNodes.has(timeStampString)) {\n            this.weekNodes.delete(timeStampString);\n            this.totalWeeks--;\n        }\n    }\n    getRowStartDate(TimeStamp: number) {\n        const date = new Date(TimeStamp);\n        const year = date.getFullYear();\n        const monthIndex = date.getMonth();\n        const day = date.getDay();\n        const dateOfMonth = date.getDate();\n        const index = this.dayOrder.indexOf(day);\n        const convertedDate = dateOfMonth - index;\n        const RowDate = new Date(year, monthIndex, convertedDate, 0, 0, 0, 0);\n        return RowDate.getTime();\n      }\n\n      getRowLastDate(TimeStamp: number) {\n        const RowDate = new Date(this.getRowStartDate(TimeStamp));\n        const year = RowDate.getFullYear();\n        const monthIndex = RowDate.getMonth();\n        const dateOfMonth = RowDate.getDate();\n        const nextRowDate = new Date(year, monthIndex, dateOfMonth + 6, 23, 59, 59, 999);\n        return nextRowDate.getTime();\n      }\n\n      getPreviousRowStartDate(TimeStamp: number): number {\n        const RowDate = new Date(this.getRowStartDate(TimeStamp));\n        const year = RowDate.getFullYear();\n        const monthIndex = RowDate.getMonth();\n        const dateOfMonth = RowDate.getDate();\n        const nextRowDate = new Date(year, monthIndex, dateOfMonth - 7, 0, 0, 0, 0);\n        return nextRowDate.getTime();\n      }\n\n      getNextRowStartDate(TimeStamp: number):number {\n        const RowDate = new Date(this.getRowStartDate(TimeStamp));\n        const year = RowDate.getFullYear();\n        const monthIndex = RowDate.getMonth();\n        const dateOfMonth = RowDate.getDate();\n        const nextRowDate = new Date(year, monthIndex, dateOfMonth + 7, 0, 0, 0, 0);\n        return nextRowDate.getTime();\n      }\n\n    \n\n      getRowsInBetweenDates(startDate: TimeStampMs, endDate: TimeStampMs): TimeStampMs[] {\n\n        const rowStartDate = this.getRowStartDate(startDate);\n        const rowEndDate = this.getRowStartDate(endDate);\n        let inBetweenArray:TimeStampMs[] = [];\n        let tempDate = rowStartDate;\n        while (tempDate < rowEndDate) {\n          inBetweenArray.push(tempDate);\n          const RowDate     = new Date(tempDate);\n          const year        = RowDate.getFullYear();\n          const monthIndex  = RowDate.getMonth();\n          const dateOfMonth = RowDate.getDate();\n          const nextRowDate = new Date(year, monthIndex, dateOfMonth + 7, 0, 0, 0, 0);\n                tempDate    = nextRowDate.getTime();\n        }\n        inBetweenArray.push(rowEndDate);\n        return inBetweenArray;\n    }\n\n      \n\n\n\n    private createWeekData(startDate: Date): CalendarDateType[] {\n        const weekData: CalendarDateType[] = [];\n        const currentDate = new Date(startDate);\n        \n        for (let i = 0; i < 7; i++) {\n            const date = new Date(currentDate);\n            weekData.push({\n                date,\n                events: [],\n                isCurrentMonth: date.getMonth() === (this.currentDate as Date).getMonth(),\n                isToday: this.isToday(date),\n                isSelected: this.isSelected(date)\n            });\n            currentDate.setDate(currentDate.getDate() + 1);\n        }\n        \n        return weekData;\n    }\n\n    private isToday(date: Date): boolean {\n        const today = new Date();\n        return date.getDate() === today.getDate() &&\n               date.getMonth() === today.getMonth() &&\n               date.getFullYear() === today.getFullYear();\n    }\n\n    private isSelected(date: Date): boolean {\n        if (!this.selectedDate) return false;\n        return date.getDate() === this.selectedDate.getDate() &&\n               date.getMonth() === this.selectedDate.getMonth() &&\n               date.getFullYear() === this.selectedDate.getFullYear();\n    }\n\n    \n    public getAllWeekNodes(): IWeekNode[] {\n        return Array.from(this.weekNodes.values());\n    }\n    public getAllWeekNodesIndexes(): number[] {\n        return Array.from(this.weekNodes.keys()).map(key => parseInt(key));\n    }\n\n    // Get a specific week node\n    public getWeekNode(weekIndex: TimeStampMs): IWeekNode | undefined {\n        return this.weekNodes.get(`${weekIndex}`);\n    }\n\n    // Private helper methods\n     clearData(): void {\n        this.weekNodes.clear();\n        this.totalWeeks = 0;\n        this.visibleWeeks = 0;\n        this.startRowTimeStamp = 0;\n        this.endRowTimeStamp = 0;\n    }\n\n    \n    public getVisibleWeeks(): number {\n        return this.visibleWeeks;\n    }\n\n    public getTotalWeeks(): number {\n        return this.totalWeeks;\n    }\n\n    public getWeekNodeByIndex(index: number): IWeekNode | null {\n        return this.weekNodes.get(`week-${index}`) || null;\n    }\n\n    public getNextMonth(): { startDate: Date, endDate: Date } {\n        if (!this.currentDate) {\n            return { startDate: new Date(), endDate: new Date() };\n        }\n\n        const currentDate = new Date(this.currentDate);\n        const nextMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 1);\n        const lastDayOfNextMonth = new Date(nextMonth.getFullYear(), nextMonth.getMonth() + 1, 0);\n\n        this.startRowTimeStamp = this.getRowStartDate(nextMonth.getTime());\n        this.endRowTimeStamp = this.getRowStartDate(lastDayOfNextMonth.getTime());\n\n        return {\n            startDate: nextMonth,\n            endDate: lastDayOfNextMonth\n        };\n    }\n\n    public getPreviousMonth(): { startDate: Date, endDate: Date } {\n        if (!this.currentDate) {\n            return { startDate: new Date(), endDate: new Date() };\n        }\n\n        const currentDate = new Date(this.currentDate);\n        const previousMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() - 1, 1);\n        const lastDayOfPreviousMonth = new Date(previousMonth.getFullYear(), previousMonth.getMonth() + 1, 0);\n\n        this.startRowTimeStamp = this.getRowStartDate(previousMonth.getTime());\n        this.endRowTimeStamp = this.getRowStartDate(lastDayOfPreviousMonth.getTime());\n\n        return {\n            startDate: previousMonth,\n            endDate: lastDayOfPreviousMonth\n        };\n    }\n\n    public goToNextMonth(): void {\n        if (!this.currentDate) return;\n        this.clearData();\n\n\n        const { startDate, endDate } = this.getNextMonth();\n        this.currentDate = startDate;\n        this.startRowTimeStamp = this.getRowStartDate(startDate.getTime());\n        console.log(this.currentDate);\n        console.log(new Date(this.startRowTimeStamp));\n        \n        // Reset range dates to new month's start and end\n        // this.rangeFrom = startDate;\n        // this.rangeTo = endDate;\n        \n        // Clear existing week nodes\n        \n        // Emit event for month change\n        this.dispatchEvent({\n            type: 'monthChanged',\n            data: {\n                currentDate: this.currentDate,\n                startDate,\n                endDate\n            }\n        });\n    }\n\n    public goToPreviousMonth(): void {\n        if (!this.currentDate) return;\n\n        const { startDate, endDate } = this.getPreviousMonth();\n        this.currentDate = startDate;\n        \n        // Reset range dates to new month's start and end\n        // this.rangeFrom = startDate;\n        // this.rangeTo = endDate;\n        \n        // Clear existing week nodes\n        this.clearData();\n        \n        // Emit event for month change\n        this.dispatchEvent({\n            type: 'monthChanged',\n            data: {\n                currentDate: this.currentDate,\n                startDate,\n                endDate\n            }\n        });\n    }\n\n\n    getWeekNodesInSortedOrder(): IWeekNode[] {\n        return Array.from(this.weekNodes.values()).sort((a, b) => a.getTimeStamp() - b.getTimeStamp());\n    }\n\n\n    getPeriodStartDate(time:TimeStampMs):TimeStampMs {\n        const date = new Date(time);\n        const year = date.getFullYear();\n        const monthIndex = date.getMonth();\n        const previousTimeStamp = new Date(year, monthIndex, 1, 0, 0, 0, 0).getTime();\n        return previousTimeStamp;\n      }\n      getPeriodEndDate(time:TimeStampMs):TimeStampMs {\n        const date = new Date(time);\n        const year = date.getFullYear();\n        const monthIndex = date.getMonth();\n        const nextTimeStamp = new Date(year, monthIndex + 1, 0, 0, 0, 0, 0).getTime();\n        return nextTimeStamp;\n      }\n\n     \n\n    // new for Horizontal Calendar\n    getRowCount(): number {\n        return this.weekNodes.size;\n    }\n\n\n\n    getNextPeriodStartDate(time:TimeStampMs):TimeStampMs {\n        const date = new Date(time);\n        const year = date.getFullYear();\n        const monthIndex = date.getMonth();\n        const bufferMonth = this.optionsHandler.getBufferMonth();\n        const nextTimeStamp = new Date(year, monthIndex + bufferMonth, 1, 0, 0, 0, 0).getTime();\n        return nextTimeStamp;\n      }\n      getPreviousPeriodStartDate(time:TimeStampMs):TimeStampMs {\n        const date = new Date(time);\n        const year = date.getFullYear();\n        const monthIndex = date.getMonth();\n        const bufferMonth = this.optionsHandler.getBufferMonth();\n        const previousTimeStamp = new Date(year, monthIndex - bufferMonth, 1, 0, 0, 0, 0).getTime();\n        return previousTimeStamp;\n      }\n\n\n      getNearMonthStartDate(time:TimeStampMs):TimeStampMs {\n        const date = new Date(time);\n        const year = date.getFullYear();\n        const monthIndex = date.getMonth();\n        const nextTimeStamp = new Date(year, monthIndex + 1, 1, 0, 0, 0, 0).getTime();\n        return nextTimeStamp;\n      }\n\n\n      getInitialBuffer(){\n\n        // const currentDate = this.getInitialDate().setDate(1);;\n        // const rowStartDate = new Date(this.getRowStartDate(currentDate));\n        // const bufferMonth = this.optionsHandler.getBufferMonth();\n        // const year = rowStartDate.getFullYear();\n        // const monthIndex = rowStartDate.getMonth();\n        // let lastDate = new Date(year, monthIndex + bufferMonth, 1, 0, 0, 0, 0);\n        // const totalDays = lastDate.getDate();\n        // lastDate.setDate(totalDays);\n\n        // const weeksInBuffer = getTotalWeeksIncludingPartials(rowStartDate.getTime(),lastDate.getTime())\n        const weeksInBuffer = 6\n        return weeksInBuffer;\n      }\n\n      getNextBufferForButtonNavigator(date : TimeStampMs):number {\n        // Get the start date of the buffer period\n        const rowStartDate = new Date(this.getRowStartDate(date));\n        const bufferMonth = this.optionsHandler.getBufferMonth();\n        const year = rowStartDate.getFullYear();\n        const monthIndex = rowStartDate.getMonth();\n        let lastDate = new Date(year, monthIndex + bufferMonth, 1, 0, 0, 0, 0);\n        const totalDays = getDaysInMonth(lastDate.getFullYear(), lastDate.getMonth());\n        lastDate.setDate(totalDays);\n\n\n        // let days = 0;\n        // for (let i = 0; i < bufferMonth; i++) {\n        //    days = days + getDaysInMonth(currentDate.getFullYear(), currentDate.getMonth());\n        //     currentDate.setMonth(currentDate.getMonth() + 1);\n        // }\n\n        // const diffs = days / 7;\n        // const weeksInBuffer = Math.ceil(diffs);\n\n        const weeksInBuffer = getTotalWeeksIncludingPartials(rowStartDate.getTime(),lastDate.getTime())\n        return weeksInBuffer;\n\n      }\n      getPreviousBufferForButtonNavigator(date : TimeStampMs):number {\n        // Get the start date of the buffer period\n        const rowStartDate = new Date(this.getRowStartDate(date));\n        const bufferMonth = this.optionsHandler.getBufferMonth();\n        const year = rowStartDate.getFullYear();\n        const monthIndex = rowStartDate.getMonth();\n        let lastDate = new Date(year, monthIndex + bufferMonth, 1, 0, 0, 0, 0);\n        const totalDays = getDaysInMonth(lastDate.getFullYear(), lastDate.getMonth());\n        lastDate.setDate(totalDays);\n        const weeksInBuffer = getTotalWeeksIncludingPartials(rowStartDate.getTime(),lastDate.getTime())\n        return weeksInBuffer;\n\n      }\n\n\n\n      getCurrentFirstDay(): Date {\n        return new Date(this.startRowTimeStamp);\n    }\n\n    getColumnCount(): number {\n        return 7;\n    }\n\n    getCurrentLastDay(): Date {\n        return new Date()\n        // return new Date(this.weekNodes[this.weekNodes.size - 1]!.getTimeStamp());\n    }\n\n    \n    findRowAndCellIndex = (rowTimestamp: TimeStampMs, cellStamp: TimeStampMs): { rowIndex: number; cellIndex: number } | null => {\n        // Get the sorted week nodes to find the row index\n        const sortedWeekNodes = this.getWeekNodesInSortedOrder();\n        \n        // Find the row index by matching the row timestamp\n        const rowIndex = sortedWeekNodes.findIndex(weekNode => weekNode.getTimeStamp() === rowTimestamp);\n        \n        if (rowIndex === -1) {\n            // Row not found\n            return null;\n        }\n        \n        // Calculate the cell index based on the difference between cellStamp and rowTimestamp\n        const [rowStartDate, cellDate] = [new Date(rowTimestamp), new Date(cellStamp)];\n        \n        // Calculate the difference in days using ES6 Math methods\n        const timeDiff = cellDate.getTime() - rowStartDate.getTime();\n        const daysDiff = Math.floor(timeDiff / (1000 * 60 * 60 * 24));\n        \n        // Validate that the cell is within the week (0-6 days)\n        if (daysDiff < 0 || daysDiff > 6) {\n            return null;\n        }\n        \n        return { rowIndex, cellIndex: daysDiff };\n    };\n\n\n    findRowAndCellIndexByCellStamp = (cellStamp: TimeStampMs): { rowIndex: number; cellIndex: number } | null => {\n        // Get the row timestamp for the given cell\n        const rowTimestamp = this.getRowStartDate(cellStamp);\n        \n        // Use the existing method to find the indices\n        return this.findRowAndCellIndex(rowTimestamp, cellStamp);\n    };\n\n\n    togglePreviewEvent(date: Date): void {\n\n        const rowStartDate = this.getRowStartDate(date.getTime());\n        const weekNode = this.getWeekNode(rowStartDate);\n        if(weekNode){\n            weekNode.togglePreviewEvent(date);\n        }\n    }\n\n    destroyPreviewEvent(date : Date) :void{\n        const rowStartDate = this.getRowStartDate(date.getTime());\n        const weekNode = this.getWeekNode(rowStartDate);\n        if(weekNode){\n            weekNode.destroyPreviewEvent(date);\n        }\n    }\n\n    toggleHoverEffect(date: Date,isHover:boolean): void {\n\n        const rowStartDate = this.getRowStartDate(date.getTime());\n        const weekNode = this.getWeekNode(rowStartDate);\n        if(weekNode){\n            weekNode.toggleHoverEffect(date,isHover);\n        }\n    }\n\n\n\n\n    //   getCurrentMonth():string{\n    //     return this.weekNodes\n\n    //   }\n}\n\n\nfunction getDaysInMonth(year: number, month: number): number {\n    // month is 0-indexed: January = 0, December = 11\n    return new Date(year, month + 1, 0).getDate();\n  }\n\n\n  function getTotalWeeksIncludingPartials(startTimestamp: number, endTimestamp: number): number {\n    const msInDay = 1000 * 60 * 60 * 24;\n  \n    const startDate = new Date(startTimestamp);\n    const endDate = new Date(endTimestamp);\n  \n    // Normalize to start of day\n    startDate.setHours(0, 0, 0, 0);\n    endDate.setHours(0, 0, 0, 0);\n  \n    // Include the end date itself by adding 1 day\n    const diffInMs = endDate.getTime() - startDate.getTime();\n    const diffInDays = Math.floor(diffInMs / msInDay) + 1;\n  \n    return Math.ceil(diffInDays / 7);\n  }\n","\nimport { DGEvent, EventEmitter } from '@dg/corecomponent';\nimport { IDayNode } from './calendar-day-node.types';\nimport { IEventObject } from './event-object.types';\nimport { EventHandler } from '@dg/corecomponent';\n\n\nexport class DayNode extends EventEmitter implements IDayNode {\n    private rendered: boolean = false;\n    private selected: boolean = false;\n    private _isCurrentMonth: boolean = false;\n    private _isToday: boolean = false;\n    private leftPosition: number = 0;\n    private events: IEventObject[] | undefined;\n    private previewEventsToggler: boolean = false;\n    private hoverToggler: boolean = false;\n    private format : string;\n\n    constructor( private id: string, private date          : Date | null, private height        : number, private width         : number, isCurrentMonth: boolean = false, isToday       : boolean = false, leftPosition  : number = 0, format : string, events ?: IEventObject[]) {\n        super();\n        this._isCurrentMonth = isCurrentMonth;\n        this._isToday = isToday;\n        this.leftPosition = leftPosition;\n        this.date = date\n        this.events = events;\n        this.format = format\n        \n    }\n\n    public getId(): string {\n        return this.id;\n    }\n\n    public getDate(): Date | null {\n        return this.date;\n    }\n\n    public setDate(date: Date | null): void {\n        this.date = date;\n        this.rendered = false;\n    }\n\n    public getHeight(): number {\n        return this.height;\n    }\n\n    public setHeight(height: number): void {\n        this.height = height;\n    }\n\n    public getWidth(): number {\n        return this.width;\n    }\n\n    public setWidth(width: number): void {\n        this.width = width;\n    }\n\n    public getLeftPosition(): number {\n        return this.leftPosition;\n    }\n\n    public setLeftPosition(position: number): void {\n        this.leftPosition = position;\n    }\n\n    public calculateLeftPosition(dayIndex: number): void {\n        this.leftPosition = dayIndex * this.width;\n    }\n\n    public isRendered(): boolean {\n        return this.rendered;\n    }\n\n    public updateRendered(rendered: boolean): void {\n        this.rendered = rendered;\n    }\n\n    public isSelected(): boolean {\n        return this.selected;\n    }\n\n    public setSelected(selected: boolean): void {\n        this.selected = selected;\n    }\n\n    public isCurrentMonth(): boolean {\n        return this._isCurrentMonth;\n    }\n\n    public setIsCurrentMonth(isCurrentMonth: boolean): void {\n        this._isCurrentMonth = isCurrentMonth;\n    }\n\n    public isToday(): boolean {\n        return this._isToday;\n    }\n\n    public setIsToday(isToday: boolean): void {\n        this._isToday = isToday;\n    }\n\n    public getEvents(): IEventObject[] | undefined{\n        return this.events;\n    }\n\n    public addEvents(events: IEventObject[]): void {\n        if (!this.events) {\n            this.events = [];\n        }\n        this.events.push(...events);\n        // this.rendered = false;\n    }\n    \n    public hasEvents(): boolean  {\n        return this.events && this.events?.length > 0 || false;\n    }\n\n    public clearEvents(): void {\n        this.events = [];\n        this.rendered = false;\n    }\n\n    \n\n    public setIsSelected(isSelected: boolean): void {\n        this.selected = isSelected;\n        this.rendered = false;\n    }\n\n    public refresh(): void {\n        this.rendered = false;\n    }\n\n    public getLabel(): string {\n        if (this.date) {\n            const day = this.date.getDate().toString().padStart(2, '0');\n            const month = this.date.toLocaleString('default', { month: 'short' });\n            const year = this.date.getFullYear();\n\n            // If it's the first day of the month, show \"Mon 01\" style label\n            if (this.date.getDate() === 1) {\n                return `${month} ${day}`;\n            }\n\n            if(this.format === 'DD'){\n                return `${day}`\n            }else{\n                return `${day} ${month} ${year}`;\n            }\n        }\n        return '';\n    }\n\n    getTimeStamp(): number{\n        return this.date ? this.date.getTime() : 0;\n    }\n\n    public dispatchEvent(event : DGEvent) : void {\n        if (this.eventHandler) {\n            this.eventHandler.dispatchEvent(event);\n        }\n    }\n\n    public addEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.addEventListener(eventType, listener, async);\n    }\n    public removeEventListener(eventType: string, listener: EventListener, async?: boolean, _options?: AddEventListenerOptions ): void {\n        if(!this.eventHandler) {\n            this.eventHandler = new EventHandler();\n        }\n        this.eventHandler.addEventListener(eventType, listener, async);\n    }\n\n    public toggleForPreviewEvent(): void {\n        this.previewEventsToggler = !this.previewEventsToggler;\n        this.dispatchEvent({type:'preview'})\n        // console.log(this.date)\n    }\n\n    public destroyPreviewEvent():void{\n        this.dispatchEvent({type : 'DESTROY_PREVIEW_EVENT'});\n    }\n\n    getDOMId(){\n        const year = this.date?.getFullYear();\n        const month = ((this.date as Date).getMonth() + 1).toString().padStart(2, '0'); // months are 0-based\n        const day = this.date?.getDate().toString().padStart(2, '0');\n      \n        return `${year}-${month}-${day}`;\n\n    }\n\n    toggleHoverEffect(isHover: boolean): void {\n        this.hoverToggler = isHover;\n        this.dispatchEvent({type : 'HOVER_EFFECT'})\n    }\n\n    getHoverEffect(): boolean {\n        return this.hoverToggler;\n    }\n\n    \n}\n\n\n  ","import { IWeekNode } from './calendar-weeknode.types';\nimport { CalendarDateType } from './calendar-data-store.types';\nimport { DayNode } from './calendar-day-node';\nimport { IDayNode } from './calendar-day-node.types';\nimport { TimeStampMs } from '../core/navigators/typeDef';\n\nimport { EventEmitter } from '@dg/corecomponent';\nimport { IEventObject } from './event-object.types';\n\nexport class WeekNode extends EventEmitter implements IWeekNode {\n    private id: string;\n    private height: number;\n    private data: CalendarDateType[];\n    private topPosition: number;\n    private index: number;\n    private date: Date;\n    private dayNodes: DayNode[];\n    private timeStamp: TimeStampMs;\n    private events !: IEventObject[] | undefined;\n    private format !: string;\n\n\n\n    constructor(id: string, height: number, data: CalendarDateType[], topPosition: number,timeStamp: TimeStampMs, format : string,events?: IEventObject[]) {\n        super()\n        this.id = id;\n        this.height = height;\n        this.data = data;\n        this.topPosition = topPosition;\n        this.index = parseInt(id.split('-')[1]);\n        this.date = new Date();\n        this.events = events ? events : [];\n        this.format = format \n        this.dayNodes = this.createDayNodes();\n        this.timeStamp = timeStamp\n    }\n\n    private createDayNodes(): DayNode[] {\n        \n        return this.data.map((dayData, index) => {\n\n            const dayId = `${this.id}-day-${index}`;\n            const eventsData = this.getEventByDate(dayData.date as Date)\n\n\n            return new DayNode(\n                dayId,\n                dayData.date,\n                this.height,\n                142.14285714285714, // Default width\n                dayData.isCurrentMonth,\n                dayData.isToday,\n                index * 142.14285714285714,\n                 this.format, \n                eventsData,\n\n            );\n        });\n    }\n\n\n    getEventByDate(date: Date): IEventObject[] | undefined{\n        return this.events?.filter(event => {\n            const eventDate = new Date(event.getStartTime());\n            return eventDate.getFullYear() === date.getFullYear() &&\n                   eventDate.getMonth() === date.getMonth() &&\n                   eventDate.getDate() === date.getDate();\n        });\n    }\n\n    getEvents(): IEventObject[] | undefined{\n        return this.events;\n    }\n\n\n    public getAllDayNodes(): IDayNode[] {\n        return this.dayNodes;\n    }\n\n    public getDayNode(index: number): IDayNode | null {\n        return this.dayNodes[index] || null;\n    }\n\n    public getId(): string {\n        return this.id;\n    }\n\n    public getData(): CalendarDateType[] {\n        return this.data;\n    }\n\n    public getTopPosition(): number {\n        return this.topPosition;\n    }\n\n    public setTopPosition(position: number): void {\n        this.topPosition = position;\n    }\n\n    public getHeight(): number {\n        return this.height;\n    }\n\n    public setHeight(height: number): void {\n        this.height = height;\n    }\n\n    public getIndex(): number {\n        return this.index;\n    }\n\n    public setIndex(index: number): void {\n        this.index = index;\n    }\n\n    public getDate(): Date {\n        return this.date;\n    }\n\n    public setDate(date: Date): void {\n        this.date = date;\n    }\n\n   \n\n    public refresh(): void {\n        this.dayNodes.forEach(dayNode => dayNode.refresh());\n    }\n\n    public getTimeStamp(): TimeStampMs {\n        return this.timeStamp;\n    }\n\n    setEvents(events: IEventObject[] | undefined): void {\n        this.events?.push(...events || []);\n        this.dayNodes.forEach(dayNode => {\n            const dayDate = dayNode.getDate();\n            if (dayDate) {\n                const eventsData = this.getEventByDate(dayDate);\n                dayNode.addEvents(eventsData as IEventObject[]);\n            }\n        })\n    }\n\n    \n    public togglePreviewEvent(dateObject: Date ): boolean {\n\n        // Find the index of the dateObject in this.data\n        const index = this.data.findIndex(dayData => {\n            const d = dayData.date;\n            return d &&\n                d.getFullYear() === dateObject.getFullYear() &&\n                d.getMonth() === dateObject.getMonth() &&\n                d.getDate() === dateObject.getDate();\n        });\n        if (index === -1) return false;\n        const dayNode = this.dayNodes[index];\n        if (!dayNode) return false;\n        dayNode.toggleForPreviewEvent()\n       \n        return true;\n    }\n\n    destroyPreviewEvent(dateObject: Date):boolean{\n        const index = this.data.findIndex(dayData => {\n            const d = dayData.date;\n            return d &&\n                d.getFullYear() === dateObject.getFullYear() &&\n                d.getMonth() === dateObject.getMonth() &&\n                d.getDate() === dateObject.getDate();\n        });\n        if (index === -1) return false;\n        const dayNode = this.dayNodes[index];\n        if (!dayNode) return false;\n        dayNode.destroyPreviewEvent()\n       \n        return true;\n    }\n\n    toggleHoverEffect(dateObject: Date,isHover : boolean ): boolean {\n\n        // Find the index of the dateObject in this.data\n        const index = this.data.findIndex(dayData => {\n            const d = dayData.date;\n            return d &&\n                d.getFullYear() === dateObject.getFullYear() &&\n                d.getMonth() === dateObject.getMonth() &&\n                d.getDate() === dateObject.getDate();\n        });\n        if (index === -1) return false;\n        const dayNode = this.dayNodes[index];\n        if (!dayNode) return false;\n        dayNode.toggleHoverEffect(isHover)\n       \n        return true;\n    }\n    \n}\n","import { EventEmitter } from \"@dg/corecomponent\";\nimport { DGDate } from \"./../utility/dg-date/DGDate\";\nimport { LuxonAdapter } from \"./../utility/dg-date/LuxonAdapter\";\nimport { IEventData } from \"../vertical-calendar-configuration\";\nimport { IEventObject } from \"./event-object.types\";\n\n\nexport class EventObject extends EventEmitter implements IEventObject {\n\tid: string;\n\ttitle: string;\n\tstartTime: Date;\n\tendTime: Date;\n\tallDay : boolean = true; // need to uncomment this when we have time event controller\n\tcolor: string| undefined;\n\n\tconstructor(id: string, title: string, startTime: string, endTime: string, _allDay: boolean = false,color: string, timezone : string) {\n\t\tsuper()\n\t\tthis.id = id;\n\t\tthis.title = title;\n\t\tconst startDGDate = DGDate.parseWithTimezone(new Date(startTime).toISOString() , timezone, new LuxonAdapter());\n\t\tconst endDGDate = DGDate.parseWithTimezone(new Date(endTime).toISOString() , timezone, new LuxonAdapter());\n\n\t\tthis.startTime = new Date(startDGDate.getFullYear(),startDGDate.getMonth(),startDGDate.getDate(),startDGDate.getHours(),startDGDate.getMinutes(),startDGDate.getSeconds(),startDGDate.getMilliseconds());\n\t\tthis.endTime = new Date(endDGDate.getFullYear(),endDGDate.getMonth(),endDGDate.getDate(),endDGDate.getHours(),endDGDate.getMinutes(),endDGDate.getSeconds(),endDGDate.getMilliseconds());\n\t\tthis.allDay = true; // need to uncomment this when we have time event controller\n\t\tthis.color = color;\n\t}\n\n\n\tupdateDetails({ title, startTime, endTime }: Partial<IEventData>) {\n\t\tif (title !== undefined) this.title = title;\n\t\tif (startTime !== undefined) this.startTime = new Date(startTime);\n\t\tif (endTime !== undefined) this.endTime = new Date(endTime);\n\t}\n\n\toverlapsWith(startDate: Date, endDate: Date): boolean {\n\t\treturn this.startTime < endDate && this.endTime > startDate;\n\t}\n\n\tgetTitle(): string {\n\t\treturn this.title;\n\t}\n\n\tgetStartTime(): Date {\n\t\treturn this.startTime;\n\t}\n\n\tgetEndTime(): Date {\n\t\treturn this.endTime;\n\t}\n\n\tisAllDay(): boolean {\n\t\treturn true; // need to uncomment this when we have time event controller\n\t}\n\n\tgetId(): string {\n\t\treturn this.id;\n\t}\n\n\tgetColor(): string | undefined {\n\t\treturn this.color;\n\t}\n\n\tsetEndTime(endTime :Date) : void{\n\t\tthis.endTime = endTime\n\t}\n\n\tsetStartTime(startTime : Date):void{\n\t\tthis.startTime = startTime\n\t}\n\n\tgetEventData():IEventData{\n\t\treturn {\n\t\t\tid             : this.id,\n\t\t\ttitle          : this.title,\n\t\t\tstartTime      : this.startTime.toISOString(),\n\t\t\tendTime        : this.endTime.toISOString(),\n\t\t\tcolor         : this.color,\n\t\t\tisAllDay      : this.allDay\n\t\t}\n\t}\n\t\n}\n","import { FetchSourceAdaptor } from \"../../core/event-handler/adaptor/fetch-source-adaptor\";\n\nimport { CacheManager } from \"../../core/cache-manager/cache-manager\";\nimport { IEventData, VerticalCalendarConfigurationType } from \"../../vertical-calendar-configuration\";\n\nimport { IEventObject } from \"../event-object.types\";\nimport { IEventDataManager } from \"./events-data-manager.types\";\nimport { JsonAdaptor } from '../../core/event-handler/adaptor/json-adaptor';\nimport { Bean, PostConstruct } from \"@dg/corecomponent\";\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\nimport { CacheManagerTypes } from \"../../core/cache-manager/cache-manager.types\";\n\n\n\n\n@Bean(VERTICAL_CALENDAR_BEAN_NAME.EVENT_MANGER)\nexport class EventDataManager extends EventEmitter implements IEventDataManager {\n    private cacheManager !: CacheManagerTypes;\n\n\n    @PostConstruct() \n    init() : void {\n        const configuration: VerticalCalendarConfigurationType = this.optionsHandler.getConfiguration()\n        const IEventData = configuration.eventsData;\n\n        if(typeof IEventData === 'function') {\n           this.cacheManager = this.createManagedBean(new CacheManager(configuration.maxFetchSize || 100, configuration.fetchType || 'month', new FetchSourceAdaptor(IEventData)));\n        }else if(Array.isArray(IEventData)) {\n            this.cacheManager = this.createManagedBean(new CacheManager(configuration.maxFetchSize || 100, configuration.fetchType || 'month', new JsonAdaptor(IEventData)));\n        }\n\n    }\n\n    getEvents( startDate: Date, endDate: Date, date: Date, onSuccessCallback: (events: IEventObject[]) => void, onFailureCallback: (error: Error) => void ): void {\n        this.cacheManager.getEvents(startDate, endDate, date, onSuccessCallback, onFailureCallback);\n    }\n\n    fetchEvents(newDate: Date, onSuccessCallback: (events: IEventObject[]) => void,  onFailureCallback : () => void): void {\n        this.cacheManager.fetchEvents(newDate, onSuccessCallback, onFailureCallback);\n    }\n\n    getEventByID(id: string): IEventObject | undefined {\n        return this.cacheManager.getEventByID(id);\n    }\n\n    addEvents(events : IEventData[], onSuccessCallback: (eventObject : IEventObject) => void , onFailureCallback : () => void) : void {\n        this.cacheManager.addEvents(events, onSuccessCallback, onFailureCallback);\n    }\n\n    removeEvents(ids : string[], onSuccessCallback: () => void , onFailureCallback : () => void) : void {\n        this.cacheManager.removeEvents(ids, onSuccessCallback, onFailureCallback);\n    }\n\n    updateEvents(events : IEventData[], onSuccessCallback: (IEventData : IEventObject) => void , onFailureCallback : () => void) : void {\n        this.cacheManager.updateEvents(events, onSuccessCallback, onFailureCallback);\n    }\n\n    setPeriodType(periodType : 'week' | 'month' | 'year'): void {\n        this.cacheManager.updatePeriodType(periodType); \n    }\n\n    updateExtraFetch(extraFetch : number) : void {\n        this.cacheManager.updateExtraFetch(extraFetch);\n    }\n}","\nimport { IDayNode } from \"../data-structure/calendar-day-node.types\";\n\nimport { VerticalCalendarTemplatePropsTypes } from \"../vertical-calendar-component/vertical-calendar-container-component/vertical-calendar-component.types\";\nimport { CalendarType } from \"../vertical-calendar-configuration\";\n\nfunction getVerticalCalendarTemplate() {\n    return function getTemplate(props : VerticalCalendarTemplatePropsTypes) : HTMLElement {\n        const div = document.createElement('div');\n        div.setAttribute('ref', 'verticalCalendarContainer');\n        div.classList.add('dg-calendar-container');\n\n        if(props.calendarType === CalendarType.horizontalMonth){\n            const navBar = document.createElement('dg-calendar-nav-bar');\n            div.appendChild(navBar);\n        }\n        \n\n        const weekHeader = document.createElement('dg-calendar-week-header');\n        div.appendChild(weekHeader);\n\n        const rowcontainer = document.createElement('dg-calendar-rows-container');\n        div.appendChild(rowcontainer);\n\n        \n\n        return div;\n    }\n}\n\nfunction getVerticalCalendarRowContainerTemplate() {\n    return function getTemplate() : HTMLElement {\n        const div = document.createElement('div');\n        div.classList.add('dg-calendar-week-container');\n        div.setAttribute('id','vertical-week-calendar-container')\n\n        const negativeLayer = document.createElement('div');\n        negativeLayer.classList.add('dg-calendar-negative-layer');\n        negativeLayer.setAttribute('ref', 'verticalCalendarRef');\n        div.appendChild(negativeLayer);\n\n        return div;\n    }\n}\n\nfunction getVerticalCalendarRowTemplate() {\n    return function getTemplate() : HTMLElement {\n        const div = document.createElement('div');\n        div.classList.add('dg-calendar-week');\n\n        return div;\n    }\n}\n\nfunction getVerticalCalendarCellTemplate() {\n    return function getTemplate(date:  IDayNode ) : HTMLElement {\n        const div = document.createElement('div');\n        div.classList.add('dg-calendar-cell-holder');\n\n        const innerContainer =  document.createElement('div');\n        innerContainer.classList.add('dg-calendar-cell-inner-container');\n        innerContainer.setAttribute('ref', 'verticalCalendarCellContainer');\n        div.appendChild(innerContainer);\n\n        const cell = document.createElement('div');\n        cell.classList.add('dg-calendar-cell');\n        cell.setAttribute('data-date',date.getDOMId())\n\n\n        const dateCell = document.createElement('span');\n        dateCell.classList.add('dg-calendar-cell-date');\n        dateCell.innerText = date.getLabel();\n        cell.appendChild(dateCell)\n\n        innerContainer.appendChild(cell);\n\n\n\n        return div;\n    }\n}\n\n\n function getWeekHeaderTemplate() {\n    return function getTemplate(params:any) : HTMLElement {\n        const div = document.createElement('div');\n        div.classList.add('dg-calendar-week-header-container');\n        params.weekCounts.forEach((weekCount:string) => {\n            const header = document.createElement('div');\n            header.classList.add('dg-calendar-week-header-text');\n            header.innerText = weekCount;\n            div.appendChild(header);\n\n        })\n         \n\n        return div;\n    }\n}\n\n\n function getNavBarTemplate(){\n    return function CalendarNavBarFullTemplate(props: any): HTMLElement {\n        const container = document.createElement(\"div\");\n    \n        // Left section\n        const leftDiv = document.createElement(\"div\");\n        leftDiv.classList.add(\"dg-date-picker__navigation--left\");\n\n        // const previousYearButton = document.createElement(\"button\");\n        // previousYearButton.innerText = \"Previous Year\";\n        // previousYearButton.setAttribute(\"ref\", \"previousYearButton\");\n\n        const previousMonthButton = document.createElement(\"button\");\n        previousMonthButton.setAttribute(\"ref\", \"previousMonthButton\");\n        previousMonthButton.innerText = \"Previous Month\";\n\n        \n\n        // leftDiv.appendChild(previousYearButton);\n        leftDiv.appendChild(previousMonthButton);\n    \n        // Title section\n        const titleDiv = document.createElement(\"div\");\n        titleDiv.classList.add(\"dg-date-picker__navigation--title\");\n        titleDiv.setAttribute(\"ref\", \"titleElement\");\n        titleDiv.setAttribute(\"tabindex\", \"0\");\n        const monthSpan = document.createElement(\"span\");\n        monthSpan.classList.add(\"dg-date-picker__navigation--monthnav\");\n        monthSpan.setAttribute(\"ref\", \"monthElement\");\n        monthSpan.textContent = props.month;\n        const yearSpan = document.createElement(\"span\");\n        yearSpan.classList.add(\"dg-date-picker__navigation--yearnav\");\n        yearSpan.setAttribute(\"ref\", \"yearElement\");\n        yearSpan.textContent = props.year;\n        titleDiv.appendChild(monthSpan);\n        titleDiv.appendChild(yearSpan);\n    \n        // Right section\n        const rightDiv = document.createElement(\"div\");\n        rightDiv.classList.add(\"dg-date-picker__navigation--right\");\n        const nextMonthButton = document.createElement(\"button\");\n        nextMonthButton.setAttribute(\"ref\", \"nextMonthButton\");\n        nextMonthButton.innerText = \"Next Month\";\n\n        // const nextYearButton = document.createElement(\"button\");\n        // nextYearButton.setAttribute(\"ref\", \"nextYearButton\");\n        // nextYearButton.innerText = \"Next Year\";\n        rightDiv.appendChild(nextMonthButton);\n        // rightDiv.appendChild(nextYearButton);\n    \n        container.appendChild(leftDiv);\n        container.appendChild(titleDiv);\n        container.appendChild(rightDiv);\n    \n        return container;\n    }\n}\n\n\nfunction getEventsContainerTemplate(){\n    return function getTemplate() : HTMLElement {\n        const containerDiv = document.createElement('div');\n        containerDiv.classList.add('dg-calendar-event-container');\n        containerDiv.setAttribute('ref', 'verticalCalendarEventContainer');\n\n\n        const actualEventContainer = document.createElement('div')\n        actualEventContainer.classList.add('dg-calendar-event-container__actual');\n        actualEventContainer.setAttribute('ref', 'actualEventContainer');\n        containerDiv.appendChild(actualEventContainer)\n\n        const previewEventContainer = document.createElement('div')\n        previewEventContainer.classList.add('dg-calendar-event-container__preview');\n        previewEventContainer.setAttribute('ref', 'previewEventContainer');\n        containerDiv.appendChild(previewEventContainer)\n        \n\n\n        // if(props.events.length > 0) {\n        //     for (let  i = 0;  i < props.events.length;  i++) {\n        //         const block: any = props.events[i];\n        //         const div = document.createElement('div');\n        //         div.classList.add('dg-calendar-event-container-holder');\n        //         div.innerText = block.event.title;\n        //         div.style.width = `${block.segment.width}%`;\n        //         div.style.top = `${block.segment.top}%`;\n        //         containerDiv.appendChild(div);\n        //     }\n\n           \n        // }\n\n        return containerDiv;\n    }\n}\n\nfunction getEventTemplate(){\n    return function getTemplate(props:any) : HTMLElement {\n\n        const div = document.createElement('div');\n        div.classList.add('dg-calendar-event');\n\n        if(props.shouldRenderStartResizer){\n\n            const startResizer = document.createElement('div');\n            startResizer.classList.add('dg-calendar-event__start-resizer');\n            startResizer.setAttribute('ref', 'verticalCalendarEventStartResizer');\n            div.appendChild(startResizer)\n\n        }\n\n        const title = document.createElement('div');\n        title.classList.add('dg-calendar-event-title');\n        title.setAttribute('ref', 'verticalCalendarEventTitle');\n\n        div.appendChild(title)\n\n        if(props.shouldRenderEndResizer){\n\n            const endResizer = document.createElement('div');\n            endResizer.classList.add('dg-calendar-event__end-resizer');\n            endResizer.setAttribute('ref', 'verticalCalendarEventEndResizer');\n            div.appendChild(endResizer)\n\n        }\n\n       \n        return div;\n    }\n    }\n\n\nfunction getTimeEventTemplate(){\n    return function getTemplate() : HTMLElement {\n        const div = document.createElement('div');\n        div.classList.add('dg-calendar-time-event');\n        div.setAttribute('ref', 'verticalCalendarTimeEventContainer');\n\n        const time = document.createElement('span');\n        time.classList.add('dg-calendar-time-event-time');\n        time.setAttribute('ref', 'verticalCalendarTimeEventTime');\n        div.appendChild(time);\n\n        const title = document.createElement('span');\n        title.classList.add('dg-calendar-time-event-title');\n        title.setAttribute('ref', 'verticalCalendarTimeEventTitle');\n        div.appendChild(title);\n        \n\n       \n\n\n\n        return div;\n    }\n}\n\n\n\nfunction getEventEllipsisTemplate(){\n    return function getTemplate() : HTMLElement {\n        const div = document.createElement('div');\n        div.classList.add('dg-calendar-event-ellipsis');\n        div.setAttribute('ref', 'verticalCalendarEventEllipsis');\n        return div;\n    }\n    }\n\n\nexport {\n    getVerticalCalendarTemplate,\n    getVerticalCalendarRowContainerTemplate,\n    getVerticalCalendarRowTemplate,\n    getVerticalCalendarCellTemplate,\n    getNavBarTemplate,\n    getWeekHeaderTemplate,\n    getEventsContainerTemplate,\n    getEventTemplate,\n    getTimeEventTemplate,\n    getEventEllipsisTemplate\n\n}","import { IDateAdapter } from './IDateAdapter';\nimport { NativeDateAdapter } from './NativeDateAdapter';\n\n\n\nexport interface IDGDate{\n\n}\n\n/**\n * DGDate - Main date utility class with dependency injection\n */\nexport class DGDate implements IDGDate{\n  private adapter: IDateAdapter;\n  private internalValue: any;\n\n  /**\n   * Create a new DGDate instance\n   * @param value - Date value to initialize with\n   * @param adapter - Date adapter to use (defaults to NativeDateAdapter)\n   */\n  constructor(value?: string | number | Date, adapter?: IDateAdapter) {\n    this.adapter = adapter || new NativeDateAdapter();\n    \n    if (value !== undefined) {\n      this.internalValue = this.adapter.parse(value);\n    } else {\n      this.internalValue = this.adapter.now();\n    }\n  }\n\n  /**\n   * Get the current internal date value\n   */\n  get value(): any {\n    return this.internalValue;\n  }\n\n  /**\n   * Parse a date string and return a new DGDate instance\n   * @param dateString - Date string to parse\n   * @returns New DGDate instance\n   */\n  static parse(dateString: string): DGDate {\n    return new DGDate(dateString);\n  }\n\n  /**\n   * Parse a date string with timezone support and return a new DGDate instance\n   * @param dateString - Date string to parse\n   * @param timezone - Optional timezone identifier (e.g., 'America/New_York', 'Europe/London')\n   * @param adapter - Optional adapter to use\n   * @returns New DGDate instance\n   */\n  static parseWithTimezone(dateString: string, timezone?: string, adapter?: IDateAdapter): DGDate {\n    const instance = new DGDate(undefined, adapter);\n    instance.internalValue = instance.adapter.parseWithTimezone(dateString, timezone);\n    return instance;\n  }\n\n  /**\n   * Convert to milliseconds timestamp\n   * @returns Timestamp in milliseconds\n   */\n  toMillis(): number {\n    return this.adapter.getTime(this.internalValue);\n  }\n\n  /**\n   * Convert to JavaScript Date object\n   * @returns Native Date object\n   */\n  toJSDate(): Date {\n    return this.adapter.toDate(this.internalValue);\n  }\n\n  /**\n   * Add amount to the current date\n   * @param amount - Amount to add\n   * @param unit - Unit of time (year, month, week, day, hour, minute, second, millisecond)\n   * @returns New DGDate instance with the result\n   */\n  add(amount: number, unit: string): DGDate {\n    const newValue = this.adapter.add(this.internalValue, amount, unit);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Add duration object to the current date\n   * @param duration - Duration object with units\n   * @returns New DGDate instance with the result\n   */\n  plus(duration: any): DGDate {\n    let result: DGDate = this;\n    for (const [unit, amount] of Object.entries(duration)) {\n      if (amount !== undefined && amount !== null) {\n        result = result.add(amount as number, unit);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Subtract amount from the current date\n   * @param amount - Amount to subtract\n   * @param unit - Unit of time\n   * @returns New DGDate instance with the result\n   */\n  subtract(amount: number, unit: string): DGDate {\n    const newValue = this.adapter.subtract(this.internalValue, amount, unit);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Subtract duration object from the current date\n   * @param duration - Duration object with units\n   * @returns New DGDate instance with the result\n   */\n  minus(duration: any): DGDate {\n    let result: DGDate = this;\n    for (const [unit, amount] of Object.entries(duration)) {\n      if (amount !== undefined && amount !== null) {\n        result = result.subtract(amount as number, unit);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Get difference between this date and another\n   * @param other - Other DGDate instance\n   * @param unit - Unit of time\n   * @returns Difference in specified unit\n   */\n  diff(other: DGDate, unit: string): number {\n    return this.adapter.diff(this.internalValue, other.internalValue, unit);\n  }\n\n  /**\n   * Format the current date to string\n   * @param formatStr - Format string\n   * @returns Formatted date string\n   */\n  format(formatStr: string): string {\n    return this.adapter.format(this.internalValue, formatStr);\n  }\n\n  /**\n   * Convert to native Date object\n   * @returns Native Date object\n   */\n  toDate(): Date {\n    return this.adapter.toDate(this.internalValue);\n  }\n\n  /**\n   * Get timestamp\n   */\n  getTime(): number {\n    return this.adapter.getTime(this.internalValue);\n  }\n\n  /**\n   * Get year\n   */\n  getFullYear(): number {\n    return this.adapter.getFullYear(this.internalValue);\n  }\n\n  /**\n   * Get month (0-11)\n   */\n  getMonth(): number {\n    return this.adapter.getMonth(this.internalValue);\n  }\n\n  /**\n   * Get date of month\n   */\n  getDate(): number {\n    return this.adapter.getDate(this.internalValue);\n  }\n\n  /**\n   * Get day of week (0-6)\n   */\n  getDay(): number {\n    return this.adapter.getDay(this.internalValue);\n  }\n\n  /**\n   * Get hours\n   */\n  getHours(): number {\n    return this.adapter.getHours(this.internalValue);\n  }\n\n  /**\n   * Get minutes\n   */\n  getMinutes(): number {\n    return this.adapter.getMinutes(this.internalValue);\n  }\n\n  /**\n   * Get seconds\n   */\n  getSeconds(): number {\n    return this.adapter.getSeconds(this.internalValue);\n  }\n\n  /**\n   * Get milliseconds\n   */\n  getMilliseconds(): number {\n    return this.adapter.getMilliseconds(this.internalValue);\n  }\n\n  /**\n   * Set date of month\n   */\n  setDate(date: number): DGDate {\n    const newValue = this.adapter.setDate(this.internalValue, date);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Set month\n   */\n  setMonth(month: number): DGDate {\n    const newValue = this.adapter.setMonth(this.internalValue, month);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Set year\n   */\n  setFullYear(year: number): DGDate {\n    const newValue = this.adapter.setFullYear(this.internalValue, year);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Set hours\n   */\n  setHours(hours: number, minutes?: number, seconds?: number, milliseconds?: number): DGDate {\n    const newValue = this.adapter.setHours(this.internalValue, hours, minutes, seconds, milliseconds);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Set minutes\n   */\n  setMinutes(minutes: number, seconds?: number, milliseconds?: number): DGDate {\n    const newValue = this.adapter.setMinutes(this.internalValue, minutes, seconds, milliseconds);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Set seconds\n   */\n  setSeconds(seconds: number, milliseconds?: number): DGDate {\n    const newValue = this.adapter.setSeconds(this.internalValue, seconds, milliseconds);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Set milliseconds\n   */\n  setMilliseconds(milliseconds: number): DGDate {\n    const newValue = this.adapter.setMilliseconds(this.internalValue, milliseconds);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Set timestamp\n   */\n  setTime(timestamp: number): DGDate {\n    const newValue = this.adapter.fromTimestamp(timestamp);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Check if this date is the same day as another\n   */\n  isSameDay(other: DGDate): boolean {\n    return this.adapter.isSameDay(this.internalValue, other.internalValue);\n  }\n\n  /**\n   * Check if this date is before another\n   */\n  isBefore(other: DGDate): boolean {\n    return this.adapter.isBefore(this.internalValue, other.internalValue);\n  }\n\n  /**\n   * Check if this date is after another\n   */\n  isAfter(other: DGDate): boolean {\n    return this.adapter.isAfter(this.internalValue, other.internalValue);\n  }\n\n  /**\n   * Check if this date equals another\n   */\n  equals(other: DGDate): boolean {\n    return this.adapter.equals(this.internalValue, other.internalValue);\n  }\n\n  /**\n   * Convert to ISO string\n   */\n  toISOString(): string {\n    return this.adapter.toISOString(this.internalValue);\n  }\n\n  /**\n   * Convert to date string\n   */\n  toDateString(): string {\n    return this.adapter.toDateString(this.internalValue);\n  }\n\n  /**\n   * Convert to locale string\n   */\n  toLocaleString(locale?: string, options?: Intl.DateTimeFormatOptions): string {\n    return this.adapter.toLocaleString(this.internalValue, locale, options);\n  }\n\n  /**\n   * Get start of day\n   */\n  startOfDay(): DGDate {\n    const newValue = this.adapter.startOfDay(this.internalValue);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Get end of day\n   */\n  endOfDay(): DGDate {\n    const newValue = this.adapter.endOfDay(this.internalValue);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Get start of week\n   */\n  startOfWeek(weekStartDay?: number): DGDate {\n    const newValue = this.adapter.startOfWeek(this.internalValue, weekStartDay);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Get end of week\n   */\n  endOfWeek(weekStartDay?: number): DGDate {\n    const newValue = this.adapter.endOfWeek(this.internalValue, weekStartDay);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Get start of month\n   */\n  startOfMonth(): DGDate {\n    const newValue = this.adapter.startOfMonth(this.internalValue);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Get end of month\n   */\n  endOfMonth(): DGDate {\n    const newValue = this.adapter.endOfMonth(this.internalValue);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Get start of year\n   */\n  startOfYear(): DGDate {\n    const newValue = this.adapter.startOfYear(this.internalValue);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Get end of year\n   */\n  endOfYear(): DGDate {\n    const newValue = this.adapter.endOfYear(this.internalValue);\n    const newInstance = new DGDate();\n    newInstance.adapter = this.adapter;\n    newInstance.internalValue = newValue;\n    return newInstance;\n  }\n\n  /**\n   * Get days in month\n   */\n  getDaysInMonth(): number {\n    return this.adapter.getDaysInMonth(this.internalValue);\n  }\n\n  /**\n   * Get week number\n   */\n  getWeekNumber(): number {\n    return this.adapter.getWeekNumber(this.internalValue);\n  }\n\n  /**\n   * Get first day of month\n   */\n  getFirstDayOfMonth(): number {\n    return this.adapter.getFirstDayOfMonth(this.internalValue);\n  }\n\n  /**\n   * Get weekday order based on locale\n   * @param locale - Locale string (e.g., 'en-US', 'fr-FR')\n   * @returns Array of weekday names in the correct order for the locale\n   */\n  getWeekdayOrder(locale: string): string[] {\n    return this.adapter.getWeekdayOrder(locale);\n  }\n\n  /**\n   * Create a new DGDate instance with current date/time\n   * @param adapter - Optional adapter to use\n   * @returns New DGDate instance\n   */\n  static now(adapter?: IDateAdapter): DGDate {\n    return new DGDate(undefined, adapter);\n  }\n\n  /**\n   * Create a new DGDate instance from a value\n   * @param value - Date value to parse\n   * @param adapter - Optional adapter to use\n   * @returns New DGDate instance\n   */\n  static from(value: string | number | Date, adapter?: IDateAdapter): DGDate {\n    return new DGDate(value, adapter);\n  }\n\n  /**\n   * Create a copy of an existing DGDate instance\n   * @param dgDate - DGDate instance to copy\n   * @returns New DGDate instance with the same value\n   */\n  static clone(dgDate: DGDate): DGDate {\n    const instance = new DGDate(undefined, dgDate.adapter);\n    instance.internalValue = dgDate.adapter.parse(dgDate.internalValue);\n    return instance;\n  }\n\n  /**\n   * Create a new DGDate instance from timestamp\n   * @param timestamp - Timestamp value\n   * @param adapter - Optional adapter to use\n   * @returns New DGDate instance\n   */\n  static fromTimestamp(timestamp: number, adapter?: IDateAdapter): DGDate {\n    const instance = new DGDate(undefined, adapter);\n    instance.internalValue = instance.adapter.fromTimestamp(timestamp);\n    return instance;\n  }\n\n  /**\n   * Create a new DGDate instance from components\n   * @param year - Year\n   * @param month - Month (0-11)\n   * @param day - Day of month\n   * @param hour - Hour (0-23)\n   * @param minute - Minute (0-59)\n   * @param second - Second (0-59)\n   * @param millisecond - Millisecond (0-999)\n   * @param adapter - Optional adapter to use\n   * @returns New DGDate instance\n   */\n  static fromComponents(\n    year: number, \n    month: number, \n    day: number, \n    hour: number = 0, \n    minute: number = 0, \n    second: number = 0, \n    millisecond: number = 0,\n    adapter?: IDateAdapter\n  ): DGDate {\n    const instance = new DGDate(undefined, adapter);\n    instance.internalValue = instance.adapter.fromComponents(year, month, day, hour, minute, second, millisecond);\n    return instance;\n  }\n} ","import { IDateAdapter } from './IDateAdapter';\nimport { DateTime, Info} from 'luxon';\n\n/**\n * Adapter for Luxon library\n * Note: Requires luxon to be installed: npm install luxon\n */\nexport class LuxonAdapter implements IDateAdapter {\n  private DateTime: any;\n\n  constructor() {\n    this.initializeLuxon();\n  }\n\n  private async initializeLuxon(): Promise<void> {\n    this.DateTime = DateTime;\n  }\n\n  now(): any {\n    if (!this.DateTime) {\n      throw new Error('Luxon adapter not initialized. Please ensure luxon is installed.');\n    }\n    return this.DateTime.now();\n  }\n\n  parse(value: string | number | Date): any {\n    if (!this.DateTime) {\n      throw new Error('Luxon adapter not initialized. Please ensure luxon is installed.');\n    }\n    if (value instanceof Date) {\n      return this.DateTime.fromJSDate(value);\n    }\n    return this.DateTime.fromISO(value.toString());\n  }\n\n  parseWithTimezone(value: string, timezone?: string): any {\n    if (!this.DateTime) {\n      throw new Error('Luxon adapter not initialized. Please ensure luxon is installed.');\n    }\n    \n    if (timezone) {\n      return this.DateTime.fromISO(value, { zone: timezone });\n    }\n    \n    // If no timezone specified, try to parse with timezone info from the string\n    return this.DateTime.fromISO(value);\n  }\n\n  fromComponents(year: number, month: number, day: number, hour: number = 0, minute: number = 0, second: number = 0, millisecond: number = 0): any {\n    return this.DateTime.fromObject({ year, month, day, hour, minute, second, millisecond });\n  }\n\n  fromTimestamp(timestamp: number): any {\n    return this.DateTime.fromMillis(timestamp);\n  }\n\n  add(date: any, amount: number, unit: string): any {\n    return date.plus({ [unit]: amount });\n  }\n\n  subtract(date: any, amount: number, unit: string): any {\n    return date.minus({ [unit]: amount });\n  }\n\n  diff(date1: any, date2: any, unit: string): number {\n    return date1.diff(date2, unit).toObject()[unit] || 0;\n  }\n\n  format(date: any, formatStr: string): string {\n    return date.toFormat(formatStr);\n  }\n\n  toDate(value: any): Date {\n    return value.toJSDate();\n  }\n\n  getTime(value: any): number {\n    return value.toMillis();\n  }\n\n  getFullYear(value: any): number {\n    return value.year;\n  }\n\n  getMonth(value: any): number {\n    return value.month - 1; // Convert to 0-based month\n  }\n\n  getDate(value: any): number {\n    return value.day;\n  }\n\n  getDay(value: any): number {\n    return value.weekday % 7; // Convert to 0-6 range (Sunday = 0)\n  }\n\n  getHours(value: any): number {\n    return value.hour;\n  }\n\n  getMinutes(value: any): number {\n    return value.minute;\n  }\n\n  getSeconds(value: any): number {\n    return value.second;\n  }\n\n  getMilliseconds(value: any): number {\n    return value.millisecond;\n  }\n\n  setDate(value: any, date: number): any {\n    return value.set({ day: date });\n  }\n\n  setMonth(value: any, month: number): any {\n    return value.set({ month: month + 1 }); // Convert from 0-based to 1-based\n  }\n\n  setFullYear(value: any, year: number): any {\n    return value.set({ year });\n  }\n\n  setHours(value: any, hours: number, minutes?: number, seconds?: number, milliseconds?: number): any {\n    return value.set({ hour: hours, minute: minutes, second: seconds, millisecond: milliseconds });\n  }\n\n  setMinutes(value: any, minutes: number, seconds?: number, milliseconds?: number): any {\n    return value.set({ minute: minutes, second: seconds, millisecond: milliseconds });\n  }\n\n  setSeconds(value: any, seconds: number, milliseconds?: number): any {\n    return value.set({ second: seconds, millisecond: milliseconds });\n  }\n\n  setMilliseconds(value: any, milliseconds: number): any {\n    return value.set({ millisecond: milliseconds });\n  }\n\n  isSameDay(value1: any, value2: any): boolean {\n    return value1.hasSame(value2, 'day');\n  }\n\n  isBefore(value1: any, value2: any): boolean {\n    return value1 < value2;\n  }\n\n  isAfter(value1: any, value2: any): boolean {\n    return value1 > value2;\n  }\n\n  equals(value1: any, value2: any): boolean {\n    return value1.equals(value2);\n  }\n\n  toISOString(value: any): string {\n    return value.toISO();\n  }\n\n  toDateString(value: any): string {\n    return value.toFormat('yyyy-MM-dd');\n  }\n\n  toLocaleString(value: any, _locale?: string, options?: Intl.DateTimeFormatOptions): string {\n    return value.toLocaleString(options);\n  }\n\n  startOfDay(value: any): any {\n    return value.startOf('day');\n  }\n\n  endOfDay(value: any): any {\n    return value.endOf('day');\n  }\n\n  startOfWeek(value: any, weekStartDay: number = 0): any {\n    return value.startOf('week', { weekStartsOn: weekStartDay });\n  }\n\n  endOfWeek(value: any, weekStartDay: number = 0): any {\n    return value.endOf('week', { weekStartsOn: weekStartDay });\n  }\n\n  startOfMonth(value: any): any {\n    return value.startOf('month');\n  }\n\n  endOfMonth(value: any): any {\n    return value.endOf('month');\n  }\n\n  startOfYear(value: any): any {\n    return value.startOf('year');\n  }\n\n  endOfYear(value: any): any {\n    return value.endOf('year');\n  }\n\n  getDaysInMonth(value: any): number {\n    return value.daysInMonth;\n  }\n\n  getWeekNumber(value: any): number {\n    return value.weekNumber;\n  }\n\n  getFirstDayOfMonth(value: any): number {\n    return value.startOf('month').weekday % 7;\n  }\n\n  getISOWeekdayOrder(weekStartDayISO: number): number[] {\n    const isoDays = [1, 2, 3, 4, 5, 6, 7];\n    const startIndex = isoDays.indexOf(weekStartDayISO);\n    return [...isoDays.slice(startIndex), ...isoDays.slice(0, startIndex)];\n  }\n  \n  getWeekdayOrder(locale: string): string[] {\n    // Create a DateTime with the given locale\n    const weekStart =  Info.getStartOfWeek({ locale })\n    const weekdayOrder = this.getISOWeekdayOrder(weekStart);\n    // Use current date as reference and get localized names for ordered days\n    return weekdayOrder.map((isoDay) =>\n        DateTime.now().setLocale(locale).set({ weekday: isoDay } as any).toFormat('cccc')\n    );\n  }\n\n  getLocalWeekdayNames(locale: string): string[] {\n    const base = DateTime.now().setLocale(locale).startOf('week'); // ISO: Monday\n    return Array.from({ length: 7 }, (_, i) =>\n      base.plus({ days: i }).toFormat('cccc') // Full localized weekday\n    );\n  }\n} ","import { IDateAdapter } from './IDateAdapter';\n\n/**\n * Adapter for JavaScript's native Date object\n */\nexport class NativeDateAdapter implements IDateAdapter {\n  now(): Date {\n    return new Date();\n  }\n\n  parse(value: string | number | Date): Date {\n    if (value instanceof Date) {\n      return new Date(value.getTime());\n    }\n    return new Date(value);\n  }\n\n  parseWithTimezone(value: string, timezone?: string): Date {\n    // For native Date, we can only parse ISO strings with timezone offsets\n    // IANA timezone names are not supported in native Date constructor\n    if (timezone) {\n      // Try to create a date in the specified timezone\n      // This is a simplified implementation - for full timezone support, use LuxonAdapter\n      const date = new Date(value);\n      if (isNaN(date.getTime())) {\n        throw new Error(`Invalid date string: ${value}`);\n      }\n      return date;\n    }\n    \n    // If no timezone specified, use standard parsing\n    return this.parse(value);\n  }\n\n  fromComponents(year: number, month: number, day: number, hour: number = 0, minute: number = 0, second: number = 0, millisecond: number = 0): Date {\n    return new Date(year, month, day, hour, minute, second, millisecond);\n  }\n\n  fromTimestamp(timestamp: number): Date {\n    return new Date(timestamp);\n  }\n\n  add(date: Date, amount: number, unit: string): Date {\n    const result = new Date(date.getTime());\n    \n    switch (unit.toLowerCase()) {\n      case 'year':\n      case 'years':\n        result.setFullYear(result.getFullYear() + amount);\n        break;\n      case 'month':\n      case 'months':\n        result.setMonth(result.getMonth() + amount);\n        break;\n      case 'week':\n      case 'weeks':\n        result.setDate(result.getDate() + (amount * 7));\n        break;\n      case 'day':\n      case 'days':\n        result.setDate(result.getDate() + amount);\n        break;\n      case 'hour':\n      case 'hours':\n        result.setHours(result.getHours() + amount);\n        break;\n      case 'minute':\n      case 'minutes':\n        result.setMinutes(result.getMinutes() + amount);\n        break;\n      case 'second':\n      case 'seconds':\n        result.setSeconds(result.getSeconds() + amount);\n        break;\n      case 'millisecond':\n      case 'milliseconds':\n        result.setMilliseconds(result.getMilliseconds() + amount);\n        break;\n      default:\n        throw new Error(`Unsupported unit: ${unit}`);\n    }\n    \n    return result;\n  }\n\n  subtract(date: Date, amount: number, unit: string): Date {\n    return this.add(date, -amount, unit);\n  }\n\n  diff(date1: Date, date2: Date, unit: string): number {\n    const diffMs = date1.getTime() - date2.getTime();\n    \n    switch (unit.toLowerCase()) {\n      case 'year':\n      case 'years':\n        return Math.floor(diffMs / (1000 * 60 * 60 * 24 * 365.25));\n      case 'month':\n      case 'months':\n        return Math.floor(diffMs / (1000 * 60 * 60 * 24 * 30.44));\n      case 'week':\n      case 'weeks':\n        return Math.floor(diffMs / (1000 * 60 * 60 * 24 * 7));\n      case 'day':\n      case 'days':\n        return Math.floor(diffMs / (1000 * 60 * 60 * 24));\n      case 'hour':\n      case 'hours':\n        return Math.floor(diffMs / (1000 * 60 * 60));\n      case 'minute':\n      case 'minutes':\n        return Math.floor(diffMs / (1000 * 60));\n      case 'second':\n      case 'seconds':\n        return Math.floor(diffMs / 1000);\n      case 'millisecond':\n      case 'milliseconds':\n        return diffMs;\n      default:\n        throw new Error(`Unsupported unit: ${unit}`);\n    }\n  }\n\n  format(date: Date, formatStr: string): string {\n    // Simple formatting implementation for native Date\n    // For more complex formatting, consider using a library like date-fns\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n    const hours = String(date.getHours()).padStart(2, '0');\n    const minutes = String(date.getMinutes()).padStart(2, '0');\n    const seconds = String(date.getSeconds()).padStart(2, '0');\n\n    return formatStr\n      .replace('YYYY', String(year))\n      .replace('MM', month)\n      .replace('DD', day)\n      .replace('HH', hours)\n      .replace('mm', minutes)\n      .replace('ss', seconds);\n  }\n\n  toDate(value: Date): Date {\n    return new Date(value.getTime());\n  }\n\n  getTime(value: Date): number {\n    return value.getTime();\n  }\n\n  getFullYear(value: Date): number {\n    return value.getFullYear();\n  }\n\n  getMonth(value: Date): number {\n    return value.getMonth();\n  }\n\n  getDate(value: Date): number {\n    return value.getDate();\n  }\n\n  getDay(value: Date): number {\n    return value.getDay();\n  }\n\n  getHours(value: Date): number {\n    return value.getHours();\n  }\n\n  getMinutes(value: Date): number {\n    return value.getMinutes();\n  }\n\n  getSeconds(value: Date): number {\n    return value.getSeconds();\n  }\n\n  getMilliseconds(value: Date): number {\n    return value.getMilliseconds();\n  }\n\n  setDate(value: Date, date: number): Date {\n    const result = new Date(value.getTime());\n    result.setDate(date);\n    return result;\n  }\n\n  setMonth(value: Date, month: number): Date {\n    const result = new Date(value.getTime());\n    result.setMonth(month);\n    return result;\n  }\n\n  setFullYear(value: Date, year: number): Date {\n    const result = new Date(value.getTime());\n    result.setFullYear(year);\n    return result;\n  }\n\n  setHours(value: Date, hours: number, minutes: number = 0, seconds: number = 0, milliseconds: number = 0): Date {\n    const result = new Date(value.getTime());\n    result.setHours(hours, minutes, seconds, milliseconds);\n    return result;\n  }\n\n  setMinutes(value: Date, minutes: number, seconds: number = 0, milliseconds: number = 0): Date {\n    const result = new Date(value.getTime());\n    result.setMinutes(minutes, seconds, milliseconds);\n    return result;\n  }\n\n  setSeconds(value: Date, seconds: number, milliseconds: number = 0): Date {\n    const result = new Date(value.getTime());\n    result.setSeconds(seconds, milliseconds);\n    return result;\n  }\n\n  setMilliseconds(value: Date, milliseconds: number): Date {\n    const result = new Date(value.getTime());\n    result.setMilliseconds(milliseconds);\n    return result;\n  }\n\n  isSameDay(value1: Date, value2: Date): boolean {\n    return value1.getDate() === value2.getDate() &&\n           value1.getMonth() === value2.getMonth() &&\n           value1.getFullYear() === value2.getFullYear();\n  }\n\n  isBefore(value1: Date, value2: Date): boolean {\n    return value1.getTime() < value2.getTime();\n  }\n\n  isAfter(value1: Date, value2: Date): boolean {\n    return value1.getTime() > value2.getTime();\n  }\n\n  equals(value1: Date, value2: Date): boolean {\n    return value1.getTime() === value2.getTime();\n  }\n\n  toISOString(value: Date): string {\n    return value.toISOString();\n  }\n\n  toDateString(value: Date): string {\n    return value.toDateString();\n  }\n\n  toLocaleString(value: Date, locale?: string, options?: Intl.DateTimeFormatOptions): string {\n    return value.toLocaleString(locale, options);\n  }\n\n  startOfDay(value: Date): Date {\n    const result = new Date(value.getTime());\n    result.setHours(0, 0, 0, 0);\n    return result;\n  }\n\n  endOfDay(value: Date): Date {\n    const result = new Date(value.getTime());\n    result.setHours(23, 59, 59, 999);\n    return result;\n  }\n\n  startOfWeek(value: Date, weekStartDay: number = 0): Date {\n    const result = new Date(value.getTime());\n    const day = result.getDay();\n    const diff = result.getDate() - day + (day === 0 ? -6 : weekStartDay);\n    result.setDate(diff);\n    result.setHours(0, 0, 0, 0);\n    return result;\n  }\n\n  endOfWeek(value: Date, weekStartDay: number = 0): Date {\n    const start = this.startOfWeek(value, weekStartDay);\n    const result = new Date(start.getTime());\n    result.setDate(result.getDate() + 6);\n    result.setHours(23, 59, 59, 999);\n    return result;\n  }\n\n  startOfMonth(value: Date): Date {\n    const result = new Date(value.getTime());\n    result.setDate(1);\n    result.setHours(0, 0, 0, 0);\n    return result;\n  }\n\n  endOfMonth(value: Date): Date {\n    const result = new Date(value.getTime());\n    result.setMonth(result.getMonth() + 1, 0);\n    result.setHours(23, 59, 59, 999);\n    return result;\n  }\n\n  startOfYear(value: Date): Date {\n    const result = new Date(value.getTime());\n    result.setMonth(0, 1);\n    result.setHours(0, 0, 0, 0);\n    return result;\n  }\n\n  endOfYear(value: Date): Date {\n    const result = new Date(value.getTime());\n    result.setMonth(11, 31);\n    result.setHours(23, 59, 59, 999);\n    return result;\n  }\n\n  getDaysInMonth(value: Date): number {\n    return new Date(value.getFullYear(), value.getMonth() + 1, 0).getDate();\n  }\n\n  getWeekNumber(value: Date): number {\n    const firstDayOfYear = new Date(value.getFullYear(), 0, 1);\n    const pastDaysOfYear = (value.getTime() - firstDayOfYear.getTime()) / 86400000;\n    return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);\n  }\n\n  getFirstDayOfMonth(value: Date): number {\n    return new Date(value.getFullYear(), value.getMonth(), 1).getDay();\n  }\n\n  getWeekdayOrder(locale: string): string[] {\n    // For native Date, we'll use a simplified approach\n    // Most locales use Monday (1) as first day, but some use Sunday (0)\n    const firstDay = locale.toLowerCase().includes('en') ? 0 : 1; // English uses Sunday, most others use Monday\n    \n    // Weekday names starting from Sunday (index 0) to Saturday (index 6)\n    const weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\n    // Rotate the array to start from the firstDay\n    return [...weekdays.slice(firstDay), ...weekdays.slice(0, firstDay)];\n  }\n} ","export class CSSRegistry {\n    private static nameSpaces : string | string[];\n\n    public static registerNameSpaces(names : string | string[]) : void {\n        CSSRegistry.nameSpaces = names;\n    }\n\n    public static getNameSpaces() : string | string[] {\n        return CSSRegistry.nameSpaces;\n    }\n}","export interface AutoScrollOptions {\n  calendarElement: HTMLElement;\n  edgeThreshold?: number; // px from edge to trigger scroll\n  scrollSpeed?: number;   // px per frame\n}\n\nexport class AutoScrollHandler {\n  private options: AutoScrollOptions;\n  private autoScrollDirection: 'up' | 'down' | null = null;\n  private autoScrollRAF: number | null = null;\n  private readonly DEFAULT_EDGE_THRESHOLD = 40; // px from edge to trigger scroll\n  private readonly DEFAULT_SCROLL_SPEED = 20;   // px per frame\n\n  constructor(options: AutoScrollOptions) {\n    this.options = {\n      edgeThreshold: this.DEFAULT_EDGE_THRESHOLD,\n      scrollSpeed: this.DEFAULT_SCROLL_SPEED,\n      ...options\n    };\n  }\n\n  public update(clientY: number, _clientX?: number): void {\n    const calendar = this.options.calendarElement;\n    if (!calendar) return;\n\n    const rect = calendar.getBoundingClientRect();\n    const edgeThreshold = this.options.edgeThreshold!;\n\n    if (clientY - rect.top < edgeThreshold) {\n      this.startAutoScroll('up', calendar);\n    } else if (rect.bottom - clientY < edgeThreshold) {\n      this.startAutoScroll('down', calendar);\n    } else {\n      this.stopAutoScroll();\n    }\n  }\n\n  /**\n   * Stops auto-scroll and cleans up resources\n   */\n  public stop(): void {\n    this.stopAutoScroll();\n  }\n\n  /**\n   * Checks if auto-scroll is currently active\n   */\n  public isActive(): boolean {\n    return this.autoScrollDirection !== null;\n  }\n\n  /**\n   * Gets the current scroll position of the calendar container\n   */\n  public getScrollTop(): number {\n    return this.options.calendarElement?.scrollTop || 0;\n  }\n\n  /**\n   * Gets the calendar element for external scroll position tracking\n   */\n  public getCalendarElement(): HTMLElement | null {\n    return this.options.calendarElement || null;\n  }\n\n  private startAutoScroll(direction: 'up' | 'down', container: HTMLElement): void {\n    if (this.autoScrollDirection === direction && this.autoScrollRAF !== null) return;\n    \n    this.stopAutoScroll();\n    this.autoScrollDirection = direction;\n\n    const scrollStep = () => {\n      if (!this.autoScrollDirection) return;\n      \n      const scrollSpeed = this.options.scrollSpeed!;\n      \n      if (this.autoScrollDirection === 'up') {\n        container.scrollTop = Math.max(0, container.scrollTop - scrollSpeed);\n      } else if (this.autoScrollDirection === 'down') {\n        container.scrollTop = Math.min(\n          container.scrollHeight - container.clientHeight,\n          container.scrollTop + scrollSpeed\n        );\n      }\n      \n      this.autoScrollRAF = requestAnimationFrame(scrollStep);\n    };\n    \n    this.autoScrollRAF = requestAnimationFrame(scrollStep);\n  }\n\n  private stopAutoScroll(): void {\n    if (this.autoScrollRAF !== null) {\n      cancelAnimationFrame(this.autoScrollRAF);\n      this.autoScrollRAF = null;\n    }\n    this.autoScrollDirection = null;\n  }\n} ","import { generateUtilityClass } from \"@dg/utils\";\nimport { CSSRegistry } from \"./CSSRegistry\";\n\n\nexport function getCalendarRootUtilityClass(slots: {slot : string, modifiers : string[]}): string {\n  const globalNameSpace = CSSRegistry.getNameSpaces() ?? [\"dg\"];\n  return generateUtilityClass('calendar', slots.slot, slots.modifiers, globalNameSpace as string[]);\n}\n","import { ComponentMeta } from \"@dg/corecomponent\";\nimport { VerticalCalendarComponent } from \"./vertical-calendar-component/vertical-calendar-container-component/vertical-calendar-component\";\nimport { getVerticalCalendarRowContainerTemplate, getVerticalCalendarTemplate, getVerticalCalendarRowTemplate,getVerticalCalendarCellTemplate, getWeekHeaderTemplate, getNavBarTemplate, getEventsContainerTemplate, getEventTemplate, getTimeEventTemplate, getEventEllipsisTemplate } from \"./template/vertical-calendar-template\";\nimport { VerticalCalendarRowContainerComponent } from \"./vertical-calendar-component/vertical-calendar-rows-container-component/vertical-calendar-rows-container-componet\";\nimport { VerticalCalendarRowComponent } from \"./vertical-calendar-component/vertical-calendar-row-component/vertical-calendar-row-component\";\nimport { VerticalCalendarCellComponent } from \"./vertical-calendar-component/vertical-calendar-cell-component/vertical-calendar-cell-component\";\nimport { weekHeaderComponent } from \"./vertical-calendar-component/vertical-calendar-week-header-component/vertical-calendar-week-header-component\";\nimport { CalendarNavBarComponent } from \"./vertical-calendar-component/header-component/nav-bar-component\";\nimport { VerticalCalendarEventsContainerComponent } from \"./vertical-calendar-component/event-component/event-container/event-container-component\";\nimport { VerticalCalendarEventComponent } from \"./vertical-calendar-component/event-component/event-component/event-component\";\nimport { VerticalCalendarTimeEventComponent } from \"./vertical-calendar-component/event-component/time-event-component/time-event-component\";\nimport { VerticalCalendarEventEllipsisComponent } from \"./vertical-calendar-component/event-component/event-ellipsis-component/event-ellipsis-component\";\n\n\nexport function createComponentList(): ComponentMeta[] {\n\tlet components: ComponentMeta[] = [\n\t\t{\n\t\t\tcomponentName: 'dg-calendar',\n\t\t\tcomponentClass: VerticalCalendarComponent,\n\t\t\ttemplate: getVerticalCalendarTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'dg-calendar-rows-container',\n\t\t\tcomponentClass: VerticalCalendarRowContainerComponent,\n\t\t\ttemplate: getVerticalCalendarRowContainerTemplate(),\n\t\t},\n        {\n\t\t\tcomponentName: 'dg-calendar-row',\n\t\t\tcomponentClass: VerticalCalendarRowComponent,\n\t\t\ttemplate: getVerticalCalendarRowTemplate(),\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'dg-calendar-cell',\n\t\t\tcomponentClass: VerticalCalendarCellComponent,\n\t\t\ttemplate: getVerticalCalendarCellTemplate(),\n\t\t},\n        {\n\t\t\tcomponentName: 'dg-calendar-week-header',\n\t\t\tcomponentClass: weekHeaderComponent,\n\t\t\ttemplate: getWeekHeaderTemplate(),\n\t\t},\n        {\n\t\t\tcomponentName: 'dg-calendar-nav-bar',\n\t\t\tcomponentClass: CalendarNavBarComponent,\n\t\t\ttemplate: getNavBarTemplate(),\n\n\t\t},\n\n\t\t{\n\t\t\tcomponentName: 'dg-calendar-event-container',\n\t\t\tcomponentClass: VerticalCalendarEventsContainerComponent,\n\t\t\ttemplate: getEventsContainerTemplate(),\n\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'dg-calendar-event',\n\t\t\tcomponentClass: VerticalCalendarEventComponent,\n\t\t\ttemplate: getEventTemplate(),\n\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'dg-calendar-time-event',\n\t\t\tcomponentClass: VerticalCalendarTimeEventComponent,\n\t\t\ttemplate: getTimeEventTemplate(),\n\n\t\t},\n\t\t{\n\t\t\tcomponentName: 'dg-calendar-event-ellipsis',\n\t\t\tcomponentClass: VerticalCalendarEventEllipsisComponent,\n\t\t\ttemplate: getEventEllipsisTemplate(),\n\n\t\t}\n\t\t\n\t\t\n\n\t];\n\n\treturn components;\n}\n","\nimport { Component } from \"@dg/corecomponent\";\nimport { IVerticalCalendarEventController } from \"../event-controller.type\";\nimport { IVerticalCalendarEventComponent } from \"../event-component.type\";\nimport { queryAssignedNodes } from \"@dg/corecomponent\";\n\n\n\nexport class VerticalCalendarEventComponent extends Component  implements IVerticalCalendarEventComponent{\n\n\n    static template: HTMLElement;\n    private domRendered: boolean = false;\n    static getTemplate: (param:any) => HTMLElement;\n    private cellComponent : HTMLElement | null = null;\n\n    @queryAssignedNodes('verticalCalendarEventTitle')  titleElement !:HTMLElement\n    @queryAssignedNodes('verticalCalendarEventEndResizer')  endResizerElement !:HTMLElement\n    @queryAssignedNodes('verticalCalendarEventStartResizer')  startResizerElement !:HTMLElement\n\n    \n\n    private controller!: IVerticalCalendarEventController|null;\n\n    constructor(controller: IVerticalCalendarEventController, cellComponent: HTMLElement) {\n        super();\n        this.controller = controller\n        this.cellComponent = cellComponent;\n        this.init();\n        \n\n         const component: any = {\n            getGui             : () => this.getGui(),\n            destroy            : () => this.destroy(),\n            setDomRenderer     : (renderer: boolean)=> this.setDomRenderer(renderer),\n            detach            : () => this.detach(),\n            getTitleElement : () => this.getTitleElement(),\n            getEndResizerElement :()=> this.getEndResizerElement(),\n            getStartResizerElement : ()=> this.getStartResizerElement(),\n            getParentComponent: ()=> this.getParentComponent()\n        };\n        this.controller.setComponent(component);\n\n\n\n    }\n\n    getElement(): HTMLElement {\n        return this.getGui() as HTMLElement;\n    }\n\n    getTitleElement():HTMLElement{\n        return this.titleElement\n    }\n\n    getEndResizerElement():HTMLElement{\n        return this.endResizerElement\n    }\n\n    getStartResizerElement():HTMLElement{\n        return this.startResizerElement\n    }\n\n    setDomRenderer(renderer: boolean):void {\n        this.domRendered = renderer;\n    }\n\n    isDomRenderer(): boolean {\n        return this.domRendered;\n    }\n\n    init(){\n        const params: any = this.controller?.getParams() as any;\n        const template = VerticalCalendarEventComponent.getTemplate(params);\n        this.setTemplate(template);\n\n    }\n\n    destroy(): void {\n\t\tsuper.destroy();\n        this.controller = null;\n       \n\t}\n\n    detach() {\n\n\t\tif(this.cellComponent) {\n\t\t\tthis.cellComponent.removeChild(this.getGui());\n\t\t\tthis.setGui(null as any) ;\n            this.cellComponent = null;\n\t\t}\n\t}\n\n\n\n\n\n\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { IVerticalCalendarEventController } from \"../event-controller.type\";\nimport { EventResizeController, ResizeCallbacks } from \"../../../core/event-resizer/event-resize-contoller\";\nimport { BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../../constant/vertical-calendar-bean-name-constant\";\nimport { IVerticalCalendarOptionHandler } from \"../../../core/vertical-calendar-option-handler.types\";\n\n\n\n\n\n\nclass VerticalCalendarEventController extends EventEmitter implements IVerticalCalendarEventController {\n    \n    private component!: any;\n    private eventBlock!: any ;\n    private element !: HTMLElement | null;\n    private endResizerElement !: HTMLElement;\n    private startResizerElement !: HTMLElement;\n    private resizeController: EventResizeController | null = null;\n    private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    private isPreview : boolean;\n    private cellElement !: HTMLElement;\n\n\n\n\n    constructor(eventBlock: any, getBeanInstanceByBeanName: getBeanInstanceByBeanName, cellElement: HTMLElement, isPreview?: boolean) {\n        super();\n        this.eventBlock = eventBlock;\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n        this.cellElement = cellElement;\n        this.isPreview = isPreview ?? false;\n\n        \n\n    }\n\n    getInstanceId(): string {\n        return this.eventBlock.event.id\n    }\n\n    setDisplay(value : string):void{\n        this.element!.style.display = value\n    }\n\n    getEventBlock(): any {\n        return this.eventBlock;\n    }\n    setComponent(component: any): void {\n        this.component = component;\n        this.element = this.component.getGui();\n            this.setTitle();\n            this.setWidth(this.eventBlock.segment.width,this.eventBlock.segment.padding);\n            this.setTop();\n            this.setColor();\n            !this.isPreview && this.setDataEventId();\n            !this.isPreview && this.setEventDates();\n    \n            if(!this.isPreview){\n                this.endResizerElement = this.component.getEndResizerElement();\n                this.startResizerElement =  this.component.getStartResizerElement()\n    \n                if(this.shouldRenderEndResizer() || this.shouldRenderStartResizer()){\n                    setTimeout(() => this.setupResizeHandles(), 0);\n    \n\n            }\n        }\n\n       \n       \n\n    }\n\n\n   \n\n    shouldRenderEndResizer():boolean{\n        return this.eventBlock && this.eventBlock.segment.getIsSameRowInWeek()\n\n    }\n     \n    shouldRenderStartResizer():boolean{\n        return this.eventBlock && this.eventBlock.segment.isStartSegment()\n       \n    }\n\n    setDataEventId():void{\n        this.element!.setAttribute('data-event-id',this.eventBlock.event.getId());\n    }\n\n    setEventDates():void{\n        const startDate = this.eventBlock.event.getStartTime();\n        const endDate = this.eventBlock.event.getEndTime();\n        \n        // Set start and end dates as ISO strings (YYYY-MM-DD format)\n        this.element!.setAttribute('data-start-date', startDate.toISOString().slice(0, 10));\n        this.element!.setAttribute('data-end-date', endDate.toISOString().slice(0, 10));\n    }\n\n\n\n\n\n    setupResizeHandles() {\n        this.resizeController = new EventResizeController(this.getBeanInstanceByBeanName);\n        const controllerHandler = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.CONTROLLER_HANDLER);\n        this.resizeController.setGridContainer(controllerHandler.getController().getElement());\n\n        const optionsHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IVerticalCalendarOptionHandler;\n\n        const startResizeCallbacks: ResizeCallbacks = {\n            onResizeStart: (params) => optionsHandler.onEventStartDateResizeStart?.(params),\n            onResize: (params) => optionsHandler.onEventStartDateResizeMove?.(params),\n            onResizeEnd: (params) => optionsHandler.onEventStartDateResizeEnd?.(params),\n        };\n        const endResizeCallbacks: ResizeCallbacks = {\n            onResizeStart: (params) => optionsHandler.onEventEndDateResizeStart?.(params),\n            onResize: (params) => optionsHandler.onEventEndDateResizeMove?.(params),\n            onResizeEnd: (params) => optionsHandler.onEventEndDateResizeEnd?.(params),\n        };\n\n        this.shouldRenderEndResizer() && this.resizeController.registerResizeHandle(this.endResizerElement, this.eventBlock, \"end\", this.cellElement, endResizeCallbacks);\n        this.shouldRenderStartResizer() && this.resizeController.registerResizeHandle(this.startResizerElement, this.eventBlock, \"start\", this.cellElement, startResizeCallbacks);\n    }\n\n    setTitle():void{\n        this.component.getTitleElement().innerText = this.eventBlock.event.title;\n\n    }\n\n    setWidth(width : number, padding :number):void{\n        this.element!.style.width = `calc(${width}% + ${padding}px)`;\n        \n        // Store width and padding values as data attributes for drag and drop\n        this.element!.setAttribute('data-width-percent', width.toString());\n        this.element!.setAttribute('data-padding-value', padding.toString());\n    }\n\n    setTop():void{\n        this.element!.style.top = `${this.eventBlock.segment.top}px`;\n    }\n\n    setColor(): void {\n        if (this.eventBlock.event.color) {\n            this.element!.style.backgroundColor = this.eventBlock.event.color;\n        } \n\n    }\n    destroy(): void {\n        this.resizeController?.destroy();\n        this.resizeController = null;\n        super.destroy();\n        this.component = null;\n        this.eventBlock = null;\n        this.element = null;\n    }\n    \n   \n\n\n    getGui(): HTMLElement {\n        return this.component?.getGui() as HTMLElement;\n    }\n\n\n\n    afterGuiAttached(): void {\n\n\n    }\n\n    getParams():any{\n        \n        return {\n            eventBlock: this.eventBlock,\n            shouldRenderEndResizer : this.shouldRenderEndResizer(),\n            shouldRenderStartResizer : this.shouldRenderStartResizer(),\n        }\n    }\n\n    isAllDayEvent(): boolean {\n        return this.eventBlock.event.isAllDay();\n    }\n\n   \n}\n\nexport {\n    VerticalCalendarEventController\n}","\nimport { Component } from \"@dg/corecomponent\";\nimport { VerticalCalendarEventsContainerController } from \"./event-container-controller\";\nimport { VerticalCalendarEventController } from \"../event-component/event-controller\";\nimport { VerticalCalendarEventComponent } from \"../event-component/event-component\";\n// import { VerticalCalendarTimeEventComponent } from \"../time-event-component/time-event-component\";\nimport { IVerticalCalendarEventController } from \"../event-controller.type\";\nimport { IVerticalCalendarEventComponent } from \"../event-component.type\";\nimport { VerticalCalendarEventEllipsisComponent } from \"../event-ellipsis-component/event-ellipsis-component\";\nimport { EVENT_ELLIPSIS_ID } from \"../event-ellipsis-component/event-ellipsis-controller\";\nimport { queryAssignedNodes } from \"@dg/corecomponent\";\n\nexport class VerticalCalendarEventsContainerComponent extends Component  {\n\n\n    @queryAssignedNodes('actualEventContainer') actualEventContainerElement !: HTMLElement;\n    @queryAssignedNodes('previewEventContainer') previewEventContainerElement !: HTMLElement;\n\n\n    static template: HTMLElement;\n    private domRendered: boolean = false;\n    static getTemplate: (param:any) => HTMLElement;\n    private cellComponent : HTMLElement | null = null;\n    private eventComponents: { [id: string]: IVerticalCalendarEventComponent | null;} = {};\n    private previewEventComponent !: IVerticalCalendarEventComponent | null\n\n    private controller!: VerticalCalendarEventsContainerController|null;\n\n    constructor(controller: VerticalCalendarEventsContainerController, cellComponent: HTMLElement) {\n        super();\n        this.controller = controller\n        this.cellComponent = cellComponent;\n        this.init();\n        \n\n         const component: any = {\n            getGui             : () => this.getGui(),\n            destroy            : () => this.destroy(),\n            setDomRenderer     : (renderer: boolean)=> this.setDomRenderer(renderer),\n            detach            : () => this.detach(),\n            setEventControllers : (eventControllers: VerticalCalendarEventController[]) => this.setEventControllers(eventControllers),\n            setPreviewEventControllers : (eventController :VerticalCalendarEventController) => this.setPreviewEventControllers(eventController),\n            getPreviewEventContainerElement :()=>this.getPreviewEventContainerElement(),\n            getActualEventContainerElement :()=>this.getActualEventContainerElement(),\n            destroyActualEventComponent :(eventID : string) =>this.destroyActualEventComponent(eventID)\n\n        };\n        this.controller.setComponent(component);\n\n\n\n    }\n\n    setDomRenderer(renderer: boolean):void {\n        this.domRendered = renderer;\n    }\n\n    private getPreviewEventContainerElement(){\n        return this.previewEventContainerElement\n    }\n\n    private getActualEventContainerElement(){\n        return this.actualEventContainerElement\n    }\n\n    public setPreviewEventControllers(controller :VerticalCalendarEventController){\n        if(this.previewEventComponent){\n            this.previewEventComponent.detach();\n            this.previewEventComponent.destroy();\n        }\n\t\tthis.previewEventComponent = null;\n        this.newPreviewComponent(controller);\n\n\n    }\n\n    public setEventControllers(controllers : VerticalCalendarEventController[]): void {\n\n        const previousRowComponent = { ...this.eventComponents  };\n        Object.values(previousRowComponent).forEach((oldRowComp: any) => {\n\t\t\t// this.getGui().removeChild(oldRowComp.getGui());\n\t\t\toldRowComp.detach();\n\t\t\toldRowComp.destroy();\n\t\t});\n\t\tthis.eventComponents = {};\n\t\tcontrollers.forEach((controller) => {\n\t\t\t// const instanceID = controller.getInstanceId();\n\t\t\t// const RowComponentExist = previousRowComponent[instanceID];\n\t\t\t// if (RowComponentExist) {\n\t\t\t// \tthis.eventComponents[instanceID] = RowComponentExist;\n\t\t\t// \tdelete previousRowComponent[instanceID];\n\t\t\t// } else {\n\t\t\t\tthis.newComponent(controller);\n\t\t\t// }\n\t\t});\n\n\t\t// Object.values(previousRowComponent).forEach((oldRowComp: any) => {\n\t\t// \tthis.getGui().removeChild(oldRowComp.getGui());\n\t\t// \toldRowComp.detach();\n\t\t// \toldRowComp.destroy();\n\t\t// });\n\n    }\n    private newPreviewComponent(controller:  IVerticalCalendarEventController) {\n\t\tconst instanceID = `${controller.getInstanceId()}-preview`;\n        \n\n            this.previewEventComponent = new VerticalCalendarEventComponent(controller,this.getPreviewEventContainerElement());\n\n\t\tthis.eventComponents[instanceID] = this.previewEventComponent;\n\t\tthis.getPreviewEventContainerElement().appendChild(this.previewEventComponent.getElement());\n\t\tthis.previewEventComponent.setDomRenderer(true);\n\t\tcontroller.afterGuiAttached();\n\n\n\t}\n   \n    private newComponent(controller:  IVerticalCalendarEventController) {\n\t\tconst instanceID = controller.getInstanceId();\n        let rowComponent;\n        const isAllDay = controller.isAllDayEvent();\n\n        if(!isAllDay){\n            if(instanceID === EVENT_ELLIPSIS_ID){\n                rowComponent = new VerticalCalendarEventEllipsisComponent(controller,this.getActualEventContainerElement());\n            }\n            else{\n                rowComponent = new VerticalCalendarEventComponent(controller,this.getActualEventContainerElement());\n            }\n            // else{\n            //     rowComponent = new VerticalCalendarTimeEventComponent(controller,this.getActualEventContainerElement());\n\n            // }\n        }else{\n            rowComponent = new VerticalCalendarEventComponent(controller,this.getActualEventContainerElement());\n        }\n            \n\n\t\tthis.eventComponents[instanceID] = rowComponent;\n\t\tthis.getActualEventContainerElement().appendChild(rowComponent.getElement());\n\t\trowComponent.setDomRenderer(true);\n\t\tcontroller.afterGuiAttached();\n\n\n\t}\n    isDomRenderer(): boolean {\n        return this.domRendered;\n    }\n\n    init(){\n        const params: any = this.controller?.getParams() as any;\n        const template = VerticalCalendarEventsContainerComponent.getTemplate(params);\n        this.setTemplate(template);\n\n    }\n\n    destroy(): void {\n\t\tsuper.destroy();\n        this.controller = null;\n\t}\n\n    destroyActualEventComponent(eventID :string){\n        const component = this.eventComponents[eventID] as IVerticalCalendarEventComponent;\n        if(component){\n            component.detach();\n            component.destroy();\n        }\n    }\n\n    detach() {\n\n\t\tif(this.cellComponent) {\n\t\t\tthis.cellComponent.removeChild(this.getGui());\n\t\t\tthis.setGui(null as any) ;\n            this.cellComponent = null;\n\t\t}\n\t}\n\n    \n\n\n\n\n\n\n}","import { EventEmitter } from \"@dg/corecomponent\";\n// import { VERTICAL_CALENDAR_EVENT_NAME } from \"../../../constant/vertical-calendar-event-name\";\nimport { IDayNode } from \"../../../data-structure/calendar-day-node.types\";\nimport { VERTICAL_CALENDAR_EVENT_NAME } from \"../../../constant/vertical-calendar-event-name\";\nimport { BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../../constant/vertical-calendar-bean-name-constant\";\nimport { ICalendarEventStore } from \"../../../core/event-handler/new/event-store.type\";\nimport { VerticalCalendarEventController } from \"../event-component/event-controller\";\n// import { VerticalCalendarTimeEventController } from \"../time-event-component/time-event-controller\";\nimport { ICalendarDataStore } from \"../../../data-structure/calendar-data-store.types\";\n import { EVENT_ELLIPSIS_ID, VerticalCalendarEventEllipsisController } from \"../event-ellipsis-component/event-ellipsis-controller\";\n// import { VERTICAL_CALENDAR_BEAN_NAME } from \"../../../constant/vertical-calendar-bean-name-constant\";\n// import { IMonthEventPositionHandler } from \"../../../core/event-handler/month-event-position-handler.types\";\n// import { VERTICAL_CALENDAR_EVENT_NAME } from \"../../../constant/vertical-calendar-event-name\";\n\n\n\n\n\nclass VerticalCalendarEventsContainerController extends EventEmitter {\n    \n    private component!: any;\n     dayNode!: IDayNode ;\n    private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    private eventsData: any;\n    private eventControllers: Map<string, any> = new Map();\n    private isHide : boolean;\n    private previewEventControllerID !: string;\n    private cellElement !: HTMLElement;\n\n    constructor(dayNode: IDayNode, getBeanInstanceByBeanName : getBeanInstanceByBeanName, cellElement: HTMLElement) {\n        super();\n        this.dayNode = dayNode;\n        this.isHide = false\n        this.cellElement = cellElement;\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n        \n\n    }\n    setComponent(component: any): void {\n        this.component = component;\n        const eventHandler = this.getBeanInstanceByBeanName(BEAN_NAME.EVENT_HANDLER);\n        this.addListener(eventHandler, VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED, this.refresh.bind(this));\n        \n        this.addListener(this.dayNode,'preview',this.previewEventRenderer.bind(this))\n        this.addListener(this.dayNode, 'DESTROY_PREVIEW_EVENT', this.destroyPreviewEvent.bind(this))\n\n\n    }\n\n    refresh() : void {\n        this.isHide = false\n        this.destroyAllEvents()\n        const eventStore = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.EVENT_STORE) as ICalendarEventStore;\n        const startTime = this.dayNode.getTimeStamp();\n\n        this.eventsData = eventStore.getEventsForDay(new Date(startTime));\n        const events = this.eventsData.events\n        const unfilteredEvents = this.eventsData.unfilteredEvents\n\n        const dataStore = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK) as ICalendarDataStore;\n        let maxVisibleEvents = dataStore.getMaxVisibleEventsWithDynamicHieght();\n\n        const totalLength = events.length + this.eventsData.overlappedEvents\n        const GENERATE_ELLIPSIS_DOM = totalLength > maxVisibleEvents;\n        let EVENT_COUNT = 0 ;\n        // const renderingOverlappedEvents = (maxVisibleEvents - this.eventsData.renderingOverlappedEvents) <=0? 0 : maxVisibleEvents - this.eventsData.renderingOverlappedEvents\n        \n\n          \n        if(events.length !== 0){\n            if( totalLength < maxVisibleEvents){\n                maxVisibleEvents = totalLength\n            }\n\n            for (let i =  this.eventsData.overlappedEvents ; i < maxVisibleEvents; i++) {\n                \n                const event = events[EVENT_COUNT];\n                if(!event){\n\n                    return\n                }\n                // const isAllDay = event.event.isAllDay()\n                \n                // Check if event controller already exists and destroy it\n                if (this.eventControllers.has(event.event.id)) {\n                    const existingController = this.eventControllers.get(event.event.id);\n                    existingController.destroy();\n                }\n                \n                // if(!isAllDay){ // need to uncomment this when we have time event controller\n                //     const eventController = new VerticalCalendarTimeEventController(event, this.cellElement);\n                //     this.eventControllers.set(event.event.id, eventController);\n                // }else{\n                const eventController = new VerticalCalendarEventController(event,this.getBeanInstanceByBeanName, this.cellElement);\n                this.eventControllers.set(event.event.id, eventController);\n                // }\n                EVENT_COUNT++\n\n            }\n\n            if(GENERATE_ELLIPSIS_DOM){\n                const eventController = new VerticalCalendarEventEllipsisController(\n                    {\n                        events : unfilteredEvents, \n                        extraEventCount : maxVisibleEvents,\n                        overlappedEvents : this.eventsData.overlappedEvents\n                        \n                    },\n                        this.getBeanInstanceByBeanName\n                    );\n\n                this.eventControllers.set(EVENT_ELLIPSIS_ID, eventController);\n            }\n   \n        }\n        \n        this.component.setEventControllers(Array.from(this.eventControllers.values()));\n\n    }\n\n    previewEventRenderer(){\n        const previewEventStore = this.getBeanInstanceByBeanName(VERTICAL_CALENDAR_BEAN_NAME.PREVIEW_EVENT_STORE);\n        const eventBlock = previewEventStore.getEventsForDay(this.dayNode.getDate());\n        const eventObject = eventBlock.events[0];\n\n        const eventId = eventObject.event.id;\n        if(eventObject.segment.shouldRenderSegment()){\n              const eventController = this.eventControllers.get(eventId)\n              if(eventController){\n                const actualEventObject = eventController.getEventBlock()\n                eventObject.segment.updateTop(actualEventObject.segment.getTop())\n              }\n             \n        }\n        !this.isHide && this.destroyActualEventController(eventId);\n      \n        this.previewEventControllerID = PreviewEventControllerIDGenerator(eventId);\n\n        const IS_PREVIEW = true\n\n        if(!this.eventControllers.has(this.previewEventControllerID)){\n            const eventController = new VerticalCalendarEventController(eventObject, this.getBeanInstanceByBeanName, this.cellElement, IS_PREVIEW);\n            this.eventControllers.set(this.previewEventControllerID, eventController);\n            this.component.setPreviewEventControllers(eventController)\n        }else{\n            const eventController = this.eventControllers.get(this.previewEventControllerID)\n            eventController.setWidth(eventObject.segment.width,eventObject.segment.padding)\n        }\n        // console.log('resizing');\n\n    }\n\n    destroyActualEventController(eventID : string){\n        if(eventID){\n            const eventController = this.eventControllers.get(eventID)\n            eventController && eventController.setDisplay('none');\n            this.isHide = true\n\n        }\n       \n    }\n\n    destroyActualEventComponent(eventID :string){\n        this.component.destroyActualEventComponent(eventID)\n    }\n\n    destroyPreviewEvent(){\n        if(this.eventControllers.has(this.previewEventControllerID)){\n            const eventController = this.eventControllers.get(this.previewEventControllerID);\n            const eventComponentsID =  `${eventController.getInstanceId()}-preview`;\n            eventController.destroy();\n            this.destroyActualEventComponent(eventComponentsID);\n            this.eventControllers.delete(this.previewEventControllerID) \n\n        }\n\n    }\n\n\n\n\n\n    \n    destroy():void{\n        super.destroy();\n        \n        this.eventControllers.forEach((eventController) => {\n            eventController.destroy();\n        });\n        this.eventControllers = new Map()\n\n        this.component.destroy();\n\n    }\n\n    destroyAllEvents():void{\n        this.eventControllers.forEach((eventController) => {\n            // const eventComponentsID =  eventController.getInstanceId();\n            // this.destroyActualEventComponent(eventComponentsID);\n            eventController.destroy();\n        });\n        this.eventControllers = new Map()\n       \n\n    }\n\n    \n   \n\n\n    getGui(): HTMLElement {\n        return this.component?.getGui() as HTMLElement;\n    }\n\n\n\n    afterGuiAttached(): void {\n\n\n    }\n\n    getParams():any{\n        return {\n            events: this.eventsData\n        }\n    }\n\n    \n}\n\nexport {\n    VerticalCalendarEventsContainerController\n}\n\n\nfunction PreviewEventControllerIDGenerator(eventID :string){\n    return `${eventID}-preview`\n}","\nimport { Component } from \"@dg/corecomponent\";\nimport { IVerticalCalendarEventEllipsisComponent } from \"../event-component.type\";\nimport { IVerticalCalendarEventEllipsisController } from \"../event-controller.type\";\n\n\n\n\nexport class VerticalCalendarEventEllipsisComponent extends Component  implements IVerticalCalendarEventEllipsisComponent{\n\n\n    static template: HTMLElement;\n    private domRendered: boolean = false;\n    static getTemplate: (param:any) => HTMLElement;\n    private cellComponent : HTMLElement | null = null;\n\n    private controller!: IVerticalCalendarEventEllipsisController|null;\n\n    constructor(controller: IVerticalCalendarEventEllipsisController, cellComponent: HTMLElement) {\n        super();\n        this.controller = controller\n        this.cellComponent = cellComponent;\n        this.init();\n        \n\n         const component: any = {\n            getGui             : () => this.getGui(),\n            destroy            : () => this.destroy(),\n            setDomRenderer     : (renderer: boolean)=> this.setDomRenderer(renderer),\n            detach            : () => this.detach(),\n        };\n        this.controller.setComponent(component);\n\n\n\n    }\n\n    getElement(): HTMLElement {\n        return this.getGui() as HTMLElement;\n    }\n\n    setDomRenderer(renderer: boolean):void {\n        this.domRendered = renderer;\n    }\n\n    isDomRenderer(): boolean {\n        return this.domRendered;\n    }\n\n    init(){\n        const params: any = this.controller?.getParams() as any;\n        const template = VerticalCalendarEventEllipsisComponent.getTemplate(params);\n        this.setTemplate(template);\n\n    }\n\n    destroy(): void {\n\t\tsuper.destroy();\n        this.controller = null;\n\t}\n\n    detach() {\n\n\t\tif(this.cellComponent) {\n\t\t\tthis.cellComponent.removeChild(this.getGui());\n\t\t\tthis.setGui(null as any) ;\n            this.cellComponent = null;\n\t\t}\n\t}\n\n\n\n\n\n\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { IVerticalCalendarEventEllipsisController } from \"../event-controller.type\";\nimport { DAY_WIDTH } from \"../../../data-structure/calendar-data-store\";\nimport { BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { IVerticalCalendarOptionHandler } from \"../../../core/vertical-calendar-option-handler.types\";\n\n\n\n\nexport const EVENT_ELLIPSIS_ID = 'ellipsis'\n\nclass VerticalCalendarEventEllipsisController extends EventEmitter implements IVerticalCalendarEventEllipsisController {\n    \n    private component!: any;\n    private eventBlock!: any ;\n    private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    private element !: HTMLElement | null;\n\n\n    constructor(eventBlock : any , getBeanInstanceByBeanName: getBeanInstanceByBeanName) {\n        super();\n        this.eventBlock = eventBlock;\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName\n\n\n    }\n\n    getInstanceId(): string {\n        return EVENT_ELLIPSIS_ID\n    }\n\n    getEventBlock(): any {\n        return this.eventBlock;\n    }\n    setComponent(component: any): void {\n        this.component = component;\n        this.element = this.component.getGui();\n\n        this.setTitle();\n        this.setWidth();\n        this.setTop();\n        this.setColor()\n        this.registerEvent()\n    }\n    setDisplay(value : string):void{\n        this.element!.style.display = value\n    }\n\n\n    registerEvent(){\n        this.element?.addEventListener('click',this.handleOnClick.bind(this))\n    }\n\n    handleOnClick() :void{\n        const optionHandler = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER) as IVerticalCalendarOptionHandler\n        optionHandler.onClickEventEllipsis(this.eventBlock.events)\n    }\n\n    setTitle():void{\n        const extraEventsCount = this.eventBlock.events.length - (this.eventBlock.extraEventCount)\n        this.element!.innerText = `+${extraEventsCount}  more events`;\n    }\n\n    setWidth():void{\n        this.element!.style.width = `calc(${DAY_WIDTH}% + 0px)`;\n    }\n\n    setTop():void{\n        // const index = this.eventBlock.extraEventCount ;\n        // const totalRowHeight = ROW_HEIGHT + ROW_PADDING;\n        // const top = totalRowHeight * index;\n        // this.element!.style.top = `${top}%`;\n        this.element!.style.bottom = `${0}px`;\n    }\n\n    setColor(): void {\n        const index = this.eventBlock.extraEventCount ;\n        const lastEvent = this.eventBlock.events[index === -1 ? 0 : index]\n        const color = lastEvent.event.color\n        if (color) {\n            this.element!.style.backgroundColor = color;\n        } \n    }\n\n    destroy(): void {\n\t\tsuper.destroy();\n        this.component = null;\n        this.eventBlock = null;\n        this.element = null;\n\t}\n    \n\n    getGui(): HTMLElement {\n        return this.component?.getGui() as HTMLElement;\n    }\n\n\n\n    afterGuiAttached(): void {\n\n\n    }\n\n    getParams():any{\n        return {\n            eventBlock: this.eventBlock\n        }\n    }\n\n    isAllDayEvent(): boolean {\n        return false;\n    }\n\n    \n\n   \n}\n\nexport {\n    VerticalCalendarEventEllipsisController\n}","\nimport { Component } from \"@dg/corecomponent\";\nimport { IVerticalCalendarEventController } from \"../event-controller.type\";\nimport { IVerticalCalendarEventComponent } from \"../event-component.type\";\nimport { queryAssignedNodes } from \"@dg/corecomponent\";\n\n\n\n\nexport class VerticalCalendarTimeEventComponent extends Component  implements IVerticalCalendarEventComponent{\n\n\n    static template: HTMLElement;\n    private domRendered: boolean = false;\n    static getTemplate: (param:any) => HTMLElement;\n    private cellComponent : HTMLElement | null = null;\n\n    private controller!: IVerticalCalendarEventController|null;\n\n\n    @queryAssignedNodes('verticalCalendarTimeEventTitle') titleElement!: HTMLElement | null;\n    @queryAssignedNodes('verticalCalendarTimeEventTime') timeSlotElement!: HTMLElement | null;\n\n    constructor(controller: IVerticalCalendarEventController, cellComponent: HTMLElement) {\n        super();\n        this.controller = controller\n        this.cellComponent = cellComponent;\n        this.init();\n        \n\n         const component: any = {\n            getGui             : () => this.getGui(),\n            destroy            : () => this.destroy(),\n            setDomRenderer     : (renderer: boolean)=> this.setDomRenderer(renderer),\n            detach            : () => this.detach(),\n            getTitleElement     : () => this.getTitleElement(),\n            getTimeSlotElement     : () => this.getTimeSlotElement(),\n        };\n        this.controller.setComponent(component);\n\n\n\n    }\n\n    getElement(): HTMLElement {\n        return this.getGui() as HTMLElement;\n    }\n\n\n    getTitleElement(): HTMLElement | null {\n        return this.titleElement;\n    }\n\n    getTimeSlotElement(): HTMLElement | null {\n        return this.timeSlotElement;\n    }\n    setDomRenderer(renderer: boolean):void {\n        this.domRendered = renderer;\n    }\n\n    isDomRenderer(): boolean {\n        return this.domRendered;\n    }\n\n    init(){\n        const params: any = this.controller?.getParams() as any;\n        const template = VerticalCalendarTimeEventComponent.getTemplate(params);\n        this.setTemplate(template);\n\n    }\n\n    destroy(): void {\n\t\tsuper.destroy();\n        this.controller = null;\n\t}\n\n    detach() {\n\n\t\tif(this.cellComponent) {\n\t\t\tthis.cellComponent.removeChild(this.getGui());\n\t\t\tthis.setGui(null as any) ;\n            this.cellComponent = null;\n\t\t}\n\t}\n\n\n\n\n\n\n}","\n\nimport { PostConstruct, queryAssignedNodes } from '@dg/corecomponent';\nimport {Component} from '@dg/corecomponent'\nimport { CalendarNavBarController } from './nav-bar-controller';\nimport { CalendarNavBarComponentTypes } from './nav-bar-component.type';\n\n\n\n// function CalendarNavBarFullTemplate(props: any): HTMLElement {\n//     const container = document.createElement(\"div\");\n\n//     // Left section\n//     const leftDiv = document.createElement(\"div\");\n//     leftDiv.classList.add(\"dg-date-picker__navigation--left\");\n//     const previousYearButton = document.createElement(\"calendar-previous-button\");\n//     previousYearButton.setAttribute(\"ref\", \"previousYearButton\");\n//     const previousMonthButton = document.createElement(\"calendar-previous-button\");\n//     previousMonthButton.setAttribute(\"ref\", \"previousMonthButton\");\n//     leftDiv.appendChild(previousYearButton);\n//     leftDiv.appendChild(previousMonthButton);\n\n//     // Title section\n//     const titleDiv = document.createElement(\"div\");\n//     titleDiv.classList.add(\"dg-date-picker__navigation--title\");\n//     titleDiv.setAttribute(\"ref\", \"titleElement\");\n//     titleDiv.setAttribute(\"tabindex\", \"0\");\n//     const monthSpan = document.createElement(\"span\");\n//     monthSpan.classList.add(\"dg-date-picker__navigation--monthnav\");\n//     monthSpan.setAttribute(\"ref\", \"monthElement\");\n//     monthSpan.textContent = props.month;\n//     const yearSpan = document.createElement(\"span\");\n//     yearSpan.classList.add(\"dg-date-picker__navigation--yearnav\");\n//     yearSpan.setAttribute(\"ref\", \"yearElement\");\n//     yearSpan.textContent = props.year;\n//     titleDiv.appendChild(monthSpan);\n//     titleDiv.appendChild(yearSpan);\n\n//     // Right section\n//     const rightDiv = document.createElement(\"div\");\n//     rightDiv.classList.add(\"dg-date-picker__navigation--right\");\n//     const nextMonthButton = document.createElement(\"calendar-previous-button\");\n//     nextMonthButton.setAttribute(\"ref\", \"nextMonthButton\");\n//     const nextYearButton = document.createElement(\"calendar-previous-button\");\n//     nextYearButton.setAttribute(\"ref\", \"nextYearButton\");\n//     rightDiv.appendChild(nextMonthButton);\n//     rightDiv.appendChild(nextYearButton);\n\n//     container.appendChild(leftDiv);\n//     container.appendChild(titleDiv);\n//     container.appendChild(rightDiv);\n\n//     return container;\n// }\n\n\n// function CalendarNavBarRootTemplate(props:any){\n\n// \tconst template = CalendarNavBarFullTemplate(props) \n// \treturn template\n\n// }\n\n// function dummTemplate(_props:any){\n// \tconst div = document.createElement('div');\n// \treturn div;\n\t\n// }\n\n\n\nexport class CalendarNavBarComponent extends Component {\n\t@queryAssignedNodes('monthElement') monthElement !: any;\n\t@queryAssignedNodes('yearElement') yearElement !  : any;\n\t@queryAssignedNodes('titleElement') titleElement !: any;\n\n\t@queryAssignedNodes('previousMonthButton') previousMonthButton!: any;\n\t@queryAssignedNodes('nextMonthButton') nextMonthButton!        : any;\n\t@queryAssignedNodes('previousYearButton') previousYearButton!  : any;\n\t@queryAssignedNodes('nextYearButton') nextYearButton!          : any;\n\n    \n    private controller !:CalendarNavBarController\n    static getTemplate: (props: any) => HTMLElement;\n\n\n    \n\t@PostConstruct()\n\tinit(): void {\n\n\t\tconst component:CalendarNavBarComponentTypes  = this.getComponent()\n\n\t\t this.controller = this.createManagedBean(new CalendarNavBarController());\n        this.renderTemplate(this.controller,component);\n\t\tthis.controller.setComponent(component);\n\t}\n\n\tprivate getComponent(): CalendarNavBarComponentTypes {\n\t\treturn {\n\t\t\tgetElement         : () => this.getGui(),\n\t\t\taddOrRemoveCssClass: (className : string) => this.addOrRemoveCSSClass(className),\n\t\t\tgetYearElement     : () => this.getYearElement(),\n\t\t\tgetMonthElement    : () => this.getMonthElement(),\n\t\t\trerender           : (controller:CalendarNavBarController,comp:CalendarNavBarComponentTypes) => this.rerender(controller,comp),\n\t\t\tgetTitleElement    : ()=>this.getTitleElement(),\n\t\t\tgetParentComponent : () => this.getParentComponent(),\n\t\t\tgetMonthYearButtons: () => this.getMonthYearButtons(),\n\n\t\t}\n\n\t}\n\tprivate addOrRemoveCSSClass(className: string) : void {\n\t\tconst element = this.getGui()\n\t\telement && (element.className = className);\n\t}\n\n\tprivate getMonthElement(){\n\t\treturn this.monthElement\n\t}\n\n\tprivate getYearElement(){\n\t\treturn this.yearElement\n\t}\n\n\tprivate getTitleElement(){\n\t\treturn this.titleElement;\n\n\t}\n\n\tprivate getMonthYearButtons():{previousYearButton:any,nextYearButton    : any, previousMonthButton : HTMLElement, nextMonthButton:HTMLElement} {\n\t\treturn{\n\t\t\tpreviousYearButton: this.previousYearButton,\n\t\t\tnextYearButton    : this.nextYearButton,\n            previousMonthButton: this.previousMonthButton,\n            nextMonthButton    : this.nextMonthButton,\n\t\t}\n\t}\n\n\n\tprivate renderTemplate(controller: CalendarNavBarController, _component: CalendarNavBarComponentTypes) {\n        this.controller = controller;\n\t\tconst props =   this.controller.getProperty()\n        const paramsProperty =   this.controller.getParamsProperty();\n\n        const template = CalendarNavBarComponent.getTemplate(props);\n        this.setTemplate(template, {\n\t\t\tpreviousMonthButton: paramsProperty.previousMonthButton,\n\t\t\tnextMonthButton    : paramsProperty.nextMonthButton,\n\t\t});\n\n\n      \n    }\n\n\trerender(controller:CalendarNavBarController,comp:any) {\n        this.controller = controller;\n\t\tthis.destroy();\n        const component = this.getComponent()\n        this.renderTemplate(this.controller,component);\n\t\tthis.controller.setComponent(component);\n        comp.appendChild(this.getGui());\n    }\n\n\tprotected destroy(): void {\n\t\tthis.getGui().remove();\n\n\t}\n\n    // afterGuiAttached(_params: any): void {\n    //     this.controller.checkToDisableNavIfLimitExceedsMax();\n       \n    // }\n\n\t\n\n}","import { composeClasses } from \"@dg/utils\"\n\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { CalendarNavBarComponentTypes } from \"./nav-bar-component.type\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\nimport { ButtonNavigatorTypes } from \"../../core/button-interactor/button-interactor.types\";\n// import { ICalendarDataStore } from \"../../data-structure/calendar-data-store.types\";\nimport { CalendarNavigatorInteractor } from \"../../core/navigators/calendar-navigator-interactor\";\nimport { getCalendarRootUtilityClass } from \"../../utils/calendar-root-classes\";\nimport { AutoWired } from \"@dg/corecomponent\";\nimport { VERTICAL_CALENDAR_EVENT_NAME } from \"../../constant/vertical-calendar-event-name\";\nimport { ICalendarDataStore } from \"../../data-structure/calendar-data-store.types\";\nimport { IWeekNode } from \"../../data-structure/calendar-weeknode.types\";\n\n\nconst useUtilityClasses = () => {\n\tconst slots = {\n\t\tcontainer : {\n\t\t\tslot : 'navigation',\n\t\t\tmodifiers : []\n\t\t}\n\t}\n\n\treturn composeClasses(slots, getCalendarRootUtilityClass)\n}\n\n\n\n// const useUtilityClassesForButton = () => {\n// \tconst slots = {\n// \t\tcontainer : {\n// \t\t\tslot : 'button',\n// \t\t\tmodifiers : [\n                \n//             ]\n// \t\t}\n// \t}\n\n// \treturn composeClasses(slots, getCalendarRootUtilityClass)\n// }\n\nconst MONTH_LABEL = [\n    'January',\n    'February',\n    'March',\n    'April',\n    'May',\n    'June',\n    'July',\n    'August',\n    'September',\n    'October',\n    'November',\n    'December'\n  ];\n  \n\nexport class CalendarNavBarController extends EventEmitter{\n\n    // @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_MODEL) protected model !:ICalendarDataManager;\n    // @AutoWired(CALENDAR_BEAN_NAME.CALENDAR_VIEW_MANAGER) protected viewManager !:CalendarViewManagerTypes;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.BUTTON_NAVIGATOR) private buttonNavigator!: ButtonNavigatorTypes;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.NAVIGATOR_INTERACTOR) private navigationInteractor!: CalendarNavigatorInteractor;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK) private dataStore!: ICalendarDataStore;\n\n\n\n\n\n    private parentComponent!: any;\n    private component!: any;\n    \n    setComponent(component:CalendarNavBarComponentTypes): void {\n        this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.MONTH_UPDATED, this.setMonth.bind(this));\n        // this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.NAVBAR_RERENDER, this.rerender.bind(this));\n        // this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.HIDEYEARBTN, this.hideYearBtns.bind(this));\n        // this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.SHOWYEARBTN, this.showYearBtns.bind(this));\n        this.component = component;\n        // this.parentComponent = this.component?.getParentComponent();\n        // this.setAriaAttributes()\n         this.applyClassNames();\n         this.registerEventListener();\n        //  this.addListener(this.eventHandler, CALENDAR_CUSTOM_EVENTS.SET_FOCUS_TO_THE_TITLE_ELEMENT, this.setFocusToTheTitleElement.bind(this));\n        //  this.disableNavIfYearExceedsMax()\n         \n    }\n\n     setFocusToTheTitleElement() {\n        // this.component?.getTitleElement().focus();\n    }\n    \n    private applyClassNames(){\n        const classes = useUtilityClasses();\n        this.component?.addOrRemoveCssClass(classes.container);\n    }\n\n    getProperty(){\n        // const anchorTimestamp = this.navigationInteractor.getAnchor();\n        // const month = new Date(anchorTimestamp).getMonth().toString();\n        // const year = new Date(anchorTimestamp).getFullYear().toString();\n       return{\n            month : '',\n            year : ''\n       }\n    }\n\n    setAriaAttributes():void{\n        // const monthElement = this.component?.getMonthElement();\n        // const yearElement = this.component?.getYearElement();\n        // if(monthElement){\n        //     monthElement && monthElement.setAttribute('aria-label',this.model.getSelectedMonth());\n        //     monthElement && monthElement.setAttribute('aria-live','polite');\n        //     monthElement && monthElement.setAttribute('aria-atomic','true');\n        // }\n\n        // if(yearElement){\n        //     yearElement && yearElement.setAttribute('aria-label',this.model.getSelectedYear());\n        //     yearElement && yearElement.setAttribute('aria-live','polite');\n        //     yearElement && yearElement.setAttribute('aria-atomic','true');\n    \n\n        // } \n\n    }\n\n    getParamsProperty() {\n        return {\n\t\t\tpreviousMonthButton: {\n                getRole       : () => 'previousMonth',\n                callback         : () => this.goToPreviousMonth(),\n                icon : \"dg__svg--backward\",\n                // disabled : this.model.isMonthInDangerZoneForPast()\n\n\t\t\t},\n\n\t\t\tnextMonthButton: {\n                getRole       : () => 'nextMonth',\n                callback         : () => this.goToNextMonth(),\n                icon : \"dg__svg--forward\",\n                // disabled : this.model.isMonthInDangerZoneForFuture()\n\n\n\t\t\t},\n\n\t\t};\n    }\n\n    goToPreviousMonth():void{\n       this.buttonNavigator.goToPreviousMonth()\n\n    }\n    goToNextMonth():void{\n       this.buttonNavigator.goToNextMonth()\n    }\n\n    setMonth(){\n\n        const anchorTimestamp = this.navigationInteractor.getAnchor();\n        const weekNode = this.dataStore.getWeekNode(anchorTimestamp) as IWeekNode;\n        if(!weekNode){\n            return;\n        }\n\n        \n\n        const dayIndex = weekNode.getAllDayNodes().length;\n        const currentIndex = weekNode.getAllDayNodes()[dayIndex - 1].getTimeStamp();\n\n\n        // const currentMonth    = this.dataStore.getNearMonthStartDate(anchorTimestamp);\n\n        let month           = MONTH_LABEL[new Date(currentIndex).getMonth()];\n        let year            = new Date(anchorTimestamp).getFullYear().toString();\n\n        const calendarType = this.optionsHandler.getCalendarType();\n        if(calendarType === 'horizontal_month'){\n            const buffer = this.optionsHandler.getBufferMonth();\n            if(buffer > 1){\n                const nextMonth = new Date(currentIndex);\n                nextMonth.setMonth(nextMonth.getMonth() + buffer-1);\n                const lastMonth = MONTH_LABEL[nextMonth.getMonth()];\n                month = `${month} - ${lastMonth}`;\n\n\n                const nexYear =  nextMonth.getFullYear().toString();\n                if( nexYear !== year){\n                   month = `${MONTH_LABEL[new Date(currentIndex).getMonth()]} ${year} - ${lastMonth} ${nexYear}`;\n                   year = ''\n                }\n            }\n        }\n\n        (this.component?.getMonthElement()as HTMLElement).textContent = month;\n\t\t(this.component?.getYearElement()as HTMLElement).textContent = year;\n    }\n\n\n    registerEventListener(): void {\n        const nextMonthButton = this.component?.getMonthYearButtons()?.nextMonthButton;\n        nextMonthButton.addEventListener('click', this.navigationInteractor.gotoNext.bind(this.navigationInteractor));\n\n        const previousMonthButton = this.component?.getMonthYearButtons()?.previousMonthButton;\n        previousMonthButton.addEventListener('click', this.navigationInteractor.gotoPrevious.bind(this.navigationInteractor));\n\n        // const element = this.component?.getTitleElement() as HTMLElement;\n\n       \n        \n        \n    }\n\n    rerender():void{\n\n        this.component?.rerender(this,this.parentComponent);\n        this.applyClassNames();\n\n    }\n\n    // hideYearBtns():void{\n    //     const { previousYearButton, nextYearButton } = this.component?.getMonthYearButtons() as { previousYearButton :any, nextYearButton: any};\n    //     const monthElement = this.component?.getMonthElement() as HTMLElement;\n\n    //     previousYearButton.eGui.style.display = 'none'\n    //     nextYearButton.eGui.style.display     = 'none';\n\n    //     monthElement.style.display       = 'none';\n    // }\n\n    // showYearBtns():void{\n    //     const { previousYearButton, nextYearButton } = this.component?.getMonthYearButtons() as { previousYearButton :any, nextYearButton: any};;\n    //     const monthElement = this.component?.getMonthElement() as HTMLElement;\n\n    //     previousYearButton.eGui.style.display = 'block';\n    //     nextYearButton.eGui.style.display     = 'block';\n    //     monthElement.style.display       = 'block';\n\n    // }\n\n    protected destroy(): void {\n        super.destroy();\n    }\n\n    // checkToDisableNavIfLimitExceedsMax(){\n    //     const isYearInDangerZoneForFuture = this.model.isYearInDangerZoneForFuture();\n    //     const isYearInDangerZoneForPast = this.model.isYearInDangerZoneForPast();\n    //     const isMonthInDangerZoneForFuture = this.model.isMonthInDangerZoneForFuture();\n    //     const isMonthInDangerZoneForPast = this.model.isMonthInDangerZoneForPast();\n\n    //     const { previousYearButton, nextYearButton, previousMonthButton, nextMonthButton  } = this.component?.getMonthYearButtons() as {previousYearButton:any,nextYearButton    : any, previousMonthButton : any, nextMonthButton:any};\n\n    //     if(isYearInDangerZoneForFuture){\n    //         nextYearButton.renderer.button.api.updateProperties({disabled : true});\n    //     }else{\n    //         nextYearButton.renderer.button.api.updateProperties({disabled : false});\n    //     }\n\n    //     if(isYearInDangerZoneForPast){\n    //         previousYearButton.renderer.button.api.updateProperties({disabled : true});\n    //     }else{\n    //         previousYearButton.renderer.button.api.updateProperties({disabled : false});\n    //     }\n\n\n    //     if(isMonthInDangerZoneForFuture){\n    //         nextMonthButton.renderer.button.api.updateProperties({disabled : true});\n    //     }else{\n    //         nextMonthButton.renderer.button.api.updateProperties({disabled : false});\n    //     }\n\n\n\n    //     if(isMonthInDangerZoneForPast){\n    //         previousMonthButton.renderer.button.api.updateProperties({disabled : true});\n    //     }else{\n    //         previousMonthButton.renderer.button.api.updateProperties({disabled : false});\n    //     }\n\n\n    \n\n    // }\n\n\n\n\n\n\n}","\nimport { Component } from \"@dg/corecomponent\";\nimport { IDayNode } from \"../../data-structure/calendar-day-node.types\";\nimport { VerticalCalendarCellComponentTypes, VerticalCalendarCellControllerTypes } from \"./vertical-calendar-cell-component.types\";\nimport { VerticalCalendarEventsContainerController } from \"../event-component/event-container/event-container-controller\";\nimport { VerticalCalendarEventsContainerComponent } from \"../event-component/event-container/event-container-component\";\nimport { queryAssignedNodes } from \"@dg/corecomponent\";\n\n\n\n\n\nexport class VerticalCalendarCellComponent extends Component implements VerticalCalendarCellComponentTypes {\n\n\n    static template: HTMLElement;\n    private domRendered: boolean = false;\n    static getTemplate: (param:any) => HTMLElement;\n    @queryAssignedNodes('verticalCalendarCellContainer') verticalCalendarCellContainer !: HTMLElement\n\n    private controller!: VerticalCalendarCellControllerTypes|null;\n    private rowComponent : HTMLElement | null = null;\n    private eventContainerComponent!: VerticalCalendarEventsContainerComponent | null;\n\n    constructor(controller: VerticalCalendarCellControllerTypes ,rowComponent : HTMLElement) {\n        super();\n        this.controller = controller\n        this.rowComponent = rowComponent;\n        this.init();\n        \n\n         const component: VerticalCalendarCellComponentTypes = {\n            getGui             : () => this.getGui(),\n            destroy            : () => this.destroy(),\n            setDomRenderer     : (renderer: boolean)=> this.setDomRenderer(renderer),\n            setEventsControllers : (eventsController) => this.setEventsControllers(eventsController),\n            getController      : () => this.getController(),\n            detach            : () => this.detach(),\n        };\n        this.controller.setComponent(component);\n\n\n\n    }\n\n    setDomRenderer(renderer: boolean):void {\n        this.domRendered = renderer;\n    }\n\n    isDomRenderer(): boolean {\n        return this.domRendered;\n    }\n\n    init(){\n        const dayNode: IDayNode = this.controller?.getDayNode() as IDayNode;\n        const template = VerticalCalendarCellComponent.getTemplate(dayNode);\n        this.setTemplate(template);\n\n    }\n\n    destroy(): void {\n\t\tsuper.destroy();\n        this.eventContainerComponent?.destroy();\n        this.eventContainerComponent?.detach();\n        this.eventContainerComponent = null ;\n        this.controller = null;\n\t}\n\n    detach() {\n\n\t\tif(this.rowComponent) {\n\t\t\tthis.rowComponent.removeChild(this.getGui());\n\t\t\tthis.setGui(null as any) ;\n            this.rowComponent = null;\n\t\t}\n\t}\n\n    getController(): VerticalCalendarCellControllerTypes | null {\n        return this.controller;\n    }\n\n    public setEventsControllers(rowController: VerticalCalendarEventsContainerController): void {\n\n\t\t\t\tthis.newComponent(rowController);\n\n\n    }\n\n    private newComponent(controller: VerticalCalendarEventsContainerController) {\n\t\tthis.eventContainerComponent = new VerticalCalendarEventsContainerComponent(controller,this.verticalCalendarCellContainer);\n\t\tthis.appendChild(this.eventContainerComponent as any,this.verticalCalendarCellContainer);\n\t\tthis.eventContainerComponent.setDomRenderer(true);\n\t\tcontroller.afterGuiAttached();\n\n\t}\n\n\n\n\n\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { VerticalCalendarCellComponentTypes, VerticalCalendarCellControllerTypes } from \"./vertical-calendar-cell-component.types\";\nimport { IDayNode } from \"../../data-structure/calendar-day-node.types\";\nimport { VerticalCalendarEventsContainerController } from \"../event-component/event-container/event-container-controller\";\nimport { getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n// import { VERTICAL_CALENDAR_EVENT_NAME } from \"../../constant/vertical-calendar-event-name\";\n\n\n\n\n\nclass VerticalCalendarCellController extends EventEmitter implements VerticalCalendarCellControllerTypes{\n    \nprivate cellComponent!: VerticalCalendarCellComponentTypes;\n\n\nprivate dayNode !:IDayNode \nprivate getBeanInstanceByBeanName : getBeanInstanceByBeanName;\nprivate eventContainerControllers :VerticalCalendarEventsContainerController[] = [];\n\n\n    constructor(dayNode: IDayNode, getBeanInstanceByBeanName : getBeanInstanceByBeanName) {\n        super();\n        this.dayNode = dayNode;\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n\n    }\n    setComponent(component: VerticalCalendarCellComponentTypes): void {\n          this.cellComponent = component;\n          this.createEventControllers();\n          this.setAlternativeClassName();\n          this.setClassname();\n        this.addListener(this.dayNode, 'HOVER_EFFECT', this.setHoverEffect.bind(this))\n        //   this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.EVENTS_DATA_LOADED, this.createEventControllers.bind(this));\n\n    }\n\n    private setClassname():void{\n        if(this.dayNode.isToday()){\n            const element = this.cellComponent.getGui();\n            element.classList.add('dg-calendar-cell__today')\n        }\n        \n    }\n\n\n    setHoverEffect(){\n        const hoverToggler = this.dayNode.getHoverEffect();\n        const element = this.getGui()\n        if(hoverToggler){\n            element.classList.add('dg-calendar-cell-hover')\n        }else{\n            element.classList.remove('dg-calendar-cell-hover')\n\n        }\n\n    }\n  \n\n    setAlternativeClassName(){\n        const monthIndex = this.dayNode.getDate()?.getMonth();\n        const element = this.getGui()\n        if (monthIndex !== undefined) {\n            if (monthIndex % 2 === 0) {\n                element.classList.add('dg-calendar-cell-even')\n                \n            } else {\n                element.classList.add('dg-calendar-cell-odd')\n            }\n        }\n    }\n   \n\n\n    getGui(): HTMLElement {\n        return this.cellComponent?.getGui() as HTMLElement;\n    }\n\n    getInstanceId(): string {\n        return this.dayNode.getTimeStamp().toString();\n    }\n\n    afterGuiAttached(): void {\n\n\n    }\n\n    getDayNode(): IDayNode {\n        return this.dayNode;\n    }\n\n    destroy(): void {\n        this.cellComponent?.setDomRenderer(false);\n        this.eventContainerControllers.forEach((eventController) => {\n            eventController.destroy();\n        });\n\t\tsuper.destroy();\n    }\n\n    createEventControllers(): void {\n\n        // if ( events && events.length > 0 ) {\n        const cellElement = this.cellComponent.getGui();\n                const cellController: VerticalCalendarEventsContainerController = new VerticalCalendarEventsContainerController(this.dayNode, this.getBeanInstanceByBeanName, cellElement);\n                this.eventContainerControllers.push(cellController);\n                this.cellComponent.setEventsControllers(cellController);\n        // }\n\n    }\n\n    getBoundRectForCellElement() : DOMRect {\n        return (this.cellComponent?.getGui() as HTMLElement).getBoundingClientRect();\n    }\n}\n\nexport {\n    VerticalCalendarCellController\n}\n\n","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent\";\nimport { VerticalCalendarComponentTypes, VerticalCalendarTemplatePropsTypes } from \"./vertical-calendar-component.types\";\nimport { VerticalCalendarController } from \"./vertical-calendar-controller\";\n\n\n\n\nexport class VerticalCalendarComponent extends Component {\n    private verticalCalendarElement!: HTMLElement|null;\n\n    static template: HTMLElement;\n    static getTemplate: (props : VerticalCalendarTemplatePropsTypes) => HTMLElement;\n\n    constructor(verticalCalendarElement: HTMLElement) {\n        super();\n        this.verticalCalendarElement = verticalCalendarElement;\n    }\n\n    @PostConstruct()\n    init(): void {\n        const props : VerticalCalendarTemplatePropsTypes ={\n            calendarType : this.optionsHandler.getCalendarType(),\n        }\n        const template = VerticalCalendarComponent.getTemplate(props);\n         this.setTemplate(template);\n\n        const component: VerticalCalendarComponentTypes = {\n            getGui: () => this.getGui(),\n            getRootElement: () => this.getGui(),\n            destroy: () => this.destroy(),\n        };\n\n        this.appendGridIntoUserDom();\n        \n        const controller = this.createManagedBean(new VerticalCalendarController());\n        controller.setComponent(component);\n\n\n    }\n\n\n    appendGridIntoUserDom() {\n        const eGui = this.getGui();\n        this.verticalCalendarElement && this.verticalCalendarElement.appendChild(eGui);\n        this.addDestroyFunc(() => {\n            this.verticalCalendarElement && this.verticalCalendarElement.removeChild(this.getGui());\n            this.verticalCalendarElement = null;\n        });\n    }\n}","\nimport { EventEmitter } from \"@dg/corecomponent\";\nimport { VerticalCalendarComponentTypes, VerticalCalendarControllerTypes } from \"./vertical-calendar-component.types\";\nimport { VERTICAL_CALENDAR_EVENT_NAME } from \"../../constant/vertical-calendar-event-name\";\nimport { CalendarType } from \"../../vertical-calendar-configuration\";\n;\n\n\n\n\nexport class VerticalCalendarController extends EventEmitter implements VerticalCalendarControllerTypes {\n    private component !: VerticalCalendarComponentTypes | null;\n\n    setComponent(component: VerticalCalendarComponentTypes) : void {\n        this.component = component;\n        const calendarType = this.optionsHandler.getCalendarType();\n        if(calendarType === CalendarType.verticalMonth){\n            this.dispatchEvent({\n                type:VERTICAL_CALENDAR_EVENT_NAME.UPDATE_SCROLLTOP ,\n            })\n        }\n        \n    }\n        \n\n    getBoundRectForGridElement() : DOMRect {\n        return (this.component?.getGui() as HTMLElement).getBoundingClientRect();\n    }\n\n\n    getGui(): HTMLElement {\n        return this.component?.getGui() as HTMLElement;\n    }\n\n\n    destroyComponent():void{\n        this.component && this.component.destroy();\n        this.component = null;\n    }\n\n}","import { IRowControllerWrapper } from \"../../core/common-controllers/row/row-controller-wrapper\";\nimport { Component } from \"@dg/corecomponent\";\nimport { VerticalCalendarRowComponentTypes } from \"./vertical-calendar-row-component.types\";\nimport { VerticalCalendarCellComponentTypes, VerticalCalendarCellControllerTypes } from \"../vertical-calendar-cell-component/vertical-calendar-cell-component.types\";\nimport { VerticalCalendarCellComponent } from \"../vertical-calendar-cell-component/vertical-calendar-cell-component\";\n\nexport class VerticalCalendarRowComponent extends Component implements VerticalCalendarRowComponentTypes{\n\n    static template: HTMLElement;\n    static getTemplate: () => HTMLElement;\n    private domRendered: boolean = false;\n\tprivate cellComponents: { [id: string]: VerticalCalendarCellComponentTypes | null;} = {};\n    private controller: IRowControllerWrapper;\n   \n\n\n    constructor(controller: IRowControllerWrapper) {\n        super();\n        this.init();\n        this.controller = controller;\n\n\n         const component: VerticalCalendarRowComponentTypes = {\n            getGui             : () => this.getGui(),\n            destroy            : () => this.destroy(),\n            setRowControllers: (rowControllers: VerticalCalendarCellControllerTypes[]) => this.setRowControllers(rowControllers),\n            setDomRenderer     : (renderer: boolean)=> this.setDomRenderer(renderer),\n            getController     : () => this.getController(),\n            detach            : () => this.detach()\n        };\n        this.controller.setComponent(component);\n\n\n    }\n\n    getController(): IRowControllerWrapper {\n        return this.controller\n    }\n\n    setDomRenderer(renderer: boolean):void {\n        this.domRendered = renderer;\n    }\n    isDomRenderer(): boolean {\n        return this.domRendered;\n    }\n\n    public setRowControllers(rowControllers: VerticalCalendarCellControllerTypes[]): void {\n        const previousRowComponent = { ...this.cellComponents };\n\n\t\tthis.cellComponents = {};\n\t\trowControllers.forEach((rowController) => {\n\t\t\tconst instanceID = rowController.getInstanceId();\n\t\t\tconst RowComponentExist = previousRowComponent[instanceID];\n\t\t\tif (RowComponentExist) {\n\t\t\t\tthis.cellComponents[instanceID] = RowComponentExist;\n\t\t\t\tdelete previousRowComponent[instanceID];\n\t\t\t} else {\n\t\t\t\tthis.newComponent(rowController);\n\t\t\t}\n\t\t});\n\n\t\tObject.values(previousRowComponent).forEach((oldRowComp: any) => {\n\t\t\tthis.getGui().removeChild(oldRowComp.getGui());\n\t\t\toldRowComp.detach();\n\t\t\toldRowComp.destroy();\n\t\t});\n\n    }\n\n   \n    private newComponent(controller: VerticalCalendarCellControllerTypes) {\n\t\tconst instanceID = controller.getInstanceId();\n\t\tconst rowComponent = new VerticalCalendarCellComponent(controller,this.getGui());\n\t\tthis.cellComponents[instanceID] = rowComponent;\n\t\tthis.appendChild(rowComponent);\n\t\trowComponent.setDomRenderer(true);\n\t\tcontroller.afterGuiAttached();\n\n\n\t}\n\n    init(){\n        const template = VerticalCalendarRowComponent.getTemplate();\n        this.setTemplate(template);\n    }\n\n\n\n    afterGuiAttached(): void {\n\n    }\n\n    destroy(): void {\n        super.destroy();\n        const comps = Object.values(this.cellComponents).filter(comp => comp != null);\n        this.destroyCells(comps);\n        this.detach();\n\n    }\n\n    destroyCells(cells: VerticalCalendarCellComponentTypes[]): void {\n        cells.forEach(cell => {\n            if (!cell) { return; }\n\n            const instanceId = cell?.getController()?.getInstanceId() as string;\n            if (this.cellComponents[instanceId] !== cell) {return; }\n\n            cell.destroy();\n            cell.detach();\n            this.cellComponents[instanceId] = null;\n        });\n\n    }\n\n    \n    detach(): void {\n        this.setGui(null as any);\n    }\n}","import { EventEmitter } from \"@dg/corecomponent\";\nimport { VerticalCalendarRowComponentTypes, VerticalCalendarRowControllerTypes } from \"./vertical-calendar-row-component.types\";\nimport { IWeekNode } from \"../../data-structure/calendar-weeknode.types\";\nimport { VerticalCalendarCellControllerTypes } from \"../vertical-calendar-cell-component/vertical-calendar-cell-component.types\";\nimport { VerticalCalendarCellController } from \"../vertical-calendar-cell-component/vertical-calendar-cell-controller\";\nimport { BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n\n\n\n\n\nclass VerticalCalendarRowController extends EventEmitter implements VerticalCalendarRowControllerTypes{\n\n\n    \n    private component!  : VerticalCalendarRowComponentTypes  | null;\n    private weekNode!   : IWeekNode | null;\n    private instanceId !: string | null;\n    private cellControllers: VerticalCalendarCellControllerTypes[] = [];\n    private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    constructor(weekNode : IWeekNode,instanceId: string = '', getBeanInstanceByBeanName : getBeanInstanceByBeanName) {\n        super();\n        this.weekNode   = weekNode\n        this.instanceId = instanceId;\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n\n\n    }\n\n\n    setComponent(component: VerticalCalendarRowComponentTypes): void {\n        this.component = component;\n        this.setTop();\n        this.initialize();\n        this.setHieght();\n    }\n\n    private setHieght():void{\n        const element = this.getElement();\n        const optionsHandler  = this.getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER)\n        const height =  optionsHandler.getDefaultRowHeight()\n        if(height){ \n            element.style.height = `${height}px`\n        }\n    }\n\n    initialize(): void {\n        this.createCellControllers();\n    }\n\n    createCellControllers(): void {\n        const dayNodes = this.weekNode?.getAllDayNodes();\n        //  thiscellControllers :VerticalCalendarCellControllerTypes[]=[]\n        if (dayNodes) {\n            dayNodes.forEach((dayNode) => {\n               const cellController: VerticalCalendarCellControllerTypes = new VerticalCalendarCellController(dayNode, this.getBeanInstanceByBeanName);\n               this.cellControllers.push(cellController);\n            });\n        }\n        this.component?.setRowControllers(this.cellControllers);\n\n    }\n\n    getElement(): HTMLElement {\n        return this.component?.getGui() as HTMLElement;\n    }\n\n\n    getInstanceId(): string {\n        return this.instanceId as string;\n    }\n\n    setTop():void{\n        if (this.weekNode) {\n            const topPosition = this.weekNode.getTopPosition();\n            this.getElement().style.transform = `translateY(${topPosition}px)`;\n        }\n    }\n\n    afterGuiAttached(): void {\n\n\n    }\n\n    destroy(): void {\n\t\tthis.destroyPass();\n\t\tsuper.destroy();\n\n\n        this.weekNode = null\n        this.component = null;\n        this.instanceId = null;\n        this.cellControllers = [];\n\n\n\t}\n\n\tdestroyPass() {\n        this.cellControllers.forEach((cellController) => {\n            cellController.destroy();\n        });\n\t}\n    \n}\n\nexport {\n    VerticalCalendarRowController\n}","import {  PostConstruct, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent\";\nimport { VerticalCalendarRowContainerController } from \"./vertical-calendar-rows-container-controller\";\nimport { VerticalCalendarRowComponentTypes, VerticalCalendarRowControllerTypes } from \"../vertical-calendar-row-component/vertical-calendar-row-component.types\";\nimport { VerticalCalendarRowComponent } from \"../vertical-calendar-row-component/vertical-calendar-row-component\";\nimport { RowControllerWrapper } from \"../../core/common-controllers/row/row-controller-wrapper\";\nimport { CalendarType } from \"../../vertical-calendar-configuration\";\nimport type { VerticalCalendarRowContainerComponentTypes } from \"./vertical-calendar-rows-container-componet.types\";\n\n\n\nexport class VerticalCalendarRowContainerComponent extends Component {\n\n    @queryAssignedNodes('verticalCalendarRef') verticalCalendarElement!: HTMLElement;\n    static template: HTMLElement;\n    static getTemplate: () => HTMLElement;\n\tprivate rowComponents: { [id: string]: VerticalCalendarRowComponentTypes | null} = {};\n\n\t// @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\n\n\n    @PostConstruct()\n    init(): void {\n        const template = VerticalCalendarRowContainerComponent.getTemplate();\n        this.setTemplate(template);\n\n        const component: VerticalCalendarRowContainerComponentTypes = {\n            getElement: () => this.getGui(),\n            destroy: () => this.destroy(),\n            getNegativeLayerElement: () => this.verticalCalendarElement,\n            setRowControllers :(rowControllers: VerticalCalendarRowControllerTypes[]) =>this.setRowControllers(rowControllers),\n        };\n\n        const controller = this.createManagedBean(new VerticalCalendarRowContainerController());\n        controller.setComponent(component);\n\n    }\n\n    afterGuiAttached(): void {\n\n    }\n    public appendChild( newChild: Component | HTMLElement, _container?: HTMLElement | undefined, ): void {\n\t\tsuper.appendChild(newChild, this.verticalCalendarElement);\n\t}\n\n    private setRowControllers(rowControllers: VerticalCalendarRowControllerTypes[]): void {\n        const previousRowComponent = { ...this.rowComponents };\n\n\t\tthis.rowComponents = {};\n\t\trowControllers.forEach((rowController) => {\n\t\t\tconst instanceID = rowController.getInstanceId();\n\t\t\tconst RowComponentExist = previousRowComponent[instanceID];\n            const calendarType = this.optionsHandler.getCalendarType();\n\t\t\tif (calendarType === CalendarType.verticalMonth &&  RowComponentExist) {\n\t\t\t\tthis.rowComponents[instanceID] = RowComponentExist;\n\t\t\t\tdelete previousRowComponent[instanceID];\n\t\t\t} else {\n\t\t\t\tthis.newComponent(rowController);\n\t\t\t}\n\t\t});\n\n\t\tObject.values(previousRowComponent).forEach((oldRowComp: any) => {\n            if (!oldRowComp.getGui()) { return; }\n\t\t\tthis.verticalCalendarElement.removeChild(oldRowComp.getGui());\n\t\t\toldRowComp.detach();\n\t\t\toldRowComp.destroy();\n\t\t});\n\n    }\n\n    private newComponent(controller: VerticalCalendarRowControllerTypes) {\n\t\tconst instanceID = controller.getInstanceId();\n\t\tconst rowControllerWrapper = RowControllerWrapper(controller);\n\t\tconst rowComponent = new VerticalCalendarRowComponent(\n\t\t\trowControllerWrapper);\n\t\tthis.rowComponents[instanceID] = rowComponent;\n\t\tthis.appendChild(rowComponent);\n\t\trowComponent.setDomRenderer(true);\n\t\tcontroller.afterGuiAttached();\n\n\n\t}\n   \n\n    \n\n    protected destroy(): void {\n        // super.destroy();\n        const comps = Object.values(this.rowComponents).filter(comp => comp != null);\n        this.destroyRows(comps);\n        \n    }\n\n\tprotected destroyRows(rows : VerticalCalendarRowComponentTypes[]): void {\n\t\trows.forEach(row => {\n            if (!row) { return; }\n\n            const instanceId = row?.getController()?.getInstanceId() as string;\n            if (this.rowComponents[instanceId] !== row) {return; }\n\n            row.destroy();\n            row.detach();\n            this.rowComponents[instanceId] = null;\n        });\n\t}\n}\n\n","import { EventEmitter } from \"@dg/corecomponent\";\nimport { AutoWired, BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n\n\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"../../constant/vertical-calendar-bean-name-constant\";\nimport { IControllerHandler } from \"../../core/common-controllers/controller-handler/controller-handler.types\";\nimport { VERTICAL_CALENDAR_EVENT_NAME } from \"../../constant/vertical-calendar-event-name\";\nimport { INavigatorInteractor } from \"../../core/navigators/calendar-navigator-interactor.types\";\nimport { RowRendererTypes } from \"../../core/common-controllers/row/row-renderer-controller.types\";\nimport { CalendarType } from \"../../vertical-calendar-configuration\";\nimport { CalendarEventDragDrop } from \"../../core/drag-and-drop/drag-and-drop-handler\";\nimport { IEventDataManager } from \"../../data-structure/events-data-manager/events-data-manager.types\";\nimport { VerticalCalendarAPITypes } from \"../../api/vertical-calendar-api.types\";\nimport type {\n  VerticalCalendarRowContainerComponentTypes,\n  VerticalCalendarRowContainerControllerTypes,\n} from \"./vertical-calendar-rows-container-componet.types\";\n\n// import { RowComponentController } from \"../../core/common-controllers/row-component-controller\";\n\n\n\n\nclass VerticalCalendarRowContainerController extends EventEmitter implements VerticalCalendarRowContainerControllerTypes {\n\n    // @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.DATA_BLOCK) private dataBlock!: ICalendarDataStore;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.CONTROLLER_HANDLER) private controlller!: IControllerHandler;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.NAVIGATOR_INTERACTOR) private navigationInteractor!: INavigatorInteractor;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.ROW_RENDERER) private rowRendererController!: RowRendererTypes;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.EVENT_MANGER) private eventManager!: IEventDataManager;\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.API) private calendarAPi!: VerticalCalendarAPITypes;\n\t@AutoWired(BEAN_NAME.BEANS) getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\n\n    private component!: VerticalCalendarRowContainerComponentTypes;\n\n\n\n    setComponent(component: VerticalCalendarRowContainerComponentTypes): void {\n        this.component = component;\n        this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.DISPLAY_ROWS, this.onDisplayRow.bind(this));\n        this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.SET_INNER_LAYER_TOP , this.setScrollTop.bind(this));\n        this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.UPDATE_SCROLLTOP, this.onViewPortChange.bind(this));\n        this.addListener(this.eventHandler, VERTICAL_CALENDAR_EVENT_NAME.DESTROY_ROWS_CONTROLERS, this.destroy.bind(this));\n\n        this.init()\n\n        this.controlller.registerController(this);\n        this.setScrollTop();\n        this.setInnerLayerTop();\n        this.registerEvents();\n        this.setEventDragAndDropHandler()\n        // this.addStyle();\n    }\n\n    setEventDragAndDropHandler():void{\n\n         \n\n        new CalendarEventDragDrop({\n            calendarElement:this.getElement(), // Your calendar container\n            onEventDrop: (eventId, newStart, newEnd) => {\n                const eventObject = this.eventManager.getEventByID(eventId);\n                // this.cleanupGhostElements()\n                eventObject?.setStartTime(new Date(newStart));\n                eventObject?.setEndTime(new Date(newEnd));\n\n                const params = {\n                    id             : eventObject?.id as string,\n                    title          : eventObject?.title as string,\n                    startTime      : eventObject?.getStartTime().toISOString()! ,\n                    endTime        : eventObject?.getEndTime().toISOString()! ,\n                    color         : eventObject?.color!,\n                    isAllDay      : eventObject?.isAllDay()!\n\n                }\n\n                console.log(params)\n\n                this.calendarAPi.updateEvents([params],(event)=>{\n                    this.optionsHandler.onEventDrop(event)\n\n                }\n                ,()=>{})\n                \n\n\n              console.log('Event dropped:', {\n                eventId,\n                newStart,\n                newEnd\n              });\n            }\n            \n          },this.getBeanInstanceByBeanName);\n    }\n\n    addStyle(): void {\n        const calendarType = this.optionsHandler.getCalendarType();\n        if(calendarType === CalendarType.horizontalMonth){\n            const element = this.getElement();\n            element.style.overflowY = 'hidden';\n            element.style.scrollBehavior = 'unset';\n        }\n    }\n\n    onViewPortChange(): void {\n        const calendarType = this.optionsHandler.getCalendarType();\n        if(calendarType === CalendarType.horizontalMonth){\n            return\n        }\n        this.setInnerLayerTop();\n        this.setScrollTop();\n    }\n\n    init():void{\n\n    }\n\n    registerEvents():void{\n        const element = this.getElement();\n        element.addEventListener('scroll', this.navigationInteractor.onScroll!.bind(this.navigationInteractor));\n    }\n\n    setScrollTop(): void {\n        const calendarType = this.optionsHandler.getCalendarType();\n        if(calendarType === CalendarType.horizontalMonth){\n            return\n        }\n\n        const element = this.getElement();\n        const scrollTop = this.navigationInteractor.getScrollTop!();\n\n        element.scrollTop = scrollTop;\n\n    }\n\n    setInnerLayerTop():void{\n        const calendarType = this.optionsHandler.getCalendarType();\n        if(calendarType === CalendarType.horizontalMonth){\n            return\n        }\n        const element = this.getNegativeLayerElement();\n        const top = this.navigationInteractor.getInnerLayerTopOffset!();\n\n\n        element.style.top = `${top}px`;\n\n    }\n\n    onDisplayRow(){\n        const rowControllers = this.rowRendererController.getRowControllers();\n        this.component.setRowControllers(rowControllers);\n\n    }\n\n    getNegativeLayerElement(): HTMLElement {\n        return this.component.getNegativeLayerElement();\n    }\n\n\n\n    getElement(): HTMLElement {\n        return this.component.getElement();\n    }\n\n    destroy():void{\n        super.destroy();\n        const rowControllers = this.rowRendererController.getRowControllers();\n        rowControllers.forEach((rowController) => {\n            rowController.destroy();\n        });\n\n        this.component.destroy();\n\n    }\n\n     cleanupGhostElements() {\n      // Remove any remaining ghost elements from the DOM\n      const ghostElements = document.querySelectorAll('.drag-ghost');\n      ghostElements.forEach(ghost => {\n        if (ghost.parentNode) {\n          ghost.remove();\n        }\n      });\n    }\n}\n\nexport {\n    VerticalCalendarRowContainerController\n}\n","import { PostConstruct } from \"@dg/corecomponent\";\nimport { Component } from \"@dg/corecomponent\";\nimport { weekHeaderController } from \"./vertical-calendar-week-header-controller\";\n\n\n\nclass weekHeaderComponent extends Component{\n    static template: HTMLElement;\n    static getTemplate: (properties:any) => HTMLElement;\n\n     @PostConstruct()\n     init(){\n\n        const controller = new weekHeaderController();\n        const properties = controller.getProperties();\n        \n        const template = weekHeaderComponent.getTemplate(properties);\n        this.setTemplate(template);\n\n        controller.setComponent(this);\n\n    }\n\n\n}\n\n\nexport {\n    weekHeaderComponent\n}","import { EventEmitter } from \"@dg/corecomponent\";\n\n\nconst WEEK_NAMES = {\n    W : ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n    WWW : ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n    WWWW : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n}\n\nclass weekHeaderController extends EventEmitter{\n    private component: any;\n    private weekHeader: string[] = WEEK_NAMES.WWW // need to change dynamic\n\n    setComponent(component: any): void {\n        this.component = component;\n    }\n\n    getGui(): HTMLElement {\n        return this.component.getGui();\n    }\n\n    getProperties(): any {\n        return {\n            weekCounts : this.weekHeader\n        }\n    }\n\n}\n\nexport{\n    weekHeaderController\n}","import { FetchSourceFunction } from \"./core/event-handler/adaptor/fetch-source-adaptor\";\n\ninterface RecurrenceRule {\n    frequency : 'daily' | 'weekly' | 'monthly' | 'yearly';\n    interval ?: number;                                     // every N units (e.g., every 2 days)\n    count    ?: number;                                     // how many occurrences\n    until    ?: Date;                                       // or until a certain date\n    byDay    ?: string[];                                   // for weekly: ['MO', 'WE', 'FR']\n  }\n  \n\n\n// Individual calendar event\n interface IEventData {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Event ID.\"\n\t*\t})\n\t*/\n    id             : string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Event title.\"\n\t*\t})\n\t*/\n    title          : string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Event start time.\"\n\t*\t})\n\t*/\n    startTime      : string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Event end time.\"\n\t*\t})\n\t*/\n    endTime        : string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Event description.\"\n\t*\t})\n\t*/\n    description   ?: string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Event color.\"\n\t*\t})\n\t*/\n    color         ?: string;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Whether the event is all day.\"\n\t*\t})\n\t*/\n    isAllDay      ?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Whether the event is recurring.\"\n\t*\t})\n\t*/\n    isRecurring   ?: boolean;\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Recurrence rule.\"\n\t*\t})\n\t*/\n    recurrenceRule?: RecurrenceRule;\n}\n\n\n\nexport const CalendarType = {\n    verticalMonth  : \"vertical_month\",\n    verticalWork   : \"vertical_work\",\n    verticalTwoWeek: \"vertical_twoWeek\",\n\n    horizontalWeek     : \"horizontal_week\",\n    horizontalThreeDays: \"horizontal_threeDays\",\n    horizontalDay      : \"horizontal_day\",\n    horizontalMonth    : \"horizontal_month\",\n\n    horizontalWeekTimeLine     : \"horizontal_week_timeLine\",\n    horizontalThreeDaysTimeLine: \"horizontal_threeDays_timeLine\",\n    horizontalDayTimeLine      : \"horizontal_day_timeLine\"\n}\n\nexport type CalendarTypeKeys = typeof CalendarType[keyof typeof CalendarType];\n\n// Represents a single date and its metadata in the calendar grid\n interface CalendarDateType {\n    date: Date | null;\n    events ?: IEventData[];\n    isCurrentMonth: boolean;\n    isToday: boolean;\n    isSelected: boolean;\n}\n\n// Configuration interface for Vertical Calendar\n interface VerticalCalendarConfigurationType {\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Default height for calendar rows in pixels.\"\n\t*\t})\n\t*/\n    defaultRowHeight : number;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Whether to show weekend days in the calendar.\"\n\t*\t})\n\t*/\n    showWeekends     : boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"First day of the week (0 for Sunday, 1 for Monday, etc.).\"\n\t*\t})\n\t*/\n    startDayOfWeek   : number;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"locale\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"IANA timezone string for date calculations.\"\n\t*\t})\n\t*/\n    timezone        ?: string;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"locale\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Locale string for date/time formatting.\"\n\t*\t})\n\t*/\n    locale          ?: string;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Initial visible date with year, month, and optional day.\"\n\t*\t})\n\t*/\n    visibleDate     ?: {\n        year: number;\n        month: number;\n        day?: number;\n    };\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Calendar view mode: 'month', 'week', or 'day'.\"\n\t*\t})\n\t*/\n    viewMode             ?: 'month' | 'week' | 'day';\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"First day of the week (0 for Sunday, 1 for Monday, etc.).\"\n\t*\t})\n\t*/\n    weekStartsOn         ?: number;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Whether to show the 'Today' navigation button.\"\n\t*\t})\n\t*/\n    showTodayButton      ?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Whether to show previous/next navigation buttons.\"\n\t*\t})\n\t*/\n    showNavigationButtons?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Whether to allow events to overlap on the same time slot.\"\n\t*\t})\n\t*/\n    allowEventOverlap    ?: boolean;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Initial date to display in the calendar.\"\n\t*\t})\n\t*/\n    initialDate          ?: Date;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Start date of the displayable range.\"\n\t*\t})\n\t*/\n    rangeFrom            ?: Date;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"navigation\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"End date of the displayable range.\"\n\t*\t})\n\t*/\n    rangeTo              ?: Date;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Number of months to pre-render as buffer.\"\n\t*\t})\n\t*/\n    bufferMonth          ?: number;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Type of calendar view (vertical/horizontal month, week, day, etc.).\"\n\t*\t})\n\t*/\n    calendarType          : CalendarTypeKeys;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Async function to fetch event data.\"\n\t*\t})\n\t*/\n    fetchSourceFunction  ?: () => Promise<IEventData[]>;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Event data array or fetch function.\"\n\t*\t})\n\t*/\n    eventsData : FetchSourceFunction | IEventData[];\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Maximum number of event blocks per cell.\"\n\t*\t})\n\t*/\n    maxBlocks            ?: number;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"data\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Granularity for fetching events: 'week', 'month', or 'year'.\"\n\t*\t})\n\t*/\n    fetchType            ?: 'week' | 'month' | 'year';\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"performance\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Maximum number of events to fetch at once.\"\n\t*\t})\n\t*/\n    maxFetchSize         ?: number;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Maximum number of visible events per cell before showing ellipsis.\"\n\t*\t})\n\t*/\n    maxVisibleEvents     ?: number;\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback when clicking the event ellipsis (more events indicator).\"\n\t*\t})\n\t*/\n    onClickEventEllipsis ?: (events : any)=>{\n\n    }\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback when an event is dropped after drag.\"\n\t*\t})\n\t*/\n    onEventDrop?:(events : any)=>{\n\n    }\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback during start date resize.\"\n\t*\t})\n\t*/\n    onEventStartDateResize?:(event : any)=>void\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback during end date resize.\"\n\t*\t})\n\t*/\n    onEventEndDateResize?:(event : any)=>void\n    \n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback when start date resize completes.\"\n\t*\t})\n\t*/\n    onEventStartDateResizeEnd?:(event : any)=>void\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback when end date resize completes.\"\n\t*\t})\n\t*/\n    onEventEndDateResizeEnd?:(event : any)=>void\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback when start date resize begins.\"\n\t*\t})\n\t*/\n    onEventStartDateResizeStart?:(event : any)=>void\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback when end date resize begins.\"\n\t*\t})\n\t*/\n    onEventEndDateResizeStart?:(event : any)=>void\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback during start date resize movement.\"\n\t*\t})\n\t*/\n    onEventStartDateResizeMove?:(event : any)=>void\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"events\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Callback during end date resize movement.\"\n\t*\t})\n\t*/\n    onEventEndDateResizeMove?:(event : any)=>void\n\n\t/**\n\t*\t@feedMcp_config({\n\t*\t\"category\": \"display\",\n\t*\t\"viewType\": [\"calendar\"],\n\t*\t\"description\": \"Date display format string.\"\n\t*\t})\n\t*/\n    dateDisplayFormat : string;\n    \n}\n\nexport{\n    VerticalCalendarConfigurationType,\n    CalendarDateType,\n    IEventData\n}\n","import { AutoWired, BEAN_NAME, Bean, } from \"@dg/corecomponent\";\nimport { DGEvent, EventHandler } from \"@dg/corecomponent\";\nimport { VerticalCalendarAPITypes } from \"./api/vertical-calendar-api.types\";\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"./constant/vertical-calendar-bean-name-constant\";\n\n@Bean(BEAN_NAME.EVENT_HANDLER)\nexport class VerticalCalendarEventHanlder extends EventHandler {\n    @AutoWired(VERTICAL_CALENDAR_BEAN_NAME.API) apiHandler !: VerticalCalendarAPITypes;\n    dispatchEvent(event: DGEvent): void {\n        let dgEvent = event as any;\n\t\tif (this.optionHandler) {\n\t\t\tdgEvent.instanceAPI = this.apiHandler;\n\t\t}\n\n\t\tthis.dispatchToListeners(dgEvent, true);\n\t\tthis.dispatchToListeners(dgEvent, false);\n\n\t\tthis.firedEvents[dgEvent.type] = true;\n    }\n}","import { Context } from \"@dg/corecomponent\";\n\nimport { VERTICAL_CALENDAR_BEAN_NAME } from \"./constant/vertical-calendar-bean-name-constant\";\nimport { VerticalCalendarAPITypes } from \"./api/vertical-calendar-api.types\";\nimport { IUserParams, VerticalCalendarCoreComponent } from \"./core/vertical-calendar-core-component\";\nimport { VerticalCalendarConfigurationType } from \"./vertical-calendar-configuration\";\n\n\n\nexport class VerticalCalendar {\n\tpublic api: VerticalCalendarAPITypes | undefined;\n\tconstructor(verticalCalendarContainer : HTMLElement, verticalCalendarOptions : VerticalCalendarConfigurationType, params : IUserParams = {}) {\n\t\tconst setContextAPI = (context : Context) => {\n\t\t\tthis.api = context.getBean(VERTICAL_CALENDAR_BEAN_NAME.API) as VerticalCalendarAPITypes;\n\t\t};\n\t\tnew VerticalCalendarCoreComponent().initializeVerticalCalendar(verticalCalendarContainer,verticalCalendarOptions,'vertical',setContextAPI,params);\n\t}\n}","import { AutoWired, EventEmitter } from \"@dg/corecomponent\";\nimport { GridSerializer } from \"./grid-serializer\";\nimport { IGridSerializing } from \"./grid-serializing.types\";\n\nexport abstract class BaseCreator<T, P, S extends IGridSerializing<T,P>, V> extends EventEmitter {\n    @AutoWired('gridSerialiser') private gridSerializer: GridSerializer;\n    protected getFileName(fileName?: string): string {\n        const extension = this.getDefaultFileExtension();\n\n        if (fileName == null || !fileName.length) {\n            fileName = this.getDefaultFileName();\n        }\n\n        return fileName.indexOf('.') === -1 ? `${fileName}.${extension}` : fileName;\n    }\n\n    protected getData(params: V): T {\n        const serializingSession = this.createSerializingSession(params);\n        return this.gridSerializer.serialize(params, serializingSession);\n    }\n\n    public getDefaultFileName(): string {\n        return `export.${this.getDefaultFileExtension()}`;\n    }\n\n    public    abstract createSerializingSession(params?: V)      : S;\n    public    abstract getDefaultFileExtension()                 : string;\n    public    abstract isExportSuppressed()                      : boolean;\n    protected abstract export(userParams?: V, compress?: boolean): void;\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, Optional, PostConstruct } from \"@dg/corecomponent\";\nimport { CellRangeType, IRangeSelectionHandler } from \"../rangeselection/range-selection-handler.types\";\nimport { CellClearType, IClipBoardCellRanges, IClipBoardCopyEventParams, IClipBoardCutEventParams, IClipBoardEventParams, IClipBoardParams, IClipBoardPasteEventParams, IClipBoardPasteParams, ICopyCutEventParams, IPasteEventParams } from \"./clipboard-handler.types\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IControllerHandler } from \"../Grid/Core/Interface/IControllerHandler\";\nimport { GridController } from \"../Grid/GridComponent/GridController\";\nimport { CSVcreator } from \"./csv-creator\";\nimport { RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { TableCreator } from \"./table-creator\";\nimport { selectRange } from \"../Grid/Core/utils/Dom\";\nimport { IRowSelectionHandler } from \"../Selection/row-selection-handler.types\";\nimport { IFocusHandler } from \"../Grid/Core/Navigation/focus-handler.types\";\nimport { ICellAPIManager, IColumnAPIManager } from \"../Grid/Main\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { IHookManager } from \"../Grid/Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../Grid/Core/Hooks/Constants/HookEventsName\";\nimport { IColumnSelection } from \"../Selection/column-selection.types\";\nimport { areArraysEqual } from \"../Grid/Core/utils/Object\";\nimport { IRowMeta } from \"../Grid/API/CommonAPIInterface\";\nimport { SelectedRowRange } from \"../Selection/row-selection/row-selection.types\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\n@Bean('clipBoardHandler')\nexport class ClipBoardHandler extends EventEmitter {\n    @Optional  ('rangeSelectionHandler') private rangeSelectionHandler     : IRangeSelectionHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler             : GridOptioHandler;\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler: IControllerHandler;\n    @AutoWired('csvCreator') private csvCreator                            : CSVcreator;\n    @AutoWired('tableCreator') private tableCreator                        : TableCreator;\n    @Optional  ('RowSelectionHandler') private rowSelectionHandler         : IRowSelectionHandler;\n    @Optional  ('columnSelection') private columnSelectionHandler          : IColumnSelection;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler        : IRecordHandler;\n    @AutoWired('focusHandler') private focusHandler                        : IFocusHandler;\n    @AutoWired(GRID_BEAN_NAME.CELL_API) private cellAPI                    : ICellAPIManager;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler          : FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) private hookManager            : IHookManager;\n    @AutoWired(GRID_BEAN_NAME.COLUMN_API) private columnAPI                : IColumnAPIManager;\n\n    private clipBoardHookwrapper : any;\n\n\n\n    private gridController: GridController;\n\n    @PostConstruct()\n    init(): void {\n        this.controllerHandler.onAfterGridReady((params) => {\n            this.gridController = params.gridController;\n        });\n\n        this.clipBoardHookwrapper = new ClipBoardHandler.ClipboardHookWrapper(this, this.hookManager);\n        this.addDestroyFunc(() => {\n            this.clipBoardHookwrapper = null;\n        })\n    }\n\n    public copyToClipboard(params: IClipBoardParams): void {\n        this.copyOrCutToClipboard(params, false);\n    }\n\n    public copyOrCutToClipboard(params: IClipBoardParams = {}, cut?: boolean): void {\n        let cellClearType;\n        let { includeGroupHeaders, includeHeaders } = params;\n\n        if (includeHeaders === null) {\n            includeHeaders = this.optionHandler.shouldCopyHeadersToClipboard();\n        }\n\n        if (includeGroupHeaders === null) {\n            includeGroupHeaders = this.optionHandler.shouldCopyGroupHeadersToClipboard();\n        }\n\n        const updatedParams = { ...params, includeHeaders, includeGroupHeaders };\n\n        const doCopyCallBack = (type) => {\n            if(type === CellClearType.CellRange) {\n                this.exportRangeToClipboard(updatedParams, cut);\n            }else if(type === CellClearType.SelectedRows) {\n                this.exportRowSelectionToClipboard(updatedParams, cut);\n            }else if(type === CellClearType.SelectedColumns) {\n                this.exportColumnSelectionToClipboard(updatedParams, cut);\n            }else if(type === CellClearType.FocusedCell) {\n                this.exportFocusedCellToClipboard(updatedParams, cut);\n            }\n        }\n        \n        if (this.rangeSelectionHandler && !this.rangeSelectionHandler.isEmpty() && this.rangeSelectionHandler.hasMultipleCells()) {\n            cellClearType = CellClearType.CellRange;\n        }else if(this.rowSelectionHandler && !this.rowSelectionHandler.isEmpty() ) {\n            cellClearType = CellClearType.SelectedRows;\n        } else if(this.hasValidColumnSelection()) {\n            cellClearType = CellClearType.SelectedColumns\n        } else if(this.focusHandler.hasAnyCellFocused()) {\n            cellClearType = CellClearType.FocusedCell;\n        }\n\n        if(cut && cellClearType !== undefined) {\n            this.clearCellsAfterCopy(params,cellClearType, doCopyCallBack);\n        }else {\n            doCopyCallBack(cellClearType);\n        }\n    }\n\n    public pasteFromClipboard(params : IClipBoardPasteParams) : void {\n        const doPaste = (event : any) => {\n            let cellClearType;\n            const clipboardData = event.clipboardData;\n            const textData = clipboardData.getData('text'); //No I18N\n            const data = ClipBoardHandler.stringToArray(textData, '\\t');\n\n            if (this.rangeSelectionHandler && !this.rangeSelectionHandler.isEmpty() && this.rangeSelectionHandler.hasMultipleCells()) {\n                cellClearType = CellClearType.CellRange;\n            }else if(this.rowSelectionHandler && !this.rowSelectionHandler.isEmpty() ) {\n                cellClearType = CellClearType.SelectedRows;\n            } else if(this.hasValidColumnSelection()) {\n                cellClearType = CellClearType.SelectedColumns\n            } else if(this.focusHandler.hasAnyCellFocused()) {\n                cellClearType = CellClearType.FocusedCell;\n            }\n            const callback = () => {\n            \n            }\n            const pasteParams : IClipBoardPasteEventParams = {\n                ...params,\n                event,\n                selectionType : (cellClearType === CellClearType.CellRange || cellClearType === CellClearType.FocusedCell) ? 'rangeSelection' : ((cellClearType === CellClearType.SelectedRows) ? 'rowSelection' : 'columnSelection'),\n            }\n            this.clipBoardHookwrapper.pasteData(pasteParams, data, callback);\n            document.removeEventListener('paste', doPaste);\n        }\n        document.addEventListener('paste', doPaste);\n    }\n\n    private clearCellsAfterCopy(params : IClipBoardParams, type: CellClearType, copyCallback: CallableFunction) {\n        const callBack = () => {\n            copyCallback(type);\n            if(type === CellClearType.CellRange) {\n                this.rangeSelectionHandler && this.rangeSelectionHandler.clearCellRangeCellValues(null, 'clipboard');\n            }else if(type === CellClearType.SelectedRows) {\n                this.rowSelectionHandler && this.rowSelectionHandler.clearRowsCellValues('clipboard', params.event);\n            }else if(type === CellClearType.SelectedColumns) {\n                this.clearSelectedColumns(params);\n            }else if(type === CellClearType.FocusedCell) {\n                this.clearFocusedCell();\n            }\n        }\n\n        const cutHookParams : IClipBoardCutEventParams = {\n            ...params,\n            selectionType : (type === CellClearType.CellRange || type === CellClearType.FocusedCell) ? 'rangeSelection' : ((type === CellClearType.SelectedRows) ? 'rowSelection' : 'columnSelection')\n        }\n        \n\n        this.clipBoardHookwrapper.cutData(cutHookParams, callBack);\n    }\n\n    private clearFocusedCell() : void {\n        const focusedCell = this.focusHandler.getFocusedCellPosition();\n\n        if(!focusedCell) {\n            return;\n        }\n\n        const rowNode = this.getRowNode(focusedCell);\n\n        if(rowNode) {\n            const index = rowNode.getRowMeta();\n            this.cellAPI.clearDataInRanges([{\n                columnIds : [focusedCell.columnID],\n                endRow : index,\n                startRow : index\n            }], {}, {eventOrigin : 'clipboard'});\n        }\n\n\n    }\n\n    clearSelectedColumns(params : IClipBoardParams) : void {\n        if(!this.columnSelectionHandler) {\n            return;\n        }\n        const selectedColumns = this.columnSelectionHandler.getSelectedColumns();\n\n        this.columnAPI.clearColumnsById(selectedColumns, {}, {\n            eventOrigin : 'clipboard',\n            event : params.event\n        });\n    }\n\n    private getRowNode(row: RowPositionType): IRowNodeCore | null {\n        return this.recordHandler.getRowNodeByMeta(row);\n    }\n\n    \n\n    public exportRangeToClipboard(params: IClipBoardParams = {}, cut : boolean = false): void {\n        const callBack = () => {\n            const copyAsString = this.optionHandler.shouldCopyAsString();\n            const data = this.buildDataFromRanges(params, copyAsString);\n            this.copyDataToClipboardLegacy(data, copyAsString ? \"string\" : \"Element\");\n        }\n\n        const copyHookParams : IClipBoardCopyEventParams = {\n            ...params,\n            selectionType : 'rangeSelection'\n        }\n\n        cut ? callBack() :this.clipBoardHookwrapper.copyData(copyHookParams, callBack);\n    }\n\n    public exportRowSelectionToClipboard(params :IClipBoardParams = {}, cut : boolean = false) : void {\n        const callBack = () => {\n            const copyAsString = this.optionHandler.shouldCopyAsString();\n            const data = this.buildDataFromRowSelections(params, copyAsString);\n            this.copyDataToClipboardLegacy(data, copyAsString ? \"string\" : \"Element\");\n        }\n        const copyHookParams : IClipBoardCopyEventParams = {\n            ...params,\n            selectionType : 'rowSelection'\n        }\n        cut ? callBack() :this.clipBoardHookwrapper.copyData(copyHookParams, callBack);\n    }\n\n    public exportColumnSelectionToClipboard(params :IClipBoardParams = {}, cut : boolean = false) : void {\n        const callBack = () => {\n            const copyAsString = this.optionHandler.shouldCopyAsString();\n            const data = this.buildDataFromColumnSelections(params, copyAsString);\n            this.copyDataToClipboardLegacy(data, copyAsString ? \"string\" : \"Element\");\n        }\n        const copyHookParams : IClipBoardCopyEventParams = {\n            ...params,\n            selectionType : 'columnSelection',\n        }\n        cut ? callBack() :this.clipBoardHookwrapper.copyData(copyHookParams, callBack);\n    }\n\n    public exportFocusedCellToClipboard(params :IClipBoardParams = {}, cut : boolean = false) : void {\n        const callBack = () => {\n            const copyAsString = this.optionHandler.shouldCopyAsString();\n            const data = this.buildDataFromFocusedCell(params, copyAsString);\n            data && this.copyDataToClipboardLegacy(data, copyAsString ? \"string\" : \"Element\");\n        }\n        const copyHookParams : IClipBoardCutEventParams = {\n            ...params,\n            selectionType : 'rangeSelection'\n        }\n        cut ? callBack() :this.clipBoardHookwrapper.copyData(copyHookParams, callBack);\n    }\n\n    private buildDataFromFocusedCell(params : IClipBoardParams = {}, copyAsString : boolean) : (string | HTMLElement)[] | undefined {\n        const focusedCell = this.focusHandler.getFocusedCellPosition();\n        if (focusedCell == null) {\n            return undefined;\n        }\n\n        const data: (string | HTMLElement)[] = [];\n        const rowPositions = [{\n            rowIndex : focusedCell.rowIndex,\n            pinPosition : focusedCell.pinPosition,\n            parentKeys : focusedCell.parentKeys\n        }]\n        \n        const exportResult = this.buildExportParams({\n            columns : [focusedCell.columnID],\n            rowPositions,\n            includeHeaders: params.includeHeaders,\n            includeGroupHeaders: params.includeGroupHeaders,\n        }, copyAsString ? \"string\" : 'element');\n\n        if (typeof exportResult === 'string') {\n            data.push(exportResult);\n        } else {\n            data.push(exportResult);\n        }\n        \n        return data as (string | HTMLElement)[];\n    }\n\n    private buildDataFromRowSelections(params : IClipBoardParams, copyAsString : boolean) : (string | HTMLElement)[] {\n        const data: (string | HTMLElement)[] = [];\n\n        this.rowSelectionHandler.forEachSelectedRow((rowMeta) => {\n            const rowPositions = [rowMeta]\n            \n            const exportResult = this.buildExportParams({\n                rowPositions,\n                includeHeaders: params.includeHeaders,\n                includeGroupHeaders: params.includeGroupHeaders,\n            }, copyAsString ? \"string\" : 'element');\n    \n            if (typeof exportResult === 'string') {\n                data.push(exportResult);\n            } else {\n                data.push(exportResult);\n            }\n        })\n        \n        return data as (string | HTMLElement)[];\n    }\n\n    private buildDataFromColumnSelections(params : IClipBoardParams, copyAsString : boolean) : (string | HTMLElement)[] {\n        const selectedIds = this.columnSelectionHandler.getSelectedColumns();\n        const data: (string | HTMLElement)[] = [];\n\n        const cellRanges = [];\n        const callBack = (rowIndexMeta : IRowMeta) => {\n            const rowId   = this.recordHandler.getId(rowIndexMeta.rowIndex, rowIndexMeta.pinPosition, rowIndexMeta.parentKeys);\n            if(rowId) {\n                const rowNode = this.recordHandler.getRowNodeById(rowId)\n                const rowMeta = rowNode.getRowMeta();\n                cellRanges.push({\n                    ...rowMeta\n                });\n            }\n        }\n\n        this.iterateColumn(callBack);\n        const exportResult = this.buildExportParams({\n                columns            : selectedIds,\n                rowPositions       : cellRanges,\n                includeHeaders     : params.includeHeaders,\n                includeGroupHeaders: params.includeGroupHeaders,\n        }, copyAsString ? \"string\" : 'element');\n\n        if (typeof exportResult === 'string') {\n            data.push(exportResult);\n        } else {\n            data.push(exportResult);\n        }\n        \n        return data as (string | HTMLElement)[];\n    }\n\n    private buildDataFromRanges(params: IClipBoardParams, copyAsString : boolean): (string | HTMLElement)[] {\n        const ranges = this.rangeSelectionHandler.getCellRanges();\n        const data: (string | HTMLElement)[] = [];\n        ranges.forEach((range) => {\n            const rowPositions = this.rangeSelectionHandler.getRangeRowPositions(range);\n            \n            const exportResult = this.buildExportParams({\n                columns: range.columnIds,\n                rowPositions,\n                includeHeaders: params.includeHeaders,\n                includeGroupHeaders: params.includeGroupHeaders,\n            }, copyAsString ? \"string\" : 'element');\n    \n            if (typeof exportResult === 'string') {\n                data.push(exportResult);\n            } else {\n                data.push(exportResult);\n            }\n        });\n        \n        return data as (string | HTMLElement)[];\n    }\n    \n\n    private copyDataToClipboardLegacy(data: (string | HTMLElement)[], type : \"string\" | 'Element'): void {\n        this.executeOnTempElement((element) => {\n            const focusedElementBefore = document.activeElement as HTMLElement;\n\n            if (type === 'string') {\n                (element as HTMLTextAreaElement).value = data.join('\\n');\n            }\n            \n            if(type === 'Element') {\n                const self = this;\n                function doCopy(ev) {\n                    ev.stopPropagation();\n                    self.copyToClipBoardElement(data as HTMLElement[]);\n                    document.removeEventListener('copy', doCopy, true);\n                    document.removeEventListener('cut', doCopy, true);\n                }\n                document.addEventListener('copy', doCopy, true);\n                document.addEventListener('cut', doCopy, true);\n            }else {\n                (element as HTMLTextAreaElement).select();\n                (element as HTMLTextAreaElement).focus({ preventScroll: true });\n            }\n           \n\n            document.execCommand('copy');\n\n            if (focusedElementBefore && focusedElementBefore.focus) {\n                focusedElementBefore.focus({ preventScroll: true });\n            }\n        });\n    }\n\n    private executeOnTempElement( callbackNow: (element: HTMLTextAreaElement | HTMLDivElement) => void, callbackAfter?: (element: HTMLTextAreaElement | HTMLDivElement) => void ): void {\n        const tempElement = document.createElement('textarea');\n    \n        // Apply common styles\n        tempElement.style.width = '1px';\n        tempElement.style.height = '1px';\n        tempElement.style.top = `${document.documentElement.scrollTop}px`;\n        tempElement.style.left = `${document.documentElement.scrollLeft}px`;\n        tempElement.style.position = 'absolute';\n        tempElement.style.opacity = '0';\n    \n        const rootElement = this.gridController.getGui();\n    \n        rootElement.appendChild(tempElement);\n    \n        try {\n            callbackNow(tempElement);\n        } catch (err) {\n            console.warn(\"Browser does not support document.execCommand('copy') for clipboard operations\");\n        }\n    \n        if (callbackAfter) {\n            window.setTimeout(() => {\n                callbackAfter(tempElement);\n                rootElement.removeChild(tempElement);\n            }, 100);\n        } else {\n            rootElement.removeChild(tempElement);\n        }\n    }\n    \n\n    private buildExportParams(params: { columns?: string[]; rowPositions?: RowPositionType[]; includeHeaders?: boolean; includeGroupHeaders?: boolean; }, type : 'string' | 'element'): string | HTMLElement {\n        const { columns, rowPositions, includeHeaders = false } = params;\n\n        const exportParams : any = {\n            columns,\n            rowPositions,\n            skipHeaders               : !includeHeaders,\n            suppressQuotes            : true,\n            columnSeparator           : '\\t',\n        };\n\n        if(type === 'string') {\n            return this.csvCreator.getDataAsCsv(exportParams);\n        }else {\n            return this.tableCreator.getData(exportParams);\n        }\n    }\n\n    private copyToClipBoardElement(data : HTMLElement[]) {\n        const container = document.createElement('div');\n        container.style.opacity = '0';\n        container.style.width = '1px';\n        container.style.height = '1px';\n        document.body.appendChild(container);\n        const fragment = document.createDocumentFragment();\n\n        data.forEach((tableData) => {\n            fragment.appendChild(tableData);\n        });\n\n        container.appendChild(fragment);\n        selectRange(container);\n        setTimeout(() => {\n \t\t\tdocument.body.removeChild(container);\n \t\t}, 0);\n    }\n\n    public getCellRanges(): IClipBoardCellRanges[] {\n        if (this.hasValidRangeSelection()) {\n            return this.getRangeSelectionCellRanges();\n        } else if (this.hasValidRowSelection()) {\n            return this.getRowSelectionCellRanges();\n        } else if(this.hasValidColumnSelection()) {\n            return this.getColumnSelectionCellRanges();  \n        } else if (this.hasFocusedCell()) {\n            return this.getFocusedCellRanges();\n        }\n\n        return [];\n    }\n\n    public getSelection(): CellRangeType[] | string[] | SelectedRowRange[]{\n        if (this.hasValidRangeSelection()) {\n            return this.rangeSelectionHandler.getCellRanges();\n        } else if (this.hasValidRowSelection()) {\n            return this.rowSelectionHandler.getSelectedRows();\n        } else if(this.hasValidColumnSelection()) {\n            return this.columnSelectionHandler.getSelectedColumns();\n        } else if (this.hasFocusedCell()) {\n            return this.rangeSelectionHandler.getCellRanges();\n        }\n\n        return [];\n    }\n    \n    private hasValidRangeSelection(): boolean {\n        return this.rangeSelectionHandler && \n               !this.rangeSelectionHandler.isEmpty() && \n               this.rangeSelectionHandler.hasMultipleCells();\n    }\n    \n    private getRangeSelectionCellRanges(): IClipBoardCellRanges[] {\n        const dataCellRanges: any[] = [];\n        const cellRanges = this.rangeSelectionHandler.getCellRanges();\n    \n        cellRanges.forEach((range) => {\n            const rowPositions = this.rangeSelectionHandler.getRangeRowPositions(range);\n            rowPositions.forEach((rowPosition) => {\n                dataCellRanges.push({\n                    ...rowPosition,\n                    columns: range.columnIds\n                });\n            });\n        });\n    \n        return dataCellRanges;\n    }\n    \n    private hasValidRowSelection(): boolean {\n        return this.rowSelectionHandler && !this.rowSelectionHandler.isEmpty();\n    }\n\n    private hasValidColumnSelection(): boolean {\n        return this.columnSelectionHandler && !this.columnSelectionHandler.isEmpty();\n    }\n    \n    private getRowSelectionCellRanges(): IClipBoardCellRanges[] {\n        const dataCellRanges: any[] = [];\n        const selectedIds = this.rowSelectionHandler.getSelectedRows();\n    \n        selectedIds.forEach((id) => {\n            const rowNode = this.recordHandler.getRowNodeById(id);\n            dataCellRanges.push({\n                rowIndex: rowNode.getIndex(),\n                pinPosition: rowNode.getPinnedPosition(),\n                columns: this.fieldHandler.getAllDisplayedColumnIDs()\n            });\n        });\n    \n        return dataCellRanges;\n    }\n\n    private getColumnSelectionCellRanges(): IClipBoardCellRanges[] {\n        const dataCellRanges: any[] = [];\n        const selectedIds = this.columnSelectionHandler.getSelectedColumns();\n\n        this.iterateColumn((rowIndexMeta : IRowMeta) => {\n            const rowId   = this.recordHandler.getId(rowIndexMeta.rowIndex, rowIndexMeta.pinPosition, rowIndexMeta.parentKeys);\n            const rowNode = this.recordHandler.getRowNodeById(rowId)\n            const rowMeta = rowNode.getRowMeta();\n            dataCellRanges.push({\n                ...rowMeta,\n                columns: selectedIds\n            });\n        })\n    \n        return dataCellRanges;\n    }\n\n    private iterateColumn(callBack : (rowIndexMeta : IRowMeta) => void) : void {\n        let firstIndex = this.recordHandler.getFirstIndexMeta();\n        const lastIndex = this.recordHandler.getLastIndexMeta();\n\n        while (firstIndex.rowIndex !== lastIndex.rowIndex || firstIndex.pinPosition !== lastIndex.pinPosition || !areArraysEqual(firstIndex.parentKeys, lastIndex.parentKeys)) {\n            callBack(firstIndex);\n            firstIndex = this.recordHandler.getRelativeRowMeta(firstIndex, 1);  \n        }\n    }\n    \n    private hasFocusedCell(): boolean {\n        return this.focusHandler.hasAnyCellFocused();\n    }\n    \n    private getFocusedCellRanges(): IClipBoardCellRanges[] | undefined {\n        const focusedCell = this.focusHandler.getFocusedCellPosition();\n        if (focusedCell == null) {\n            return undefined;\n        }\n    \n        return [{\n            rowIndex: focusedCell.rowIndex,\n            pinPosition: focusedCell.pinPosition,\n            columns: [focusedCell.columnID],\n            parentKeys : focusedCell.parentKeys\n        }];\n    }\n\n    static stringToArray(strData: string, delimiter = ','): string[][] {\n        const data: any[][] = [];\n        const isNewline = (char: string) => char === '\\r' || char === '\\n';\n\n        let insideQuotedField = false;\n\n        if (strData === '') {\n            return [['']];\n        }\n        for (let row = 0, column = 0, position = 0; position < strData.length; position++) {\n            const previousChar = strData[position - 1];\n            const currentChar = strData[position];\n            const nextChar = strData[position + 1];\n            const ensureDataExists = () => {\n                if (!data[row]) {\n                    data[row] = [];\n                }\n\n                if (!data[row][column]) {\n                    data[row][column] = '';\n                }\n            };\n\n            ensureDataExists();\n\n            if (currentChar === '\"') {\n                if (insideQuotedField) {\n                    if (nextChar === '\"') {\n                        data[row][column] += '\"';\n                        position++;\n                    } else {\n                        insideQuotedField = false;\n                    }\n                } else if (previousChar === undefined || previousChar === delimiter || isNewline(previousChar)) {\n                    insideQuotedField = true;\n                }\n            }\n\n            if (!insideQuotedField && currentChar !== '\"') {\n                if (currentChar === delimiter) {\n                    column++;\n                    ensureDataExists();\n\n                    continue;\n                } else if (isNewline(currentChar)) {\n                    column = 0;\n                    row++;\n                    ensureDataExists();\n\n                    if (currentChar === '\\r' && nextChar === '\\n') {\n                        position++;\n                    }\n\n                    continue;\n                }\n            }\n            data[row][column] += currentChar;\n        }\n\n        return data;\n    }\n    \n    /** @internal */\n    static ClipboardHookWrapper = class {\n        constructor(private clipboardHandler : ClipBoardHandler, private hookManager : IHookManager) {}\n        copyData(params : IClipBoardCopyEventParams, callBack : () => void) : void {\n            const hookParams = this.createCommonHookParams(params);\n\n            const api = () => {\n                callBack();\n            }\n            this.hookManager.executeHook(HookEventsName.onBeforeCopyData, HookEventsName.onAfterCopyData, api, hookParams);\n        }\n\n        cutData(params : IClipBoardCutEventParams, callback : () => void) : void {\n            const hookParams = this.createCommonHookParams(params);\n\n            const api = () => {\n                callback();\n            }\n            this.hookManager.executeHook(HookEventsName.onBeforeCutData, HookEventsName.onAfterCutData, api, hookParams);\n        }\n\n        pasteData(params : IClipBoardPasteEventParams,data : string[][] , callback : () => void) : void {\n            const hookParams = this.createPasteHookParams(params, data);\n\n            const api = () => {\n                callback();\n            }\n            this.hookManager.executeHook(HookEventsName.onBeforePasteData, HookEventsName.onAfterPasteData, api, hookParams);\n        }\n\n        private createCommonHookParams(params : IClipBoardEventParams) : ICopyCutEventParams {\n            return {\n                getCellRanges: this.clipboardHandler.getCellRanges.bind(this.clipboardHandler),\n                event        : params.event,\n                eventOrigin  : params.source,\n                values       : this.clipboardHandler.getSelection(),\n                selectionType: params.selectionType\n            }\n        }\n\n        private createPasteHookParams(params : IClipBoardPasteEventParams, data : string[][]) : IPasteEventParams {\n            return {\n                event : params.event,\n                eventOrigin : params.source,\n                data : data,\n                selectionType: params.selectionType,\n                values       : this.clipboardHandler.getSelection(),\n            }\n        }   \n    }\n}\n","import { APIHandler } from \"../Grid/API/APIHandler\";\nimport { RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { HookInitiator } from \"../Grid/Main\";\nimport { CellRangeType } from \"../rangeselection/range-selection-handler.types\";\n\nexport interface IClipBoardHandler {\n\n}\n``\nexport interface IClipBoardParams extends IClipBoardCommonParams {\n    includeHeaders     ?: boolean;\n    includeGroupHeaders?: boolean;\n   \n}\n\nexport type SelectionType = 'rangeSelection' | 'columnSelection' | 'rowSelection';\n\nexport interface IClipBoardCommonParams {\n    source       ?: HookInitiator;\n    event        ?: KeyboardEvent | ClipboardEvent | null;\n}\n\nexport interface IClipBoardPasteParams extends IClipBoardCommonParams {\n}\n\nexport interface IClipBoardCopyParams extends IClipBoardParams {\n}\n\nexport interface IClipBoardCutParams extends IClipBoardParams {\n}\n\n\nexport interface IClipBoardCellRanges extends RowPositionType {\n    columns : string[]\n}\n\nexport interface IClipBoardEventParams extends IClipBoardCommonParams {\n    selectionType : SelectionType\n}\nexport interface IClipBoardCopyEventParams extends IClipBoardEventParams {\n\n}\n\nexport interface IClipBoardPasteEventParams extends IClipBoardEventParams {\n\n}\n\nexport interface IClipBoardCutEventParams extends IClipBoardEventParams {\n\n}\n\nexport interface ICommonEventParams {\n    event : Event | null,\n    eventOrigin : HookInitiator,\n    instanceAPI ?: APIHandler\n}\n\nexport interface IPasteEventParams extends ICommonEventParams{\n    data : any //to be \n    selectionType : SelectionType\n    values : CellRangeType[] | any[] | string[]\n}\n\nexport interface ICopyCutEventParams extends ICommonEventParams {\n    selectionType : SelectionType\n    values : CellRangeType[] | any[] | string[],\n    getCellRanges : () => IClipBoardCellRanges[]\n}\n\nexport enum CellClearType {\n    CellRange,\n    SelectedRows,\n    FocusedCell,\n    SelectedColumns\n} \n\n","import { AutoWired, Bean, BEAN_NAME } from \"@dg/corecomponent\";\nimport { BaseCreator } from \"./base-creator\";\nimport { CSVSerializing } from \"./csv-serializing\";\nimport { ICSVSerializingParams } from \"./grid-serializing.types\";\nimport { download } from \"../Grid/Core/utils/Generic\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\n\n@Bean('csvCreator')\nexport class CSVcreator extends BaseCreator<string, string, CSVSerializing, ICSVSerializingParams> {\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler: GridOptioHandler;\n    public createSerializingSession(params?: ICSVSerializingParams): CSVSerializing {\n        return new CSVSerializing({ suppressQuotes: params.suppressQuotes || false, columnSeparator: params.columnSeparator || ',', });\n    }\n    public getDefaultFileExtension(): string {\n        return 'csv';\n    }\n    public isExportSuppressed(): boolean {\n        return this.optionHandler.suppressCsvExport();\n    }\n    protected export(userParams?: ICSVSerializingParams): void {\n        if (this.isExportSuppressed()) {\n            return;\n        }\n\n        const data = this.getData(userParams);\n\n        const packagedFile = new Blob(['\\ufeff', data], { type: 'text/plain' });\n\n        const fileName =userParams.fileName;\n\n        download(this.getFileName(fileName), packagedFile);\n    }\n\n    public getDataAsCsv(params?: any): string {\n        return this.getData(params);\n    }\n\n}","import { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { IColumnNode } from \"../Grid/Main\";\nimport { GridSerializing } from \"./grid-serializing\";\nimport { ICSVSerializingParams, RowAccumulator } from \"./grid-serializing.types\";\n\nexport class CSVSerializing extends GridSerializing<string, string> {\n    private isFirstLine = true;\n    private result: string = '';\n    private suppressQuotes: boolean;\n    private columnSeparator: string;\n    constructor(params : ICSVSerializingParams) {\n        super();\n        this.suppressQuotes  = params.suppressQuotes;\n        this.columnSeparator = params.columnSeparator;\n    }\n\n    public onNewHeaderRow(): RowAccumulator {\n       this.beginNewLine();\n        return {\n            onColumn: (column: IColumnNode, index : number) => {\n                if (index != 0) {\n                    this.result += this.columnSeparator;\n                }\n                this.result += this.putInQuotes(this.extractHeaderValue(column));\n            },\n        };\n    }\n    \n    public onNewBodyRow(node?: IRowNodeCore): RowAccumulator {\n        this.beginNewLine();\n\n        return {\n            onColumn: (column: IColumnNode, index : number) =>  {\n                if (index != 0) {\n                    this.result += this.columnSeparator;\n                }\n                const rowCellValue = this.extractRowCellValue(column, node);\n                this.result += this.putInQuotes(rowCellValue.valueFormatted ?? rowCellValue.value);\n            }\n        };\n    }\n\n    private putInQuotes(value: any): string {\n        if (this.suppressQuotes) {\n            return value;\n        }\n\n        if (value === null || value === undefined) {\n            return '\"\"';\n        }\n\n        let stringValue: string;\n        if (typeof value === 'string') {\n            stringValue = value;\n        } else if (typeof value.toString === 'function') {\n            stringValue = value.toString();\n        } else {\n            stringValue = '';\n        }\n        const valueEscaped = stringValue.replace(/\"/g, '\"\"');\n\n        return '\"' + valueEscaped + '\"';\n    }\n\n    public addCustomContent(customContent: string): void {\n        if (!customContent) {\n            return;\n        }\n        if (typeof customContent === 'string') {\n            if (!/^\\s*\\n/.test(customContent)) {\n                this.beginNewLine();\n            }\n            customContent = customContent.replace(/\\r?\\n/g, '\\r\\n');\n            this.result += customContent;\n        }\n    }\n\n    public parse(): string {\n        return this.result;\n    }    \n\n    private beginNewLine() {\n        if (!this.isFirstLine) {\n            this.result += '\\r\\n';\n        }\n        this.isFirstLine = false;\n    }\n}","import { AutoWired, Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { IGridSerializerParams, IGridSerializing, IGridSerializingCallback } from \"./grid-serializing.types\";\nimport { _compose } from \"../Grid/Core/utils/Generic\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { rowPinPositions } from \"../Grid/Core/Constants/GridConfigurationConstants\";\nimport { RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { IColumnNode } from \"../Grid/Main\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\n\n@Bean('gridSerialiser')\nexport class GridSerializer extends EventEmitter{\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler: IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler: FieldHandler;\n    public serialize<T,P>(params : IGridSerializerParams, gridSerializing : IGridSerializing<T,P>) : T {\n        const allColumns = this.getColumns(params.columns);\n        const serialize = _compose(\n            this.processHeader<T,P>(params,allColumns),\n            this.processPinnedTopRows<T,P>(params, allColumns),\n            this.processRows<T,P>(params,allColumns),\n            this.processPinnedBottomRows<T,P>(params,allColumns)\n        )\n        return serialize(gridSerializing).parse();\n    }\n\n    private processPinnedTopRows<T,P>(params : IGridSerializerParams, columns : IColumnNode[]) : IGridSerializingCallback<T,P> {\n        return (gridSerialing) => {\n            const topHandler = this.recordHandler.getTopHandler();\n\n            if(params.rowPositions) {\n                this.processRowCallback(params.rowPositions, 'top', (position : RowPositionType) => {\n                    this.processRow(topHandler.getRowNode(position.rowIndex), columns, gridSerialing)\n                })\n                return gridSerialing;\n            }\n\n            const allRows = topHandler.getAllRowNodes();\n            allRows.forEach(row => {\n                this.processRow(row, columns, gridSerialing);\n            })\n\n            return gridSerialing;\n        }\n    }\n\n    private processRowCallback(rowPositions : RowPositionType[], position : rowPinPositions, callBack : (rowPosition : RowPositionType) => void) : void {\n        rowPositions.filter((rowPosition) => rowPosition.pinPosition === position).sort((a, b) => a.rowIndex - b.rowIndex).forEach(callBack);  \n    }\n\n    private processRows<T,P>(params : IGridSerializerParams, columns : IColumnNode[]) : IGridSerializingCallback<T,P>{\n        return (gridSerialing) => {\n            const centerHandler = this.recordHandler.getMiddleHandler();\n            if(params.rowPositions) {\n                this.processRowCallback(params.rowPositions, 'middle', (position : RowPositionType) => {\n                    this.processRow(centerHandler.getRowNode(position.rowIndex), columns, gridSerialing)\n                })\n                return gridSerialing;\n            }\n\n            const allRows = centerHandler.getAllRowNodes();\n            allRows.forEach(row => {\n                this.processRow(row, columns, gridSerialing);\n            })\n       \n            return gridSerialing;\n        }\n    }\n\n    private processPinnedBottomRows<T,P>(params : IGridSerializerParams, columns : IColumnNode[]) : IGridSerializingCallback<T,P> {\n        return (gridSerialing) => {\n            const bottomHandler = this.recordHandler.getBottomHandler();\n            if(params.rowPositions) {\n                this.processRowCallback(params.rowPositions, 'bottom', (position : RowPositionType) => {\n                    this.processRow(bottomHandler.getRowNode(position.rowIndex), columns, gridSerialing)\n                })\n                return gridSerialing;\n            }\n\n            const allRows = bottomHandler.getAllRowNodes();\n            allRows.forEach(row => {\n                this.processRow(row, columns, gridSerialing);\n            })         \n            return gridSerialing;\n        }\n    }\n\n    private processRow<T,P>(node : IRowNodeCore,columns : IColumnNode[],  gridSerializing : IGridSerializing<T,P>) : void {\n        const gridRowIterator = gridSerializing.onNewBodyRow(node)\n        columns.forEach((column, index) => {\n            gridRowIterator.onColumn(column, index)\n        });\n    }\n\n    private processHeader<T,P>(params : IGridSerializerParams, columns:IColumnNode[]) : IGridSerializingCallback<T,P> {\n        return (gridSerialing) => {\n            if(!params.skipHeaders) {\n                const gridRowIterator = gridSerialing.onNewHeaderRow();\n                columns.forEach((column, index) => {\n                    gridRowIterator.onColumn(column, index);\n                })      \n            }   \n            return gridSerialing;\n        }\n    }\n\n    private getColumns(columns : string[]) : IColumnNode[] {\n        if(columns) {\n            return columns.map(column => this.fieldHandler.getColumnNodeByID(column));\n        }\n\n        const allColumns = this.fieldHandler.getDisplayedAllColumns();\n\n        return allColumns;\n    }\n}","import { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { IColumnNode } from \"../Grid/Main\";\nimport { IGridSerializing, IProcessCellParams, IProcessCellResultParams, RowAccumulator } from \"./grid-serializing.types\";\n\nexport abstract class GridSerializing<T,P> implements IGridSerializing<T,P> {\n    abstract onNewHeaderRow()                  : RowAccumulator;\n    abstract onNewBodyRow(node?: IRowNodeCore) : RowAccumulator\n    abstract addCustomContent(customContent: P): void;\n    abstract parse()                           : T;\n\n    public extractHeaderValue(column: IColumnNode): string {\n        const value = this.getHeaderName(column);\n        return value ?? '';\n    }\n\n    private getHeaderName( column: IColumnNode ): string | null {\n        return column.getColumnKey();\n    }\n\n    public extractRowCellValue( column: IColumnNode, node: IRowNodeCore ): IProcessCellResultParams {\n        const value = node.getDataByKey(column.getColumnKey());\n        const processedValue = this.processCell({\n            rowNode: node,\n            column,\n            value,\n        });\n\n        return processedValue;\n    }\n\n    private processCell(params:IProcessCellParams): IProcessCellResultParams {\n        const { column, value } = params;\n\n        if (column.isValueFormatterForExport() !== false) {\n            return {\n                value         : value ?? '',\n                valueFormatted: value,\n            };\n        }\n\n        return { value: value ?? '' };\n    }\n}","import { AutoWired, Bean, EventEmitter } from \"@dg/corecomponent\";\nimport { GridSerializer } from \"./grid-serializer\";\nimport { TableSerializing } from \"./table-serializing\";\nimport { IGridSerializerParams } from \"./grid-serializing.types\";\n\n@Bean('tableCreator')\nexport class TableCreator extends EventEmitter {\n    @AutoWired('gridSerialiser') private gridSerializer: GridSerializer;\n    public getData(params : IGridSerializerParams) : HTMLElement {\n        const serializingSession = this.createSerializingSession();\n        return this.gridSerializer.serialize(params, serializingSession);\n    }\n\n    public createSerializingSession(): TableSerializing {\n        return new TableSerializing();\n    }\n}","import { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { IColumnNode } from \"../Grid/Main\";\nimport { GridSerializing } from \"./grid-serializing\";\nimport { RowAccumulator } from \"./grid-serializing.types\";\n\nexport class TableSerializing extends GridSerializing<HTMLElement, string> {\n    private tableElement: HTMLElement;\n    private tbodyElement: HTMLElement;\n    constructor() {\n        super();\n        this.tableElement = document.createElement('table');\n        this.tbodyElement = document.createElement('tbody');\n        this.tableElement.appendChild(this.tbodyElement);\n    }\n\n    public onNewHeaderRow(): RowAccumulator {\n        const row = this.createElement('tr');\n        this.tbodyElement.appendChild(row);\n        return {\n            onColumn: (column: IColumnNode) => {\n                const th = this.createElement('th', this.extractHeaderValue(column));\n                row.appendChild(th);\n            },\n        };\n    }\n    \n    public onNewBodyRow(node?: IRowNodeCore): RowAccumulator {\n        const row = this.createElement('tr');\n        this.tbodyElement.appendChild(row);\n        return {\n            onColumn: (column: IColumnNode) => {\n                const cellValue = this.extractRowCellValue(column, node);\n                const td = this.createElement('td', cellValue.valueFormatted ?? cellValue.value);\n                row.appendChild(td);\n            },\n        };\n    }\n\n    public addCustomContent(customContent: string): void {\n        const row = this.createElement('tr');\n        const cell = this.createElement('td', customContent);\n        row.appendChild(cell);\n        this.tbodyElement.appendChild(row);\n    }\n\n    public parse(): HTMLElement {\n        return this.tableElement;\n    }\n\n    private createElement(tag: string, content?: string): HTMLElement {\n        const element = document.createElement(tag);\n        if (content) {\n            element.textContent = content;\n        }\n        return element;\n    }\n    \n}","import { IAddEvents, IDragEventParams, IDragHandler, IDragSource, IDragSourceAndListener } from \"./drag-core-handler.types\";\n\nexport class DragCoreHandler implements IDragHandler {\n    private dragSources: IDragSourceAndListener[] = [];\n    private destroyFunctions: Function[]          = [];\n    private currentDragSource: IDragSource | null = null;\n    private dragging: boolean                     = false;\n    private startTarget: EventTarget | null       = null;\n    private mouseStartEvent: MouseEvent | null    = null;\n    private touchLastTime: Touch | null           = null;\n    private touchStart: Touch | null              = null;\n    private timerId: any | null        = null;\n    \n\n    /**\n     * Adds a new drag source to the handler, enabling drag functionality on the specified container element.\n     * \n     * @param {IDragSource} dragSource - The drag source configuration containing the container element, \n     *                                   event handling options, and callbacks for drag events.\n     */\n    public addDragSource(dragSource: IDragSource): void {\n        const { container, includeTouch, preventTouchEventPropagation } = dragSource;\n        const mouseDownListener = (event: MouseEvent) => this.onMouseDown(dragSource, event);\n        container.addEventListener('mousedown', mouseDownListener);\n\n        if (includeTouch) {\n            const touchStartListener = (touchEvent: TouchEvent) => this.handleTouchEvent(touchEvent, preventTouchEventPropagation, dragSource);\n            container.addEventListener('touchstart', touchStartListener, { passive: false });\n            this.dragSources.push({ dragSource, mouseDownListener, touchStartListener });\n        } else {\n            this.dragSources.push({ dragSource, mouseDownListener });\n        }\n    }\n\n    public removeDragSource(params: IDragSource): void {\n        const dragSourceAndListener = this.dragSources.find((item) => item.dragSource === params);\n\n        if (!dragSourceAndListener) {\n            return;\n        }\n\n        this.removeListener(dragSourceAndListener);\n        this.dragSources = this.dragSources.filter((dragSoruce) => dragSoruce != dragSourceAndListener);\n    }\n\n    /**\n     * Removes all event listeners associated with all drag sources added to this handler.\n     */\n    public removeAllListeners(): void {\n        this.dragSources.forEach(this.removeListener.bind(this));\n        this.dragSources.length = 0;\n    }\n\n    /**\n     * Returns the target element that initiated the drag operation.\n     * \n     * @returns {EventTarget | null} - The starting target of the drag operation or null if not dragging.\n     */\n    public getTarget(): EventTarget | null {\n        return this.startTarget;\n    }\n\n    // Private methods\n    private removeListener(dragSourceAndListener: IDragSourceAndListener): void {\n        const { container } = dragSourceAndListener.dragSource;\n        container.removeEventListener('mousedown', dragSourceAndListener.mouseDownListener);\n\n        if (dragSourceAndListener.touchStartListener) {\n            container.removeEventListener('touchstart', dragSourceAndListener.touchStartListener);\n        }\n    }\n\n    private onMouseDown(dragSource: IDragSource, event: MouseEvent): void {\n        if (this.shouldSkipMouseEvent(dragSource, event)) return;\n\n\n        this.initializeDragState(dragSource, event);\n        this.setupDragEventListeners(dragSource, dragSource.triggerTimeout, 'mouse');\n    }\n\n    private handleTouchEvent(touchEvent: TouchEvent, preventTouchEventPropagation: boolean | undefined, dragSource: IDragSource): void {\n        if (touchEvent.cancelable) {\n            // touchEvent.preventDefault();\n            if (preventTouchEventPropagation) touchEvent.stopPropagation();\n        }\n        this.onTouchStart(dragSource, touchEvent);\n    }\n\n    private onTouchStart(dragSource: IDragSource, event: TouchEvent): void {\n        const touch = event.touches[0];\n        this.initializeDragState(dragSource, event, touch);\n        this.setupDragEventListeners(dragSource, dragSource.triggerTimeout, 'touch', event);\n    }\n\n    private shouldSkipMouseEvent(dragSource: IDragSource, event: MouseEvent): boolean {\n        const mouseEvent = event as any;\n        const { bypassMouseEvent, shouldPreventMouseEvent } = dragSource;\n        \n        if (bypassMouseEvent && bypassMouseEvent(event)) return true;\n        if (mouseEvent.__alreadyProcessed || event.button !== 0) return true;\n        mouseEvent.__alreadyProcessed = true;\n        if (shouldPreventMouseEvent(mouseEvent)) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n        return false;\n    }\n\n    private initializeDragState(dragSource: IDragSource | null, event: MouseEvent | TouchEvent | null, touch: Touch | null = null): void {\n        this.currentDragSource = dragSource;\n        this.dragging = false;\n        this.touchLastTime = touch;\n        this.touchStart = touch;\n\n        if (event instanceof MouseEvent || event === null) {\n            this.mouseStartEvent = event as MouseEvent | null;\n            this.startTarget = event ? event.target : null;\n        } else if (event instanceof TouchEvent) {\n            this.startTarget = event.target;\n        }\n    }\n\n    private setupDragEventListeners(dragSource: IDragSource, triggerTimeout: number, eventType: 'mouse' | 'touch', event?: TouchEvent): void {\n        const target = event ? (event.target as Document | ShadowRoot | EventTarget) : dragSource.getRootNode();\n        const events = [{ target, type: 'mouseup', listener: (e: MouseEvent) => this.onMouseUp(dragSource, e) }];\n        const touchevents = [{ target, type: 'touchend', listener: (e: TouchEvent) => this.onTouchUp(dragSource, e), options: { passive: true }  as EventListenerOptions}];\n        if(eventType === 'touch') {\n            this.addEventListeners(touchevents);\n        }else if(eventType === 'mouse') {\n            this.addEventListeners(events)\n        }\n        this.timerId = setTimeout(() => {\n            const target = event ? (event.target as Document | ShadowRoot | EventTarget) : dragSource.getRootNode();\n            const events = this.getEventListeners(dragSource, target, eventType, event);\n            this.addEventListeners(events);\n            this.clearTimer();\n        }, triggerTimeout);\n    }\n\n    private getEventListeners(dragSource: IDragSource, target: Document | ShadowRoot | EventTarget, eventType: 'mouse' | 'touch', event?: TouchEvent): IAddEvents[] {\n        const listeners: IAddEvents[] = [];\n\n        if (eventType === 'mouse') {\n            listeners.push(\n                { target, type: 'mousemove', listener: (e: MouseEvent) => this.onMouseMove(dragSource, e) },\n                { target, type: 'contextmenu', listener: (e: MouseEvent) => e.preventDefault() },\n                { target, type: 'keydown', listener: (e: KeyboardEvent) => this.onKeyDown(dragSource, e) }\n\n            );\n        } else if (eventType === 'touch' && event) {\n            listeners.push(\n                { target: dragSource.getRootNode(), type: 'touchmove', listener: (e: TouchEvent) => { if (e.cancelable) e.preventDefault(); }, options: { passive: false }  as EventListenerOptions},\n                { target, type: 'touchmove', listener: (e: TouchEvent) => this.onTouchMove(dragSource, e), options: { passive: true }  as EventListenerOptions},\n                { target, type: 'touchcancel', listener: (e: TouchEvent) => this.onTouchUp(dragSource, e), options: { passive: true }  as EventListenerOptions}\n            );\n        }\n\n        return listeners;\n    }\n\n    private onKeyDown(dragSource : IDragSource,event : KeyboardEvent) : void {\n        if(event.key === 'Escape') {\n            this.cancelDrag(dragSource, event);\n        }\n    }\n\n    private cancelDrag(dragSource : IDragSource, event : KeyboardEvent) : void {\n        const dragEventParams = this.createDragEventParams(event, dragSource.container);\n        this.currentDragSource?.onDragCancel?.(dragEventParams),\n        this.cleanupDrag()\n    }\n\n    private addEventListeners(events: IAddEvents[]): void {\n        events.forEach(event => {\n            const { target, type, listener, options } = event;\n            target.addEventListener(type, listener as any, options);\n\n            this.destroyFunctions.push(() => {\n                target.removeEventListener(type, listener as any, options);\n            });\n        });\n    }\n\n    private clearTimer(): void {\n        if (this.timerId) {\n            clearTimeout(this.timerId);\n            this.timerId = null;\n        }\n    }\n\n    private onMouseMove(dragSource: IDragSource, event: MouseEvent): void {\n        if (dragSource.shouldPreventMouseEvent(event)) {\n            event.preventDefault();\n            event.stopPropagation();\n        }\n        this.onCommonMove(event, this.mouseStartEvent!, dragSource.container);\n    }\n\n    private onMouseUp(dragSource: IDragSource, event: MouseEvent): void {\n        this.onUpCommon(event, dragSource.container);\n    }\n\n    private onTouchMove(dragSource: IDragSource, touchEvent: TouchEvent): void {\n        const touch = this.getFirstActiveTouch(touchEvent.touches);\n        if (!touch) return;\n        this.onCommonMove(touch, this.touchStart!, dragSource.container);\n    }\n\n    private onTouchUp(dragSource: IDragSource, touchEvent: TouchEvent): void {\n        let touch = this.getFirstActiveTouch(touchEvent.changedTouches);\n        if (!touch) {\n            touch = this.touchLastTime;\n        }\n\n        this.onUpCommon(touch!, dragSource.container);\n    }\n\n    private getFirstActiveTouch(touchList: TouchList): Touch | null {\n        for (let i = 0; i < touchList.length; i++) {\n            if (touchList[i].identifier === this.touchStart?.identifier) {\n                return touchList[i];\n            }\n        }\n        return null;\n    }\n\n    private onCommonMove(currentEvent: MouseEvent | Touch, startEvent: MouseEvent | Touch, container: Element): void {\n        if (!this.dragging) {\n            this.dragging = true;\n            const dragEventParams = this.createDragEventParams(startEvent, container);\n            this.currentDragSource!.onDragStart(dragEventParams);\n            this.currentDragSource!.onDragging(dragEventParams);\n        }\n\n        const dragEventParams = this.createDragEventParams(currentEvent, container);\n        this.currentDragSource!.onDragging(dragEventParams);\n    }\n\n    private onUpCommon(eventOrTouch: MouseEvent | Touch, container: Element): void {\n        if (this.dragging) {\n            \n            const dragEventParams = this.createDragEventParams(eventOrTouch, container);\n            this.currentDragSource!.onDragStop(dragEventParams);\n        }\n        this.cleanupDrag();\n    }\n\n    private cleanupDrag(): void {\n        this.destroyFunctions.forEach(destroyFn => destroyFn());\n        this.dragging = false;\n        this.destroyFunctions.length = 0;\n        this.clearTimer();\n    }\n\n    private createDragEventParams(eventOrTouch: MouseEvent | Touch | KeyboardEvent, container: Element): IDragEventParams {\n        return {\n            event : eventOrTouch,\n            container,\n            startEventOrTouch: this.mouseStartEvent || this.touchStart!,\n            dragSource: this.currentDragSource!,\n            target: this.startTarget!\n        };\n    }\n}\n","import { Bean } from \"@dg/corecomponent\";\nimport { DragCoreHandler } from \"./drag-core-handler\";\n\n@Bean('dragHandler')\nexport class DragHandler extends DragCoreHandler {\n    \n}","import { AutoWired, Bean, BEAN_NAME, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { CellPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\n\nexport interface IFindApi {\n\tfindNext(): void;\n\tfindPrevious(): void;\n\tfindGoTo(matchNumber: number, force?: boolean): void;\n\tfindClearActive(): void;\n\tfindGetTotalMatches(): number;\n\tfindGetActiveMatch():\n\t\t| { index: number; total: number; position: CellPositionType; rowId: string; columnId: string }\n\t\t| null;\n\tsetFindSearchValue(value: string): void;\n}\n\n@Bean(\"findApi\")\nexport class FindApi implements IFindApi {\n\t@AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName!: getBeanInstanceByBeanName;\n\n\tprivate getFindHandler(): any {\n\t\treturn this.getBeanInstanceByBeanName(\"gridFindHandler\");\n\t}\n\n\tpublic findNext(): void {\n\t\tconst handler = this.getFindHandler();\n\t\thandler.next();\n\t}\n\n\tpublic findPrevious(): void {\n\t\tconst handler = this.getFindHandler();\n\t\thandler.previous();\n\t}\n\n\tpublic findGoTo(matchNumber: number, force?: boolean): void {\n\t\tconst handler = this.getFindHandler();\n\t\thandler.goTo(matchNumber, force);\n\t}\n\n\tpublic findClearActive(): void {\n\t\tconst handler = this.getFindHandler();\n\t\thandler.clearActive();\n\t}\n\n\tpublic findGetTotalMatches(): number {\n\t\tconst handler = this.getFindHandler();\n\t\treturn handler.getTotalMatches();\n\t}\n\n\tpublic findGetActiveMatch():\n\t\t| { index: number; total: number; position: CellPositionType; rowId: string; columnId: string }\n\t\t| null {\n\t\tconst handler = this.getFindHandler();\n\t\treturn handler.getActiveMatch();\n\t}\n\n\tpublic setFindSearchValue(value: string): void {\n\t\tconst handler = this.getFindHandler();\n\t\thandler.setSearchValue(value);\n\t}\n}\n\n","import { AutoWired, Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { ICellAPIManager } from \"../Grid/Main\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { CellFocusParams, IFocusHandler } from \"../Grid/Core/Navigation/focus-handler.types\";\nimport { CellPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { FindController, IFindHandlerAdapter } from \"./findController\";\nimport { INavigationHandler } from \"../Grid/Core/Navigation/navigation-handler.types\";\nimport { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { RowRenderController } from \"../Grid/Core/Rows/RowRenderController\";\nimport { areArraysEqual } from \"../Grid/Core/utils/Object\";\n\ninterface FindMatch {\n\trowId: string;\n\tposition: CellPositionType;\n\tcolumnId: string;\n}\n\n@Bean(\"gridFindHandler\")\nexport class GridFindHandler extends EventEmitter implements IFindHandlerAdapter {\n\t@AutoWired(GRID_BEAN_NAME.GRID_DIV_ELEMENT) private gridDivElement!: HTMLElement;\n\t@AutoWired(GRID_BEAN_NAME.CELL_API) private cellAPI!: ICellAPIManager;\n\t@AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler!: IRecordHandler;\n\t@AutoWired('navigationService') private navigationService!: INavigationHandler;\n\t@AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler!: FieldHandler;\n\t@AutoWired(\"focusHandler\") private focusHandler!: IFocusHandler;\n\t@AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) private rowRenderController!: RowRenderController;\n\n\tprivate controller!: FindController;\n\n\tprivate currentSearch = \"\";\n\tprivate matches: FindMatch[] = [];\n\tprivate currentIndex = -1;\n\tprivate previousPosition: CellPositionType | null = null;\n\tprivate matchedPositions: CellPositionType[] = [];\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tthis.controller = new FindController(this.gridDivElement, this);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.controller.destroy();\n\t\t\tthis.controller = null;\n\t\t});\n\t}\n\n\tpublic togglePanel(): void {\n\t\tthis.controller.togglePanel();\n\t}\n\n\tpublic showPanel(): void {\n\t\tthis.controller.showPanel();\n\t}\n\n\tpublic hidePanel(): void {\n\t\tif (!this.controller) {\n\t\t\treturn;\n\t\t}\n\t\tthis.controller.hidePanel();\n\t\tthis.currentSearch = \"\";\n\t\tthis.matches = [];\n\t\tthis.currentIndex = -1;\n\t\tthis.clearMatchedHighlights();\n\t\tthis.rowRenderController.highlightFindCell(this.previousPosition, null);\n\t\tthis.previousPosition = null;\n\t\tconst focusHandler = this.focusHandler.getFocusedCellPosition();\n\t\tif (focusHandler) {\n\t\t\tthis.focusHandler.setFocusedCell(focusHandler, true, true);\n\t\t}\n\t}\n\n\tpublic handleFindNext(): void {\n\t\tconst term = this.controller.getFindText();\n\t\tif (!term) {\n\t\t\tthis.currentSearch = \"\";\n\t\t\tthis.matches = [];\n\t\t\tthis.currentIndex = -1;\n\t\t\tthis.clearMatchedHighlights();\n\t\t\tthis.controller.setStatus(\"No results\");\n\t\t\tthis.controller.setHasMatches(false);\n\t\t\treturn;\n\t\t}\n\n\t\tif (term !== this.currentSearch) {\n\t\t\tthis.currentSearch = term;\n\t\t\tthis.buildMatches(term);\n\t\t\tthis.currentIndex = -1;\n\t\t}\n\n\t\tif (!this.matches.length) {\n\t\t\tthis.controller.setStatus(\"No results\");\n\t\t\tthis.controller.setHasMatches(false);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.currentIndex = (this.currentIndex + 1) % this.matches.length;\n\t\tthis.controller.setStatus(`${this.currentIndex + 1}/${this.matches.length}`);\n\t\tthis.controller.setHasMatches(true);\n\t\tthis.focusMatch(this.matches[this.currentIndex]);\n\t}\n\n\tpublic handleFindPrevious(): void {\n\t\tconst term = this.controller.getFindText();\n\t\tif (!term) {\n\t\t\tthis.currentSearch = \"\";\n\t\t\tthis.matches = [];\n\t\t\tthis.currentIndex = -1;\n\t\t\tthis.clearMatchedHighlights();\n\t\t\tthis.controller.setStatus(\"No results\");\n\t\t\tthis.controller.setHasMatches(false);\n\t\t\treturn;\n\t\t}\n\n\t\tif (term !== this.currentSearch) {\n\t\t\tthis.currentSearch = term;\n\t\t\tthis.buildMatches(term);\n\t\t\tthis.currentIndex = this.matches.length; // so decrement goes to last\n\t\t}\n\n\t\tif (!this.matches.length) {\n\t\t\tthis.controller.setStatus(\"No results\");\n\t\t\tthis.controller.setHasMatches(false);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.currentIndex = (this.currentIndex - 1 + this.matches.length) % this.matches.length;\n\t\tthis.controller.setStatus(`${this.currentIndex + 1}/${this.matches.length}`);\n\t\tthis.controller.setHasMatches(true);\n\t\tthis.focusMatch(this.matches[this.currentIndex]);\n\t}\n\n\t// --- API-like methods (similar to AG Grid) ---\n\tpublic setSearchValue(value: string): void {\n\t\tthis.controller.showPanel();\n\t\tthis.controller.setFindText(value);\n\t\tthis.currentSearch = value || \"\";\n\t\tif (value) {\n\t\t\tthis.buildMatches(value);\n\t\t\tthis.currentIndex = -1;\n\t\t} else {\n\t\t\tthis.matches = [];\n\t\t\tthis.currentIndex = -1;\n\t\t\tthis.clearMatchedHighlights();\n\t\t\tthis.controller.setStatus(\"\");\n\t\t\tthis.controller.setHasMatches(false);\n\t\t}\n\t}\n\n\tpublic next(): void {\n\t\tthis.controller.showPanel();\n\t\tthis.handleFindNext();\n\t}\n\n\t/** API surface alias for \"go to next\" match within findAPI namespace. */\n\tpublic goToNext(): void {\n\t\tthis.next();\n\t}\n\n\tpublic previous(): void {\n\t\tconst term = this.controller.getFindText();\n\t\tif (!term) {\n\t\t\tthis.controller.setStatus(\"No results\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (term !== this.currentSearch) {\n\t\t\tthis.currentSearch = term;\n\t\t\tthis.buildMatches(term);\n\t\t\tthis.currentIndex = this.matches.length; // so decrement goes to last\n\t\t}\n\n\t\tif (!this.matches.length) {\n\t\t\tthis.controller.setStatus(\"No results\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.currentIndex = (this.currentIndex - 1 + this.matches.length) % this.matches.length;\n\t\tthis.controller.setStatus(`${this.currentIndex + 1}/${this.matches.length}`);\n\t\tthis.controller.setHasMatches(true);\n\t\tthis.focusMatch(this.matches[this.currentIndex]);\n\t}\n\n\tpublic goTo(matchNumber: number, _force?: boolean): void {\n\t\tif (!this.matches.length) {\n\t\t\tthis.controller.setStatus(\"No results\");\n\t\t\treturn;\n\t\t}\n\t\tconst index = Math.min(Math.max(matchNumber - 1, 0), this.matches.length - 1);\n\t\tif (index === this.currentIndex) {\n\t\t\t// \"force\" argument is kept only for backwards compatibility\n\t\t\t// with the older API surface; it is now ignored.\n\t\t\treturn;\n\t\t}\n\t\tthis.currentIndex = index;\n\t\tthis.controller.setStatus(`${this.currentIndex + 1}/${this.matches.length}`);\n\t\tthis.controller.setHasMatches(true);\n\t\tthis.focusMatch(this.matches[this.currentIndex]);\n\t}\n\n\t/** API surface alias for \"go to previous\" match within findAPI namespace. */\n\tpublic goToPrevious(): void {\n\t\tthis.controller.showPanel();\n\t\tthis.handleFindPrevious();\n\t}\n\n\tpublic clearActive(): void {\n\t\tif (this.previousPosition) {\n\t\t\tthis.rowRenderController.highlightFindCell(this.previousPosition, null);\n\t\t\tthis.previousPosition = null;\n\t\t}\n\t\tif (this.matches.length) {\n\t\t\tthis.controller.setStatus(`0/${this.matches.length}`);\n\t\t\tthis.controller.setHasMatches(true);\n\t\t} else {\n\t\t\tthis.controller.setStatus(\"\");\n\t\t\tthis.controller.setHasMatches(false);\n\t\t}\n\t}\n\n\tpublic getTotalMatches(): number {\n\t\treturn this.matches.length;\n\t}\n\n\tpublic getActiveMatch():\n\t\t| { index: number; total: number; position: CellPositionType; rowId: string; columnId: string }\n\t\t| null {\n\t\tif (this.currentIndex < 0 || this.currentIndex >= this.matches.length) {\n\t\t\treturn null;\n\t\t}\n\t\tconst match = this.matches[this.currentIndex];\n\t\treturn {\n\t\t\tindex: this.currentIndex + 1,\n\t\t\ttotal: this.matches.length,\n\t\t\tposition: match.position,\n\t\t\trowId: match.rowId,\n\t\t\tcolumnId: match.columnId,\n\t\t};\n\t}\n\n\tpublic handleReplaceCurrent(): void {\n\t\tif (!this.matches.length || this.currentIndex < 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst match = this.matches[this.currentIndex];\n\t\tconst replaceValue = this.controller.getReplaceText();\n\t\tconst rowId = match.rowId;\n\t\tif (!rowId) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst existing = this.cellAPI.getDataById(rowId, match.columnId);\n\t\tif (existing == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst text = String(existing);\n\t\tconst term = this.currentSearch;\n\t\tif (!term) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isCaseSensitive = this.controller.isCaseSensitive();\n\t\tconst isWholeWord = this.controller.isWholeWord();\n\t\tconst isRegex = this.controller.isRegexEnabled();\n\n\t\tlet replaced: string | null = null;\n\n\t\tif (isRegex) {\n\t\t\tlet regex: RegExp;\n\t\t\ttry {\n\t\t\t\tconst source = term;\n\t\t\t\tregex = new RegExp(source, isCaseSensitive ? \"\" : \"i\");\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treplaced = text.replace(regex, replaceValue);\n\t\t} else {\n\t\t\tconst flags = isCaseSensitive ? \"\" : \"i\";\n\t\t\tconst basePattern = this.escapeRegExp(term);\n\t\t\tconst pattern = isWholeWord ? `\\\\b${basePattern}\\\\b` : basePattern;\n\t\t\tconst regex = new RegExp(pattern, flags);\n\t\t\treplaced = text.replace(regex, replaceValue);\n\t\t}\n\n\t\tif (replaced === null || replaced === text) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.cellAPI.setDataById(rowId, match.columnId, replaced, {}, {\n\t\t\teventOrigin: \"ui\",\n\t\t\tsuppressEventTrigger: false,\n\t\t} as any);\n\n\t\t// After a single replace, rebuild matches then move to next search cell position\n\t\tconst previousIndex = this.currentIndex;\n\t\tthis.buildMatches(this.currentSearch);\n\t\tif (this.matches.length > 0) {\n\t\t\tthis.currentIndex = Math.min(previousIndex, this.matches.length - 1);\n\t\t\tthis.controller.setStatus(`${this.currentIndex + 1}/${this.matches.length}`);\n\t\t\tthis.focusMatch(this.matches[this.currentIndex]);\n\t\t}\n\t}\n\n\tpublic handleReplaceAll(): void {\n\t\tconst term = this.controller.getFindText();\n\t\tif (!term) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.currentSearch = term;\n\t\tif (!this.matches.length) {\n\t\t\t// No matches to replace – keep controls disabled / \"No results\" state\n\t\t\treturn;\n\t\t}\n\n\t\tconst replaceValue = this.controller.getReplaceText();\n\t\tconst isCaseSensitive = this.controller.isCaseSensitive();\n\t\tconst isWholeWord = this.controller.isWholeWord();\n\t\tconst isRegex = this.controller.isRegexEnabled();\n\n\t\tlet regex: RegExp | null = null;\n\t\tif (isRegex) {\n\t\t\ttry {\n\t\t\t\tconst source = term;\n\t\t\t\tregex = new RegExp(source, isCaseSensitive ? \"g\" : \"gi\");\n\t\t\t} catch {\n\t\t\t\tregex = null;\n\t\t\t}\n\t\t}\n\n\t\tthis.matches.forEach((match) => {\n\t\t\tconst rowId = match.rowId;\n\t\t\tif (!rowId) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst existing = this.cellAPI.getDataById(rowId, match.columnId);\n\t\t\tif (existing == null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst text = String(existing);\n\n\t\t\tlet replaced: string;\n\t\t\tif (regex) {\n\t\t\t\treplaced = text.replace(regex, replaceValue);\n\t\t\t} else {\n\t\t\t\tconst flags = isCaseSensitive ? \"g\" : \"gi\";\n\t\t\t\tconst basePattern = this.escapeRegExp(term);\n\t\t\t\tconst pattern = isWholeWord ? `\\\\b${basePattern}\\\\b` : basePattern;\n\t\t\t\treplaced = text.replace(new RegExp(pattern, flags), replaceValue);\n\t\t\t}\n\t\t\tif (replaced !== text) {\n\t\t\t\tthis.cellAPI.setDataById(rowId, match.columnId, replaced, {}, {\n\t\t\t\t\teventOrigin: \"ui\",\n\t\t\t\t\tsuppressEventTrigger: false,\n\t\t\t\t} as any);\n\t\t\t}\n\t\t});\n\n\t\tthis.buildMatches(term);\n\n\t}\n\n\tprivate buildMatches(term: string): void {\n\t\tthis.matches = [];\n\t\tthis.currentIndex = -1;\n\t\tthis.clearMatchedHighlights();\n\n\t\tconst isCaseSensitive = this.controller.isCaseSensitive();\n\t\tconst isWholeWord = this.controller.isWholeWord();\n\t\tconst isRegex = this.controller.isRegexEnabled();\n\n\t\tconst normalizedTerm = isCaseSensitive ? term : term.toLowerCase();\n\t\tconst wholeWordPattern =\n\t\t\t!isRegex && isWholeWord\n\t\t\t\t? new RegExp(`\\\\b${this.escapeRegExp(term)}\\\\b`, isCaseSensitive ? \"\" : \"i\")\n\t\t\t\t: null;\n\t\tconst columnIds = this.fieldHandler.getAllDisplayedColumnIDs();\n\n\t\tconst firstMeta = this.recordHandler.getFirstIndexMeta();\n\t\tconst lastMeta = this.recordHandler.getLastIndexMeta();\n\n\t\tif (!firstMeta || !lastMeta) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst rowNodes = this.recordHandler.getSequenceRowNodes(firstMeta, lastMeta) as any[];\n\n\t\tlet regex: RegExp | null = null;\n\t\tif (isRegex) {\n\t\t\ttry {\n\t\t\t\tconst source = term;\n\t\t\t\tregex = new RegExp(source, isCaseSensitive ? \"\" : \"i\");\n\t\t\t} catch {\n\t\t\t\tregex = null;\n\t\t\t}\n\t\t}\n\n\t\tfor (const rowNode of rowNodes) {\n\t\t\tif (!rowNode || (typeof rowNode.isLoaded === \"function\" && !rowNode.isLoaded())) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst rowMeta = typeof rowNode.getRowMeta === \"function\"\n\t\t\t\t? rowNode.getRowMeta()\n\t\t\t\t: null;\n\n\t\t\tconst rowId = typeof rowNode.getId === \"function\" ? rowNode.getId() : null;\n\t\t\tif (!rowId || !rowMeta) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const columnId of columnIds) {\n\t\t\t\tconst value = this.cellAPI.getDataById(rowId, columnId);\n\t\t\t\tif (value == null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst text = String(value);\n\n\t\t\t\tlet isMatch = false;\n\t\t\t\tif (regex) {\n\t\t\t\t\tregex.lastIndex = 0;\n\t\t\t\t\tisMatch = regex.test(text);\n\t\t\t\t} else if (wholeWordPattern) {\n\t\t\t\t\tisMatch = wholeWordPattern.test(text);\n\t\t\t\t} else {\n\t\t\t\t\tconst haystack = isCaseSensitive ? text : text.toLowerCase();\n\t\t\t\t\tisMatch = haystack.includes(normalizedTerm);\n\t\t\t\t}\n\n\t\t\t\tif (isMatch) {\n\t\t\t\t\tconst position: CellPositionType = {\n\t\t\t\t\t\trowIndex: rowMeta.rowIndex,\n\t\t\t\t\t\tcolumnID: columnId,\n\t\t\t\t\t\tpinPosition: rowMeta.pinPosition as any,\n\t\t\t\t\t\tparentKeys: rowMeta.parentKeys || [],\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.matches.push({ rowId, position, columnId });\n\t\t\t\t\tthis.matchedPositions.push(position);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.matchedPositions.forEach((pos) => {\n\t\t\tthis.rowRenderController.setFindMatchedForCell(pos, true);\n\t\t});\n\n\t\tif (this.matches.length === 0) {\n\t\t\tthis.controller.setStatus(\"No results\");\n\t\t\tthis.controller.setHasMatches(false);\n\t\t} else {\n\t\t\tthis.controller.setStatus(`1/${this.matches.length}`);\n\t\t\tthis.controller.setHasMatches(true);\n\t\t}\n\t}\n\n\tprivate focusMatch(match: FindMatch): void {\n\t\tconst position: CellPositionType = match.position;\n\n\t\tconst params: CellFocusParams = {\n\t\t\trowIndex: position.rowIndex,\n\t\t\tcolumnID: position.columnID,\n\t\t\tpinPosition: position.pinPosition,\n\t\t\tparentKeys: position.parentKeys,\n\t\t\tisFullWidth: false,\n\t\t\teventOrigin: \"ui\",\n\t\t};\n\n\t\tthis.navigationService.ensureCellVisible(params);\n\t\tthis.navigationService.focusPosition(params, null, 'ui', true, true, false);\n\n\t\tthis.rowRenderController.highlightFindCell(this.previousPosition, position);\n\t\tthis.previousPosition = position;\n\t}\n\n\tprivate escapeRegExp(text: string): string {\n\t\treturn text.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t}\n\n\tprivate clearMatchedHighlights(): void {\n\t\tthis.matchedPositions.forEach((pos) => {\n\t\t\tthis.rowRenderController.setFindMatchedForCell(pos, false);\n\t\t});\n\t\tthis.matchedPositions = [];\n\t}\n\n\tpublic isCellMatched(position: CellPositionType): boolean {\n\t\treturn this.matchedPositions.some((p) => {\n\t\t\treturn (\n\t\t\t\tp.rowIndex === position.rowIndex &&\n\t\t\t\tp.pinPosition === position.pinPosition &&\n\t\t\t\tp.columnID === position.columnID &&\n\t\t\t\tareArraysEqual(p.parentKeys || [], position.parentKeys || [])\n\t\t\t);\n\t\t});\n\t}\n\n\tpublic isCellActive(position: CellPositionType): boolean {\n\t\tconst p = this.previousPosition;\n\t\tif (!p) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tp.rowIndex === position.rowIndex &&\n\t\t\tp.pinPosition === position.pinPosition &&\n\t\t\tp.columnID === position.columnID &&\n\t\t\tareArraysEqual(p.parentKeys || [], position.parentKeys || [])\n\t\t);\n\t}\n\n\tpublic isRowActive(rowIndex: number, pinPosition: any, parentKeys: string[]): boolean {\n\t\tconst p = this.previousPosition;\n\t\tif (!p) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tp.rowIndex === rowIndex &&\n\t\t\tp.pinPosition === pinPosition &&\n\t\t\tareArraysEqual(p.parentKeys || [], parentKeys || [])\n\t\t);\n\t}\n}\n\n","import { IModule } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\nimport { GridFindHandler } from \"./find-handler\";\nimport { FindApi } from \"./find-api\";\n\nexport const GridFindModule: IModule = {\n\tmoduleName: \"grid-find\",\n\tversion   : \"1.0.0\",\n\tmodelType : \"grid\",\n\trowModel  : \"local\",\n\tbeans     : [GridFindHandler, FindApi],\n};\n\n","import { FindView, IFindViewCallbacks } from \"./findView\";\n\nexport interface IFindHandlerAdapter {\n\thandleFindNext(): void;\n\thandleFindPrevious(): void;\n\thandleReplaceCurrent(): void;\n\thandleReplaceAll(): void;\n\thidePanel(): void;\n}\n\nexport class FindController {\n\tprivate view: FindView;\n\n\tconstructor(parent: HTMLElement, private handler: IFindHandlerAdapter) {\n\t\tconst callbacks: IFindViewCallbacks = {\n\t\t\tonFindNext: () => this.handler.handleFindNext(),\n\t\t\tonReplaceCurrent: () => this.handler.handleReplaceCurrent(),\n\t\t\tonReplaceAll: () => this.handler.handleReplaceAll(),\n\t\t\tonClose: () => this.handler.hidePanel(),\n\t\t\tonFindPrevious: () => this.handler.handleFindPrevious(),\n\t\t};\n\n\t\tthis.view = new FindView(parent, callbacks);\n\t}\n\n\tpublic togglePanel(): void {\n\t\tthis.view.toggle();\n\t}\n\n\tpublic showPanel(): void {\n\t\tthis.view.show();\n\t}\n\n\tpublic hidePanel(): void {\n\t\tthis.view.hide();\n\t}\n\n\tpublic getFindText(): string {\n\t\treturn this.view.getFindText();\n\t}\n\n\tpublic getReplaceText(): string {\n\t\treturn this.view.getReplaceText();\n\t}\n\n\tpublic isCaseSensitive(): boolean {\n\t\treturn this.view.isCaseSensitive();\n\t}\n\n\tpublic isWholeWord(): boolean {\n\t\treturn this.view.isWholeWord();\n\t}\n\n\tpublic isRegexEnabled(): boolean {\n\t\treturn this.view.isRegexEnabled();\n\t}\n\n\tpublic setStatus(text: string): void {\n\t\tthis.view.setStatus(text);\n\t}\n\n\tpublic setFindText(text: string): void {\n\t\tthis.view.setFindText(text);\n\t}\n\n\tpublic setHasMatches(hasMatches: boolean): void {\n\t\tthis.view.setFindControlsEnabled(hasMatches);\n\t}\n\n\tpublic destroy(): void {\n\t\tthis.view.destroy();\n\t}\n}\n\n","export interface IFindViewCallbacks {\n\tonFindNext(): void;\n\tonFindPrevious(): void;\n\tonReplaceCurrent(): void;\n\tonReplaceAll(): void;\n\tonClose(): void;\n}\n\nexport class FindView {\n\tprivate panel: HTMLElement;\n\tprivate findInput: HTMLInputElement;\n\tprivate replaceInput: HTMLInputElement;\n\tprivate statusLabel: HTMLSpanElement;\n\tprivate prevButton: HTMLButtonElement;\n\tprivate nextButton: HTMLButtonElement;\n\tprivate chevronButton: HTMLButtonElement;\n\n\tprivate caseSensitive = false;\n\tprivate wholeWord = false;\n\tprivate regexEnabled = false;\n\n\tconstructor(private parent: HTMLElement, private callbacks: IFindViewCallbacks) {\n\t\tthis.createPanel();\n\t}\n\n\tprivate createPanel(): void {\n\t\tconst panel = document.createElement(\"div\");\n\t\tpanel.className = \"dg-grid-find-panel\";\n\t\tpanel.style.display = \"none\";\n\n\t\t// --- first row: VS Code-like find bar ---\n\t\tconst mainRow = document.createElement(\"div\");\n\t\tmainRow.className = \"dg-find-row dg-find-row-main\";\n\n\t\tconst chevronButton = document.createElement(\"button\");\n\t\tchevronButton.type = \"button\";\n\t\tchevronButton.className = \"dg-find-button dg-find-chevron\";\n\t\tchevronButton.textContent = \"›\";\n\n\t\tconst inputWrapper = document.createElement(\"div\");\n\t\tinputWrapper.className = \"dg-find-input-wrapper\";\n\n\t\tconst findInput = document.createElement(\"input\");\n\t\tfindInput.type = \"text\";\n\t\tfindInput.placeholder = \"Find\";\n\t\tfindInput.className = \"dg-find-input\";\n\n\t\tconst toggles = document.createElement(\"div\");\n\t\ttoggles.className = \"dg-find-toggles\";\n\n\t\tconst toggleCase = document.createElement(\"button\");\n\t\ttoggleCase.type = \"button\";\n\t\ttoggleCase.className = \"dg-find-button dg-find-toggle\";\n\t\ttoggleCase.textContent = \"Aa\";\n\n\t\tconst toggleWhole = document.createElement(\"button\");\n\t\ttoggleWhole.type = \"button\";\n\t\ttoggleWhole.className = \"dg-find-button dg-find-toggle\";\n\t\ttoggleWhole.textContent = \"␣ab␣\";\n\n\t\tconst toggleRegex = document.createElement(\"button\");\n\t\ttoggleRegex.type = \"button\";\n\t\ttoggleRegex.className = \"dg-find-button dg-find-toggle\";\n\t\ttoggleRegex.textContent = \"*\";\n\n\t\ttoggles.appendChild(toggleCase);\n\t\ttoggles.appendChild(toggleWhole);\n\t\ttoggles.appendChild(toggleRegex);\n\n\t\tinputWrapper.appendChild(findInput);\n\t\tinputWrapper.appendChild(toggles);\n\n\t\tconst statusLabel = document.createElement(\"span\");\n\t\tstatusLabel.className = \"dg-find-status\";\n\t\tstatusLabel.textContent = \"\";\n\n\t\tconst prevButton = document.createElement(\"button\");\n\t\tprevButton.type = \"button\";\n\t\tprevButton.className = \"dg-find-button dg-find-arrow dg-find-prev\";\n\t\tprevButton.textContent = \"↑\";\n\n\t\tconst nextButton = document.createElement(\"button\");\n\t\tnextButton.type = \"button\";\n\t\tnextButton.className = \"dg-find-button dg-find-arrow dg-find-next\";\n\t\tnextButton.textContent = \"↓\";\n\n\t\tconst closeButton = document.createElement(\"button\");\n\t\tcloseButton.type = \"button\";\n\t\tcloseButton.className = \"dg-find-button dg-find-close\";\n\t\tcloseButton.textContent = \"✕\";\n\n\t\tmainRow.appendChild(chevronButton);\n\t\tmainRow.appendChild(inputWrapper);\n\t\tmainRow.appendChild(statusLabel);\n\t\tmainRow.appendChild(prevButton);\n\t\tmainRow.appendChild(nextButton);\n\t\tmainRow.appendChild(closeButton);\n\n\t\t// --- second row: replace controls ---\n\t\tconst replaceRow = document.createElement(\"div\");\n\t\treplaceRow.className = \"dg-find-row dg-find-row-replace\";\n\n\t\tconst replaceInput = document.createElement(\"input\");\n\t\treplaceInput.type = \"text\";\n\t\treplaceInput.placeholder = \"Replace\";\n\t\treplaceInput.className = \"dg-find-input dg-find-input-replace\";\n\n\t\tconst replaceButton = document.createElement(\"button\");\n\t\treplaceButton.type = \"button\";\n\t\treplaceButton.className = \"dg-find-button dg-find-action\";\n\t\treplaceButton.textContent = \"Replace\";\n\n\t\tconst replaceAllButton = document.createElement(\"button\");\n\t\treplaceAllButton.type = \"button\";\n\t\treplaceAllButton.className = \"dg-find-button dg-find-action\";\n\t\treplaceAllButton.textContent = \"Replace all\";\n\n\t\treplaceRow.appendChild(replaceInput);\n\t\treplaceRow.appendChild(replaceButton);\n\t\treplaceRow.appendChild(replaceAllButton);\n\n\t\tpanel.appendChild(mainRow);\n\t\tpanel.appendChild(replaceRow);\n\n\t\t// Prevent grid handlers while interacting with the panel\n\t\tpanel.addEventListener(\"mousedown\", (e) => {\n\t\t\te.stopPropagation();\n\t\t});\n\n\t\tpanel.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Escape\") {\n\t\t\t\te.stopPropagation();\n\t\t\t\te.preventDefault();\n\t\t\t\tthis.callbacks.onClose();\n\t\t\t}\n\t\t});\n\n\t\tlet expanded = false;\n\t\tconst applyExpandState = () => {\n\t\t\tpanel.classList.toggle(\"dg-find-collapsed\", !expanded);\n\t\t\treplaceRow.style.display = expanded ? \"flex\" : \"none\";\n\t\t};\n\t\tapplyExpandState();\n\n\t\tchevronButton.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\texpanded = !expanded;\n\t\t\tapplyExpandState();\n\t\t});\n\n\t\ttoggleCase.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.caseSensitive = !this.caseSensitive;\n\t\t\ttoggleCase.classList.toggle(\"dg-find-toggle-active\", this.caseSensitive);\n\t\t});\n\n\t\ttoggleWhole.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.wholeWord = !this.wholeWord;\n\t\t\ttoggleWhole.classList.toggle(\"dg-find-toggle-active\", this.wholeWord);\n\t\t});\n\n\t\ttoggleRegex.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.regexEnabled = !this.regexEnabled;\n\t\t\ttoggleRegex.classList.toggle(\"dg-find-toggle-active\", this.regexEnabled);\n\t\t});\n\n\t\tprevButton.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.callbacks.onFindPrevious();\n\t\t});\n\n\t\tnextButton.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.callbacks.onFindNext();\n\t\t});\n\n\t\treplaceButton.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.callbacks.onReplaceCurrent();\n\t\t});\n\n\t\treplaceAllButton.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.callbacks.onReplaceAll();\n\t\t});\n\n\t\tcloseButton.addEventListener(\"click\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.callbacks.onClose();\n\t\t});\n\n\t\tfindInput.addEventListener(\"input\", () => {\n\t\t\t// Live search while typing: reuse the same handler as \"Next\".\n\t\t\tthis.callbacks.onFindNext();\n\t\t});\n\n\t\tfindInput.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tthis.callbacks.onFindPrevious();\n\t\t\t\t} else {\n\t\t\t\t\tthis.callbacks.onFindNext();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treplaceInput.addEventListener(\"keydown\", (e: KeyboardEvent) => {\n\t\t\tif (e.key === \"Enter\") {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.callbacks.onReplaceCurrent();\n\t\t\t\tthis.callbacks.onFindNext();\n\t\t\t}\n\t\t});\n\n\t\t// Ensure parent is positioned so panel absolute positioning is relative to it\n\t\tif (!this.parent.style.position) {\n\t\t\tthis.parent.style.position = \"relative\";\n\t\t}\n\n\t\tthis.parent.appendChild(panel);\n\n\t\tthis.panel = panel;\n\t\tthis.findInput = findInput;\n\t\tthis.replaceInput = replaceInput;\n\t\tthis.statusLabel = statusLabel;\n\t\tthis.prevButton = prevButton;\n\t\tthis.nextButton = nextButton;\n\t\tthis.chevronButton = chevronButton;\n\n\t\t// Initial state: no results, navigation disabled\n\t\tthis.setStatus(\"No results\");\n\t\tthis.setFindControlsEnabled(false);\n\t}\n\n\tpublic show(): void {\n\t\tthis.panel.style.display = \"flex\";\n\t\tthis.panel.style.opacity = \"1\";\n\t\tthis.findInput.focus();\n\t\tthis.findInput.select();\n\t}\n\n\tpublic hide(): void {\n\t\tthis.panel.style.display = \"none\";\n\t}\n\n\tpublic toggle(): void {\n\t\tconst isHidden = this.panel.style.display === \"none\" || this.panel.style.display === \"\";\n\t\tif (isHidden) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\n\tpublic getFindText(): string {\n\t\treturn this.findInput.value.trim();\n\t}\n\n\tpublic getReplaceText(): string {\n\t\treturn this.replaceInput.value ?? \"\";\n\t}\n\n\tpublic isCaseSensitive(): boolean {\n\t\treturn this.caseSensitive;\n\t}\n\n\tpublic isWholeWord(): boolean {\n\t\treturn this.wholeWord;\n\t}\n\n\tpublic isRegexEnabled(): boolean {\n\t\treturn this.regexEnabled;\n\t}\n\n\tpublic setStatus(text: string): void {\n\t\tif (this.statusLabel) {\n\t\t\tthis.statusLabel.textContent = text;\n\t\t}\n\t}\n\n\tpublic setFindControlsEnabled(hasMatches: boolean): void {\n\t\tconst disabled = !hasMatches;\n\t\tif (this.prevButton) {\n\t\t\tthis.prevButton.disabled = disabled;\n\t\t}\n\t\tif (this.nextButton) {\n\t\t\tthis.nextButton.disabled = disabled;\n\t\t}\n\t\tif (this.chevronButton) {\n\t\t\tthis.chevronButton.disabled = disabled;\n\t\t}\n\t}\n\n\tpublic setFindText(text: string): void {\n\t\tthis.findInput.value = text ?? \"\";\n\t}\n\n\tpublic destroy(): void {\n\t\tthis.panel.remove();\n\t}\n}\n\n","import { AutoWired, Bean, EventEmitter, Optional } from '@dg/corecomponent';\nimport { NESTED_HEADER_BEAN_NAME } from './constants/bean-names';\nimport { ColumnTreeModel } from './column-tree-model';\nimport { ColumnGroupHandler } from './column-group-handler';\nimport type { IColumnGroupAPI } from './column-group-api.types';\nimport type { IColumnDefinition, IColumnGroupDefinition } from '../Grid/Core/Interface/IColumnDefinition';\nimport type { MovePosition } from './column-group-api.types';\nimport type { IColumnSelection } from '../Selection/column-selection.types';\n\n@Bean(NESTED_HEADER_BEAN_NAME.COLUMN_GROUP_API)\nexport class ColumnGroupAPI extends EventEmitter implements IColumnGroupAPI {\n\t@AutoWired(NESTED_HEADER_BEAN_NAME.COLUMN_TREE_MODEL) private treeModel!: ColumnTreeModel;\n\t@AutoWired(NESTED_HEADER_BEAN_NAME.COLUMN_GROUP_HANDLER) private groupHandler!: ColumnGroupHandler;\n\t@Optional('columnSelection') private columnSelection?: IColumnSelection;\n\n\texpandColumnGroup(groupId: string): void {\n\t\tthis.groupHandler.expandGroup(groupId, 'api');\n\t}\n\n\tcollapseColumnGroup(groupId: string): void {\n\t\tthis.groupHandler.collapseGroup(groupId, 'api');\n\t}\n\n\ttoggleColumnGroup(groupId: string): void {\n\t\tconst group = this.treeModel.getGroupById(groupId);\n\t\tif (!group) return;\n\t\tif (group.isExpanded()) this.groupHandler.collapseGroup(groupId, 'api');\n\t\telse this.groupHandler.expandGroup(groupId, 'api');\n\t}\n\n\texpandAllColumnGroups(): void {\n\t\tthis.treeModel.getGroupsAtLevel(0).forEach(g => this.groupHandler.expandGroup(g.getGroupId(), 'api'));\n\t\tfor (let l = 1; l < this.treeModel.getMaxDepth(); l++) {\n\t\t\tthis.treeModel.getGroupsAtLevel(l).forEach(g => this.groupHandler.expandGroup(g.getGroupId(), 'api'));\n\t\t}\n\t}\n\n\tcollapseAllColumnGroups(): void {\n\t\tfor (let l = this.treeModel.getMaxDepth() - 1; l >= 0; l--) {\n\t\t\tthis.treeModel.getGroupsAtLevel(l).forEach(g => this.groupHandler.collapseGroup(g.getGroupId(), 'api'));\n\t\t}\n\t}\n\n\tsetColumnGroupsExpanded(groupIds: string[], expanded: boolean): void {\n\t\tgroupIds.forEach(id => {\n\t\t\tif (expanded) this.groupHandler.expandGroup(id, 'api');\n\t\t\telse this.groupHandler.collapseGroup(id, 'api');\n\t\t});\n\t}\n\n\tisColumnGroupExpanded(groupId: string): boolean {\n\t\tconst group = this.treeModel.getGroupById(groupId);\n\t\treturn group?.isExpanded() ?? false;\n\t}\n\n\tisColumnGroupExpandable(groupId: string): boolean {\n\t\tconst group = this.treeModel.getGroupById(groupId);\n\t\treturn group?.isExpandable() ?? false;\n\t}\n\n\tgetExpandedColumnGroups(): string[] {\n\t\tconst out: string[] = [];\n\t\tfor (let l = 0; l < this.treeModel.getMaxDepth(); l++) {\n\t\t\tthis.treeModel.getGroupsAtLevel(l).forEach(g => {\n\t\t\t\tif (g.isExpanded()) out.push(g.getGroupId());\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t}\n\n\tgetCollapsedColumnGroups(): string[] {\n\t\tconst out: string[] = [];\n\t\tfor (let l = 0; l < this.treeModel.getMaxDepth(); l++) {\n\t\t\tthis.treeModel.getGroupsAtLevel(l).forEach(g => {\n\t\t\t\tif (!g.isExpanded() && g.isExpandable()) out.push(g.getGroupId());\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Insert a root-level column (not inside any group). */\n\tinsertColumn(columnDef: IColumnDefinition, position?: number | 'first' | 'last'): void {\n\t\tthis.treeModel.addRootColumn(columnDef, position);\n\t}\n\n\t/** Insert a column (by def) into an existing group. Rebuilds columns via tree structure change event. */\n\tinsertColumnIntoGroup(groupId: string, columnDef: IColumnDefinition, position?: number | 'first' | 'last'): void {\n\t\tif (!this.treeModel.getGroupById(groupId)) return;\n\t\tthis.treeModel.addColumnToGroup(groupId, columnDef, position);\n\t}\n\n\t/** Insert a new column group at root by numeric index. */\n\tinsertColumnGroup(groupDef: IColumnGroupDefinition, targetIndex?: number, position?: MovePosition): void {\n\t\tthis.treeModel.addRootGroupFromDef(groupDef, targetIndex, position);\n\t}\n\n\t/** Insert a new column group at root, positioned relative to an existing root-level column or group. */\n\tinsertColumnGroupAt(referenceId: string, groupDef: IColumnGroupDefinition, position: MovePosition): void {\n\t\tconst index = this.treeModel.getRootChildIndex(referenceId);\n\t\tif (index < 0) return;\n\t\tthis.treeModel.addRootGroupFromDef(groupDef, index, position);\n\t}\n\n\t/** Insert a new subgroup under an existing group. */\n\tinsertSubGroup(parentGroupId: string, groupDef: IColumnGroupDefinition, position?: number | 'first' | 'last'): void {\n\t\tif (!this.treeModel.getGroupById(parentGroupId)) return;\n\t\tthis.treeModel.addGroupFromDef(parentGroupId, groupDef, position);\n\t}\n\n\t/** Remove a single column (leaf) from a group. */\n\tremoveColumnFromGroup(groupId: string, columnId: string): void {\n\t\tif (!this.treeModel.getGroupById(groupId)) return;\n\t\tthis.treeModel.removeFromGroup(groupId, columnId);\n\t}\n\n\t/** Remove group and all its descendant columns. */\n\tremoveColumnGroup(groupId: string): void {\n\t\tif (!this.treeModel.getGroupById(groupId)) return;\n\t\tthis.treeModel.removeGroup(groupId);\n\t}\n\n\t/** Ungroup: dissolve group and promote children to parent. */\n\tungroupColumns(groupId: string): void {\n\t\tif (!this.treeModel.getGroupById(groupId)) return;\n\t\tthis.treeModel.promoteChildren(groupId);\n\t}\n\n\t/** Not implemented: move a column group to another position. */\n\tmoveColumnGroup(_sourceGroupId: string, _targetId: string, _position?: MovePosition): void {\n\t\tthis.treeModel.invalidateCache();\n\t}\n\n\t/** Not implemented: move a leaf column into another group. */\n\tmoveColumnToGroup(_columnId: string, _targetGroupId: string, _position?: number | 'first' | 'last'): void {\n\t\tthis.treeModel.invalidateCache();\n\t}\n\n\t/** Not implemented: move a leaf column out of its group to root. */\n\tmoveColumnOutOfGroup(_columnId: string, _position?: MovePosition): void {\n\t\tthis.treeModel.invalidateCache();\n\t}\n\n\t/** Get the number of direct children (leaf columns + sub-groups) of a group. */\n\tgetGroupChildCount(groupId: string): number {\n\t\tconst group = this.treeModel.getGroupById(groupId);\n\t\treturn group ? group.getRawChildren().length : 0;\n\t}\n\n\tgetColumnGroupState(): { groupId: string; expanded: boolean }[] {\n\t\tconst out: { groupId: string; expanded: boolean }[] = [];\n\t\tfor (let l = 0; l < this.treeModel.getMaxDepth(); l++) {\n\t\t\tthis.treeModel.getGroupsAtLevel(l).forEach(g => {\n\t\t\t\tout.push({ groupId: g.getGroupId(), expanded: g.isExpanded() });\n\t\t\t});\n\t\t}\n\t\treturn out;\n\t}\n\n\tsetColumnGroupState(state: { groupId: string; expanded: boolean }[]): void {\n\t\tstate.forEach(({ groupId, expanded }) => {\n\t\t\tif (expanded) this.groupHandler.expandGroup(groupId, 'api');\n\t\t\telse this.groupHandler.collapseGroup(groupId, 'api');\n\t\t});\n\t}\n\n\tselectColumnGroup(groupId: string, selected: boolean = true): void {\n\t\tthis.columnSelection?.setColumnGroupSelected({ groupId, newValue: selected, source: 'api' });\n\t}\n\n\tisColumnGroupSelected(groupId: string): boolean {\n\t\treturn this.columnSelection?.isColumnGroupSelected(groupId) ?? false;\n\t}\n\n\tisColumnGroupPartiallySelected(groupId: string): boolean {\n\t\treturn this.columnSelection?.isColumnGroupPartiallySelected(groupId) ?? false;\n\t}\n}\n","import { AutoWired, Bean, EventEmitter, PostConstruct } from '@dg/corecomponent';\nimport { ColumnTreeModel } from './column-tree-model';\nimport { ColumnGroupNode } from './column-group-node';\nimport { NESTED_HEADER_BEAN_NAME } from './constants/bean-names';\nimport { COLUMN_GROUP_EVENTS } from './constants/events';\nimport type { IColumnGroupHandler } from './column-group-handler.types';\nimport { Events } from '../Grid/Core/Constants/Events';\n\n@Bean(NESTED_HEADER_BEAN_NAME.COLUMN_GROUP_HANDLER)\nexport class ColumnGroupHandler extends EventEmitter implements IColumnGroupHandler {\n\t@AutoWired(NESTED_HEADER_BEAN_NAME.COLUMN_TREE_MODEL) private treeModel!: ColumnTreeModel;\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tfor (let level = 0; level < this.treeModel.getMaxDepth(); level++) {\n\t\t\tthis.treeModel.getGroupsAtLevel(level).forEach(g => this.recalculateVisibility(g));\n\t\t}\n\t}\n\n\texpandGroup(groupId: string, source: 'api' | 'ui' = 'api'): void {\n\t\tconst group = this.treeModel.getGroupById(groupId);\n\t\tif (!group || !group.isExpandable()) return;\n\t\tgroup.setExpanded(true);\n\t\tthis.recalculateVisibility(group);\n\t\tthis.treeModel.invalidateCache();\n\t\tthis.dispatchEvent({ type: COLUMN_GROUP_EVENTS.EVENT_COLUMN_GROUP_EXPANDED, groupId, source });\n\t\ttry {\n\t\t\tconst eh = (this as any).eventHandler;\n\t\t\teh?.dispatchEvent?.({ type: COLUMN_GROUP_EVENTS.EVENT_COLUMN_GROUP_EXPANDED, groupId, source });\n\t\t\teh?.dispatchEvent?.({ type: Events.EVENT_DISPLAYED_COLUMNS_CHANGED });\n\t\t} catch (_) {}\n\t}\n\n\tcollapseGroup(groupId: string, source: 'api' | 'ui' = 'api'): void {\n\t\tconst group = this.treeModel.getGroupById(groupId);\n\t\tif (!group || !group.isExpandable()) return;\n\t\tgroup.setExpanded(false);\n\t\tthis.recalculateVisibility(group);\n\t\tthis.treeModel.invalidateCache();\n\t\tthis.dispatchEvent({ type: COLUMN_GROUP_EVENTS.EVENT_COLUMN_GROUP_COLLAPSED, groupId, source });\n\t\ttry {\n\t\t\tconst eh = (this as any).eventHandler;\n\t\t\teh?.dispatchEvent?.({ type: COLUMN_GROUP_EVENTS.EVENT_COLUMN_GROUP_COLLAPSED, groupId, source });\n\t\t\teh?.dispatchEvent?.({ type: Events.EVENT_DISPLAYED_COLUMNS_CHANGED });\n\t\t} catch (_) {}\n\t}\n\n\trecalculateVisibility(group: ColumnGroupNode): void {\n\t\tconst raw = group.getOriginalChildren();\n\t\tconst displayed: typeof raw = [];\n\t\tconst expanded = group.isExpanded();\n\t\tconst childDefs = (group.getUserDefinition() as any).children as any[] | undefined;\n\t\tfor (let i = 0; i < raw.length; i++) {\n\t\t\tconst ch = raw[i];\n\t\t\tif (typeof ch === 'string') {\n\t\t\t\tconst def = childDefs?.find((c: any) => (c?.columnId ?? c?.columnKey ?? c) === ch);\n\t\t\t\tconst show = def?.columnGroupShow;\n\t\t\t\tif (show == null || show === undefined) displayed.push(ch);\n\t\t\t\telse if (expanded && show === 'open') displayed.push(ch);\n\t\t\t\telse if (!expanded && show === 'closed') displayed.push(ch);\n\t\t\t} else {\n\t\t\t\tthis.recalculateVisibility(ch as ColumnGroupNode);\n\t\t\t\tdisplayed.push(ch);\n\t\t\t}\n\t\t}\n\t\tgroup.setDisplayedChildren(displayed);\n\t}\n}\n","import type { IColumnGroupDefinition, IColumnDefinition } from '../Grid/Core/Interface/IColumnDefinition';\nimport type { IColumnNode } from '../Grid/Core/Interface/IColumnNode';\n\nexport type LeafResolver = (columnId: string) => IColumnNode | null;\n\n/** Child is either a nested group or a leaf column id */\nexport type ColumnGroupChild = ColumnGroupNode | string;\n\nexport class ColumnGroupNode {\n\tprivate groupId: string;\n\tprivate headerName: string;\n\tprivate expanded: boolean;\n\tprivate parent: ColumnGroupNode | null;\n\tprivate children: ColumnGroupChild[];\n\tprivate originalChildren: ColumnGroupChild[];\n\tprivate level: number;\n\tprivate marryChildren: boolean;\n\tprivate userDefinition: IColumnGroupDefinition;\n\tprivate expandedChangedListeners: Array<() => void> = [];\n\tprivate leafResolver: LeafResolver;\n\n\tconstructor(\n\t\tgroupId: string,\n\t\theaderName: string,\n\t\tchildren: ColumnGroupChild[],\n\t\tlevel: number,\n\t\tparent: ColumnGroupNode | null,\n\t\tuserDefinition: IColumnGroupDefinition,\n\t\tleafResolver: LeafResolver,\n\t\topenByDefault?: boolean\n\t) {\n\t\tthis.groupId = groupId;\n\t\tthis.headerName = headerName;\n\t\tthis.expanded = openByDefault ?? false;\n\t\tthis.parent = parent;\n\t\tthis.children = [...children];\n\t\tthis.originalChildren = [...children];\n\t\tthis.level = level;\n\t\tthis.marryChildren = userDefinition.marryChildren ?? false;\n\t\tthis.userDefinition = userDefinition;\n\t\tthis.leafResolver = leafResolver;\n\t}\n\n\tgetGroupId(): string {\n\t\treturn this.groupId;\n\t}\n\n\tgetHeaderName(): string {\n\t\treturn this.headerName;\n\t}\n\n\tgetLevel(): number {\n\t\treturn this.level;\n\t}\n\n\tsetLevel(level: number): void {\n\t\tthis.level = level;\n\t}\n\n\tgetParent(): ColumnGroupNode | null {\n\t\treturn this.parent;\n\t}\n\n\tgetChildren(): (IColumnNode | ColumnGroupNode)[] {\n\t\treturn this.children.map(ch => {\n\t\t\tif (typeof ch === 'string') {\n\t\t\t\tconst node = this.leafResolver(ch);\n\t\t\t\treturn node as IColumnNode;\n\t\t\t}\n\t\t\treturn ch;\n\t\t}).filter(Boolean) as (IColumnNode | ColumnGroupNode)[];\n\t}\n\n\tgetRawChildren(): ColumnGroupChild[] {\n\t\treturn this.children;\n\t}\n\n\tgetOriginalChildren(): ColumnGroupChild[] {\n\t\treturn this.originalChildren;\n\t}\n\n\tgetUserDefinition(): IColumnGroupDefinition {\n\t\treturn this.userDefinition;\n\t}\n\n\tisExpanded(): boolean {\n\t\treturn this.expanded;\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this.expanded === expanded) return;\n\t\tthis.expanded = expanded;\n\t\tthis.expandedChangedListeners.forEach(fn => fn());\n\t}\n\n\tisExpandable(): boolean {\n\t\tconst childDefs = (this.userDefinition as any).children as any[] | undefined;\n\t\tif (!childDefs) return false;\n\t\treturn this.originalChildren.some(ch => {\n\t\t\tif (typeof ch !== 'string') return false;\n\t\t\tconst def = childDefs.find((c: any) => (c?.columnId ?? c?.columnKey ?? c) === ch);\n\t\t\treturn def?.columnGroupShow === 'open' || def?.columnGroupShow === 'closed';\n\t\t});\n\t}\n\n\tisMarryChildren(): boolean {\n\t\treturn this.marryChildren;\n\t}\n\n\tisSpanning(): boolean {\n\t\treturn (this.userDefinition as any).enableSpanning === true;\n\t}\n\n\tgetLeafColumns(): IColumnNode[] {\n\t\tconst out: IColumnNode[] = [];\n\t\tconst collect = (ch: ColumnGroupChild) => {\n\t\t\tif (typeof ch === 'string') {\n\t\t\t\tconst node = this.leafResolver(ch);\n\t\t\t\tif (node) out.push(node);\n\t\t\t} else {\n\t\t\t\tch.getLeafColumns().forEach(c => out.push(c));\n\t\t\t}\n\t\t};\n\t\tthis.originalChildren.forEach(collect);\n\t\treturn out;\n\t}\n\n\tgetDisplayedChildren(): (IColumnNode | ColumnGroupNode)[] {\n\t\treturn this.children.map(ch => {\n\t\t\tif (typeof ch === 'string') {\n\t\t\t\tconst node = this.leafResolver(ch);\n\t\t\t\treturn node as IColumnNode;\n\t\t\t}\n\t\t\treturn ch;\n\t\t}).filter(Boolean) as (IColumnNode | ColumnGroupNode)[];\n\t}\n\n\tgetDisplayedLeafColumns(): IColumnNode[] {\n\t\tconst out: IColumnNode[] = [];\n\t\tconst collect = (ch: ColumnGroupChild) => {\n\t\t\tif (typeof ch === 'string') {\n\t\t\t\tconst node = this.leafResolver(ch);\n\t\t\t\tif (node) out.push(node);\n\t\t\t} else {\n\t\t\t\tch.getDisplayedLeafColumns().forEach(c => out.push(c));\n\t\t\t}\n\t\t};\n\t\tthis.children.forEach(collect);\n\t\treturn out;\n\t}\n\n\tgetColSpan(): number {\n\t\treturn this.getDisplayedLeafColumns().length;\n\t}\n\n\tgetRowSpan(): number {\n\t\treturn 1;\n\t}\n\n\taddEventListener(_type: 'expandedChanged', listener: () => void): void {\n\t\tthis.expandedChangedListeners.push(listener);\n\t}\n\n\tremoveEventListener(_type: 'expandedChanged', listener: () => void): void {\n\t\tconst i = this.expandedChangedListeners.indexOf(listener);\n\t\tif (i >= 0) this.expandedChangedListeners.splice(i, 1);\n\t}\n\n\t/** Replace displayed children (used by ColumnTreeModel for visibility) */\n\tsetDisplayedChildren(children: ColumnGroupChild[]): void {\n\t\tthis.children = [...children];\n\t}\n\n\tsetParent(parent: ColumnGroupNode | null): void {\n\t\tthis.parent = parent;\n\t}\n\n\t/** Insert a child (leaf id or group) and its def at index. Used by tree model for insert API. */\n\taddChildAt(index: number, child: ColumnGroupChild, childDef: IColumnDefinition | IColumnGroupDefinition): void {\n\t\tconst safeIndex = Math.max(0, Math.min(index, this.children.length));\n\t\tthis.children.splice(safeIndex, 0, child);\n\t\tthis.originalChildren.splice(safeIndex, 0, child);\n\t\tconst defChildren = (this.userDefinition as any).children as (IColumnDefinition | IColumnGroupDefinition)[];\n\t\tif (Array.isArray(defChildren)) {\n\t\t\tdefChildren.splice(safeIndex, 0, childDef);\n\t\t} else {\n\t\t\t(this.userDefinition as any).children = [childDef];\n\t\t}\n\t}\n\n\t/** Remove child at index; returns removed child and its def for caller to update flattened state. */\n\tremoveChildAt(index: number): { child: ColumnGroupChild; childDef: IColumnDefinition | IColumnGroupDefinition } | null {\n\t\tif (index < 0 || index >= this.children.length) return null;\n\t\tconst child = this.children[index];\n\t\tthis.children.splice(index, 1);\n\t\tthis.originalChildren.splice(index, 1);\n\t\tconst defChildren = (this.userDefinition as any).children as (IColumnDefinition | IColumnGroupDefinition)[];\n\t\tconst childDef = Array.isArray(defChildren) && defChildren[index] != null ? defChildren[index] : (typeof child === 'string' ? { columnId: child, columnKey: child } : (child as ColumnGroupNode).getUserDefinition());\n\t\tif (Array.isArray(defChildren)) {\n\t\t\tdefChildren.splice(index, 1);\n\t\t}\n\t\treturn { child, childDef };\n\t}\n\n\t/** Find index of child by column id or group id; -1 if not found. */\n\tindexOfChild(idOrGroupId: string): number {\n\t\tfor (let i = 0; i < this.originalChildren.length; i++) {\n\t\t\tconst ch = this.originalChildren[i];\n\t\t\tif (ch === idOrGroupId) return i;\n\t\t\tif (typeof ch !== 'string' && ch.getGroupId() === idOrGroupId) return i;\n\t\t}\n\t\treturn -1;\n\t}\n}\n","import { AutoWired, Bean, BEAN_NAME, EventEmitter, PostConstruct } from '@dg/corecomponent';\nimport { columnPinPositions } from '../Grid/Core/Constants/GridConfigurationConstants';\nimport { GRID_BEAN_NAME } from '../Grid/Core/Constants/BeanName';\nimport { FieldHandler } from '../Grid/Core/Columns/FieldHandler';\nimport { IColumnNode } from '../Grid/Core/Interface/IColumnNode';\nimport {\n\tColumnDefInput,\n\tIColumnDefinition,\n\tIColumnGroupDefinition,\n\tisColumnGroup,\n} from '../Grid/Core/Interface/IColumnDefinition';\nimport { ColumnGroupNode, LeafResolver } from './column-group-node';\nimport { NESTED_HEADER_BEAN_NAME } from './constants/bean-names';\nimport { COLUMN_GROUP_EVENTS } from './constants/events';\nimport { Events } from '../Grid/Core/Constants/Events';\nimport type { HeaderRowItem } from './column-tree-model.types';\nimport type { ColumnGroupChild } from './column-group-node';\n\n@Bean(NESTED_HEADER_BEAN_NAME.COLUMN_TREE_MODEL)\nexport class ColumnTreeModel extends EventEmitter {\n\t@AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) private fieldHandler!: FieldHandler;\n\t@AutoWired(BEAN_NAME.OPTION_HANDLER) private gridOptionHandler!: { getColumnDef: () => ColumnDefInput[]; getDefaultColGroupDef?: () => Partial<IColumnGroupDefinition> };\n\n\tprivate rootChildren: ColumnGroupChild[] = [];\n\tprivate groupMap = new Map<string, ColumnGroupNode>();\n\tprivate leafColumnIds: string[] = [];\n\tprivate maxDepth = 1;\n\tprivate flattenedDefs: IColumnDefinition[] = [];\n\tprivate defMap = new Map<string, IColumnDefinition>();\n\tprivate leafResolver: LeafResolver = (id: string) => this.fieldHandler.getColumnNodeByID(id);\n\n\t@PostConstruct()\n\tinit(): void {\n\t\tconst defs = this.gridOptionHandler.getColumnDef();\n\t\tif (defs && defs.length > 0) {\n\t\t\tthis.buildTree(defs, this.gridOptionHandler.getDefaultColGroupDef?.() ?? {});\n\t\t}\n\t}\n\n\tbuildTree(defs: ColumnDefInput[], defaults?: Partial<IColumnGroupDefinition>): void {\n\t\tthis.groupMap.clear();\n\t\tthis.defMap.clear();\n\t\tthis.leafColumnIds = [];\n\t\tthis.flattenedDefs = [];\n\t\tthis.rootChildren = [];\n\t\tthis.maxDepth = 1;\n\t\tconst resolver: LeafResolver = (id: string) => this.fieldHandler.getColumnNodeByID(id);\n\n\t\tconst process = (input: ColumnDefInput[], level: number, parent: ColumnGroupNode | null, inheritedPinPosition?: string): ColumnGroupChild[] => {\n\t\t\tconst result: ColumnGroupChild[] = [];\n\t\t\tfor (const def of input) {\n\t\t\t\tif (isColumnGroup(def)) {\n\t\t\t\t\tconst merged: IColumnGroupDefinition = { ...defaults, ...def };\n\t\t\t\t\tconst groupId = merged.groupId ?? `group_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\t\t\t\t\tconst headerName = merged.headerName ?? groupId;\n\t\t\t\t\tconst groupPin = (merged as any).pinPosition ?? inheritedPinPosition;\n\t\t\t\t\tconst childNodes = process(merged.children, level + 1, null as any, groupPin);\n\t\t\t\t\tthis.maxDepth = Math.max(this.maxDepth, level + 2);\n\t\t\t\t\tconst group = new ColumnGroupNode(\n\t\t\t\t\t\tgroupId,\n\t\t\t\t\t\theaderName,\n\t\t\t\t\t\tchildNodes,\n\t\t\t\t\t\tlevel,\n\t\t\t\t\t\tparent,\n\t\t\t\t\t\tmerged,\n\t\t\t\t\t\tresolver,\n\t\t\t\t\t\tmerged.openByDefault\n\t\t\t\t\t);\n\t\t\t\t\tchildNodes.forEach(ch => {\n\t\t\t\t\t\tif (typeof ch !== 'string') (ch as ColumnGroupNode).setParent(group);\n\t\t\t\t\t});\n\t\t\t\t\tthis.groupMap.set(groupId, group);\n\t\t\t\t\tresult.push(group);\n\t\t\t\t} else {\n\t\t\t\t\tconst colDef = def as IColumnDefinition;\n\t\t\t\t\tif (inheritedPinPosition && !colDef.pinPosition) {\n\t\t\t\t\t\tcolDef.pinPosition = inheritedPinPosition as any;\n\t\t\t\t\t}\n\t\t\t\t\tconst id = colDef.columnId ?? `col_${this.leafColumnIds.length}`;\n\t\t\t\t\tthis.leafColumnIds.push(id);\n\t\t\t\t\tthis.flattenedDefs.push(colDef);\n\t\t\t\t\tthis.defMap.set(id, colDef);\n\t\t\t\t\tresult.push(id);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\n\t\tthis.rootChildren = process(defs, 0, null);\n\t}\n\n\t/** Build a single group (and subtree) from a group def; returns group and leaf ids/defs for merging. */\n\tcreateGroupFromDef(\n\t\tgroupDef: IColumnGroupDefinition,\n\t\tparent: ColumnGroupNode | null,\n\t\tlevel: number\n\t): { group: ColumnGroupNode; leafIds: string[]; flatDefs: IColumnDefinition[] } {\n\t\tconst leafIds: string[] = [];\n\t\tconst flatDefs: IColumnDefinition[] = [];\n\t\tconst defaults = this.gridOptionHandler.getDefaultColGroupDef?.() ?? {};\n\t\tconst merged: IColumnGroupDefinition = { ...defaults, ...groupDef };\n\t\tconst groupId = merged.groupId ?? `group_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\t\tconst headerName = merged.headerName ?? groupId;\n\t\tconst resolver: LeafResolver = (id: string) => this.fieldHandler.getColumnNodeByID(id);\n\t\tconst processSub = (input: ColumnDefInput[], l: number, inheritedPinPosition?: string): ColumnGroupChild[] => {\n\t\t\tconst result: ColumnGroupChild[] = [];\n\t\t\tfor (const def of input) {\n\t\t\t\tif (isColumnGroup(def)) {\n\t\t\t\t\tconst m: IColumnGroupDefinition = { ...defaults, ...def };\n\t\t\t\t\tconst gid = m.groupId ?? `group_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\t\t\t\t\tconst subPin = (m as any).pinPosition ?? inheritedPinPosition;\n\t\t\t\t\tconst childNodes = processSub(m.children, l + 1, subPin);\n\t\t\t\t\tconst group = new ColumnGroupNode(gid, m.headerName ?? gid, childNodes, l, null as any, m, resolver, m.openByDefault);\n\t\t\t\t\tchildNodes.forEach(ch => { if (typeof ch !== 'string') (ch as ColumnGroupNode).setParent(group); });\n\t\t\t\t\tresult.push(group);\n\t\t\t\t} else {\n\t\t\t\t\tconst colDef = def as IColumnDefinition;\n\t\t\t\t\tif (inheritedPinPosition && !colDef.pinPosition) {\n\t\t\t\t\t\tcolDef.pinPosition = inheritedPinPosition as any;\n\t\t\t\t\t}\n\t\t\t\t\tconst id = (colDef as any).columnId ?? (colDef as any).columnKey ?? `col_${leafIds.length}`;\n\t\t\t\t\tleafIds.push(id);\n\t\t\t\t\tflatDefs.push(colDef);\n\t\t\t\t\tresult.push(id);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t};\n\t\tconst groupPin = (merged as any).pinPosition;\n\t\tconst childNodes = processSub(merged.children, level + 1, groupPin);\n\t\tconst group = new ColumnGroupNode(groupId, headerName, childNodes, level, parent, merged, resolver, merged.openByDefault);\n\t\tchildNodes.forEach(ch => { if (typeof ch !== 'string') (ch as ColumnGroupNode).setParent(group); });\n\t\treturn { group, leafIds, flatDefs };\n\t}\n\n\tprivate registerGroupAndDescendants(g: ColumnGroupNode): void {\n\t\tthis.groupMap.set(g.getGroupId(), g);\n\t\tg.getRawChildren().forEach(ch => {\n\t\t\tif (typeof ch !== 'string') this.registerGroupAndDescendants(ch as ColumnGroupNode);\n\t\t});\n\t}\n\n\t/** Add a new group (from def) under parent at index. Used by insertSubGroup. */\n\taddGroupFromDef(parentGroupId: string, groupDef: IColumnGroupDefinition, position?: number | 'first' | 'last'): void {\n\t\tconst parent = this.getGroupById(parentGroupId);\n\t\tif (!parent) return;\n\t\tconst { group, leafIds, flatDefs } = this.createGroupFromDef(groupDef, parent, parent.getLevel() + 1);\n\t\tconst raw = parent.getRawChildren();\n\t\tconst index = position === 'first' ? 0 : position === 'last' ? raw.length : typeof position === 'number' ? Math.max(0, Math.min(position, raw.length)) : raw.length;\n\t\tparent.addChildAt(index, group, group.getUserDefinition() as any);\n\t\tthis.registerGroupAndDescendants(group);\n\t\tleafIds.forEach((lid, i) => this.defMap.set(lid, flatDefs[i]));\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n\n\t/** Add a root-level leaf column at a position. Used by insertColumn. */\n\taddRootColumn(columnDef: IColumnDefinition, position?: number | 'first' | 'last'): void {\n\t\tconst id = (columnDef as any).columnId ?? (columnDef as any).columnKey ?? `col_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\t\tconst existingGroup = this.getParentGroup(id);\n\t\tif (existingGroup) {\n\t\t\tthis.removeFromGroup(existingGroup.getGroupId(), id);\n\t\t}\n\t\tlet index: number;\n\t\tif (position === 'first') index = 0;\n\t\telse if (position === 'last') index = this.rootChildren.length;\n\t\telse index = typeof position === 'number' ? Math.max(0, Math.min(position, this.rootChildren.length)) : this.rootChildren.length;\n\t\tthis.rootChildren.splice(index, 0, id);\n\t\tthis.defMap.set(id, columnDef);\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n\n\t/** Index of a root-level child (leaf column id or group id) in rootChildren; -1 if not found. */\n\tgetRootChildIndex(childId: string): number {\n\t\tfor (let i = 0; i < this.rootChildren.length; i++) {\n\t\t\tconst ch = this.rootChildren[i];\n\t\t\tif (ch === childId) return i;\n\t\t\tif (typeof ch !== 'string' && (ch as ColumnGroupNode).getGroupId() === childId) return i;\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/** Add a new top-level group from def. Used by insertColumnGroup. */\n\taddRootGroupFromDef(groupDef: IColumnGroupDefinition, targetIndex?: number, position?: 'before' | 'after'): void {\n\t\tconst { group, leafIds, flatDefs } = this.createGroupFromDef(groupDef, null, 0);\n\t\tlet index: number;\n\t\tif (typeof targetIndex === 'number') {\n\t\t\tconst safe = Math.max(0, Math.min(targetIndex, this.rootChildren.length));\n\t\t\tindex = position === 'after' ? safe + 1 : safe;\n\t\t} else {\n\t\t\tindex = this.rootChildren.length;\n\t\t}\n\t\tindex = Math.max(0, Math.min(index, this.rootChildren.length));\n\t\tthis.rootChildren.splice(index, 0, group);\n\t\tthis.registerGroupAndDescendants(group);\n\t\tleafIds.forEach((lid, i) => this.defMap.set(lid, flatDefs[i]));\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n\n\tgetFlattenedColumnDefinitions(): IColumnDefinition[] {\n\t\treturn this.flattenedDefs;\n\t}\n\n\t/** Get column definition by column id (for suppressSpanHeaderHeight etc.). */\n\tgetColumnDef(columnId: string): IColumnDefinition | undefined {\n\t\treturn this.flattenedDefs.find(\n\t\t\t(d: any) => (d.columnId ?? d.columnKey) === columnId\n\t\t);\n\t}\n\n\t/** Update a leaf column's definition in the tree (defMap, flattenedDefs, parent group children). */\n\tupdateColumnDef(columnId: string, partialDef: Partial<IColumnDefinition>): void {\n\t\tconst existing = this.defMap.get(columnId);\n\t\tif (!existing) return;\n\t\tconst merged = { ...existing, ...partialDef } as IColumnDefinition;\n\t\tthis.defMap.set(columnId, merged);\n\t\tconst idx = this.flattenedDefs.findIndex(\n\t\t\t(d: any) => (d.columnId ?? d.columnKey) === columnId\n\t\t);\n\t\tif (idx >= 0) this.flattenedDefs[idx] = merged;\n\t\tconst parentGroup = this.getParentGroup(columnId);\n\t\tif (parentGroup) {\n\t\t\tconst childDefs = (parentGroup.getUserDefinition() as any).children as any[];\n\t\t\tif (Array.isArray(childDefs)) {\n\t\t\t\tconst ci = childDefs.findIndex(\n\t\t\t\t\t(c: any) => (c?.columnId ?? c?.columnKey) === columnId\n\t\t\t\t);\n\t\t\t\tif (ci >= 0) childDefs[ci] = merged;\n\t\t\t}\n\t\t}\n\t}\n\n\tgetMaxDepth(): number {\n\t\treturn this.maxDepth;\n\t}\n\n\tgetRootChildren(): (IColumnNode | ColumnGroupNode)[] {\n\t\treturn this.rootChildren.map(ch => {\n\t\t\tif (typeof ch === 'string') {\n\t\t\t\tconst node = this.leafResolver(ch);\n\t\t\t\treturn node as IColumnNode;\n\t\t\t}\n\t\t\treturn ch;\n\t\t}).filter(Boolean) as (IColumnNode | ColumnGroupNode)[];\n\t}\n\n\tgetLeafColumns(): IColumnNode[] {\n\t\treturn this.leafColumnIds.map(id => this.leafResolver(id)).filter(Boolean) as IColumnNode[];\n\t}\n\n\tgetLeafColumnIds(): string[] {\n\t\treturn [...this.leafColumnIds];\n\t}\n\n\t/** Ordered list of displayed leaf column ids (respects expand/collapse and columnGroupShow). Uses raw tree so it works before column nodes exist. */\n\tgetDisplayedLeafColumnIds(): string[] {\n\t\tconst out: string[] = [];\n\t\tconst collect = (children: ColumnGroupChild[]) => {\n\t\t\tfor (const ch of children) {\n\t\t\t\tif (typeof ch === 'string') {\n\t\t\t\t\tout.push(ch);\n\t\t\t\t} else {\n\t\t\t\t\tcollect((ch as ColumnGroupNode).getRawChildren());\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tcollect(this.rootChildren);\n\t\treturn out;\n\t}\n\n\tgetGroupById(groupId: string): ColumnGroupNode | null {\n\t\treturn this.groupMap.get(groupId) ?? null;\n\t}\n\n\tgetGroupsAtLevel(level: number): ColumnGroupNode[] {\n\t\tconst out: ColumnGroupNode[] = [];\n\t\tconst visit = (children: ColumnGroupChild[], l: number) => {\n\t\t\tfor (const ch of children) {\n\t\t\t\tif (typeof ch !== 'string') {\n\t\t\t\t\tif (ch.getLevel() === level) out.push(ch);\n\t\t\t\t\tvisit(ch.getRawChildren(), l + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tvisit(this.rootChildren, 0);\n\t\treturn out;\n\t}\n\n\tgetParentGroup(columnId: string): ColumnGroupNode | null {\n\t\tfor (const [, group] of this.groupMap) {\n\t\t\tconst raw = group.getRawChildren();\n\t\t\tif (raw.some(ch => ch === columnId)) return group;\n\t\t}\n\t\treturn null;\n\t}\n\n\tgetAncestorGroups(columnId: string): ColumnGroupNode[] {\n\t\tconst out: ColumnGroupNode[] = [];\n\t\tlet g: ColumnGroupNode | null = this.getParentGroup(columnId);\n\t\twhile (g) {\n\t\t\tout.push(g);\n\t\t\tg = g.getParent();\n\t\t}\n\t\treturn out;\n\t}\n\n\t/** Group at given level that contains this column (for header row alignment). */\n\tgetGroupAtLevel(columnId: string, level: number): ColumnGroupNode | null {\n\t\tconst ancestors = this.getAncestorGroups(columnId);\n\t\treturn ancestors.find(g => g.getLevel() === level) ?? null;\n\t}\n\n\tgetColumnsForHeaderRow(rowIndex: number, pinned: columnPinPositions): HeaderRowItem[] {\n\t\treturn this.computeHeaderRow(rowIndex, pinned);\n\t}\n\n\tprivate computeHeaderRow(rowIndex: number, pinned: columnPinPositions): HeaderRowItem[] {\n\t\tconst leafRowIndex = this.maxDepth - 1;\n\t\tconst displayedOrdered = this.fieldHandler.getDisplayedColumns(pinned);\n\t\tconst columns = displayedOrdered.filter(\n\t\t\t(c): c is IColumnNode => (c as IColumnNode).getID != null\n\t\t) as IColumnNode[];\n\n\t\tif (columns.length === 0) return [];\n\n\t\tif (rowIndex === leafRowIndex) {\n\t\t\tconst leafItems: HeaderRowItem[] = [];\n\t\t\tcolumns.forEach((node, i) => {\n\t\t\t\tconst id = node.getID();\n\t\t\t\tconst ancestors = this.getAncestorGroups(id);\n\t\t\t\tif (ancestors.some((g) => g.isSpanning())) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst def = this.getColumnDef(id);\n\t\t\t\tconst suppressSpan = def?.suppressSpanHeaderHeight === true;\n\t\t\t\tlet rowSpan = 1;\n\t\t\t\tif (!suppressSpan) {\n\t\t\t\t\t// Span from the row below the deepest ancestor group to the leaf row.\n\t\t\t\t\t// Ungrouped columns span the full header height.\n\t\t\t\t\tconst deepestLevel = ancestors.length > 0\n\t\t\t\t\t\t? Math.max(...ancestors.map(g => g.getLevel()))\n\t\t\t\t\t\t: -1;\n\t\t\t\t\trowSpan = this.maxDepth - (deepestLevel + 1);\n\t\t\t\t}\n\t\t\t\tleafItems.push({\n\t\t\t\t\ttype: 'leaf' as const,\n\t\t\t\t\tnode,\n\t\t\t\t\tcolSpan: 1,\n\t\t\t\t\trowSpan,\n\t\t\t\t\tlevel: leafRowIndex,\n\t\t\t\t\tstartLeafIndex: i,\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn leafItems;\n\t\t}\n\n\t\tconst items: HeaderRowItem[] = [];\n\t\tlet i = 0;\n\t\twhile (i < columns.length) {\n\t\t\tconst col = columns[i];\n\t\t\tconst id = col.getID();\n\t\t\tconst group = this.getGroupAtLevel(id, rowIndex);\n\t\t\tif (group) {\n\t\t\t\tlet runLength = 1;\n\t\t\t\twhile (\n\t\t\t\t\ti + runLength < columns.length &&\n\t\t\t\t\tthis.getGroupAtLevel(columns[i + runLength].getID(), rowIndex) === group\n\t\t\t\t) {\n\t\t\t\t\trunLength++;\n\t\t\t\t}\n\t\t\t\tconst rowSpan = group.isSpanning() ? this.maxDepth - rowIndex : 1;\n\t\t\t\titems.push({\n\t\t\t\t\ttype: 'group',\n\t\t\t\t\tnode: group,\n\t\t\t\t\tcolSpan: runLength,\n\t\t\t\t\trowSpan,\n\t\t\t\t\tlevel: rowIndex,\n\t\t\t\t\tstartLeafIndex: i,\n\t\t\t\t});\n\t\t\t\ti += runLength;\n\t\t\t} else {\n\t\t\t\t// No group at this level: emit padding only when column opted out of spanning\n\t\t\t\t// (suppressSpanHeaderHeight). If column has a parent, we skip padding so the leaf\n\t\t\t\t// can span full height and avoid an empty row gap.\n\t\t\t\tconst def = this.getColumnDef(id);\n\t\t\t\tconst suppressSpan = def?.suppressSpanHeaderHeight === true;\n\t\t\t\tif (suppressSpan) {\n\t\t\t\t\titems.push({\n\t\t\t\t\t\ttype: 'padding',\n\t\t\t\t\t\tnode: col,\n\t\t\t\t\t\tcolSpan: 1,\n\t\t\t\t\t\trowSpan: 1,\n\t\t\t\t\t\tlevel: rowIndex,\n\t\t\t\t\t\tstartLeafIndex: i,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\ti += 1;\n\t\t\t}\n\t\t}\n\t\treturn items;\n\t}\n\n\tinvalidateCache(): void {\n\t\t// no-op: caching removed to avoid stale reads from event ordering races\n\t}\n\n\tprivate emitStructureChanged(): void {\n\t\tthis.dispatchEvent({ type: COLUMN_GROUP_EVENTS.EVENT_COLUMN_TREE_STRUCTURE_CHANGED });\n\t\ttry {\n\t\t\tconst eh = (this as any).eventHandler;\n\t\t\teh?.dispatchEvent?.({ type: COLUMN_GROUP_EVENTS.EVENT_COLUMN_TREE_STRUCTURE_CHANGED });\n\t\t\teh?.dispatchEvent?.({ type: Events.EVENT_DISPLAYED_COLUMNS_CHANGED });\n\t\t\teh?.dispatchEvent?.({ type: Events.EVENT_GRID_REFRESH });\n\t\t} catch (_) {}\n\t}\n\n\tprivate countLeavesUnder(ch: ColumnGroupChild): number {\n\t\tif (typeof ch === 'string') return 1;\n\t\treturn (ch as ColumnGroupNode).getRawChildren().reduce((s, c) => s + this.countLeavesUnder(c), 0);\n\t}\n\n\tprivate recalcMaxDepth(): void {\n\t\tlet depth = 1;\n\t\tconst visit = (children: ColumnGroupChild[], level: number) => {\n\t\t\tfor (const ch of children) {\n\t\t\t\tif (typeof ch !== 'string') {\n\t\t\t\t\tdepth = Math.max(depth, level + 2);\n\t\t\t\t\tvisit((ch as ColumnGroupNode).getRawChildren(), level + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tvisit(this.rootChildren, 0);\n\t\tthis.maxDepth = Math.max(1, depth);\n\t}\n\n\t/** Add a column (by def) into a group at position. Used by insertColumnIntoGroup. If column id already exists, removes from current group first. */\n\taddColumnToGroup(groupId: string, columnDef: IColumnDefinition, position?: number | 'first' | 'last'): void {\n\t\tconst group = this.getGroupById(groupId);\n\t\tif (!group) return;\n\t\tconst id = (columnDef as any).columnId ?? (columnDef as any).columnKey ?? `col_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\t\tconst existingGroup = this.getParentGroup(id);\n\t\tif (existingGroup) {\n\t\t\tthis.removeFromGroup(existingGroup.getGroupId(), id);\n\t\t}\n\t\tconst raw = group.getRawChildren();\n\t\tlet index: number;\n\t\tif (position === 'first') index = 0;\n\t\telse if (position === 'last') index = raw.length;\n\t\telse index = typeof position === 'number' ? Math.max(0, Math.min(position, raw.length)) : raw.length;\n\t\tgroup.addChildAt(index, id, columnDef as any);\n\t\tthis.defMap.set(id, columnDef);\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n\n\t/** Insert existing column or group node into a group at index. Used when moving. */\n\tinsertIntoGroup(groupId: string, child: IColumnNode | ColumnGroupNode, index: number): void {\n\t\tconst group = this.getGroupById(groupId);\n\t\tif (!group) return;\n\t\tconst id = typeof (child as IColumnNode).getID === 'function' ? (child as IColumnNode).getID() : (child as ColumnGroupNode).getGroupId();\n\t\tconst existingGroup = this.getParentGroup(id);\n\t\tif (existingGroup) {\n\t\t\tthis.removeFromGroup(existingGroup.getGroupId(), id);\n\t\t}\n\t\tconst safeIndex = Math.max(0, Math.min(index, group.getRawChildren().length));\n\t\tif (typeof (child as IColumnNode).getID === 'function') {\n\t\t\tconst colDef = this.defMap.get(id) ?? { columnId: id, columnKey: id } as IColumnDefinition;\n\t\t\tgroup.addChildAt(safeIndex, id, colDef as any);\n\t\t} else {\n\t\t\tconst subGroup = child as ColumnGroupNode;\n\t\t\tgroup.addChildAt(safeIndex, subGroup, subGroup.getUserDefinition() as any);\n\t\t\tthis.groupMap.set(subGroup.getGroupId(), subGroup);\n\t\t}\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n\n\t/** Remove a child (column id or group id) from a group. */\n\tremoveFromGroup(groupId: string, childId: string): void {\n\t\tconst group = this.getGroupById(groupId);\n\t\tif (!group) return;\n\t\tconst idx = group.indexOfChild(childId);\n\t\tif (idx < 0) return;\n\t\tconst removed = group.removeChildAt(idx);\n\t\tif (!removed) return;\n\t\tconst { child } = removed;\n\t\tif (typeof child === 'string') {\n\t\t\tthis.defMap.delete(child);\n\t\t} else {\n\t\t\tconst removeDescendants = (ch: ColumnGroupChild) => {\n\t\t\t\tif (typeof ch === 'string') { this.defMap.delete(ch); }\n\t\t\t\telse {\n\t\t\t\t\tthis.groupMap.delete((ch as ColumnGroupNode).getGroupId());\n\t\t\t\t\t(ch as ColumnGroupNode).getRawChildren().forEach(removeDescendants);\n\t\t\t\t}\n\t\t\t};\n\t\t\tremoveDescendants(child);\n\t\t}\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n\n\t/** Add a new group at root or under parent. */\n\taddGroup(group: ColumnGroupNode, parentGroupId: string | null, index: number): void {\n\t\tif (parentGroupId == null) {\n\t\t\tconst safeIndex = Math.max(0, Math.min(index, this.rootChildren.length));\n\t\t\tthis.rootChildren.splice(safeIndex, 0, group);\n\t\t\tgroup.setParent(null);\n\t\t\tthis.groupMap.set(group.getGroupId(), group);\n\t\t} else {\n\t\t\tconst parent = this.getGroupById(parentGroupId);\n\t\t\tif (!parent) return;\n\t\t\tconst safeIndex = Math.max(0, Math.min(index, parent.getRawChildren().length));\n\t\t\tparent.addChildAt(safeIndex, group, group.getUserDefinition() as any);\n\t\t\tgroup.setParent(parent);\n\t\t\tthis.groupMap.set(group.getGroupId(), group);\n\t\t}\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n\n\t/** Remove a group and all its descendant columns from the tree. */\n\tremoveGroup(groupId: string): void {\n\t\tconst group = this.getGroupById(groupId);\n\t\tif (!group) return;\n\t\tconst parent = group.getParent();\n\t\tconst removeDescendants = (ch: ColumnGroupChild) => {\n\t\t\tif (typeof ch === 'string') { this.defMap.delete(ch); }\n\t\t\telse {\n\t\t\t\tthis.groupMap.delete((ch as ColumnGroupNode).getGroupId());\n\t\t\t\t(ch as ColumnGroupNode).getRawChildren().forEach(removeDescendants);\n\t\t\t}\n\t\t};\n\t\tremoveDescendants(group);\n\t\tif (parent) {\n\t\t\tconst idx = parent.indexOfChild(groupId);\n\t\t\tif (idx >= 0) parent.removeChildAt(idx);\n\t\t} else {\n\t\t\tconst idx = this.rootChildren.indexOf(group);\n\t\t\tif (idx >= 0) this.rootChildren.splice(idx, 1);\n\t\t}\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n\n\t/** Rebuild flattenedDefs and leafColumnIds from current rootChildren using defMap. */\n\tprivate rebuildFlattenedFromTree(): void {\n\t\tconst ids: string[] = [];\n\t\tconst defs: IColumnDefinition[] = [];\n\t\tconst collect = (children: ColumnGroupChild[]) => {\n\t\t\tfor (const ch of children) {\n\t\t\t\tif (typeof ch === 'string') {\n\t\t\t\t\tids.push(ch);\n\t\t\t\t\tdefs.push(this.defMap.get(ch) ?? ({ columnId: ch, columnKey: ch } as IColumnDefinition));\n\t\t\t\t} else {\n\t\t\t\t\tcollect((ch as ColumnGroupNode).getRawChildren());\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tcollect(this.rootChildren);\n\t\tthis.leafColumnIds = ids;\n\t\tthis.flattenedDefs = defs;\n\t}\n\n\t/** Recursively update levels of a group and all its descendant groups. */\n\tprivate updateGroupLevels(group: ColumnGroupNode, newLevel: number): void {\n\t\tgroup.setLevel(newLevel);\n\t\tfor (const ch of group.getRawChildren()) {\n\t\t\tif (typeof ch !== 'string') {\n\t\t\t\tthis.updateGroupLevels(ch as ColumnGroupNode, newLevel + 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Ungroup: remove the group but promote its children to the parent (or root). */\n\tpromoteChildren(groupId: string): void {\n\t\tconst group = this.getGroupById(groupId);\n\t\tif (!group) return;\n\t\tconst parent = group.getParent();\n\t\tconst raw = group.getRawChildren();\n\t\tconst childDefs = (group.getUserDefinition() as any).children as (IColumnDefinition | IColumnGroupDefinition)[];\n\t\tconst newChildLevel = parent ? parent.getLevel() + 1 : 0;\n\t\tif (parent) {\n\t\t\tconst idx = parent.indexOfChild(groupId);\n\t\t\tif (idx < 0) return;\n\t\t\tparent.removeChildAt(idx);\n\t\t\tfor (let i = raw.length - 1; i >= 0; i--) {\n\t\t\t\tconst def = Array.isArray(childDefs) && childDefs[i] != null ? childDefs[i] : (typeof raw[i] === 'string' ? { columnId: raw[i], columnKey: raw[i] } : (raw[i] as ColumnGroupNode).getUserDefinition());\n\t\t\t\tparent.addChildAt(idx, raw[i], def as any);\n\t\t\t\tif (typeof raw[i] !== 'string') {\n\t\t\t\t\t(raw[i] as ColumnGroupNode).setParent(parent);\n\t\t\t\t\tthis.updateGroupLevels(raw[i] as ColumnGroupNode, newChildLevel);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst idx = this.rootChildren.indexOf(group);\n\t\t\tif (idx < 0) return;\n\t\t\tthis.rootChildren.splice(idx, 1);\n\t\t\tfor (let i = raw.length - 1; i >= 0; i--) {\n\t\t\t\tthis.rootChildren.splice(idx, 0, raw[i]);\n\t\t\t\tif (typeof raw[i] !== 'string') {\n\t\t\t\t\t(raw[i] as ColumnGroupNode).setParent(null);\n\t\t\t\t\tthis.updateGroupLevels(raw[i] as ColumnGroupNode, newChildLevel);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.groupMap.delete(groupId);\n\t\tthis.rebuildFlattenedFromTree();\n\t\tthis.recalcMaxDepth();\n\t\tthis.emitStructureChanged();\n\t}\n}\n","export const NESTED_HEADER_BEAN_NAME = {\n\tCOLUMN_TREE_MODEL   : 'columnTreeModel',\n\tCOLUMN_GROUP_HANDLER: 'columnGroupHandler',\n\tCOLUMN_GROUP_API    : 'columnGroupAPI',\n};\n","export const COLUMN_GROUP_EVENTS = {\n\tEVENT_COLUMN_GROUP_EXPANDED  : 'columnGroupExpanded',\n\tEVENT_COLUMN_GROUP_COLLAPSED : 'columnGroupCollapsed',\n\tEVENT_COLUMN_GROUP_CHANGED   : 'columnGroupChanged',\n\tEVENT_COLUMN_GROUP_INSERTED  : 'columnGroupInserted',\n\tEVENT_COLUMN_GROUP_REMOVED   : 'columnGroupRemoved',\n\tEVENT_COLUMN_GROUP_UPDATED   : 'columnGroupUpdated',\n\tEVENT_COLUMN_GROUP_REORDERED : 'columnGroupReordered',\n\t/** Emitted by ColumnTreeModel when tree structure (add/remove column or group) changes; FieldHandler should rebuild columns. */\n\tEVENT_COLUMN_TREE_STRUCTURE_CHANGED : 'columnTreeStructureChanged',\n};\n","import type { IModule } from '../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types';\nimport { ColumnTreeModel } from './column-tree-model';\nimport { ColumnGroupHandler } from './column-group-handler';\nimport { ColumnGroupAPI } from './column-group-api';\n\nexport const NestedHeaderModule: IModule = {\n\tmoduleName: 'NestedHeader',\n\tversion: '1.0.0',\n\tbeans: [ColumnTreeModel, ColumnGroupHandler, ColumnGroupAPI],\n};\n","import { BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, setAriaSelected } from \"@dg/corecomponent\";\nimport { CellRangeType, IRangeSelectionHandler } from \"./range-selection-handler.types\";\nimport { ICellComponent } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/ICellComponent\";\nimport { CellController, ICellPosition } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { ICellRangeHandler } from \"./cell-range-handler.types\";\nimport { areArraysEqual } from \"../Grid/Core/utils/Object\";\nimport { FillSeriesType } from \"../FillSeries/fill-series.types\";\nimport { FillSeries } from \"../FillSeries/fill-series\";\n\nexport interface ICellRangeBorder {\n\ttop   : boolean;\n\tright : boolean;\n\tbottom: boolean;\n\tleft  : boolean;\n}\n\nexport class CellRangeHandler extends EventEmitter implements ICellRangeHandler {\n    private rangeSelectionHandler : IRangeSelectionHandler;\n    private fieldHandler : FieldHandler;\n    private optionHandler : GridOptioHandler;\n\n    private selectionHandle : FillSeriesType;\n\n    private component     : ICellComponent;\n    private cellController: CellController;\n    private rangeCount    : number = 0;\n    private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n    constructor(getBeanInstanceByBeanName : (beanName : string) => any, controller : CellController) {\n        super();\n        this.rangeSelectionHandler = getBeanInstanceByBeanName('rangeSelectionHandler');\n        this.fieldHandler          = getBeanInstanceByBeanName(GRID_BEAN_NAME.FIELD_HANDLER);\n        this.optionHandler         = getBeanInstanceByBeanName(BEAN_NAME.OPTION_HANDLER);\n        this.cellController        = controller;\n        this.getBeanInstanceByBeanName = getBeanInstanceByBeanName;\n    }\n\n    public setComponent(component : ICellComponent) : void {\n        this.component = component;\n        this.onRangeSelectionChanged();\n    }\n\n    public onRangeSelectionChanged(): void {\n        if (!this.component) { return; }\n\n        this.rangeCount = this.rangeSelectionHandler.getCellRangeCount(this.getCellPosition());\n\n        this.component.addOrRemoveCssClass('ZG-cellRangeSelected', this.rangeCount !== 0);\n        setAriaSelected(this.component.getElement(), this.rangeCount > 0 ? true : undefined);\n\n        this.updateRangeBorders();\n        this.refreshFillSeries();\n\n    }\n\n    private refreshFillSeries() : void {\n        const shouldHaveSelectionHandle = this.shouldHaveSelectionHandle();\n        if (this.selectionHandle  && !shouldHaveSelectionHandle) {\n            this.selectionHandle.destroy();\n            this.selectionHandle = null;\n        }\n        if (shouldHaveSelectionHandle) {\n            this.addSelectionHandle();\n        }\n        this.component.addOrRemoveCssClass('ZG-fillseries__selection', !!this.selectionHandle);\n    }\n\n    private addSelectionHandle() {\n        // const cellRanges = this.rangeSelectionHandler.getCellRanges();\n\n        if (this.selectionHandle ) {\n            this.selectionHandle!.destroy();\n            this.selectionHandle = null;\n        }\n\n        if (!this.selectionHandle) {\n            this.selectionHandle = new FillSeries(this.getBeanInstanceByBeanName);   \n        }\n\n        this.selectionHandle?.refresh(this.cellController);\n    }\n\n    private shouldHaveSelectionHandle(): boolean {\n        const cellRanges = this.rangeSelectionHandler.getCellRanges();\n        const rangesLen = cellRanges.length;\n\n        if (this.rangeCount < 1 || rangesLen < 1) {\n            return false;\n        }\n\n        const cellRange = cellRanges[cellRanges.length - 1];\n        const cellPosition = this.cellController.getCellPosition();\n        const isFillHandleAvailable = this.optionHandler.isFillSeriesEnabled();\n        const isRangeHandleAvailable = this.optionHandler.isRangeSelectionEnabled();\n        const isCellEditing = this.cellController.isEditing();\n\n        let handleIsAvailable = rangesLen === 1 && !isCellEditing && (isFillHandleAvailable && isRangeHandleAvailable);\n\n        return (\n            handleIsAvailable &&\n            cellRange.endRow != null &&\n            this.rangeSelectionHandler.isContiguousRange(cellRange) &&\n            this.rangeSelectionHandler.isBottomRightCell(cellRange, cellPosition)\n        );\n    }\n\n    private updateRangeBorders(): void {\n        const rangeBorders = this.getRangeBorders();\n        const isTop        = rangeBorders.top;\n        const isRight      = rangeBorders.right;\n        const isBottom     = rangeBorders.bottom;\n        const isLeft       = rangeBorders.left;\n\n        this.component.addOrRemoveCssClass('ZG-cellRangeTop', isTop);\n        this.component.addOrRemoveCssClass('ZG-cellRangeRight', isRight);\n        this.component.addOrRemoveCssClass('ZG-cellRangeBottom', isBottom);\n        this.component.addOrRemoveCssClass('ZG-cellRangeLeft', isLeft);\n    }\n\n    private getCellPosition() : ICellPosition {\n        const cellPosition             = this.cellController.getCellPosition();\n        const rowmeta                  = this.cellController.getRowNode().getRowMeta();\n              cellPosition.parentKeys  = rowmeta.parentKeys;\n              cellPosition.pinPosition = rowmeta.pinPosition;\n              cellPosition.rowIndex    = rowmeta.rowIndex;\n\n        return cellPosition;\n    }\n\n    private getRangeBorders(): ICellRangeBorder {\n        const isRtl = this.optionHandler.isRTL();\n\n        let top    = false;\n        let right  = false;\n        let bottom = false;\n        let left   = false;\n\n        const cellPosition             = this.getCellPosition();\n\n        const currentColumn = cellPosition.columnID;\n\n        let leftColumnId: string | null;\n        let rightColumnId: string | null;\n\n        if (isRtl) {\n            leftColumnId = this.fieldHandler.getNextID(currentColumn);\n            rightColumnId = this.fieldHandler.getPreviousID(currentColumn);\n        } else {\n            leftColumnId = this.fieldHandler.getPreviousID(currentColumn);\n            rightColumnId = this.fieldHandler.getNextID(currentColumn);\n        }\n\n        const cellRanges = this.rangeSelectionHandler.getCellRanges();\n\n        const rangesCallBack = (range : CellRangeType) => {\n            return this.rangeSelectionHandler.isCellInSpecificRange(cellPosition, range)\n        }\n\n        const ranges = cellRanges.filter( rangesCallBack );\n\n        if(ranges.length === 0) {\n            return { top, right, bottom, left };\n        }\n\n        if (!leftColumnId) {\n            left = true;\n        }\n\n        if (!rightColumnId) {\n            right = true;\n        }\n\n        for (let i = 0; i < ranges.length; i++) {\n            if (top && right && bottom && left) { break; }\n\n            const range    = ranges[i];\n            const startRow = this.rangeSelectionHandler.getRangeStartRow(range);\n            const endRow   = this.rangeSelectionHandler.getRangeEndRow(range);\n\n            const sameStartRow = this.sameRow(startRow,cellPosition)\n            const sameEndRow = this.sameRow(endRow, cellPosition);\n            if (!top && sameStartRow) {\n                top = true;\n            }\n\n            if (!bottom && sameEndRow) {\n                bottom = true;\n            }\n\n            if (!left && leftColumnId && range.columnIds.indexOf(leftColumnId) < 0) {\n                left = true;\n            }\n\n            if (!right && rightColumnId && range.columnIds.indexOf(rightColumnId) < 0) {\n                right = true;\n            }\n        }\n\n        return { top, right, bottom, left };\n    }\n\n    private sameRow(previousRowPosition: RowPositionType | undefined, currentRowPosition: RowPositionType | undefined): boolean {\n        if (!previousRowPosition && !currentRowPosition) { return true; }\n        if ((previousRowPosition && !currentRowPosition) || (!previousRowPosition && currentRowPosition)) { return false; }\n        return previousRowPosition!.rowIndex === currentRowPosition!.rowIndex && previousRowPosition!.pinPosition == currentRowPosition!.pinPosition && areArraysEqual(currentRowPosition.parentKeys, previousRowPosition.parentKeys);\n    }\n\n    public destroy(): void {\n        // Clear bean instance references to prevent memory leaks\n        this.rangeSelectionHandler = null as any;\n        this.fieldHandler = null as any;\n        this.optionHandler = null as any;\n        this.component = null as any;\n        this.cellController = null as any;\n        this.selectionHandle = null as any;\n        \n        super.destroy(); \n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { CellPositionType, RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { CellRangeType, IRangeSelectionDragHookWrapper, IRangeSelectionWrapper, IRangeSeletionAutoScrollOptions } from \"./range-selection-handler.types\";\nimport { IControllerHandler, IPaneControllerParam } from \"../Grid/Core/Interface/IControllerHandler\";\nimport { AutoScrollHandler } from \"../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { getControllerFromTargetElement } from \"../Grid/Core/utils/Dom\";\nimport { CellController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { GridBodyScrollHandler } from \"../Grid/Core/GridBodyScrollHandler\";\nimport { IDragHandler } from \"../drag-handler/drag-core-handler.types\";\nimport { IAutoScrollHandler } from \"../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler.types\";\nimport { IHookManager } from \"../Grid/Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../Grid/Core/Hooks/Constants/HookEventsName\";\nimport { areArraysEqual } from \"../Grid/Core/utils/Object\";\nimport type { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { IFocusHandler } from \"Grid/Core/Navigation/focus-handler.types\";\n\nconst positionPriority = {\n    'top'            : 1,\n    'topDraftRow'    : 2,\n    'middle'         : 3,\n    'bottomDraftRow' : 4,\n    'bottom'         : 5,\n}\n\nexport class RangeSelectionDragHandler extends EventEmitter {\n    private lastCellHovered : CellPositionType | undefined;\n    private dragging        : boolean = false;\n    private draggingRange  ?: CellRangeType;\n    private lastMouseEvent ?: MouseEvent;\n    private cellHasChanged  : boolean;\n    private bodyScrollListener = this.onBodyScroll.bind(this);\n    private autoScrollHandler : IAutoScrollHandler;\n\n    private controller : IRangeSelectionWrapper;\n\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) controllerHandler: IControllerHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: GridOptioHandler;\n    @AutoWired('dragHandler') dragHandler : IDragHandler;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) hookManager: IHookManager;\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) fieldHandler: FieldHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler : IRecordHandler;\n    @AutoWired(\"focusHandler\") private focusHandler : IFocusHandler;\n\n    private rangeSelectionHookWrapper : IRangeSelectionDragHookWrapper;\n\n    setComponent(controller : IRangeSelectionWrapper) {\n        this.controller = controller;\n    }\n\n    @PostConstruct()\n    init() {\n        this.controllerHandler.onAfterGridReady((params  : IPaneControllerParam) => {\n            const autoScrollOption = new RangeSelectionDragHandler.AutoScrollHandlerOptions(params, 'xy', this.optionsHandler.isSuppressHorizontalScroll(), () => this.optionsHandler.isRTL());\n            this.autoScrollHandler = new AutoScrollHandler(autoScrollOption);\n\n            this.rangeSelectionHookWrapper = new RangeSelectionDragHandler.RangeSelectionDragHookWrapper(this.hookManager);\n        })\n    }\n\n    public onDragStart(mouseEvent: MouseEvent): void {\n        if (!this.optionsHandler.isRangeSelectionEnabled()) {\n            return;\n        }\n\n        const { ctrlKey, metaKey, shiftKey } = mouseEvent;\n        const isMultiKey = ctrlKey || metaKey;\n        const allowMulti = !this.optionsHandler.suppressMultiRangeSelection();\n        const isMultiSelect = allowMulti && isMultiKey;\n        let cellRanges = this.controller.getCellRanges();\n        const extendRange = shiftKey && cellRanges.length !== 0;\n\n        if (!isMultiSelect && !extendRange) {\n            this.controller.removeRangeSelection();\n        }\n\n        const startTarget = this.dragHandler.getTarget();\n        this.updateCellChange(startTarget, true);\n\n        if (!this.lastCellHovered) {\n            return;\n        }\n\n        this.lastMouseEvent = mouseEvent;\n        if (!extendRange) {\n            this.controller.setCurrentCellRange(this.lastCellHovered);\n        }\n\n        cellRanges = this.controller.getCellRanges();\n\n        this.startRangeSelection(cellRanges);\n    }\n\n    private startRangeSelection(cellRanges: CellRangeType[]): void {\n        if (cellRanges.length > 0) {\n            this.initDragging(cellRanges[cellRanges.length - 1], false);\n        } else {\n            this.createNewRangeSelection();\n        }\n    }\n\n    private initDragging(cellRange: CellRangeType, newValue : boolean): void {\n        this.rangeSelectionHookWrapper.onRangeSelectionStart(cellRange, (updatedRange: CellRangeType) => {\n            this.draggingRange = updatedRange;\n            this.dragging = true;\n            this.addScrollListener();\n            newValue && this.controller.addCellRange(updatedRange);\n            this.controller.dispatchChangedEvent(updatedRange.id);\n        });\n    }\n\n    private createNewRangeSelection(): void {\n        const mouseRowPosition: RowPositionType = {\n            rowIndex   : this.lastCellHovered!.rowIndex,\n            pinPosition: this.lastCellHovered!.pinPosition,\n            parentKeys : this.lastCellHovered!.parentKeys\n        };\n\n        const currentRangeStartCell = this.controller.getCurrentCellRange();\n        const cellRange: CellRangeType = {\n            startRow: mouseRowPosition,\n            endRow: mouseRowPosition,\n            columnIds: [this.lastCellHovered!.columnID],\n            startColumnId: currentRangeStartCell!.columnID,\n            endColumnId : this.lastCellHovered!.columnID\n        };\n\n        this.initDragging(cellRange, true);\n    }\n\n    public onDragging(mouseEvent: MouseEvent | null): void {\n        if (!this.dragging || !mouseEvent) return;\n\n        this.updateCellChange(mouseEvent.target);\n        this.lastMouseEvent = mouseEvent;\n\n        const cellPosition = this.lastCellHovered!;\n        const currentRangeStartCell = this.controller.getCurrentCellRange()!;\n        const skipVerticalScroll = this.shouldSkipVerticalScroll(cellPosition, currentRangeStartCell);\n        const skipHorizontalScroll = this.shouldSkipHorizontalScroll(cellPosition, currentRangeStartCell);\n        this.autoScrollHandler.update(mouseEvent, skipVerticalScroll, skipHorizontalScroll);\n        \n        if (!this.cellHasChanged) return;\n\n        const columns = this.controller.calculateColumnsBetween(currentRangeStartCell.columnID, cellPosition.columnID);\n        if (!columns) return;\n\n        this.updateDraggingRange(cellPosition, columns);\n    }\n\n    private shouldSkipVerticalScroll(cellPosition: CellPositionType, currentRangeStartCell: CellPositionType): boolean {\n        return ['top', 'bottom'].some(pos => cellPosition.pinPosition === pos && currentRangeStartCell.pinPosition === pos);\n    }\n\n    private shouldSkipHorizontalScroll(cellPosition: CellPositionType, currentRangeStartCell: CellPositionType): boolean {\n        const cellPositionColumnPinPosition = this.fieldHandler.getColumnNodeByID(cellPosition.columnID).getPinnedPosition();\n        const currentRangeStartCellinPosition = this.fieldHandler.getColumnNodeByID(currentRangeStartCell.columnID).getPinnedPosition();\n\n        return ['left', 'right'].some(pos => cellPositionColumnPinPosition === pos && currentRangeStartCellinPosition === pos);\n    }\n\n    private updateDraggingRange(cellPosition: CellPositionType, columns: string[]): void {\n        const fromRight = columns[0] !== this.draggingRange.startColumnId;\n        const suppressGroupToGroupRangeSelection = this.optionsHandler.suppressGroupToGroupRangeSelection();\n\n        if(suppressGroupToGroupRangeSelection) {\n            if(!areArraysEqual(this.draggingRange.startRow.parentKeys, cellPosition.parentKeys)) {\n                const isRowBefore = !this.isRowBefore(this.draggingRange.startRow, cellPosition);\n                const rowMeta                  = isRowBefore ? this.recordHandler.getGroupFirstRow(this.draggingRange.startRow) :this.recordHandler.getGroupLastRow(this.draggingRange.startRow);\n                      cellPosition.rowIndex    = rowMeta.rowIndex;\n                      cellPosition.pinPosition = rowMeta.pinPosition;\n                      cellPosition.parentKeys  = rowMeta.parentKeys;\n            }\n        }\n        const cellRange: CellRangeType = {\n            ...this.draggingRange!,\n            endRow: {\n                rowIndex: cellPosition.rowIndex,\n                pinPosition: cellPosition.pinPosition,\n                parentKeys : cellPosition.parentKeys\n            },\n            columnIds: columns,\n            endColumnId : fromRight ? columns[0] : columns[columns.length - 1]\n        };\n\n        this.rangeSelectionHookWrapper.onRangeSelection(cellRange, (updatedRange: CellRangeType) => {\n        // console.log(updatedRange);\n            this.draggingRange!.endRow = updatedRange.endRow;\n            this.draggingRange!.columnIds = updatedRange.columnIds;\n            this.draggingRange!.endColumnId = updatedRange.endColumnId;\n            this.controller.dispatchChangedEvent(this.draggingRange!.id);\n        });\n    }\n\n    public onDragStop(): void {\n        if (!this.dragging) return;\n\n        this.cleanupAfterDragging();\n        this.rangeSelectionHookWrapper.onRangeSelectionEnd(this.draggingRange!)\n    }\n\n    private cleanupAfterDragging(): void {\n        this.autoScrollHandler.clear();\n        this.removeScrollListener();\n        this.resetDragState();\n    }\n\n    private resetDragState(): void {\n        this.lastMouseEvent = undefined;\n        this.dragging = false;\n        this.draggingRange = undefined;\n        this.lastCellHovered = undefined;\n    }\n\n    private addScrollListener(): void {\n        this.controllerHandler.getBodyController().addScrollEventListener(this.bodyScrollListener);\n    }\n\n    private removeScrollListener(): void {\n        this.controllerHandler.getBodyController().removeScrollEventListener(this.bodyScrollListener);\n    }\n\n    private onBodyScroll(): void {\n        if (this.dragging && this.lastMouseEvent) {\n            this.onDragging(this.lastMouseEvent);\n        }\n    }\n\n    private updateCellChange(eventTarget: EventTarget | null, init : boolean = false) {\n        const cellCtrl = getControllerFromTargetElement<CellController>(this.optionsHandler, eventTarget, CellController.DOM_KEY_CELL_CTRL);\n        \n        const cell     = cellCtrl?.getCellPosition();\n        if(!cell && init) {\n            const focusedCell = this.focusHandler.getFocusedCellPosition();\n            if(focusedCell) {\n                this.lastCellHovered = focusedCell;\n            }\n        }\n        this.cellHasChanged = false;\n\n        if (!cell ||  (this.lastCellHovered && this.cellEquals(cell, this.lastCellHovered))) {\n            return;\n        }\n\n        if(cell.pinPosition === 'summary') {\n            return;\n        }\n\n        if (this.lastCellHovered) {\n            this.cellHasChanged = true;\n        }\n\n\n        this.lastCellHovered = cell;\n    }\n\n    private cellEquals(previousCellPosition : CellPositionType , cellPosition : CellPositionType) : boolean {\n        const colsMatch       = cellPosition.columnID    === previousCellPosition.columnID;\n        const floatingMatch   = cellPosition.pinPosition === previousCellPosition.pinPosition;\n        const indexMatch      = cellPosition.rowIndex    === previousCellPosition.rowIndex;\n        const parentKeysMatch = areArraysEqual(cellPosition.parentKeys, previousCellPosition.parentKeys);\n        return colsMatch && floatingMatch && indexMatch && parentKeysMatch;\n    }\n\n    public isRowBefore(previousRowPosition: RowPositionType, currentPinPosition: RowPositionType): boolean {\n            const previousPositionPriority = positionPriority[previousRowPosition.pinPosition];\n            const currentPositionPriority = positionPriority[currentPinPosition.pinPosition];\n    \n            if(previousPositionPriority > currentPositionPriority) {\n                return false;\n            }\n            else if(previousPositionPriority < currentPositionPriority) {\n                return true;\n            }\n            else{\n                const previousRowIndex = this.recordHandler.getIndexByMeta(previousRowPosition.rowIndex, previousRowPosition.pinPosition, previousRowPosition.parentKeys);\n                const currentRowIndex  = this.recordHandler.getIndexByMeta(currentPinPosition.rowIndex, currentPinPosition.pinPosition, currentPinPosition.parentKeys);\n    \n                return previousRowIndex < currentRowIndex;\n            }\n    }\n\n    /** @internal */\n    static AutoScrollHandlerOptions = class implements IRangeSeletionAutoScrollOptions {\n        public scrollContainer: HTMLElement;\n        public scrollByTick   : number;\n        private scrollHandler : GridBodyScrollHandler;\n        public horizontalScrollContainer : HTMLElement;\n\n        private isRTLCallback : () => boolean;\n\n        constructor(controllerParams : IPaneControllerParam, public scrollAxis : any, private skipHorizontalScroll : boolean, isRTL : () => boolean) {\n            const bodyController = controllerParams.bodyController;\n            const centerController = controllerParams.centerRowContainerControl;\n            this.scrollHandler = bodyController.getScrollHandler();\n\n            this.horizontalScrollContainer = centerController.getViewPortContainer();\n            this.scrollContainer = bodyController.getViewPortContainer();\n            this.isRTLCallback = isRTL;\n        }\n\n        getVerticalPosition = () => {\n            return this.scrollHandler.getVScrollPosition().top\n        }\n\n        setVerticalPosition = (position: number) => {\n            this.scrollHandler.setVerticalScrollPosition(position)\n        }\n\n        getHorizontalPosition = () => {\n            return this.scrollHandler.getHScrollPosition().left\n        }\n\n        setHorizontalPosition = (position: number) => {\n            this.scrollHandler.setHorizontalScrollPosition(position)\n        }\n        shouldSkipVerticalScroll = () =>  {\n            return false;\n        }\n        shouldSkipHorizontalScroll = () => {\n            return this.skipHorizontalScroll;\n        }\n\n        isRTL = () => {\n            return this.isRTLCallback();\n        }\n    }\n\n    /** @internal */\n    static RangeSelectionDragHookWrapper = class implements IRangeSelectionDragHookWrapper   {\n        constructor(private hookManager : IHookManager) {\n\n        }\n\n        onRangeSelectionStart(cellRange : CellRangeType, callBack : (params : CellRangeType) => void) : void {\n            const api = (params) => {\n                callBack(params);\n            }\n            this.hookManager.executeBeforeHook(HookEventsName.onBeforeRangeSelection,api, cellRange);\n        }\n\n        onRangeSelectionEnd(cellRange : CellRangeType) : void {\n            this.hookManager.executeAfterHook(HookEventsName.onAfterRangeSelection, cellRange);\n        }\n\n        onRangeSelection(cellRange : CellRangeType, callBack : (params : CellRangeType) => void)  : void {\n            const api = (params) => {\n                callBack(params);\n            }\n            this.hookManager.executeOnHook(HookEventsName.onRangeSelectionChanged,api, cellRange);\n        }\n    }\n}","import { AutoWired, Bean, BEAN_NAME, EventEmitter, getBeanInstanceByBeanName, PostConstruct } from \"@dg/corecomponent\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { FieldHandler } from \"../Grid/Core/Columns/FieldHandler\";\nimport { CellPositionType, RowPositionType } from \"../Grid/Core/Navigation/cell-position.types\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { CellRangeParams, CellRangeType, IRangeSelectionHandler, IRangeSelectionHookWrapper, IRangeSelectionWrapper } from \"./range-selection-handler.types\";\nimport { Events } from \"../Grid/Core/Constants/Events\";\nimport { ICellNavigationHandler } from \"../Grid/Core/Navigation/cell-navigation-handler.types\";\nimport { rowPinPositions } from \"../Grid/Core/Constants/GridConfigurationConstants\";\nimport { KeyBoardEventKeys } from \"../Grid/Core/Navigation/KeyBoardEventKeys\";\nimport { CellController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Cell/CellController\";\nimport { CellRangeHandler } from \"./cell-range-handler\";\nimport { ICellRangeHandler } from \"./cell-range-handler.types\";\nimport { RangeSelectionDragHandler } from \"./range-selection-drag-handler\";\nimport { IHookManager } from \"../Grid/Core/Hooks/Interface/IHookManager\";\nimport { HookEventsName } from \"../Grid/Core/Hooks/Constants/HookEventsName\";\nimport { areArraysEqual } from \"../Grid/Core/utils/Object\";\nimport { HookInitiator, ICellAPIManager } from \"../Grid/Main\";\nimport { IRange } from \"../Grid/API/CommonAPIInterface\";\nimport { IFocusHandler } from \"../Grid/Core/Navigation/focus-handler.types\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { makeNull } from \"../Grid/Core/utils/Generic\";\n\n\nconst positionPriority = {\n    'top'            : 1,\n    'topDraftRow'    : 2,\n    'middle'         : 3,\n    'bottomDraftRow' : 4,\n    'bottom'         : 5,\n}\n\n\n@Bean('rangeSelectionHandler')\nexport class RangeSelectionHandler extends EventEmitter implements IRangeSelectionHandler {\n    @AutoWired(GRID_BEAN_NAME.FIELD_HANDLER) fieldHandler: FieldHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler: GridOptioHandler;\n    @AutoWired('CellNavigationHandler') cellNavigationHandler: ICellNavigationHandler;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler: IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) private hookManager: IHookManager;\n    @AutoWired(GRID_BEAN_NAME.CELL_API) private cellAPI : ICellAPIManager;\n    @AutoWired('focusHandler') private focusHandler : IFocusHandler;\n    @AutoWired(GRID_BEAN_NAME.HOOK_MANAGER) hook : IHookManager;\n\n    private cellRanges: CellRangeType[]                    = [];\n    private currentRangeStartCell: CellPositionType | null = null;\n\n    private rangeSelectionDragHandler: RangeSelectionDragHandler;\n    private rangeSelectionHookWrapper : IRangeSelectionHookWrapper;\n\n    private selectionState : 'range' | 'row' | 'column' | null = null;\n\n    public allowSingleActionStarted : boolean = false;\n\n    @PostConstruct()\n    init() {\n        this.rangeSelectionDragHandler = this.createManagedBean(new RangeSelectionDragHandler());\n        this.rangeSelectionDragHandler.setComponent(new RangeSelectionHandler.RangeSelectionWrapper(this));\n\n        this.rangeSelectionHookWrapper = new RangeSelectionHandler.RangeSelectionHookWrapper(this, this.hookManager)\n\n        this.addDestroyFunc(() => {\n            this.rangeSelectionDragHandler = null;\n            this.rangeSelectionHookWrapper.destroy();\n            this.rangeSelectionHookWrapper = null;\n        })\n\n        const removeCallback = () => {\n            const isAllowMultipleTypeSelection = this.optionsHandler.isAllowMultipleTypeSelection();\n            if(!isAllowMultipleTypeSelection && !this.allowSingleActionStarted) {\n                this.removeRangeSelection();\n            }\n        }\n\n        this.addListener(this.eventHandler, 'rowSelectionChanged', removeCallback)\n\n        this.addListener(this.eventHandler, 'columnSelectionChanged', removeCallback)\n    }\n\n    public onDragStart(event : MouseEvent) : void {\n        this.rangeSelectionDragHandler.onDragStart(event);\n    }\n\n    public onDragging(event : MouseEvent) : void {\n        this.rangeSelectionDragHandler.onDragging(event);\n    }\n\n    public onDragStop(_event : MouseEvent) : void {\n        this.rangeSelectionDragHandler.onDragStop();\n    }\n\n    /**\n     * Ensures that range selection is enabled before proceeding.\n     * @returns {boolean} True if range selection is enabled, false otherwise.\n     */\n    private ensureRangeSelectionEnabled(): boolean {\n        return this.optionsHandler.isRangeSelectionEnabled();\n    }\n\n    /**\n     * Sets a new cell range based on the provided parameters.\n     * @param {CellRangeParams} params - Parameters for the cell range.\n     */\n    public setCellRange(params: CellRangeParams): void {\n        if (!this.ensureRangeSelectionEnabled()) return;\n\n        this.rangeSelectionHookWrapper.removeRangeSelection();\n        this.addCellRanges([params]);\n    }\n\n\n\n   /**\n    * The function `extendCellToLeft` extends the cell position to the left using a callback function.\n    * @param {CellPositionType} endCell - The `endCell` parameter in the `extendCellToLeft` method\n    * represents the current cell position from which you want to navigate to the left. It is of type\n    * `CellPositionType`, which likely contains information about the row and column position of a cell\n    * in a grid or table.\n    * @returns The `extendCellToLeft` method is returning the result of calling the\n    * `extendCellInDirection` method with a callback function `callBack`. The `callBack` function takes\n    * an `endCell` parameter of type `CellPositionType` and returns the result of calling\n    * `this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_LEFT, endCell)`.\n    */\n    public extendCellToLeft() : CellPositionType | undefined {\n        const callBack = (endCell : CellPositionType) => {\n            return this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_LEFT, endCell);\n        }\n        return this.extendCellInDirection(callBack);\n    }\n\n    /**\n     * The function `extendCellToRight` extends the current cell position to the right using a callback\n     * function.\n     * @param {CellPositionType} endCell - The `endCell` parameter in the `extendCellToRight` method is\n     * of type `CellPositionType`. It represents the cell position that is currently at the end before\n     * extending to the right.\n     * @returns The `extendCellToRight` method is returning the result of calling the\n     * `extendCellInDirection` method with a callback function `callBack`. The `callBack` function\n     * takes an `endCell` parameter of type `CellPositionType` and returns the result of calling\n     * `this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_RIGHT, endCell)`.\n     */\n    public extendCellToRight() : CellPositionType | undefined {\n        const callBack = (endCell : CellPositionType) => {\n            return this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_RIGHT, endCell);\n        }\n        return this.extendCellInDirection(callBack);\n    }\n\n    /**\n     * This TypeScript function extends a cell position to the top using a callback function for\n     * navigation handling.\n     * @param {CellPositionType} endCell - The `endCell` parameter in the `extendCellToTop` method is\n     * of type `CellPositionType`. It is the cell position from which the navigation will start when\n     * extending the cell to the top direction.\n     * @returns The `extendCellToTop` method is returning the result of calling the\n     * `extendCellInDirection` method with a callback function `callBack`. The `callBack` function\n     * takes an `endCell` parameter of type `CellPositionType` and returns the result of calling\n     * `this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_UP, endCell)`.\n     */\n    public extendCellToTop() : CellPositionType | undefined {\n        const callBack = (endCell : CellPositionType) => {\n            return this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_UP, endCell);\n        }\n        return this.extendCellInDirection(callBack);\n    }\n\n    /**\n     * The function `extendCellToBottom` extends a cell position to the bottom using a callback\n     * function for navigation.\n     * @param {CellPositionType} endCell - The `endCell` parameter in the `extendCellToBottom` method\n     * is of type `CellPositionType`. It represents the cell position from which the extension\n     * operation will start in the downward direction.\n     * @returns The `extendCellToBottom` method is returning the result of calling the\n     * `extendCellInDirection` method with the `callBack` function as an argument. The `callBack`\n     * function itself returns the result of calling `this.cellNavigationHandler.getNextCellToFocus`\n     * with the `KeyBoardEventKeys.ARROW_DOWN` and `endCell` as arguments. So, ultimately, the method\n     */\n    public extendCellToBottom() : CellPositionType | undefined {\n        const callBack = (endCell : CellPositionType) => {\n            return this.cellNavigationHandler.getNextCellToFocus(KeyBoardEventKeys.ARROW_DOWN, endCell);\n        }\n        return this.extendCellInDirection(callBack);\n    }\n\n    /**\n     * The function `extendToLastCellInRow` extends the current cell position to the last cell in the\n     * row using a callback function.\n     * @param {CellPositionType} endCell - The `endCell` parameter in the `extendToLastCellInRow`\n     * method is of type `CellPositionType`. It is the cell position from which the extension to the\n     * last cell in the row will be calculated.\n     * @returns The `extendToLastCellInRow` method is returning a `CellPositionType` or `undefined`\n     * value.\n     */\n    public extendToLastCellInRow() : CellPositionType | undefined {\n        const callBack = (endCell : CellPositionType) => {\n            return this.cellNavigationHandler.getLastCellInRow(endCell);\n        }\n        return this.extendCellInDirection(callBack);\n    }\n\n   /**\n    * The function `extendToLastCellInColumn` extends the current cell position to the last cell in the\n    * column using a callback function.\n    * @param {CellPositionType} endCell - The `endCell` parameter in the `extendToLastCellInColumn`\n    * method is of type `CellPositionType`. It is the cell position that will be used as the starting\n    * point to find the last cell in the column.\n    * @returns The `extendToLastCellInColumn` method is returning a `CellPositionType` or `undefined`\n    * value.\n    */\n    public extendToLastCellInColumn() : CellPositionType | undefined {\n        const callBack = (endCell : CellPositionType) => {\n            return this.cellNavigationHandler.getLastCellInColumn(endCell);\n        }\n        return this.extendCellInDirection(callBack);\n\n    }\n\n    /**\n     * The function `extendToFirstCellInRow` extends the selection to the first cell in the row using a\n     * callback function.\n     * @param {CellPositionType} endCell - The `endCell` parameter in the `extendToFirstCellInRow`\n     * method is of type `CellPositionType`.\n     * @returns The `extendToFirstCellInRow` method is returning a `CellPositionType` or `undefined`\n     * value.\n     */\n    public extendToFirstCellInRow() : CellPositionType | undefined {\n        const callBack = (endCell : CellPositionType) => {\n            return this.cellNavigationHandler.getFirstCellInRow(endCell);\n        }\n        return this.extendCellInDirection(callBack);\n    }\n\n    /**\n     * The function `extendToFirstCellInColumn` extends the selection to the first cell in the column\n     * using a callback function.\n     * @param {CellPositionType} endCell - The `endCell` parameter in the `extendToFirstCellInColumn`\n     * method represents the position of the cell where the extension operation will start from. It is\n     * of type `CellPositionType`.\n     * @returns The `extendToFirstCellInColumn` method is returning a `CellPositionType` or `undefined`\n     * value.\n     */\n    public extendToFirstCellInColumn() : CellPositionType | undefined {\n        const callBack = (endCell : CellPositionType) => {\n            return this.cellNavigationHandler.getFirstCellInColumn(endCell);\n        }\n        return this.extendCellInDirection(callBack);\n    }\n\n    /**\n     * The function `extendCellInDirection` extends the current cell range in a specified direction\n     * based on a callback function.\n     * @param callBack - The `callBack` parameter in the `extendCellInDirection` method is a function\n     * that takes a `CellPositionType` parameter and returns either a new `CellPositionType` or\n     * `undefined`. This function is used to calculate the new end cell position based on the current\n     * end cell position in\n     * @returns The `extendCellInDirection` method returns a `CellPositionType` object or `undefined`.\n     */\n    private extendCellInDirection(callBack : (cell : CellPositionType) => CellPositionType | undefined) : CellPositionType | undefined {\n        if (this.isEmpty() || !this.currentRangeStartCell) return undefined;\n\n        const lastCellRange = this.cellRanges[this.cellRanges.length - 1];\n        const startCell = this.currentRangeStartCell;\n        const firstCol = lastCellRange.columnIds[0];\n        const lastCol = lastCellRange.columnIds[lastCellRange.columnIds.length - 1];\n\n        const endCellIndex = lastCellRange.endRow!.rowIndex;\n        const endCellPinned = lastCellRange.endRow!.pinPosition;\n        const endCellParentKeys = lastCellRange.endRow!.parentKeys;\n\n        const endCellColumn = startCell.columnID === firstCol ? lastCol : firstCol;\n\n        const endCell: CellPositionType = { columnID: endCellColumn, rowIndex: endCellIndex, pinPosition: endCellPinned, parentKeys : endCellParentKeys };\n\n        const newEndCell = callBack(endCell);\n\n        if (!newEndCell) return undefined;\n\n        const suppressGroupToGroupRangeSelection = this.optionsHandler.suppressGroupToGroupRangeSelection();\n\n        if(suppressGroupToGroupRangeSelection) {\n            if(!areArraysEqual(lastCellRange.startRow.parentKeys, newEndCell.parentKeys)) {\n                const isRowBefore = !this.isRowBefore(lastCellRange.startRow, newEndCell);\n                const rowMeta                  = isRowBefore ? this.recordHandler.getGroupFirstRow(lastCellRange.startRow) :this.recordHandler.getGroupLastRow(lastCellRange.startRow);\n                      newEndCell.rowIndex    = rowMeta.rowIndex;\n                      newEndCell.pinPosition = rowMeta.pinPosition;\n                      newEndCell.parentKeys  = rowMeta.parentKeys;\n            }\n        }\n\n        this.setCellRange({\n            rowStartIndex    : startCell.rowIndex,\n            rowStartPinned   : startCell.pinPosition,\n            rowEndIndex      : newEndCell.rowIndex,\n            rowEndPinned     : newEndCell.pinPosition,\n            columnStart      : startCell.columnID,\n            columnEnd        : newEndCell.columnID,\n            rowStartParamKeys: startCell.parentKeys,\n            rowEndParamKeys  : newEndCell.parentKeys\n        });\n\n        const focusedCell = this.focusHandler.getFocusedCellPosition();\n       \n        return  this.getEndCell(focusedCell,newEndCell);;\n    }\n\n\n\n    /**\n     * Adds a cell range to the current selection.\n     * @param {CellRangeParams} params - Parameters for the cell range.\n     */\n\n    public addCellRanges(paramsList: CellRangeParams[], eventOrigin: 'api' | 'ui' = 'ui'): void {\n        if (!this.ensureRangeSelectionEnabled()) return;\n    \n        const newRanges = paramsList .map(params => this.createCellRangeFromCellRangeParams(params)) .filter((range): range is CellRangeType => !!range); // Filter out any invalid ranges\n    \n        if (newRanges.length === 0) return;\n\n        const api = (params : any) => {\n            const newRangeMeta = params[0];\n            const{startRow, startColumnId} = newRangeMeta;\n            if (newRangeMeta.startRow) {\n                this.currentRangeStartCell = {\n                    rowIndex   : startRow.rowIndex,\n                    pinPosition: startRow.pinPosition,\n                    columnID   : startColumnId,\n                    parentKeys : startRow.parentKeys\n                };\n            }\n        \n            this.rangeSelectionHookWrapper.addCellRange(params, eventOrigin);\n        \n            this.dispatchChangedEvent();\n        }\n        this.hook.executeOnHook(HookEventsName.onRangeSelectionChanged, api, newRanges);\n    }\n    \n\n    /**\n     * Creates a cell range based on the provided parameters.\n     * @param {CellRangeParams} params - Parameters for the cell range.\n     * @returns {CellRangeType | undefined} The cell range or undefined if invalid.\n     */\n    public createCellRangeFromCellRangeParams(params: CellRangeParams): CellRangeType | undefined {\n        let columns: string[] | undefined;\n        let fromRight = false;\n\n        if (params.columnIds) {\n            columns = params.columnIds;\n        } else {\n            const { columnStart, columnEnd } = params;\n\n            if (!columnStart || !columnEnd) return undefined;\n\n            columns = this.calculateColumnsBetween(columnStart, columnEnd);\n\n            if (columns && columns.length) {\n                fromRight = columns[0] !== columnStart;\n            }\n        }\n\n        if (!columns) return undefined;\n\n        const startRow = params.rowStartIndex != null ? { rowIndex: params.rowStartIndex, pinPosition: params.rowStartPinned || null, parentKeys : params.rowStartParamKeys || [] } : undefined;\n\n        const endRow = params.rowEndIndex != null ? { rowIndex: params.rowEndIndex, pinPosition: params.rowEndPinned || null, parentKeys : params.rowEndParamKeys || [] } : undefined;\n\n        return {\n            startRow,\n            endRow,\n            columnIds    : columns,\n            startColumnId: fromRight ? columns[columns.length - 1]: columns[0],\n            endColumnId  : fromRight ? columns[0]                 : columns[columns.length - 1]\n        };\n    }\n\n    /**\n     * Sets the range for a specific cell position, with an option for multi-selection.\n     * @param {CellPositionType} cellPosition - The cell position.\n     * @param {boolean} [multi=false] - Whether to allow multi-selection.\n     */\n    public setRange(cellPosition: CellPositionType, multi: boolean = false): void {\n        if (!this.ensureRangeSelectionEnabled()) return;\n\n        this.selectionState = 'range';\n\n        const columnIDs: string[] = this.calculateColumnsBetween(cellPosition.columnID, cellPosition.columnID);\n\n        const suppressMultiRangeSelection = this.optionsHandler.suppressMultiRangeSelection();\n\n        if (suppressMultiRangeSelection || !multi || !this.cellRanges.length) {\n            this.rangeSelectionHookWrapper.removeRangeSelection();\n        }\n\n        if (cellPosition.rowIndex === null) {\n            this.dispatchChangedEvent();\n            return;\n        }\n        const rowForCell: RowPositionType = {\n            rowIndex   : cellPosition.rowIndex,\n            pinPosition: cellPosition.pinPosition,\n            parentKeys : cellPosition.parentKeys\n        };\n\n        const cellRange: CellRangeType = {\n            startRow     : rowForCell,\n            endRow       : rowForCell,\n            columnIds    : columnIDs,\n            startColumnId: cellPosition.columnID,\n            endColumnId  : cellPosition.columnID\n        };\n\n        this.currentRangeStartCell = cellPosition;\n\n        this.rangeSelectionHookWrapper.addCellRange([cellRange]);\n        this.dispatchChangedEvent();\n    }\n\n    /**\n     * Dispatches a range selection changed event.\n     * @param {CellRangeType[]} previousCellRange - The previous cell range.\n     * @param {CellRangeType[]} currentCellRange - The current cell range.\n     * @param {string} [id] - Optional ID of the range.\n     */\n    public dispatchChangedEvent(id?: string): void {\n        this.allowSingleActionStarted = true;\n        const event = {\n            type: Events.EVENT_RANGE_SELECTION_CHANGED,\n            id\n        };\n\n        this.eventHandler.dispatchEvent(event);\n        this.allowSingleActionStarted = false;\n    }\n\n    /**\n     * Removes all range selections.\n     */\n    public removeRangeSelection(): void {\n        if (this.isEmpty()) return;\n\n        this.cellRanges = [];\n\n        this.dispatchChangedEvent();\n    }\n\n    /**\n     * Gets the current cell ranges.\n     * @returns {CellRangeType[]} The current cell ranges.\n     */\n    public getCellRanges(): CellRangeType[] {\n        return this.cellRanges;\n    }\n\n    /**\n     * Checks if the cell ranges are empty.\n     * @returns {boolean} True if there are no cell ranges, false otherwise.\n     */\n    public isEmpty(): boolean {\n        return this.cellRanges.length === 0;\n    }\n\n    /**\n     * Calculates the columns between two given column IDs.\n     * @param {string} columnFromID - The starting column ID.\n     * @param {string} columnToID - The ending column ID.\n     * @returns {string[] | null} The list of column IDs or null if not found.\n     */\n    public calculateColumnsBetween(columnFromID: string, columnToID: string): string[] | null {\n        const allColumns = this.fieldHandler.getAllDisplayedColumnIDs();\n        const isSameColumn = columnFromID === columnToID;\n        const fromIndex = allColumns.indexOf(columnFromID);\n\n        if (fromIndex < 0) {\n            return null;\n        }\n\n        const toIndex = isSameColumn ? fromIndex : allColumns.indexOf(columnToID);\n\n        if (toIndex < 0) {\n            return null;\n        }\n\n        if (isSameColumn) {\n            return [columnFromID];\n        }\n\n        const firstIndex = Math.min(fromIndex, toIndex);\n        const lastIndex = firstIndex === fromIndex ? toIndex : fromIndex;\n        const columns: string[] = [];\n\n        for (let i = firstIndex; i <= lastIndex; i++) {\n            columns.push(allColumns[i]);\n        }\n\n        return columns;\n    }\n\n    /**\n     * The function `isCellInSpecificRange` checks if a cell is within a specific range defined by\n     * column IDs and row indices.\n     * @param {CellPositionType} cell - The `cell` parameter in the `isCellInSpecificRange` function\n     * represents the position of a cell in a grid. It typically includes information such as the\n     * column ID, row index, and whether the row is pinned or not.\n     * @param {CellRangeType} range - The `range` parameter in the `isCellInSpecificRange` function\n     * represents a specific range of cells in a grid or spreadsheet. It typically includes information\n     * about the columns and rows that define the boundaries of the range.\n     * @returns The function `isCellInSpecificRange` returns a boolean value, indicating whether the\n     * given cell is within the specified range based on the column and row criteria.\n     */\n    public isCellInSpecificRange(cell: CellPositionType, range: CellRangeType): boolean {\n        const columnInRange = range.columnIds !== null && range.columnIds.includes(cell.columnID);\n        const rowInRange = this.isRowInRange(cell.rowIndex, cell.pinPosition, cell.parentKeys, range);\n\n        const suppressGroupToGroupRangeSelection = this.optionsHandler.suppressGroupToGroupRangeSelection();\n        if(columnInRange && rowInRange && suppressGroupToGroupRangeSelection) {\n            const startRowGroup = range.startRow.parentKeys;\n            const endRowGroup   = range.endRow.parentKeys;\n\n            return areArraysEqual(startRowGroup, cell.parentKeys) && areArraysEqual(endRowGroup, cell.parentKeys)\n        }\n    \n        return columnInRange && rowInRange;\n    }\n    \n    /**\n     * The function `isRowInRange` checks if a given row index falls within a specified cell range.\n     * @param {number} rowIndex - The `rowIndex` parameter in the `isRowInRange` function represents\n     * the index of the row that you want to check if it falls within a specified range of rows.\n     * @param {rowPinPositions} pinPosition - The `pinPosition` parameter in the `isRowInRange`\n     * function represents the position of a row pin, which can be either `top`, `bottom`, or `null` if\n     * the row is not pinned. It is used to determine if a given row is within a specified range of\n     * rows in\n     * @param {CellRangeType} cellRange - The `cellRange` parameter in the `isRowInRange` function\n     * represents a range of cells in a grid or table. It typically consists of the starting row and\n     * ending row of the range.\n     * @returns The function `isRowInRange` returns a boolean value, either `true` or `false`, based on\n     * whether the provided `rowIndex` and `pinPosition` fall within the specified `cellRange`.\n     */\n    public isRowInRange(rowIndex: number, pinPosition: rowPinPositions, parentKeys : string[],  cellRange: CellRangeType): boolean {\n        const firstRow = this.getRangeStartRow(cellRange);\n        const lastRow = this.getRangeEndRow(cellRange);\n        const thisRow: RowPositionType = { rowIndex, pinPosition: pinPosition || null, parentKeys : parentKeys || [] };\n    \n        const equalsFirstRow = thisRow.rowIndex === firstRow.rowIndex && thisRow.pinPosition === firstRow.pinPosition && areArraysEqual(thisRow.parentKeys, firstRow.parentKeys);\n        const equalsLastRow = thisRow.rowIndex === lastRow.rowIndex && thisRow.pinPosition === lastRow.pinPosition&& areArraysEqual(thisRow.parentKeys, lastRow.parentKeys);\n    \n        if (equalsFirstRow || equalsLastRow) {\n            return true;\n        }\n    \n        const afterFirstRow = !this.isRowBefore(thisRow, firstRow);\n        const beforeLastRow = this.isRowBefore(thisRow, lastRow);\n    \n        return afterFirstRow && beforeLastRow;\n    }\n    \n    /**\n     * This TypeScript function compares two row positions to determine if one row is positioned before\n     * the other based on pinning and index values.\n     * @param {RowPositionType} previousRowPosition - The `previousRowPosition` parameter represents\n     * the position of a row in a grid or table. It has two properties:\n     * @param {RowPositionType} currentPinPosition - The `currentPinPosition` parameter represents the\n     * position of a row in a grid or table. It has two properties: `pinPosition` which indicates whether\n     * the row is pinned to the top or bottom, and `rowIndex` which specifies the index of the row.\n     * @returns a boolean value based on the comparison of row positions. If the previous row is pinned\n     * to the top, it will return true if the current row is not pinned to the top. If the previous row\n     * is pinned to the bottom, it will return false if the current row is not pinned to the bottom. If\n     * the previous row is not pinned, it will return true if the current\n     */\n    public isRowBefore(previousRowPosition: RowPositionType, currentPinPosition: RowPositionType): boolean {\n        const previousPositionPriority = positionPriority[previousRowPosition.pinPosition];\n        const currentPositionPriority = positionPriority[currentPinPosition.pinPosition];\n\n        if(previousPositionPriority > currentPositionPriority) {\n            return false;\n        }\n        else if(previousPositionPriority < currentPositionPriority) {\n            return true;\n        }\n        else{\n            const previousRowIndex = this.recordHandler.getIndexByMeta(previousRowPosition.rowIndex, previousRowPosition.pinPosition, previousRowPosition.parentKeys);\n            const currentRowIndex  = this.recordHandler.getIndexByMeta(currentPinPosition.rowIndex, currentPinPosition.pinPosition, currentPinPosition.parentKeys);\n\n            return previousRowIndex < currentRowIndex;\n        }\n\n\n        // switch (previousRowPosition.pinPosition) {\n        //     case 'top':\n        //         if (currentPinPosition.pinPosition !== 'top') { \n        //             return true; \n        //         }\n        //         break;\n        //     case 'bottom':\n        //         if (currentPinPosition.pinPosition !== 'bottom') { \n        //             return false; \n        //         }\n        //         break;\n        //     default:\n        //         if(currentPinPosition.pinPosition !== 'middle') {\n        //             return currentPinPosition.pinPosition !== 'top';\n        //         }\n        //         break;\n        // }\n\n        // const previousRowIndex = this.recordHandler.getIndexByMeta(previousRowPosition.rowIndex, previousRowPosition.pinPosition, previousRowPosition.parentKeys);\n        // const currentRowIndex  = this.recordHandler.getIndexByMeta(currentPinPosition.rowIndex, currentPinPosition.pinPosition, currentPinPosition.parentKeys);\n\n        // return previousRowIndex < currentRowIndex;\n    }\n    \n    /**\n     * This function returns the starting row position of a given cell range, taking into account\n     * whether the row is before or after another row and the presence of any pinned rows.\n     * @param {CellRangeType} cellRange - A type representing a range of cells in a spreadsheet,\n     * typically consisting of a start row and an end row.\n     * @returns The function `getRangeStartRow` returns the starting row position of the given cell\n     * range. If both the start row and end row of the cell range are provided, it returns the row that\n     * comes first based on the `isRowBefore` comparison. If the start and end rows are not both\n     * provided, it calculates the `pinPosition` value based on the top span count and returns a\n     */\n    public getRangeStartRow(cellRange: CellRangeType): RowPositionType {\n        if (cellRange.startRow && cellRange.endRow) {\n            return this.isRowBefore(cellRange.startRow, cellRange.endRow) ? cellRange.startRow : cellRange.endRow;\n        }\n    \n        const pinPosition = this.recordHandler.getTopSpanCount() > 0 ? 'top' : null;\n    \n        return { rowIndex: 0, pinPosition, parentKeys : [] };\n    }\n    \n    /**\n     * This function determines the end row of a cell range based on certain conditions.\n     * @param {CellRangeType} cellRange - The `cellRange` parameter is an object that represents a\n     * range of cells in a grid. It typically contains information about the starting row and ending\n     * row of the cell range.\n     * @returns The `getRangeEndRow` function returns a `RowPositionType` object, which contains\n     * information about the end row of a cell range. The object includes the `rowIndex` property\n     * indicating the index of the row and the `pinPosition` property indicating whether the row is\n     * pinned to the top, bottom, or not pinned at all.\n     */\n    public getRangeEndRow(cellRange: CellRangeType): RowPositionType {\n        if (cellRange.startRow && cellRange.endRow) {\n            return this.isRowBefore(cellRange.startRow, cellRange.endRow) ? cellRange.endRow : cellRange.startRow;\n        }\n    \n        const pinnedBottomRowCount = this.recordHandler.getBottomSpanCount();\n        const pinnedBottom = pinnedBottomRowCount > 0;\n    \n        if (pinnedBottom) {\n            return {\n                rowIndex   : pinnedBottomRowCount - 1,\n                pinPosition: 'bottom',\n                parentKeys : []\n            };\n        }\n    \n        return {\n            rowIndex: this.recordHandler.getMiddleSpanCount() - 1,\n            pinPosition: null,\n            parentKeys : []\n        };\n    }\n\n    public getCellRangeCount(cell: CellPositionType): number {\n        if (this.isEmpty()) {\n            return 0;\n        }\n        const filteredRange = this.cellRanges.filter(cellRange => this.isCellInSpecificRange(cell, cellRange))\n        return filteredRange.length;\n    }\n\n    public createCellRangeHandler(getBeanInstanceByBeanName : getBeanInstanceByBeanName, cellController : CellController) : ICellRangeHandler {\n       return new CellRangeHandler(getBeanInstanceByBeanName, cellController);\n    }\n\n    public addCellRangeInfo(cellRange : CellRangeType[]) : void {\n        this.cellRanges.push(...cellRange);\n    }\n\n    public setCurrentCellRange(range: CellPositionType): void {\n        this.currentRangeStartCell = range;\n    }\n    \n    public getCurrentCellRange(): CellPositionType {\n        return this.currentRangeStartCell;\n    }\n\n    public extendLatestRangeToCell(cellPosition: CellPositionType): void {\n        if (this.isEmpty() || !this.currentRangeStartCell) {\n            return;\n        }\n\n        const cellRange = this.cellRanges[this.cellRanges.length - 1];\n\n        this.updateRangeEnd(cellRange, cellPosition);\n    }\n\n    public updateRangeEnd(cellRange: CellRangeType, cellPosition: CellPositionType,): void {\n        const endColumn = cellPosition.columnID ;\n        const colsToAdd = this.calculateColumnsBetween(cellRange.startColumnId, endColumn);\n\n        if (!colsToAdd || this.isLastCellOfRange(cellRange, cellPosition)) {\n            return;\n        }\n\n        cellRange.columnIds = colsToAdd;\n        cellRange.endRow = { rowIndex: cellPosition.rowIndex, pinPosition: cellPosition.pinPosition, parentKeys : cellPosition.parentKeys };\n\n        this.dispatchChangedEvent();\n    }\n\n    private isLastCellOfRange(cellRange: CellRangeType, cell: CellPositionType): boolean {\n        const { startRow, endRow }  = cellRange;\n        const lastRow               = this.isRowBefore(startRow!, endRow!) ? endRow : startRow;\n        const isLastRow             = cell.rowIndex           === lastRow!.rowIndex && cell.pinPosition === lastRow!.pinPosition;\n        const rangeFirstIndexColumn = cellRange.columnIds[0];\n        const rangeLastIndexColumn  = cellRange.columnIds[cellRange.columnIds.length - 1];\n        const lastRangeColumn       = cellRange.startColumnId === rangeFirstIndexColumn ? rangeLastIndexColumn : rangeFirstIndexColumn;\n        const isLastColumn          = cell.columnID           === lastRangeColumn;\n\n        return isLastColumn && isLastRow;\n    }\n\n    public removeCellRange(cellRangeParams: CellRangeType, eventOrigin :'api' | 'ui' = 'ui'): void {\n        this.rangeSelectionHookWrapper.removeCellRange([cellRangeParams], eventOrigin);\n    }\n\n    public removeCellRanges(cellRangeParams: CellRangeType[], eventOrigin :'api' | 'ui' = 'ui'): void {\n        this.rangeSelectionHookWrapper.removeCellRange(cellRangeParams, eventOrigin);\n    }\n    \n    public isCellRangeExist(cellRanges: CellRangeType[]): boolean {\n        return cellRanges.some(cellRangeParams =>\n            this.cellRanges.some(existingRange => {\n                const isSameRowRange = existingRange.startRow?.rowIndex === cellRangeParams.startRow?.rowIndex\n                                    && existingRange.endRow?.rowIndex === cellRangeParams.endRow?.rowIndex\n                                    && existingRange.startRow?.pinPosition === cellRangeParams.startRow?.pinPosition\n                                    && existingRange.endRow?.pinPosition === cellRangeParams.endRow?.pinPosition;\n    \n                const isSameColumnRange = existingRange.startColumnId === cellRangeParams.startColumnId\n                                       && areArraysEqual(existingRange.columnIds, cellRangeParams.columnIds);\n    \n                return isSameRowRange && isSameColumnRange;\n            })\n        );\n    }\n\n    removeCellRangesInfo(cellRangeParamsList: CellRangeType[]): void {\n        this.cellRanges = this.cellRanges.filter(range => {\n            // Check if any cellRangeParams match the current range\n            const isMatchingAnyRange = cellRangeParamsList.some(cellRangeParams => {\n                const isSameRowRange = range.startRow?.rowIndex === cellRangeParams.startRow?.rowIndex\n                                    && range.endRow?.rowIndex === cellRangeParams.endRow?.rowIndex\n                                    && range.startRow?.pinPosition === cellRangeParams.startRow?.pinPosition\n                                    && range.endRow?.pinPosition === cellRangeParams.endRow?.pinPosition;\n    \n                const isSameColumnRange = range.startColumnId === cellRangeParams.startColumnId\n                                       && areArraysEqual(range.columnIds, cellRangeParams.columnIds);\n    \n                return isSameRowRange && isSameColumnRange;\n            });\n    \n            // Keep ranges that do not match any of the provided cell ranges\n            return !isMatchingAnyRange;\n        });\n\n        this.dispatchChangedEvent();\n    }\n\n    public removeRangeSelectionWithHook(eventOrigin : 'api' | 'ui' = 'ui') : void {\n        this.rangeSelectionHookWrapper.removeRangeSelection(eventOrigin);\n    }\n\n    public getRangeRowPositions(range : CellRangeType) : RowPositionType[] {\n        const rowPositions = [];\n        const startRow = this.getRangeStartRow(range);\n        const lastRow = this.getRangeEndRow(range);\n        let node = startRow;\n        while (node) {\n          rowPositions.push(node);\n          if (this.sameRow(node, lastRow)) {\n            break;\n          }\n          node = this.cellNavigationHandler.getRowBelow(node);\n        }\n        return rowPositions;\n      }\n\n    private sameRow(previousRowPosition: RowPositionType | undefined, currentRowPosition: RowPositionType | undefined): boolean {\n        if (!previousRowPosition && !currentRowPosition) { return true; }\n        if ((previousRowPosition && !currentRowPosition) || (!previousRowPosition && currentRowPosition)) { return false; }\n        return previousRowPosition!.rowIndex === currentRowPosition!.rowIndex && previousRowPosition!.pinPosition == currentRowPosition!.pinPosition;\n    }\n\n    public hasMultipleCells(): boolean {\n        const len = this.cellRanges.length;\n\n        if (len === 0) {\n            return false;\n        }\n        if (len > 1) {\n            return true;\n        }\n\n        const range = this.cellRanges[0];\n        const startRow = this.getRangeStartRow(range);\n        const endRow = this.getRangeEndRow(range);\n\n        return (\n            startRow.pinPosition     !== endRow.pinPosition ||\n            startRow.rowIndex      !== endRow.rowIndex ||\n            range.columnIds.length !== 1\n        );\n    }\n\n    public isContiguousRange(cellRange: CellRangeType): boolean {\n        const rangeColumns = cellRange.columnIds;\n\n        if (!rangeColumns.length) {\n            return false;\n        }\n\n        const allPositions = rangeColumns.map((c) => this.fieldHandler.getIndexById(c)).sort((a, b) => a - b);\n\n        return allPositions[allPositions.length - 1] - allPositions[0] + 1 === rangeColumns.length;\n    }\n\n    public isBottomRightCell(cellRange: CellRangeType, cell: CellPositionType): boolean {\n        const allPositions = cellRange.columnIds.map((c) => this.fieldHandler.getIndexById(c)).sort((a, b) => a - b);\n        const { startRow, endRow } = cellRange;\n        const lastRow = this.isRowBefore(startRow!, endRow!) ? endRow : startRow;\n\n        const isRightColumn = this.fieldHandler.getIndexById(cell.columnID ) === allPositions[allPositions.length - 1];\n        const isLastRow = cell.rowIndex === lastRow!.rowIndex && makeNull(cell.pinPosition) === makeNull(lastRow!.pinPosition);\n\n        return isRightColumn && isLastRow;\n    }\n\n    public clearCellRangeCellValues(cellRanges : CellRangeType[] | null, eventOrigin : HookInitiator): void {\n\n        if(!cellRanges) {\n            cellRanges = this.cellRanges;\n        }\n        const dataCellRanges: IRange[] = [];\n    \n        cellRanges.forEach((cellRange) => {\n            dataCellRanges.push({\n                columnIds : cellRange.columnIds,\n                endRow  : cellRange.endRow,\n                startRow: cellRange.startRow\n            });\n        });\n\n        this.cellAPI.clearDataInRanges(dataCellRanges,{}, { eventOrigin });\n    }\n\n    public forEachRowInRange(cellRange: CellRangeType, callback: (row: RowPositionType) => void) {\n        const topRow = this.getRangeStartRow(cellRange);\n        const bottomRow = this.getRangeEndRow(cellRange);\n        let currentRow: RowPositionType | null = topRow;\n\n        while (currentRow) {\n            callback(currentRow);\n\n            if (this.sameRow(currentRow, bottomRow)) {\n                break;\n            }\n            currentRow = this.cellNavigationHandler.getRowBelow(currentRow);\n        }\n    }\n\n    public selectAll(): void {\n        const allColumns                         = this.fieldHandler.getAllDisplayedColumnIDs();\n        const suppressGroupToGroupRangeSelection = this.optionsHandler.suppressGroupToGroupRangeSelection();\n        if(suppressGroupToGroupRangeSelection ) {\n            const focusedCellPosition = this.focusHandler.getFocusedCellPosition();\n            if(focusedCellPosition) {\n                const firstGroupRow = this.recordHandler.getGroupFirstRow(focusedCellPosition);\n                const lastGroupRow = this.recordHandler.getGroupLastRow(focusedCellPosition);\n                this.setCellRange({\n                    columnIds        : allColumns,\n                    rowStartIndex    : firstGroupRow.rowIndex,\n                    rowEndIndex      : lastGroupRow.rowIndex,\n                    rowStartPinned   : firstGroupRow.pinPosition,\n                    rowEndPinned     : lastGroupRow.pinPosition,\n                    rowStartParamKeys: firstGroupRow.parentKeys,\n                    rowEndParamKeys  : lastGroupRow.parentKeys\n                })\n\n                return;\n            }\n            \n        }\n\n        // const isEmptyTopRow    = !(this.recordHandler.getTopSpanCount() > 0);\n        // const isEmptybottomRow = !(this.recordHandler.getBottomSpanCount() > 0);\n\n        // const floatingStart = isEmptyTopRow ? 'middle' : 'top';\n        // let floatingEnd : rowPinPositions;\n        // let rowEnd : number;\n        // if (isEmptybottomRow) {\n        //     floatingEnd = 'middle';\n        //     rowEnd = this.recordHandler.getMiddleSpanCount() - 1;\n        // } else {\n        //     floatingEnd = 'bottom';\n        //     rowEnd = this.recordHandler.getBottomSpanCount() - 1;\n        // }\n\n        const lastRow  = this.recordHandler.getLastIndexMeta();\n        const firstRow = this.recordHandler.getFirstIndexMeta();\n\n        this.setCellRange({\n            columnIds        : allColumns,\n            rowStartIndex    : firstRow.rowIndex,\n            rowEndIndex      : lastRow.rowIndex,\n            rowStartPinned   : firstRow.pinPosition,\n            rowEndPinned     : lastRow.pinPosition,\n            rowStartParamKeys: firstRow.parentKeys,\n            rowEndParamKeys  : lastRow.parentKeys\n        })\n    }\n\n    public selectColumnAsRange(startColumnId : string, endColumnId : string) : void{\n\n        // const isEmptyTopRow    = !(this.recordHandler.getTopSpanCount() > 0);\n        // const isEmptybottomRow = !(this.recordHandler.getBottomSpanCount() > 0);\n\n        // const floatingStart = isEmptyTopRow ? 'middle' : 'top';\n        // let floatingEnd : rowPinPositions;\n        // let rowEnd : number;\n        // if (isEmptybottomRow) {\n        //     floatingEnd = 'middle';\n        //     rowEnd = this.recordHandler.getMiddleSpanCount() - 1;\n            \n        // } else {\n        //     floatingEnd = 'bottom';\n        //     rowEnd = this.recordHandler.getBottomSpanCount() - 1;\n        // }\n\n        const firstRow = this.recordHandler.getFirstIndexMeta();\n        const lastRow = this.recordHandler.getLastIndexMeta();\n        this.selectionState = 'column';\n        this.setCellRange({\n            columnStart      : startColumnId,\n            columnEnd        : endColumnId,\n            rowStartIndex    : firstRow.rowIndex,\n            rowEndIndex      : lastRow.rowIndex,\n            rowStartPinned   : firstRow.pinPosition,\n            rowEndPinned     : lastRow.pinPosition,\n            rowStartParamKeys: firstRow.parentKeys,\n            rowEndParamKeys  : lastRow.parentKeys\n        })\n    }\n\n    public selectRowAsRange(startRowPosition : RowPositionType, endRowPosition : RowPositionType) : void{\n        const allColumns = this.fieldHandler.getAllDisplayedColumnIDs();\n        this.selectionState = 'row';\n        this.setCellRange({\n            columnIds        : allColumns,\n            rowStartIndex    : startRowPosition.rowIndex,\n            rowEndIndex      : endRowPosition.rowIndex,\n            rowStartPinned   : startRowPosition.pinPosition,\n            rowEndPinned     : endRowPosition.pinPosition,\n            rowStartParamKeys: startRowPosition.parentKeys,\n            rowEndParamKeys  : endRowPosition.parentKeys\n        })\n    }\n\n    public isCellExistAnyRange(cellPosition: CellPositionType): boolean {\n        for (let i = 0; i < this.cellRanges.length; i++) {\n            const cellRange = this.cellRanges[i];\n            if (this.isCellInSpecificRange(cellPosition, cellRange)) {\n                return true;\n            }\n        }\n        return false; \n    }\n    \n\n    private getEndCell(activeCell : CellPositionType, endCell : CellPositionType) : CellPositionType {\n        switch(this.selectionState) {\n            case 'range' :\n            case 'row':\n                return endCell;\n            default:\n                return activeCell;\n        }\n    }\n\n\n    /** @internal */\n    static RangeSelectionWrapper  = class implements IRangeSelectionWrapper {\n        constructor(private rangeSelection : IRangeSelectionHandler) {}\n\n        public addCellRange(cellRange: CellRangeType): void {\n            this.rangeSelection.addCellRangeInfo([cellRange]);\n        }\n\n        public getCellRanges(): CellRangeType[] {\n           return this.rangeSelection.getCellRanges();\n        }\n        \n        public dispatchChangedEvent(id?: string): void {\n            this.rangeSelection.dispatchChangedEvent(id);\n        }\n        \n        public calculateColumnsBetween(columnFromID: string, columnToID: string): string[] | null {\n           return this.rangeSelection.calculateColumnsBetween(columnFromID, columnToID);\n        }\n        \n        public setCurrentCellRange(CellPosition: CellPositionType): void {\n            this.rangeSelection.setCurrentCellRange(CellPosition);\n        }\n        \n        public getCurrentCellRange(): CellPositionType {\n            return this.rangeSelection.getCurrentCellRange();\n        }\n\n        public removeRangeSelection(): void {\n            this.rangeSelection.removeRangeSelection();\n        }\n\n    }\n    \n\n    /** @internal */\n    static RangeSelectionHookWrapper = class implements IRangeSelectionHookWrapper  {\n        constructor(private rangeSelection : RangeSelectionHandler, private hookManager : IHookManager) {\n\n        }\n\n        addCellRange(CellPosition: CellRangeType[], eventOrigin :'api' | 'ui' = 'ui'): void {\n            const params = {\n                cellRanges: CellPosition,\n                eventOrigin\n            };\n            const api = (params : any) => {\n                this.rangeSelection.addCellRangeInfo(params.cellRanges);\n            }\n            this.hookManager.executeHook(HookEventsName.onBeforeRangeSelect, HookEventsName.onAfterRangeSelect, api, params);  \n        }\n\n        removeRangeSelection(eventOrigin :'api' | 'ui' = 'ui'): void {\n            const params = {\n\n                cellRanges :this.rangeSelection.getCellRanges(),\n                eventOrigin\n            }\n            const api = (_params : any) => {\n                this.rangeSelection.removeRangeSelection();\n            }\n            this.hookManager.executeHook(HookEventsName.onBeforeRangeDeselect, HookEventsName.onAfterRangeDeselect, api, params);\n        }\n\n        removeCellRange(cellRanges: CellRangeType[], eventOrigin: 'api' | 'ui' = 'ui'): void {\n            const params = {\n                cellRanges :cellRanges,\n                eventOrigin\n            }\n            const api = (params) => {\n                this.rangeSelection.removeCellRangesInfo(params.cellRanges);\n            };\n            this.hookManager.executeHook(HookEventsName.onBeforeRangeDeselect, HookEventsName.onAfterRangeDeselect, api, params);\n        }\n\n        destroy() : void {\n            this.rangeSelection = null;\n            this.hookManager = null;\n        }\n    }\n\n    \n}","import { IModule } from \"../../Sub_Components/src/fieldcomponents/dg-base/src/core/modules.types\";\nimport { RangeSelectionHandler } from \"./range-selection-handler\";\n\nexport const RangeSelectionModule : IModule = {\n    moduleName : \"RangeSelection\",\n    version : \"1.0.0\",\n    beans : [RangeSelectionHandler]\n}","import { DraggingEvent } from \"../DragAndDrop-handler/dragAndDrop-handler.types\";\nimport { IRowDragItem, RowDragHandler } from \"./row-drag-handler\";\n\nexport class BodyRowDragger extends RowDragHandler {\n    onDragging(params: DraggingEvent<IRowDragItem>): void {\n        this.dispatchDraggingEvent('rowDragMove', params);\n        \n        this.clearRowHighlight();\n\n        this.autoScrollHandler?.update(params.event, false, false, true);\n    }\n\n    onDragStop(params: DraggingEvent<IRowDragItem>): void {\n        this.dispatchDraggingEvent('rowDragEnd', params);\n        this.autoScrollHandler?.clear();\n        this.clearRowHighlight();\n    }\n}","import { AutoWired, BEAN_NAME, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { DraggingEvent, IDropTarget } from \"../DragAndDrop-handler/dragAndDrop-handler.types\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { IControllerHandler, IPaneControllerParam } from \"../Grid/Core/Interface/IControllerHandler\";\n// import { DragAndDropHandler } from \"../DragAndDrop-handler/dragAndDrop-handler\";\nimport { ReorderableAPI } from \"../Grid/API/ReorderableAPI/ReorderableAPI\";\nimport { IRowNodeCore, RowHighlightPosition } from \"../DataStore/rownode.types\";\nimport { IAutoScrollHandler, IAutoScrollOptions } from \"../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler.types\";\nimport { GridBodyScrollHandler } from \"../Grid/Core/GridBodyScrollHandler\";\nimport { AutoScrollHandler } from \"../../Sub_Components/src/auto-scroll-handler/auto-scroll-handler\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { RowDragEvent } from \"./row-drag-handler.types\";\nimport { SelectedRowRange } from \"../Selection/row-selection/row-selection.types\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\nimport { IRowNode } from \"../Grid/Main\";\n\n\n export interface IRowReoderParams {\n\t\tvalues             : IRowDragItem;\n\t\tAPIs               : any;\n }\n\n export interface IRowReorderItem {\n\t\tgetRendererParam: any;\n\t\tgetRenderer: any;\n }\nexport interface IRowDragItem {\n    rowIDs : string[];\n    rowRanges : SelectedRowRange[],\n    selectionType : 'index' | 'id'\n}\nexport class RowDragHandler extends EventEmitter implements IDropTarget<IRowDragItem> {\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler: IControllerHandler;\n    @AutoWired(GRID_BEAN_NAME.REORDERABLE_API) private reorderableAPI: ReorderableAPI;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) private recordHandler: IRecordHandler;\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) private optionHandler: GridOptioHandler;\n\n    protected lastHighlightedRow: IRowNodeCore | null = null;\n    protected autoScrollHandler: IAutoScrollHandler | null = null;\n\n    constructor(private container: HTMLElement) {\n        super();\n    }\n\n    @PostConstruct()\n    init(): void {\n        this.controllerHandler.onAfterGridReady((params: IPaneControllerParam) => {\n            const autoScrollOptions = new RowDragHandler.AutoScrollHandlerOptions(\n                params, \n                'y',\n                true\n            );\n            this.autoScrollHandler = new AutoScrollHandler(autoScrollOptions);\n\n            this.addDestroyFunc(() => {\n                this.autoScrollHandler = null;\n            });\n        });\n    }\n\n    getContainer(): HTMLElement {\n        return this.container;\n    }\n\n    isInterestedIn(type: string, _container: HTMLElement): boolean {\n        return type === 'rowDrag';\n    }\n\n    onDragEnter?(params: DraggingEvent<IRowDragItem>): void {\n        this.dispatchDraggingEvent('rowDragEnter', params);\n        this.autoScrollHandler?.clear();\n        this.getRowNodes(params).forEach(rownode => {\n            rownode.setDraggingState(true);\n        })\n    }\n\n    onDragLeave?(params: DraggingEvent<IRowDragItem>): void {\n        this.dispatchDraggingEvent('rowDragLeave', params);\n        this.autoScrollHandler?.clear();\n        this.clearRowHighlight();\n    }\n\n    onDragging?(params: DraggingEvent<IRowDragItem>): void {\n        this.dispatchDraggingEvent('rowDragMove', params);\n\n        const targetRow = this.getRowOverNode(params);\n\n        this.clearRowHighlight();\n        if (targetRow) {\n\n            if(!targetRow.isGroupRow()) {\n                const highlightPos = this.getHighlightPosition(this.getNormalisedPosition(params).y, targetRow);\n                targetRow.setHighlighted(highlightPos);\n                this.lastHighlightedRow = targetRow;\n            }else {\n                this.clearRowHighlight();\n            }\n        }\n\n        this.autoScrollHandler?.update(params.event);\n    }\n\n    onDragStop?(params: DraggingEvent<IRowDragItem>): void {\n        this.dispatchDraggingEvent('rowDragEnd', params);\n        this.getRowNodes(params).forEach(rownode => {\n            rownode.setDraggingState(false);\n        })\n        const { rowIDs, rowRanges } = params.dragItem;\n        const targetRow = this.getRowOverNode(params);\n        const position = this.getHighlightPosition(this.getNormalisedPosition(params).y, targetRow);\n\n        if (targetRow) {\n            if(!targetRow.isGroupRow()) {\n                if(rowIDs.length != 0) {\n                    this.reorderableAPI.moveRowsById(rowIDs, targetRow.getId(), position === 'above' ? 'before' : 'after', {}, {\n                        eventOrigin: 'ui',\n                        event      : params.event\n                    });\n                }else if(rowRanges.length != 0) {\n                    this.reorderableAPI.moveRowRange(rowRanges, targetRow.getRowMeta(), position === 'above' ? 'before' : 'after', {}, {\n                        eventOrigin: 'ui',\n                        event      : params.event\n                    });\n                }\n            }\n        }\n\n        this.autoScrollHandler?.clear();\n        this.clearRowHighlight();\n\n        rowIDs.forEach(rowId => {\n            this.recordHandler.removeStaticRowById(rowId);\n        });\n\n\n    }\n\n    onDragCancel(params: DraggingEvent<IRowDragItem>): void {\n        this.dispatchDraggingEvent('rowDragCancel');\n        this.getRowNodes(params).forEach(rownode => {\n            rownode.setDraggingState(false);\n        })\n        this.autoScrollHandler?.clear();\n        this.clearRowHighlight();\n    }\n\n    protected getRowOverNode(draggingEvent: DraggingEvent<IRowDragItem>): IRowNodeCore | null {\n        const { x, y } = this.getNormalisedPosition(draggingEvent);\n        const middleHandler = this.recordHandler.getMiddleHandler();\n        const overIndex = middleHandler.getRowByPosition(y, x);\n        const rowNode = middleHandler.getRowNode(overIndex) ?? null;\n        return rowNode ? ((rowNode.getPinnedPosition() === 'bottomDraftRow' || rowNode.getPinnedPosition() === 'topDraftRow') ? null : rowNode) : null\n    }\n\n    protected clearRowHighlight(): void {\n        if (this.lastHighlightedRow) {\n            this.lastHighlightedRow.setHighlighted(null);\n            this.lastHighlightedRow = null;\n        }\n    }\n\n    protected dispatchDraggingEvent(type : string, draggingEvent?: DraggingEvent<IRowDragItem>): void {\n        if(draggingEvent) {\n            const dragEvent = this.createRowDragEvent(type, draggingEvent);\n\n            dragEvent.overNode && this.optionHandler.on(type, dragEvent);\n            return;\n        }\n        this.optionHandler.on(type, {});\n    }\n\n    protected createRowDragEvent(type: string, draggingEvent: DraggingEvent<IRowDragItem>): RowDragEvent {\n        const { x, y } = this.getNormalisedPosition(draggingEvent);\n        const centerHandler = this.recordHandler.getMiddleHandler();\n        const overIndex = centerHandler.getRowByPosition(y, x);\n        const overNode = this.getRowOverNode(draggingEvent);\n\n        return {\n            type,\n            event: draggingEvent.event,\n            overIndex,\n            overId: overNode?.getId() ?? null,\n            rowIds: draggingEvent.dragItem.rowIDs,\n            rowRanges : draggingEvent.dragItem.rowRanges,\n            selectionType : draggingEvent.dragItem.selectionType,\n            overNode,\n            nodes :draggingEvent.dragItem.rowIDs.length !== 0 ? draggingEvent.dragItem.rowIDs.map((id) => this.recordHandler.getRowNodeById(id)) : [],\n            x,\n            y,\n            verticalDirection: draggingEvent.verticalDirection === 'down' ? 'down' : 'up',\n            horizontalDirection: draggingEvent.horizontalDirection === 'left' ? 'left' : 'right',\n        };\n    }\n\n    protected getNormalisedPosition(event: MouseEvent | DraggingEvent<IRowDragItem>): { x: number; y: number } {\n        const e = event as MouseEvent;\n        const x = e.clientX ?? e.x;\n        const y = e.clientY ?? e.y;\n\n        const gridBodyController = this.controllerHandler.getBodyController();\n        const scrollHandler = gridBodyController.getScrollHandler();\n        const verticalPosition = scrollHandler.getVScrollPosition().top;\n        const horizontalPosition = scrollHandler.getHScrollPosition().left;\n\n        return { x: x + horizontalPosition, y: y + verticalPosition };\n    }\n\n    public getHighlightPosition(pixel: number, rowNode?: IRowNodeCore): RowHighlightPosition {\n        if (!rowNode) return 'below';\n\n        const rowTop = rowNode.getTop() ?? 0;\n        const rowHeight = rowNode.getHeight() ?? 0;\n        return (pixel - rowTop) < rowHeight / 2 ? 'above' : 'below';\n    }\n\n    private getRowNodes(params: DraggingEvent<IRowDragItem>): IRowNode[] {\n        const dragItem = params.dragItem;\n\n        if (dragItem.selectionType === 'id') {\n            return dragItem.rowIDs\n                .map(id => this.recordHandler.getRowNodeById(id))\n                .filter((node): node is IRowNode => !!node);\n        }\n\n        if (dragItem.selectionType === 'index') {\n            return dragItem.rowRanges\n                .flatMap(range => this.recordHandler.getSequenceRowNodes(range.from, range.to) || [])\n                .filter((node): node is IRowNode => !!node);\n        }\n\n        return [];\n    }\n\n\n    static AutoScrollHandlerOptions = class implements IAutoScrollOptions {\n        public scrollContainer: HTMLElement;\n        public scrollByTick: number;\n        public scrollHandler: GridBodyScrollHandler;\n        public horizontalScrollContainer : HTMLElement;\n\n\n        constructor(controllerParams: IPaneControllerParam, public scrollAxis: any, public skipHorizontalScroll: boolean) {\n            const bodyController                 = controllerParams.bodyController;\n            const centerController               = controllerParams.centerRowContainerControl;\n            \n                  this.horizontalScrollContainer = centerController.getViewPortContainer();\n                  this.scrollHandler             = bodyController.getScrollHandler();\n                  this.scrollContainer           = bodyController.getViewPortContainer();\n        }\n\n        getVerticalPosition = () => this.scrollHandler.getVScrollPosition().top;\n        setVerticalPosition = (position: number) => this.scrollHandler.setVerticalScrollPosition(position);\n        getHorizontalPosition = () => this.scrollHandler.getHScrollPosition().left;\n        setHorizontalPosition = (position: number) => this.scrollHandler.setHorizontalScrollPosition(position);\n        shouldSkipVerticalScroll = () => false;\n        shouldSkipHorizontalScroll = () => this.skipHorizontalScroll;\n    };\n}\n","import { AutoWired, Bean, BEAN_NAME, EventEmitter } from \"@dg/corecomponent\";\nimport { IRowRendererWrapper, IStickyRowRenderer } from \"./sticky-row-renderer.types\";\nimport { GridOptioHandler } from \"../Grid/Core/GridOptionHandler\";\nimport { IRowNodeCore } from \"../DataStore/rownode.types\";\nimport { RowController } from \"../Grid/GridComponent/GridBodyComponent/RowContainer/Rendering/Row/RowController\";\nimport { IGroupedRowNodeCore } from \"../DataStore/group-rownode.types\";\nimport { GRID_BEAN_NAME } from \"../Grid/Core/Constants/BeanName\";\nimport { RowRenderController } from \"../Grid/Core/Rows/RowRenderController\";\nimport { IControllerHandler } from \"../Grid/Core/Interface/IControllerHandler\";\nimport { IRecordHandler } from \"../Grid/Core/Rows/RecordHandler.types\";\n\n\n@Bean('stickyRowRenderer')\nexport class StickyRowRenderer extends EventEmitter implements IStickyRowRenderer {\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionsHandler       : GridOptioHandler;\n    @AutoWired(GRID_BEAN_NAME.ROW_RENDER_CONTROLLER) rowRenderController: RowRenderController;\n    @AutoWired(GRID_BEAN_NAME.RECORD_HANDLER) recordHandler             : IRecordHandler;\n    @AutoWired(GRID_BEAN_NAME.CONTROLLER_HANDLER) private controllerHandler : IControllerHandler;\n    private    stickyRowCtrls                                           : RowController[] = [];\n    private containerHeight                 = 0;\n    private rendererWrapper : IRowRendererWrapper;\n\n    private extraTopHeight = 0;\n\n    public init(rendererWrapper : IRowRendererWrapper) : void {\n        this.rendererWrapper = rendererWrapper;\n    }\n\n\n    public  updateStickyRows(): boolean {\n        let newStickyContainerHeight = 0;\n\n        if (!this.isRowsBeSticky()) {\n            return this.refreshRowsandContainerHeight([], newStickyContainerHeight);\n        }\n\n        const stickyRows: IRowNodeCore [] = [];\n        const firstPixel = this.rowRenderController.getFirstVisiblePosition();\n\n        const pixelAtContainerBoundary = firstPixel - this.extraTopHeight;\n\n        const addStickyRow = (stickyRow: IRowNodeCore) => {\n            stickyRows.push(stickyRow);\n            const lastChildBottom = this.getLastPixelOfGroup(stickyRow);\n            const stickRowBottom = pixelAtContainerBoundary + newStickyContainerHeight + stickyRow.getHeight();\n            if (lastChildBottom < stickRowBottom) {\n                stickyRow.setStickyRowTop(newStickyContainerHeight + (lastChildBottom - stickRowBottom));\n            } else {\n                stickyRow.setStickyRowTop(newStickyContainerHeight);\n            }\n\n            newStickyContainerHeight = 0;\n            stickyRows.forEach((rowNode) => {\n                const rowPixel = rowNode.getStickyRowTop() + rowNode.getHeight();\n                if (newStickyContainerHeight < rowPixel) {\n                    newStickyContainerHeight = rowPixel;\n                }\n            });\n        }\n\n        const centerHandler = this.recordHandler.getMiddleHandler();\n        while(true) {\n            let   firstPixelAfterStickyRows = pixelAtContainerBoundary + newStickyContainerHeight;\n            const firstIndex                = centerHandler.getRowByPosition(firstPixelAfterStickyRows);\n            const rowNode                   = centerHandler.getRowNode(firstIndex);\n\n            if (rowNode == null) {\n                break;\n            }\n\n            const ancestors: IRowNodeCore[] = this.getAncestorNodes(rowNode);\n            const firstMissingParent = ancestors.find( (parent) => (parent.getIndex() < firstIndex ) && this.isRowSticky(parent, stickyRows) );\n\n            if (firstMissingParent) {\n                addStickyRow(firstMissingParent);\n                continue;\n            }\n\n            const isFirstRowOutsideViewport = rowNode.getTop() < firstPixelAfterStickyRows\n            if (isFirstRowOutsideViewport && this.isRowSticky(rowNode, stickyRows)) {\n                addStickyRow(rowNode);\n                continue;\n            }\n\n            break;\n        }\n\n        return this.refreshRowsandContainerHeight( stickyRows, newStickyContainerHeight);\n    }\n\n    isRowSticky(rowNode : IRowNodeCore, stickyRows : IRowNodeCore[]) : boolean {\n        if (!rowNode.isRendered()) {\n            return false;\n        }\n\n        if (rowNode.isExpandable()) {\n            if (!this.isRowsBeSticky()) {\n                return false;\n            }\n\n            const alreadySticking = stickyRows.includes(rowNode);\n            return !alreadySticking && (rowNode.isExpandable() ? !(rowNode).isCollapsed() : false);\n        }\n\n        return false;\n    }\n\n    getLastPixelOfGroup(row : IGroupedRowNodeCore | IRowNodeCore) : number {\n        if(row.isExpandable()) {\n            const lastRowNodeInGroup = (row as IGroupedRowNodeCore).getLastRowInGroup();\n            const centerHandler = this.recordHandler.getMiddleHandler();\n            return centerHandler.getTop(lastRowNodeInGroup) + centerHandler.getHeight(lastRowNodeInGroup);\n        }\n        return 0;\n    }\n\n    getAncestorNodes(rowNode : IRowNodeCore) : IGroupedRowNodeCore[] | IRowNodeCore[] {\n        return rowNode.getAncestors().reverse();\n    }\n\n    refreshRowsandContainerHeight(newStickyNodes: IRowNodeCore[], height: number) : boolean {\n        let stickyRowsChanged = false;\n\n        const removedCtrls = this.stickyRowCtrls.filter(ctrl => newStickyNodes.indexOf(ctrl.getRowNode()) === -1);\n        const addedNodes = newStickyNodes.filter(rowNode => this.stickyRowCtrls.findIndex(ctrl => ctrl.getRowNode() === rowNode) === -1);\n\n        if (removedCtrls.length || addedNodes.length) {\n            stickyRowsChanged = true;\n        }\n\n        const ctrlsToDestroy: {[key : string] : RowController} = {};\n        removedCtrls.forEach(removedCtrl => {\n            const removeNode = removedCtrl.getRowNode();\n            const removeId = removeNode.getId();\n\n            ctrlsToDestroy[removeId] = removedCtrl;\n            this.stickyRowCtrls = this.stickyRowCtrls.filter(ctrl => ctrl !== removedCtrl);\n        });\n\n        for (const ctrl of Object.values(ctrlsToDestroy)) {\n            (ctrl.getRowNode()).updateStickyState(false);\n        }\n\n        this.rendererWrapper.destroyRowCtrls(ctrlsToDestroy);\n\n        const newCtrls = addedNodes.map(rowNode => {\n            rowNode.updateStickyState(true);\n            return this.rendererWrapper.createRowController(rowNode);\n        });\n\n        this.stickyRowCtrls.push(...newCtrls);\n        this.stickyRowCtrls.sort((a, b) => b.getRowNode().getIndex()! - a.getRowNode().getIndex()!);\n\n        if (this.containerHeight !== height) {\n            this.containerHeight = height;\n            const gridBodyController = this.controllerHandler.getBodyController();\n            gridBodyController.setStickyTopHeight(height);\n            stickyRowsChanged = true;\n        }\n\n        return stickyRowsChanged;\n    }\n\n    public getStickyRowControllers() : RowController[] {\n        return this.stickyRowCtrls;\n    }\n\n    private isRowsBeSticky(): boolean {\n        const suppressGroupsSticky = this.optionsHandler.suppressGroupRowsSticky();\n        return !suppressGroupsSticky;\n    }\n}","import { IRenderer } from '@dg/contextmenu';\nimport {\n\tAutoWired,\n    BEAN_NAME,\n\tBean,\n\tComponentMetadata,\n\tUserComponentHandler,\n\tUserComponentRegistry,\n\tgetBeanInstanceByBeanName,\n} from '@dg/corecomponent';\nimport { UserPresenceItemInterface } from '../DataHandler/Interface/IUserPresenceItem';\n\nexport const enum PropertyName {\n\tITEM_RENDERER = 'UserPresenceRenderer',\n\tDROP_DOWN_RENDERER = 'UserPresenceDropDownRendererComponent',\n}\n\nexport interface IComponentMeta {\n\tcomponentName: string | null;\n\tframeworkComponent: any | null;\n\tjsComponent: any | null;\n}\n\n@Bean(BEAN_NAME.USER_COMPONENT_HANDLER)\nexport class UserPresenceUserComponentHandler extends UserComponentHandler {\n\n\t@AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName: getBeanInstanceByBeanName;\n\n\tgetItemRendererDetails(item: UserPresenceItemInterface, params?: any) {\n\t\treturn this.getComponentDetails(\n\t\t\titem,\n\t\t\tPropertyName.ITEM_RENDERER,\n\t\t\tparams,\n\t\t\tPropertyName.ITEM_RENDERER,\n\t\t);\n\t}\n\n\tgetDropDownRendererDetails(item: UserPresenceItemInterface, params?: any) {\n\t\treturn this.getComponentDetails(\n\t\t\titem,\n\t\t\tPropertyName.DROP_DOWN_RENDERER,\n\t\t\tparams,\n\t\t\tPropertyName.DROP_DOWN_RENDERER,\n\t\t);\n\t}\n\n\tprotected getComponentDetails( item: any, propertyName: PropertyName, params?: any, defautName?: string, ): | { componentFramework: boolean; componentClass: any; params: any; propertyName: PropertyName; newInstance: () => any; } | undefined {\n\t\tlet { componentName, frameworkComponent, jsComponent } = this.getComponentMeta(item, propertyName, params);\n\t\tconst looUpRegistry = (name: string) => {\n\t\t\tconst userComponentRegistry = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_REGISTRY ) as UserComponentRegistry;\n\t\t\tconst item = userComponentRegistry.retrieve(name);\n\t\t\tif (item) {\n\t\t\t\tjsComponent = !item.componentFrameWork\n\t\t\t\t\t? item.component\n\t\t\t\t\t: undefined;\n\t\t\t\tframeworkComponent = item.componentFrameWork\n\t\t\t\t\t? item.component\n\t\t\t\t\t: undefined;\n\t\t\t}\n\t\t};\n\n\t\tif (componentName != null) {\n\t\t\tlooUpRegistry(componentName);\n\t\t}\n\n\t\tif (\n\t\t\tjsComponent == null &&\n\t\t\tframeworkComponent == null &&\n\t\t\tdefautName != null\n\t\t) {\n\t\t\tlooUpRegistry(defautName);\n\t\t}\n\n\t\tif (!jsComponent && !frameworkComponent) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst componentFramework = jsComponent == null;\n\t\tconst componentClass = jsComponent ? jsComponent : frameworkComponent;\n\n\t\tconst mergedParams = this.getMergeParams(item, propertyName, params);\n\n\t\treturn {\n\t\t\tcomponentFramework,\n\t\t\tcomponentClass,\n\t\t\tparams: mergedParams,\n\t\t\tpropertyName,\n\t\t\tnewInstance: () =>\n\t\t\t\tthis.newInstance(\n\t\t\t\t\tcomponentClass,\n\t\t\t\t\tcomponentFramework,\n\t\t\t\t\tpropertyName,\n\t\t\t\t\tmergedParams,\n\t\t\t\t),\n\t\t};\n\t}\n\n\tprotected getComponentMeta( item: UserPresenceItemInterface, propertyName: PropertyName, _params?: any, ): IComponentMeta {\n\t\tlet componentName: string | null = null;\n\t\tlet jsComponent: any = null;\n\t\tlet frameworkComponent: any = null;\n\n\t\tconst assignComponentNameOrComponentClass = (component: any) => {\n\t\t\tif (typeof component === 'string') {\n\t\t\t\tcomponentName = component;\n\t\t\t} else if (component != null && component !== true) {\n\t\t\t\tconst isFrameworkComponent =\n\t\t\t\t\tthis.getFrameWorkOverrides().isFrameworkComponent(\n\t\t\t\t\t\tcomponent,\n\t\t\t\t\t);\n\t\t\t\tif (isFrameworkComponent) {\n\t\t\t\t\tframeworkComponent = component;\n\t\t\t\t} else {\n\t\t\t\t\tjsComponent = component;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tassignComponentNameOrComponentClass(\n\t\t\tthis.getComponent(item, propertyName),\n\t\t);\n\n\t\treturn {\n\t\t\tcomponentName,\n\t\t\tframeworkComponent,\n\t\t\tjsComponent,\n\t\t};\n\t}\n\n\tprotected getComponent( item: UserPresenceItemInterface, propertyName: PropertyName, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.ITEM_RENDERER:\n\t\t\t\treturn item.getRenderer();\n\t\t\tcase PropertyName.DROP_DOWN_RENDERER:\n\t\t\t\treturn item.getDropDownRenderer();\n\t\t}\n\t}\n\tprotected newInstance( component: { new (...args: any[]): IRenderer }, componentFrameWork: boolean, propertyName: PropertyName, params?: any, ) {\n\t\tlet instance: any;\n\t\tconst frameworkComponentWrapper = this.getBeanInstanceByBeanName( BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER );\n\t\tconst componentMetaDataProvider = this.getBeanInstanceByBeanName( BEAN_NAME.COMPONENT_META_DATA_PROVIDER );\n\t\tif (!componentFrameWork) {\n\t\t\tinstance = new component();\n\t\t} else {\n\t\t\tconst componentMeta: ComponentMetadata =\n\t\t\t\tcomponentMetaDataProvider.retrieve(propertyName);\n\t\t\tinstance = frameworkComponentWrapper.wrap(\n\t\t\t\tcomponent,\n\t\t\t\tcomponentMeta.mandatoryMethodList,\n\t\t\t\tcomponentMeta.optionalMethodList,\n\t\t\t);\n\t\t}\n\n\t\tconst initialise = this.initComponent(instance, params);\n\t\tif (initialise == null) {\n\t\t\treturn Promise.resolve(instance);\n\t\t}\n\n\t\treturn initialise.then(() => instance);\n\t}\n\n\tprotected initComponent(instance: any, params: any): Promise<any> | any {\n\t\tthis.context.createBean(instance);\n\t\tif (instance.init == null) {\n\t\t\treturn;\n\t\t}\n\t\treturn instance.init(params);\n\t}\n\n\tprivate getMergeParams( item: UserPresenceItemInterface, propertyName: PropertyName, params: any, ): any {\n\t\treturn { ...params, ...this.getUserParams(item, propertyName, params) };\n\t}\n\n\tgetUserParams( item: UserPresenceItemInterface, propertyName: PropertyName, params: any, ): any {\n\t\tswitch (propertyName) {\n\t\t\tcase PropertyName.ITEM_RENDERER:\n\t\t\t\treturn this.getUserRendererParams(item, params);\n\t\t\tdefault:\n\t\t\t\treturn {};\n\t\t}\n\t}\n\n\tprivate getUserRendererParams( item: UserPresenceItemInterface, params: any, ): any {\n\t\tconst rendererParams = item.getUserRendererParams();\n\n\t\tlet rendererParamsResult: any = {};\n\n\t\tif (typeof rendererParams == 'function') {\n\t\t\trendererParamsResult = rendererParams(params);\n\t\t} else if (typeof rendererParams == 'object') {\n\t\t\trendererParamsResult = rendererParams;\n\t\t}\n\n\t\treturn rendererParamsResult;\n\t}\n}\n","function getTemplate() {\n    const div = document.createElement('div');\n    div.innerHTML = `<div class=\"ZCC-userPersonList\">\n                        <span class=\"ZCC-userPresenceProfile\"><img  class=\"ZCC-userPresenceProfileImage\" ref=\"image\"/></span>\n                        <span class=\"ZCC-userPersonListName\" ref=\"name\"></span>\n                    </div>`;\n\n    return div.firstChild as HTMLElement;\n}\nexport class UserPresenceDropDownRendererComponent {\n    private element : HTMLElement;\n    private imageElement : HTMLImageElement;\n    private nameElement : HTMLElement;\n    constructor() {\n        this.element = getTemplate();\n        this.imageElement = this.element.querySelector('[ref=\"image\"]') as HTMLImageElement;\n        this.nameElement = this.element.querySelector('[ref=\"name\"]') as HTMLElement;\n    }\n\n    init(params : any) {\n        this.setImageURL(params.imageURL);\n        this.setName(params.name);\n    }\n\n    private setImageURL(url : string) {\n        if(url) {\n            this.imageElement.src = url;\n        }\n    }\n\n    private setName(name : string) {\n        if(name) {\n            this.nameElement.textContent = name;\n        }\n    }\n\n    getGui() : HTMLElement {\n        return this.element;\n    }\n}","import { Component, addAriaAttribute, queryAssignedNodes } from \"@dg/corecomponent\";\nimport { IUserPresenceParam } from \"../DataHandler/Interface/IUserPresenceConfig\";\n\nfunction getTemplate() { \n    const div = document.createElement(\"div\");\n    div.innerHTML = `<div class=\"ZCC-userPresenceLayerInner\">\n                            <div class=\"ZCC-userPresenceNameProfileSec\">\n                            <span class=\"ZCC-userPresenceName\" ref=\"userPresenceName\"></span>\n                            <span class=\"ZCC-userPresenceProfile\" ref=\"userPresenceImage\">\n                                <img ref=\"userPresenceImageElement\" />\n                            </span>\n                            </div>\n                            <span class=\"ZCC-userPresenceCount\" ref=\"userPresenceCount\">+3</span>\n                        </div>`;\n\n    return div.firstChild as HTMLElement;\n}\nexport class UserPresenceRendererComponent extends Component {\n\t@queryAssignedNodes('userPresenceName') userPresenceNameElement: HTMLElement;\n    @queryAssignedNodes('userPresenceCount') userPresenceCountElement: HTMLElement;\n    @queryAssignedNodes('userPresenceImageElement') userPresenceImageElement : HTMLImageElement;\n\n\tinit(params: IUserPresenceParam): void {\n\t\tthis.setTemplate(getTemplate());\n        this.setUserID(params.id);\n        this.setUserPresenceName(params.name);\n        this.setUserPresenceImage(params.imageURL)\n        this.setUserPresenceCount(params.count);\n        this.setUserPresenceEditing(params.editing);\n\t}\n\n    refresh(params : IUserPresenceParam) : boolean {\n        this.setUserID(params.id);\n\t\tthis.setUserPresenceName(params.name);\n\t\tthis.setUserPresenceImage(params.imageURL);\n\t\tthis.setUserPresenceCount(params.count);\n        this.setUserPresenceEditing(params.editing);\n\n        return true;\n    }\n\n    private setUserID(id : string | null): void {\n        if(id == null) {\n            return;\n        }\n        addAriaAttribute(this.getGui(), 'user-id', id);\n    }\n\n    private setUserPresenceName(name: string | null): void {\n        if(name == null) {\n            return;\n        }\n\n        this.userPresenceNameElement.textContent = name;\n    }\n\n    private setUserPresenceImage(image: string | null): void {\n        if(image == null) {\n            return;\n        }\n\n        this.userPresenceImageElement.src = image;\n\n    }\n\n    private setUserPresenceCount(userPresenceCount: number | null): void {\n        if(userPresenceCount == null) {\n            return;\n        }\n\n        if(userPresenceCount > 1) {\n            this.userPresenceCountElement.classList.remove('ZG-hidden');\n            this.getGui().classList.add(\"ZCC-userPresenceLayer-multiuser\");\n        }else {\n            this.userPresenceCountElement.classList.add('ZG-hidden');\n            this.getGui().classList.remove(\"ZCC-userPresenceLayer-multiuser\");\n        }\n        this.userPresenceCountElement.textContent = `+${userPresenceCount - 1}`;\n    }\n\n    private setUserPresenceEditing(editing : boolean | null): void {\n        if (editing == null) {\n\t\t\treturn;\n\t\t}\n\n        if(!editing) {\n            return;\n        }\n\n\t\tthis.userPresenceNameElement.textContent = 'typing';\n    }\n}","const USER_PRESENCE_BEAN_NAME_WITHOUT_BASE = {\n\tDATA_MODEL                 : 'dataModel',\n\tUSER_PRESENCE_CONTROLLER   : 'userPresenceController',\n\tDROP_DOWN_MODEL            : 'dropDownModels',\n\tUSER_PRESENCE_API          : 'userPresenceAPI',\n\tUSER_PRESENCE_CONFIGURATION: 'configuration',\n};\n\nexport const USER_PRESENCE_BEAN_NAME = {...USER_PRESENCE_BEAN_NAME_WITHOUT_BASE};","export const EVENTS = {\n    EVENTS_USER_PRESENCE_UPADTE : 'userPresenceUpadate'\n}","import { EventEmitter } from \"@dg/contextmenu\";\nimport { USER_PRESENCE_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IUserPresenceControllerHandler, IUserPresenceControllerParams } from \"./IUserPresenceControllerHandler\";\nimport { IUserPresenceController } from \"../UIHandler/Interface/IUserPresenceController\";\nimport { Bean } from \"@dg/corecomponent\";\n\n@Bean(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_CONTROLLER)\nexport class UserPresenceControllerHandler extends EventEmitter implements IUserPresenceControllerHandler {\n\n\tprivate ready: boolean = false;\n\n\tprivate readyCallbacks: ((param: IUserPresenceControllerParams) => void)[] = [];\n\n\tprivate userPresenceController: IUserPresenceController;\n\n\tprivate checkControllerIsReady(): void {\n\t\tthis.ready = this.userPresenceController != null;\n\n\t\tif (this.ready) {\n\t\t\tconst param = this.createControllerParams();\n\t\t\tthis.readyCallbacks.forEach((callback) => callback(param));\n\t\t\tthis.readyCallbacks.length = 0;\n\t\t}\n\t}\n\n\n    private createControllerParams() : IUserPresenceControllerParams {\n        return {\n            userPresenceController : this.userPresenceController\n        }\n    }\n\n    onAfterGridReady(callback: (param: IUserPresenceControllerParams) => void): void {\n        if (this.ready) {\n            callback(this.createControllerParams());\n        } else {\n            this.readyCallbacks.push(callback);\n        }\n    }\n\n    registerUserPresenceController(userPresence: IUserPresenceController): void {\n        this.userPresenceController = userPresence;\n        this.checkControllerIsReady();\n    }\n\n    getUserPresenceController(): IUserPresenceController {\n        return this.userPresenceController;\n    }\n}","import { AutoWired, BEAN_NAME, Bean, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { USER_PRESENCE_BEAN_NAME } from \"../Constants/BeanName\";\nimport { UserPresenceInterface } from \"./Interface/IUserPresence\";\nimport { UserPresenceUserComponentHandler } from \"../Component/UserPresenceComponentHandler\";\nimport { UserPresenceItemInterface } from \"./Interface/IUserPresenceItem\";\n\n@Bean(USER_PRESENCE_BEAN_NAME.DROP_DOWN_MODEL)\nexport class DropDownConversionItems extends EventEmitter {\n    static getBeanName() : string {\n        return USER_PRESENCE_BEAN_NAME.DROP_DOWN_MODEL;\n    }\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n\n    convertToDropDown(parentElement ?: HTMLElement) : any[] {\n        const dataModel = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.DATA_MODEL) as UserPresenceInterface;\n        const componentHandler = this.getBeanInstanceByBeanName(BEAN_NAME.USER_COMPONENT_HANDLER) as UserPresenceUserComponentHandler;\n\n        const items     = dataModel.getItems();\n        const count = dataModel.getCount();\n\n        const dropDownItems : any = [];\n\n        items.forEach(item => {\n            const userRendererParams = this.createUserRendererParams(item, count, parentElement);\n            const componentDetails = componentHandler.getDropDownRendererDetails(item, userRendererParams);\n            const dropDownItem   = {\n                id : item.getID() ?? '',\n                renderer : componentDetails?.componentClass,\n                rendererParams : componentDetails?.params ?? {}\n            }\n\n            dropDownItems.push(dropDownItem);\n        })\n\n        return dropDownItems;\n    }\n\n    private createUserRendererParams(item : UserPresenceItemInterface, count : number,  element ?: HTMLElement ) {\n        const api = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_API)\n        return {\n            name         : item.getName(),\n            color        : item.getColor(),\n            id           : item.getID(),\n            imageURL     : item.getImageURL(),\n            count        : count,\n            parentElement: element,\n            editing : item.isEditing(),\n            userPresenceAPI : api\n        }\n    }\n}","export class UID_Generator {\n\tstatic counter = 0;\n\n\t\n\tstatic generate_ID() {\n\t\tthis.counter++;\n\t\treturn `ZCC_${this.counter}`;\n\t}\n}\n","import { Bean, EventEmitter, PostConstruct } from \"@dg/corecomponent\";\nimport { USER_PRESENCE_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IAddPresenceEventParam, UserPresenceInterface } from \"./Interface/IUserPresence\";\nimport { IUserPresence, IUserPresenceItem, SortType } from \"./Interface/IUserPresenceConfig\";\nimport { UserPresenceItemInterface } from \"./Interface/IUserPresenceItem\";\nimport { UserPresenceItem } from \"./UserPresenceItem\";\nimport { EVENTS } from \"../Constants/Events\";\nimport { IUserPresenceDataHandler } from \"./Interface/IUserPresenceDataHandler\";\nimport { UserPresenceDataHandler } from \"./UserPresenceDataHandler\";\n\n@Bean(USER_PRESENCE_BEAN_NAME.DATA_MODEL)\nclass UserPresenceDataModel extends EventEmitter implements UserPresenceInterface  {\n\tprivate userPresenceDataHandler : IUserPresenceDataHandler;\n\tprivate priorityID: string | null | undefined;\n\tprivate sortType: SortType;\n\tprivate customComparator:  ((a: UserPresenceItemInterface, b: UserPresenceItemInterface) => number) | null;\n\n\t@PostConstruct()\n\tpostConstructMethods() : void {\n\t\tthis.userPresenceDataHandler = new UserPresenceDataHandler();\n\t}\n\n    addPresence(userPresence : Partial<IUserPresence>, flush : boolean = false): void {\n        if (flush) {\n\t\t\tthis.userPresenceDataHandler.flush();\n\t\t}\n\n\t\tif (userPresence.items) {\n\t\t\t(userPresence.items ?? []).forEach(item => {\n\t\t\t\tthis.updatePresence(item.id!, item);\n\t\t\t})\n\t\t}\n\n\t\tif (userPresence.priorityID) {\n\t\t\tthis.updatePriority(userPresence.priorityID)\n\t\t}\n\n\t\tif (userPresence.sortType) {\n\t\t\tthis.sortType = userPresence.sortType;\n\t\t}\n\n        this.updateComparator(userPresence.customComparator ?? null);\n\n\t\tthis.dispatchAddPresenceEvent({\n\t\t\trefresh    : false,\n\t\t\tnewRenderer: true,\n\t\t\tnewDropDown: true\n\t\t});\n    }\n\n\taddItems(userPresenceItems : Partial<IUserPresenceItem>[]) {\n\t\tuserPresenceItems.forEach((userPresence) => {\n\t\t\tconst newItem: UserPresenceItemInterface = new UserPresenceItem(userPresence);\n\t\t\tthis.userPresenceDataHandler.add(newItem.getID() as string, newItem);\n\t\t})\n\t}\n\n\tremoveItem(id : string) : void {\n\t\tthis.userPresenceDataHandler.remove(id);\n\t\tthis.updatePriority();\n\t\tthis.dispatchAddPresenceEvent({\n\t\t\trefresh    : false,\n\t\t\tnewRenderer: true,\n\t\t\tnewDropDown: true,\n\t\t});\n\t}\n\n\tremoveAllItem(): void {\n\t\tconst userPresenceItems = this.userPresenceDataHandler.getList();\n\t\tuserPresenceItems.forEach((item : UserPresenceItemInterface) => {\n\t\t\tconst id = item.getID() as string;\n\t\t\tthis.removeItem(id);\n\t\t})\n\t}\n\n    updatePriority(priorityID ?: string) : void {\n\t\tconst oldPresence = this.getPriorityItem();\n        const hasPriorityID = this.userPresenceDataHandler.findItem(priorityID);\n        this.priorityID = hasPriorityID ? priorityID : (this.userPresenceDataHandler.getFirstItem()?.getID() ?? null);\n\n\t\tif (oldPresence.getID() !== priorityID) {\n\t\t\tthis.dispatchAddPresenceEvent({\n\t\t\t\trefresh    : false,\n\t\t\t\tnewRenderer: true,\n\t\t\t\tnewDropDown: false\n\t\t\t})\n\t\t}\n    }\n\n\tupdateComparator( newComparator:((a: UserPresenceItemInterface, b: UserPresenceItemInterface) => number) | null ) : void {\n\t\tthis.customComparator = newComparator;\n\t\tthis.sortItems();\n\t}\n\n\tprivate sortItems() : void {\n\t\tif (this.sortType === 'ascending') {\n\t\t\tthis.userPresenceDataHandler.getList().sort((a, b) => {\n\t\t\t\tconst nameA = (a.getName() as string).toUpperCase(); \n\t\t\t\tconst nameB = (b.getName() as string).toUpperCase();\n\n\t\t\t\tif (nameA < nameB) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif (nameA > nameB) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t});\n\n\n\t\t} else if (this.sortType === 'descending') {\n\t\t\tthis.userPresenceDataHandler.getList().sort((a, b) => {\n\t\t\t\tconst nameA = (a.getName() as string).toUpperCase(); \n\t\t\t\tconst nameB = (b.getName() as string).toUpperCase();\n\n\t\t\t\tif (nameA < nameB) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\tif (nameA > nameB) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t});\n\t\t}else if (this.sortType === 'custom') {\n\t\t\tthis.customComparator && this.userPresenceDataHandler.getList().sort(this.customComparator);\n        }\n\t}\n\n    getPriorityItem() : UserPresenceItemInterface {\n        if(this.priorityID) {\n\t\t\tconst item = this.userPresenceDataHandler.findItem(this.priorityID) as UserPresenceItemInterface;\n\t\t\tif(item) {\n\t\t\t\treturn item;\n\t\t\t}\n        }\n\n        return this.userPresenceDataHandler.getFirstItem() as UserPresenceItemInterface;\n    }\n\n\tgetCount() : number {\n\t\treturn this.userPresenceDataHandler.getList().length;\n\t}\n\n\tupdatePresence(id : string, userPresence : IUserPresenceItem = {}) : void {\n\t\tlet userPresenceItem = this.userPresenceDataHandler.findItem(id);\n\n\t\tif(userPresenceItem) {\n\t\t\tconst updatedFields: string[] = [];\n\n\t\t\tif(userPresence.id) {\n\t\t\t\tconst newUserPresenceItem = this.userPresenceDataHandler.findItem(userPresence.id);\n\t\t\t\tif(newUserPresenceItem) {\n\t\t\t\t\tuserPresenceItem = newUserPresenceItem;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(userPresence.id && userPresenceItem.getID() !== userPresence.id) {\n\t\t\t\tuserPresenceItem.setID(userPresence.id);\n\t\t\t\tupdatedFields.push(\"ID\");\n\t\t\t}\n\n\t\t\tif (userPresence.color && userPresenceItem.getColor() != userPresence.color ) {\n\t\t\t\tuserPresenceItem.setColor(userPresence.color);\n\t\t\t\tupdatedFields.push(\"color\");\n\t\t\t}\n\n\t\t\tif (userPresence.editing !== undefined && userPresence.editing !== null) {\n\t\t\t\tif (userPresenceItem.isEditing() !== userPresence.editing) {\n\t\t\t\t\tuserPresenceItem.setEditing(userPresence.editing);\n\t\t\t\t\tupdatedFields.push(\"editing\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (userPresence.imageURL && userPresenceItem.getImageURL() != userPresence.imageURL ) {\n\t\t\t\tuserPresenceItem.setImageURL(userPresence.imageURL);\n\t\t\t\tupdatedFields.push(\"imageURL\");\n\t\t\t}\n\n\t\t\tif (userPresence.name && userPresenceItem.getName() != userPresence.name) {\n\t\t\t\tuserPresenceItem.setName(userPresence.name);\n\t\t\t\tupdatedFields.push(\"name\");\n\t\t\t}\n\n\t\t\tif(userPresence.renderer && userPresenceItem.getRenderer() != userPresence.renderer) {\n\t\t\t\tuserPresenceItem.setRenderer(userPresence.renderer);\n\t\t\t\tupdatedFields.push(\"renderer\");\n\t\t\t}\n\n\t\t\tif(userPresence.dropDownRenderer && userPresenceItem.getDropDownRenderer() != userPresence.dropDownRenderer) {\n\t\t\t\tuserPresenceItem.setDropDownRenderer(userPresence.dropDownRenderer);\n\t\t\t\tupdatedFields.push(\"dropDownRenderer\");\n\t\t\t}\n\n\t\t\tconst priorityItem = this.getPriorityItem();\n\n\t\t\tif (priorityItem.getID() !== userPresenceItem.getID()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet refresh = false;\n\t\t\tlet newRenderer = false;\n\t\t\tlet newDropDown = false;\n\n\t\t\tif(updatedFields.length > 0) {\n\t\t\t\trefresh = true;\n\t\t\t}\n\n\t\t\tif(updatedFields.indexOf('renderer') > -1 ) {\n\t\t\t\tnewRenderer = true;\n\t\t\t}\n\n\t\t\tif(updatedFields.indexOf('dropDownRenderer') > -1) {\n\t\t\t\tnewDropDown = true;\n\t\t\t}\n \t\t\t\n\t\t\tthis.dispatchAddPresenceEvent({\n\t\t\t\trefresh,\n\t\t\t\tnewRenderer,\n\t\t\t\tnewDropDown\n\t\t\t});\n\t\t}else {\n\t\t\tthis.addItems([userPresence]);\n\t\t}\n\t}\n\n\tgetItems(): UserPresenceItemInterface[] {\n\t\treturn this.userPresenceDataHandler.getList();\n\t}\n\n\tprivate dispatchAddPresenceEvent(params : IAddPresenceEventParam) : void {\n\t\tthis.dispatchEvent({\n\t\t\ttype       : EVENTS.EVENTS_USER_PRESENCE_UPADTE,\n\t\t\trefresh    : params.refresh,\n\t\t\tnewRenderer: params.newRenderer,\n\t\t\tnewDropDown: params.newDropDown\n\t\t})\n\t}\n}\n\nexport { UserPresenceDataModel };","import { EventEmitter } from \"@dg/corecomponent\";\nimport { UserPresenceItemInterface } from \"./Interface/IUserPresenceItem\";\nimport { IUserPresenceDataHandler } from \"./Interface/IUserPresenceDataHandler\";\n\nexport class UserPresenceDataHandler extends EventEmitter implements IUserPresenceDataHandler {\n\tprivate list: UserPresenceItemInterface[] = [];\n\tprivate map: { [key: string]: UserPresenceItemInterface } = {};\n\n\tpublic add(key: string, value: UserPresenceItemInterface) : void {\n\t\tif (this.map[key] !== undefined) {\n\t\t\tconsole.log(`ID '${key}' already exists. Overriding the item.`);\n\t\t}\n\t\tthis.list = this.list.filter((item) => item.getID() !== key);\n\t\tthis.list.push(value);\n\t\tthis.map[key] = value;\n\t}\n\n\tpublic remove(key: string) : void {\n\t\tconst index = this.list.findIndex((item) => this.map[key] === item);\n\t\tif (index !== -1) {\n\t\t\tthis.list.splice(index, 1);\n\t\t\tdelete this.map[key];\n\t\t}\n\t}\n\n\tpublic update(key: string, newValue: UserPresenceItemInterface) : void {\n\t\tif (this.map[key] !== undefined) {\n\t\t\tconst index = this.list.findIndex((item) => this.map[key] === item);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.list[index] = newValue;\n\t\t\t\tthis.map[key] = newValue;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic getList(): UserPresenceItemInterface[] {\n\t\treturn this.list;\n\t}\n\n\tpublic getMap(): { [key: string]: UserPresenceItemInterface } {\n\t\treturn this.map;\n\t}\n\n    public flush() : void {\n        this.list = [];\n        this.map = {};\n    }\n\n    public findItem(key ?: string): UserPresenceItemInterface  | null {\n        return this.list.find((item) => item.getID() == key) ?? null;\n    }\n\n    public getFirstItem() : UserPresenceItemInterface | null {\n        return this.list[0];\n    }\n\n}\n","import { IUserPresenceComponent, IUserPresenceItem } from \"./Interface/IUserPresenceConfig\";\nimport { UserPresenceItemInterface } from \"./Interface/IUserPresenceItem\";\nimport { UID_Generator } from \"./UIDGenrerator\";\n\nclass UserPresenceItem implements UserPresenceItemInterface {\n    private id              : string | null;\n    private name            : string | null;\n    private color           : string | null;\n    private renderer        : IUserPresenceComponent | null;\n    private dropDownRenderer: IUserPresenceComponent | null;\n    private editing         : boolean | null;\n    private imageURL        : string | null;\n    private userRendererParams      : any;\n    constructor(item : IUserPresenceItem) {\n        this.id               = item.id ?? UID_Generator.generate_ID();\n        this.name             = item.name ?? null;\n        this.color            = item.color ?? null;\n        this.renderer         = item.renderer ?? null;\n        this.dropDownRenderer = item.dropDownRenderer ?? null;\n        this.editing          = item.editing ?? false;\n        this.imageURL         = item.imageURL ?? null;\n        this.userRendererParams = item.userRendererParams ?? {};\n    }\n    getID(): string | null {\n        return this.id;\n    }\n    getName(): string | null {\n        return this.name;\n    }\n    getColor(): string | null {\n        return this.color;\n    }\n    getRenderer(): IUserPresenceComponent | null {\n        return this.renderer;\n    }\n    getDropDownRenderer(): IUserPresenceComponent | null {\n        return this.dropDownRenderer;\n    }\n    isEditing(): boolean | null {\n        return this.editing;\n    }\n    getImageURL() : string | null {\n        return this.imageURL;\n    }\n\n    getUserRendererParams(): any {\n        return this.userRendererParams;\n    }\n    setID(id: string): void {\n       this.id = id;\n    }\n    setName(name: string): void {\n        this.name = name;\n    }\n    setColor(color: string): void {\n        this.color = color;\n    }\n    setRenderer(renderer: IUserPresenceComponent): void {\n        this.renderer = renderer;\n    }\n    setDropDownRenderer(renderer: IUserPresenceComponent): void {\n        this.dropDownRenderer = renderer;\n    }\n    setEditing(editing: boolean): void {\n        this.editing = editing;\n    }\n    setImageURL(url: string): void {\n        this.imageURL = url;\n    }\n\n    setUserRendererParams(params: any): void {\n        this.userRendererParams = params;\n    }\n}\n\nexport { UserPresenceItem };","import { IUserPresenceComponent, IUserPresenceController } from \"./Interface/IUserPresenceController\";\nimport { UserPresenceController } from \"./UserPresenceController\";\nimport { USER_PRESENCE_BEAN_NAME } from \"../Constants/BeanName\";\nimport { IUserPresenceControllerHandler } from \"../Controller/IUserPresenceControllerHandler\";\nimport { AutoWired, BEAN_NAME, Component, PostConstruct, clearElement, getBeanInstanceByBeanName, removeFromParent } from \"@dg/corecomponent\";\n\nfunction getTemplate() : HTMLElement {\n    const div = document.createElement(\"div\");\n    div.innerHTML = `<div class=\"ZCC-userPresenceLayer\"></div>`;\n    return div.firstChild as HTMLElement;\n}\nexport class UserPresenceComponent extends Component {\n\tprivate userPresenceElement: HTMLElement;\n\tconstructor(userPresenceElement: HTMLElement) {\n\t\tsuper();\n\t\tthis.userPresenceElement = userPresenceElement;\n\t}\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n    private itemRenderer : any;\n    private itemRendererElement : HTMLElement | null;\n\n    private componentClass : any;\n\n    @PostConstruct()\n\tpostConstructMethods(): void {\n        this.init();\n    }\n\n\tprivate init(): void {\n\t\tthis.setTemplate(getTemplate());\n\n        const component : IUserPresenceComponent = {\n            setRendererDetails  : (componentDetails : any, forceNewRendererInstance : boolean) => this.setRendererDetails(componentDetails, forceNewRendererInstance),\n            getGui : ()=> this.getGui(),\n            getUserElement  : () => this.userPresenceElement,\n            addOrRemoveCssClassForElement  : (className : string, force : boolean) => this.addOrRemoveCssClassForElement(className, force), \n            destroyUI : () => this.destroyBean(this)\n        }\n\n        const controller = this.createManagedBean(new UserPresenceController());\n        controller.setComponent(component);\n        this.registerController(controller);\n        this.appendUserPresenceIntoUserDom();\n\t}\n\n    private addOrRemoveCssClassForElement(className : string, force : boolean) : void {\n        this.userPresenceElement.classList.toggle(className, force);\n    }\n\n    private setRendererDetails(componentDetails :any , forceNewRendererInstance : boolean = false): void {\n        if (componentDetails) {\n            const refreshInstance = forceNewRendererInstance ? false : this.refreshRenderer(componentDetails);\n            if(!refreshInstance) {\n                this.destroyRenderer();\n                this.cretaeRendererInstance(componentDetails);\n            }\n\t\t}\n    }\n\n    private refreshRenderer(componentDetails : any) : boolean {\n        if (this.itemRenderer == null || this.itemRenderer.refresh == null) { return false; }\n\n        if (this.componentClass !== componentDetails.componentClass) { return false}\n\n        const result = this.itemRenderer.refresh(componentDetails.params);\n\n        return result === true || result === undefined;;\n    }\n\n    private afterRenderer(componentClass : any, itemRenderer : any) : void {\n        if (!this.isAlive()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.itemRenderer = itemRenderer;\n\t\tthis.itemRendererElement = itemRenderer.getGui();\n\n\t\tif (this.itemRendererElement) {\n\t\t\tclearElement(this.getGui());\n\t\t\tthis.appendChild(this.itemRendererElement);\n\t\t}\n\n        this.componentClass = componentClass;\n    }\n\n    private registerController(controller: IUserPresenceController): void {\n        const controllerHandler = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_CONTROLLER) as IUserPresenceControllerHandler;\n        controllerHandler.registerUserPresenceController(controller);\n    }\n\n\tprivate appendUserPresenceIntoUserDom() {\n\t\tconst eGui = this.getGui();\n\t\tthis.userPresenceElement && this.userPresenceElement.appendChild(eGui);\n\t\tthis.addDestroyFunc(() => {\n\t\t\tthis.userPresenceElement.removeChild(eGui);\n\t\t});\n\t}\n\n    private destroyRenderer() : void {\n        const context = this.getBeanInstanceByBeanName(BEAN_NAME.CONTEXT);\n\n        this.itemRenderer = context.destroyBean(this.itemRenderer);\n        removeFromParent(this.itemRendererElement);\n        this.itemRendererElement = null;\n\n    }\n\n    private cretaeRendererInstance(componentDetails : any ) : void {\n        const componentPromise = componentDetails.newInstance();\n        const callBack = this.afterRenderer.bind(this, componentDetails.componentClass);\n        if (componentPromise) {\n            componentPromise.then(callBack);\n        }\n    }\n\n\n\n}","import { BEAN_NAME, ContextMenu } from \"@dg/contextmenu\";\nimport { IUserPresenceComponent, IUserPresenceController } from \"./Interface/IUserPresenceController\";\nimport { EVENTS } from \"../Constants/Events\";\nimport { USER_PRESENCE_BEAN_NAME } from \"../Constants/BeanName\";\nimport { UserPresenceInterface } from \"../DataHandler/Interface/IUserPresence\";\nimport { UserPresenceItemInterface } from \"../DataHandler/Interface/IUserPresenceItem\";\nimport { IUserPresenceParam } from \"../DataHandler/Interface/IUserPresenceConfig\";\nimport { UserPresenceUserComponentHandler } from \"../Component/UserPresenceComponentHandler\";\nimport { DropDownConversionItems } from \"../DataHandler/DropDownConversionItems\";\nimport { AutoWired, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\n\nexport class UserPresenceController extends EventEmitter implements IUserPresenceController {\n    private component : IUserPresenceComponent;\n\n    presenceItem : UserPresenceItemInterface;\n\n    dropDownInstance : ContextMenu | null;\n    setComponent(component : IUserPresenceComponent) : void {\n        this.component = component;\n        this.addPresenceListener();\n        this.addClassName();\n    }\n\n    private addClassName() : void {\n        this.component.addOrRemoveCssClassForElement('ZCC-userpresence', true);\n        this.addDestroyFunc(() => this.component.addOrRemoveCssClassForElement('ZCC-userpresence', false) )\n    }\n\n    @AutoWired(BEAN_NAME.BEANS) protected getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n\n    private addPresenceListener() : void {\n        this.addListener(this.eventHandler, EVENTS.EVENTS_USER_PRESENCE_UPADTE, this.onPresenceUpdated.bind(this))\n        this.addListener(this.eventHandler, 'EVENT_CLOSE_DROPDOWN', this.onCloseDropdown.bind(this))\n    }\n\n    private onCloseDropdown() {\n        this.dropDownInstance && this.dropDownInstance.api.close();\n    }\n\n    onPresenceUpdated(params : any) : void {\n        if(!params.refresh && !params.newRenderer) {\n            return;\n        }\n\n        if(params.newDropDown) {\n            this.setUserPresenceDropDown();\n        }\n\n        const dataModel = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.DATA_MODEL) as UserPresenceInterface;\n        const presenceItem = dataModel.getPriorityItem();\n\n        const count = dataModel.getCount();\n\n        if(presenceItem) {\n            const userPresenceparams = this.createUserPresenceParams(presenceItem, count);\n\n            const userComponentHandler = this.getBeanInstanceByBeanName( BEAN_NAME.USER_COMPONENT_HANDLER, ) as UserPresenceUserComponentHandler;\n            const componentDetails = userComponentHandler.getItemRendererDetails( presenceItem, userPresenceparams );\n            if (componentDetails) {\n                this.setStylesProperty(presenceItem);\n                this.component.setRendererDetails(componentDetails, params.newRenderer);\n            }\n        }\n    }\n\n\n    private setStylesProperty(presenceItem : UserPresenceItemInterface) : void {\n        const element = this.component.getUserElement();\n        if(element) {\n            element.style.setProperty( '--user-presence-selection-pseudo-textcolor', presenceItem.getColor() );\n            element.style.setProperty('--user-presence-selection-pseudo-userName', presenceItem.getName());\n            element.style.setProperty('--user-presence-selection-pseudo-borderColor', presenceItem.getColor());\n            element.style.setProperty('--user-presence-selection-pseudo-bgcolor', presenceItem.getColor());\n\n        }\n    }\n\n    private createUserPresenceParams(userPresence: UserPresenceItemInterface, count : number) : IUserPresenceParam {\n        const api = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_API)\n        return {\n            name         : userPresence.getName(),\n            color        : userPresence.getColor(),\n            id           : userPresence.getID(),\n            imageURL     : userPresence.getImageURL(),\n            count        : count,\n            parentElement: this.component.getGui(),\n            editing      : userPresence.isEditing(),\n            api,\n        }\n    }\n\n    private setUserPresenceDropDown() : void {\n        const isDropDownNeeded = this.optionsHandler.isDropDownNeeded();\n\n        if(!isDropDownNeeded) {\n            return;\n        }\n\n        if(this.dropDownInstance) {\n            this.dropDownInstance.api.destroyComponent();\n            this.dropDownInstance = null;\n        }\n\n        const dropDownModel = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.DROP_DOWN_MODEL) as DropDownConversionItems;\n        const convertionItems = dropDownModel.convertToDropDown(this.component.getGui());\n\n        const element = this.component.getGui();\n        this.addListener(element, 'mousedown',(event : MouseEvent) => {\n            event.preventDefault();\n            event.stopPropagation();\n        })\n\n        const menuConfiguration = {\n\t\t\titems: convertionItems,\n\t\t\tforElement: element,\n\t\t\tcallOut: true,\n\t\t\tposition: 'bottomRight',\n\t\t\taddListener: true,\n\t\t\topenOn: 'click',\n\t\t\tappendTo : this.optionsHandler.getPopupParent(),\n            onAfterClose :   () => {\n                this.optionsHandler.onAfter('close');\n            },\n            onAfterOpen : () => {\n                this.optionsHandler.onAfter('open');\n            },\n            className : \"ZG-userpresence-popup\"\n\t\t};\n\n        this.dropDownInstance = new ContextMenu(menuConfiguration);\n    }\n\n    destroyUI() : void {\n        const element = this.component.getUserElement();\n        if(element) {\n            element.style.removeProperty('--user-presence-selection-pseudo-textcolor');\n            element.style.removeProperty('--user-presence-selection-pseudo-userName');\n            element.style.removeProperty('--user-presence-selection-pseudo-borderColor');\n            element.style.removeProperty('--user-presence-selection-pseudo-bgcolor');\n\n        }\n        this.component.destroyUI();\n\n        if(this.dropDownInstance) {\n            this.dropDownInstance!.api.close();\n            this.dropDownInstance.api.destroyComponent();\n            this.dropDownInstance = null\n        }\n    }\n\n    closeDropdown() : void {\n        if(this.dropDownInstance) {\n            this.dropDownInstance!.api.close();\n            this.dropDownInstance = null\n        }\n    }\n}","import { BEAN_NAME, ComponentMetadataProvider, ComponentsRegistry, Context, IFrameworkOverrides, UserComponentRegistry, VanillaFrameWorkOverrider, traverseObject } from \"@dg/corecomponent\";\nimport { UserPresenceDataModel } from './DataHandler/UserPresence';\nimport { UserPresenceControllerHandler } from \"./Controller/UserPresenceController\";\nimport { UserPresenceComponent } from \"./UIHandler/UserPresenceComponent\";\nimport { UserPresenceRendererComponent } from \"./Component/UserPresenceRendererComponent\";\nimport { IUserPresence } from \"./DataHandler/Interface/IUserPresenceConfig\";\nimport { USER_PRESENCE_BEAN_NAME } from \"./Constants/BeanName\";\nimport { UserPresenceInterface } from \"./DataHandler/Interface/IUserPresence\";\nimport { UserPresenceUserComponentHandler } from \"./Component/UserPresenceComponentHandler\";\nimport { DropDownConversionItems } from \"./DataHandler/DropDownConversionItems\";\nimport { UserPresenceAPI } from \"./UserPresenceApi\";\nimport { UserPresenceOptionHandler } from \"./UserPresenceOptionHandler\";\nimport { UserPresenceEventHandler } from \"./UserPresenceEventHandler\";\nimport { UserPresenceDropDownRendererComponent } from \"./Component/UserPresenceDropDownRendererComponent\";\nimport { IUserPresenceAPI } from \"./Interface/IUserPresenceAPI\";\n\nexport interface IUserParams {\n\tglobalEventListener?: Function;\n\tframeworkOverrides?: IFrameworkOverrides;\n\tframeworkComponentWrapper?: any;\n}\n\nexport class UserPresence {\n    public api : IUserPresenceAPI;\n\tconstructor(element : HTMLElement,configuration: IUserPresence, params?: IUserParams) {\n        const setContextApi = (api : IUserPresenceAPI) => {\n            this.api = api;\n        }\n\t\tnew UserPresenceCoreComponent().initializeUserPresence(\n\t\t\telement,\n\t\t\tconfiguration,\n\t\t\tsetContextApi,\n\t\t\tparams,\n\t\t);\n\t}\n}\nclass UserPresenceCoreComponent {\n\tinitializeUserPresence(element : HTMLElement, configuration: IUserPresence,  callBack : CallableFunction, params: IUserParams = {}): void {\n\t\tconst userConfigurations = this.createuserConfiguration(\n            element,\n\t\t\tconfiguration,\n\t\t\tparams,\n\t\t);\n\t\tconst beanClasses = this.CreateBeanClasses();\n\n\t\tconst context = new Context();\n\n\t\tcontext.registerBeanClasses(beanClasses, userConfigurations);\n\n\t\tthis.registryDefaultComponent(context);\n\n        context.createBean(new UserPresenceComponent(element));\n\n        this.setUserPresenceConfigurations(context, configuration);\n\n        this.setApi(context, callBack);\n\n        (window as any).context = context;\n\t}\n\n    private setApi(context : Context, callBack : CallableFunction) : void {\n        const api = context.getBean(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_API) as IUserPresenceAPI;\n        callBack && callBack(api);\n    }\n\n    private setUserPresenceConfigurations(context : Context, userConfigurations: IUserPresence) {\n        const userPresenceModel = context.getBean(USER_PRESENCE_BEAN_NAME.DATA_MODEL) as UserPresenceInterface;\n        userPresenceModel.addPresence(userConfigurations);\n    }\n\t\n\n\tprivate CreateBeanClasses(): Set<any> {\n\t\treturn new Set([UserPresenceDataModel, UserPresenceControllerHandler, UserPresenceEventHandler, UserPresenceOptionHandler, ComponentsRegistry, UserComponentRegistry, UserPresenceUserComponentHandler, DropDownConversionItems, UserPresenceAPI, ComponentMetadataProvider]);\n\t}\n\n\tprivate registryDefaultComponent(context: Context): void {\n\t\tconst userComponentRegistry = context.getBean( BEAN_NAME.USER_COMPONENT_REGISTRY ) as UserComponentRegistry;\n\t\tconst defaultComponent = {\n\t\t\tUserPresenceRenderer                 : UserPresenceRendererComponent,\n\t\t\tUserPresenceDropDownRendererComponent: UserPresenceDropDownRendererComponent\n\t\t};\n\n\t\ttraverseObject(defaultComponent, (name: string, component: any) => {\n\t\t\tuserComponentRegistry.registerDefaultComponent(name, component);\n\t\t});\n\t}\n\n\tprivate createuserConfiguration( element : HTMLElement, configuration: any, params: IUserParams, ): {\n\t\telement                  : HTMLElement,\n\t\tconfiguration            : any;\n\t\tframeWorkOverrides       : IFrameworkOverrides | null;\n\t\tglobalEventListener      : Function | null;\n\t\tframeworkComponentWrapper: any | null;\n\t} {\n\t\tlet frameWorkOverrides = params.frameworkOverrides ?? null;\n\t\tif (!frameWorkOverrides) {\n\t\t\tframeWorkOverrides = new VanillaFrameWorkOverrider();\n\t\t}\n\t\treturn {\n            element,\n\t\t\tconfiguration,\n\t\t\tframeWorkOverrides,\n\t\t\tframeworkComponentWrapper: params.frameworkComponentWrapper,\n\t\t\tglobalEventListener: params.globalEventListener ?? null,\n\t\t};\n\t}\n}\n","import { AutoWired, BEAN_NAME, Bean, EventEmitter, getBeanInstanceByBeanName } from \"@dg/corecomponent\";\nimport { USER_PRESENCE_BEAN_NAME } from \"./Constants/BeanName\";\nimport { IUserPresence, IUserPresenceItem } from \"./DataHandler/Interface/IUserPresenceConfig\";\nimport { UserPresenceInterface } from \"./DataHandler/Interface/IUserPresence\";\nimport { IUserPresenceControllerHandler } from \"./Controller/IUserPresenceControllerHandler\";\nimport { IUserPresenceAPI } from \"./Interface/IUserPresenceAPI\";\n\n@Bean(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_API)\nexport class UserPresenceAPI extends EventEmitter implements IUserPresenceAPI {\n\n    private destroyedUserPresence : boolean = false;\n\n    @AutoWired(BEAN_NAME.BEANS) private getBeanInstanceByBeanName : getBeanInstanceByBeanName;\n\n\n    updatePresenceItem(id : string, userPresence : IUserPresenceItem = {}) : void   {\n        const dataModel = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.DATA_MODEL) as UserPresenceInterface;\n        dataModel.updatePresence(id, userPresence);\n    }\n\n    addItems(userPresenceItems : Partial<IUserPresenceItem>[]) : void {\n        const dataModel = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.DATA_MODEL) as UserPresenceInterface;\n        dataModel.addItems(userPresenceItems);\n    }\n\n    updatePresence(presence : IUserPresence, flush ?: boolean) : void {\n        const dataModel = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.DATA_MODEL) as UserPresenceInterface;\n        dataModel.addPresence(presence, flush);\n    }\n\n    removeItemByID(id : string) : void {\n         const dataModel = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.DATA_MODEL) as UserPresenceInterface;\n        dataModel.removeItem(id);\n    }\n\n    removeAllItem(): void {\n        const dataModel = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.DATA_MODEL) as UserPresenceInterface;\n        dataModel.removeAllItem();\n    }\n\n    closeDropDown(): void {\n        this.dispatchEvent({\n            type : 'EVENT_CLOSE_DROPDOWN'\n        })\n    }\n\n    destroy(): void {\n        if(this.destroyedUserPresence) { return}\n\n        this.destroyedUserPresence = true;\n\n        const controllerHandler      = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_CONTROLLER) as IUserPresenceControllerHandler;\n        const userPresenceController = controllerHandler.getUserPresenceController();\n\n        userPresenceController.destroyUI();\n\n        this.context.destroy();\n    }\n\n    closeDropdown() : void {\n         const controllerHandler      = this.getBeanInstanceByBeanName(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_CONTROLLER) as IUserPresenceControllerHandler;\n        const userPresenceController = controllerHandler.getUserPresenceController();\n\n        userPresenceController.closeDropdown();\n    }\n}","import { AutoWired, BEAN_NAME, Bean, DGEvent, EventHandler } from \"@dg/corecomponent\";\nimport { UserPresenceOptionHandler } from \"./UserPresenceOptionHandler\";\n\n@Bean(BEAN_NAME.EVENT_HANDLER)\nexport class UserPresenceEventHandler extends EventHandler {\n    @AutoWired(BEAN_NAME.OPTION_HANDLER) protected optionHandler : UserPresenceOptionHandler;\n\n    dispatchEvent(event: DGEvent): void {\n        let dgEvent = event as any;\n\t\tif (this.optionHandler) {\n\t\t\tconst { api } = this.optionHandler;\n\t\t\tdgEvent.instanceAPI = api;\n\t\t}\n\n\t\tsuper.dispatchToListeners(dgEvent, true);\n\t\tsuper.dispatchToListeners(dgEvent, false);\n\n\t\tthis.firedEvents[dgEvent.type] = true;\n    }\n}","import { OptionHandler } from \"@dg/contextmenu\";\nimport { UserPresenceAPI } from \"./UserPresenceApi\";\nimport { USER_PRESENCE_BEAN_NAME } from \"./Constants/BeanName\";\nimport { IUserPresence } from \"./DataHandler/Interface/IUserPresenceConfig\";\nimport { AutoWired, BEAN_NAME, Bean } from \"@dg/corecomponent\";\n\n@Bean(BEAN_NAME.OPTION_HANDLER)\nexport class UserPresenceOptionHandler extends OptionHandler {\n    @AutoWired(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_API) public api : UserPresenceAPI;\n\n    @AutoWired(USER_PRESENCE_BEAN_NAME.USER_PRESENCE_CONFIGURATION) public userPresenceConfiguration : IUserPresence;\n\n    isDropDownNeeded() : boolean {\n        return this.userPresenceConfiguration?.dropDownNeeded ?? false\n    }\n\n    getPopupParent(): HTMLElement | null {\n        return this.userPresenceConfiguration.appendTo ?? document.body;\n    }\n\n    onBefore(eventName : string, event?: any) : boolean {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'Before');\n\n\t\tif(typeof (this.userPresenceConfiguration as any)[callbackMethodName] === 'function') {\n\t\t\treturn (this.userPresenceConfiguration as any)[callbackMethodName](event) ?? true;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tonAfter(eventName : string, event?: any) : void {\n\t\tconst callbackMethodName = getHookCallbackForEvent(eventName, 'After');\n\n\t\tif(typeof (this.userPresenceConfiguration as any)[callbackMethodName] === 'function') {\n\t\t\t(this.userPresenceConfiguration as any)[callbackMethodName](event);\n\t\t}\n\t}\n}\n\nfunction getHookCallbackForEvent(eventName: string, Hookname : string): string {\n    if (eventName && eventName.length == 2) {\n        return eventName;\n    }\n    return `on${Hookname}${eventName[0].toUpperCase()}${eventName.slice(1)}`;\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n  // lazy load so that environments that need to polyfill have a chance to do so\n  if (!getRandomValues) {\n    // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n    // find the complete implementation of crypto (msCrypto) on IE11.\n    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n    if (!getRandomValues) {\n      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n    }\n  }\n\n  return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n  byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  // Note: Be careful editing this code!  It's been tuned for performance\n  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one\n  // of the following:\n  // - One or more input array values don't map to a hex octet (leading to\n  // \"undefined\" in the uuid)\n  // - Invalid input values for the RFC `version` or `variant` fields\n\n  if (!validate(uuid)) {\n    throw TypeError('Stringified UUID is invalid');\n  }\n\n  return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n  var i = buf && offset || 0;\n  var b = buf || new Array(16);\n  options = options || {};\n  var node = options.node || _nodeId;\n  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n  // specified.  We do this lazily to minimize issues related to insufficient\n  // system entropy.  See #189\n\n  if (node == null || clockseq == null) {\n    var seedBytes = options.random || (options.rng || rng)();\n\n    if (node == null) {\n      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n    }\n\n    if (clockseq == null) {\n      // Per 4.2.2, randomize (14 bit) clockseq\n      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n    }\n  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n  // cycle to simulate higher resolution clock\n\n  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n  if (dt < 0 && options.clockseq === undefined) {\n    clockseq = clockseq + 1 & 0x3fff;\n  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n  // time interval\n\n\n  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n    nsecs = 0;\n  } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n  if (nsecs >= 10000) {\n    throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n  }\n\n  _lastMSecs = msecs;\n  _lastNSecs = nsecs;\n  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n  msecs += 12219292800000; // `time_low`\n\n  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n  b[i++] = tl >>> 24 & 0xff;\n  b[i++] = tl >>> 16 & 0xff;\n  b[i++] = tl >>> 8 & 0xff;\n  b[i++] = tl & 0xff; // `time_mid`\n\n  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n  b[i++] = tmh >>> 8 & 0xff;\n  b[i++] = tmh & 0xff; // `time_high_and_version`\n\n  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n  b[i++] = clockseq & 0xff; // `node`\n\n  for (var n = 0; n < 6; ++n) {\n    b[i + n] = node[n];\n  }\n\n  return buf || stringify(b);\n}\n\nexport default v1;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n  options = options || {};\n  var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n  rnds[6] = rnds[6] & 0x0f | 0x40;\n  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n  if (buf) {\n    offset = offset || 0;\n\n    for (var i = 0; i < 16; ++i) {\n      buf[offset + i] = rnds[i];\n    }\n\n    return buf;\n  }\n\n  return stringify(rnds);\n}\n\nexport default v4;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n  return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","export{Component}from\"./Component/Component.js\";\n//# sourceMappingURL=Component.js.map\n","import{BEAN_NAME as e}from\"../Constants/BeanName.js\";import{EventEmitter as t}from\"../Events/EventEmitter.js\";import{Components as s,getFunctionName as i}from\"../Decorator/ReferenceSelector.js\";import{cloneNodeList as r,forEachAttributeInNamedNodeMap as o,isNodeOrHTMLElement as n,setVisible as l,setDisplayed as a}from\"../utils/dom.js\";import{AutoWired as c,PreConstruct as h}from\"../Decorator/BeanFactoryDecorator.js\";var u=function(e,t,s,i){var r,o=arguments.length,n=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,s):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)n=Reflect.decorate(e,t,s,i);else for(var l=e.length-1;l>=0;l--)(r=e[l])&&(n=(o<3?r(n):o>3?r(t,s,n):r(t,s))||n);return o>3&&n&&Object.defineProperty(t,s,n),n};class d extends t{constructor(e){super(),this.displayed=!0,this.visible=!0,e&&this.setTemplate(e)}preConstructMethods(){this.createChildComponentsPreConstruct()}createChildComponentsFromTags(e,t){r(e.childNodes).forEach((s=>{if(!(s instanceof HTMLElement))return;const i=this.createComponentFromElement(s,(e=>{e.getGui()&&this.copyAttributesFromNode(s,e.getGui())}),t);if(i){if(i.addItems&&s.children.length){this.createChildComponentsFromTags(s,t);const e=Array.prototype.slice.call(s.children);i.addItems(e)}this.swapComponentForNode(i,e,s)}else s.childNodes&&this.createChildComponentsFromTags(s,t)}))}createComponentFromElement(e,t,s){const i=e.nodeName,r=s?s[e.getAttribute(\"ref\")]:void 0,o=this.componentRegistry.getComponentClass(i);if(o){d.elementGettingCreated=e;const s=new o(r);return s.setParentComponent(this),this.createBean(s,null,t),s}return null}copyAttributesFromNode(e,t){o(e.attributes,((e,s)=>{\"class\"!==e?t.setAttribute(e,s):(s||\"\").split(\" \").forEach((e=>t.classList.add(e)))}))}swapComponentForNode(e,t,s){const i=e.getGui();t.replaceChild(i,s),this.addDestroyFunc(this.destroyBean.bind(this,e)),this.swapInComponentForRefSelectors(e,s)}swapInComponentForRefSelectors(e,t){const s=this;this.iterateOverQuerySelectors((i=>{s[i.attributeName]===t&&(s[i.attributeName]=e)}))}iterateOverQuerySelectors(e){let t=Object.getPrototypeOf(this);for(;null!=t;){const r=Reflect.get(t,s.METADATA),o=i(t.constructor);r&&Reflect.has(r,o)&&Reflect.has(r[o],\"querySelectors\")&&r[o].querySelectors.forEach((t=>e(t))),t=Object.getPrototypeOf(t)}}createChildComponentsPreConstruct(){this.getGui()&&this.createChildComponentsFromTags(this.getGui())}activateTabIndex(e){e||(e=[]),e.length||e.push(this.getGui()),e.forEach((e=>e.setAttribute(\"tabindex\",\"0\")))}wireQuerySelectors(){if(!this.eGui)return;const e=this;this.iterateOverQuerySelectors((t=>{const s=s=>e[t.attributeName]=s;if(t.refSelector&&this.getAttribute(\"ref\")===t.refSelector)s(this.eGui);else{const e=this.eGui.querySelector(t.querySelector);e&&s(e.Component||e)}}))}setGui(e){this.eGui=e}queryForHtmlElement(e){return this.eGui.querySelector(e)}queryForHtmlInputElement(e){return this.eGui.querySelector(e)}destroy(){this.parentComponent&&(this.parentComponent=void 0),super.destroy()}setTemplate(e,t){this.setTemplateFromElement(e,t)}setTemplateFromElement(e,t){this.eGui=e,this.eGui.Component=this,this.wireQuerySelectors(),this.getContext()&&this.createChildComponentsFromTags(this.getGui(),t)}getGui(){return this.eGui}getFocusableElement(){return this.eGui}getAriaElement(){return this.getFocusableElement()}setParentComponent(e){this.parentComponent=e}getParentComponent(){return this.parentComponent}appendChild(e,t=this.eGui){if(null!=e)if(n(e))t.appendChild(e);else{const s=e;t.appendChild(s.getGui())}}isDisplayed(){return this.displayed}setVisible(e,t={}){if(e!==this.visible){this.visible=e;const{skipAriaHidden:s}=t;l(this.eGui,e,{skipAriaHidden:s})}}setDisplayed(e,t={}){if(e!==this.displayed){this.displayed=e;const{skipAriaHidden:s}=t;a(this.eGui,e,{skipAriaHidden:s});const i={type:d.EVENT_DISPLAYED_CHANGED,visible:this.displayed};this.dispatchEvent(i)}}addGuiEventListener(e,t,s){this.eGui.addEventListener(e,t,s),this.addDestroyFunc((()=>this.eGui.removeEventListener(e,t)))}addCssClass(e){const t=this.getGui(),s=(e||\"\").split(\" \");null==t||t.classList.add(...s)}removeCssClass(e){const t=this.getGui(),s=(e||\"\").split(\" \");null==t||t.classList.remove(...s)}containsCssClass(e){const t=this.getGui();return!!t&&t.classList.contains(e)}addOrRemoveCssClass(e,t){if(e){if(e.indexOf(\" \")>=0){const s=(e||\"\").split(\" \");if(s.length>1)return void s.forEach((e=>this.addOrRemoveCssClass(e,t)))}if(e.length){const s=this.getGui();s&&s.classList.toggle(e,t)}}}getAttribute(e){const t=this.getGui();return t?t.getAttribute(e):null}getRefElement(e){return this.queryForHtmlElement(`[ref=\"${e}\"]`)}}d.EVENT_DISPLAYED_CHANGED=\"displayedChanged\",u([c(e.COMPONENT_REGISTRY)],d.prototype,\"componentRegistry\",void 0),u([h()],d.prototype,\"preConstructMethods\",null);export{d as Component};\n//# sourceMappingURL=Component.js.map\n","import{Bean as e}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as t}from\"../Constants/BeanName.js\";import{EventEmitter as o}from\"../Events/EventEmitter.js\";let n=class extends o{constructor(){super(...arguments),this.componentsMappedByName={}}setupComponents(e){e&&e.forEach((e=>this.addComponent(e)))}addComponent({componentName:e,componentClass:t,template:o}){const n=e.toUpperCase();o&&(t.getTemplate=o),this.componentsMappedByName[n]=t}getComponentClass(e){return this.componentsMappedByName[e]}};n=function(e,t,o,n){var r,p=arguments.length,s=p<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,o):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,o,n);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(p<3?r(s):p>3?r(t,o,s):r(t,o))||s);return p>3&&s&&Object.defineProperty(t,o,s),s}([e(t.COMPONENT_REGISTRY)],n);export{n as ComponentsRegistry};\n//# sourceMappingURL=ComponentRegistry.js.map\n","import{AutoWired as e,Bean as t}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as n}from\"../Constants/BeanName.js\";import{EventEmitter as o}from\"../Events/EventEmitter.js\";var r=function(e,t,n,o){var r,a=arguments.length,i=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,o);else for(var l=e.length-1;l>=0;l--)(r=e[l])&&(i=(a<3?r(i):a>3?r(t,n,i):r(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i};let a=class extends o{getComponentDetails(e,t,o,r){let{componentName:a,frameworkComponent:i,jsComponent:l}=this.getComponentMeta(e,t,o);const s=e=>{const t=this.getBeanInstance(n.USER_COMPONENT_REGISTRY).retrieve(e);t&&(l=t.componentFrameWork?void 0:t.component,i=t.componentFrameWork?t.component:void 0)};if(null!=a&&s(a),null==l&&null==i&&null!=r&&s(r),!l&&!i)return;const m=null==l,c=l||i;return{componentFramework:m,componentClass:c,params:o,propertyName:t,newInstance:()=>this.newInstance(c,m,t,o)}}getComponentMeta(e,t,n){let o=null,r=null,a=null;return(e=>{\"string\"==typeof e?o=e:null!=e&&!0!==e&&(this.getFrameWorkOverrides().isFrameworkComponent(e)?a=e:r=e)})(this.getComponent(e,t)),{componentName:o,frameworkComponent:a,jsComponent:r}}getComponent(e,t){}newInstance(e,t,o,r){var a,i;let l;const s=this.getBeanInstance(n.FRAME_WORK_COMPONENT_WRAPPER),m=this.getBeanInstance(n.COMPONENT_META_DATA_PROVIDER);if(t){const t=m.retrieve(o);l=s.wrap(e,t&&null!==(a=null==t?void 0:t.mandatoryMethodList)&&void 0!==a?a:[],t&&null!==(i=null==t?void 0:t.optionalMethodList)&&void 0!==i?i:[])}else l=new e;return this.initComponent(l,r),l}initComponent(e,t){if(this.context.createBean(e),null!=e.init)return e.init(t)}};r([e(n.BEANS)],a.prototype,\"getBeanInstance\",void 0),a=r([t(n.USER_COMPONENT_HANDLER)],a);export{a as UserComponentHandler};\n//# sourceMappingURL=UserComponentHandler.js.map\n","import{Bean as e}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as t}from\"../Constants/BeanName.js\";import{EventEmitter as o}from\"../Events/EventEmitter.js\";let r=class extends o{constructor(){super(...arguments),this.defaultComp={},this.jsComponents={}}registerDefaultComponent(e,t){this.defaultComp[e]||(this.defaultComp[e]=t)}registerJSComponent(e,t){this.jsComponents[e]=t}retrieve(e){const t=(e,t)=>({componentFrameWork:t,component:e}),o=this.getFrameWorkOverrides().frameworkComponent(e,this.userComponent);if(null!=o)return t(o,!0);const r=this.jsComponents[e];if(r)return t(r,this.getFrameWorkOverrides().isFrameworkComponent(r));const n=this.defaultComp[e];return n?t(n,!1):null}};r=function(e,t,o,r){var n,s=arguments.length,i=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,r);else for(var m=e.length-1;m>=0;m--)(n=e[m])&&(i=(s<3?n(i):s>3?n(t,o,i):n(t,o))||i);return s>3&&i&&Object.defineProperty(t,o,i),i}([e(t.USER_COMPONENT_REGISTRY)],r);export{r as UserComponentRegistry};\n//# sourceMappingURL=UserComponentRegistry.js.map\n","export{ComponentMetadataProvider}from\"./FrameWork/ComponentMetaDataProvider.js\";\n//# sourceMappingURL=ComponentMetadataProvider.js.map\n","export{ComponentsRegistry}from\"./Component/ComponentRegistry.js\";\n//# sourceMappingURL=ComponentRegistry.js.map\n","const e={CONTEXT:\"context\",COMPONENT_REGISTRY:\"componentRegistry\",EVENT_HANDLER:\"eventHandler\",USER_COMPONENT_HANDLER:\"userComponentHandler\",POPUP_HANDLER:\"popupHandler\",OPTION_HANDLER:\"optionHandler\",USER_COMPONENT_REGISTRY:\"userComponentRegistry\",COMPONENT_META_DATA_PROVIDER:\"componentMetaDataProvider\",COMPONENT_UTILITY:\"componentUtility\",FRAME_WORK_COMPONENT_WRAPPER:\"frameworkComponentWrapper\",FRAME_WORK_OVERRIDES:\"frameWorkOverrides\",BEANS:\"lookupBeanInstances\"};export{e as BEAN_NAME};\n//# sourceMappingURL=BeanName.js.map\n","import{BeanDefinitionSymbol as e}from\"./Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as t}from\"./Constants/BeanName.js\";import{traverseObject as n}from\"./utils/Generic.js\";class r{constructor(){this.beanWrappers={},this.destroyed=!1}getBeanInstances(){return Object.values(this.beanWrappers)}getInstanceID(){var e;return this.userConfigurations?null===(e=this.userConfigurations)||void 0===e?void 0:e.instanceID:null}registerBeanClasses(e,t){this.beanClasses=e,this.registerUserContextParams(t),this.createBeans();const n=this.getBeanInstances();this.wireBeans(n)}registerUserContextParams(e){this.userConfigurations=null!=e?e:{}}createBean(e,t){if(!e)throw Error(\"Can't wire to bean since it is null\");return this.wireBeans([e]),e}createBeans(){this.beanClasses.forEach((t=>{const n=t[e];if(n){const e=n.beanName,r=new t;this.beanWrappers[e]=r}}))}wireBeans(e){this.autoWireBeans(e),this.methodWireBeans(e),this.callLifeCycleMethods(e,\"preConstruct\"),this.callLifeCycleMethods(e,\"postConstruct\")}autoWireBeans(e){e.forEach((e=>{this.forEachMetaDataInHierarchyBeanDefinition(e,((n,r)=>{const a=n.dependencies;a&&a.forEach((n=>{if(n.autowireLazy)Object.defineProperty(e,n.autowireField,{get:()=>{let e=this.getBeanInstance(r,n.beanName,n.optional);if(n.beanName===t.BEANS&&(e=this.getBeanInstance.bind(this,r)),!e)throw Error(\"Unknown beanName=\"+n.autowireField);return e},configurable:!1});else{let a;a=n.beanName===t.BEANS?this.getBeanInstance.bind(this,r):this.getBeanInstance(r,n.beanName,n.optional),Object.defineProperty(e,n.autowireField,{value:a,configurable:!!a,writable:!1})}}))}))}))}methodWireBeans(e){e.forEach((e=>{this.forEachMetaDataInHierarchyBeanDefinition(e,((t,n)=>{t.attributeAnnotations.forEach((t=>{if(t.targetPropertyKey&&t.parameters){const r=this.getBeansForParameters(t.parameters,n);console.log(r),e[t.targetPropertyKey].apply(e)}}))}))}))}getBeansForParameters(e,t){const r=[];return e&&n(e,((e,n)=>{if(n){const e=this.getBeanInstance(t,n.name);r[Number(n.index)]=e}})),r}getBeanInstance(e,n,r=!1){if(this.destroyed)return null;if(n===t.CONTEXT)return a=this,{createBean(e){a.createBean(e)},destroyBean(e){a.destroyBean(e)},destroy(){a.destroy()}};var a;if(this.userConfigurations&&this.userConfigurations.hasOwnProperty(n))return this.userConfigurations[n];return this.beanWrappers[n]||(r||console.error(`Component: unable to find bean reference ${n} while initialising ${e}`),null)}callLifeCycleMethods(e,t){e.forEach((e=>this.callLifeCycleMethodsOnBean(e,t)))}callLifeCycleMethodsOnBean(e,t,n){const r={};this.forEachMetaDataInHierarchyBeanDefinition(e,(e=>{const a=e[t];a&&a.forEach((e=>{e!=n&&(r[e]=!0)}))})),Object.keys(r).forEach((t=>e[t]()))}forEachMetaDataInHierarchyBeanDefinition(t,n){let r=Object.getPrototypeOf(t);for(;null!=r;){const t=r.constructor;t.hasOwnProperty(e)&&n(t[e],this.getBeanName(t)),r=Object.getPrototypeOf(r)}}getBeanName(t){if(t[e]&&t[e].beanName)return t[e].beanName;const n=t.toString();return n.substring(9,n.indexOf(\"(\"))}getBean(e){return this.getBeanInstance(\"getBean\",e,!0)}destroy(){if(this.destroyed)return;this.destroyed=!0;const e=this.getBeanInstances();this.destroyBeans(e),this.userConfigurations=null}destroyBean(e){e&&this.destroyBeans([e])}destroyBeans(e){return e?(e.forEach((e=>{this.callLifeCycleMethodsOnBean(e,\"preDestroy\",\"destroy\");const t=e;\"function\"==typeof t.destroy&&t.destroy()})),[]):[]}isDestroyed(){return this.destroyed}}export{r as Context};\n//# sourceMappingURL=Context.js.map\n","import{BeanDependencyType as t,AttributeAnnotationTargetType as e}from\"./types.js\";const r=\"BeanDefinition\";function n(t,e){let n;if(n=\"class\"===e||\"function\"==typeof t?t:\"prototype\"===e?t.constructor:Object.getPrototypeOf(t),n.hasOwnProperty(r))return n[r];const o={uniqueId:Symbol(),className:\"\",beanName:\"\",componentTypes:[],dependencies:[],constructor:null,existInstance:null,preConstruct:[],postConstruct:[],preDestroy:[],attributeAnnotations:[]};return Object.defineProperty(n,r,{value:o,writable:!1}),o}function o(t){return(t,e,r)=>{const o=n(t,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PreDestroy is can use only to method\");return o.preDestroy||(o.preDestroy=[]),o.preDestroy.push(e),r}}function s(t){return(t,e,r)=>{var o;const s=n(t,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PostConstructor is can use only to method\");return s.postConstruct&&(s.postConstruct=[]),null===(o=s.postConstruct)||void 0===o||o.push(e),r}}function a(t){return(t,e,r)=>{var o;const s=n(t,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PreConstructor is can use only to method\");return s.preConstruct&&(s.preConstruct=[]),null===(o=s.preConstruct)||void 0===o||o.push(e),r}}function u(e,r,o){return(s,a)=>{const u=n(s,\"prototype\"),p=o&&o.lazy||!1;if(o&&o.name)u.dependencies.push({type:t.AUTOWIRE,autowireField:a,autowireLazy:p,beanName:o.name,className:e,optional:r});else{if(\"string\"!=typeof a)throw Error(\"property name must be string without beanName\");u.dependencies.push({type:t.AUTOWIRE,autowireField:a,autowireLazy:p,beanName:e,className:e,optional:r})}}}function p(t){return r={componentType:\"bean\",beanName:t},t=>{const o=r.beanName||t.name,s=n(t,\"class\");return s.className=t.name,s.beanName=o,s.constructor=t,s.componentTypes.push(r.componentType),s.attributeAnnotations.push({targetType:e.Class,targetDescriptor:null}),t};var r}function i(t,e){return u(t,!1,e)}function c(t,e){return u(t,!0,e)}function y(t){return r={name:t},(t,o,s)=>{const a=function(t,r){let n=t.attributeAnnotations.find((t=>t.targetType===e.Method&&t.targetPropertyKey===r));return n||(n={targetType:e.Method,targetPropertyKey:r,targetDescriptor:void 0,parameters:void 0},t.attributeAnnotations.push(n)),n}(n(t,\"prototype\"),o);a.parameters||(a.parameters=[]),a.parameters[s]={index:s,name:r.name}};var r}export{i as AutoWired,p as Bean,r as BeanDefinitionSymbol,c as Optional,s as PostConstruct,a as PreConstruct,o as PreDestroy,y as Qualifier,u as WireFunction};\n//# sourceMappingURL=BeanFactoryDecorator.js.map\n","const e={METADATA:\"COMPONENT_META_DATA\"};function t(e){if(e.name)return e.name}function r(e=null){return function(t,r,n){null!==e?\"number\"!=typeof n?o(t,\"querySelectors\",{attributeName:r,querySelector:e,refSelector:void 0}):console.error(\"QuerySelector should be on an attribute\"):console.error(\"QuerySelector should not be null\")}}function n(e){return function(t,r,n){o(t,\"querySelectors\",{attributeName:r,querySelector:`[ref=${e}]`,refSelector:e})}}function o(r,n,o){const u=function(t,r){Reflect.has(t,e.METADATA)||Reflect.set(t,e.METADATA,{});return Reflect.has(t[e.METADATA],r)||Reflect.set(t[e.METADATA],r,{}),Reflect.get(t[e.METADATA],r)}(r,t(r.constructor));u[n]||(u[n]=[]),u[n].push(o)}export{e as Components,r as QuerySelector,t as getFunctionName,n as queryAssignedNodes};\n//# sourceMappingURL=ReferenceSelector.js.map\n","var C,O;!function(C){C[C.CONSTRUCTOR=0]=\"CONSTRUCTOR\",C[C.AUTOWIRE=1]=\"AUTOWIRE\"}(C||(C={})),function(C){C[C.Class=0]=\"Class\",C[C.Method=1]=\"Method\"}(O||(O={}));export{O as AttributeAnnotationTargetType,C as BeanDependencyType};\n//# sourceMappingURL=types.js.map\n","export{EventEmitter,addSafePassiveEventListener}from\"./Events/EventEmitter.js\";\n//# sourceMappingURL=EventEmitter.js.map\n","export{EventHandler}from\"./Events/EventHandler.js\";\n//# sourceMappingURL=EventHandler.js.map\n","import{AutoWired as e}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as t}from\"../Constants/BeanName.js\";import{EventHandler as r}from\"./EventHandler.js\";var n=function(e,t,r,n){var s,o=arguments.length,i=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,n);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(i=(o<3?s(i):o>3?s(t,r,i):s(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i};class s{constructor(){this.destroyFunctions=[],this.destroyed=!1}getFrameWorkOverrides(){return this.frameWorkOverrides}createBean(e,t,r){return t?t.createBean(e):this.getContext().createBean(e),r&&r(e),e}destroyBean(e,t){return(t||this.getContext()).destroyBean(e)}destroyBeans(e,t){return e&&e.forEach((e=>this.destroyBean(e,t))),[]}destroy(){this.dispatchEvent({type:s.EVENT_DESTROYED}),this.destroyFunctions.forEach((e=>e())),this.destroyFunctions.length=0,this.destroyed=!0}getContext(){return this.context}addEventListener(e,t){this.eventHandler||(this.eventHandler=new r),this.eventHandler.addEventListener(e,t)}removeEventListener(e,t){this.eventHandler&&this.eventHandler.removeEventListener(e,t)}dispatchEventAsync(e){window.setTimeout((()=>this.dispatchEvent(e)),0)}dispatchEvent(e){this.eventHandler&&this.eventHandler.dispatchEvent(e)}addListener(e,t,r){if(this.destroyed)return;e instanceof HTMLElement?o(e,t,r):e.addEventListener(t,r);const n=()=>(e.removeEventListener(t,r),this.destroyFunctions=this.destroyFunctions.filter((e=>e!==n)),null);return this.destroyFunctions.push(n),n}isAlive(){return!this.destroyed}addDestroyFunc(e){this.isAlive()?this.destroyFunctions.push(e):e()}createManagedBean(e,t){const r=this.createBean(e,t);return this.addDestroyFunc(this.destroyBean.bind(this,e,t)),r}}function o(e,t,r){e&&e.addEventListener(t,r,void 0)}s.EVENT_DESTROYED=\"destroyed\",n([e(t.EVENT_HANDLER)],s.prototype,\"eventHandler\",void 0),n([e(t.OPTION_HANDLER)],s.prototype,\"optionsHandler\",void 0),n([e(t.FRAME_WORK_OVERRIDES)],s.prototype,\"frameWorkOverrides\",void 0),n([e(\"context\")],s.prototype,\"context\",void 0);export{s as EventEmitter,o as addSafePassiveEventListener};\n//# sourceMappingURL=EventEmitter.js.map\n","import{Bean as e}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as s}from\"../Constants/BeanName.js\";let t=class{constructor(){this.allSyncListeners=new Map,this.allAsyncListeners=new Map,this.globalSyncListeners=new Set,this.globalAsyncListeners=new Set,this.asyncFunctionsQueue=[],this.scheduled=!1,this.firedEvents={}}setBeans(e,s=null,t=null){if(this.optionHandler=e,s){const t=e.useAsyncEvents();this.addGlobalListener(s,t)}t&&this.addGlobalListener(t,!1)}getListeners(e,s,t){const n=s?this.allAsyncListeners:this.allSyncListeners;let i=n.get(e);return!i&&t&&(i=new Set,n.set(e,i)),i}noRegisteredListenersExist(){return 0===this.allSyncListeners.size&&0===this.allAsyncListeners.size&&0===this.globalSyncListeners.size&&0===this.globalAsyncListeners.size}addEventListener(e,s,t=!1){this.getListeners(e,t,!0).add(s)}removeEventListener(e,s,t=!1){const n=this.getListeners(e,t,!1);n&&(n.delete(s),0===n.size)&&(t?this.allAsyncListeners:this.allSyncListeners).delete(e)}addGlobalListener(e,s=!1){(s?this.globalAsyncListeners:this.globalSyncListeners).add(e)}removeGlobalListener(e,s=!1){(s?this.globalAsyncListeners:this.globalSyncListeners).delete(e)}dispatchEvent(e){let s=e;if(this.optionHandler){const{api:e}=this.optionHandler;s.api=e}this.dispatchToListeners(s,!0),this.dispatchToListeners(s,!1),this.firedEvents[s.type]=!0}dispatchEventOnce(e){this.firedEvents[e.type]||this.dispatchEvent(e)}dispatchToListeners(e,s){const t=e.type,n=new Set(this.getListeners(t,s,!1));n.size>0&&(t=>{t.forEach((t=>{s?this.dispatchAsync((()=>t(e))):t(e)}))})(n),new Set(s?this.globalAsyncListeners:this.globalSyncListeners).forEach((n=>{s?this.dispatchAsync((()=>n(t,e))):n(t,e)}))}dispatchAsync(e){this.asyncFunctionsQueue.push(e),this.scheduled||(window.setTimeout(this.flushAsyncQueue.bind(this),0),this.scheduled=!0)}flushAsyncQueue(){this.scheduled=!1;const e=this.asyncFunctionsQueue.slice();this.asyncFunctionsQueue=[],e.forEach((e=>e()))}};t=function(e,s,t,n){var i,c=arguments.length,l=c<3?s:null===n?n=Object.getOwnPropertyDescriptor(s,t):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)l=Reflect.decorate(e,s,t,n);else for(var r=e.length-1;r>=0;r--)(i=e[r])&&(l=(c<3?i(l):c>3?i(s,t,l):i(s,t))||l);return c>3&&l&&Object.defineProperty(s,t,l),l}([e(s.EVENT_HANDLER)],t);export{t as EventHandler};\n//# sourceMappingURL=EventHandler.js.map\n","export{BaseComponentWrapper}from\"./FrameWork/FrameWorkComponentWrapper.js\";export{VanillaFrameWorkOverrider}from\"./FrameWork/VanillaFrameWorkOverrides.js\";\n//# sourceMappingURL=FrameWork.js.map\n","import{AutoWired as e,Bean as t}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as r}from\"../Constants/BeanName.js\";import{EventEmitter as o}from\"../Events/EventEmitter.js\";var n=function(e,t,r,o){var n,a=arguments.length,c=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)c=Reflect.decorate(e,t,r,o);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(c=(a<3?n(c):a>3?n(t,r,c):n(t,r))||c);return a>3&&c&&Object.defineProperty(t,r,c),c};let a=class extends o{constructor(){super(...arguments),this.componentMetaData={}}retrieve(e){return this.componentMetaData[e]}};n([e(r.BEANS)],a.prototype,\"getBeanInstanceByBeanName\",void 0),a=n([t(r.COMPONENT_META_DATA_PROVIDER)],a);export{a as ComponentMetadataProvider};\n//# sourceMappingURL=ComponentMetaDataProvider.js.map\n","class e{wrap(e,t,r=[]){const o=this.createWrapper(e);return t.forEach((e=>{this.createMethod(o,e,!0)})),r.forEach((e=>{this.createMethod(o,e,!1)})),o}createMethod(e,t,r){e.addMethod(t,this.createMethodProxy(e,t,r))}createMethodProxy(e,t,r){return function(){return e.hasMethod(t)?e.callMethod(t,arguments):(r&&console.warn(`Framework component is missing the method ${t}()`),null)}}}export{e as BaseComponentWrapper};\n//# sourceMappingURL=FrameWorkComponentWrapper.js.map\n","class n{constructor(){this.renderingEngine=\"vanilla\"}frameworkComponent(n,r){return null}isFrameworkComponent(n){return!1}}export{n as VanillaFrameWorkOverrider};\n//# sourceMappingURL=VanillaFrameWorkOverrides.js.map\n","export{UserComponentHandler}from\"./Component/UserComponentHandler.js\";\n//# sourceMappingURL=UserComponentHandler.js.map\n","export{UserComponentRegistry}from\"./Component/UserComponentRegistry.js\";\n//# sourceMappingURL=UserComponentRegistry.js.map\n","export{addAriaAttribute,ariaAttributeName,removeAriaAttribute,setAriaActiveDescendant,setAriaAtomic,setAriaAutocomplete,setAriaBraillelabel,setAriaBrailleroledescription,setAriaBusy,setAriaChecked,setAriaColCount,setAriaColIndex,setAriaColIndexText,setAriaColSpan,setAriaControls,setAriaCurrent,setAriaDescribedBy,setAriaDescription,setAriaDetails,setAriaDisabled,setAriaErrorMessage,setAriaExpanded,setAriaFlowTo,setAriaHasPopUp,setAriaHidden,setAriaInvalid,setAriaKeyShortCuts,setAriaLabel,setAriaLabelledBy,setAriaLevel,setAriaLive,setAriaModal,setAriaMultiLine,setAriaMultiSelectable,setAriaOrientation,setAriaPlaceHolder,setAriaPosInSet,setAriaPressed,setAriaReadOnly,setAriaRelevant,setAriaRequired,setAriaRole,setAriaRoleDescription,setAriaRowCount,setAriaRowIndex,setAriaRowIndexText,setAriaRowSpan,setAriaSelected,setAriaSetSize,setAriaSort,setAriaValueMax,setAriaValueMin,setAriaValueNow,setAriaValueText,toggleAriaAttribute}from\"./utils/aria.js\";export{addOrRemoveAttribute,addTemplate,clearElement,cloneNodeList,ensureDomOrder,forEachAttributeInMap,forEachAttributeInNamedNodeMap,forEachNodeInList,formatSize,getAbsoluteHeight,getAbsoluteWidth,getElementRectWithMargin,getElementRectWithOffset,getElementSize,insertWithDomOrder,isNodeOrHTMLElement,removeFromParent,setDisabled,setDisplayed,setElementWidth,setFixedHeight,setFixedWidth,setVisible,toggleAttribute}from\"./utils/dom.js\";export{createArrayOfNumbers,exists,toStringOrNull,traverseObject,values}from\"./utils/Generic.js\";export{BEAN_NAME}from\"./Constants/BeanName.js\";export{AutoWired,Bean,BeanDefinitionSymbol,Optional,PostConstruct,PreConstruct,PreDestroy,Qualifier,WireFunction}from\"./Decorator/BeanFactoryDecorator.js\";export{Components,QuerySelector,getFunctionName,queryAssignedNodes}from\"./Decorator/ReferenceSelector.js\";export{AttributeAnnotationTargetType,BeanDependencyType}from\"./Decorator/types.js\";\n//# sourceMappingURL=main.js.map\n","function n(n){if(n instanceof Set||n instanceof Map){const t=[];return n.forEach((n=>t.push(n))),t}return Object.values(n)}function t(n,t=!1){return null!=n&&(\"\"!==n||t)}function r(n){return null!=n&&\"function\"==typeof n.toString?n.toString():null}function o(n,t){const r=[];for(let o=n;o<=t;o++)r.push(o);return r}function e(n,t){if(null!=n)if(Array.isArray(n))for(let r=0;r<n.length;r++)t(r.toString(),n[r]);else for(const[r,o]of Object.entries(n))t(r,o)}export{o as createArrayOfNumbers,t as exists,r as toStringOrNull,e as traverseObject,n as values};\n//# sourceMappingURL=Generic.js.map\n","function n(n){return\"aria-\"+n}function t(n,t,e){null==e||\"\"==e?i(n,t):o(n,t,e)}function o(t,o,i){t.setAttribute(n(o),i.toString())}function i(t,o){t.removeAttribute(n(o))}function e(n,t){t?n.setAttribute(\"role\",t):n.removeAttribute(\"role\")}function c(n,o){t(n,\"activedescendant\",o)}function u(n,o){t(n,\"atomic\",o)}function f(n,o){t(n,\"autocomplete\",o)}function l(n,o){t(n,\"braillelabel\",o)}function r(n,o){t(n,\"brailleroledescription\",o)}function a(n,o){t(n,\"busy\",o)}function d(n,o){t(n,\"checked\",o)}function s(n,o){t(n,\"colcount\",o)}function b(n,o){t(n,\"colindex\",o)}function p(n,o){t(n,\"colindextext\",o)}function v(n,o){t(n,\"colspan\",o)}function m(n,o){t(n,\"controls\",o)}function x(n,o){t(n,\"current\",o)}function w(n,o){t(n,\"describedby\",o)}function h(n,o){t(n,\"description\",o)}function y(n,o){t(n,\"details\",o)}function A(n,o){t(n,\"disabled\",o)}function g(n,o){t(n,\"errormessage\",o)}function k(n,o){t(n,\"expanded\",o)}function q(n,o){t(n,\"flowto\",o)}function z(n,o){t(n,\"haspopup\",o)}function S(n,o){t(n,\"hidden\",o)}function j(n,o){t(n,\"invalid\",o)}function B(n,o){t(n,\"keyshortcuts\",o)}function C(n,o){t(n,\"label\",o)}function D(n,o){t(n,\"labelledby\",o)}function E(n,o){t(n,\"level\",o)}function F(n,o){t(n,\"live\",o)}function G(n,o){t(n,\"modal\",o)}function H(n,o){t(n,\"multiline\",o)}function I(n,o){t(n,\"multiselectable\",o)}function J(n,o){t(n,\"orientation\",o)}function K(n,o){t(n,\"placeholder\",o)}function L(n,o){t(n,\"posinset\",o)}function M(n,o){t(n,\"pressed\",o)}function N(n,o){t(n,\"readonly\",o)}function O(n,o){t(n,\"relevant\",o)}function P(n,o){t(n,\"required\",o)}function Q(n,o){t(n,\"roledescription\",o)}function R(n,o){t(n,\"rowcount\",o)}function T(n,o){t(n,\"rowindex\",o)}function U(n,o){t(n,\"rowindextext\",o)}function V(n,o){t(n,\"rowspan\",o)}function W(n,o){t(n,\"selected\",o)}function X(n,o){t(n,\"setsize\",o)}function Y(n,o){t(n,\"sort\",o)}function Z(n,o){t(n,\"valuemax\",o)}function $(n,o){t(n,\"valuemin\",o)}function _(n,o){t(n,\"valuenow\",o)}function nn(n,o){t(n,\"valuetext\",o)}export{o as addAriaAttribute,n as ariaAttributeName,i as removeAriaAttribute,c as setAriaActiveDescendant,u as setAriaAtomic,f as setAriaAutocomplete,l as setAriaBraillelabel,r as setAriaBrailleroledescription,a as setAriaBusy,d as setAriaChecked,s as setAriaColCount,b as setAriaColIndex,p as setAriaColIndexText,v as setAriaColSpan,m as setAriaControls,x as setAriaCurrent,w as setAriaDescribedBy,h as setAriaDescription,y as setAriaDetails,A as setAriaDisabled,g as setAriaErrorMessage,k as setAriaExpanded,q as setAriaFlowTo,z as setAriaHasPopUp,S as setAriaHidden,j as setAriaInvalid,B as setAriaKeyShortCuts,C as setAriaLabel,D as setAriaLabelledBy,E as setAriaLevel,F as setAriaLive,G as setAriaModal,H as setAriaMultiLine,I as setAriaMultiSelectable,J as setAriaOrientation,K as setAriaPlaceHolder,L as setAriaPosInSet,M as setAriaPressed,N as setAriaReadOnly,O as setAriaRelevant,P as setAriaRequired,e as setAriaRole,Q as setAriaRoleDescription,R as setAriaRowCount,T as setAriaRowIndex,U as setAriaRowIndexText,V as setAriaRowSpan,W as setAriaSelected,X as setAriaSetSize,Y as setAriaSort,Z as setAriaValueMax,$ as setAriaValueMin,_ as setAriaValueNow,nn as setAriaValueText,t as toggleAriaAttribute};\n//# sourceMappingURL=aria.js.map\n","import{setAriaHidden as t}from\"./aria.js\";function n(n,e,i={}){const{skipAriaHidden:o}=i;n.classList.toggle(\"comp-hidden\",!e),o||t(n,!e)}function e(n,e,i={}){const{skipAriaHidden:o}=i;n.classList.toggle(\"comp-invisible\",!e),o||t(n,!e)}function i(t,n){const e=\"disabled\",i=n?t=>t.setAttribute(e,\"\"):t=>t.removeAttribute(e);i(t),o(t.querySelectorAll(\"input\"),(t=>i(t)))}function o(t,n){if(null!=t)for(let e=0;e<t.length;e++)n(t[e])}function r(t){if(null==t)return[];const n=[];return o(t,(t=>n.push(t))),n}function l(t,n){if(t)for(let e=0;e<t.length;e++){const i=t[e];n(i.name,i.value)}}function d(t,n,e){null==e?t.removeAttribute(n):t.setAttribute(n,e.toString())}function a(t,n){if(t)for(let e=0;e<t.length;e++){const i=t[e];n(i.name,i.value)}}function u(t){return t instanceof Node||t instanceof HTMLElement}function h(t){for(;t&&t.firstChild;)t.removeChild(t.firstChild)}function g(t,n){\"flex\"===n?(t.style.removeProperty(\"width\"),t.style.removeProperty(\"minWidth\"),t.style.removeProperty(\"maxWidth\"),t.style.flex=\"1 1 auto\"):f(t,n)}function f(t,n){n=s(n),t.style.width=n.toString(),t.style.maxWidth=n.toString(),t.style.minWidth=n.toString()}function s(t){return\"number\"==typeof t?t+\"px\":t}function m(t,n,e){null==e?t.removeAttribute(n):t.setAttribute(n,e.toString())}function p(t,n,e){e&&e.nextSibling===n||(e?e.nextSibling?t.insertBefore(n,e.nextSibling):t.appendChild(n):t.firstChild&&t.firstChild!==n&&t.insertAdjacentElement(\"afterbegin\",n))}function c(t,n,e){e?e.insertAdjacentElement(\"afterend\",n):t.firstChild?t.insertAdjacentElement(\"afterbegin\",n):t.appendChild(n)}function b(t,n){n=s(n),t.style.height=n.toString(),t.style.maxHeight=n.toString(),t.style.minHeight=n.toString()}function W(t){const{height:n,width:e,borderTopWidth:i,borderRightWidth:o,borderBottomWidth:r,borderLeftWidth:l,paddingTop:d,paddingRight:a,paddingBottom:u,paddingLeft:h,marginTop:g,marginRight:f,marginBottom:s,marginLeft:m,boxSizing:p}=window.getComputedStyle(t);return{height:parseFloat(n),width:parseFloat(e),borderTopWidth:parseFloat(i),borderRightWidth:parseFloat(o),borderBottomWidth:parseFloat(r),borderLeftWidth:parseFloat(l),paddingTop:parseFloat(d),paddingRight:parseFloat(a),paddingBottom:parseFloat(u),paddingLeft:parseFloat(h),marginTop:parseFloat(g),marginRight:parseFloat(f),marginBottom:parseFloat(s),marginLeft:parseFloat(m),boxSizing:p}}function y(t){const n=t.getBoundingClientRect(),{borderTopWidth:e,borderLeftWidth:i,borderRightWidth:o,borderBottomWidth:r}=W(t);return{top:n.top+(null!=e?e:0),left:n.left+(null!=i?i:0),right:n.right+(null!=o?o:0),bottom:n.bottom+(null!=r?r:0),width:n.width,height:n.height}}function S(t){const n=t.getBoundingClientRect(),{borderTopWidth:e,borderLeftWidth:i,borderRightWidth:o,borderBottomWidth:r,marginTop:l,marginBottom:d,marginLeft:a,marginRight:u}=W(t);return{top:n.top+(null!=e?e:0)-(null!=l?l:0),left:n.left+(null!=i?i:0)-(null!=a?a:0),right:n.right+(null!=o?o:0)+(null!=u?u:0),bottom:n.bottom+(null!=r?r:0)+(null!=d?d:0),width:n.width+(null!=i?i:0)+(null!=o?o:0)+(null!=a?a:0)+(null!=u?u:0),height:n.height+(null!=e?e:0)+(null!=r?r:0)+(null!=l?l:0)+(null!=d?d:0),toJSON:()=>0,y:n.top+(null!=e?e:0)-(null!=l?l:0),x:n.left+(null!=i?i:0)-(null!=a?a:0)}}function F(t){const n=W(t),e=n.marginBottom+n.marginTop;return Math.ceil(t.offsetHeight+e)}function L(t){const n=W(t),e=n.marginLeft+n.marginRight;return Math.ceil(t.offsetWidth+e)}function x(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function B(t){const n=document.createElement(\"div\");return n.innerHTML=(t||\"\").trim(),n.firstChild}export{m as addOrRemoveAttribute,B as addTemplate,h as clearElement,r as cloneNodeList,p as ensureDomOrder,l as forEachAttributeInMap,a as forEachAttributeInNamedNodeMap,o as forEachNodeInList,s as formatSize,F as getAbsoluteHeight,L as getAbsoluteWidth,S as getElementRectWithMargin,y as getElementRectWithOffset,W as getElementSize,c as insertWithDomOrder,u as isNodeOrHTMLElement,x as removeFromParent,i as setDisabled,n as setDisplayed,g as setElementWidth,b as setFixedHeight,f as setFixedWidth,e as setVisible,d as toggleAttribute};\n//# sourceMappingURL=dom.js.map\n","const e={elementDelimiter:\"__\",modifierDelimiter:\"--\",namespace:\"\",namespaceDelimiter:\"-\",strict:!0};function i({block:i=\"\",namespace:r=[],element:t=\"\",modifier:n=[]}={},s){const{elementDelimiter:a,modifierDelimiter:c,namespaceDelimiter:m,strict:o}=Object.assign(Object.assign({},e),s),l=[...r,i].join(m),$=o?[m,a,c]:[],f=o?$.join(\"\").split(\"\").filter(((e,i,r)=>r.indexOf(e)===i)):[];function u(e,i){if(null!=i&&\"\"!==i){if(o&&(r=i,f.some((e=>r.includes(e)))))throw Error(((e,i,r)=>`The modifier (\"${i}\") must not use the characters contained within the delimiters (\"${r.join('\", \"')}\").`)(0,i,$));return`${e} ${l}${a}${t}${c}${i}`}var r;return e}const d=t?Array.isArray(t)?t.map((e=>`${l}${a}${e}`)).join(\" \"):`${l}${a}${t}`:l;return n?Array.isArray(n)?n.reduce(u,d):Object.keys(n).filter((e=>n[e])).reduce(u,d):d}export{i as default};\n//# sourceMappingURL=bem.js.map\n","const t={Any:\"Any\",KeyA:\"KeyA\",KeyS:\"KeyS\",KeyD:\"KeyD\",KeyF:\"KeyF\",KeyH:\"KeyH\",KeyG:\"KeyG\",KeyZ:\"KeyZ\",KeyX:\"KeyX\",KeyC:\"KeyC\",KeyV:\"KeyV\",IntlBackslash:\"IntlBackslash\",KeyB:\"KeyB\",KeyQ:\"KeyQ\",KeyW:\"KeyW\",KeyE:\"KeyE\",KeyR:\"KeyR\",KeyY:\"KeyY\",KeyT:\"KeyT\",Digit1:\"Digit1\",Digit2:\"Digit2\",Digit3:\"Digit3\",Digit4:\"Digit4\",Digit6:\"Digit6\",Digit5:\"Digit5\",Equal:\"Equal\",Digit9:\"Digit9\",Digit7:\"Digit7\",Minus:\"Minus\",Digit8:\"Digit8\",Digit0:\"Digit0\",BracketRight:\"BracketRight\",KeyO:\"KeyO\",KeyU:\"KeyU\",BracketLeft:\"BracketLeft\",KeyI:\"KeyI\",KeyP:\"KeyP\",Enter:\"Enter\",KeyL:\"KeyL\",KeyJ:\"KeyJ\",Quote:\"Quote\",KeyK:\"KeyK\",Semicolon:\"Semicolon\",Backslash:\"Backslash\",Comma:\"Comma\",Slash:\"Slash\",KeyN:\"KeyN\",KeyM:\"KeyM\",Period:\"Period\",Tab:\"Tab\",Space:\"Space\",Backquote:\"Backquote\",Backspace:\"Backspace\",Escape:\"Escape\",ShiftLeft:\"ShiftLeft\",CapsLock:\"CapsLock\",AltLeft:\"AltLeft\",ControlLeft:\"ControlLeft\",ShiftRight:\"ShiftRight\",AltRight:\"AltRight\",ControlRight:\"ControlRight\",F17:\"F17\",NumpadDecimal:\"NumpadDecimal\",NumpadMultiply:\"NumpadMultiply\",NumpadAdd:\"NumpadAdd\",NumLock:\"NumLock\",NumpadDivide:\"NumpadDivide\",NumpadEnter:\"NumpadEnter\",NumpadSubtract:\"NumpadSubtract\",F18:\"F18\",F19:\"F19\",NumpadEqual:\"NumpadEqual\",Numpad0:\"Numpad0\",Numpad1:\"Numpad1\",Numpad2:\"Numpad2\",Numpad3:\"Numpad3\",Numpad4:\"Numpad4\",Numpad5:\"Numpad5\",Numpad6:\"Numpad6\",Numpad7:\"Numpad7\",F20:\"F20\",Numpad8:\"Numpad8\",Numpad9:\"Numpad9\",IntlYen:\"IntlYen\",IntlRo:\"IntlRo\",NumpadComma:\"NumpadComma\",F5:\"F5\",F6:\"F6\",F7:\"F7\",F3:\"F3\",F8:\"F8\",F9:\"F9\",F11:\"F11\",F13:\"F13\",F16:\"F16\",F14:\"F14\",F10:\"F10\",ContextMenu:\"ContextMenu\",F12:\"F12\",F15:\"F15\",Home:\"Home\",PageUp:\"PageUp\",Delete:\"Delete\",F4:\"F4\",End:\"End\",F2:\"F2\",PageDown:\"PageDown\",F1:\"F1\",ArrowLeft:\"ArrowLeft\",ArrowRight:\"ArrowRight\",ArrowDown:\"ArrowDown\",ArrowUp:\"ArrowUp\",MetaLeft:\"MetaLeft\",MetaRight:\"MetaRight\"},e={ControlLeft:\"ControlLeft\",ControlRight:\"ControlRight\",AltLeft:\"AltLeft\",AltRight:\"AltRight\",ShiftLeft:\"ShiftLeft\",ShiftRight:\"ShiftRight\",MetaLeft:\"MetaLeft\",MetaRight:\"MetaRight\"},a=[\"MetaLeft\",\"MetaRight\",\"ControlLeft\",\"ControlRight\",\"ShiftLeft\",\"ShiftRight\",\"AltLeft\",\"AltRight\"];export{t as KeyCodes,e as ModifierKeys,a as SortedModifierOrder};\n//# sourceMappingURL=key-events-constants.js.map\n","import e from\"../debounce/debounce.js\";import{KeyCodes as t,SortedModifierOrder as n,ModifierKeys as i}from\"./key-events-constants.js\";export{KeyCodes}from\"./key-events-constants.js\";class s{constructor(e=document.body,t={}){this.container=e,this.listenerMapping=null,this.defaultConfig=Object.assign(Object.assign({},s.DefaultConfiguration),t),this.activeKeys=[],this.konamiSequence=[],this.isPaused=!1,this.destroy=()=>{},this.clearKonamiSequence=()=>{},this.init()}init(){const t=KeyboardEvent.CAPTURING_PHASE,n=KeyboardEvent.BUBBLING_PHASE,o=e=>this.executeKeyCombo(e,n),r=e=>{e.eventPhase==t&&this.executeKeyCombo(e,t)},a=()=>this.activeKeys=[],c=e=>{const t=e.code;this.konamiSequence.push(t),this.clearKonamiSequence()};this.clearKonamiSequence=e((()=>this.konamiSequence=[]),s.konamiDelay);const u=e=>{const t=e.code;!i[e.code]&&!this.activeKeys.includes(t)&&this.activeKeys.push(t)};this.listenerMapping={keydown:{capture:{},bubble:{}},keyup:{capture:{},bubble:{}}},this.destroy=()=>{this.listenerMapping=null,this.container.removeEventListener(\"keydown\",u,!0),this.container.removeEventListener(\"keydown\",o),this.container.removeEventListener(\"keydown\",r,!0),this.container.removeEventListener(\"keyup\",o),this.container.removeEventListener(\"keyup\",r,!0),this.container.removeEventListener(\"keydown\",c),window.removeEventListener(\"keyup\",a)},this.container.addEventListener(\"keydown\",u,!0),this.container.addEventListener(\"keydown\",o),this.container.addEventListener(\"keydown\",r,!0),this.container.addEventListener(\"keyup\",o),this.container.addEventListener(\"keyup\",r,!0),this.container.addEventListener(\"keydown\",c),window.addEventListener(\"keyup\",a)}getListenerMeta(e){const{keyCombo:t,priority:n}=e,i=Object.assign(Object.assign({},this.defaultConfig),e),s=this.getListeners(i.eventType,i.capture,t);return i.priority=null!=n?n:s.length,i}extractExecutionMeta(e,n){const i=e.type,s=n===e.CAPTURING_PHASE,o=e.ctrlKey?t.ControlLeft:\"\",r=[e.metaKey?t.MetaLeft:\"\",o,e.shiftKey?t.ShiftLeft:\"\",e.altKey?t.AltLeft:\"\"].filter((e=>\"\"!==e)),a=this.activeKeys;return r.push(...a),{keyCombo:r,capture:s,eventType:i}}executeListenerArr(e,t=null){for(let n=0;n<e.length;n++){const i=e[n],s=!t||i.repeat==t.repeat;if(!i.isKonami&&s&&!1===i.callback(t,i))break}}executeKonamiSequence(e=null,t=1){const n=3===t,i=this.getListeners(\"keydown\",n,this.konamiSequence);for(let t=0;t<i.length;t++){const n=i[t],s=!e||n.repeat==e.repeat;if(n.isKonami&&s&&!1===n.callback(e,n))break}}sortKeyCombo(e){return e.sort(((e,t)=>n.indexOf(e)-n.indexOf(t)))}getListeners(e,t,n){var i,s;const o=this.convertKeyComboToString(n),r=t?\"capture\":\"bubble\";return(null===(s=null===(i=this.listenerMapping)||void 0===i?void 0:i[e][r])||void 0===s?void 0:s[o])||[]}addListener(e){const{keyCombo:t,callback:n}=e,i=this.getListenerMeta(e),{eventType:s,capture:o,priority:r}=i,a=this.convertKeyComboToString(t),c=o?\"capture\":\"bubble\";this.listenerMapping?this.listenerMapping[s]?this.listenerMapping[s][c]?this.listenerMapping[s][c][a]||(this.listenerMapping[s][c][a]=[]):this.listenerMapping[s][c]={}:this.listenerMapping[s]={capture:{},bubble:{}}:this.listenerMapping={keydown:{capture:{},bubble:{}},keyup:{capture:{},bubble:{}}},this.listenerMapping[s][c][a].splice(r,0,i)}convertKeyComboToString(e){if(\"string\"==typeof e)return e;const t=e;return this.sortKeyCombo(t).join(\"+\")}executeKeyCombo(e,n){if(this.isPaused)return;let i,s,o,r;e instanceof KeyboardEvent?(r=e,n=r.eventPhase,({keyCombo:i,capture:s,eventType:o}=this.extractExecutionMeta(e,n)),this.executeKonamiSequence(r,n)):({keyCombo:i,capture:s,eventType:o}=e);const a=this.getListeners(o,s,i),c=t.Any,u=this.getListeners(o,s,c);this.executeListenerArr(a,r),this.executeListenerArr(u,r)}removeListener(e,t){const{keyCombo:n,capture:i,eventType:s}=e,o=this.getListeners(s,i,n);let r=-1;o.find((({callback:e},n)=>{if(e===t)return r=n,!0})),-1!==r&&o.splice(r,1)}removeKeyCombo(e){var t;const{keyCombo:n,capture:i,eventType:s}=e,o=i?\"capture\":\"bubble\",r=this.convertKeyComboToString(n);null===(t=this.listenerMapping)||void 0===t||delete t[s][o][r]}importEvents(e){e.forEach((e=>{this.addListener(e)}))}pauseExecution(){this.isPaused=!0}unpauseExecution(){this.isPaused=!1}}s.DefaultConfiguration={description:\"\",capture:!1,isKonami:!1,eventType:\"keydown\",repeat:!1},s.konamiDelay=500;export{s as KeyEventManager};\n//# sourceMappingURL=key-events.js.map\n","function t(t,E=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER){return Math.max(E,Math.min(t,a))}export{t as default};\n//# sourceMappingURL=clamp.js.map\n","function o(o,e){const t={};return Object.keys(o).forEach((i=>{const{slot:n,modifiers:r}=o[i],s=r.filter(Boolean),f=e({slot:n,modifiers:s});t[i]=[f].filter(Boolean).join(\" \")})),t}export{o as default};\n//# sourceMappingURL=composeClasses.js.map\n","function e(e,t=166){let u;function a(...a){clearTimeout(u),u=setTimeout((()=>{e.apply(this,a)}),t)}return a.clear=()=>{clearTimeout(u)},a}export{e as default};\n//# sourceMappingURL=debounce.js.map\n","import e from\"../BEM/bem.js\";function m(m,o,r,t=[\"Dg\"]){return e({block:m,namespace:t,element:o,modifier:r})}export{m as default};\n//# sourceMappingURL=generateUtilityClass.js.map\n","import t from\"../generateUtilityClass/generateUtilityClass.js\";function e(e,r,a=[],s=[\"Dg\"]){const i={};return r.forEach((r=>{i[r]=t(e,r,a,s)})),i}export{e as default};\n//# sourceMappingURL=generateUtilityClasses.js.map\n","export{default as BEM}from\"./BEM/bem.js\";export{default as composeClasses}from\"./composedClasses/composeClasses.js\";export{default as generateUtilityClass}from\"./generateUtilityClass/generateUtilityClass.js\";export{default as generateUtilityClasses}from\"./generateUtilityClasses/generateUtilityClasses.js\";export{default as clamp}from\"./clamp/clamp.js\";export{default as debounce}from\"./debounce/debounce.js\";export{KeyEventManager}from\"./KeyEvents/key-events.js\";export{KeyCodes}from\"./KeyEvents/key-events-constants.js\";\n//# sourceMappingURL=index.js.map\n","export{Component}from\"./Component/Component.js\";\n//# sourceMappingURL=Component.js.map\n","import{BEAN_NAME as e}from\"../Constants/BeanName.js\";import{EventEmitter as t}from\"../Events/EventEmitter.js\";import{Components as s,getFunctionName as i}from\"../Decorator/ReferenceSelector.js\";import{cloneNodeList as r,forEachAttributeInNamedNodeMap as o,isNodeOrHTMLElement as n,setVisible as l,setDisplayed as a}from\"../utils/dom.js\";import{AutoWired as c,PreConstruct as h}from\"../Decorator/BeanFactoryDecorator.js\";var u=function(e,t,s,i){var r,o=arguments.length,n=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,s):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)n=Reflect.decorate(e,t,s,i);else for(var l=e.length-1;l>=0;l--)(r=e[l])&&(n=(o<3?r(n):o>3?r(t,s,n):r(t,s))||n);return o>3&&n&&Object.defineProperty(t,s,n),n};class d extends t{constructor(e){super(),this.displayed=!0,this.visible=!0,e&&this.setTemplate(e)}preConstructMethods(){this.createChildComponentsPreConstruct()}createChildComponentsFromTags(e,t){r(e.childNodes).forEach((s=>{if(!(s instanceof HTMLElement))return;const i=this.createComponentFromElement(s,(e=>{e.getGui()&&this.copyAttributesFromNode(s,e.getGui())}),t);if(i){if(i.addItems&&s.children.length){this.createChildComponentsFromTags(s,t);const e=Array.prototype.slice.call(s.children);i.addItems(e)}this.swapComponentForNode(i,e,s)}else s.childNodes&&this.createChildComponentsFromTags(s,t)}))}createComponentFromElement(e,t,s){const i=e.nodeName,r=s?s[e.getAttribute(\"ref\")]:void 0,o=this.componentRegistry.getComponentClass(i);if(o){d.elementGettingCreated=e;const s=new o(r);return s.setParentComponent(this),this.createBean(s,null,t),s}return null}copyAttributesFromNode(e,t){o(e.attributes,((e,s)=>{\"class\"!==e?t.setAttribute(e,s):(s||\"\").split(\" \").forEach((e=>t.classList.add(e)))}))}swapComponentForNode(e,t,s){const i=e.getGui();t.replaceChild(i,s),this.addDestroyFunc(this.destroyBean.bind(this,e)),this.swapInComponentForRefSelectors(e,s)}swapInComponentForRefSelectors(e,t){const s=this;this.iterateOverQuerySelectors((i=>{s[i.attributeName]===t&&(s[i.attributeName]=e)}))}iterateOverQuerySelectors(e){let t=Object.getPrototypeOf(this);for(;null!=t;){const r=Reflect.get(t,s.METADATA),o=i(t.constructor);r&&Reflect.has(r,o)&&Reflect.has(r[o],\"querySelectors\")&&r[o].querySelectors.forEach((t=>e(t))),t=Object.getPrototypeOf(t)}}createChildComponentsPreConstruct(){this.getGui()&&this.createChildComponentsFromTags(this.getGui())}activateTabIndex(e){e||(e=[]),e.length||e.push(this.getGui()),e.forEach((e=>e.setAttribute(\"tabindex\",\"0\")))}wireQuerySelectors(){if(!this.eGui)return;const e=this;this.iterateOverQuerySelectors((t=>{const s=s=>e[t.attributeName]=s;if(t.refSelector&&this.getAttribute(\"ref\")===t.refSelector)s(this.eGui);else{const e=this.eGui.querySelector(t.querySelector);e&&s(e.Component||e)}}))}setGui(e){this.eGui=e}queryForHtmlElement(e){return this.eGui.querySelector(e)}queryForHtmlInputElement(e){return this.eGui.querySelector(e)}destroy(){this.parentComponent&&(this.parentComponent=void 0),super.destroy()}setTemplate(e,t){this.setTemplateFromElement(e,t)}setTemplateFromElement(e,t){this.eGui=e,this.eGui.Component=this,this.wireQuerySelectors(),this.getContext()&&this.createChildComponentsFromTags(this.getGui(),t)}getGui(){return this.eGui}getFocusableElement(){return this.eGui}getAriaElement(){return this.getFocusableElement()}setParentComponent(e){this.parentComponent=e}getParentComponent(){return this.parentComponent}appendChild(e,t=this.eGui){if(null!=e)if(n(e))t.appendChild(e);else{const s=e;t.appendChild(s.getGui())}}isDisplayed(){return this.displayed}setVisible(e,t={}){if(e!==this.visible){this.visible=e;const{skipAriaHidden:s}=t;l(this.eGui,e,{skipAriaHidden:s})}}setDisplayed(e,t={}){if(e!==this.displayed){this.displayed=e;const{skipAriaHidden:s}=t;a(this.eGui,e,{skipAriaHidden:s});const i={type:d.EVENT_DISPLAYED_CHANGED,visible:this.displayed};this.dispatchEvent(i)}}addGuiEventListener(e,t,s){this.eGui.addEventListener(e,t,s),this.addDestroyFunc((()=>this.eGui.removeEventListener(e,t)))}addCssClass(e){const t=this.getGui(),s=(e||\"\").split(\" \");null==t||t.classList.add(...s)}removeCssClass(e){const t=this.getGui(),s=(e||\"\").split(\" \");null==t||t.classList.remove(...s)}containsCssClass(e){const t=this.getGui();return!!t&&t.classList.contains(e)}addOrRemoveCssClass(e,t){if(e){if(e.indexOf(\" \")>=0){const s=(e||\"\").split(\" \");if(s.length>1)return void s.forEach((e=>this.addOrRemoveCssClass(e,t)))}if(e.length){const s=this.getGui();s&&s.classList.toggle(e,t)}}}getAttribute(e){const t=this.getGui();return t?t.getAttribute(e):null}getRefElement(e){return this.queryForHtmlElement(`[ref=\"${e}\"]`)}}d.EVENT_DISPLAYED_CHANGED=\"displayedChanged\",u([c(e.COMPONENT_REGISTRY)],d.prototype,\"componentRegistry\",void 0),u([h()],d.prototype,\"preConstructMethods\",null);export{d as Component};\n//# sourceMappingURL=Component.js.map\n","import{Bean as e}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as t}from\"../Constants/BeanName.js\";import{EventEmitter as o}from\"../Events/EventEmitter.js\";let n=class extends o{constructor(){super(...arguments),this.componentsMappedByName={}}setupComponents(e){e&&e.forEach((e=>this.addComponent(e)))}addComponent({componentName:e,componentClass:t,template:o}){const n=e.toUpperCase();o&&(t.getTemplate=o),this.componentsMappedByName[n]=t}getComponentClass(e){return this.componentsMappedByName[e]}};n=function(e,t,o,n){var r,p=arguments.length,s=p<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,o):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,o,n);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(p<3?r(s):p>3?r(t,o,s):r(t,o))||s);return p>3&&s&&Object.defineProperty(t,o,s),s}([e(t.COMPONENT_REGISTRY)],n);export{n as ComponentsRegistry};\n//# sourceMappingURL=ComponentRegistry.js.map\n","import{AutoWired as e,Bean as t}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as n}from\"../Constants/BeanName.js\";import{EventEmitter as o}from\"../Events/EventEmitter.js\";var r=function(e,t,n,o){var r,a=arguments.length,i=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,n):o;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)i=Reflect.decorate(e,t,n,o);else for(var l=e.length-1;l>=0;l--)(r=e[l])&&(i=(a<3?r(i):a>3?r(t,n,i):r(t,n))||i);return a>3&&i&&Object.defineProperty(t,n,i),i};let a=class extends o{getComponentDetails(e,t,o,r){let{componentName:a,frameworkComponent:i,jsComponent:l}=this.getComponentMeta(e,t,o);const s=e=>{const t=this.getBeanInstance(n.USER_COMPONENT_REGISTRY).retrieve(e);t&&(l=t.componentFrameWork?void 0:t.component,i=t.componentFrameWork?t.component:void 0)};if(null!=a&&s(a),null==l&&null==i&&null!=r&&s(r),!l&&!i)return;const m=null==l,c=l||i;return{componentFramework:m,componentClass:c,params:o,propertyName:t,newInstance:()=>this.newInstance(c,m,t,o)}}getComponentMeta(e,t,n){let o=null,r=null,a=null;return(e=>{\"string\"==typeof e?o=e:null!=e&&!0!==e&&(this.getFrameWorkOverrides().isFrameworkComponent(e)?a=e:r=e)})(this.getComponent(e,t)),{componentName:o,frameworkComponent:a,jsComponent:r}}getComponent(e,t){}newInstance(e,t,o,r){var a,i;let l;const s=this.getBeanInstance(n.FRAME_WORK_COMPONENT_WRAPPER),m=this.getBeanInstance(n.COMPONENT_META_DATA_PROVIDER);if(t){const t=m.retrieve(o);l=s.wrap(e,t&&null!==(a=null==t?void 0:t.mandatoryMethodList)&&void 0!==a?a:[],t&&null!==(i=null==t?void 0:t.optionalMethodList)&&void 0!==i?i:[])}else l=new e;return this.initComponent(l,r),l}initComponent(e,t){if(this.context.createBean(e),null!=e.init)return e.init(t)}};r([e(n.BEANS)],a.prototype,\"getBeanInstance\",void 0),a=r([t(n.USER_COMPONENT_HANDLER)],a);export{a as UserComponentHandler};\n//# sourceMappingURL=UserComponentHandler.js.map\n","import{Bean as e}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as t}from\"../Constants/BeanName.js\";import{EventEmitter as o}from\"../Events/EventEmitter.js\";let r=class extends o{constructor(){super(...arguments),this.defaultComp={},this.jsComponents={}}registerDefaultComponent(e,t){this.defaultComp[e]||(this.defaultComp[e]=t)}registerJSComponent(e,t){this.jsComponents[e]=t}retrieve(e){const t=(e,t)=>({componentFrameWork:t,component:e}),o=this.getFrameWorkOverrides().frameworkComponent(e,this.userComponent);if(null!=o)return t(o,!0);const r=this.jsComponents[e];if(r)return t(r,this.getFrameWorkOverrides().isFrameworkComponent(r));const n=this.defaultComp[e];return n?t(n,!1):null}};r=function(e,t,o,r){var n,s=arguments.length,i=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)i=Reflect.decorate(e,t,o,r);else for(var m=e.length-1;m>=0;m--)(n=e[m])&&(i=(s<3?n(i):s>3?n(t,o,i):n(t,o))||i);return s>3&&i&&Object.defineProperty(t,o,i),i}([e(t.USER_COMPONENT_REGISTRY)],r);export{r as UserComponentRegistry};\n//# sourceMappingURL=UserComponentRegistry.js.map\n","export{ComponentMetadataProvider}from\"./FrameWork/ComponentMetaDataProvider.js\";\n//# sourceMappingURL=ComponentMetadataProvider.js.map\n","export{ComponentsRegistry}from\"./Component/ComponentRegistry.js\";\n//# sourceMappingURL=ComponentRegistry.js.map\n","const e={CONTEXT:\"context\",COMPONENT_REGISTRY:\"componentRegistry\",EVENT_HANDLER:\"eventHandler\",USER_COMPONENT_HANDLER:\"userComponentHandler\",POPUP_HANDLER:\"popupHandler\",OPTION_HANDLER:\"optionHandler\",USER_COMPONENT_REGISTRY:\"userComponentRegistry\",COMPONENT_META_DATA_PROVIDER:\"componentMetaDataProvider\",COMPONENT_UTILITY:\"componentUtility\",FRAME_WORK_COMPONENT_WRAPPER:\"frameworkComponentWrapper\",FRAME_WORK_OVERRIDES:\"frameWorkOverrides\",BEANS:\"lookupBeanInstances\"};export{e as BEAN_NAME};\n//# sourceMappingURL=BeanName.js.map\n","import{BeanDefinitionSymbol as e}from\"./Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as t}from\"./Constants/BeanName.js\";import{traverseObject as n}from\"./utils/Generic.js\";class r{constructor(){this.beanWrappers={},this.destroyed=!1}getBeanInstances(){return Object.values(this.beanWrappers)}getInstanceID(){var e;return this.userConfigurations?null===(e=this.userConfigurations)||void 0===e?void 0:e.instanceID:null}registerBeanClasses(e,t){this.beanClasses=e,this.registerUserContextParams(t),this.createBeans();const n=this.getBeanInstances();this.wireBeans(n)}registerUserContextParams(e){this.userConfigurations=null!=e?e:{}}createBean(e,t){if(!e)throw Error(\"Can't wire to bean since it is null\");return this.wireBeans([e]),e}createBeans(){this.beanClasses.forEach((t=>{const n=t[e];if(n){const e=n.beanName,r=new t;this.beanWrappers[e]=r}}))}wireBeans(e){this.autoWireBeans(e),this.methodWireBeans(e),this.callLifeCycleMethods(e,\"preConstruct\"),this.callLifeCycleMethods(e,\"postConstruct\")}autoWireBeans(e){e.forEach((e=>{this.forEachMetaDataInHierarchyBeanDefinition(e,((n,r)=>{const a=n.dependencies;a&&a.forEach((n=>{if(n.autowireLazy)Object.defineProperty(e,n.autowireField,{get:()=>{let e=this.getBeanInstance(r,n.beanName,n.optional);if(n.beanName===t.BEANS&&(e=this.getBeanInstance.bind(this,r)),!e)throw Error(\"Unknown beanName=\"+n.autowireField);return e},configurable:!1});else{let a;a=n.beanName===t.BEANS?this.getBeanInstance.bind(this,r):this.getBeanInstance(r,n.beanName,n.optional),Object.defineProperty(e,n.autowireField,{value:a,configurable:!!a,writable:!1})}}))}))}))}methodWireBeans(e){e.forEach((e=>{this.forEachMetaDataInHierarchyBeanDefinition(e,((t,n)=>{t.attributeAnnotations.forEach((t=>{if(t.targetPropertyKey&&t.parameters){const r=this.getBeansForParameters(t.parameters,n);console.log(r),e[t.targetPropertyKey].apply(e)}}))}))}))}getBeansForParameters(e,t){const r=[];return e&&n(e,((e,n)=>{if(n){const e=this.getBeanInstance(t,n.name);r[Number(n.index)]=e}})),r}getBeanInstance(e,n,r=!1){if(this.destroyed)return null;if(n===t.CONTEXT)return a=this,{createBean(e){a.createBean(e)},destroyBean(e){a.destroyBean(e)},destroy(){a.destroy()}};var a;if(this.userConfigurations&&this.userConfigurations.hasOwnProperty(n))return this.userConfigurations[n];return this.beanWrappers[n]||(r||console.error(`Component: unable to find bean reference ${n} while initialising ${e}`),null)}callLifeCycleMethods(e,t){e.forEach((e=>this.callLifeCycleMethodsOnBean(e,t)))}callLifeCycleMethodsOnBean(e,t,n){const r={};this.forEachMetaDataInHierarchyBeanDefinition(e,(e=>{const a=e[t];a&&a.forEach((e=>{e!=n&&(r[e]=!0)}))})),Object.keys(r).forEach((t=>e[t]()))}forEachMetaDataInHierarchyBeanDefinition(t,n){let r=Object.getPrototypeOf(t);for(;null!=r;){const t=r.constructor;t.hasOwnProperty(e)&&n(t[e],this.getBeanName(t)),r=Object.getPrototypeOf(r)}}getBeanName(t){if(t[e]&&t[e].beanName)return t[e].beanName;const n=t.toString();return n.substring(9,n.indexOf(\"(\"))}getBean(e){return this.getBeanInstance(\"getBean\",e,!0)}destroy(){if(this.destroyed)return;this.destroyed=!0;const e=this.getBeanInstances();this.destroyBeans(e),this.userConfigurations=null}destroyBean(e){e&&this.destroyBeans([e])}destroyBeans(e){return e?(e.forEach((e=>{this.callLifeCycleMethodsOnBean(e,\"preDestroy\",\"destroy\");const t=e;\"function\"==typeof t.destroy&&t.destroy()})),[]):[]}isDestroyed(){return this.destroyed}}export{r as Context};\n//# sourceMappingURL=Context.js.map\n","import{BeanDependencyType as t,AttributeAnnotationTargetType as e}from\"./types.js\";const r=\"BeanDefinition\";function n(t,e){let n;if(n=\"class\"===e||\"function\"==typeof t?t:\"prototype\"===e?t.constructor:Object.getPrototypeOf(t),n.hasOwnProperty(r))return n[r];const o={uniqueId:Symbol(),className:\"\",beanName:\"\",componentTypes:[],dependencies:[],constructor:null,existInstance:null,preConstruct:[],postConstruct:[],preDestroy:[],attributeAnnotations:[]};return Object.defineProperty(n,r,{value:o,writable:!1}),o}function o(t){return(t,e,r)=>{const o=n(t,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PreDestroy is can use only to method\");return o.preDestroy||(o.preDestroy=[]),o.preDestroy.push(e),r}}function s(t){return(t,e,r)=>{var o;const s=n(t,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PostConstructor is can use only to method\");return s.postConstruct&&(s.postConstruct=[]),null===(o=s.postConstruct)||void 0===o||o.push(e),r}}function a(t){return(t,e,r)=>{var o;const s=n(t,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PreConstructor is can use only to method\");return s.preConstruct&&(s.preConstruct=[]),null===(o=s.preConstruct)||void 0===o||o.push(e),r}}function u(e,r,o){return(s,a)=>{const u=n(s,\"prototype\"),p=o&&o.lazy||!1;if(o&&o.name)u.dependencies.push({type:t.AUTOWIRE,autowireField:a,autowireLazy:p,beanName:o.name,className:e,optional:r});else{if(\"string\"!=typeof a)throw Error(\"property name must be string without beanName\");u.dependencies.push({type:t.AUTOWIRE,autowireField:a,autowireLazy:p,beanName:e,className:e,optional:r})}}}function p(t){return r={componentType:\"bean\",beanName:t},t=>{const o=r.beanName||t.name,s=n(t,\"class\");return s.className=t.name,s.beanName=o,s.constructor=t,s.componentTypes.push(r.componentType),s.attributeAnnotations.push({targetType:e.Class,targetDescriptor:null}),t};var r}function i(t,e){return u(t,!1,e)}function c(t,e){return u(t,!0,e)}function y(t){return r={name:t},(t,o,s)=>{const a=function(t,r){let n=t.attributeAnnotations.find((t=>t.targetType===e.Method&&t.targetPropertyKey===r));return n||(n={targetType:e.Method,targetPropertyKey:r,targetDescriptor:void 0,parameters:void 0},t.attributeAnnotations.push(n)),n}(n(t,\"prototype\"),o);a.parameters||(a.parameters=[]),a.parameters[s]={index:s,name:r.name}};var r}export{i as AutoWired,p as Bean,r as BeanDefinitionSymbol,c as Optional,s as PostConstruct,a as PreConstruct,o as PreDestroy,y as Qualifier,u as WireFunction};\n//# sourceMappingURL=BeanFactoryDecorator.js.map\n","const e={METADATA:\"COMPONENT_META_DATA\"};function t(e){if(e.name)return e.name}function r(e=null){return function(t,r,n){null!==e?\"number\"!=typeof n?o(t,\"querySelectors\",{attributeName:r,querySelector:e,refSelector:void 0}):console.error(\"QuerySelector should be on an attribute\"):console.error(\"QuerySelector should not be null\")}}function n(e){return function(t,r,n){o(t,\"querySelectors\",{attributeName:r,querySelector:`[ref=${e}]`,refSelector:e})}}function o(r,n,o){const u=function(t,r){Reflect.has(t,e.METADATA)||Reflect.set(t,e.METADATA,{});return Reflect.has(t[e.METADATA],r)||Reflect.set(t[e.METADATA],r,{}),Reflect.get(t[e.METADATA],r)}(r,t(r.constructor));u[n]||(u[n]=[]),u[n].push(o)}export{e as Components,r as QuerySelector,t as getFunctionName,n as queryAssignedNodes};\n//# sourceMappingURL=ReferenceSelector.js.map\n","var C,O;!function(C){C[C.CONSTRUCTOR=0]=\"CONSTRUCTOR\",C[C.AUTOWIRE=1]=\"AUTOWIRE\"}(C||(C={})),function(C){C[C.Class=0]=\"Class\",C[C.Method=1]=\"Method\"}(O||(O={}));export{O as AttributeAnnotationTargetType,C as BeanDependencyType};\n//# sourceMappingURL=types.js.map\n","export{EventEmitter,addSafePassiveEventListener}from\"./Events/EventEmitter.js\";\n//# sourceMappingURL=EventEmitter.js.map\n","export{EventHandler}from\"./Events/EventHandler.js\";\n//# sourceMappingURL=EventHandler.js.map\n","import{AutoWired as e}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as t}from\"../Constants/BeanName.js\";import{EventHandler as r}from\"./EventHandler.js\";var n=function(e,t,r,n){var s,o=arguments.length,i=o<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)i=Reflect.decorate(e,t,r,n);else for(var d=e.length-1;d>=0;d--)(s=e[d])&&(i=(o<3?s(i):o>3?s(t,r,i):s(t,r))||i);return o>3&&i&&Object.defineProperty(t,r,i),i};class s{constructor(){this.destroyFunctions=[],this.destroyed=!1}getFrameWorkOverrides(){return this.frameWorkOverrides}createBean(e,t,r){return t?t.createBean(e):this.getContext().createBean(e),r&&r(e),e}destroyBean(e,t){return(t||this.getContext()).destroyBean(e)}destroyBeans(e,t){return e&&e.forEach((e=>this.destroyBean(e,t))),[]}destroy(){this.dispatchEvent({type:s.EVENT_DESTROYED}),this.destroyFunctions.forEach((e=>e())),this.destroyFunctions.length=0,this.destroyed=!0}getContext(){return this.context}addEventListener(e,t){this.eventHandler||(this.eventHandler=new r),this.eventHandler.addEventListener(e,t)}removeEventListener(e,t){this.eventHandler&&this.eventHandler.removeEventListener(e,t)}dispatchEventAsync(e){window.setTimeout((()=>this.dispatchEvent(e)),0)}dispatchEvent(e){this.eventHandler&&this.eventHandler.dispatchEvent(e)}addListener(e,t,r){if(this.destroyed)return;e instanceof HTMLElement?o(e,t,r):e.addEventListener(t,r);const n=()=>(e.removeEventListener(t,r),this.destroyFunctions=this.destroyFunctions.filter((e=>e!==n)),null);return this.destroyFunctions.push(n),n}isAlive(){return!this.destroyed}addDestroyFunc(e){this.isAlive()?this.destroyFunctions.push(e):e()}createManagedBean(e,t){const r=this.createBean(e,t);return this.addDestroyFunc(this.destroyBean.bind(this,e,t)),r}}function o(e,t,r){e&&e.addEventListener(t,r,void 0)}s.EVENT_DESTROYED=\"destroyed\",n([e(t.EVENT_HANDLER)],s.prototype,\"eventHandler\",void 0),n([e(t.OPTION_HANDLER)],s.prototype,\"optionsHandler\",void 0),n([e(t.FRAME_WORK_OVERRIDES)],s.prototype,\"frameWorkOverrides\",void 0),n([e(\"context\")],s.prototype,\"context\",void 0);export{s as EventEmitter,o as addSafePassiveEventListener};\n//# sourceMappingURL=EventEmitter.js.map\n","import{Bean as e}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as s}from\"../Constants/BeanName.js\";let t=class{constructor(){this.allSyncListeners=new Map,this.allAsyncListeners=new Map,this.globalSyncListeners=new Set,this.globalAsyncListeners=new Set,this.asyncFunctionsQueue=[],this.scheduled=!1,this.firedEvents={}}setBeans(e,s=null,t=null){if(this.optionHandler=e,s){const t=e.useAsyncEvents();this.addGlobalListener(s,t)}t&&this.addGlobalListener(t,!1)}getListeners(e,s,t){const n=s?this.allAsyncListeners:this.allSyncListeners;let i=n.get(e);return!i&&t&&(i=new Set,n.set(e,i)),i}noRegisteredListenersExist(){return 0===this.allSyncListeners.size&&0===this.allAsyncListeners.size&&0===this.globalSyncListeners.size&&0===this.globalAsyncListeners.size}addEventListener(e,s,t=!1){this.getListeners(e,t,!0).add(s)}removeEventListener(e,s,t=!1){const n=this.getListeners(e,t,!1);n&&(n.delete(s),0===n.size)&&(t?this.allAsyncListeners:this.allSyncListeners).delete(e)}addGlobalListener(e,s=!1){(s?this.globalAsyncListeners:this.globalSyncListeners).add(e)}removeGlobalListener(e,s=!1){(s?this.globalAsyncListeners:this.globalSyncListeners).delete(e)}dispatchEvent(e){let s=e;if(this.optionHandler){const{api:e}=this.optionHandler;s.api=e}this.dispatchToListeners(s,!0),this.dispatchToListeners(s,!1),this.firedEvents[s.type]=!0}dispatchEventOnce(e){this.firedEvents[e.type]||this.dispatchEvent(e)}dispatchToListeners(e,s){const t=e.type,n=new Set(this.getListeners(t,s,!1));n.size>0&&(t=>{t.forEach((t=>{s?this.dispatchAsync((()=>t(e))):t(e)}))})(n),new Set(s?this.globalAsyncListeners:this.globalSyncListeners).forEach((n=>{s?this.dispatchAsync((()=>n(t,e))):n(t,e)}))}dispatchAsync(e){this.asyncFunctionsQueue.push(e),this.scheduled||(window.setTimeout(this.flushAsyncQueue.bind(this),0),this.scheduled=!0)}flushAsyncQueue(){this.scheduled=!1;const e=this.asyncFunctionsQueue.slice();this.asyncFunctionsQueue=[],e.forEach((e=>e()))}};t=function(e,s,t,n){var i,c=arguments.length,l=c<3?s:null===n?n=Object.getOwnPropertyDescriptor(s,t):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)l=Reflect.decorate(e,s,t,n);else for(var r=e.length-1;r>=0;r--)(i=e[r])&&(l=(c<3?i(l):c>3?i(s,t,l):i(s,t))||l);return c>3&&l&&Object.defineProperty(s,t,l),l}([e(s.EVENT_HANDLER)],t);export{t as EventHandler};\n//# sourceMappingURL=EventHandler.js.map\n","export{BaseComponentWrapper}from\"./FrameWork/FrameWorkComponentWrapper.js\";export{VanillaFrameWorkOverrider}from\"./FrameWork/VanillaFrameWorkOverrides.js\";\n//# sourceMappingURL=FrameWork.js.map\n","import{AutoWired as e,Bean as t}from\"../Decorator/BeanFactoryDecorator.js\";import{BEAN_NAME as r}from\"../Constants/BeanName.js\";import{EventEmitter as o}from\"../Events/EventEmitter.js\";var n=function(e,t,r,o){var n,a=arguments.length,c=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)c=Reflect.decorate(e,t,r,o);else for(var s=e.length-1;s>=0;s--)(n=e[s])&&(c=(a<3?n(c):a>3?n(t,r,c):n(t,r))||c);return a>3&&c&&Object.defineProperty(t,r,c),c};let a=class extends o{constructor(){super(...arguments),this.componentMetaData={}}retrieve(e){return this.componentMetaData[e]}};n([e(r.BEANS)],a.prototype,\"getBeanInstanceByBeanName\",void 0),a=n([t(r.COMPONENT_META_DATA_PROVIDER)],a);export{a as ComponentMetadataProvider};\n//# sourceMappingURL=ComponentMetaDataProvider.js.map\n","class e{wrap(e,t,r=[]){const o=this.createWrapper(e);return t.forEach((e=>{this.createMethod(o,e,!0)})),r.forEach((e=>{this.createMethod(o,e,!1)})),o}createMethod(e,t,r){e.addMethod(t,this.createMethodProxy(e,t,r))}createMethodProxy(e,t,r){return function(){return e.hasMethod(t)?e.callMethod(t,arguments):(r&&console.warn(`Framework component is missing the method ${t}()`),null)}}}export{e as BaseComponentWrapper};\n//# sourceMappingURL=FrameWorkComponentWrapper.js.map\n","class n{constructor(){this.renderingEngine=\"vanilla\"}frameworkComponent(n,r){return null}isFrameworkComponent(n){return!1}}export{n as VanillaFrameWorkOverrider};\n//# sourceMappingURL=VanillaFrameWorkOverrides.js.map\n","export{UserComponentHandler}from\"./Component/UserComponentHandler.js\";\n//# sourceMappingURL=UserComponentHandler.js.map\n","export{UserComponentRegistry}from\"./Component/UserComponentRegistry.js\";\n//# sourceMappingURL=UserComponentRegistry.js.map\n","export{addAriaAttribute,ariaAttributeName,removeAriaAttribute,setAriaActiveDescendant,setAriaAtomic,setAriaAutocomplete,setAriaBraillelabel,setAriaBrailleroledescription,setAriaBusy,setAriaChecked,setAriaColCount,setAriaColIndex,setAriaColIndexText,setAriaColSpan,setAriaControls,setAriaCurrent,setAriaDescribedBy,setAriaDescription,setAriaDetails,setAriaDisabled,setAriaErrorMessage,setAriaExpanded,setAriaFlowTo,setAriaHasPopUp,setAriaHidden,setAriaInvalid,setAriaKeyShortCuts,setAriaLabel,setAriaLabelledBy,setAriaLevel,setAriaLive,setAriaModal,setAriaMultiLine,setAriaMultiSelectable,setAriaOrientation,setAriaPlaceHolder,setAriaPosInSet,setAriaPressed,setAriaReadOnly,setAriaRelevant,setAriaRequired,setAriaRole,setAriaRoleDescription,setAriaRowCount,setAriaRowIndex,setAriaRowIndexText,setAriaRowSpan,setAriaSelected,setAriaSetSize,setAriaSort,setAriaValueMax,setAriaValueMin,setAriaValueNow,setAriaValueText,toggleAriaAttribute}from\"./utils/aria.js\";export{addOrRemoveAttribute,addTemplate,clearElement,cloneNodeList,ensureDomOrder,forEachAttributeInMap,forEachAttributeInNamedNodeMap,forEachNodeInList,formatSize,getAbsoluteHeight,getAbsoluteWidth,getElementRectWithMargin,getElementRectWithOffset,getElementSize,insertWithDomOrder,isNodeOrHTMLElement,removeFromParent,setDisabled,setDisplayed,setElementWidth,setFixedHeight,setFixedWidth,setVisible,toggleAttribute}from\"./utils/dom.js\";export{createArrayOfNumbers,exists,toStringOrNull,traverseObject,values}from\"./utils/Generic.js\";export{BEAN_NAME}from\"./Constants/BeanName.js\";export{AutoWired,Bean,BeanDefinitionSymbol,Optional,PostConstruct,PreConstruct,PreDestroy,Qualifier,WireFunction}from\"./Decorator/BeanFactoryDecorator.js\";export{Components,QuerySelector,getFunctionName,queryAssignedNodes}from\"./Decorator/ReferenceSelector.js\";export{AttributeAnnotationTargetType,BeanDependencyType}from\"./Decorator/types.js\";\n//# sourceMappingURL=main.js.map\n","function n(n){if(n instanceof Set||n instanceof Map){const t=[];return n.forEach((n=>t.push(n))),t}return Object.values(n)}function t(n,t=!1){return null!=n&&(\"\"!==n||t)}function r(n){return null!=n&&\"function\"==typeof n.toString?n.toString():null}function o(n,t){const r=[];for(let o=n;o<=t;o++)r.push(o);return r}function e(n,t){if(null!=n)if(Array.isArray(n))for(let r=0;r<n.length;r++)t(r.toString(),n[r]);else for(const[r,o]of Object.entries(n))t(r,o)}export{o as createArrayOfNumbers,t as exists,r as toStringOrNull,e as traverseObject,n as values};\n//# sourceMappingURL=Generic.js.map\n","function n(n){return\"aria-\"+n}function t(n,t,e){null==e||\"\"==e?i(n,t):o(n,t,e)}function o(t,o,i){t.setAttribute(n(o),i.toString())}function i(t,o){t.removeAttribute(n(o))}function e(n,t){t?n.setAttribute(\"role\",t):n.removeAttribute(\"role\")}function c(n,o){t(n,\"activedescendant\",o)}function u(n,o){t(n,\"atomic\",o)}function f(n,o){t(n,\"autocomplete\",o)}function l(n,o){t(n,\"braillelabel\",o)}function r(n,o){t(n,\"brailleroledescription\",o)}function a(n,o){t(n,\"busy\",o)}function d(n,o){t(n,\"checked\",o)}function s(n,o){t(n,\"colcount\",o)}function b(n,o){t(n,\"colindex\",o)}function p(n,o){t(n,\"colindextext\",o)}function v(n,o){t(n,\"colspan\",o)}function m(n,o){t(n,\"controls\",o)}function x(n,o){t(n,\"current\",o)}function w(n,o){t(n,\"describedby\",o)}function h(n,o){t(n,\"description\",o)}function y(n,o){t(n,\"details\",o)}function A(n,o){t(n,\"disabled\",o)}function g(n,o){t(n,\"errormessage\",o)}function k(n,o){t(n,\"expanded\",o)}function q(n,o){t(n,\"flowto\",o)}function z(n,o){t(n,\"haspopup\",o)}function S(n,o){t(n,\"hidden\",o)}function j(n,o){t(n,\"invalid\",o)}function B(n,o){t(n,\"keyshortcuts\",o)}function C(n,o){t(n,\"label\",o)}function D(n,o){t(n,\"labelledby\",o)}function E(n,o){t(n,\"level\",o)}function F(n,o){t(n,\"live\",o)}function G(n,o){t(n,\"modal\",o)}function H(n,o){t(n,\"multiline\",o)}function I(n,o){t(n,\"multiselectable\",o)}function J(n,o){t(n,\"orientation\",o)}function K(n,o){t(n,\"placeholder\",o)}function L(n,o){t(n,\"posinset\",o)}function M(n,o){t(n,\"pressed\",o)}function N(n,o){t(n,\"readonly\",o)}function O(n,o){t(n,\"relevant\",o)}function P(n,o){t(n,\"required\",o)}function Q(n,o){t(n,\"roledescription\",o)}function R(n,o){t(n,\"rowcount\",o)}function T(n,o){t(n,\"rowindex\",o)}function U(n,o){t(n,\"rowindextext\",o)}function V(n,o){t(n,\"rowspan\",o)}function W(n,o){t(n,\"selected\",o)}function X(n,o){t(n,\"setsize\",o)}function Y(n,o){t(n,\"sort\",o)}function Z(n,o){t(n,\"valuemax\",o)}function $(n,o){t(n,\"valuemin\",o)}function _(n,o){t(n,\"valuenow\",o)}function nn(n,o){t(n,\"valuetext\",o)}export{o as addAriaAttribute,n as ariaAttributeName,i as removeAriaAttribute,c as setAriaActiveDescendant,u as setAriaAtomic,f as setAriaAutocomplete,l as setAriaBraillelabel,r as setAriaBrailleroledescription,a as setAriaBusy,d as setAriaChecked,s as setAriaColCount,b as setAriaColIndex,p as setAriaColIndexText,v as setAriaColSpan,m as setAriaControls,x as setAriaCurrent,w as setAriaDescribedBy,h as setAriaDescription,y as setAriaDetails,A as setAriaDisabled,g as setAriaErrorMessage,k as setAriaExpanded,q as setAriaFlowTo,z as setAriaHasPopUp,S as setAriaHidden,j as setAriaInvalid,B as setAriaKeyShortCuts,C as setAriaLabel,D as setAriaLabelledBy,E as setAriaLevel,F as setAriaLive,G as setAriaModal,H as setAriaMultiLine,I as setAriaMultiSelectable,J as setAriaOrientation,K as setAriaPlaceHolder,L as setAriaPosInSet,M as setAriaPressed,N as setAriaReadOnly,O as setAriaRelevant,P as setAriaRequired,e as setAriaRole,Q as setAriaRoleDescription,R as setAriaRowCount,T as setAriaRowIndex,U as setAriaRowIndexText,V as setAriaRowSpan,W as setAriaSelected,X as setAriaSetSize,Y as setAriaSort,Z as setAriaValueMax,$ as setAriaValueMin,_ as setAriaValueNow,nn as setAriaValueText,t as toggleAriaAttribute};\n//# sourceMappingURL=aria.js.map\n","import{setAriaHidden as t}from\"./aria.js\";function n(n,e,i={}){const{skipAriaHidden:o}=i;n.classList.toggle(\"comp-hidden\",!e),o||t(n,!e)}function e(n,e,i={}){const{skipAriaHidden:o}=i;n.classList.toggle(\"comp-invisible\",!e),o||t(n,!e)}function i(t,n){const e=\"disabled\",i=n?t=>t.setAttribute(e,\"\"):t=>t.removeAttribute(e);i(t),o(t.querySelectorAll(\"input\"),(t=>i(t)))}function o(t,n){if(null!=t)for(let e=0;e<t.length;e++)n(t[e])}function r(t){if(null==t)return[];const n=[];return o(t,(t=>n.push(t))),n}function l(t,n){if(t)for(let e=0;e<t.length;e++){const i=t[e];n(i.name,i.value)}}function d(t,n,e){null==e?t.removeAttribute(n):t.setAttribute(n,e.toString())}function a(t,n){if(t)for(let e=0;e<t.length;e++){const i=t[e];n(i.name,i.value)}}function u(t){return t instanceof Node||t instanceof HTMLElement}function h(t){for(;t&&t.firstChild;)t.removeChild(t.firstChild)}function g(t,n){\"flex\"===n?(t.style.removeProperty(\"width\"),t.style.removeProperty(\"minWidth\"),t.style.removeProperty(\"maxWidth\"),t.style.flex=\"1 1 auto\"):f(t,n)}function f(t,n){n=s(n),t.style.width=n.toString(),t.style.maxWidth=n.toString(),t.style.minWidth=n.toString()}function s(t){return\"number\"==typeof t?t+\"px\":t}function m(t,n,e){null==e?t.removeAttribute(n):t.setAttribute(n,e.toString())}function p(t,n,e){e&&e.nextSibling===n||(e?e.nextSibling?t.insertBefore(n,e.nextSibling):t.appendChild(n):t.firstChild&&t.firstChild!==n&&t.insertAdjacentElement(\"afterbegin\",n))}function c(t,n,e){e?e.insertAdjacentElement(\"afterend\",n):t.firstChild?t.insertAdjacentElement(\"afterbegin\",n):t.appendChild(n)}function b(t,n){n=s(n),t.style.height=n.toString(),t.style.maxHeight=n.toString(),t.style.minHeight=n.toString()}function W(t){const{height:n,width:e,borderTopWidth:i,borderRightWidth:o,borderBottomWidth:r,borderLeftWidth:l,paddingTop:d,paddingRight:a,paddingBottom:u,paddingLeft:h,marginTop:g,marginRight:f,marginBottom:s,marginLeft:m,boxSizing:p}=window.getComputedStyle(t);return{height:parseFloat(n),width:parseFloat(e),borderTopWidth:parseFloat(i),borderRightWidth:parseFloat(o),borderBottomWidth:parseFloat(r),borderLeftWidth:parseFloat(l),paddingTop:parseFloat(d),paddingRight:parseFloat(a),paddingBottom:parseFloat(u),paddingLeft:parseFloat(h),marginTop:parseFloat(g),marginRight:parseFloat(f),marginBottom:parseFloat(s),marginLeft:parseFloat(m),boxSizing:p}}function y(t){const n=t.getBoundingClientRect(),{borderTopWidth:e,borderLeftWidth:i,borderRightWidth:o,borderBottomWidth:r}=W(t);return{top:n.top+(null!=e?e:0),left:n.left+(null!=i?i:0),right:n.right+(null!=o?o:0),bottom:n.bottom+(null!=r?r:0),width:n.width,height:n.height}}function S(t){const n=t.getBoundingClientRect(),{borderTopWidth:e,borderLeftWidth:i,borderRightWidth:o,borderBottomWidth:r,marginTop:l,marginBottom:d,marginLeft:a,marginRight:u}=W(t);return{top:n.top+(null!=e?e:0)-(null!=l?l:0),left:n.left+(null!=i?i:0)-(null!=a?a:0),right:n.right+(null!=o?o:0)+(null!=u?u:0),bottom:n.bottom+(null!=r?r:0)+(null!=d?d:0),width:n.width+(null!=i?i:0)+(null!=o?o:0)+(null!=a?a:0)+(null!=u?u:0),height:n.height+(null!=e?e:0)+(null!=r?r:0)+(null!=l?l:0)+(null!=d?d:0),toJSON:()=>0,y:n.top+(null!=e?e:0)-(null!=l?l:0),x:n.left+(null!=i?i:0)-(null!=a?a:0)}}function F(t){const n=W(t),e=n.marginBottom+n.marginTop;return Math.ceil(t.offsetHeight+e)}function L(t){const n=W(t),e=n.marginLeft+n.marginRight;return Math.ceil(t.offsetWidth+e)}function x(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function B(t){const n=document.createElement(\"div\");return n.innerHTML=(t||\"\").trim(),n.firstChild}export{m as addOrRemoveAttribute,B as addTemplate,h as clearElement,r as cloneNodeList,p as ensureDomOrder,l as forEachAttributeInMap,a as forEachAttributeInNamedNodeMap,o as forEachNodeInList,s as formatSize,F as getAbsoluteHeight,L as getAbsoluteWidth,S as getElementRectWithMargin,y as getElementRectWithOffset,W as getElementSize,c as insertWithDomOrder,u as isNodeOrHTMLElement,x as removeFromParent,i as setDisabled,n as setDisplayed,g as setElementWidth,b as setFixedHeight,f as setFixedWidth,e as setVisible,d as toggleAttribute};\n//# sourceMappingURL=dom.js.map\n","var e={11(e,t){var r,n;Object.defineProperty(t,\"__esModule\",{value:!0}),t.AttributeAnnotationTargetType=t.BeanDependencyType=void 0,function(e){e[e.CONSTRUCTOR=0]=\"CONSTRUCTOR\",e[e.AUTOWIRE=1]=\"AUTOWIRE\"}(r||(t.BeanDependencyType=r={})),function(e){e[e.Class=0]=\"Class\",e[e.Method=1]=\"Method\"}(n||(t.AttributeAnnotationTargetType=n={}))},283(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},a=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Component=void 0;var u=r(693),l=r(284),c=r(350),p=r(682),d=r(589),f=function(e){function t(t){var r=e.call(this)||this;return r.displayed=!0,r.visible=!0,t&&r.setTemplate(t),r}return o(t,e),t.prototype.preConstructMethods=function(){this.createChildComponentsPreConstruct()},t.prototype.createChildComponentsFromTags=function(e,t){var r=this;(0,p.cloneNodeList)(e.childNodes).forEach(function(n){if(n instanceof HTMLElement){var o=r.createComponentFromElement(n,function(e){e.getGui()&&r.copyAttributesFromNode(n,e.getGui())},t);if(o){if(o.addItems&&n.children.length){r.createChildComponentsFromTags(n,t);var i=Array.prototype.slice.call(n.children);o.addItems(i)}r.swapComponentForNode(o,e,n)}else n.childNodes&&r.createChildComponentsFromTags(n,t)}})},t.prototype.createComponentFromElement=function(e,r,n){var o=e.nodeName,i=n?n[e.getAttribute(\"ref\")]:void 0,a=this.componentRegistry.getComponentClass(o);if(a){t.elementGettingCreated=e;var s=new a(i);return s.setParentComponent(this),this.createBean(s,null,r),s}return null},t.prototype.copyAttributesFromNode=function(e,t){(0,p.forEachAttributeInNamedNodeMap)(e.attributes,function(e,r){\"class\"!==e?t.setAttribute(e,r):(r||\"\").split(\" \").forEach(function(e){return t.classList.add(e)})})},t.prototype.swapComponentForNode=function(e,t,r){var n=e.getGui();t.replaceChild(n,r),this.addDestroyFunc(this.destroyBean.bind(this,e)),this.swapInComponentForRefSelectors(e,r)},t.prototype.swapInComponentForRefSelectors=function(e,t){var r=this;this.iterateOverQuerySelectors(function(n){r[n.attributeName]===t&&(r[n.attributeName]=e)})},t.prototype.iterateOverQuerySelectors=function(e){for(var t=Object.getPrototypeOf(this);null!=t;){var r=Reflect.get(t,c.Components.METADATA),n=(0,c.getFunctionName)(t.constructor);if(r&&Reflect.has(r,n)&&Reflect.has(r[n],\"querySelectors\"))r[n].querySelectors.forEach(function(t){return e(t)});t=Object.getPrototypeOf(t)}},t.prototype.createChildComponentsPreConstruct=function(){this.getGui()&&this.createChildComponentsFromTags(this.getGui())},t.prototype.activateTabIndex=function(e){e||(e=[]),e.length||e.push(this.getGui()),e.forEach(function(e){return e.setAttribute(\"tabindex\",(0).toString())})},t.prototype.wireQuerySelectors=function(){var e=this;if(this.eGui){var t=this;this.iterateOverQuerySelectors(function(r){var n=function(e){return t[r.attributeName]=e};if(r.refSelector&&e.getAttribute(\"ref\")===r.refSelector)n(e.eGui);else{var o=e.eGui.querySelector(r.querySelector);o&&n(o.Component||o)}})}},t.prototype.setGui=function(e){this.eGui=e},t.prototype.queryForHtmlElement=function(e){return this.eGui.querySelector(e)},t.prototype.queryForHtmlInputElement=function(e){return this.eGui.querySelector(e)},t.prototype.destroy=function(){this.parentComponent&&(this.parentComponent=void 0),e.prototype.destroy.call(this)},t.prototype.setTemplate=function(e,t){this.setTemplateFromElement(e,t)},t.prototype.setTemplateFromElement=function(e,t){this.eGui=e,this.eGui.Component=this,this.wireQuerySelectors(),this.getContext()&&this.createChildComponentsFromTags(this.getGui(),t)},t.prototype.getGui=function(){return this.eGui},t.prototype.getFocusableElement=function(){return this.eGui},t.prototype.getAriaElement=function(){return this.getFocusableElement()},t.prototype.setParentComponent=function(e){this.parentComponent=e},t.prototype.getParentComponent=function(){return this.parentComponent},t.prototype.appendChild=function(e,t){if(void 0===t&&(t=this.eGui),null!=e)if((0,p.isNodeOrHTMLElement)(e))t.appendChild(e);else{var r=e;t.appendChild(r.getGui())}},t.prototype.isDisplayed=function(){return this.displayed},t.prototype.setVisible=function(e,t){if(void 0===t&&(t={}),e!==this.visible){this.visible=e;var r=t.skipAriaHidden;(0,p.setVisible)(this.eGui,e,{skipAriaHidden:r})}},t.prototype.setDisplayed=function(e,r){if(void 0===r&&(r={}),e!==this.displayed){this.displayed=e;var n=r.skipAriaHidden;(0,p.setDisplayed)(this.eGui,e,{skipAriaHidden:n});var o={type:t.EVENT_DISPLAYED_CHANGED,visible:this.displayed};this.dispatchEvent(o)}},t.prototype.addGuiEventListener=function(e,t,r){var n=this;this.eGui.addEventListener(e,t,r),this.addDestroyFunc(function(){return n.eGui.removeEventListener(e,t)})},t.prototype.addCssClass=function(e){var t,r=this.getGui(),n=(e||\"\").split(\" \");null==r||(t=r.classList).add.apply(t,s([],a(n),!1))},t.prototype.removeCssClass=function(e){var t,r=this.getGui(),n=(e||\"\").split(\" \");null==r||(t=r.classList).remove.apply(t,s([],a(n),!1))},t.prototype.containsCssClass=function(e){var t=this.getGui();return!!t&&t.classList.contains(e)},t.prototype.addOrRemoveCssClass=function(e,t){var r=this;if(e){if(e.indexOf(\" \")>=0){var n=(e||\"\").split(\" \");if(n.length>1)return void n.forEach(function(e){return r.addOrRemoveCssClass(e,t)})}if(e.length){var o=this.getGui();o&&o.classList.toggle(e,t)}}},t.prototype.getAttribute=function(e){var t=this.getGui();return t?t.getAttribute(e):null},t.prototype.getRefElement=function(e){return this.queryForHtmlElement('[ref=\"'.concat(e,'\"]'))},t.EVENT_DISPLAYED_CHANGED=\"displayedChanged\",i([(0,d.AutoWired)(u.BEAN_NAME.COMPONENT_REGISTRY)],t.prototype,\"componentRegistry\",void 0),i([(0,d.PreConstruct)()],t.prototype,\"preConstructMethods\",null),t}(l.EventEmitter);t.Component=f},284(e,t,r){var n=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventEmitter=void 0,t.addSafePassiveEventListener=u;var o=r(589),i=r(693),a=r(642),s=function(){function e(){this.destroyFunctions=[],this.destroyed=!1}return e.prototype.getFrameWorkOverrides=function(){return this.frameWorkOverrides},e.prototype.createBean=function(e,t,r){return t?t.createBean(e):this.getContext().createBean(e),r&&r(e),e},e.prototype.destroyBean=function(e,t){return(t||this.getContext()).destroyBean(e)},e.prototype.destroyBeans=function(e,t){var r=this;return e&&e.forEach(function(e){return r.destroyBean(e,t)}),[]},e.prototype.destroy=function(){this.dispatchEvent({type:e.EVENT_DESTROYED}),this.destroyFunctions.forEach(function(e){return e()}),this.destroyFunctions.length=0,this.destroyed=!0},e.prototype.getContext=function(){return this.context},e.prototype.addEventListener=function(e,t){this.eventHandler||(this.eventHandler=new a.EventHandler),this.eventHandler.addEventListener(e,t)},e.prototype.removeEventListener=function(e,t){this.eventHandler&&this.eventHandler.removeEventListener(e,t)},e.prototype.dispatchEventAsync=function(e){var t=this;window.setTimeout(function(){return t.dispatchEvent(e)},0)},e.prototype.dispatchEvent=function(e){this.eventHandler&&this.eventHandler.dispatchEvent(e)},e.prototype.addListener=function(e,t,r){var n=this;if(!this.destroyed){e instanceof HTMLElement?u(e,t,r):e.addEventListener(t,r);var o=function(){return e.removeEventListener(t,r),null};return this.destroyFunctions.push(o),function(){return o(),n.destroyFunctions=n.destroyFunctions.filter(function(e){return e!==o}),null}}},e.prototype.isAlive=function(){return!this.destroyed},e.prototype.addDestroyFunc=function(e){this.isAlive()?this.destroyFunctions.push(e):e()},e.prototype.createManagedBean=function(e,t){var r=this.createBean(e,t);return this.addDestroyFunc(this.destroyBean.bind(this,e,t)),r},e.EVENT_DESTROYED=\"destroyed\",n([(0,o.AutoWired)(i.BEAN_NAME.EVENT_HANDLER)],e.prototype,\"eventHandler\",void 0),n([(0,o.AutoWired)(i.BEAN_NAME.OPTION_HANDLER)],e.prototype,\"optionsHandler\",void 0),n([(0,o.AutoWired)(i.BEAN_NAME.FRAME_WORK_OVERRIDES)],e.prototype,\"frameWorkOverrides\",void 0),n([(0,o.AutoWired)(\"context\")],e.prototype,\"context\",void 0),e}();function u(e,t,r){e&&e.addEventListener(t,r,void 0)}t.EventEmitter=s},350(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.Components=void 0,t.getFunctionName=n,t.queryAssignedNodes=function(e){return function(t,r,n){o(t,\"querySelectors\",{attributeName:r,querySelector:\"[ref=\".concat(e,\"]\"),refSelector:e})}},t.QuerySelector=function(e){void 0===e&&(e=null);return function(t,r,n){null!==e?\"number\"!=typeof n?o(t,\"querySelectors\",{attributeName:r,querySelector:e,refSelector:void 0}):console.error(\"QuerySelector should be on an attribute\"):console.error(\"QuerySelector should not be null\")}};var r={METADATA:\"COMPONENT_META_DATA\"};function n(e){if(e.name)return e.name}function o(e,t,o){var i=function(e,t){var n=Reflect.has(e,r.METADATA);n||Reflect.set(e,r.METADATA,{});var o=Reflect.has(e[r.METADATA],t);o||Reflect.set(e[r.METADATA],t,{});return Reflect.get(e[r.METADATA],t)}(e,n(e.constructor));i[t]||(i[t]=[]),i[t].push(o)}t.Components=r},363(e,t){var r=this&&this.__values||function(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&\"number\"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},n=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.values=function(e){if(e instanceof Set||e instanceof Map){var t=[];return e.forEach(function(e){return t.push(e)}),t}return Object.values(e)},t.exists=function(e,t){void 0===t&&(t=!1);return null!=e&&(\"\"!==e||t)},t.toStringOrNull=function(e){return null!=e&&\"function\"==typeof e.toString?e.toString():null},t.createArrayOfNumbers=function(e,t){for(var r=[],n=e;n<=t;n++)r.push(n);return r},t.traverseObject=function(e,t){var o,i;if(null==e)return;if(Array.isArray(e)){for(var a=0;a<e.length;a++)t(a.toString(),e[a]);return}try{for(var s=r(Object.entries(e)),u=s.next();!u.done;u=s.next()){var l=n(u.value,2);t(l[0],l[1])}}catch(e){o={error:e}}finally{try{u&&!u.done&&(i=s.return)&&i.call(s)}finally{if(o)throw o.error}}}},388(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.UserComponentHandler=void 0;var a=r(589),s=r(693),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.getComponentDetails=function(e,t,r,n){var o=this,i=this.getComponentMeta(e,t,r),a=i.componentName,u=i.frameworkComponent,l=i.jsComponent,c=function(e){var t=o.getBeanInstance(s.BEAN_NAME.USER_COMPONENT_REGISTRY).retrieve(e);t&&(l=t.componentFrameWork?void 0:t.component,u=t.componentFrameWork?t.component:void 0)};if(null!=a&&c(a),null==l&&null==u&&null!=n&&c(n),l||u){var p=null==l,d=l||u;return{componentFramework:p,componentClass:d,params:r,propertyName:t,newInstance:function(){return o.newInstance(d,p,t,r)}}}},t.prototype.getComponentMeta=function(e,t,r){var n=this,o=null,i=null,a=null;return function(e){if(\"string\"==typeof e)o=e;else if(null!=e&&!0!==e){n.getFrameWorkOverrides().isFrameworkComponent(e)?a=e:i=e}}(this.getComponent(e,t)),{componentName:o,frameworkComponent:a,jsComponent:i}},t.prototype.getComponent=function(e,t){},t.prototype.newInstance=function(e,t,r,n){var o,i=this.getBeanInstance(s.BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER),a=this.getBeanInstance(s.BEAN_NAME.COMPONENT_META_DATA_PROVIDER);if(t){var u=a.retrieve(r);o=i.wrap(e,u.mandatoryMethodList,u.optionalMethodList)}else o=new e;return this.initComponent(o,n),o},t.prototype.initComponent=function(e,t){if(this.context.createBean(e),null!=e.init)return e.init(t)},i([(0,a.AutoWired)(s.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstance\",void 0),t=i([(0,a.Bean)(s.BEAN_NAME.USER_COMPONENT_HANDLER)],t)}(r(284).EventEmitter);t.UserComponentHandler=u},408(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},a=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentMetadataProvider=void 0;var u=r(589),l=r(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.componentMetaData={},t}return o(t,e),t.prototype.retrieve=function(e){return this.componentMetaData[e]},i([(0,u.AutoWired)(l.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstanceByBeanName\",void 0),t=i([(0,u.Bean)(l.BEAN_NAME.COMPONENT_META_DATA_PROVIDER)],t)}(r(284).EventEmitter);t.ComponentMetadataProvider=c},530(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentUtility=void 0;var a=r(589),s=r(693),u=r(284),l=r(682),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.adaptFunction=function(e,t){var r=this.componentMetadataProvider.retrieve(e);return r&&r.functionAdapter?r.functionAdapter(t):null},t.prototype.adaptRendererFunction=function(e){return function(){function t(){}return t.prototype.getGui=function(){return this.eGui},t.prototype.init=function(t){var r=e(t),n=typeof r;this.eGui=\"string\"!==n&&\"number\"!==n&&\"boolean\"!==n?null!=r?r:(0,l.addTemplate)(\"<span></span>\"):(0,l.addTemplate)(\"<span>\"+r+\"</span>\")},t}()},t.prototype.doesImplementIComponent=function(e){return!!e&&(e.prototype&&\"getGui\"in e.prototype)},i([(0,a.AutoWired)(s.BEAN_NAME.COMPONENT_META_DATA_PROVIDER)],t.prototype,\"componentMetadataProvider\",void 0),t=i([(0,a.Bean)(s.BEAN_NAME.COMPONENT_UTILITY)],t)}(u.EventEmitter);t.ComponentUtility=c},589(e,t,r){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BeanDefinitionSymbol=void 0,t.Qualifier=function(e){return c({name:e})},t.AutoWired=function(e,t){return a(e,!1,t)},t.Bean=function(e){return s({componentType:\"bean\",beanName:e})},t.Optional=function(e,t){return a(e,!0,t)},t.PostConstruct=function(e){return function(e,t,r){var n,o=i(e,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PostConstructor is can use only to method\");return o.postConstruct&&(o.postConstruct=[]),null===(n=o.postConstruct)||void 0===n||n.push(t),r}},t.PreConstruct=function(e){return function(e,t,r){var n,o=i(e,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PreConstructor is can use only to method\");return o.preConstruct&&(o.preConstruct=[]),null===(n=o.preConstruct)||void 0===n||n.push(t),r}},t.PreDestroy=function(e){return function(e,t,r){var n=i(e,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PreDestroy is can use only to method\");return n.preDestroy||(n.preDestroy=[]),n.preDestroy.push(t),r}},t.WireFunction=a,t._getAttributeAnnotationsForMethod=u,t._getBeanDefinition=i,t._preinitAttributeAnnotationsForMethod=l,t.makeMethodAttributeAnnotation=function(e){return function(e,t,r){var n=u(i(e,\"prototype\"),t);n.targetDescriptor=r,l(n,r)}},t.makeMethodParameterAnnotation=c,t.makeRegisterAnnotation=s;var n=r(11),o=Symbol(\"BeanDefinition\");function i(e,t){var r;if((r=\"class\"===t||\"function\"==typeof e?e:\"prototype\"===t?e.constructor:Object.getPrototypeOf(e)).hasOwnProperty(o))return r[o];var n={uniqueId:Symbol(),className:\"\",beanName:\"\",componentTypes:[],dependencies:[],constructor:null,existInstance:null,preConstruct:[],postConstruct:[],preDestroy:[],attributeAnnotations:[]};return Object.defineProperty(r,o,{value:n,writable:!1}),n}function a(e,t,r){return function(o,a){var s=i(o,\"prototype\"),u=r&&r.lazy||!1;if(r&&r.name)s.dependencies.push({type:n.BeanDependencyType.AUTOWIRE,autowireField:a,autowireLazy:u,beanName:r.name,className:e,optional:t});else{if(\"string\"!=typeof a)throw new Error(\"property name must be string without beanName\");s.dependencies.push({type:n.BeanDependencyType.AUTOWIRE,autowireField:a,autowireLazy:u,beanName:e,className:e,optional:t})}}}function s(e){return function(t){var r=e.beanName||t.name,o=i(t,\"class\");return o.className=t.name,o.beanName=r,o.constructor=t,o.componentTypes.push(e.componentType),o.attributeAnnotations.push({targetType:n.AttributeAnnotationTargetType.Class,targetDescriptor:null}),t}}function u(e,t){var r=e.attributeAnnotations.find(function(e){return e.targetType===n.AttributeAnnotationTargetType.Method&&e.targetPropertyKey===t});return r||(r={targetType:n.AttributeAnnotationTargetType.Method,targetPropertyKey:t,targetDescriptor:void 0,parameters:void 0},e.attributeAnnotations.push(r)),r}function l(e,t){var r=t.value,n=Array(r.length);if(e.targetDescriptor=t,e.parameters){if(e.parameters.length!=r.length)for(var o=0;o<n.length;o++)e.parameters[o]||(e.parameters[o]=void 0)}else e.parameters=n}function c(e){return function(t,r,n){var o=u(i(t,\"prototype\"),r);o.parameters||(o.parameters=[]),o.parameters[n]={index:n,name:e.name}}}t.BeanDefinitionSymbol=o},631(e,t,r){Object.defineProperty(t,\"__esModule\",{value:!0}),t.Context=void 0;var n=r(589),o=r(693),i=r(363);var a=function(){function e(){this.beanWrappers={},this.destroyed=!1}return e.prototype.getBeanInstances=function(){return Object.values(this.beanWrappers)},e.prototype.registerBeanClasses=function(e,t){this.beanClasses=e,this.registerUserContextParams(t),this.createBeans();var r=this.getBeanInstances();this.wireBeans(r)},e.prototype.registerUserContextParams=function(e){this.userConfigurations=null!=e?e:{}},e.prototype.createBean=function(e,t){if(!e)throw Error(\"Can't wire to bean since it is null\");return this.wireBeans([e]),e},e.prototype.createBeans=function(){var e=this;this.beanClasses.forEach(function(t){var r=t[n.BeanDefinitionSymbol];if(r){var o=r.beanName,i=new t;e.beanWrappers[o]=i}})},e.prototype.wireBeans=function(e){this.autoWireBeans(e),this.methodWireBeans(e),this.callLifeCycleMethods(e,\"preConstruct\"),this.callLifeCycleMethods(e,\"postConstruct\")},e.prototype.autoWireBeans=function(e){var t=this;e.forEach(function(e){t.forEachMetaDataInHierarchyBeanDefinition(e,function(r,n){var i=r.dependencies;i&&i.forEach(function(r){if(r.autowireLazy)Object.defineProperty(e,r.autowireField,{get:function(){var e=t.getBeanInstance(n,r.beanName,r.optional);if(r.beanName===o.BEAN_NAME.BEANS&&(e=t.getBeanInstance.bind(t,n)),!e)throw new Error(\"Unknown beanName=\".concat(r.autowireField));return e},configurable:!1});else{var i=void 0;i=r.beanName===o.BEAN_NAME.BEANS?t.getBeanInstance.bind(t,n):t.getBeanInstance(n,r.beanName,r.optional),Object.defineProperty(e,r.autowireField,{value:i,configurable:!!i,writable:!1})}})})})},e.prototype.methodWireBeans=function(e){var t=this;e.forEach(function(e){t.forEachMetaDataInHierarchyBeanDefinition(e,function(r,n){r.attributeAnnotations.forEach(function(r){if(r.targetPropertyKey&&r.parameters){var o=t.getBeansForParameters(r.parameters,n);console.log(o),e[r.targetPropertyKey].apply(e)}})})})},e.prototype.getBeansForParameters=function(e,t){var r=this,n=[];return e&&(0,i.traverseObject)(e,function(e,o){if(o){var i=r.getBeanInstance(t,o.name);n[Number(o.index)]=i}}),n},e.prototype.getBeanInstance=function(e,t,r){if(void 0===r&&(r=!1),this.destroyed)return null;if(t===o.BEAN_NAME.CONTEXT)return n=this,{createBean:function(e){return n.createBean(e)},destroyBean:function(e){return n.destroyBean(e)},destroy:function(){n.destroy()}};var n;if(this.userConfigurations&&this.userConfigurations.hasOwnProperty(t))return this.userConfigurations[t];var i=this.beanWrappers[t];return i||(r||console.error(\"Component: unable to find bean reference \".concat(t,\" while initialising \").concat(e)),null)},e.prototype.callLifeCycleMethods=function(e,t){var r=this;e.forEach(function(e){return r.callLifeCycleMethodsOnBean(e,t)})},e.prototype.callLifeCycleMethodsOnBean=function(e,t,r){var n={};this.forEachMetaDataInHierarchyBeanDefinition(e,function(e){var o=e[t];o&&o.forEach(function(e){e!=r&&(n[e]=!0)})}),Object.keys(n).forEach(function(t){return e[t]()})},e.prototype.forEachMetaDataInHierarchyBeanDefinition=function(e,t){for(var r=Object.getPrototypeOf(e);null!=r;){var o=r.constructor;if(o.hasOwnProperty(n.BeanDefinitionSymbol))t(o[n.BeanDefinitionSymbol],this.getBeanName(o));r=Object.getPrototypeOf(r)}},e.prototype.getBeanName=function(e){if(e[n.BeanDefinitionSymbol]&&e[n.BeanDefinitionSymbol].beanName)return e[n.BeanDefinitionSymbol].beanName;var t=e.toString();return t.substring(9,t.indexOf(\"(\"))},e.prototype.getBean=function(e){return this.getBeanInstance(\"getBean\",e,!0)},e.prototype.destroy=function(){if(!this.destroyed){this.destroyed=!0;var e=this.getBeanInstances();this.destroyBeans(e),this.userConfigurations=null}},e.prototype.destroyBean=function(e){e&&this.destroyBeans([e])},e.prototype.destroyBeans=function(e){var t=this;return e?(e.forEach(function(e){t.callLifeCycleMethodsOnBean(e,\"preDestroy\",\"destroy\");var r=e;\"function\"==typeof r.destroy&&r.destroy()}),[]):[]},e.prototype.isDestroyed=function(){return this.destroyed},e}();t.Context=a},642(e,t,r){var n=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventHandler=void 0;var o=r(589),i=r(693),a=function(){function e(){this.allSyncListeners=new Map,this.allAsyncListeners=new Map,this.globalSyncListeners=new Set,this.globalAsyncListeners=new Set,this.asyncFunctionsQueue=[],this.scheduled=!1,this.firedEvents={}}return e.prototype.setBeans=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=null),this.optionHandler=e,t){var n=e.useAsyncEvents();this.addGlobalListener(t,n)}r&&this.addGlobalListener(r,!1)},e.prototype.getListeners=function(e,t,r){var n=t?this.allAsyncListeners:this.allSyncListeners,o=n.get(e);return!o&&r&&(o=new Set,n.set(e,o)),o},e.prototype.noRegisteredListenersExist=function(){return 0===this.allSyncListeners.size&&0===this.allAsyncListeners.size&&0===this.globalSyncListeners.size&&0===this.globalAsyncListeners.size},e.prototype.addEventListener=function(e,t,r){void 0===r&&(r=!1),this.getListeners(e,r,!0).add(t)},e.prototype.removeEventListener=function(e,t,r){void 0===r&&(r=!1);var n=this.getListeners(e,r,!1);n&&(n.delete(t),0===n.size&&(r?this.allAsyncListeners:this.allSyncListeners).delete(e))},e.prototype.addGlobalListener=function(e,t){void 0===t&&(t=!1),(t?this.globalAsyncListeners:this.globalSyncListeners).add(e)},e.prototype.removeGlobalListener=function(e,t){void 0===t&&(t=!1),(t?this.globalAsyncListeners:this.globalSyncListeners).delete(e)},e.prototype.dispatchEvent=function(e){var t=e;if(this.optionHandler){var r=this.optionHandler.api;t.api=r}this.dispatchToListeners(t,!0),this.dispatchToListeners(t,!1),this.firedEvents[t.type]=!0},e.prototype.dispatchEventOnce=function(e){this.firedEvents[e.type]||this.dispatchEvent(e)},e.prototype.dispatchToListeners=function(e,t){var r=this,n=e.type,o=new Set(this.getListeners(n,t,!1));o.size>0&&function(n){n.forEach(function(n){t?r.dispatchAsync(function(){return n(e)}):n(e)})}(o),new Set(t?this.globalAsyncListeners:this.globalSyncListeners).forEach(function(o){t?r.dispatchAsync(function(){return o(n,e)}):o(n,e)})},e.prototype.dispatchAsync=function(e){this.asyncFunctionsQueue.push(e),this.scheduled||(window.setTimeout(this.flushAsyncQueue.bind(this),0),this.scheduled=!0)},e.prototype.flushAsyncQueue=function(){this.scheduled=!1;var e=this.asyncFunctionsQueue.slice();this.asyncFunctionsQueue=[],e.forEach(function(e){return e()})},e=n([(0,o.Bean)(i.BEAN_NAME.EVENT_HANDLER)],e)}();t.EventHandler=a},661(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BaseComponentWrapper=void 0;var r=function(){function e(){}return e.prototype.wrap=function(e,t,r){var n=this;void 0===r&&(r=[]);var o=this.createWrapper(e);return t.forEach(function(e){n.createMethod(o,e,!0)}),r.forEach(function(e){n.createMethod(o,e,!1)}),o},e.prototype.createMethod=function(e,t,r){e.addMethod(t,this.createMethodProxy(e,t,r))},e.prototype.createMethodProxy=function(e,t,r){return function(){return e.hasMethod(t)?e.callMethod(t,arguments):(r&&console.warn(\"Framework component is missing the method \".concat(t,\"()\")),null)}},e}();t.BaseComponentWrapper=r},682(e,t,r){Object.defineProperty(t,\"__esModule\",{value:!0}),t.setDisplayed=function(e,t,r){void 0===r&&(r={});var o=r.skipAriaHidden;e.classList.toggle(\"comp-hidden\",!t),o||(0,n.setAriaHidden)(e,!t)},t.setVisible=function(e,t,r){void 0===r&&(r={});var o=r.skipAriaHidden;e.classList.toggle(\"comp-invisible\",!t),o||(0,n.setAriaHidden)(e,!t)},t.setDisabled=function(e,t){var r=\"disabled\",n=t?function(e){return e.setAttribute(r,\"\")}:function(e){return e.removeAttribute(r)};n(e),o(e.querySelectorAll(\"input\"),function(e){return n(e)})},t.forEachNodeInList=o,t.cloneNodeList=function(e){if(null==e)return[];var t=[];return o(e,function(e){return t.push(e)}),t},t.forEachAttributeInMap=function(e,t){if(!e)return;for(var r=0;r<e.length;r++){var n=e[r];t(n.name,n.value)}},t.toggleAttribute=function(e,t,r){null==r?e.removeAttribute(t):e.setAttribute(t,r.toString())},t.forEachAttributeInNamedNodeMap=function(e,t){if(!e)return;for(var r=0;r<e.length;r++){var n=e[r];t(n.name,n.value)}},t.isNodeOrHTMLElement=function(e){return e instanceof Node||e instanceof HTMLElement},t.clearElement=function(e){for(;e&&e.firstChild;)e.removeChild(e.firstChild)},t.setElementWidth=function(e,t){\"flex\"===t?(e.style.removeProperty(\"width\"),e.style.removeProperty(\"minWidth\"),e.style.removeProperty(\"maxWidth\"),e.style.flex=\"1 1 auto\"):i(e,t)},t.setFixedWidth=i,t.formatSize=a,t.addOrRemoveAttribute=function(e,t,r){null==r?e.removeAttribute(t):e.setAttribute(t,r.toString())},t.ensureDomOrder=function(e,t,r){if(r&&r.nextSibling===t)return;r?r.nextSibling?e.insertBefore(t,r.nextSibling):e.appendChild(t):e.firstChild&&e.firstChild!==t&&e.insertAdjacentElement(\"afterbegin\",t)},t.insertWithDomOrder=function(e,t,r){r?r.insertAdjacentElement(\"afterend\",t):e.firstChild?e.insertAdjacentElement(\"afterbegin\",t):e.appendChild(t)},t.setFixedHeight=function(e,t){t=a(t),e.style.height=t.toString(),e.style.maxHeight=t.toString(),e.style.minHeight=t.toString()},t.addTemplate=function(e){var t=document.createElement(\"div\");return t.innerHTML=(e||\"\").trim(),t.firstChild},t.removeFromParent=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)},t.getAbsoluteWidth=function(e){var t=s(e),r=t.marginLeft+t.marginRight;return Math.ceil(e.offsetWidth+r)},t.getAbsoluteHeight=function(e){var t=s(e),r=t.marginBottom+t.marginTop;return Math.ceil(e.offsetHeight+r)},t.getElementRectWithMargin=function(e){var t=e.getBoundingClientRect(),r=s(e),n=r.borderTopWidth,o=r.borderLeftWidth,i=r.borderRightWidth,a=r.borderBottomWidth,u=r.marginTop,l=r.marginBottom,c=r.marginLeft,p=r.marginRight;return{top:t.top+(null!=n?n:0)-(null!=u?u:0),left:t.left+(null!=o?o:0)-(null!=c?c:0),right:t.right+(null!=i?i:0)+(null!=p?p:0),bottom:t.bottom+(null!=a?a:0)+(null!=l?l:0),width:t.width+(null!=o?o:0)+(null!=i?i:0)+(null!=c?c:0)+(null!=p?p:0),height:t.height+(null!=n?n:0)+(null!=a?a:0)+(null!=u?u:0)+(null!=l?l:0),toJSON:function(){return 0},y:t.top+(null!=n?n:0)-(null!=u?u:0),x:t.left+(null!=o?o:0)-(null!=c?c:0)}},t.getElementRectWithOffset=function(e){var t=e.getBoundingClientRect(),r=s(e),n=r.borderTopWidth,o=r.borderLeftWidth,i=r.borderRightWidth,a=r.borderBottomWidth;return{top:t.top+(null!=n?n:0),left:t.left+(null!=o?o:0),right:t.right+(null!=i?i:0),bottom:t.bottom+(null!=a?a:0),width:t.width,height:t.height}},t.getElementSize=s;var n=r(777);function o(e,t){if(null!=e)for(var r=0;r<e.length;r++)t(e[r])}function i(e,t){t=a(t),e.style.width=t.toString(),e.style.maxWidth=t.toString(),e.style.minWidth=t.toString()}function a(e){return\"number\"==typeof e?\"\".concat(e,\"px\"):e}function s(e){var t=window.getComputedStyle(e),r=t.height,n=t.width,o=t.borderTopWidth,i=t.borderRightWidth,a=t.borderBottomWidth,s=t.borderLeftWidth,u=t.paddingTop,l=t.paddingRight,c=t.paddingBottom,p=t.paddingLeft,d=t.marginTop,f=t.marginRight,y=t.marginBottom,A=t.marginLeft,m=t.boxSizing;return{height:parseFloat(r),width:parseFloat(n),borderTopWidth:parseFloat(o),borderRightWidth:parseFloat(i),borderBottomWidth:parseFloat(a),borderLeftWidth:parseFloat(s),paddingTop:parseFloat(u),paddingRight:parseFloat(l),paddingBottom:parseFloat(c),paddingLeft:parseFloat(p),marginTop:parseFloat(d),marginRight:parseFloat(f),marginBottom:parseFloat(y),marginLeft:parseFloat(A),boxSizing:m}}},688(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},a=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentsRegistry=void 0;var u=r(589),l=r(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.componentsMappedByName={},t}return o(t,e),t.prototype.setupComponents=function(e){var t=this;e&&e.forEach(function(e){return t.addComponent(e)})},t.prototype.addComponent=function(e){var t=e.componentName,r=e.componentClass,n=e.template,o=t.toUpperCase();n&&(r.getTemplate=n),this.componentsMappedByName[o]=r},t.prototype.getComponentClass=function(e){return this.componentsMappedByName[e]},t=i([(0,u.Bean)(l.BEAN_NAME.COMPONENT_REGISTRY)],t)}(r(284).EventEmitter);t.ComponentsRegistry=c},693(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BEAN_NAME=void 0,t.BEAN_NAME={CONTEXT:\"context\",COMPONENT_REGISTRY:\"componentRegistry\",EVENT_HANDLER:\"eventHandler\",USER_COMPONENT_HANDLER:\"userComponentHandler\",POPUP_HANDLER:\"popupHandler\",OPTION_HANDLER:\"optionHandler\",USER_COMPONENT_REGISTRY:\"userComponentRegistry\",COMPONENT_META_DATA_PROVIDER:\"componentMetaDataProvider\",COMPONENT_UTILITY:\"componentUtility\",FRAME_WORK_COMPONENT_WRAPPER:\"frameworkComponentWrapper\",FRAME_WORK_OVERRIDES:\"frameWorkOverrides\",BEANS:\"lookupBeanInstances\"}},777(e,t){function r(e){return\"aria-\".concat(e)}function n(e,t,r){null==r||\"\"==r?i(e,t):o(e,t,r)}function o(e,t,n){e.setAttribute(r(t),n.toString())}function i(e,t){e.removeAttribute(r(t))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.ariaAttributeName=r,t.toggleAriaAttribute=n,t.addAriaAttribute=o,t.removeAriaAttribute=i,t.setAriaRole=function(e,t){t?e.setAttribute(\"role\",t):e.removeAttribute(\"role\")},t.setAriaActiveDescendant=function(e,t){n(e,\"activedescendant\",t)},t.setAriaAtomic=function(e,t){n(e,\"atomic\",t)},t.setAriaAutocomplete=function(e,t){n(e,\"autocomplete\",t)},t.setAriaBraillelabel=function(e,t){n(e,\"braillelabel\",t)},t.setAriaBrailleroledescription=function(e,t){n(e,\"brailleroledescription\",t)},t.setAriaBusy=function(e,t){n(e,\"busy\",t)},t.setAriaChecked=function(e,t){n(e,\"checked\",t)},t.setAriaColCount=function(e,t){n(e,\"colcount\",t)},t.setAriaColIndex=function(e,t){n(e,\"colindex\",t)},t.setAriaColIndexText=function(e,t){n(e,\"colindextext\",t)},t.setAriaColSpan=function(e,t){n(e,\"colspan\",t)},t.setAriaControls=function(e,t){n(e,\"controls\",t)},t.setAriaCurrent=function(e,t){n(e,\"current\",t)},t.setAriaDescribedBy=function(e,t){n(e,\"describedby\",t)},t.setAriaDescription=function(e,t){n(e,\"description\",t)},t.setAriaDetails=function(e,t){n(e,\"details\",t)},t.setAriaDisabled=function(e,t){n(e,\"disabled\",t)},t.setAriaErrorMessage=function(e,t){n(e,\"errormessage\",t)},t.setAriaExpanded=function(e,t){n(e,\"expanded\",t)},t.setAriaFlowTo=function(e,t){n(e,\"flowto\",t)},t.setAriaHasPopUp=function(e,t){n(e,\"haspopup\",t)},t.setAriaHidden=function(e,t){n(e,\"hidden\",t)},t.setAriaInvalid=function(e,t){n(e,\"invalid\",t)},t.setAriaKeyShortCuts=function(e,t){n(e,\"keyshortcuts\",t)},t.setAriaLabel=function(e,t){n(e,\"label\",t)},t.setAriaLabelledBy=function(e,t){n(e,\"labelledby\",t)},t.setAriaLevel=function(e,t){n(e,\"level\",t)},t.setAriaLive=function(e,t){n(e,\"live\",t)},t.setAriaModal=function(e,t){n(e,\"modal\",t)},t.setAriaMultiLine=function(e,t){n(e,\"multiline\",t)},t.setAriaMultiSelectable=function(e,t){n(e,\"multiselectable\",t)},t.setAriaOrientation=function(e,t){n(e,\"orientation\",t)},t.setAriaPlaceHolder=function(e,t){n(e,\"placeholder\",t)},t.setAriaPosInSet=function(e,t){n(e,\"posinset\",t)},t.setAriaPressed=function(e,t){n(e,\"pressed\",t)},t.setAriaReadOnly=function(e,t){n(e,\"readonly\",t)},t.setAriaRelevant=function(e,t){n(e,\"relevant\",t)},t.setAriaRequired=function(e,t){n(e,\"required\",t)},t.setAriaRoleDescription=function(e,t){n(e,\"roledescription\",t)},t.setAriaRowCount=function(e,t){n(e,\"rowcount\",t)},t.setAriaRowIndex=function(e,t){n(e,\"rowindex\",t)},t.setAriaRowIndexText=function(e,t){n(e,\"rowindextext\",t)},t.setAriaRowSpan=function(e,t){n(e,\"rowspan\",t)},t.setAriaSelected=function(e,t){n(e,\"selected\",t)},t.setAriaSetSize=function(e,t){n(e,\"setsize\",t)},t.setAriaSort=function(e,t){n(e,\"sort\",t)},t.setAriaValueMax=function(e,t){n(e,\"valuemax\",t)},t.setAriaValueMin=function(e,t){n(e,\"valuemin\",t)},t.setAriaValueNow=function(e,t){n(e,\"valuenow\",t)},t.setAriaValueText=function(e,t){n(e,\"valuetext\",t)}},825(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.VanillaFrameWorkOverrider=void 0;var r=function(){function e(){this.renderingEngine=\"vanilla\"}return e.prototype.frameworkComponent=function(e,t){return null},e.prototype.isFrameworkComponent=function(e){return!1},e}();t.VanillaFrameWorkOverrider=r},970(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},a=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.UserComponentRegistry=void 0;var u=r(589),l=r(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.defaultComp={},t.jsComponents={},t}return o(t,e),t.prototype.registerDefaultComponent=function(e,t){this.defaultComp[e]||(this.defaultComp[e]=t)},t.prototype.registerJSComponent=function(e,t){this.jsComponents[e]=t},t.prototype.retrieve=function(e){var t=function(e,t){return{componentFrameWork:t,component:e}},r=this.getFrameWorkOverrides().frameworkComponent(e,this.userComponent);if(null!=r)return t(r,!0);var n=this.jsComponents[e];if(n)return t(n,this.getFrameWorkOverrides().isFrameworkComponent(n));var o=this.defaultComp[e];return o?t(o,!1):null},t=i([(0,u.Bean)(l.BEAN_NAME.USER_COMPONENT_REGISTRY)],t)}(r(284).EventEmitter);t.UserComponentRegistry=c}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,r),i.exports}var n={};(()=>{var e=n;Object.defineProperty(e,\"__esModule\",{value:!0}),e.setAriaPressed=e.setAriaPosInSet=e.setAriaPlaceHolder=e.setAriaOrientation=e.setAriaMultiSelectable=e.setAriaMultiLine=e.setAriaModal=e.setAriaLive=e.setAriaLevel=e.setAriaLabelledBy=e.setAriaLabel=e.setAriaKeyShortCuts=e.setAriaInvalid=e.setAriaHidden=e.setAriaHasPopUp=e.setAriaFlowTo=e.setAriaExpanded=e.setAriaErrorMessage=e.setAriaDisabled=e.setAriaDetails=e.setAriaDescription=e.setAriaDescribedBy=e.setAriaCurrent=e.setAriaControls=e.setAriaColSpan=e.setAriaColIndexText=e.setAriaColIndex=e.setAriaColCount=e.setAriaChecked=e.setAriaBusy=e.setAriaBrailleroledescription=e.setAriaBraillelabel=e.setAriaAutocomplete=e.setAriaAtomic=e.setAriaActiveDescendant=e.setAriaRole=e.removeAriaAttribute=e.addAriaAttribute=e.toggleAriaAttribute=e.ariaAttributeName=e.values=e.traverseObject=e.toStringOrNull=e.exists=e.createArrayOfNumbers=e.queryAssignedNodes=e.getFunctionName=e.QuerySelector=e.Components=e.Context=void 0,e.BaseComponentWrapper=e.ComponentUtility=e.ComponentMetadataProvider=e.EventHandler=e.addSafePassiveEventListener=e.EventEmitter=e.BEAN_NAME=e.UserComponentRegistry=e.UserComponentHandler=e.ComponentsRegistry=e.Component=e.getElementSize=e.getElementRectWithOffset=e.getElementRectWithMargin=e.getAbsoluteHeight=e.getAbsoluteWidth=e.removeFromParent=e.addTemplate=e.setFixedHeight=e.insertWithDomOrder=e.ensureDomOrder=e.addOrRemoveAttribute=e.formatSize=e.setFixedWidth=e.setElementWidth=e.clearElement=e.isNodeOrHTMLElement=e.forEachAttributeInNamedNodeMap=e.toggleAttribute=e.forEachAttributeInMap=e.cloneNodeList=e.forEachNodeInList=e.setDisabled=e.setVisible=e.setDisplayed=e.setAriaValueText=e.setAriaValueNow=e.setAriaValueMin=e.setAriaValueMax=e.setAriaSort=e.setAriaSetSize=e.setAriaSelected=e.setAriaRowSpan=e.setAriaRowIndexText=e.setAriaRowIndex=e.setAriaRowCount=e.setAriaRoleDescription=e.setAriaRequired=e.setAriaRelevant=e.setAriaReadOnly=void 0,e.BeanDependencyType=e.AttributeAnnotationTargetType=e.BeanDefinitionSymbol=e.makeRegisterAnnotation=e.makeMethodParameterAnnotation=e.makeMethodAttributeAnnotation=e._preinitAttributeAnnotationsForMethod=e._getBeanDefinition=e._getAttributeAnnotationsForMethod=e.WireFunction=e.PreDestroy=e.PreConstruct=e.PostConstruct=e.Optional=e.Bean=e.AutoWired=e.Qualifier=e.VanillaFrameWorkOverrider=void 0;var t=r(631);Object.defineProperty(e,\"Context\",{enumerable:!0,get:function(){return t.Context}});var o=r(350);Object.defineProperty(e,\"Components\",{enumerable:!0,get:function(){return o.Components}}),Object.defineProperty(e,\"QuerySelector\",{enumerable:!0,get:function(){return o.QuerySelector}}),Object.defineProperty(e,\"getFunctionName\",{enumerable:!0,get:function(){return o.getFunctionName}}),Object.defineProperty(e,\"queryAssignedNodes\",{enumerable:!0,get:function(){return o.queryAssignedNodes}});var i=r(363);Object.defineProperty(e,\"createArrayOfNumbers\",{enumerable:!0,get:function(){return i.createArrayOfNumbers}}),Object.defineProperty(e,\"exists\",{enumerable:!0,get:function(){return i.exists}}),Object.defineProperty(e,\"toStringOrNull\",{enumerable:!0,get:function(){return i.toStringOrNull}}),Object.defineProperty(e,\"traverseObject\",{enumerable:!0,get:function(){return i.traverseObject}}),Object.defineProperty(e,\"values\",{enumerable:!0,get:function(){return i.values}});var a=r(777);Object.defineProperty(e,\"ariaAttributeName\",{enumerable:!0,get:function(){return a.ariaAttributeName}}),Object.defineProperty(e,\"toggleAriaAttribute\",{enumerable:!0,get:function(){return a.toggleAriaAttribute}}),Object.defineProperty(e,\"addAriaAttribute\",{enumerable:!0,get:function(){return a.addAriaAttribute}}),Object.defineProperty(e,\"removeAriaAttribute\",{enumerable:!0,get:function(){return a.removeAriaAttribute}}),Object.defineProperty(e,\"setAriaRole\",{enumerable:!0,get:function(){return a.setAriaRole}}),Object.defineProperty(e,\"setAriaActiveDescendant\",{enumerable:!0,get:function(){return a.setAriaActiveDescendant}}),Object.defineProperty(e,\"setAriaAtomic\",{enumerable:!0,get:function(){return a.setAriaAtomic}}),Object.defineProperty(e,\"setAriaAutocomplete\",{enumerable:!0,get:function(){return a.setAriaAutocomplete}}),Object.defineProperty(e,\"setAriaBraillelabel\",{enumerable:!0,get:function(){return a.setAriaBraillelabel}}),Object.defineProperty(e,\"setAriaBrailleroledescription\",{enumerable:!0,get:function(){return a.setAriaBrailleroledescription}}),Object.defineProperty(e,\"setAriaBusy\",{enumerable:!0,get:function(){return a.setAriaBusy}}),Object.defineProperty(e,\"setAriaChecked\",{enumerable:!0,get:function(){return a.setAriaChecked}}),Object.defineProperty(e,\"setAriaColCount\",{enumerable:!0,get:function(){return a.setAriaColCount}}),Object.defineProperty(e,\"setAriaColIndex\",{enumerable:!0,get:function(){return a.setAriaColIndex}}),Object.defineProperty(e,\"setAriaColIndexText\",{enumerable:!0,get:function(){return a.setAriaColIndexText}}),Object.defineProperty(e,\"setAriaColSpan\",{enumerable:!0,get:function(){return a.setAriaColSpan}}),Object.defineProperty(e,\"setAriaControls\",{enumerable:!0,get:function(){return a.setAriaControls}}),Object.defineProperty(e,\"setAriaCurrent\",{enumerable:!0,get:function(){return a.setAriaCurrent}}),Object.defineProperty(e,\"setAriaDescribedBy\",{enumerable:!0,get:function(){return a.setAriaDescribedBy}}),Object.defineProperty(e,\"setAriaDescription\",{enumerable:!0,get:function(){return a.setAriaDescription}}),Object.defineProperty(e,\"setAriaDetails\",{enumerable:!0,get:function(){return a.setAriaDetails}}),Object.defineProperty(e,\"setAriaDisabled\",{enumerable:!0,get:function(){return a.setAriaDisabled}}),Object.defineProperty(e,\"setAriaErrorMessage\",{enumerable:!0,get:function(){return a.setAriaErrorMessage}}),Object.defineProperty(e,\"setAriaExpanded\",{enumerable:!0,get:function(){return a.setAriaExpanded}}),Object.defineProperty(e,\"setAriaFlowTo\",{enumerable:!0,get:function(){return a.setAriaFlowTo}}),Object.defineProperty(e,\"setAriaHasPopUp\",{enumerable:!0,get:function(){return a.setAriaHasPopUp}}),Object.defineProperty(e,\"setAriaHidden\",{enumerable:!0,get:function(){return a.setAriaHidden}}),Object.defineProperty(e,\"setAriaInvalid\",{enumerable:!0,get:function(){return a.setAriaInvalid}}),Object.defineProperty(e,\"setAriaKeyShortCuts\",{enumerable:!0,get:function(){return a.setAriaKeyShortCuts}}),Object.defineProperty(e,\"setAriaLabel\",{enumerable:!0,get:function(){return a.setAriaLabel}}),Object.defineProperty(e,\"setAriaLabelledBy\",{enumerable:!0,get:function(){return a.setAriaLabelledBy}}),Object.defineProperty(e,\"setAriaLevel\",{enumerable:!0,get:function(){return a.setAriaLevel}}),Object.defineProperty(e,\"setAriaLive\",{enumerable:!0,get:function(){return a.setAriaLive}}),Object.defineProperty(e,\"setAriaModal\",{enumerable:!0,get:function(){return a.setAriaModal}}),Object.defineProperty(e,\"setAriaMultiLine\",{enumerable:!0,get:function(){return a.setAriaMultiLine}}),Object.defineProperty(e,\"setAriaMultiSelectable\",{enumerable:!0,get:function(){return a.setAriaMultiSelectable}}),Object.defineProperty(e,\"setAriaOrientation\",{enumerable:!0,get:function(){return a.setAriaOrientation}}),Object.defineProperty(e,\"setAriaPlaceHolder\",{enumerable:!0,get:function(){return a.setAriaPlaceHolder}}),Object.defineProperty(e,\"setAriaPosInSet\",{enumerable:!0,get:function(){return a.setAriaPosInSet}}),Object.defineProperty(e,\"setAriaPressed\",{enumerable:!0,get:function(){return a.setAriaPressed}}),Object.defineProperty(e,\"setAriaReadOnly\",{enumerable:!0,get:function(){return a.setAriaReadOnly}}),Object.defineProperty(e,\"setAriaRelevant\",{enumerable:!0,get:function(){return a.setAriaRelevant}}),Object.defineProperty(e,\"setAriaRequired\",{enumerable:!0,get:function(){return a.setAriaRequired}}),Object.defineProperty(e,\"setAriaRoleDescription\",{enumerable:!0,get:function(){return a.setAriaRoleDescription}}),Object.defineProperty(e,\"setAriaRowCount\",{enumerable:!0,get:function(){return a.setAriaRowCount}}),Object.defineProperty(e,\"setAriaRowIndex\",{enumerable:!0,get:function(){return a.setAriaRowIndex}}),Object.defineProperty(e,\"setAriaRowIndexText\",{enumerable:!0,get:function(){return a.setAriaRowIndexText}}),Object.defineProperty(e,\"setAriaRowSpan\",{enumerable:!0,get:function(){return a.setAriaRowSpan}}),Object.defineProperty(e,\"setAriaSelected\",{enumerable:!0,get:function(){return a.setAriaSelected}}),Object.defineProperty(e,\"setAriaSetSize\",{enumerable:!0,get:function(){return a.setAriaSetSize}}),Object.defineProperty(e,\"setAriaSort\",{enumerable:!0,get:function(){return a.setAriaSort}}),Object.defineProperty(e,\"setAriaValueMax\",{enumerable:!0,get:function(){return a.setAriaValueMax}}),Object.defineProperty(e,\"setAriaValueMin\",{enumerable:!0,get:function(){return a.setAriaValueMin}}),Object.defineProperty(e,\"setAriaValueNow\",{enumerable:!0,get:function(){return a.setAriaValueNow}}),Object.defineProperty(e,\"setAriaValueText\",{enumerable:!0,get:function(){return a.setAriaValueText}});var s=r(682);Object.defineProperty(e,\"setDisplayed\",{enumerable:!0,get:function(){return s.setDisplayed}}),Object.defineProperty(e,\"setVisible\",{enumerable:!0,get:function(){return s.setVisible}}),Object.defineProperty(e,\"setDisabled\",{enumerable:!0,get:function(){return s.setDisabled}}),Object.defineProperty(e,\"forEachNodeInList\",{enumerable:!0,get:function(){return s.forEachNodeInList}}),Object.defineProperty(e,\"cloneNodeList\",{enumerable:!0,get:function(){return s.cloneNodeList}}),Object.defineProperty(e,\"forEachAttributeInMap\",{enumerable:!0,get:function(){return s.forEachAttributeInMap}}),Object.defineProperty(e,\"toggleAttribute\",{enumerable:!0,get:function(){return s.toggleAttribute}}),Object.defineProperty(e,\"forEachAttributeInNamedNodeMap\",{enumerable:!0,get:function(){return s.forEachAttributeInNamedNodeMap}}),Object.defineProperty(e,\"isNodeOrHTMLElement\",{enumerable:!0,get:function(){return s.isNodeOrHTMLElement}}),Object.defineProperty(e,\"clearElement\",{enumerable:!0,get:function(){return s.clearElement}}),Object.defineProperty(e,\"setElementWidth\",{enumerable:!0,get:function(){return s.setElementWidth}}),Object.defineProperty(e,\"setFixedWidth\",{enumerable:!0,get:function(){return s.setFixedWidth}}),Object.defineProperty(e,\"formatSize\",{enumerable:!0,get:function(){return s.formatSize}}),Object.defineProperty(e,\"addOrRemoveAttribute\",{enumerable:!0,get:function(){return s.addOrRemoveAttribute}}),Object.defineProperty(e,\"ensureDomOrder\",{enumerable:!0,get:function(){return s.ensureDomOrder}}),Object.defineProperty(e,\"insertWithDomOrder\",{enumerable:!0,get:function(){return s.insertWithDomOrder}}),Object.defineProperty(e,\"setFixedHeight\",{enumerable:!0,get:function(){return s.setFixedHeight}}),Object.defineProperty(e,\"addTemplate\",{enumerable:!0,get:function(){return s.addTemplate}}),Object.defineProperty(e,\"removeFromParent\",{enumerable:!0,get:function(){return s.removeFromParent}}),Object.defineProperty(e,\"getAbsoluteWidth\",{enumerable:!0,get:function(){return s.getAbsoluteWidth}}),Object.defineProperty(e,\"getAbsoluteHeight\",{enumerable:!0,get:function(){return s.getAbsoluteHeight}}),Object.defineProperty(e,\"getElementRectWithMargin\",{enumerable:!0,get:function(){return s.getElementRectWithMargin}}),Object.defineProperty(e,\"getElementRectWithOffset\",{enumerable:!0,get:function(){return s.getElementRectWithOffset}}),Object.defineProperty(e,\"getElementSize\",{enumerable:!0,get:function(){return s.getElementSize}});var u=r(283);Object.defineProperty(e,\"Component\",{enumerable:!0,get:function(){return u.Component}});var l=r(688);Object.defineProperty(e,\"ComponentsRegistry\",{enumerable:!0,get:function(){return l.ComponentsRegistry}});var c=r(388);Object.defineProperty(e,\"UserComponentHandler\",{enumerable:!0,get:function(){return c.UserComponentHandler}});var p=r(970);Object.defineProperty(e,\"UserComponentRegistry\",{enumerable:!0,get:function(){return p.UserComponentRegistry}});var d=r(693);Object.defineProperty(e,\"BEAN_NAME\",{enumerable:!0,get:function(){return d.BEAN_NAME}});var f=r(284);Object.defineProperty(e,\"EventEmitter\",{enumerable:!0,get:function(){return f.EventEmitter}}),Object.defineProperty(e,\"addSafePassiveEventListener\",{enumerable:!0,get:function(){return f.addSafePassiveEventListener}});var y=r(642);Object.defineProperty(e,\"EventHandler\",{enumerable:!0,get:function(){return y.EventHandler}});var A=r(408);Object.defineProperty(e,\"ComponentMetadataProvider\",{enumerable:!0,get:function(){return A.ComponentMetadataProvider}});var m=r(530);Object.defineProperty(e,\"ComponentUtility\",{enumerable:!0,get:function(){return m.ComponentUtility}});var h=r(661);Object.defineProperty(e,\"BaseComponentWrapper\",{enumerable:!0,get:function(){return h.BaseComponentWrapper}});var b=r(825);Object.defineProperty(e,\"VanillaFrameWorkOverrider\",{enumerable:!0,get:function(){return b.VanillaFrameWorkOverrider}});var g=r(589);Object.defineProperty(e,\"Qualifier\",{enumerable:!0,get:function(){return g.Qualifier}}),Object.defineProperty(e,\"AutoWired\",{enumerable:!0,get:function(){return g.AutoWired}}),Object.defineProperty(e,\"Bean\",{enumerable:!0,get:function(){return g.Bean}}),Object.defineProperty(e,\"Optional\",{enumerable:!0,get:function(){return g.Optional}}),Object.defineProperty(e,\"PostConstruct\",{enumerable:!0,get:function(){return g.PostConstruct}}),Object.defineProperty(e,\"PreConstruct\",{enumerable:!0,get:function(){return g.PreConstruct}}),Object.defineProperty(e,\"PreDestroy\",{enumerable:!0,get:function(){return g.PreDestroy}}),Object.defineProperty(e,\"WireFunction\",{enumerable:!0,get:function(){return g.WireFunction}}),Object.defineProperty(e,\"_getAttributeAnnotationsForMethod\",{enumerable:!0,get:function(){return g._getAttributeAnnotationsForMethod}}),Object.defineProperty(e,\"_getBeanDefinition\",{enumerable:!0,get:function(){return g._getBeanDefinition}}),Object.defineProperty(e,\"_preinitAttributeAnnotationsForMethod\",{enumerable:!0,get:function(){return g._preinitAttributeAnnotationsForMethod}}),Object.defineProperty(e,\"makeMethodAttributeAnnotation\",{enumerable:!0,get:function(){return g.makeMethodAttributeAnnotation}}),Object.defineProperty(e,\"makeMethodParameterAnnotation\",{enumerable:!0,get:function(){return g.makeMethodParameterAnnotation}}),Object.defineProperty(e,\"makeRegisterAnnotation\",{enumerable:!0,get:function(){return g.makeRegisterAnnotation}}),Object.defineProperty(e,\"BeanDefinitionSymbol\",{enumerable:!0,get:function(){return g.BeanDefinitionSymbol}});var v=r(11);Object.defineProperty(e,\"AttributeAnnotationTargetType\",{enumerable:!0,get:function(){return v.AttributeAnnotationTargetType}}),Object.defineProperty(e,\"BeanDependencyType\",{enumerable:!0,get:function(){return v.BeanDependencyType}})})();const o=n.AttributeAnnotationTargetType,i=n.AutoWired,a=n.BEAN_NAME,s=n.BaseComponentWrapper,u=n.Bean,l=n.BeanDefinitionSymbol,c=n.BeanDependencyType,p=n.Component,d=n.ComponentMetadataProvider,f=n.ComponentUtility,y=n.Components,A=n.ComponentsRegistry,m=n.Context,h=n.EventEmitter,b=n.EventHandler,g=n.Optional,v=n.PostConstruct,O=n.PreConstruct,E=n.PreDestroy,C=n.Qualifier,P=n.QuerySelector,_=n.UserComponentHandler,N=n.UserComponentRegistry,M=n.VanillaFrameWorkOverrider,j=n.WireFunction,R=n.__esModule,S=n._getAttributeAnnotationsForMethod,B=n._getBeanDefinition,T=n._preinitAttributeAnnotationsForMethod,D=n.addAriaAttribute,w=n.addOrRemoveAttribute,x=n.addSafePassiveEventListener,L=n.addTemplate,F=n.ariaAttributeName,W=n.clearElement,I=n.cloneNodeList,H=n.createArrayOfNumbers,k=n.ensureDomOrder,V=n.exists,G=n.forEachAttributeInMap,U=n.forEachAttributeInNamedNodeMap,z=n.forEachNodeInList,q=n.formatSize,Q=n.getAbsoluteHeight,K=n.getAbsoluteWidth,Y=n.getElementRectWithMargin,J=n.getElementRectWithOffset,X=n.getElementSize,Z=n.getFunctionName,$=n.insertWithDomOrder,ee=n.isNodeOrHTMLElement,te=n.makeMethodAttributeAnnotation,re=n.makeMethodParameterAnnotation,ne=n.makeRegisterAnnotation,oe=n.queryAssignedNodes,ie=n.removeAriaAttribute,ae=n.removeFromParent,se=n.setAriaActiveDescendant,ue=n.setAriaAtomic,le=n.setAriaAutocomplete,ce=n.setAriaBraillelabel,pe=n.setAriaBrailleroledescription,de=n.setAriaBusy,fe=n.setAriaChecked,ye=n.setAriaColCount,Ae=n.setAriaColIndex,me=n.setAriaColIndexText,he=n.setAriaColSpan,be=n.setAriaControls,ge=n.setAriaCurrent,ve=n.setAriaDescribedBy,Oe=n.setAriaDescription,Ee=n.setAriaDetails,Ce=n.setAriaDisabled,Pe=n.setAriaErrorMessage,_e=n.setAriaExpanded,Ne=n.setAriaFlowTo,Me=n.setAriaHasPopUp,je=n.setAriaHidden,Re=n.setAriaInvalid,Se=n.setAriaKeyShortCuts,Be=n.setAriaLabel,Te=n.setAriaLabelledBy,De=n.setAriaLevel,we=n.setAriaLive,xe=n.setAriaModal,Le=n.setAriaMultiLine,Fe=n.setAriaMultiSelectable,We=n.setAriaOrientation,Ie=n.setAriaPlaceHolder,He=n.setAriaPosInSet,ke=n.setAriaPressed,Ve=n.setAriaReadOnly,Ge=n.setAriaRelevant,Ue=n.setAriaRequired,ze=n.setAriaRole,qe=n.setAriaRoleDescription,Qe=n.setAriaRowCount,Ke=n.setAriaRowIndex,Ye=n.setAriaRowIndexText,Je=n.setAriaRowSpan,Xe=n.setAriaSelected,Ze=n.setAriaSetSize,$e=n.setAriaSort,et=n.setAriaValueMax,tt=n.setAriaValueMin,rt=n.setAriaValueNow,nt=n.setAriaValueText,ot=n.setDisabled,it=n.setDisplayed,at=n.setElementWidth,st=n.setFixedHeight,ut=n.setFixedWidth,lt=n.setVisible,ct=n.toStringOrNull,pt=n.toggleAriaAttribute,dt=n.toggleAttribute,ft=n.traverseObject,yt=n.values;export{o as AttributeAnnotationTargetType,i as AutoWired,a as BEAN_NAME,s as BaseComponentWrapper,u as Bean,l as BeanDefinitionSymbol,c as BeanDependencyType,p as Component,d as ComponentMetadataProvider,f as ComponentUtility,y as Components,A as ComponentsRegistry,m as Context,h as EventEmitter,b as EventHandler,g as Optional,v as PostConstruct,O as PreConstruct,E as PreDestroy,C as Qualifier,P as QuerySelector,_ as UserComponentHandler,N as UserComponentRegistry,M as VanillaFrameWorkOverrider,j as WireFunction,R as __esModule,S as _getAttributeAnnotationsForMethod,B as _getBeanDefinition,T as _preinitAttributeAnnotationsForMethod,D as addAriaAttribute,w as addOrRemoveAttribute,x as addSafePassiveEventListener,L as addTemplate,F as ariaAttributeName,W as clearElement,I as cloneNodeList,H as createArrayOfNumbers,k as ensureDomOrder,V as exists,G as forEachAttributeInMap,U as forEachAttributeInNamedNodeMap,z as forEachNodeInList,q as formatSize,Q as getAbsoluteHeight,K as getAbsoluteWidth,Y as getElementRectWithMargin,J as getElementRectWithOffset,X as getElementSize,Z as getFunctionName,$ as insertWithDomOrder,ee as isNodeOrHTMLElement,te as makeMethodAttributeAnnotation,re as makeMethodParameterAnnotation,ne as makeRegisterAnnotation,oe as queryAssignedNodes,ie as removeAriaAttribute,ae as removeFromParent,se as setAriaActiveDescendant,ue as setAriaAtomic,le as setAriaAutocomplete,ce as setAriaBraillelabel,pe as setAriaBrailleroledescription,de as setAriaBusy,fe as setAriaChecked,ye as setAriaColCount,Ae as setAriaColIndex,me as setAriaColIndexText,he as setAriaColSpan,be as setAriaControls,ge as setAriaCurrent,ve as setAriaDescribedBy,Oe as setAriaDescription,Ee as setAriaDetails,Ce as setAriaDisabled,Pe as setAriaErrorMessage,_e as setAriaExpanded,Ne as setAriaFlowTo,Me as setAriaHasPopUp,je as setAriaHidden,Re as setAriaInvalid,Se as setAriaKeyShortCuts,Be as setAriaLabel,Te as setAriaLabelledBy,De as setAriaLevel,we as setAriaLive,xe as setAriaModal,Le as setAriaMultiLine,Fe as setAriaMultiSelectable,We as setAriaOrientation,Ie as setAriaPlaceHolder,He as setAriaPosInSet,ke as setAriaPressed,Ve as setAriaReadOnly,Ge as setAriaRelevant,Ue as setAriaRequired,ze as setAriaRole,qe as setAriaRoleDescription,Qe as setAriaRowCount,Ke as setAriaRowIndex,Ye as setAriaRowIndexText,Je as setAriaRowSpan,Xe as setAriaSelected,Ze as setAriaSetSize,$e as setAriaSort,et as setAriaValueMax,tt as setAriaValueMin,rt as setAriaValueNow,nt as setAriaValueText,ot as setDisabled,it as setDisplayed,at as setElementWidth,st as setFixedHeight,ut as setFixedWidth,lt as setVisible,ct as toStringOrNull,pt as toggleAriaAttribute,dt as toggleAttribute,ft as traverseObject,yt as values,n as default};","const e={elementDelimiter:\"__\",modifierDelimiter:\"--\",namespace:\"\",namespaceDelimiter:\"-\",strict:!0};function i({block:i=\"\",namespace:r=[],element:t=\"\",modifier:n=[]}={},s){const{elementDelimiter:a,modifierDelimiter:c,namespaceDelimiter:m,strict:o}=Object.assign(Object.assign({},e),s),l=[...r,i].join(m),$=o?[m,a,c]:[],f=o?$.join(\"\").split(\"\").filter(((e,i,r)=>r.indexOf(e)===i)):[];function u(e,i){if(null!=i&&\"\"!==i){if(o&&(r=i,f.some((e=>r.includes(e)))))throw Error(((e,i,r)=>`The modifier (\"${i}\") must not use the characters contained within the delimiters (\"${r.join('\", \"')}\").`)(0,i,$));return`${e} ${l}${a}${t}${c}${i}`}var r;return e}const d=t?Array.isArray(t)?t.map((e=>`${l}${a}${e}`)).join(\" \"):`${l}${a}${t}`:l;return n?Array.isArray(n)?n.reduce(u,d):Object.keys(n).filter((e=>n[e])).reduce(u,d):d}export{i as default};\n//# sourceMappingURL=bem.js.map\n","const t={Any:\"Any\",KeyA:\"KeyA\",KeyS:\"KeyS\",KeyD:\"KeyD\",KeyF:\"KeyF\",KeyH:\"KeyH\",KeyG:\"KeyG\",KeyZ:\"KeyZ\",KeyX:\"KeyX\",KeyC:\"KeyC\",KeyV:\"KeyV\",IntlBackslash:\"IntlBackslash\",KeyB:\"KeyB\",KeyQ:\"KeyQ\",KeyW:\"KeyW\",KeyE:\"KeyE\",KeyR:\"KeyR\",KeyY:\"KeyY\",KeyT:\"KeyT\",Digit1:\"Digit1\",Digit2:\"Digit2\",Digit3:\"Digit3\",Digit4:\"Digit4\",Digit6:\"Digit6\",Digit5:\"Digit5\",Equal:\"Equal\",Digit9:\"Digit9\",Digit7:\"Digit7\",Minus:\"Minus\",Digit8:\"Digit8\",Digit0:\"Digit0\",BracketRight:\"BracketRight\",KeyO:\"KeyO\",KeyU:\"KeyU\",BracketLeft:\"BracketLeft\",KeyI:\"KeyI\",KeyP:\"KeyP\",Enter:\"Enter\",KeyL:\"KeyL\",KeyJ:\"KeyJ\",Quote:\"Quote\",KeyK:\"KeyK\",Semicolon:\"Semicolon\",Backslash:\"Backslash\",Comma:\"Comma\",Slash:\"Slash\",KeyN:\"KeyN\",KeyM:\"KeyM\",Period:\"Period\",Tab:\"Tab\",Space:\"Space\",Backquote:\"Backquote\",Backspace:\"Backspace\",Escape:\"Escape\",ShiftLeft:\"ShiftLeft\",CapsLock:\"CapsLock\",AltLeft:\"AltLeft\",ControlLeft:\"ControlLeft\",ShiftRight:\"ShiftRight\",AltRight:\"AltRight\",ControlRight:\"ControlRight\",F17:\"F17\",NumpadDecimal:\"NumpadDecimal\",NumpadMultiply:\"NumpadMultiply\",NumpadAdd:\"NumpadAdd\",NumLock:\"NumLock\",NumpadDivide:\"NumpadDivide\",NumpadEnter:\"NumpadEnter\",NumpadSubtract:\"NumpadSubtract\",F18:\"F18\",F19:\"F19\",NumpadEqual:\"NumpadEqual\",Numpad0:\"Numpad0\",Numpad1:\"Numpad1\",Numpad2:\"Numpad2\",Numpad3:\"Numpad3\",Numpad4:\"Numpad4\",Numpad5:\"Numpad5\",Numpad6:\"Numpad6\",Numpad7:\"Numpad7\",F20:\"F20\",Numpad8:\"Numpad8\",Numpad9:\"Numpad9\",IntlYen:\"IntlYen\",IntlRo:\"IntlRo\",NumpadComma:\"NumpadComma\",F5:\"F5\",F6:\"F6\",F7:\"F7\",F3:\"F3\",F8:\"F8\",F9:\"F9\",F11:\"F11\",F13:\"F13\",F16:\"F16\",F14:\"F14\",F10:\"F10\",ContextMenu:\"ContextMenu\",F12:\"F12\",F15:\"F15\",Home:\"Home\",PageUp:\"PageUp\",Delete:\"Delete\",F4:\"F4\",End:\"End\",F2:\"F2\",PageDown:\"PageDown\",F1:\"F1\",ArrowLeft:\"ArrowLeft\",ArrowRight:\"ArrowRight\",ArrowDown:\"ArrowDown\",ArrowUp:\"ArrowUp\",MetaLeft:\"MetaLeft\",MetaRight:\"MetaRight\"},e={ControlLeft:\"ControlLeft\",ControlRight:\"ControlRight\",AltLeft:\"AltLeft\",AltRight:\"AltRight\",ShiftLeft:\"ShiftLeft\",ShiftRight:\"ShiftRight\",MetaLeft:\"MetaLeft\",MetaRight:\"MetaRight\"},a=[\"MetaLeft\",\"MetaRight\",\"ControlLeft\",\"ControlRight\",\"ShiftLeft\",\"ShiftRight\",\"AltLeft\",\"AltRight\"];export{t as KeyCodes,e as ModifierKeys,a as SortedModifierOrder};\n//# sourceMappingURL=key-events-constants.js.map\n","import e from\"../debounce/debounce.js\";import{KeyCodes as t,SortedModifierOrder as n,ModifierKeys as i}from\"./key-events-constants.js\";export{KeyCodes}from\"./key-events-constants.js\";class s{constructor(e=document.body,t={}){this.container=e,this.listenerMapping=null,this.defaultConfig=Object.assign(Object.assign({},s.DefaultConfiguration),t),this.activeKeys=[],this.konamiSequence=[],this.isPaused=!1,this.destroy=()=>{},this.clearKonamiSequence=()=>{},this.init()}init(){const t=KeyboardEvent.CAPTURING_PHASE,n=KeyboardEvent.BUBBLING_PHASE,o=e=>this.executeKeyCombo(e,n),r=e=>{e.eventPhase==t&&this.executeKeyCombo(e,t)},a=()=>this.activeKeys=[],c=e=>{const t=e.code;this.konamiSequence.push(t),this.clearKonamiSequence()};this.clearKonamiSequence=e((()=>this.konamiSequence=[]),s.konamiDelay);const u=e=>{const t=e.code;!i[e.code]&&!this.activeKeys.includes(t)&&this.activeKeys.push(t)};this.listenerMapping={keydown:{capture:{},bubble:{}},keyup:{capture:{},bubble:{}}},this.destroy=()=>{this.listenerMapping=null,this.container.removeEventListener(\"keydown\",u,!0),this.container.removeEventListener(\"keydown\",o),this.container.removeEventListener(\"keydown\",r,!0),this.container.removeEventListener(\"keyup\",o),this.container.removeEventListener(\"keyup\",r,!0),this.container.removeEventListener(\"keydown\",c),window.removeEventListener(\"keyup\",a)},this.container.addEventListener(\"keydown\",u,!0),this.container.addEventListener(\"keydown\",o),this.container.addEventListener(\"keydown\",r,!0),this.container.addEventListener(\"keyup\",o),this.container.addEventListener(\"keyup\",r,!0),this.container.addEventListener(\"keydown\",c),window.addEventListener(\"keyup\",a)}getListenerMeta(e){const{keyCombo:t,priority:n}=e,i=Object.assign(Object.assign({},this.defaultConfig),e),s=this.getListeners(i.eventType,i.capture,t);return i.priority=null!=n?n:s.length,i}extractExecutionMeta(e,n){const i=e.type,s=n===e.CAPTURING_PHASE,o=e.ctrlKey?t.ControlLeft:\"\",r=[e.metaKey?t.MetaLeft:\"\",o,e.shiftKey?t.ShiftLeft:\"\",e.altKey?t.AltLeft:\"\"].filter((e=>\"\"!==e)),a=this.activeKeys;return r.push(...a),{keyCombo:r,capture:s,eventType:i}}executeListenerArr(e,t=null){for(let n=0;n<e.length;n++){const i=e[n],s=!t||i.repeat==t.repeat;if(!i.isKonami&&s&&!1===i.callback(t,i))break}}executeKonamiSequence(e=null,t=1){const n=3===t,i=this.getListeners(\"keydown\",n,this.konamiSequence);for(let t=0;t<i.length;t++){const n=i[t],s=!e||n.repeat==e.repeat;if(n.isKonami&&s&&!1===n.callback(e,n))break}}sortKeyCombo(e){return e.sort(((e,t)=>n.indexOf(e)-n.indexOf(t)))}getListeners(e,t,n){var i,s;const o=this.convertKeyComboToString(n),r=t?\"capture\":\"bubble\";return(null===(s=null===(i=this.listenerMapping)||void 0===i?void 0:i[e][r])||void 0===s?void 0:s[o])||[]}addListener(e){const{keyCombo:t,callback:n}=e,i=this.getListenerMeta(e),{eventType:s,capture:o,priority:r}=i,a=this.convertKeyComboToString(t),c=o?\"capture\":\"bubble\";this.listenerMapping?this.listenerMapping[s]?this.listenerMapping[s][c]?this.listenerMapping[s][c][a]||(this.listenerMapping[s][c][a]=[]):this.listenerMapping[s][c]={}:this.listenerMapping[s]={capture:{},bubble:{}}:this.listenerMapping={keydown:{capture:{},bubble:{}},keyup:{capture:{},bubble:{}}},this.listenerMapping[s][c][a].splice(r,0,i)}convertKeyComboToString(e){if(\"string\"==typeof e)return e;const t=e;return this.sortKeyCombo(t).join(\"+\")}executeKeyCombo(e,n){if(this.isPaused)return;let i,s,o,r;e instanceof KeyboardEvent?(r=e,n=r.eventPhase,({keyCombo:i,capture:s,eventType:o}=this.extractExecutionMeta(e,n)),this.executeKonamiSequence(r,n)):({keyCombo:i,capture:s,eventType:o}=e);const a=this.getListeners(o,s,i),c=t.Any,u=this.getListeners(o,s,c);this.executeListenerArr(a,r),this.executeListenerArr(u,r)}removeListener(e,t){const{keyCombo:n,capture:i,eventType:s}=e,o=this.getListeners(s,i,n);let r=-1;o.find((({callback:e},n)=>{if(e===t)return r=n,!0})),-1!==r&&o.splice(r,1)}removeKeyCombo(e){var t;const{keyCombo:n,capture:i,eventType:s}=e,o=i?\"capture\":\"bubble\",r=this.convertKeyComboToString(n);null===(t=this.listenerMapping)||void 0===t||delete t[s][o][r]}importEvents(e){e.forEach((e=>{this.addListener(e)}))}pauseExecution(){this.isPaused=!0}unpauseExecution(){this.isPaused=!1}}s.DefaultConfiguration={description:\"\",capture:!1,isKonami:!1,eventType:\"keydown\",repeat:!1},s.konamiDelay=500;export{s as KeyEventManager};\n//# sourceMappingURL=key-events.js.map\n","function t(t,E=Number.MIN_SAFE_INTEGER,a=Number.MAX_SAFE_INTEGER){return Math.max(E,Math.min(t,a))}export{t as default};\n//# sourceMappingURL=clamp.js.map\n","function o(o,e){const t={};return Object.keys(o).forEach((i=>{const{slot:n,modifiers:r}=o[i],s=r.filter(Boolean),f=e({slot:n,modifiers:s});t[i]=[f].filter(Boolean).join(\" \")})),t}export{o as default};\n//# sourceMappingURL=composeClasses.js.map\n","function e(e,t=166){let u;function a(...a){clearTimeout(u),u=setTimeout((()=>{e.apply(this,a)}),t)}return a.clear=()=>{clearTimeout(u)},a}export{e as default};\n//# sourceMappingURL=debounce.js.map\n","import e from\"../BEM/bem.js\";function m(m,o,r,t=[\"Dg\"]){return e({block:m,namespace:t,element:o,modifier:r})}export{m as default};\n//# sourceMappingURL=generateUtilityClass.js.map\n","import t from\"../generateUtilityClass/generateUtilityClass.js\";function e(e,r,a=[],s=[\"Dg\"]){const i={};return r.forEach((r=>{i[r]=t(e,r,a,s)})),i}export{e as default};\n//# sourceMappingURL=generateUtilityClasses.js.map\n","export{default as BEM}from\"./BEM/bem.js\";export{default as composeClasses}from\"./composedClasses/composeClasses.js\";export{default as generateUtilityClass}from\"./generateUtilityClass/generateUtilityClass.js\";export{default as generateUtilityClasses}from\"./generateUtilityClasses/generateUtilityClasses.js\";export{default as clamp}from\"./clamp/clamp.js\";export{default as debounce}from\"./debounce/debounce.js\";export{KeyEventManager}from\"./KeyEvents/key-events.js\";export{KeyCodes}from\"./KeyEvents/key-events-constants.js\";\n//# sourceMappingURL=index.js.map\n","// these aren't really private, but nor are they really useful to document\n\n/**\n * @private\n */\nclass LuxonError extends Error {}\n\n/**\n * @private\n */\nclass InvalidDateTimeError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid DateTime: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nclass InvalidIntervalError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid Interval: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nclass InvalidDurationError extends LuxonError {\n  constructor(reason) {\n    super(`Invalid Duration: ${reason.toMessage()}`);\n  }\n}\n\n/**\n * @private\n */\nclass ConflictingSpecificationError extends LuxonError {}\n\n/**\n * @private\n */\nclass InvalidUnitError extends LuxonError {\n  constructor(unit) {\n    super(`Invalid unit ${unit}`);\n  }\n}\n\n/**\n * @private\n */\nclass InvalidArgumentError extends LuxonError {}\n\n/**\n * @private\n */\nclass ZoneIsAbstractError extends LuxonError {\n  constructor() {\n    super(\"Zone is an abstract class\");\n  }\n}\n\n/**\n * @private\n */\n\nconst n = \"numeric\",\n  s = \"short\",\n  l = \"long\";\n\nconst DATE_SHORT = {\n  year: n,\n  month: n,\n  day: n,\n};\n\nconst DATE_MED = {\n  year: n,\n  month: s,\n  day: n,\n};\n\nconst DATE_MED_WITH_WEEKDAY = {\n  year: n,\n  month: s,\n  day: n,\n  weekday: s,\n};\n\nconst DATE_FULL = {\n  year: n,\n  month: l,\n  day: n,\n};\n\nconst DATE_HUGE = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n};\n\nconst TIME_SIMPLE = {\n  hour: n,\n  minute: n,\n};\n\nconst TIME_WITH_SECONDS = {\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nconst TIME_WITH_SHORT_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: s,\n};\n\nconst TIME_WITH_LONG_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: l,\n};\n\nconst TIME_24_SIMPLE = {\n  hour: n,\n  minute: n,\n  hourCycle: \"h23\",\n};\n\nconst TIME_24_WITH_SECONDS = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n};\n\nconst TIME_24_WITH_SHORT_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n  timeZoneName: s,\n};\n\nconst TIME_24_WITH_LONG_OFFSET = {\n  hour: n,\n  minute: n,\n  second: n,\n  hourCycle: \"h23\",\n  timeZoneName: l,\n};\n\nconst DATETIME_SHORT = {\n  year: n,\n  month: n,\n  day: n,\n  hour: n,\n  minute: n,\n};\n\nconst DATETIME_SHORT_WITH_SECONDS = {\n  year: n,\n  month: n,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nconst DATETIME_MED = {\n  year: n,\n  month: s,\n  day: n,\n  hour: n,\n  minute: n,\n};\n\nconst DATETIME_MED_WITH_SECONDS = {\n  year: n,\n  month: s,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n};\n\nconst DATETIME_MED_WITH_WEEKDAY = {\n  year: n,\n  month: s,\n  day: n,\n  weekday: s,\n  hour: n,\n  minute: n,\n};\n\nconst DATETIME_FULL = {\n  year: n,\n  month: l,\n  day: n,\n  hour: n,\n  minute: n,\n  timeZoneName: s,\n};\n\nconst DATETIME_FULL_WITH_SECONDS = {\n  year: n,\n  month: l,\n  day: n,\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: s,\n};\n\nconst DATETIME_HUGE = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n  hour: n,\n  minute: n,\n  timeZoneName: l,\n};\n\nconst DATETIME_HUGE_WITH_SECONDS = {\n  year: n,\n  month: l,\n  day: n,\n  weekday: l,\n  hour: n,\n  minute: n,\n  second: n,\n  timeZoneName: l,\n};\n\n/**\n * @interface\n */\nclass Zone {\n  /**\n   * The type of zone\n   * @abstract\n   * @type {string}\n   */\n  get type() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * The name of this zone.\n   * @abstract\n   * @type {string}\n   */\n  get name() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * The IANA name of this zone.\n   * Defaults to `name` if not overwritten by a subclass.\n   * @abstract\n   * @type {string}\n   */\n  get ianaName() {\n    return this.name;\n  }\n\n  /**\n   * Returns whether the offset is known to be fixed for the whole year.\n   * @abstract\n   * @type {boolean}\n   */\n  get isUniversal() {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns the offset's common name (such as EST) at the specified timestamp\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to get the name\n   * @param {Object} opts - Options to affect the format\n   * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n   * @param {string} opts.locale - What locale to return the offset name in.\n   * @return {string}\n   */\n  offsetName(ts, opts) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Returns the offset's value as a string\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to get the offset\n   * @param {string} format - What style of offset to return.\n   *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n   * @return {string}\n   */\n  formatOffset(ts, format) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return the offset in minutes for this zone at the specified timestamp.\n   * @abstract\n   * @param {number} ts - Epoch milliseconds for which to compute the offset\n   * @return {number}\n   */\n  offset(ts) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return whether this Zone is equal to another zone\n   * @abstract\n   * @param {Zone} otherZone - the zone to compare\n   * @return {boolean}\n   */\n  equals(otherZone) {\n    throw new ZoneIsAbstractError();\n  }\n\n  /**\n   * Return whether this Zone is valid.\n   * @abstract\n   * @type {boolean}\n   */\n  get isValid() {\n    throw new ZoneIsAbstractError();\n  }\n}\n\nlet singleton$1 = null;\n\n/**\n * Represents the local zone for this JavaScript environment.\n * @implements {Zone}\n */\nclass SystemZone extends Zone {\n  /**\n   * Get a singleton instance of the local zone\n   * @return {SystemZone}\n   */\n  static get instance() {\n    if (singleton$1 === null) {\n      singleton$1 = new SystemZone();\n    }\n    return singleton$1;\n  }\n\n  /** @override **/\n  get type() {\n    return \"system\";\n  }\n\n  /** @override **/\n  get name() {\n    return new Intl.DateTimeFormat().resolvedOptions().timeZone;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName(ts, { format, locale }) {\n    return parseZoneInfo(ts, format, locale);\n  }\n\n  /** @override **/\n  formatOffset(ts, format) {\n    return formatOffset(this.offset(ts), format);\n  }\n\n  /** @override **/\n  offset(ts) {\n    return -new Date(ts).getTimezoneOffset();\n  }\n\n  /** @override **/\n  equals(otherZone) {\n    return otherZone.type === \"system\";\n  }\n\n  /** @override **/\n  get isValid() {\n    return true;\n  }\n}\n\nconst dtfCache = new Map();\nfunction makeDTF(zoneName) {\n  let dtf = dtfCache.get(zoneName);\n  if (dtf === undefined) {\n    dtf = new Intl.DateTimeFormat(\"en-US\", {\n      hour12: false,\n      timeZone: zoneName,\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n      second: \"2-digit\",\n      era: \"short\",\n    });\n    dtfCache.set(zoneName, dtf);\n  }\n  return dtf;\n}\n\nconst typeToPos = {\n  year: 0,\n  month: 1,\n  day: 2,\n  era: 3,\n  hour: 4,\n  minute: 5,\n  second: 6,\n};\n\nfunction hackyOffset(dtf, date) {\n  const formatted = dtf.format(date).replace(/\\u200E/g, \"\"),\n    parsed = /(\\d+)\\/(\\d+)\\/(\\d+) (AD|BC),? (\\d+):(\\d+):(\\d+)/.exec(formatted),\n    [, fMonth, fDay, fYear, fadOrBc, fHour, fMinute, fSecond] = parsed;\n  return [fYear, fMonth, fDay, fadOrBc, fHour, fMinute, fSecond];\n}\n\nfunction partsOffset(dtf, date) {\n  const formatted = dtf.formatToParts(date);\n  const filled = [];\n  for (let i = 0; i < formatted.length; i++) {\n    const { type, value } = formatted[i];\n    const pos = typeToPos[type];\n\n    if (type === \"era\") {\n      filled[pos] = value;\n    } else if (!isUndefined(pos)) {\n      filled[pos] = parseInt(value, 10);\n    }\n  }\n  return filled;\n}\n\nconst ianaZoneCache = new Map();\n/**\n * A zone identified by an IANA identifier, like America/New_York\n * @implements {Zone}\n */\nclass IANAZone extends Zone {\n  /**\n   * @param {string} name - Zone name\n   * @return {IANAZone}\n   */\n  static create(name) {\n    let zone = ianaZoneCache.get(name);\n    if (zone === undefined) {\n      ianaZoneCache.set(name, (zone = new IANAZone(name)));\n    }\n    return zone;\n  }\n\n  /**\n   * Reset local caches. Should only be necessary in testing scenarios.\n   * @return {void}\n   */\n  static resetCache() {\n    ianaZoneCache.clear();\n    dtfCache.clear();\n  }\n\n  /**\n   * Returns whether the provided string is a valid specifier. This only checks the string's format, not that the specifier identifies a known zone; see isValidZone for that.\n   * @param {string} s - The string to check validity on\n   * @example IANAZone.isValidSpecifier(\"America/New_York\") //=> true\n   * @example IANAZone.isValidSpecifier(\"Sport~~blorp\") //=> false\n   * @deprecated For backward compatibility, this forwards to isValidZone, better use `isValidZone()` directly instead.\n   * @return {boolean}\n   */\n  static isValidSpecifier(s) {\n    return this.isValidZone(s);\n  }\n\n  /**\n   * Returns whether the provided string identifies a real zone\n   * @param {string} zone - The string to check\n   * @example IANAZone.isValidZone(\"America/New_York\") //=> true\n   * @example IANAZone.isValidZone(\"Fantasia/Castle\") //=> false\n   * @example IANAZone.isValidZone(\"Sport~~blorp\") //=> false\n   * @return {boolean}\n   */\n  static isValidZone(zone) {\n    if (!zone) {\n      return false;\n    }\n    try {\n      new Intl.DateTimeFormat(\"en-US\", { timeZone: zone }).format();\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  constructor(name) {\n    super();\n    /** @private **/\n    this.zoneName = name;\n    /** @private **/\n    this.valid = IANAZone.isValidZone(name);\n  }\n\n  /**\n   * The type of zone. `iana` for all instances of `IANAZone`.\n   * @override\n   * @type {string}\n   */\n  get type() {\n    return \"iana\";\n  }\n\n  /**\n   * The name of this zone (i.e. the IANA zone name).\n   * @override\n   * @type {string}\n   */\n  get name() {\n    return this.zoneName;\n  }\n\n  /**\n   * Returns whether the offset is known to be fixed for the whole year:\n   * Always returns false for all IANA zones.\n   * @override\n   * @type {boolean}\n   */\n  get isUniversal() {\n    return false;\n  }\n\n  /**\n   * Returns the offset's common name (such as EST) at the specified timestamp\n   * @override\n   * @param {number} ts - Epoch milliseconds for which to get the name\n   * @param {Object} opts - Options to affect the format\n   * @param {string} opts.format - What style of offset to return. Accepts 'long' or 'short'.\n   * @param {string} opts.locale - What locale to return the offset name in.\n   * @return {string}\n   */\n  offsetName(ts, { format, locale }) {\n    return parseZoneInfo(ts, format, locale, this.name);\n  }\n\n  /**\n   * Returns the offset's value as a string\n   * @override\n   * @param {number} ts - Epoch milliseconds for which to get the offset\n   * @param {string} format - What style of offset to return.\n   *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n   * @return {string}\n   */\n  formatOffset(ts, format) {\n    return formatOffset(this.offset(ts), format);\n  }\n\n  /**\n   * Return the offset in minutes for this zone at the specified timestamp.\n   * @override\n   * @param {number} ts - Epoch milliseconds for which to compute the offset\n   * @return {number}\n   */\n  offset(ts) {\n    if (!this.valid) return NaN;\n    const date = new Date(ts);\n\n    if (isNaN(date)) return NaN;\n\n    const dtf = makeDTF(this.name);\n    let [year, month, day, adOrBc, hour, minute, second] = dtf.formatToParts\n      ? partsOffset(dtf, date)\n      : hackyOffset(dtf, date);\n\n    if (adOrBc === \"BC\") {\n      year = -Math.abs(year) + 1;\n    }\n\n    // because we're using hour12 and https://bugs.chromium.org/p/chromium/issues/detail?id=1025564&can=2&q=%2224%3A00%22%20datetimeformat\n    const adjustedHour = hour === 24 ? 0 : hour;\n\n    const asUTC = objToLocalTS({\n      year,\n      month,\n      day,\n      hour: adjustedHour,\n      minute,\n      second,\n      millisecond: 0,\n    });\n\n    let asTS = +date;\n    const over = asTS % 1000;\n    asTS -= over >= 0 ? over : 1000 + over;\n    return (asUTC - asTS) / (60 * 1000);\n  }\n\n  /**\n   * Return whether this Zone is equal to another zone\n   * @override\n   * @param {Zone} otherZone - the zone to compare\n   * @return {boolean}\n   */\n  equals(otherZone) {\n    return otherZone.type === \"iana\" && otherZone.name === this.name;\n  }\n\n  /**\n   * Return whether this Zone is valid.\n   * @override\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.valid;\n  }\n}\n\n// todo - remap caching\n\nlet intlLFCache = {};\nfunction getCachedLF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let dtf = intlLFCache[key];\n  if (!dtf) {\n    dtf = new Intl.ListFormat(locString, opts);\n    intlLFCache[key] = dtf;\n  }\n  return dtf;\n}\n\nconst intlDTCache = new Map();\nfunction getCachedDTF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let dtf = intlDTCache.get(key);\n  if (dtf === undefined) {\n    dtf = new Intl.DateTimeFormat(locString, opts);\n    intlDTCache.set(key, dtf);\n  }\n  return dtf;\n}\n\nconst intlNumCache = new Map();\nfunction getCachedINF(locString, opts = {}) {\n  const key = JSON.stringify([locString, opts]);\n  let inf = intlNumCache.get(key);\n  if (inf === undefined) {\n    inf = new Intl.NumberFormat(locString, opts);\n    intlNumCache.set(key, inf);\n  }\n  return inf;\n}\n\nconst intlRelCache = new Map();\nfunction getCachedRTF(locString, opts = {}) {\n  const { base, ...cacheKeyOpts } = opts; // exclude `base` from the options\n  const key = JSON.stringify([locString, cacheKeyOpts]);\n  let inf = intlRelCache.get(key);\n  if (inf === undefined) {\n    inf = new Intl.RelativeTimeFormat(locString, opts);\n    intlRelCache.set(key, inf);\n  }\n  return inf;\n}\n\nlet sysLocaleCache = null;\nfunction systemLocale() {\n  if (sysLocaleCache) {\n    return sysLocaleCache;\n  } else {\n    sysLocaleCache = new Intl.DateTimeFormat().resolvedOptions().locale;\n    return sysLocaleCache;\n  }\n}\n\nconst intlResolvedOptionsCache = new Map();\nfunction getCachedIntResolvedOptions(locString) {\n  let opts = intlResolvedOptionsCache.get(locString);\n  if (opts === undefined) {\n    opts = new Intl.DateTimeFormat(locString).resolvedOptions();\n    intlResolvedOptionsCache.set(locString, opts);\n  }\n  return opts;\n}\n\nconst weekInfoCache = new Map();\nfunction getCachedWeekInfo(locString) {\n  let data = weekInfoCache.get(locString);\n  if (!data) {\n    const locale = new Intl.Locale(locString);\n    // browsers currently implement this as a property, but spec says it should be a getter function\n    data = \"getWeekInfo\" in locale ? locale.getWeekInfo() : locale.weekInfo;\n    // minimalDays was removed from WeekInfo: https://github.com/tc39/proposal-intl-locale-info/issues/86\n    if (!(\"minimalDays\" in data)) {\n      data = { ...fallbackWeekSettings, ...data };\n    }\n    weekInfoCache.set(locString, data);\n  }\n  return data;\n}\n\nfunction parseLocaleString(localeStr) {\n  // I really want to avoid writing a BCP 47 parser\n  // see, e.g. https://github.com/wooorm/bcp-47\n  // Instead, we'll do this:\n\n  // a) if the string has no -u extensions, just leave it alone\n  // b) if it does, use Intl to resolve everything\n  // c) if Intl fails, try again without the -u\n\n  // private subtags and unicode subtags have ordering requirements,\n  // and we're not properly parsing this, so just strip out the\n  // private ones if they exist.\n  const xIndex = localeStr.indexOf(\"-x-\");\n  if (xIndex !== -1) {\n    localeStr = localeStr.substring(0, xIndex);\n  }\n\n  const uIndex = localeStr.indexOf(\"-u-\");\n  if (uIndex === -1) {\n    return [localeStr];\n  } else {\n    let options;\n    let selectedStr;\n    try {\n      options = getCachedDTF(localeStr).resolvedOptions();\n      selectedStr = localeStr;\n    } catch (e) {\n      const smaller = localeStr.substring(0, uIndex);\n      options = getCachedDTF(smaller).resolvedOptions();\n      selectedStr = smaller;\n    }\n\n    const { numberingSystem, calendar } = options;\n    return [selectedStr, numberingSystem, calendar];\n  }\n}\n\nfunction intlConfigString(localeStr, numberingSystem, outputCalendar) {\n  if (outputCalendar || numberingSystem) {\n    if (!localeStr.includes(\"-u-\")) {\n      localeStr += \"-u\";\n    }\n\n    if (outputCalendar) {\n      localeStr += `-ca-${outputCalendar}`;\n    }\n\n    if (numberingSystem) {\n      localeStr += `-nu-${numberingSystem}`;\n    }\n    return localeStr;\n  } else {\n    return localeStr;\n  }\n}\n\nfunction mapMonths(f) {\n  const ms = [];\n  for (let i = 1; i <= 12; i++) {\n    const dt = DateTime.utc(2009, i, 1);\n    ms.push(f(dt));\n  }\n  return ms;\n}\n\nfunction mapWeekdays(f) {\n  const ms = [];\n  for (let i = 1; i <= 7; i++) {\n    const dt = DateTime.utc(2016, 11, 13 + i);\n    ms.push(f(dt));\n  }\n  return ms;\n}\n\nfunction listStuff(loc, length, englishFn, intlFn) {\n  const mode = loc.listingMode();\n\n  if (mode === \"error\") {\n    return null;\n  } else if (mode === \"en\") {\n    return englishFn(length);\n  } else {\n    return intlFn(length);\n  }\n}\n\nfunction supportsFastNumbers(loc) {\n  if (loc.numberingSystem && loc.numberingSystem !== \"latn\") {\n    return false;\n  } else {\n    return (\n      loc.numberingSystem === \"latn\" ||\n      !loc.locale ||\n      loc.locale.startsWith(\"en\") ||\n      getCachedIntResolvedOptions(loc.locale).numberingSystem === \"latn\"\n    );\n  }\n}\n\n/**\n * @private\n */\n\nclass PolyNumberFormatter {\n  constructor(intl, forceSimple, opts) {\n    this.padTo = opts.padTo || 0;\n    this.floor = opts.floor || false;\n\n    const { padTo, floor, ...otherOpts } = opts;\n\n    if (!forceSimple || Object.keys(otherOpts).length > 0) {\n      const intlOpts = { useGrouping: false, ...opts };\n      if (opts.padTo > 0) intlOpts.minimumIntegerDigits = opts.padTo;\n      this.inf = getCachedINF(intl, intlOpts);\n    }\n  }\n\n  format(i) {\n    if (this.inf) {\n      const fixed = this.floor ? Math.floor(i) : i;\n      return this.inf.format(fixed);\n    } else {\n      // to match the browser's numberformatter defaults\n      const fixed = this.floor ? Math.floor(i) : roundTo(i, 3);\n      return padStart(fixed, this.padTo);\n    }\n  }\n}\n\n/**\n * @private\n */\n\nclass PolyDateFormatter {\n  constructor(dt, intl, opts) {\n    this.opts = opts;\n    this.originalZone = undefined;\n\n    let z = undefined;\n    if (this.opts.timeZone) {\n      // Don't apply any workarounds if a timeZone is explicitly provided in opts\n      this.dt = dt;\n    } else if (dt.zone.type === \"fixed\") {\n      // UTC-8 or Etc/UTC-8 are not part of tzdata, only Etc/GMT+8 and the like.\n      // That is why fixed-offset TZ is set to that unless it is:\n      // 1. Representing offset 0 when UTC is used to maintain previous behavior and does not become GMT.\n      // 2. Unsupported by the browser:\n      //    - some do not support Etc/\n      //    - < Etc/GMT-14, > Etc/GMT+12, and 30-minute or 45-minute offsets are not part of tzdata\n      const gmtOffset = -1 * (dt.offset / 60);\n      const offsetZ = gmtOffset >= 0 ? `Etc/GMT+${gmtOffset}` : `Etc/GMT${gmtOffset}`;\n      if (dt.offset !== 0 && IANAZone.create(offsetZ).valid) {\n        z = offsetZ;\n        this.dt = dt;\n      } else {\n        // Not all fixed-offset zones like Etc/+4:30 are present in tzdata so\n        // we manually apply the offset and substitute the zone as needed.\n        z = \"UTC\";\n        this.dt = dt.offset === 0 ? dt : dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n        this.originalZone = dt.zone;\n      }\n    } else if (dt.zone.type === \"system\") {\n      this.dt = dt;\n    } else if (dt.zone.type === \"iana\") {\n      this.dt = dt;\n      z = dt.zone.name;\n    } else {\n      // Custom zones can have any offset / offsetName so we just manually\n      // apply the offset and substitute the zone as needed.\n      z = \"UTC\";\n      this.dt = dt.setZone(\"UTC\").plus({ minutes: dt.offset });\n      this.originalZone = dt.zone;\n    }\n\n    const intlOpts = { ...this.opts };\n    intlOpts.timeZone = intlOpts.timeZone || z;\n    this.dtf = getCachedDTF(intl, intlOpts);\n  }\n\n  format() {\n    if (this.originalZone) {\n      // If we have to substitute in the actual zone name, we have to use\n      // formatToParts so that the timezone can be replaced.\n      return this.formatToParts()\n        .map(({ value }) => value)\n        .join(\"\");\n    }\n    return this.dtf.format(this.dt.toJSDate());\n  }\n\n  formatToParts() {\n    const parts = this.dtf.formatToParts(this.dt.toJSDate());\n    if (this.originalZone) {\n      return parts.map((part) => {\n        if (part.type === \"timeZoneName\") {\n          const offsetName = this.originalZone.offsetName(this.dt.ts, {\n            locale: this.dt.locale,\n            format: this.opts.timeZoneName,\n          });\n          return {\n            ...part,\n            value: offsetName,\n          };\n        } else {\n          return part;\n        }\n      });\n    }\n    return parts;\n  }\n\n  resolvedOptions() {\n    return this.dtf.resolvedOptions();\n  }\n}\n\n/**\n * @private\n */\nclass PolyRelFormatter {\n  constructor(intl, isEnglish, opts) {\n    this.opts = { style: \"long\", ...opts };\n    if (!isEnglish && hasRelative()) {\n      this.rtf = getCachedRTF(intl, opts);\n    }\n  }\n\n  format(count, unit) {\n    if (this.rtf) {\n      return this.rtf.format(count, unit);\n    } else {\n      return formatRelativeTime(unit, count, this.opts.numeric, this.opts.style !== \"long\");\n    }\n  }\n\n  formatToParts(count, unit) {\n    if (this.rtf) {\n      return this.rtf.formatToParts(count, unit);\n    } else {\n      return [];\n    }\n  }\n}\n\nconst fallbackWeekSettings = {\n  firstDay: 1,\n  minimalDays: 4,\n  weekend: [6, 7],\n};\n\n/**\n * @private\n */\nclass Locale {\n  static fromOpts(opts) {\n    return Locale.create(\n      opts.locale,\n      opts.numberingSystem,\n      opts.outputCalendar,\n      opts.weekSettings,\n      opts.defaultToEN\n    );\n  }\n\n  static create(locale, numberingSystem, outputCalendar, weekSettings, defaultToEN = false) {\n    const specifiedLocale = locale || Settings.defaultLocale;\n    // the system locale is useful for human-readable strings but annoying for parsing/formatting known formats\n    const localeR = specifiedLocale || (defaultToEN ? \"en-US\" : systemLocale());\n    const numberingSystemR = numberingSystem || Settings.defaultNumberingSystem;\n    const outputCalendarR = outputCalendar || Settings.defaultOutputCalendar;\n    const weekSettingsR = validateWeekSettings(weekSettings) || Settings.defaultWeekSettings;\n    return new Locale(localeR, numberingSystemR, outputCalendarR, weekSettingsR, specifiedLocale);\n  }\n\n  static resetCache() {\n    sysLocaleCache = null;\n    intlDTCache.clear();\n    intlNumCache.clear();\n    intlRelCache.clear();\n    intlResolvedOptionsCache.clear();\n    weekInfoCache.clear();\n  }\n\n  static fromObject({ locale, numberingSystem, outputCalendar, weekSettings } = {}) {\n    return Locale.create(locale, numberingSystem, outputCalendar, weekSettings);\n  }\n\n  constructor(locale, numbering, outputCalendar, weekSettings, specifiedLocale) {\n    const [parsedLocale, parsedNumberingSystem, parsedOutputCalendar] = parseLocaleString(locale);\n\n    this.locale = parsedLocale;\n    this.numberingSystem = numbering || parsedNumberingSystem || null;\n    this.outputCalendar = outputCalendar || parsedOutputCalendar || null;\n    this.weekSettings = weekSettings;\n    this.intl = intlConfigString(this.locale, this.numberingSystem, this.outputCalendar);\n\n    this.weekdaysCache = { format: {}, standalone: {} };\n    this.monthsCache = { format: {}, standalone: {} };\n    this.meridiemCache = null;\n    this.eraCache = {};\n\n    this.specifiedLocale = specifiedLocale;\n    this.fastNumbersCached = null;\n  }\n\n  get fastNumbers() {\n    if (this.fastNumbersCached == null) {\n      this.fastNumbersCached = supportsFastNumbers(this);\n    }\n\n    return this.fastNumbersCached;\n  }\n\n  listingMode() {\n    const isActuallyEn = this.isEnglish();\n    const hasNoWeirdness =\n      (this.numberingSystem === null || this.numberingSystem === \"latn\") &&\n      (this.outputCalendar === null || this.outputCalendar === \"gregory\");\n    return isActuallyEn && hasNoWeirdness ? \"en\" : \"intl\";\n  }\n\n  clone(alts) {\n    if (!alts || Object.getOwnPropertyNames(alts).length === 0) {\n      return this;\n    } else {\n      return Locale.create(\n        alts.locale || this.specifiedLocale,\n        alts.numberingSystem || this.numberingSystem,\n        alts.outputCalendar || this.outputCalendar,\n        validateWeekSettings(alts.weekSettings) || this.weekSettings,\n        alts.defaultToEN || false\n      );\n    }\n  }\n\n  redefaultToEN(alts = {}) {\n    return this.clone({ ...alts, defaultToEN: true });\n  }\n\n  redefaultToSystem(alts = {}) {\n    return this.clone({ ...alts, defaultToEN: false });\n  }\n\n  months(length, format = false) {\n    return listStuff(this, length, months, () => {\n      // Workaround for \"ja\" locale: formatToParts does not label all parts of the month\n      // as \"month\" and for this locale there is no difference between \"format\" and \"non-format\".\n      // As such, just use format() instead of formatToParts() and take the whole string\n      const monthSpecialCase = this.intl === \"ja\" || this.intl.startsWith(\"ja-\");\n      format &= !monthSpecialCase;\n      const intl = format ? { month: length, day: \"numeric\" } : { month: length },\n        formatStr = format ? \"format\" : \"standalone\";\n      if (!this.monthsCache[formatStr][length]) {\n        const mapper = !monthSpecialCase\n          ? (dt) => this.extract(dt, intl, \"month\")\n          : (dt) => this.dtFormatter(dt, intl).format();\n        this.monthsCache[formatStr][length] = mapMonths(mapper);\n      }\n      return this.monthsCache[formatStr][length];\n    });\n  }\n\n  weekdays(length, format = false) {\n    return listStuff(this, length, weekdays, () => {\n      const intl = format\n          ? { weekday: length, year: \"numeric\", month: \"long\", day: \"numeric\" }\n          : { weekday: length },\n        formatStr = format ? \"format\" : \"standalone\";\n      if (!this.weekdaysCache[formatStr][length]) {\n        this.weekdaysCache[formatStr][length] = mapWeekdays((dt) =>\n          this.extract(dt, intl, \"weekday\")\n        );\n      }\n      return this.weekdaysCache[formatStr][length];\n    });\n  }\n\n  meridiems() {\n    return listStuff(\n      this,\n      undefined,\n      () => meridiems,\n      () => {\n        // In theory there could be aribitrary day periods. We're gonna assume there are exactly two\n        // for AM and PM. This is probably wrong, but it's makes parsing way easier.\n        if (!this.meridiemCache) {\n          const intl = { hour: \"numeric\", hourCycle: \"h12\" };\n          this.meridiemCache = [DateTime.utc(2016, 11, 13, 9), DateTime.utc(2016, 11, 13, 19)].map(\n            (dt) => this.extract(dt, intl, \"dayperiod\")\n          );\n        }\n\n        return this.meridiemCache;\n      }\n    );\n  }\n\n  eras(length) {\n    return listStuff(this, length, eras, () => {\n      const intl = { era: length };\n\n      // This is problematic. Different calendars are going to define eras totally differently. What I need is the minimum set of dates\n      // to definitely enumerate them.\n      if (!this.eraCache[length]) {\n        this.eraCache[length] = [DateTime.utc(-40, 1, 1), DateTime.utc(2017, 1, 1)].map((dt) =>\n          this.extract(dt, intl, \"era\")\n        );\n      }\n\n      return this.eraCache[length];\n    });\n  }\n\n  extract(dt, intlOpts, field) {\n    const df = this.dtFormatter(dt, intlOpts),\n      results = df.formatToParts(),\n      matching = results.find((m) => m.type.toLowerCase() === field);\n    return matching ? matching.value : null;\n  }\n\n  numberFormatter(opts = {}) {\n    // this forcesimple option is never used (the only caller short-circuits on it, but it seems safer to leave)\n    // (in contrast, the rest of the condition is used heavily)\n    return new PolyNumberFormatter(this.intl, opts.forceSimple || this.fastNumbers, opts);\n  }\n\n  dtFormatter(dt, intlOpts = {}) {\n    return new PolyDateFormatter(dt, this.intl, intlOpts);\n  }\n\n  relFormatter(opts = {}) {\n    return new PolyRelFormatter(this.intl, this.isEnglish(), opts);\n  }\n\n  listFormatter(opts = {}) {\n    return getCachedLF(this.intl, opts);\n  }\n\n  isEnglish() {\n    return (\n      this.locale === \"en\" ||\n      this.locale.toLowerCase() === \"en-us\" ||\n      getCachedIntResolvedOptions(this.intl).locale.startsWith(\"en-us\")\n    );\n  }\n\n  getWeekSettings() {\n    if (this.weekSettings) {\n      return this.weekSettings;\n    } else if (!hasLocaleWeekInfo()) {\n      return fallbackWeekSettings;\n    } else {\n      return getCachedWeekInfo(this.locale);\n    }\n  }\n\n  getStartOfWeek() {\n    return this.getWeekSettings().firstDay;\n  }\n\n  getMinDaysInFirstWeek() {\n    return this.getWeekSettings().minimalDays;\n  }\n\n  getWeekendDays() {\n    return this.getWeekSettings().weekend;\n  }\n\n  equals(other) {\n    return (\n      this.locale === other.locale &&\n      this.numberingSystem === other.numberingSystem &&\n      this.outputCalendar === other.outputCalendar\n    );\n  }\n\n  toString() {\n    return `Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`;\n  }\n}\n\nlet singleton = null;\n\n/**\n * A zone with a fixed offset (meaning no DST)\n * @implements {Zone}\n */\nclass FixedOffsetZone extends Zone {\n  /**\n   * Get a singleton instance of UTC\n   * @return {FixedOffsetZone}\n   */\n  static get utcInstance() {\n    if (singleton === null) {\n      singleton = new FixedOffsetZone(0);\n    }\n    return singleton;\n  }\n\n  /**\n   * Get an instance with a specified offset\n   * @param {number} offset - The offset in minutes\n   * @return {FixedOffsetZone}\n   */\n  static instance(offset) {\n    return offset === 0 ? FixedOffsetZone.utcInstance : new FixedOffsetZone(offset);\n  }\n\n  /**\n   * Get an instance of FixedOffsetZone from a UTC offset string, like \"UTC+6\"\n   * @param {string} s - The offset string to parse\n   * @example FixedOffsetZone.parseSpecifier(\"UTC+6\")\n   * @example FixedOffsetZone.parseSpecifier(\"UTC+06\")\n   * @example FixedOffsetZone.parseSpecifier(\"UTC-6:00\")\n   * @return {FixedOffsetZone}\n   */\n  static parseSpecifier(s) {\n    if (s) {\n      const r = s.match(/^utc(?:([+-]\\d{1,2})(?::(\\d{2}))?)?$/i);\n      if (r) {\n        return new FixedOffsetZone(signedOffset(r[1], r[2]));\n      }\n    }\n    return null;\n  }\n\n  constructor(offset) {\n    super();\n    /** @private **/\n    this.fixed = offset;\n  }\n\n  /**\n   * The type of zone. `fixed` for all instances of `FixedOffsetZone`.\n   * @override\n   * @type {string}\n   */\n  get type() {\n    return \"fixed\";\n  }\n\n  /**\n   * The name of this zone.\n   * All fixed zones' names always start with \"UTC\" (plus optional offset)\n   * @override\n   * @type {string}\n   */\n  get name() {\n    return this.fixed === 0 ? \"UTC\" : `UTC${formatOffset(this.fixed, \"narrow\")}`;\n  }\n\n  /**\n   * The IANA name of this zone, i.e. `Etc/UTC` or `Etc/GMT+/-nn`\n   *\n   * @override\n   * @type {string}\n   */\n  get ianaName() {\n    if (this.fixed === 0) {\n      return \"Etc/UTC\";\n    } else {\n      return `Etc/GMT${formatOffset(-this.fixed, \"narrow\")}`;\n    }\n  }\n\n  /**\n   * Returns the offset's common name at the specified timestamp.\n   *\n   * For fixed offset zones this equals to the zone name.\n   * @override\n   */\n  offsetName() {\n    return this.name;\n  }\n\n  /**\n   * Returns the offset's value as a string\n   * @override\n   * @param {number} ts - Epoch milliseconds for which to get the offset\n   * @param {string} format - What style of offset to return.\n   *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n   * @return {string}\n   */\n  formatOffset(ts, format) {\n    return formatOffset(this.fixed, format);\n  }\n\n  /**\n   * Returns whether the offset is known to be fixed for the whole year:\n   * Always returns true for all fixed offset zones.\n   * @override\n   * @type {boolean}\n   */\n  get isUniversal() {\n    return true;\n  }\n\n  /**\n   * Return the offset in minutes for this zone at the specified timestamp.\n   *\n   * For fixed offset zones, this is constant and does not depend on a timestamp.\n   * @override\n   * @return {number}\n   */\n  offset() {\n    return this.fixed;\n  }\n\n  /**\n   * Return whether this Zone is equal to another zone (i.e. also fixed and same offset)\n   * @override\n   * @param {Zone} otherZone - the zone to compare\n   * @return {boolean}\n   */\n  equals(otherZone) {\n    return otherZone.type === \"fixed\" && otherZone.fixed === this.fixed;\n  }\n\n  /**\n   * Return whether this Zone is valid:\n   * All fixed offset zones are valid.\n   * @override\n   * @type {boolean}\n   */\n  get isValid() {\n    return true;\n  }\n}\n\n/**\n * A zone that failed to parse. You should never need to instantiate this.\n * @implements {Zone}\n */\nclass InvalidZone extends Zone {\n  constructor(zoneName) {\n    super();\n    /**  @private */\n    this.zoneName = zoneName;\n  }\n\n  /** @override **/\n  get type() {\n    return \"invalid\";\n  }\n\n  /** @override **/\n  get name() {\n    return this.zoneName;\n  }\n\n  /** @override **/\n  get isUniversal() {\n    return false;\n  }\n\n  /** @override **/\n  offsetName() {\n    return null;\n  }\n\n  /** @override **/\n  formatOffset() {\n    return \"\";\n  }\n\n  /** @override **/\n  offset() {\n    return NaN;\n  }\n\n  /** @override **/\n  equals() {\n    return false;\n  }\n\n  /** @override **/\n  get isValid() {\n    return false;\n  }\n}\n\n/**\n * @private\n */\n\nfunction normalizeZone(input, defaultZone) {\n  if (isUndefined(input) || input === null) {\n    return defaultZone;\n  } else if (input instanceof Zone) {\n    return input;\n  } else if (isString(input)) {\n    const lowered = input.toLowerCase();\n    if (lowered === \"default\") return defaultZone;\n    else if (lowered === \"local\" || lowered === \"system\") return SystemZone.instance;\n    else if (lowered === \"utc\" || lowered === \"gmt\") return FixedOffsetZone.utcInstance;\n    else return FixedOffsetZone.parseSpecifier(lowered) || IANAZone.create(input);\n  } else if (isNumber(input)) {\n    return FixedOffsetZone.instance(input);\n  } else if (typeof input === \"object\" && \"offset\" in input && typeof input.offset === \"function\") {\n    // This is dumb, but the instanceof check above doesn't seem to really work\n    // so we're duck checking it\n    return input;\n  } else {\n    return new InvalidZone(input);\n  }\n}\n\nconst numberingSystems = {\n  arab: \"[\\u0660-\\u0669]\",\n  arabext: \"[\\u06F0-\\u06F9]\",\n  bali: \"[\\u1B50-\\u1B59]\",\n  beng: \"[\\u09E6-\\u09EF]\",\n  deva: \"[\\u0966-\\u096F]\",\n  fullwide: \"[\\uFF10-\\uFF19]\",\n  gujr: \"[\\u0AE6-\\u0AEF]\",\n  hanidec: \"[〇|一|二|三|四|五|六|七|八|九]\",\n  khmr: \"[\\u17E0-\\u17E9]\",\n  knda: \"[\\u0CE6-\\u0CEF]\",\n  laoo: \"[\\u0ED0-\\u0ED9]\",\n  limb: \"[\\u1946-\\u194F]\",\n  mlym: \"[\\u0D66-\\u0D6F]\",\n  mong: \"[\\u1810-\\u1819]\",\n  mymr: \"[\\u1040-\\u1049]\",\n  orya: \"[\\u0B66-\\u0B6F]\",\n  tamldec: \"[\\u0BE6-\\u0BEF]\",\n  telu: \"[\\u0C66-\\u0C6F]\",\n  thai: \"[\\u0E50-\\u0E59]\",\n  tibt: \"[\\u0F20-\\u0F29]\",\n  latn: \"\\\\d\",\n};\n\nconst numberingSystemsUTF16 = {\n  arab: [1632, 1641],\n  arabext: [1776, 1785],\n  bali: [6992, 7001],\n  beng: [2534, 2543],\n  deva: [2406, 2415],\n  fullwide: [65296, 65303],\n  gujr: [2790, 2799],\n  khmr: [6112, 6121],\n  knda: [3302, 3311],\n  laoo: [3792, 3801],\n  limb: [6470, 6479],\n  mlym: [3430, 3439],\n  mong: [6160, 6169],\n  mymr: [4160, 4169],\n  orya: [2918, 2927],\n  tamldec: [3046, 3055],\n  telu: [3174, 3183],\n  thai: [3664, 3673],\n  tibt: [3872, 3881],\n};\n\nconst hanidecChars = numberingSystems.hanidec.replace(/[\\[|\\]]/g, \"\").split(\"\");\n\nfunction parseDigits(str) {\n  let value = parseInt(str, 10);\n  if (isNaN(value)) {\n    value = \"\";\n    for (let i = 0; i < str.length; i++) {\n      const code = str.charCodeAt(i);\n\n      if (str[i].search(numberingSystems.hanidec) !== -1) {\n        value += hanidecChars.indexOf(str[i]);\n      } else {\n        for (const key in numberingSystemsUTF16) {\n          const [min, max] = numberingSystemsUTF16[key];\n          if (code >= min && code <= max) {\n            value += code - min;\n          }\n        }\n      }\n    }\n    return parseInt(value, 10);\n  } else {\n    return value;\n  }\n}\n\n// cache of {numberingSystem: {append: regex}}\nconst digitRegexCache = new Map();\nfunction resetDigitRegexCache() {\n  digitRegexCache.clear();\n}\n\nfunction digitRegex({ numberingSystem }, append = \"\") {\n  const ns = numberingSystem || \"latn\";\n\n  let appendCache = digitRegexCache.get(ns);\n  if (appendCache === undefined) {\n    appendCache = new Map();\n    digitRegexCache.set(ns, appendCache);\n  }\n  let regex = appendCache.get(append);\n  if (regex === undefined) {\n    regex = new RegExp(`${numberingSystems[ns]}${append}`);\n    appendCache.set(append, regex);\n  }\n\n  return regex;\n}\n\nlet now = () => Date.now(),\n  defaultZone = \"system\",\n  defaultLocale = null,\n  defaultNumberingSystem = null,\n  defaultOutputCalendar = null,\n  twoDigitCutoffYear = 60,\n  throwOnInvalid,\n  defaultWeekSettings = null;\n\n/**\n * Settings contains static getters and setters that control Luxon's overall behavior. Luxon is a simple library with few options, but the ones it does have live here.\n */\nclass Settings {\n  /**\n   * Get the callback for returning the current timestamp.\n   * @type {function}\n   */\n  static get now() {\n    return now;\n  }\n\n  /**\n   * Set the callback for returning the current timestamp.\n   * The function should return a number, which will be interpreted as an Epoch millisecond count\n   * @type {function}\n   * @example Settings.now = () => Date.now() + 3000 // pretend it is 3 seconds in the future\n   * @example Settings.now = () => 0 // always pretend it's Jan 1, 1970 at midnight in UTC time\n   */\n  static set now(n) {\n    now = n;\n  }\n\n  /**\n   * Set the default time zone to create DateTimes in. Does not affect existing instances.\n   * Use the value \"system\" to reset this value to the system's time zone.\n   * @type {string}\n   */\n  static set defaultZone(zone) {\n    defaultZone = zone;\n  }\n\n  /**\n   * Get the default time zone object currently used to create DateTimes. Does not affect existing instances.\n   * The default value is the system's time zone (the one set on the machine that runs this code).\n   * @type {Zone}\n   */\n  static get defaultZone() {\n    return normalizeZone(defaultZone, SystemZone.instance);\n  }\n\n  /**\n   * Get the default locale to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultLocale() {\n    return defaultLocale;\n  }\n\n  /**\n   * Set the default locale to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultLocale(locale) {\n    defaultLocale = locale;\n  }\n\n  /**\n   * Get the default numbering system to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultNumberingSystem() {\n    return defaultNumberingSystem;\n  }\n\n  /**\n   * Set the default numbering system to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultNumberingSystem(numberingSystem) {\n    defaultNumberingSystem = numberingSystem;\n  }\n\n  /**\n   * Get the default output calendar to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static get defaultOutputCalendar() {\n    return defaultOutputCalendar;\n  }\n\n  /**\n   * Set the default output calendar to create DateTimes with. Does not affect existing instances.\n   * @type {string}\n   */\n  static set defaultOutputCalendar(outputCalendar) {\n    defaultOutputCalendar = outputCalendar;\n  }\n\n  /**\n   * @typedef {Object} WeekSettings\n   * @property {number} firstDay\n   * @property {number} minimalDays\n   * @property {number[]} weekend\n   */\n\n  /**\n   * @return {WeekSettings|null}\n   */\n  static get defaultWeekSettings() {\n    return defaultWeekSettings;\n  }\n\n  /**\n   * Allows overriding the default locale week settings, i.e. the start of the week, the weekend and\n   * how many days are required in the first week of a year.\n   * Does not affect existing instances.\n   *\n   * @param {WeekSettings|null} weekSettings\n   */\n  static set defaultWeekSettings(weekSettings) {\n    defaultWeekSettings = validateWeekSettings(weekSettings);\n  }\n\n  /**\n   * Get the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n   * @type {number}\n   */\n  static get twoDigitCutoffYear() {\n    return twoDigitCutoffYear;\n  }\n\n  /**\n   * Set the cutoff year for whether a 2-digit year string is interpreted in the current or previous century. Numbers higher than the cutoff will be considered to mean 19xx and numbers lower or equal to the cutoff will be considered 20xx.\n   * @type {number}\n   * @example Settings.twoDigitCutoffYear = 0 // all 'yy' are interpreted as 20th century\n   * @example Settings.twoDigitCutoffYear = 99 // all 'yy' are interpreted as 21st century\n   * @example Settings.twoDigitCutoffYear = 50 // '49' -> 2049; '50' -> 1950\n   * @example Settings.twoDigitCutoffYear = 1950 // interpreted as 50\n   * @example Settings.twoDigitCutoffYear = 2050 // ALSO interpreted as 50\n   */\n  static set twoDigitCutoffYear(cutoffYear) {\n    twoDigitCutoffYear = cutoffYear % 100;\n  }\n\n  /**\n   * Get whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n   * @type {boolean}\n   */\n  static get throwOnInvalid() {\n    return throwOnInvalid;\n  }\n\n  /**\n   * Set whether Luxon will throw when it encounters invalid DateTimes, Durations, or Intervals\n   * @type {boolean}\n   */\n  static set throwOnInvalid(t) {\n    throwOnInvalid = t;\n  }\n\n  /**\n   * Reset Luxon's global caches. Should only be necessary in testing scenarios.\n   * @return {void}\n   */\n  static resetCaches() {\n    Locale.resetCache();\n    IANAZone.resetCache();\n    DateTime.resetCache();\n    resetDigitRegexCache();\n  }\n}\n\nclass Invalid {\n  constructor(reason, explanation) {\n    this.reason = reason;\n    this.explanation = explanation;\n  }\n\n  toMessage() {\n    if (this.explanation) {\n      return `${this.reason}: ${this.explanation}`;\n    } else {\n      return this.reason;\n    }\n  }\n}\n\nconst nonLeapLadder = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],\n  leapLadder = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335];\n\nfunction unitOutOfRange(unit, value) {\n  return new Invalid(\n    \"unit out of range\",\n    `you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`\n  );\n}\n\nfunction dayOfWeek(year, month, day) {\n  const d = new Date(Date.UTC(year, month - 1, day));\n\n  if (year < 100 && year >= 0) {\n    d.setUTCFullYear(d.getUTCFullYear() - 1900);\n  }\n\n  const js = d.getUTCDay();\n\n  return js === 0 ? 7 : js;\n}\n\nfunction computeOrdinal(year, month, day) {\n  return day + (isLeapYear(year) ? leapLadder : nonLeapLadder)[month - 1];\n}\n\nfunction uncomputeOrdinal(year, ordinal) {\n  const table = isLeapYear(year) ? leapLadder : nonLeapLadder,\n    month0 = table.findIndex((i) => i < ordinal),\n    day = ordinal - table[month0];\n  return { month: month0 + 1, day };\n}\n\nfunction isoWeekdayToLocal(isoWeekday, startOfWeek) {\n  return ((isoWeekday - startOfWeek + 7) % 7) + 1;\n}\n\n/**\n * @private\n */\n\nfunction gregorianToWeek(gregObj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const { year, month, day } = gregObj,\n    ordinal = computeOrdinal(year, month, day),\n    weekday = isoWeekdayToLocal(dayOfWeek(year, month, day), startOfWeek);\n\n  let weekNumber = Math.floor((ordinal - weekday + 14 - minDaysInFirstWeek) / 7),\n    weekYear;\n\n  if (weekNumber < 1) {\n    weekYear = year - 1;\n    weekNumber = weeksInWeekYear(weekYear, minDaysInFirstWeek, startOfWeek);\n  } else if (weekNumber > weeksInWeekYear(year, minDaysInFirstWeek, startOfWeek)) {\n    weekYear = year + 1;\n    weekNumber = 1;\n  } else {\n    weekYear = year;\n  }\n\n  return { weekYear, weekNumber, weekday, ...timeObject(gregObj) };\n}\n\nfunction weekToGregorian(weekData, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const { weekYear, weekNumber, weekday } = weekData,\n    weekdayOfJan4 = isoWeekdayToLocal(dayOfWeek(weekYear, 1, minDaysInFirstWeek), startOfWeek),\n    yearInDays = daysInYear(weekYear);\n\n  let ordinal = weekNumber * 7 + weekday - weekdayOfJan4 - 7 + minDaysInFirstWeek,\n    year;\n\n  if (ordinal < 1) {\n    year = weekYear - 1;\n    ordinal += daysInYear(year);\n  } else if (ordinal > yearInDays) {\n    year = weekYear + 1;\n    ordinal -= daysInYear(weekYear);\n  } else {\n    year = weekYear;\n  }\n\n  const { month, day } = uncomputeOrdinal(year, ordinal);\n  return { year, month, day, ...timeObject(weekData) };\n}\n\nfunction gregorianToOrdinal(gregData) {\n  const { year, month, day } = gregData;\n  const ordinal = computeOrdinal(year, month, day);\n  return { year, ordinal, ...timeObject(gregData) };\n}\n\nfunction ordinalToGregorian(ordinalData) {\n  const { year, ordinal } = ordinalData;\n  const { month, day } = uncomputeOrdinal(year, ordinal);\n  return { year, month, day, ...timeObject(ordinalData) };\n}\n\n/**\n * Check if local week units like localWeekday are used in obj.\n * If so, validates that they are not mixed with ISO week units and then copies them to the normal week unit properties.\n * Modifies obj in-place!\n * @param obj the object values\n */\nfunction usesLocalWeekValues(obj, loc) {\n  const hasLocaleWeekData =\n    !isUndefined(obj.localWeekday) ||\n    !isUndefined(obj.localWeekNumber) ||\n    !isUndefined(obj.localWeekYear);\n  if (hasLocaleWeekData) {\n    const hasIsoWeekData =\n      !isUndefined(obj.weekday) || !isUndefined(obj.weekNumber) || !isUndefined(obj.weekYear);\n\n    if (hasIsoWeekData) {\n      throw new ConflictingSpecificationError(\n        \"Cannot mix locale-based week fields with ISO-based week fields\"\n      );\n    }\n    if (!isUndefined(obj.localWeekday)) obj.weekday = obj.localWeekday;\n    if (!isUndefined(obj.localWeekNumber)) obj.weekNumber = obj.localWeekNumber;\n    if (!isUndefined(obj.localWeekYear)) obj.weekYear = obj.localWeekYear;\n    delete obj.localWeekday;\n    delete obj.localWeekNumber;\n    delete obj.localWeekYear;\n    return {\n      minDaysInFirstWeek: loc.getMinDaysInFirstWeek(),\n      startOfWeek: loc.getStartOfWeek(),\n    };\n  } else {\n    return { minDaysInFirstWeek: 4, startOfWeek: 1 };\n  }\n}\n\nfunction hasInvalidWeekData(obj, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const validYear = isInteger(obj.weekYear),\n    validWeek = integerBetween(\n      obj.weekNumber,\n      1,\n      weeksInWeekYear(obj.weekYear, minDaysInFirstWeek, startOfWeek)\n    ),\n    validWeekday = integerBetween(obj.weekday, 1, 7);\n\n  if (!validYear) {\n    return unitOutOfRange(\"weekYear\", obj.weekYear);\n  } else if (!validWeek) {\n    return unitOutOfRange(\"week\", obj.weekNumber);\n  } else if (!validWeekday) {\n    return unitOutOfRange(\"weekday\", obj.weekday);\n  } else return false;\n}\n\nfunction hasInvalidOrdinalData(obj) {\n  const validYear = isInteger(obj.year),\n    validOrdinal = integerBetween(obj.ordinal, 1, daysInYear(obj.year));\n\n  if (!validYear) {\n    return unitOutOfRange(\"year\", obj.year);\n  } else if (!validOrdinal) {\n    return unitOutOfRange(\"ordinal\", obj.ordinal);\n  } else return false;\n}\n\nfunction hasInvalidGregorianData(obj) {\n  const validYear = isInteger(obj.year),\n    validMonth = integerBetween(obj.month, 1, 12),\n    validDay = integerBetween(obj.day, 1, daysInMonth(obj.year, obj.month));\n\n  if (!validYear) {\n    return unitOutOfRange(\"year\", obj.year);\n  } else if (!validMonth) {\n    return unitOutOfRange(\"month\", obj.month);\n  } else if (!validDay) {\n    return unitOutOfRange(\"day\", obj.day);\n  } else return false;\n}\n\nfunction hasInvalidTimeData(obj) {\n  const { hour, minute, second, millisecond } = obj;\n  const validHour =\n      integerBetween(hour, 0, 23) ||\n      (hour === 24 && minute === 0 && second === 0 && millisecond === 0),\n    validMinute = integerBetween(minute, 0, 59),\n    validSecond = integerBetween(second, 0, 59),\n    validMillisecond = integerBetween(millisecond, 0, 999);\n\n  if (!validHour) {\n    return unitOutOfRange(\"hour\", hour);\n  } else if (!validMinute) {\n    return unitOutOfRange(\"minute\", minute);\n  } else if (!validSecond) {\n    return unitOutOfRange(\"second\", second);\n  } else if (!validMillisecond) {\n    return unitOutOfRange(\"millisecond\", millisecond);\n  } else return false;\n}\n\n/*\n  This is just a junk drawer, containing anything used across multiple classes.\n  Because Luxon is small(ish), this should stay small and we won't worry about splitting\n  it up into, say, parsingUtil.js and basicUtil.js and so on. But they are divided up by feature area.\n*/\n\n/**\n * @private\n */\n\n// TYPES\n\nfunction isUndefined(o) {\n  return typeof o === \"undefined\";\n}\n\nfunction isNumber(o) {\n  return typeof o === \"number\";\n}\n\nfunction isInteger(o) {\n  return typeof o === \"number\" && o % 1 === 0;\n}\n\nfunction isString(o) {\n  return typeof o === \"string\";\n}\n\nfunction isDate(o) {\n  return Object.prototype.toString.call(o) === \"[object Date]\";\n}\n\n// CAPABILITIES\n\nfunction hasRelative() {\n  try {\n    return typeof Intl !== \"undefined\" && !!Intl.RelativeTimeFormat;\n  } catch (e) {\n    return false;\n  }\n}\n\nfunction hasLocaleWeekInfo() {\n  try {\n    return (\n      typeof Intl !== \"undefined\" &&\n      !!Intl.Locale &&\n      (\"weekInfo\" in Intl.Locale.prototype || \"getWeekInfo\" in Intl.Locale.prototype)\n    );\n  } catch (e) {\n    return false;\n  }\n}\n\n// OBJECTS AND ARRAYS\n\nfunction maybeArray(thing) {\n  return Array.isArray(thing) ? thing : [thing];\n}\n\nfunction bestBy(arr, by, compare) {\n  if (arr.length === 0) {\n    return undefined;\n  }\n  return arr.reduce((best, next) => {\n    const pair = [by(next), next];\n    if (!best) {\n      return pair;\n    } else if (compare(best[0], pair[0]) === best[0]) {\n      return best;\n    } else {\n      return pair;\n    }\n  }, null)[1];\n}\n\nfunction pick(obj, keys) {\n  return keys.reduce((a, k) => {\n    a[k] = obj[k];\n    return a;\n  }, {});\n}\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nfunction validateWeekSettings(settings) {\n  if (settings == null) {\n    return null;\n  } else if (typeof settings !== \"object\") {\n    throw new InvalidArgumentError(\"Week settings must be an object\");\n  } else {\n    if (\n      !integerBetween(settings.firstDay, 1, 7) ||\n      !integerBetween(settings.minimalDays, 1, 7) ||\n      !Array.isArray(settings.weekend) ||\n      settings.weekend.some((v) => !integerBetween(v, 1, 7))\n    ) {\n      throw new InvalidArgumentError(\"Invalid week settings\");\n    }\n    return {\n      firstDay: settings.firstDay,\n      minimalDays: settings.minimalDays,\n      weekend: Array.from(settings.weekend),\n    };\n  }\n}\n\n// NUMBERS AND STRINGS\n\nfunction integerBetween(thing, bottom, top) {\n  return isInteger(thing) && thing >= bottom && thing <= top;\n}\n\n// x % n but takes the sign of n instead of x\nfunction floorMod(x, n) {\n  return x - n * Math.floor(x / n);\n}\n\nfunction padStart(input, n = 2) {\n  const isNeg = input < 0;\n  let padded;\n  if (isNeg) {\n    padded = \"-\" + (\"\" + -input).padStart(n, \"0\");\n  } else {\n    padded = (\"\" + input).padStart(n, \"0\");\n  }\n  return padded;\n}\n\nfunction parseInteger(string) {\n  if (isUndefined(string) || string === null || string === \"\") {\n    return undefined;\n  } else {\n    return parseInt(string, 10);\n  }\n}\n\nfunction parseFloating(string) {\n  if (isUndefined(string) || string === null || string === \"\") {\n    return undefined;\n  } else {\n    return parseFloat(string);\n  }\n}\n\nfunction parseMillis(fraction) {\n  // Return undefined (instead of 0) in these cases, where fraction is not set\n  if (isUndefined(fraction) || fraction === null || fraction === \"\") {\n    return undefined;\n  } else {\n    const f = parseFloat(\"0.\" + fraction) * 1000;\n    return Math.floor(f);\n  }\n}\n\nfunction roundTo(number, digits, rounding = \"round\") {\n  const factor = 10 ** digits;\n  switch (rounding) {\n    case \"expand\":\n      return number > 0\n        ? Math.ceil(number * factor) / factor\n        : Math.floor(number * factor) / factor;\n    case \"trunc\":\n      return Math.trunc(number * factor) / factor;\n    case \"round\":\n      return Math.round(number * factor) / factor;\n    case \"floor\":\n      return Math.floor(number * factor) / factor;\n    case \"ceil\":\n      return Math.ceil(number * factor) / factor;\n    default:\n      throw new RangeError(`Value rounding ${rounding} is out of range`);\n  }\n}\n\n// DATE BASICS\n\nfunction isLeapYear(year) {\n  return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n}\n\nfunction daysInYear(year) {\n  return isLeapYear(year) ? 366 : 365;\n}\n\nfunction daysInMonth(year, month) {\n  const modMonth = floorMod(month - 1, 12) + 1,\n    modYear = year + (month - modMonth) / 12;\n\n  if (modMonth === 2) {\n    return isLeapYear(modYear) ? 29 : 28;\n  } else {\n    return [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][modMonth - 1];\n  }\n}\n\n// convert a calendar object to a local timestamp (epoch, but with the offset baked in)\nfunction objToLocalTS(obj) {\n  let d = Date.UTC(\n    obj.year,\n    obj.month - 1,\n    obj.day,\n    obj.hour,\n    obj.minute,\n    obj.second,\n    obj.millisecond\n  );\n\n  // for legacy reasons, years between 0 and 99 are interpreted as 19XX; revert that\n  if (obj.year < 100 && obj.year >= 0) {\n    d = new Date(d);\n    // set the month and day again, this is necessary because year 2000 is a leap year, but year 100 is not\n    // so if obj.year is in 99, but obj.day makes it roll over into year 100,\n    // the calculations done by Date.UTC are using year 2000 - which is incorrect\n    d.setUTCFullYear(obj.year, obj.month - 1, obj.day);\n  }\n  return +d;\n}\n\n// adapted from moment.js: https://github.com/moment/moment/blob/000ac1800e620f770f4eb31b5ae908f6167b0ab2/src/lib/units/week-calendar-utils.js\nfunction firstWeekOffset(year, minDaysInFirstWeek, startOfWeek) {\n  const fwdlw = isoWeekdayToLocal(dayOfWeek(year, 1, minDaysInFirstWeek), startOfWeek);\n  return -fwdlw + minDaysInFirstWeek - 1;\n}\n\nfunction weeksInWeekYear(weekYear, minDaysInFirstWeek = 4, startOfWeek = 1) {\n  const weekOffset = firstWeekOffset(weekYear, minDaysInFirstWeek, startOfWeek);\n  const weekOffsetNext = firstWeekOffset(weekYear + 1, minDaysInFirstWeek, startOfWeek);\n  return (daysInYear(weekYear) - weekOffset + weekOffsetNext) / 7;\n}\n\nfunction untruncateYear(year) {\n  if (year > 99) {\n    return year;\n  } else return year > Settings.twoDigitCutoffYear ? 1900 + year : 2000 + year;\n}\n\n// PARSING\n\nfunction parseZoneInfo(ts, offsetFormat, locale, timeZone = null) {\n  const date = new Date(ts),\n    intlOpts = {\n      hourCycle: \"h23\",\n      year: \"numeric\",\n      month: \"2-digit\",\n      day: \"2-digit\",\n      hour: \"2-digit\",\n      minute: \"2-digit\",\n    };\n\n  if (timeZone) {\n    intlOpts.timeZone = timeZone;\n  }\n\n  const modified = { timeZoneName: offsetFormat, ...intlOpts };\n\n  const parsed = new Intl.DateTimeFormat(locale, modified)\n    .formatToParts(date)\n    .find((m) => m.type.toLowerCase() === \"timezonename\");\n  return parsed ? parsed.value : null;\n}\n\n// signedOffset('-5', '30') -> -330\nfunction signedOffset(offHourStr, offMinuteStr) {\n  let offHour = parseInt(offHourStr, 10);\n\n  // don't || this because we want to preserve -0\n  if (Number.isNaN(offHour)) {\n    offHour = 0;\n  }\n\n  const offMin = parseInt(offMinuteStr, 10) || 0,\n    offMinSigned = offHour < 0 || Object.is(offHour, -0) ? -offMin : offMin;\n  return offHour * 60 + offMinSigned;\n}\n\n// COERCION\n\nfunction asNumber(value) {\n  const numericValue = Number(value);\n  if (typeof value === \"boolean\" || value === \"\" || !Number.isFinite(numericValue))\n    throw new InvalidArgumentError(`Invalid unit value ${value}`);\n  return numericValue;\n}\n\nfunction normalizeObject(obj, normalizer) {\n  const normalized = {};\n  for (const u in obj) {\n    if (hasOwnProperty(obj, u)) {\n      const v = obj[u];\n      if (v === undefined || v === null) continue;\n      normalized[normalizer(u)] = asNumber(v);\n    }\n  }\n  return normalized;\n}\n\n/**\n * Returns the offset's value as a string\n * @param {number} ts - Epoch milliseconds for which to get the offset\n * @param {string} format - What style of offset to return.\n *                          Accepts 'narrow', 'short', or 'techie'. Returning '+6', '+06:00', or '+0600' respectively\n * @return {string}\n */\nfunction formatOffset(offset, format) {\n  const hours = Math.trunc(Math.abs(offset / 60)),\n    minutes = Math.trunc(Math.abs(offset % 60)),\n    sign = offset >= 0 ? \"+\" : \"-\";\n\n  switch (format) {\n    case \"short\":\n      return `${sign}${padStart(hours, 2)}:${padStart(minutes, 2)}`;\n    case \"narrow\":\n      return `${sign}${hours}${minutes > 0 ? `:${minutes}` : \"\"}`;\n    case \"techie\":\n      return `${sign}${padStart(hours, 2)}${padStart(minutes, 2)}`;\n    default:\n      throw new RangeError(`Value format ${format} is out of range for property format`);\n  }\n}\n\nfunction timeObject(obj) {\n  return pick(obj, [\"hour\", \"minute\", \"second\", \"millisecond\"]);\n}\n\n/**\n * @private\n */\n\nconst monthsLong = [\n  \"January\",\n  \"February\",\n  \"March\",\n  \"April\",\n  \"May\",\n  \"June\",\n  \"July\",\n  \"August\",\n  \"September\",\n  \"October\",\n  \"November\",\n  \"December\",\n];\n\nconst monthsShort = [\n  \"Jan\",\n  \"Feb\",\n  \"Mar\",\n  \"Apr\",\n  \"May\",\n  \"Jun\",\n  \"Jul\",\n  \"Aug\",\n  \"Sep\",\n  \"Oct\",\n  \"Nov\",\n  \"Dec\",\n];\n\nconst monthsNarrow = [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"];\n\nfunction months(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...monthsNarrow];\n    case \"short\":\n      return [...monthsShort];\n    case \"long\":\n      return [...monthsLong];\n    case \"numeric\":\n      return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"];\n    case \"2-digit\":\n      return [\"01\", \"02\", \"03\", \"04\", \"05\", \"06\", \"07\", \"08\", \"09\", \"10\", \"11\", \"12\"];\n    default:\n      return null;\n  }\n}\n\nconst weekdaysLong = [\n  \"Monday\",\n  \"Tuesday\",\n  \"Wednesday\",\n  \"Thursday\",\n  \"Friday\",\n  \"Saturday\",\n  \"Sunday\",\n];\n\nconst weekdaysShort = [\"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\", \"Sun\"];\n\nconst weekdaysNarrow = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\nfunction weekdays(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...weekdaysNarrow];\n    case \"short\":\n      return [...weekdaysShort];\n    case \"long\":\n      return [...weekdaysLong];\n    case \"numeric\":\n      return [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\"];\n    default:\n      return null;\n  }\n}\n\nconst meridiems = [\"AM\", \"PM\"];\n\nconst erasLong = [\"Before Christ\", \"Anno Domini\"];\n\nconst erasShort = [\"BC\", \"AD\"];\n\nconst erasNarrow = [\"B\", \"A\"];\n\nfunction eras(length) {\n  switch (length) {\n    case \"narrow\":\n      return [...erasNarrow];\n    case \"short\":\n      return [...erasShort];\n    case \"long\":\n      return [...erasLong];\n    default:\n      return null;\n  }\n}\n\nfunction meridiemForDateTime(dt) {\n  return meridiems[dt.hour < 12 ? 0 : 1];\n}\n\nfunction weekdayForDateTime(dt, length) {\n  return weekdays(length)[dt.weekday - 1];\n}\n\nfunction monthForDateTime(dt, length) {\n  return months(length)[dt.month - 1];\n}\n\nfunction eraForDateTime(dt, length) {\n  return eras(length)[dt.year < 0 ? 0 : 1];\n}\n\nfunction formatRelativeTime(unit, count, numeric = \"always\", narrow = false) {\n  const units = {\n    years: [\"year\", \"yr.\"],\n    quarters: [\"quarter\", \"qtr.\"],\n    months: [\"month\", \"mo.\"],\n    weeks: [\"week\", \"wk.\"],\n    days: [\"day\", \"day\", \"days\"],\n    hours: [\"hour\", \"hr.\"],\n    minutes: [\"minute\", \"min.\"],\n    seconds: [\"second\", \"sec.\"],\n  };\n\n  const lastable = [\"hours\", \"minutes\", \"seconds\"].indexOf(unit) === -1;\n\n  if (numeric === \"auto\" && lastable) {\n    const isDay = unit === \"days\";\n    switch (count) {\n      case 1:\n        return isDay ? \"tomorrow\" : `next ${units[unit][0]}`;\n      case -1:\n        return isDay ? \"yesterday\" : `last ${units[unit][0]}`;\n      case 0:\n        return isDay ? \"today\" : `this ${units[unit][0]}`;\n    }\n  }\n\n  const isInPast = Object.is(count, -0) || count < 0,\n    fmtValue = Math.abs(count),\n    singular = fmtValue === 1,\n    lilUnits = units[unit],\n    fmtUnit = narrow\n      ? singular\n        ? lilUnits[1]\n        : lilUnits[2] || lilUnits[1]\n      : singular\n      ? units[unit][0]\n      : unit;\n  return isInPast ? `${fmtValue} ${fmtUnit} ago` : `in ${fmtValue} ${fmtUnit}`;\n}\n\nfunction stringifyTokens(splits, tokenToString) {\n  let s = \"\";\n  for (const token of splits) {\n    if (token.literal) {\n      s += token.val;\n    } else {\n      s += tokenToString(token.val);\n    }\n  }\n  return s;\n}\n\nconst macroTokenToFormatOpts = {\n  D: DATE_SHORT,\n  DD: DATE_MED,\n  DDD: DATE_FULL,\n  DDDD: DATE_HUGE,\n  t: TIME_SIMPLE,\n  tt: TIME_WITH_SECONDS,\n  ttt: TIME_WITH_SHORT_OFFSET,\n  tttt: TIME_WITH_LONG_OFFSET,\n  T: TIME_24_SIMPLE,\n  TT: TIME_24_WITH_SECONDS,\n  TTT: TIME_24_WITH_SHORT_OFFSET,\n  TTTT: TIME_24_WITH_LONG_OFFSET,\n  f: DATETIME_SHORT,\n  ff: DATETIME_MED,\n  fff: DATETIME_FULL,\n  ffff: DATETIME_HUGE,\n  F: DATETIME_SHORT_WITH_SECONDS,\n  FF: DATETIME_MED_WITH_SECONDS,\n  FFF: DATETIME_FULL_WITH_SECONDS,\n  FFFF: DATETIME_HUGE_WITH_SECONDS,\n};\n\n/**\n * @private\n */\n\nclass Formatter {\n  static create(locale, opts = {}) {\n    return new Formatter(locale, opts);\n  }\n\n  static parseFormat(fmt) {\n    // white-space is always considered a literal in user-provided formats\n    // the \" \" token has a special meaning (see unitForToken)\n\n    let current = null,\n      currentFull = \"\",\n      bracketed = false;\n    const splits = [];\n    for (let i = 0; i < fmt.length; i++) {\n      const c = fmt.charAt(i);\n      if (c === \"'\") {\n        // turn '' into a literal signal quote instead of just skipping the empty literal\n        if (currentFull.length > 0 || bracketed) {\n          splits.push({\n            literal: bracketed || /^\\s+$/.test(currentFull),\n            val: currentFull === \"\" ? \"'\" : currentFull,\n          });\n        }\n        current = null;\n        currentFull = \"\";\n        bracketed = !bracketed;\n      } else if (bracketed) {\n        currentFull += c;\n      } else if (c === current) {\n        currentFull += c;\n      } else {\n        if (currentFull.length > 0) {\n          splits.push({ literal: /^\\s+$/.test(currentFull), val: currentFull });\n        }\n        currentFull = c;\n        current = c;\n      }\n    }\n\n    if (currentFull.length > 0) {\n      splits.push({ literal: bracketed || /^\\s+$/.test(currentFull), val: currentFull });\n    }\n\n    return splits;\n  }\n\n  static macroTokenToFormatOpts(token) {\n    return macroTokenToFormatOpts[token];\n  }\n\n  constructor(locale, formatOpts) {\n    this.opts = formatOpts;\n    this.loc = locale;\n    this.systemLoc = null;\n  }\n\n  formatWithSystemDefault(dt, opts) {\n    if (this.systemLoc === null) {\n      this.systemLoc = this.loc.redefaultToSystem();\n    }\n    const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });\n    return df.format();\n  }\n\n  dtFormatter(dt, opts = {}) {\n    return this.loc.dtFormatter(dt, { ...this.opts, ...opts });\n  }\n\n  formatDateTime(dt, opts) {\n    return this.dtFormatter(dt, opts).format();\n  }\n\n  formatDateTimeParts(dt, opts) {\n    return this.dtFormatter(dt, opts).formatToParts();\n  }\n\n  formatInterval(interval, opts) {\n    const df = this.dtFormatter(interval.start, opts);\n    return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());\n  }\n\n  resolvedOptions(dt, opts) {\n    return this.dtFormatter(dt, opts).resolvedOptions();\n  }\n\n  num(n, p = 0, signDisplay = undefined) {\n    // we get some perf out of doing this here, annoyingly\n    if (this.opts.forceSimple) {\n      return padStart(n, p);\n    }\n\n    const opts = { ...this.opts };\n\n    if (p > 0) {\n      opts.padTo = p;\n    }\n    if (signDisplay) {\n      opts.signDisplay = signDisplay;\n    }\n\n    return this.loc.numberFormatter(opts).format(n);\n  }\n\n  formatDateTimeFromString(dt, fmt) {\n    const knownEnglish = this.loc.listingMode() === \"en\",\n      useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== \"gregory\",\n      string = (opts, extract) => this.loc.extract(dt, opts, extract),\n      formatOffset = (opts) => {\n        if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {\n          return \"Z\";\n        }\n\n        return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : \"\";\n      },\n      meridiem = () =>\n        knownEnglish\n          ? meridiemForDateTime(dt)\n          : string({ hour: \"numeric\", hourCycle: \"h12\" }, \"dayperiod\"),\n      month = (length, standalone) =>\n        knownEnglish\n          ? monthForDateTime(dt, length)\n          : string(standalone ? { month: length } : { month: length, day: \"numeric\" }, \"month\"),\n      weekday = (length, standalone) =>\n        knownEnglish\n          ? weekdayForDateTime(dt, length)\n          : string(\n              standalone ? { weekday: length } : { weekday: length, month: \"long\", day: \"numeric\" },\n              \"weekday\"\n            ),\n      maybeMacro = (token) => {\n        const formatOpts = Formatter.macroTokenToFormatOpts(token);\n        if (formatOpts) {\n          return this.formatWithSystemDefault(dt, formatOpts);\n        } else {\n          return token;\n        }\n      },\n      era = (length) =>\n        knownEnglish ? eraForDateTime(dt, length) : string({ era: length }, \"era\"),\n      tokenToString = (token) => {\n        // Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols\n        switch (token) {\n          // ms\n          case \"S\":\n            return this.num(dt.millisecond);\n          case \"u\":\n          // falls through\n          case \"SSS\":\n            return this.num(dt.millisecond, 3);\n          // seconds\n          case \"s\":\n            return this.num(dt.second);\n          case \"ss\":\n            return this.num(dt.second, 2);\n          // fractional seconds\n          case \"uu\":\n            return this.num(Math.floor(dt.millisecond / 10), 2);\n          case \"uuu\":\n            return this.num(Math.floor(dt.millisecond / 100));\n          // minutes\n          case \"m\":\n            return this.num(dt.minute);\n          case \"mm\":\n            return this.num(dt.minute, 2);\n          // hours\n          case \"h\":\n            return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);\n          case \"hh\":\n            return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);\n          case \"H\":\n            return this.num(dt.hour);\n          case \"HH\":\n            return this.num(dt.hour, 2);\n          // offset\n          case \"Z\":\n            // like +6\n            return formatOffset({ format: \"narrow\", allowZ: this.opts.allowZ });\n          case \"ZZ\":\n            // like +06:00\n            return formatOffset({ format: \"short\", allowZ: this.opts.allowZ });\n          case \"ZZZ\":\n            // like +0600\n            return formatOffset({ format: \"techie\", allowZ: this.opts.allowZ });\n          case \"ZZZZ\":\n            // like EST\n            return dt.zone.offsetName(dt.ts, { format: \"short\", locale: this.loc.locale });\n          case \"ZZZZZ\":\n            // like Eastern Standard Time\n            return dt.zone.offsetName(dt.ts, { format: \"long\", locale: this.loc.locale });\n          // zone\n          case \"z\":\n            // like America/New_York\n            return dt.zoneName;\n          // meridiems\n          case \"a\":\n            return meridiem();\n          // dates\n          case \"d\":\n            return useDateTimeFormatter ? string({ day: \"numeric\" }, \"day\") : this.num(dt.day);\n          case \"dd\":\n            return useDateTimeFormatter ? string({ day: \"2-digit\" }, \"day\") : this.num(dt.day, 2);\n          // weekdays - standalone\n          case \"c\":\n            // like 1\n            return this.num(dt.weekday);\n          case \"ccc\":\n            // like 'Tues'\n            return weekday(\"short\", true);\n          case \"cccc\":\n            // like 'Tuesday'\n            return weekday(\"long\", true);\n          case \"ccccc\":\n            // like 'T'\n            return weekday(\"narrow\", true);\n          // weekdays - format\n          case \"E\":\n            // like 1\n            return this.num(dt.weekday);\n          case \"EEE\":\n            // like 'Tues'\n            return weekday(\"short\", false);\n          case \"EEEE\":\n            // like 'Tuesday'\n            return weekday(\"long\", false);\n          case \"EEEEE\":\n            // like 'T'\n            return weekday(\"narrow\", false);\n          // months - standalone\n          case \"L\":\n            // like 1\n            return useDateTimeFormatter\n              ? string({ month: \"numeric\", day: \"numeric\" }, \"month\")\n              : this.num(dt.month);\n          case \"LL\":\n            // like 01, doesn't seem to work\n            return useDateTimeFormatter\n              ? string({ month: \"2-digit\", day: \"numeric\" }, \"month\")\n              : this.num(dt.month, 2);\n          case \"LLL\":\n            // like Jan\n            return month(\"short\", true);\n          case \"LLLL\":\n            // like January\n            return month(\"long\", true);\n          case \"LLLLL\":\n            // like J\n            return month(\"narrow\", true);\n          // months - format\n          case \"M\":\n            // like 1\n            return useDateTimeFormatter\n              ? string({ month: \"numeric\" }, \"month\")\n              : this.num(dt.month);\n          case \"MM\":\n            // like 01\n            return useDateTimeFormatter\n              ? string({ month: \"2-digit\" }, \"month\")\n              : this.num(dt.month, 2);\n          case \"MMM\":\n            // like Jan\n            return month(\"short\", false);\n          case \"MMMM\":\n            // like January\n            return month(\"long\", false);\n          case \"MMMMM\":\n            // like J\n            return month(\"narrow\", false);\n          // years\n          case \"y\":\n            // like 2014\n            return useDateTimeFormatter ? string({ year: \"numeric\" }, \"year\") : this.num(dt.year);\n          case \"yy\":\n            // like 14\n            return useDateTimeFormatter\n              ? string({ year: \"2-digit\" }, \"year\")\n              : this.num(dt.year.toString().slice(-2), 2);\n          case \"yyyy\":\n            // like 0012\n            return useDateTimeFormatter\n              ? string({ year: \"numeric\" }, \"year\")\n              : this.num(dt.year, 4);\n          case \"yyyyyy\":\n            // like 000012\n            return useDateTimeFormatter\n              ? string({ year: \"numeric\" }, \"year\")\n              : this.num(dt.year, 6);\n          // eras\n          case \"G\":\n            // like AD\n            return era(\"short\");\n          case \"GG\":\n            // like Anno Domini\n            return era(\"long\");\n          case \"GGGGG\":\n            return era(\"narrow\");\n          case \"kk\":\n            return this.num(dt.weekYear.toString().slice(-2), 2);\n          case \"kkkk\":\n            return this.num(dt.weekYear, 4);\n          case \"W\":\n            return this.num(dt.weekNumber);\n          case \"WW\":\n            return this.num(dt.weekNumber, 2);\n          case \"n\":\n            return this.num(dt.localWeekNumber);\n          case \"nn\":\n            return this.num(dt.localWeekNumber, 2);\n          case \"ii\":\n            return this.num(dt.localWeekYear.toString().slice(-2), 2);\n          case \"iiii\":\n            return this.num(dt.localWeekYear, 4);\n          case \"o\":\n            return this.num(dt.ordinal);\n          case \"ooo\":\n            return this.num(dt.ordinal, 3);\n          case \"q\":\n            // like 1\n            return this.num(dt.quarter);\n          case \"qq\":\n            // like 01\n            return this.num(dt.quarter, 2);\n          case \"X\":\n            return this.num(Math.floor(dt.ts / 1000));\n          case \"x\":\n            return this.num(dt.ts);\n          default:\n            return maybeMacro(token);\n        }\n      };\n\n    return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);\n  }\n\n  formatDurationFromString(dur, fmt) {\n    const invertLargest = this.opts.signMode === \"negativeLargestOnly\" ? -1 : 1;\n    const tokenToField = (token) => {\n        switch (token[0]) {\n          case \"S\":\n            return \"milliseconds\";\n          case \"s\":\n            return \"seconds\";\n          case \"m\":\n            return \"minutes\";\n          case \"h\":\n            return \"hours\";\n          case \"d\":\n            return \"days\";\n          case \"w\":\n            return \"weeks\";\n          case \"M\":\n            return \"months\";\n          case \"y\":\n            return \"years\";\n          default:\n            return null;\n        }\n      },\n      tokenToString = (lildur, info) => (token) => {\n        const mapped = tokenToField(token);\n        if (mapped) {\n          const inversionFactor =\n            info.isNegativeDuration && mapped !== info.largestUnit ? invertLargest : 1;\n          let signDisplay;\n          if (this.opts.signMode === \"negativeLargestOnly\" && mapped !== info.largestUnit) {\n            signDisplay = \"never\";\n          } else if (this.opts.signMode === \"all\") {\n            signDisplay = \"always\";\n          } else {\n            // \"auto\" and \"negative\" are the same, but \"auto\" has better support\n            signDisplay = \"auto\";\n          }\n          return this.num(lildur.get(mapped) * inversionFactor, token.length, signDisplay);\n        } else {\n          return token;\n        }\n      },\n      tokens = Formatter.parseFormat(fmt),\n      realTokens = tokens.reduce(\n        (found, { literal, val }) => (literal ? found : found.concat(val)),\n        []\n      ),\n      collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t)),\n      durationInfo = {\n        isNegativeDuration: collapsed < 0,\n        // this relies on \"collapsed\" being based on \"shiftTo\", which builds up the object\n        // in order\n        largestUnit: Object.keys(collapsed.values)[0],\n      };\n    return stringifyTokens(tokens, tokenToString(collapsed, durationInfo));\n  }\n}\n\n/*\n * This file handles parsing for well-specified formats. Here's how it works:\n * Two things go into parsing: a regex to match with and an extractor to take apart the groups in the match.\n * An extractor is just a function that takes a regex match array and returns a { year: ..., month: ... } object\n * parse() does the work of executing the regex and applying the extractor. It takes multiple regex/extractor pairs to try in sequence.\n * Extractors can take a \"cursor\" representing the offset in the match to look at. This makes it easy to combine extractors.\n * combineExtractors() does the work of combining them, keeping track of the cursor through multiple extractions.\n * Some extractions are super dumb and simpleParse and fromStrings help DRY them.\n */\n\nconst ianaRegex = /[A-Za-z_+-]{1,256}(?::?\\/[A-Za-z0-9_+-]{1,256}(?:\\/[A-Za-z0-9_+-]{1,256})?)?/;\n\nfunction combineRegexes(...regexes) {\n  const full = regexes.reduce((f, r) => f + r.source, \"\");\n  return RegExp(`^${full}$`);\n}\n\nfunction combineExtractors(...extractors) {\n  return (m) =>\n    extractors\n      .reduce(\n        ([mergedVals, mergedZone, cursor], ex) => {\n          const [val, zone, next] = ex(m, cursor);\n          return [{ ...mergedVals, ...val }, zone || mergedZone, next];\n        },\n        [{}, null, 1]\n      )\n      .slice(0, 2);\n}\n\nfunction parse(s, ...patterns) {\n  if (s == null) {\n    return [null, null];\n  }\n\n  for (const [regex, extractor] of patterns) {\n    const m = regex.exec(s);\n    if (m) {\n      return extractor(m);\n    }\n  }\n  return [null, null];\n}\n\nfunction simpleParse(...keys) {\n  return (match, cursor) => {\n    const ret = {};\n    let i;\n\n    for (i = 0; i < keys.length; i++) {\n      ret[keys[i]] = parseInteger(match[cursor + i]);\n    }\n    return [ret, null, cursor + i];\n  };\n}\n\n// ISO and SQL parsing\nconst offsetRegex = /(?:([Zz])|([+-]\\d\\d)(?::?(\\d\\d))?)/;\nconst isoExtendedZone = `(?:${offsetRegex.source}?(?:\\\\[(${ianaRegex.source})\\\\])?)?`;\nconst isoTimeBaseRegex = /(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:[.,](\\d{1,30}))?)?)?/;\nconst isoTimeRegex = RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`);\nconst isoTimeExtensionRegex = RegExp(`(?:[Tt]${isoTimeRegex.source})?`);\nconst isoYmdRegex = /([+-]\\d{6}|\\d{4})(?:-?(\\d\\d)(?:-?(\\d\\d))?)?/;\nconst isoWeekRegex = /(\\d{4})-?W(\\d\\d)(?:-?(\\d))?/;\nconst isoOrdinalRegex = /(\\d{4})-?(\\d{3})/;\nconst extractISOWeekData = simpleParse(\"weekYear\", \"weekNumber\", \"weekDay\");\nconst extractISOOrdinalData = simpleParse(\"year\", \"ordinal\");\nconst sqlYmdRegex = /(\\d{4})-(\\d\\d)-(\\d\\d)/; // dumbed-down version of the ISO one\nconst sqlTimeRegex = RegExp(\n  `${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`\n);\nconst sqlTimeExtensionRegex = RegExp(`(?: ${sqlTimeRegex.source})?`);\n\nfunction int(match, pos, fallback) {\n  const m = match[pos];\n  return isUndefined(m) ? fallback : parseInteger(m);\n}\n\nfunction extractISOYmd(match, cursor) {\n  const item = {\n    year: int(match, cursor),\n    month: int(match, cursor + 1, 1),\n    day: int(match, cursor + 2, 1),\n  };\n\n  return [item, null, cursor + 3];\n}\n\nfunction extractISOTime(match, cursor) {\n  const item = {\n    hours: int(match, cursor, 0),\n    minutes: int(match, cursor + 1, 0),\n    seconds: int(match, cursor + 2, 0),\n    milliseconds: parseMillis(match[cursor + 3]),\n  };\n\n  return [item, null, cursor + 4];\n}\n\nfunction extractISOOffset(match, cursor) {\n  const local = !match[cursor] && !match[cursor + 1],\n    fullOffset = signedOffset(match[cursor + 1], match[cursor + 2]),\n    zone = local ? null : FixedOffsetZone.instance(fullOffset);\n  return [{}, zone, cursor + 3];\n}\n\nfunction extractIANAZone(match, cursor) {\n  const zone = match[cursor] ? IANAZone.create(match[cursor]) : null;\n  return [{}, zone, cursor + 1];\n}\n\n// ISO time parsing\n\nconst isoTimeOnly = RegExp(`^T?${isoTimeBaseRegex.source}$`);\n\n// ISO duration parsing\n\nconst isoDuration =\n  /^-?P(?:(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)Y)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)W)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)D)?(?:T(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)H)?(?:(-?\\d{1,20}(?:\\.\\d{1,20})?)M)?(?:(-?\\d{1,20})(?:[.,](-?\\d{1,20}))?S)?)?)$/;\n\nfunction extractISODuration(match) {\n  const [s, yearStr, monthStr, weekStr, dayStr, hourStr, minuteStr, secondStr, millisecondsStr] =\n    match;\n\n  const hasNegativePrefix = s[0] === \"-\";\n  const negativeSeconds = secondStr && secondStr[0] === \"-\";\n\n  const maybeNegate = (num, force = false) =>\n    num !== undefined && (force || (num && hasNegativePrefix)) ? -num : num;\n\n  return [\n    {\n      years: maybeNegate(parseFloating(yearStr)),\n      months: maybeNegate(parseFloating(monthStr)),\n      weeks: maybeNegate(parseFloating(weekStr)),\n      days: maybeNegate(parseFloating(dayStr)),\n      hours: maybeNegate(parseFloating(hourStr)),\n      minutes: maybeNegate(parseFloating(minuteStr)),\n      seconds: maybeNegate(parseFloating(secondStr), secondStr === \"-0\"),\n      milliseconds: maybeNegate(parseMillis(millisecondsStr), negativeSeconds),\n    },\n  ];\n}\n\n// These are a little braindead. EDT *should* tell us that we're in, say, America/New_York\n// and not just that we're in -240 *right now*. But since I don't think these are used that often\n// I'm just going to ignore that\nconst obsOffsets = {\n  GMT: 0,\n  EDT: -4 * 60,\n  EST: -5 * 60,\n  CDT: -5 * 60,\n  CST: -6 * 60,\n  MDT: -6 * 60,\n  MST: -7 * 60,\n  PDT: -7 * 60,\n  PST: -8 * 60,\n};\n\nfunction fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n  const result = {\n    year: yearStr.length === 2 ? untruncateYear(parseInteger(yearStr)) : parseInteger(yearStr),\n    month: monthsShort.indexOf(monthStr) + 1,\n    day: parseInteger(dayStr),\n    hour: parseInteger(hourStr),\n    minute: parseInteger(minuteStr),\n  };\n\n  if (secondStr) result.second = parseInteger(secondStr);\n  if (weekdayStr) {\n    result.weekday =\n      weekdayStr.length > 3\n        ? weekdaysLong.indexOf(weekdayStr) + 1\n        : weekdaysShort.indexOf(weekdayStr) + 1;\n  }\n\n  return result;\n}\n\n// RFC 2822/5322\nconst rfc2822 =\n  /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\\d\\d)(\\d\\d)))$/;\n\nfunction extractRFC2822(match) {\n  const [\n      ,\n      weekdayStr,\n      dayStr,\n      monthStr,\n      yearStr,\n      hourStr,\n      minuteStr,\n      secondStr,\n      obsOffset,\n      milOffset,\n      offHourStr,\n      offMinuteStr,\n    ] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n\n  let offset;\n  if (obsOffset) {\n    offset = obsOffsets[obsOffset];\n  } else if (milOffset) {\n    offset = 0;\n  } else {\n    offset = signedOffset(offHourStr, offMinuteStr);\n  }\n\n  return [result, new FixedOffsetZone(offset)];\n}\n\nfunction preprocessRFC2822(s) {\n  // Remove comments and folding whitespace and replace multiple-spaces with a single space\n  return s\n    .replace(/\\([^()]*\\)|[\\n\\t]/g, \" \")\n    .replace(/(\\s\\s+)/g, \" \")\n    .trim();\n}\n\n// http date\n\nconst rfc1123 =\n    /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\\d\\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\\d{4}) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n  rfc850 =\n    /^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\\d\\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) GMT$/,\n  ascii =\n    /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \\d|\\d\\d) (\\d\\d):(\\d\\d):(\\d\\d) (\\d{4})$/;\n\nfunction extractRFC1123Or850(match) {\n  const [, weekdayStr, dayStr, monthStr, yearStr, hourStr, minuteStr, secondStr] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n  return [result, FixedOffsetZone.utcInstance];\n}\n\nfunction extractASCII(match) {\n  const [, weekdayStr, monthStr, dayStr, hourStr, minuteStr, secondStr, yearStr] = match,\n    result = fromStrings(weekdayStr, yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr);\n  return [result, FixedOffsetZone.utcInstance];\n}\n\nconst isoYmdWithTimeExtensionRegex = combineRegexes(isoYmdRegex, isoTimeExtensionRegex);\nconst isoWeekWithTimeExtensionRegex = combineRegexes(isoWeekRegex, isoTimeExtensionRegex);\nconst isoOrdinalWithTimeExtensionRegex = combineRegexes(isoOrdinalRegex, isoTimeExtensionRegex);\nconst isoTimeCombinedRegex = combineRegexes(isoTimeRegex);\n\nconst extractISOYmdTimeAndOffset = combineExtractors(\n  extractISOYmd,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOWeekTimeAndOffset = combineExtractors(\n  extractISOWeekData,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOOrdinalDateAndTime = combineExtractors(\n  extractISOOrdinalData,\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\nconst extractISOTimeAndOffset = combineExtractors(\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\n\n/*\n * @private\n */\n\nfunction parseISODate(s) {\n  return parse(\n    s,\n    [isoYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n    [isoWeekWithTimeExtensionRegex, extractISOWeekTimeAndOffset],\n    [isoOrdinalWithTimeExtensionRegex, extractISOOrdinalDateAndTime],\n    [isoTimeCombinedRegex, extractISOTimeAndOffset]\n  );\n}\n\nfunction parseRFC2822Date(s) {\n  return parse(preprocessRFC2822(s), [rfc2822, extractRFC2822]);\n}\n\nfunction parseHTTPDate(s) {\n  return parse(\n    s,\n    [rfc1123, extractRFC1123Or850],\n    [rfc850, extractRFC1123Or850],\n    [ascii, extractASCII]\n  );\n}\n\nfunction parseISODuration(s) {\n  return parse(s, [isoDuration, extractISODuration]);\n}\n\nconst extractISOTimeOnly = combineExtractors(extractISOTime);\n\nfunction parseISOTimeOnly(s) {\n  return parse(s, [isoTimeOnly, extractISOTimeOnly]);\n}\n\nconst sqlYmdWithTimeExtensionRegex = combineRegexes(sqlYmdRegex, sqlTimeExtensionRegex);\nconst sqlTimeCombinedRegex = combineRegexes(sqlTimeRegex);\n\nconst extractISOTimeOffsetAndIANAZone = combineExtractors(\n  extractISOTime,\n  extractISOOffset,\n  extractIANAZone\n);\n\nfunction parseSQL(s) {\n  return parse(\n    s,\n    [sqlYmdWithTimeExtensionRegex, extractISOYmdTimeAndOffset],\n    [sqlTimeCombinedRegex, extractISOTimeOffsetAndIANAZone]\n  );\n}\n\nconst INVALID$2 = \"Invalid Duration\";\n\n// unit conversion constants\nconst lowOrderMatrix = {\n    weeks: {\n      days: 7,\n      hours: 7 * 24,\n      minutes: 7 * 24 * 60,\n      seconds: 7 * 24 * 60 * 60,\n      milliseconds: 7 * 24 * 60 * 60 * 1000,\n    },\n    days: {\n      hours: 24,\n      minutes: 24 * 60,\n      seconds: 24 * 60 * 60,\n      milliseconds: 24 * 60 * 60 * 1000,\n    },\n    hours: { minutes: 60, seconds: 60 * 60, milliseconds: 60 * 60 * 1000 },\n    minutes: { seconds: 60, milliseconds: 60 * 1000 },\n    seconds: { milliseconds: 1000 },\n  },\n  casualMatrix = {\n    years: {\n      quarters: 4,\n      months: 12,\n      weeks: 52,\n      days: 365,\n      hours: 365 * 24,\n      minutes: 365 * 24 * 60,\n      seconds: 365 * 24 * 60 * 60,\n      milliseconds: 365 * 24 * 60 * 60 * 1000,\n    },\n    quarters: {\n      months: 3,\n      weeks: 13,\n      days: 91,\n      hours: 91 * 24,\n      minutes: 91 * 24 * 60,\n      seconds: 91 * 24 * 60 * 60,\n      milliseconds: 91 * 24 * 60 * 60 * 1000,\n    },\n    months: {\n      weeks: 4,\n      days: 30,\n      hours: 30 * 24,\n      minutes: 30 * 24 * 60,\n      seconds: 30 * 24 * 60 * 60,\n      milliseconds: 30 * 24 * 60 * 60 * 1000,\n    },\n\n    ...lowOrderMatrix,\n  },\n  daysInYearAccurate = 146097.0 / 400,\n  daysInMonthAccurate = 146097.0 / 4800,\n  accurateMatrix = {\n    years: {\n      quarters: 4,\n      months: 12,\n      weeks: daysInYearAccurate / 7,\n      days: daysInYearAccurate,\n      hours: daysInYearAccurate * 24,\n      minutes: daysInYearAccurate * 24 * 60,\n      seconds: daysInYearAccurate * 24 * 60 * 60,\n      milliseconds: daysInYearAccurate * 24 * 60 * 60 * 1000,\n    },\n    quarters: {\n      months: 3,\n      weeks: daysInYearAccurate / 28,\n      days: daysInYearAccurate / 4,\n      hours: (daysInYearAccurate * 24) / 4,\n      minutes: (daysInYearAccurate * 24 * 60) / 4,\n      seconds: (daysInYearAccurate * 24 * 60 * 60) / 4,\n      milliseconds: (daysInYearAccurate * 24 * 60 * 60 * 1000) / 4,\n    },\n    months: {\n      weeks: daysInMonthAccurate / 7,\n      days: daysInMonthAccurate,\n      hours: daysInMonthAccurate * 24,\n      minutes: daysInMonthAccurate * 24 * 60,\n      seconds: daysInMonthAccurate * 24 * 60 * 60,\n      milliseconds: daysInMonthAccurate * 24 * 60 * 60 * 1000,\n    },\n    ...lowOrderMatrix,\n  };\n\n// units ordered by size\nconst orderedUnits$1 = [\n  \"years\",\n  \"quarters\",\n  \"months\",\n  \"weeks\",\n  \"days\",\n  \"hours\",\n  \"minutes\",\n  \"seconds\",\n  \"milliseconds\",\n];\n\nconst reverseUnits = orderedUnits$1.slice(0).reverse();\n\n// clone really means \"create another instance just like this one, but with these changes\"\nfunction clone$1(dur, alts, clear = false) {\n  // deep merge for vals\n  const conf = {\n    values: clear ? alts.values : { ...dur.values, ...(alts.values || {}) },\n    loc: dur.loc.clone(alts.loc),\n    conversionAccuracy: alts.conversionAccuracy || dur.conversionAccuracy,\n    matrix: alts.matrix || dur.matrix,\n  };\n  return new Duration(conf);\n}\n\nfunction durationToMillis(matrix, vals) {\n  let sum = vals.milliseconds ?? 0;\n  for (const unit of reverseUnits.slice(1)) {\n    if (vals[unit]) {\n      sum += vals[unit] * matrix[unit][\"milliseconds\"];\n    }\n  }\n  return sum;\n}\n\n// NB: mutates parameters\nfunction normalizeValues(matrix, vals) {\n  // the logic below assumes the overall value of the duration is positive\n  // if this is not the case, factor is used to make it so\n  const factor = durationToMillis(matrix, vals) < 0 ? -1 : 1;\n\n  orderedUnits$1.reduceRight((previous, current) => {\n    if (!isUndefined(vals[current])) {\n      if (previous) {\n        const previousVal = vals[previous] * factor;\n        const conv = matrix[current][previous];\n\n        // if (previousVal < 0):\n        // lower order unit is negative (e.g. { years: 2, days: -2 })\n        // normalize this by reducing the higher order unit by the appropriate amount\n        // and increasing the lower order unit\n        // this can never make the higher order unit negative, because this function only operates\n        // on positive durations, so the amount of time represented by the lower order unit cannot\n        // be larger than the higher order unit\n        // else:\n        // lower order unit is positive (e.g. { years: 2, days: 450 } or { years: -2, days: 450 })\n        // in this case we attempt to convert as much as possible from the lower order unit into\n        // the higher order one\n        //\n        // Math.floor takes care of both of these cases, rounding away from 0\n        // if previousVal < 0 it makes the absolute value larger\n        // if previousVal >= it makes the absolute value smaller\n        const rollUp = Math.floor(previousVal / conv);\n        vals[current] += rollUp * factor;\n        vals[previous] -= rollUp * conv * factor;\n      }\n      return current;\n    } else {\n      return previous;\n    }\n  }, null);\n\n  // try to convert any decimals into smaller units if possible\n  // for example for { years: 2.5, days: 0, seconds: 0 } we want to get { years: 2, days: 182, hours: 12 }\n  orderedUnits$1.reduce((previous, current) => {\n    if (!isUndefined(vals[current])) {\n      if (previous) {\n        const fraction = vals[previous] % 1;\n        vals[previous] -= fraction;\n        vals[current] += fraction * matrix[previous][current];\n      }\n      return current;\n    } else {\n      return previous;\n    }\n  }, null);\n}\n\n// Remove all properties with a value of 0 from an object\nfunction removeZeroes(vals) {\n  const newVals = {};\n  for (const [key, value] of Object.entries(vals)) {\n    if (value !== 0) {\n      newVals[key] = value;\n    }\n  }\n  return newVals;\n}\n\n/**\n * A Duration object represents a period of time, like \"2 months\" or \"1 day, 1 hour\". Conceptually, it's just a map of units to their quantities, accompanied by some additional configuration and methods for creating, parsing, interrogating, transforming, and formatting them. They can be used on their own or in conjunction with other Luxon types; for example, you can use {@link DateTime#plus} to add a Duration object to a DateTime, producing another DateTime.\n *\n * Here is a brief overview of commonly used methods and getters in Duration:\n *\n * * **Creation** To create a Duration, use {@link Duration.fromMillis}, {@link Duration.fromObject}, or {@link Duration.fromISO}.\n * * **Unit values** See the {@link Duration#years}, {@link Duration#months}, {@link Duration#weeks}, {@link Duration#days}, {@link Duration#hours}, {@link Duration#minutes}, {@link Duration#seconds}, {@link Duration#milliseconds} accessors.\n * * **Configuration** See  {@link Duration#locale} and {@link Duration#numberingSystem} accessors.\n * * **Transformation** To create new Durations out of old ones use {@link Duration#plus}, {@link Duration#minus}, {@link Duration#normalize}, {@link Duration#set}, {@link Duration#reconfigure}, {@link Duration#shiftTo}, and {@link Duration#negate}.\n * * **Output** To convert the Duration into other representations, see {@link Duration#as}, {@link Duration#toISO}, {@link Duration#toFormat}, and {@link Duration#toJSON}\n *\n * There's are more methods documented below. In addition, for more information on subtler topics like internationalization and validity, see the external documentation.\n */\nclass Duration {\n  /**\n   * @private\n   */\n  constructor(config) {\n    const accurate = config.conversionAccuracy === \"longterm\" || false;\n    let matrix = accurate ? accurateMatrix : casualMatrix;\n\n    if (config.matrix) {\n      matrix = config.matrix;\n    }\n\n    /**\n     * @access private\n     */\n    this.values = config.values;\n    /**\n     * @access private\n     */\n    this.loc = config.loc || Locale.create();\n    /**\n     * @access private\n     */\n    this.conversionAccuracy = accurate ? \"longterm\" : \"casual\";\n    /**\n     * @access private\n     */\n    this.invalid = config.invalid || null;\n    /**\n     * @access private\n     */\n    this.matrix = matrix;\n    /**\n     * @access private\n     */\n    this.isLuxonDuration = true;\n  }\n\n  /**\n   * Create Duration from a number of milliseconds.\n   * @param {number} count of milliseconds\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  static fromMillis(count, opts) {\n    return Duration.fromObject({ milliseconds: count }, opts);\n  }\n\n  /**\n   * Create a Duration from a JavaScript object with keys like 'years' and 'hours'.\n   * If this object is empty then a zero milliseconds duration is returned.\n   * @param {Object} obj - the object to create the DateTime from\n   * @param {number} obj.years\n   * @param {number} obj.quarters\n   * @param {number} obj.months\n   * @param {number} obj.weeks\n   * @param {number} obj.days\n   * @param {number} obj.hours\n   * @param {number} obj.minutes\n   * @param {number} obj.seconds\n   * @param {number} obj.milliseconds\n   * @param {Object} [opts=[]] - options for creating this Duration\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the custom conversion system to use\n   * @return {Duration}\n   */\n  static fromObject(obj, opts = {}) {\n    if (obj == null || typeof obj !== \"object\") {\n      throw new InvalidArgumentError(\n        `Duration.fromObject: argument expected to be an object, got ${\n          obj === null ? \"null\" : typeof obj\n        }`\n      );\n    }\n\n    return new Duration({\n      values: normalizeObject(obj, Duration.normalizeUnit),\n      loc: Locale.fromObject(opts),\n      conversionAccuracy: opts.conversionAccuracy,\n      matrix: opts.matrix,\n    });\n  }\n\n  /**\n   * Create a Duration from DurationLike.\n   *\n   * @param {Object | number | Duration} durationLike\n   * One of:\n   * - object with keys like 'years' and 'hours'.\n   * - number representing milliseconds\n   * - Duration instance\n   * @return {Duration}\n   */\n  static fromDurationLike(durationLike) {\n    if (isNumber(durationLike)) {\n      return Duration.fromMillis(durationLike);\n    } else if (Duration.isDuration(durationLike)) {\n      return durationLike;\n    } else if (typeof durationLike === \"object\") {\n      return Duration.fromObject(durationLike);\n    } else {\n      throw new InvalidArgumentError(\n        `Unknown duration argument ${durationLike} of type ${typeof durationLike}`\n      );\n    }\n  }\n\n  /**\n   * Create a Duration from an ISO 8601 duration string.\n   * @param {string} text - text to parse\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the preset conversion system to use\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n   * @example Duration.fromISO('P3Y6M1W4DT12H30M5S').toObject() //=> { years: 3, months: 6, weeks: 1, days: 4, hours: 12, minutes: 30, seconds: 5 }\n   * @example Duration.fromISO('PT23H').toObject() //=> { hours: 23 }\n   * @example Duration.fromISO('P5Y3M').toObject() //=> { years: 5, months: 3 }\n   * @return {Duration}\n   */\n  static fromISO(text, opts) {\n    const [parsed] = parseISODuration(text);\n    if (parsed) {\n      return Duration.fromObject(parsed, opts);\n    } else {\n      return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n    }\n  }\n\n  /**\n   * Create a Duration from an ISO 8601 time string.\n   * @param {string} text - text to parse\n   * @param {Object} opts - options for parsing\n   * @param {string} [opts.locale='en-US'] - the locale to use\n   * @param {string} opts.numberingSystem - the numbering system to use\n   * @param {string} [opts.conversionAccuracy='casual'] - the preset conversion system to use\n   * @param {string} [opts.matrix=Object] - the conversion system to use\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n   * @example Duration.fromISOTime('11:22:33.444').toObject() //=> { hours: 11, minutes: 22, seconds: 33, milliseconds: 444 }\n   * @example Duration.fromISOTime('11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('T11:00').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @example Duration.fromISOTime('T1100').toObject() //=> { hours: 11, minutes: 0, seconds: 0 }\n   * @return {Duration}\n   */\n  static fromISOTime(text, opts) {\n    const [parsed] = parseISOTimeOnly(text);\n    if (parsed) {\n      return Duration.fromObject(parsed, opts);\n    } else {\n      return Duration.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n    }\n  }\n\n  /**\n   * Create an invalid Duration.\n   * @param {string} reason - simple string of why this datetime is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {Duration}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the Duration is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidDurationError(invalid);\n    } else {\n      return new Duration({ invalid });\n    }\n  }\n\n  /**\n   * @private\n   */\n  static normalizeUnit(unit) {\n    const normalized = {\n      year: \"years\",\n      years: \"years\",\n      quarter: \"quarters\",\n      quarters: \"quarters\",\n      month: \"months\",\n      months: \"months\",\n      week: \"weeks\",\n      weeks: \"weeks\",\n      day: \"days\",\n      days: \"days\",\n      hour: \"hours\",\n      hours: \"hours\",\n      minute: \"minutes\",\n      minutes: \"minutes\",\n      second: \"seconds\",\n      seconds: \"seconds\",\n      millisecond: \"milliseconds\",\n      milliseconds: \"milliseconds\",\n    }[unit ? unit.toLowerCase() : unit];\n\n    if (!normalized) throw new InvalidUnitError(unit);\n\n    return normalized;\n  }\n\n  /**\n   * Check if an object is a Duration. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isDuration(o) {\n    return (o && o.isLuxonDuration) || false;\n  }\n\n  /**\n   * Get  the locale of a Duration, such 'en-GB'\n   * @type {string}\n   */\n  get locale() {\n    return this.isValid ? this.loc.locale : null;\n  }\n\n  /**\n   * Get the numbering system of a Duration, such 'beng'. The numbering system is used when formatting the Duration\n   *\n   * @type {string}\n   */\n  get numberingSystem() {\n    return this.isValid ? this.loc.numberingSystem : null;\n  }\n\n  /**\n   * Returns a string representation of this Duration formatted according to the specified format string. You may use these tokens:\n   * * `S` for milliseconds\n   * * `s` for seconds\n   * * `m` for minutes\n   * * `h` for hours\n   * * `d` for days\n   * * `w` for weeks\n   * * `M` for months\n   * * `y` for years\n   * Notes:\n   * * Add padding by repeating the token, e.g. \"yy\" pads the years to two digits, \"hhhh\" pads the hours out to four digits\n   * * Tokens can be escaped by wrapping with single quotes.\n   * * The duration will be converted to the set of units in the format string using {@link Duration#shiftTo} and the Durations's conversion accuracy setting.\n   * @param {string} fmt - the format string\n   * @param {Object} opts - options\n   * @param {boolean} [opts.floor=true] - floor numerical values\n   * @param {'negative'|'all'|'negativeLargestOnly'} [opts.signMode=negative] - How to handle signs\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"y d s\") //=> \"1 6 2\"\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"yy dd sss\") //=> \"01 06 002\"\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toFormat(\"M S\") //=> \"12 518402000\"\n   * @example Duration.fromObject({ days: 6, seconds: 2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"+6 +2\"\n   * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"all\" }) //=> \"-6 -2\"\n   * @example Duration.fromObject({ days: -6, seconds: -2 }).toFormat(\"d s\", { signMode: \"negativeLargestOnly\" }) //=> \"-6 2\"\n   * @return {string}\n   */\n  toFormat(fmt, opts = {}) {\n    // reverse-compat since 1.2; we always round down now, never up, and we do it by default\n    const fmtOpts = {\n      ...opts,\n      floor: opts.round !== false && opts.floor !== false,\n    };\n    return this.isValid\n      ? Formatter.create(this.loc, fmtOpts).formatDurationFromString(this, fmt)\n      : INVALID$2;\n  }\n\n  /**\n   * Returns a string representation of a Duration with all units included.\n   * To modify its behavior, use `listStyle` and any Intl.NumberFormat option, though `unitDisplay` is especially relevant.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/NumberFormat/NumberFormat#options\n   * @param {Object} opts - Formatting options. Accepts the same keys as the options parameter of the native `Intl.NumberFormat` constructor, as well as `listStyle`.\n   * @param {string} [opts.listStyle='narrow'] - How to format the merged list. Corresponds to the `style` property of the options parameter of the native `Intl.ListFormat` constructor.\n   * @param {boolean} [opts.showZeros=true] - Show all units previously used by the duration even if they are zero\n   * @example\n   * ```js\n   * var dur = Duration.fromObject({ months: 1, weeks: 0, hours: 5, minutes: 6 })\n   * dur.toHuman() //=> '1 month, 0 weeks, 5 hours, 6 minutes'\n   * dur.toHuman({ listStyle: \"long\" }) //=> '1 month, 0 weeks, 5 hours, and 6 minutes'\n   * dur.toHuman({ unitDisplay: \"short\" }) //=> '1 mth, 0 wks, 5 hr, 6 min'\n   * dur.toHuman({ showZeros: false }) //=> '1 month, 5 hours, 6 minutes'\n   * ```\n   */\n  toHuman(opts = {}) {\n    if (!this.isValid) return INVALID$2;\n\n    const showZeros = opts.showZeros !== false;\n\n    const l = orderedUnits$1\n      .map((unit) => {\n        const val = this.values[unit];\n        if (isUndefined(val) || (val === 0 && !showZeros)) {\n          return null;\n        }\n        return this.loc\n          .numberFormatter({ style: \"unit\", unitDisplay: \"long\", ...opts, unit: unit.slice(0, -1) })\n          .format(val);\n      })\n      .filter((n) => n);\n\n    return this.loc\n      .listFormatter({ type: \"conjunction\", style: opts.listStyle || \"narrow\", ...opts })\n      .format(l);\n  }\n\n  /**\n   * Returns a JavaScript object with this Duration's values.\n   * @example Duration.fromObject({ years: 1, days: 6, seconds: 2 }).toObject() //=> { years: 1, days: 6, seconds: 2 }\n   * @return {Object}\n   */\n  toObject() {\n    if (!this.isValid) return {};\n    return { ...this.values };\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Duration.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Durations\n   * @example Duration.fromObject({ years: 3, seconds: 45 }).toISO() //=> 'P3YT45S'\n   * @example Duration.fromObject({ months: 4, seconds: 45 }).toISO() //=> 'P4MT45S'\n   * @example Duration.fromObject({ months: 5 }).toISO() //=> 'P5M'\n   * @example Duration.fromObject({ minutes: 5 }).toISO() //=> 'PT5M'\n   * @example Duration.fromObject({ milliseconds: 6 }).toISO() //=> 'PT0.006S'\n   * @return {string}\n   */\n  toISO() {\n    // we could use the formatter, but this is an easier way to get the minimum string\n    if (!this.isValid) return null;\n\n    let s = \"P\";\n    if (this.years !== 0) s += this.years + \"Y\";\n    if (this.months !== 0 || this.quarters !== 0) s += this.months + this.quarters * 3 + \"M\";\n    if (this.weeks !== 0) s += this.weeks + \"W\";\n    if (this.days !== 0) s += this.days + \"D\";\n    if (this.hours !== 0 || this.minutes !== 0 || this.seconds !== 0 || this.milliseconds !== 0)\n      s += \"T\";\n    if (this.hours !== 0) s += this.hours + \"H\";\n    if (this.minutes !== 0) s += this.minutes + \"M\";\n    if (this.seconds !== 0 || this.milliseconds !== 0)\n      // this will handle \"floating point madness\" by removing extra decimal places\n      // https://stackoverflow.com/questions/588004/is-floating-point-math-broken\n      s += roundTo(this.seconds + this.milliseconds / 1000, 3) + \"S\";\n    if (s === \"P\") s += \"T0S\";\n    return s;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Duration, formatted as a time of day.\n   * Note that this will return null if the duration is invalid, negative, or equal to or greater than 24 hours.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Times\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @example Duration.fromObject({ hours: 11 }).toISOTime() //=> '11:00:00.000'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressMilliseconds: true }) //=> '11:00:00'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ suppressSeconds: true }) //=> '11:00'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ includePrefix: true }) //=> 'T11:00:00.000'\n   * @example Duration.fromObject({ hours: 11 }).toISOTime({ format: 'basic' }) //=> '110000.000'\n   * @return {string}\n   */\n  toISOTime(opts = {}) {\n    if (!this.isValid) return null;\n\n    const millis = this.toMillis();\n    if (millis < 0 || millis >= 86400000) return null;\n\n    opts = {\n      suppressMilliseconds: false,\n      suppressSeconds: false,\n      includePrefix: false,\n      format: \"extended\",\n      ...opts,\n      includeOffset: false,\n    };\n\n    const dateTime = DateTime.fromMillis(millis, { zone: \"UTC\" });\n    return dateTime.toISOTime(opts);\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this Duration appropriate for use in JSON.\n   * @return {string}\n   */\n  toJSON() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this Duration appropriate for use in debugging.\n   * @return {string}\n   */\n  toString() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns a string representation of this Duration appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `Duration { values: ${JSON.stringify(this.values)} }`;\n    } else {\n      return `Duration { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns an milliseconds value of this Duration.\n   * @return {number}\n   */\n  toMillis() {\n    if (!this.isValid) return NaN;\n\n    return durationToMillis(this.matrix, this.values);\n  }\n\n  /**\n   * Returns an milliseconds value of this Duration. Alias of {@link toMillis}\n   * @return {number}\n   */\n  valueOf() {\n    return this.toMillis();\n  }\n\n  /**\n   * Make this Duration longer by the specified amount. Return a newly-constructed Duration.\n   * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @return {Duration}\n   */\n  plus(duration) {\n    if (!this.isValid) return this;\n\n    const dur = Duration.fromDurationLike(duration),\n      result = {};\n\n    for (const k of orderedUnits$1) {\n      if (hasOwnProperty(dur.values, k) || hasOwnProperty(this.values, k)) {\n        result[k] = dur.get(k) + this.get(k);\n      }\n    }\n\n    return clone$1(this, { values: result }, true);\n  }\n\n  /**\n   * Make this Duration shorter by the specified amount. Return a newly-constructed Duration.\n   * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @return {Duration}\n   */\n  minus(duration) {\n    if (!this.isValid) return this;\n\n    const dur = Duration.fromDurationLike(duration);\n    return this.plus(dur.negate());\n  }\n\n  /**\n   * Scale this Duration by the specified amount. Return a newly-constructed Duration.\n   * @param {function} fn - The function to apply to each unit. Arity is 1 or 2: the value of the unit and, optionally, the unit name. Must return a number.\n   * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits(x => x * 2) //=> { hours: 2, minutes: 60 }\n   * @example Duration.fromObject({ hours: 1, minutes: 30 }).mapUnits((x, u) => u === \"hours\" ? x * 2 : x) //=> { hours: 2, minutes: 30 }\n   * @return {Duration}\n   */\n  mapUnits(fn) {\n    if (!this.isValid) return this;\n    const result = {};\n    for (const k of Object.keys(this.values)) {\n      result[k] = asNumber(fn(this.values[k], k));\n    }\n    return clone$1(this, { values: result }, true);\n  }\n\n  /**\n   * Get the value of unit.\n   * @param {string} unit - a unit such as 'minute' or 'day'\n   * @example Duration.fromObject({years: 2, days: 3}).get('years') //=> 2\n   * @example Duration.fromObject({years: 2, days: 3}).get('months') //=> 0\n   * @example Duration.fromObject({years: 2, days: 3}).get('days') //=> 3\n   * @return {number}\n   */\n  get(unit) {\n    return this[Duration.normalizeUnit(unit)];\n  }\n\n  /**\n   * \"Set\" the values of specified units. Return a newly-constructed Duration.\n   * @param {Object} values - a mapping of units to numbers\n   * @example dur.set({ years: 2017 })\n   * @example dur.set({ hours: 8, minutes: 30 })\n   * @return {Duration}\n   */\n  set(values) {\n    if (!this.isValid) return this;\n\n    const mixed = { ...this.values, ...normalizeObject(values, Duration.normalizeUnit) };\n    return clone$1(this, { values: mixed });\n  }\n\n  /**\n   * \"Set\" the locale and/or numberingSystem.  Returns a newly-constructed Duration.\n   * @example dur.reconfigure({ locale: 'en-GB' })\n   * @return {Duration}\n   */\n  reconfigure({ locale, numberingSystem, conversionAccuracy, matrix } = {}) {\n    const loc = this.loc.clone({ locale, numberingSystem });\n    const opts = { loc, matrix, conversionAccuracy };\n    return clone$1(this, opts);\n  }\n\n  /**\n   * Return the length of the duration in the specified unit.\n   * @param {string} unit - a unit such as 'minutes' or 'days'\n   * @example Duration.fromObject({years: 1}).as('days') //=> 365\n   * @example Duration.fromObject({years: 1}).as('months') //=> 12\n   * @example Duration.fromObject({hours: 60}).as('days') //=> 2.5\n   * @return {number}\n   */\n  as(unit) {\n    return this.isValid ? this.shiftTo(unit).get(unit) : NaN;\n  }\n\n  /**\n   * Reduce this Duration to its canonical representation in its current units.\n   * Assuming the overall value of the Duration is positive, this means:\n   * - excessive values for lower-order units are converted to higher-order units (if possible, see first and second example)\n   * - negative lower-order units are converted to higher order units (there must be such a higher order unit, otherwise\n   *   the overall value would be negative, see third example)\n   * - fractional values for higher-order units are converted to lower-order units (if possible, see fourth example)\n   *\n   * If the overall value is negative, the result of this method is equivalent to `this.negate().normalize().negate()`.\n   * @example Duration.fromObject({ years: 2, days: 5000 }).normalize().toObject() //=> { years: 15, days: 255 }\n   * @example Duration.fromObject({ days: 5000 }).normalize().toObject() //=> { days: 5000 }\n   * @example Duration.fromObject({ hours: 12, minutes: -45 }).normalize().toObject() //=> { hours: 11, minutes: 15 }\n   * @example Duration.fromObject({ years: 2.5, days: 0, hours: 0 }).normalize().toObject() //=> { years: 2, days: 182, hours: 12 }\n   * @return {Duration}\n   */\n  normalize() {\n    if (!this.isValid) return this;\n    const vals = this.toObject();\n    normalizeValues(this.matrix, vals);\n    return clone$1(this, { values: vals }, true);\n  }\n\n  /**\n   * Rescale units to its largest representation\n   * @example Duration.fromObject({ milliseconds: 90000 }).rescale().toObject() //=> { minutes: 1, seconds: 30 }\n   * @return {Duration}\n   */\n  rescale() {\n    if (!this.isValid) return this;\n    const vals = removeZeroes(this.normalize().shiftToAll().toObject());\n    return clone$1(this, { values: vals }, true);\n  }\n\n  /**\n   * Convert this Duration into its representation in a different set of units.\n   * @example Duration.fromObject({ hours: 1, seconds: 30 }).shiftTo('minutes', 'milliseconds').toObject() //=> { minutes: 60, milliseconds: 30000 }\n   * @return {Duration}\n   */\n  shiftTo(...units) {\n    if (!this.isValid) return this;\n\n    if (units.length === 0) {\n      return this;\n    }\n\n    units = units.map((u) => Duration.normalizeUnit(u));\n\n    const built = {},\n      accumulated = {},\n      vals = this.toObject();\n    let lastUnit;\n\n    for (const k of orderedUnits$1) {\n      if (units.indexOf(k) >= 0) {\n        lastUnit = k;\n\n        let own = 0;\n\n        // anything we haven't boiled down yet should get boiled to this unit\n        for (const ak in accumulated) {\n          own += this.matrix[ak][k] * accumulated[ak];\n          accumulated[ak] = 0;\n        }\n\n        // plus anything that's already in this unit\n        if (isNumber(vals[k])) {\n          own += vals[k];\n        }\n\n        // only keep the integer part for now in the hopes of putting any decimal part\n        // into a smaller unit later\n        const i = Math.trunc(own);\n        built[k] = i;\n        accumulated[k] = (own * 1000 - i * 1000) / 1000;\n\n        // otherwise, keep it in the wings to boil it later\n      } else if (isNumber(vals[k])) {\n        accumulated[k] = vals[k];\n      }\n    }\n\n    // anything leftover becomes the decimal for the last unit\n    // lastUnit must be defined since units is not empty\n    for (const key in accumulated) {\n      if (accumulated[key] !== 0) {\n        built[lastUnit] +=\n          key === lastUnit ? accumulated[key] : accumulated[key] / this.matrix[lastUnit][key];\n      }\n    }\n\n    normalizeValues(this.matrix, built);\n    return clone$1(this, { values: built }, true);\n  }\n\n  /**\n   * Shift this Duration to all available units.\n   * Same as shiftTo(\"years\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"milliseconds\")\n   * @return {Duration}\n   */\n  shiftToAll() {\n    if (!this.isValid) return this;\n    return this.shiftTo(\n      \"years\",\n      \"months\",\n      \"weeks\",\n      \"days\",\n      \"hours\",\n      \"minutes\",\n      \"seconds\",\n      \"milliseconds\"\n    );\n  }\n\n  /**\n   * Return the negative of this Duration.\n   * @example Duration.fromObject({ hours: 1, seconds: 30 }).negate().toObject() //=> { hours: -1, seconds: -30 }\n   * @return {Duration}\n   */\n  negate() {\n    if (!this.isValid) return this;\n    const negated = {};\n    for (const k of Object.keys(this.values)) {\n      negated[k] = this.values[k] === 0 ? 0 : -this.values[k];\n    }\n    return clone$1(this, { values: negated }, true);\n  }\n\n  /**\n   * Removes all units with values equal to 0 from this Duration.\n   * @example Duration.fromObject({ years: 2, days: 0, hours: 0, minutes: 0 }).removeZeros().toObject() //=> { years: 2 }\n   * @return {Duration}\n   */\n  removeZeros() {\n    if (!this.isValid) return this;\n    const vals = removeZeroes(this.values);\n    return clone$1(this, { values: vals }, true);\n  }\n\n  /**\n   * Get the years.\n   * @type {number}\n   */\n  get years() {\n    return this.isValid ? this.values.years || 0 : NaN;\n  }\n\n  /**\n   * Get the quarters.\n   * @type {number}\n   */\n  get quarters() {\n    return this.isValid ? this.values.quarters || 0 : NaN;\n  }\n\n  /**\n   * Get the months.\n   * @type {number}\n   */\n  get months() {\n    return this.isValid ? this.values.months || 0 : NaN;\n  }\n\n  /**\n   * Get the weeks\n   * @type {number}\n   */\n  get weeks() {\n    return this.isValid ? this.values.weeks || 0 : NaN;\n  }\n\n  /**\n   * Get the days.\n   * @type {number}\n   */\n  get days() {\n    return this.isValid ? this.values.days || 0 : NaN;\n  }\n\n  /**\n   * Get the hours.\n   * @type {number}\n   */\n  get hours() {\n    return this.isValid ? this.values.hours || 0 : NaN;\n  }\n\n  /**\n   * Get the minutes.\n   * @type {number}\n   */\n  get minutes() {\n    return this.isValid ? this.values.minutes || 0 : NaN;\n  }\n\n  /**\n   * Get the seconds.\n   * @return {number}\n   */\n  get seconds() {\n    return this.isValid ? this.values.seconds || 0 : NaN;\n  }\n\n  /**\n   * Get the milliseconds.\n   * @return {number}\n   */\n  get milliseconds() {\n    return this.isValid ? this.values.milliseconds || 0 : NaN;\n  }\n\n  /**\n   * Returns whether the Duration is invalid. Invalid durations are returned by diff operations\n   * on invalid DateTimes or Intervals.\n   * @return {boolean}\n   */\n  get isValid() {\n    return this.invalid === null;\n  }\n\n  /**\n   * Returns an error code if this Duration became invalid, or null if the Duration is valid\n   * @return {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this Duration became invalid, or null if the Duration is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Equality check\n   * Two Durations are equal iff they have the same units and the same values for each unit.\n   * @param {Duration} other\n   * @return {boolean}\n   */\n  equals(other) {\n    if (!this.isValid || !other.isValid) {\n      return false;\n    }\n\n    if (!this.loc.equals(other.loc)) {\n      return false;\n    }\n\n    function eq(v1, v2) {\n      // Consider 0 and undefined as equal\n      if (v1 === undefined || v1 === 0) return v2 === undefined || v2 === 0;\n      return v1 === v2;\n    }\n\n    for (const u of orderedUnits$1) {\n      if (!eq(this.values[u], other.values[u])) {\n        return false;\n      }\n    }\n    return true;\n  }\n}\n\nconst INVALID$1 = \"Invalid Interval\";\n\n// checks if the start is equal to or before the end\nfunction validateStartEnd(start, end) {\n  if (!start || !start.isValid) {\n    return Interval.invalid(\"missing or invalid start\");\n  } else if (!end || !end.isValid) {\n    return Interval.invalid(\"missing or invalid end\");\n  } else if (end < start) {\n    return Interval.invalid(\n      \"end before start\",\n      `The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`\n    );\n  } else {\n    return null;\n  }\n}\n\n/**\n * An Interval object represents a half-open interval of time, where each endpoint is a {@link DateTime}. Conceptually, it's a container for those two endpoints, accompanied by methods for creating, parsing, interrogating, comparing, transforming, and formatting them.\n *\n * Here is a brief overview of the most commonly used methods and getters in Interval:\n *\n * * **Creation** To create an Interval, use {@link Interval.fromDateTimes}, {@link Interval.after}, {@link Interval.before}, or {@link Interval.fromISO}.\n * * **Accessors** Use {@link Interval#start} and {@link Interval#end} to get the start and end.\n * * **Interrogation** To analyze the Interval, use {@link Interval#count}, {@link Interval#length}, {@link Interval#hasSame}, {@link Interval#contains}, {@link Interval#isAfter}, or {@link Interval#isBefore}.\n * * **Transformation** To create other Intervals out of this one, use {@link Interval#set}, {@link Interval#splitAt}, {@link Interval#splitBy}, {@link Interval#divideEqually}, {@link Interval.merge}, {@link Interval.xor}, {@link Interval#union}, {@link Interval#intersection}, or {@link Interval#difference}.\n * * **Comparison** To compare this Interval to another one, use {@link Interval#equals}, {@link Interval#overlaps}, {@link Interval#abutsStart}, {@link Interval#abutsEnd}, {@link Interval#engulfs}\n * * **Output** To convert the Interval into other representations, see {@link Interval#toString}, {@link Interval#toLocaleString}, {@link Interval#toISO}, {@link Interval#toISODate}, {@link Interval#toISOTime}, {@link Interval#toFormat}, and {@link Interval#toDuration}.\n */\nclass Interval {\n  /**\n   * @private\n   */\n  constructor(config) {\n    /**\n     * @access private\n     */\n    this.s = config.start;\n    /**\n     * @access private\n     */\n    this.e = config.end;\n    /**\n     * @access private\n     */\n    this.invalid = config.invalid || null;\n    /**\n     * @access private\n     */\n    this.isLuxonInterval = true;\n  }\n\n  /**\n   * Create an invalid Interval.\n   * @param {string} reason - simple string of why this Interval is invalid. Should not contain parameters or anything else data-dependent\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {Interval}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the Interval is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidIntervalError(invalid);\n    } else {\n      return new Interval({ invalid });\n    }\n  }\n\n  /**\n   * Create an Interval from a start DateTime and an end DateTime. Inclusive of the start but not the end.\n   * @param {DateTime|Date|Object} start\n   * @param {DateTime|Date|Object} end\n   * @return {Interval}\n   */\n  static fromDateTimes(start, end) {\n    const builtStart = friendlyDateTime(start),\n      builtEnd = friendlyDateTime(end);\n\n    const validateError = validateStartEnd(builtStart, builtEnd);\n\n    if (validateError == null) {\n      return new Interval({\n        start: builtStart,\n        end: builtEnd,\n      });\n    } else {\n      return validateError;\n    }\n  }\n\n  /**\n   * Create an Interval from a start DateTime and a Duration to extend to.\n   * @param {DateTime|Date|Object} start\n   * @param {Duration|Object|number} duration - the length of the Interval.\n   * @return {Interval}\n   */\n  static after(start, duration) {\n    const dur = Duration.fromDurationLike(duration),\n      dt = friendlyDateTime(start);\n    return Interval.fromDateTimes(dt, dt.plus(dur));\n  }\n\n  /**\n   * Create an Interval from an end DateTime and a Duration to extend backwards to.\n   * @param {DateTime|Date|Object} end\n   * @param {Duration|Object|number} duration - the length of the Interval.\n   * @return {Interval}\n   */\n  static before(end, duration) {\n    const dur = Duration.fromDurationLike(duration),\n      dt = friendlyDateTime(end);\n    return Interval.fromDateTimes(dt.minus(dur), dt);\n  }\n\n  /**\n   * Create an Interval from an ISO 8601 string.\n   * Accepts `<start>/<end>`, `<start>/<duration>`, and `<duration>/<end>` formats.\n   * @param {string} text - the ISO string to parse\n   * @param {Object} [opts] - options to pass {@link DateTime#fromISO} and optionally {@link Duration#fromISO}\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @return {Interval}\n   */\n  static fromISO(text, opts) {\n    const [s, e] = (text || \"\").split(\"/\", 2);\n    if (s && e) {\n      let start, startIsValid;\n      try {\n        start = DateTime.fromISO(s, opts);\n        startIsValid = start.isValid;\n      } catch (e) {\n        startIsValid = false;\n      }\n\n      let end, endIsValid;\n      try {\n        end = DateTime.fromISO(e, opts);\n        endIsValid = end.isValid;\n      } catch (e) {\n        endIsValid = false;\n      }\n\n      if (startIsValid && endIsValid) {\n        return Interval.fromDateTimes(start, end);\n      }\n\n      if (startIsValid) {\n        const dur = Duration.fromISO(e, opts);\n        if (dur.isValid) {\n          return Interval.after(start, dur);\n        }\n      } else if (endIsValid) {\n        const dur = Duration.fromISO(s, opts);\n        if (dur.isValid) {\n          return Interval.before(end, dur);\n        }\n      }\n    }\n    return Interval.invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ISO 8601`);\n  }\n\n  /**\n   * Check if an object is an Interval. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isInterval(o) {\n    return (o && o.isLuxonInterval) || false;\n  }\n\n  /**\n   * Returns the start of the Interval\n   * @type {DateTime}\n   */\n  get start() {\n    return this.isValid ? this.s : null;\n  }\n\n  /**\n   * Returns the end of the Interval. This is the first instant which is not part of the interval\n   * (Interval is half-open).\n   * @type {DateTime}\n   */\n  get end() {\n    return this.isValid ? this.e : null;\n  }\n\n  /**\n   * Returns the last DateTime included in the interval (since end is not part of the interval)\n   * @type {DateTime}\n   */\n  get lastDateTime() {\n    return this.isValid ? (this.e ? this.e.minus(1) : null) : null;\n  }\n\n  /**\n   * Returns whether this Interval's end is at least its start, meaning that the Interval isn't 'backwards'.\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.invalidReason === null;\n  }\n\n  /**\n   * Returns an error code if this Interval is invalid, or null if the Interval is valid\n   * @type {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this Interval became invalid, or null if the Interval is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Returns the length of the Interval in the specified unit.\n   * @param {string} unit - the unit (such as 'hours' or 'days') to return the length in.\n   * @return {number}\n   */\n  length(unit = \"milliseconds\") {\n    return this.isValid ? this.toDuration(...[unit]).get(unit) : NaN;\n  }\n\n  /**\n   * Returns the count of minutes, hours, days, months, or years included in the Interval, even in part.\n   * Unlike {@link Interval#length} this counts sections of the calendar, not periods of time, e.g. specifying 'day'\n   * asks 'what dates are included in this interval?', not 'how many days long is this interval?'\n   * @param {string} [unit='milliseconds'] - the unit of time to count.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; this operation will always use the locale of the start DateTime\n   * @return {number}\n   */\n  count(unit = \"milliseconds\", opts) {\n    if (!this.isValid) return NaN;\n    const start = this.start.startOf(unit, opts);\n    let end;\n    if (opts?.useLocaleWeeks) {\n      end = this.end.reconfigure({ locale: start.locale });\n    } else {\n      end = this.end;\n    }\n    end = end.startOf(unit, opts);\n    return Math.floor(end.diff(start, unit).get(unit)) + (end.valueOf() !== this.end.valueOf());\n  }\n\n  /**\n   * Returns whether this Interval's start and end are both in the same unit of time\n   * @param {string} unit - the unit of time to check sameness on\n   * @return {boolean}\n   */\n  hasSame(unit) {\n    return this.isValid ? this.isEmpty() || this.e.minus(1).hasSame(this.s, unit) : false;\n  }\n\n  /**\n   * Return whether this Interval has the same start and end DateTimes.\n   * @return {boolean}\n   */\n  isEmpty() {\n    return this.s.valueOf() === this.e.valueOf();\n  }\n\n  /**\n   * Return whether this Interval's start is after the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  isAfter(dateTime) {\n    if (!this.isValid) return false;\n    return this.s > dateTime;\n  }\n\n  /**\n   * Return whether this Interval's end is before the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  isBefore(dateTime) {\n    if (!this.isValid) return false;\n    return this.e <= dateTime;\n  }\n\n  /**\n   * Return whether this Interval contains the specified DateTime.\n   * @param {DateTime} dateTime\n   * @return {boolean}\n   */\n  contains(dateTime) {\n    if (!this.isValid) return false;\n    return this.s <= dateTime && this.e > dateTime;\n  }\n\n  /**\n   * \"Sets\" the start and/or end dates. Returns a newly-constructed Interval.\n   * @param {Object} values - the values to set\n   * @param {DateTime} values.start - the starting DateTime\n   * @param {DateTime} values.end - the ending DateTime\n   * @return {Interval}\n   */\n  set({ start, end } = {}) {\n    if (!this.isValid) return this;\n    return Interval.fromDateTimes(start || this.s, end || this.e);\n  }\n\n  /**\n   * Split this Interval at each of the specified DateTimes\n   * @param {...DateTime} dateTimes - the unit of time to count.\n   * @return {Array}\n   */\n  splitAt(...dateTimes) {\n    if (!this.isValid) return [];\n    const sorted = dateTimes\n        .map(friendlyDateTime)\n        .filter((d) => this.contains(d))\n        .sort((a, b) => a.toMillis() - b.toMillis()),\n      results = [];\n    let { s } = this,\n      i = 0;\n\n    while (s < this.e) {\n      const added = sorted[i] || this.e,\n        next = +added > +this.e ? this.e : added;\n      results.push(Interval.fromDateTimes(s, next));\n      s = next;\n      i += 1;\n    }\n\n    return results;\n  }\n\n  /**\n   * Split this Interval into smaller Intervals, each of the specified length.\n   * Left over time is grouped into a smaller interval\n   * @param {Duration|Object|number} duration - The length of each resulting interval.\n   * @return {Array}\n   */\n  splitBy(duration) {\n    const dur = Duration.fromDurationLike(duration);\n\n    if (!this.isValid || !dur.isValid || dur.as(\"milliseconds\") === 0) {\n      return [];\n    }\n\n    let { s } = this,\n      idx = 1,\n      next;\n\n    const results = [];\n    while (s < this.e) {\n      const added = this.start.plus(dur.mapUnits((x) => x * idx));\n      next = +added > +this.e ? this.e : added;\n      results.push(Interval.fromDateTimes(s, next));\n      s = next;\n      idx += 1;\n    }\n\n    return results;\n  }\n\n  /**\n   * Split this Interval into the specified number of smaller intervals.\n   * @param {number} numberOfParts - The number of Intervals to divide the Interval into.\n   * @return {Array}\n   */\n  divideEqually(numberOfParts) {\n    if (!this.isValid) return [];\n    return this.splitBy(this.length() / numberOfParts).slice(0, numberOfParts);\n  }\n\n  /**\n   * Return whether this Interval overlaps with the specified Interval\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  overlaps(other) {\n    return this.e > other.s && this.s < other.e;\n  }\n\n  /**\n   * Return whether this Interval's end is adjacent to the specified Interval's start.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  abutsStart(other) {\n    if (!this.isValid) return false;\n    return +this.e === +other.s;\n  }\n\n  /**\n   * Return whether this Interval's start is adjacent to the specified Interval's end.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  abutsEnd(other) {\n    if (!this.isValid) return false;\n    return +other.e === +this.s;\n  }\n\n  /**\n   * Returns true if this Interval fully contains the specified Interval, specifically if the intersect (of this Interval and the other Interval) is equal to the other Interval; false otherwise.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  engulfs(other) {\n    if (!this.isValid) return false;\n    return this.s <= other.s && this.e >= other.e;\n  }\n\n  /**\n   * Return whether this Interval has the same start and end as the specified Interval.\n   * @param {Interval} other\n   * @return {boolean}\n   */\n  equals(other) {\n    if (!this.isValid || !other.isValid) {\n      return false;\n    }\n\n    return this.s.equals(other.s) && this.e.equals(other.e);\n  }\n\n  /**\n   * Return an Interval representing the intersection of this Interval and the specified Interval.\n   * Specifically, the resulting Interval has the maximum start time and the minimum end time of the two Intervals.\n   * Returns null if the intersection is empty, meaning, the intervals don't intersect.\n   * @param {Interval} other\n   * @return {Interval}\n   */\n  intersection(other) {\n    if (!this.isValid) return this;\n    const s = this.s > other.s ? this.s : other.s,\n      e = this.e < other.e ? this.e : other.e;\n\n    if (s >= e) {\n      return null;\n    } else {\n      return Interval.fromDateTimes(s, e);\n    }\n  }\n\n  /**\n   * Return an Interval representing the union of this Interval and the specified Interval.\n   * Specifically, the resulting Interval has the minimum start time and the maximum end time of the two Intervals.\n   * @param {Interval} other\n   * @return {Interval}\n   */\n  union(other) {\n    if (!this.isValid) return this;\n    const s = this.s < other.s ? this.s : other.s,\n      e = this.e > other.e ? this.e : other.e;\n    return Interval.fromDateTimes(s, e);\n  }\n\n  /**\n   * Merge an array of Intervals into an equivalent minimal set of Intervals.\n   * Combines overlapping and adjacent Intervals.\n   * The resulting array will contain the Intervals in ascending order, that is, starting with the earliest Interval\n   * and ending with the latest.\n   *\n   * @param {Array} intervals\n   * @return {Array}\n   */\n  static merge(intervals) {\n    const [found, final] = intervals\n      .sort((a, b) => a.s - b.s)\n      .reduce(\n        ([sofar, current], item) => {\n          if (!current) {\n            return [sofar, item];\n          } else if (current.overlaps(item) || current.abutsStart(item)) {\n            return [sofar, current.union(item)];\n          } else {\n            return [sofar.concat([current]), item];\n          }\n        },\n        [[], null]\n      );\n    if (final) {\n      found.push(final);\n    }\n    return found;\n  }\n\n  /**\n   * Return an array of Intervals representing the spans of time that only appear in one of the specified Intervals.\n   * @param {Array} intervals\n   * @return {Array}\n   */\n  static xor(intervals) {\n    let start = null,\n      currentCount = 0;\n    const results = [],\n      ends = intervals.map((i) => [\n        { time: i.s, type: \"s\" },\n        { time: i.e, type: \"e\" },\n      ]),\n      flattened = Array.prototype.concat(...ends),\n      arr = flattened.sort((a, b) => a.time - b.time);\n\n    for (const i of arr) {\n      currentCount += i.type === \"s\" ? 1 : -1;\n\n      if (currentCount === 1) {\n        start = i.time;\n      } else {\n        if (start && +start !== +i.time) {\n          results.push(Interval.fromDateTimes(start, i.time));\n        }\n\n        start = null;\n      }\n    }\n\n    return Interval.merge(results);\n  }\n\n  /**\n   * Return an Interval representing the span of time in this Interval that doesn't overlap with any of the specified Intervals.\n   * @param {...Interval} intervals\n   * @return {Array}\n   */\n  difference(...intervals) {\n    return Interval.xor([this].concat(intervals))\n      .map((i) => this.intersection(i))\n      .filter((i) => i && !i.isEmpty());\n  }\n\n  /**\n   * Returns a string representation of this Interval appropriate for debugging.\n   * @return {string}\n   */\n  toString() {\n    if (!this.isValid) return INVALID$1;\n    return `[${this.s.toISO()} – ${this.e.toISO()})`;\n  }\n\n  /**\n   * Returns a string representation of this Interval appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`;\n    } else {\n      return `Interval { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns a localized string representing this Interval. Accepts the same options as the\n   * Intl.DateTimeFormat constructor and any presets defined by Luxon, such as\n   * {@link DateTime.DATE_FULL} or {@link DateTime.TIME_SIMPLE}. The exact behavior of this method\n   * is browser-specific, but in general it will return an appropriate representation of the\n   * Interval in the assigned locale. Defaults to the system's locale if no locale has been\n   * specified.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {Object} [formatOpts=DateTime.DATE_SHORT] - Either a DateTime preset or\n   * Intl.DateTimeFormat constructor options.\n   * @param {Object} opts - Options to override the configuration of the start DateTime.\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(); //=> 11/7/2022 – 11/8/2022\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL); //=> November 7 – 8, 2022\n   * @example Interval.fromISO('2022-11-07T09:00Z/2022-11-08T09:00Z').toLocaleString(DateTime.DATE_FULL, { locale: 'fr-FR' }); //=> 7–8 novembre 2022\n   * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString(DateTime.TIME_SIMPLE); //=> 6:00 – 8:00 PM\n   * @example Interval.fromISO('2022-11-07T17:00Z/2022-11-07T19:00Z').toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> Mon, Nov 07, 6:00 – 8:00 p\n   * @return {string}\n   */\n  toLocaleString(formatOpts = DATE_SHORT, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.s.loc.clone(opts), formatOpts).formatInterval(this)\n      : INVALID$1;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this Interval.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @param {Object} opts - The same options as {@link DateTime#toISO}\n   * @return {string}\n   */\n  toISO(opts) {\n    if (!this.isValid) return INVALID$1;\n    return `${this.s.toISO(opts)}/${this.e.toISO(opts)}`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of date of this Interval.\n   * The time components are ignored.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @return {string}\n   */\n  toISODate() {\n    if (!this.isValid) return INVALID$1;\n    return `${this.s.toISODate()}/${this.e.toISODate()}`;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of time of this Interval.\n   * The date components are ignored.\n   * @see https://en.wikipedia.org/wiki/ISO_8601#Time_intervals\n   * @param {Object} opts - The same options as {@link DateTime#toISO}\n   * @return {string}\n   */\n  toISOTime(opts) {\n    if (!this.isValid) return INVALID$1;\n    return `${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`;\n  }\n\n  /**\n   * Returns a string representation of this Interval formatted according to the specified format\n   * string. **You may not want this.** See {@link Interval#toLocaleString} for a more flexible\n   * formatting tool.\n   * @param {string} dateFormat - The format string. This string formats the start and end time.\n   * See {@link DateTime#toFormat} for details.\n   * @param {Object} opts - Options.\n   * @param {string} [opts.separator =  ' – '] - A separator to place between the start and end\n   * representations.\n   * @return {string}\n   */\n  toFormat(dateFormat, { separator = \" – \" } = {}) {\n    if (!this.isValid) return INVALID$1;\n    return `${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`;\n  }\n\n  /**\n   * Return a Duration representing the time spanned by this interval.\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or units (such as 'hours' or 'days') to include in the duration.\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration().toObject() //=> { milliseconds: 88489257 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration('days').toObject() //=> { days: 1.0241812152777778 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes']).toObject() //=> { hours: 24, minutes: 34.82095 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration(['hours', 'minutes', 'seconds']).toObject() //=> { hours: 24, minutes: 34, seconds: 49.257 }\n   * @example Interval.fromDateTimes(dt1, dt2).toDuration('seconds').toObject() //=> { seconds: 88489.257 }\n   * @return {Duration}\n   */\n  toDuration(unit, opts) {\n    if (!this.isValid) {\n      return Duration.invalid(this.invalidReason);\n    }\n    return this.e.diff(this.s, unit, opts);\n  }\n\n  /**\n   * Run mapFn on the interval start and end, returning a new Interval from the resulting DateTimes\n   * @param {function} mapFn\n   * @return {Interval}\n   * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.toUTC())\n   * @example Interval.fromDateTimes(dt1, dt2).mapEndpoints(endpoint => endpoint.plus({ hours: 2 }))\n   */\n  mapEndpoints(mapFn) {\n    return Interval.fromDateTimes(mapFn(this.s), mapFn(this.e));\n  }\n}\n\n/**\n * The Info class contains static methods for retrieving general time and date related data. For example, it has methods for finding out if a time zone has a DST, for listing the months in any supported locale, and for discovering which of Luxon features are available in the current environment.\n */\nclass Info {\n  /**\n   * Return whether the specified zone contains a DST.\n   * @param {string|Zone} [zone='local'] - Zone to check. Defaults to the environment's local zone.\n   * @return {boolean}\n   */\n  static hasDST(zone = Settings.defaultZone) {\n    const proto = DateTime.now().setZone(zone).set({ month: 12 });\n\n    return !zone.isUniversal && proto.offset !== proto.set({ month: 6 }).offset;\n  }\n\n  /**\n   * Return whether the specified zone is a valid IANA specifier.\n   * @param {string} zone - Zone to check\n   * @return {boolean}\n   */\n  static isValidIANAZone(zone) {\n    return IANAZone.isValidZone(zone);\n  }\n\n  /**\n   * Converts the input into a {@link Zone} instance.\n   *\n   * * If `input` is already a Zone instance, it is returned unchanged.\n   * * If `input` is a string containing a valid time zone name, a Zone instance\n   *   with that name is returned.\n   * * If `input` is a string that doesn't refer to a known time zone, a Zone\n   *   instance with {@link Zone#isValid} == false is returned.\n   * * If `input is a number, a Zone instance with the specified fixed offset\n   *   in minutes is returned.\n   * * If `input` is `null` or `undefined`, the default zone is returned.\n   * @param {string|Zone|number} [input] - the value to be converted\n   * @return {Zone}\n   */\n  static normalizeZone(input) {\n    return normalizeZone(input, Settings.defaultZone);\n  }\n\n  /**\n   * Get the weekday on which the week starts according to the given locale.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number} the start of the week, 1 for Monday through 7 for Sunday\n   */\n  static getStartOfWeek({ locale = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale)).getStartOfWeek();\n  }\n\n  /**\n   * Get the minimum number of days necessary in a week before it is considered part of the next year according\n   * to the given locale.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number}\n   */\n  static getMinimumDaysInFirstWeek({ locale = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale)).getMinDaysInFirstWeek();\n  }\n\n  /**\n   * Get the weekdays, which are considered the weekend according to the given locale\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @returns {number[]} an array of weekdays, 1 for Monday through 7 for Sunday\n   */\n  static getWeekendWeekdays({ locale = null, locObj = null } = {}) {\n    // copy the array, because we cache it internally\n    return (locObj || Locale.create(locale)).getWeekendDays().slice();\n  }\n\n  /**\n   * Return an array of standalone month names.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @param {string} [opts.outputCalendar='gregory'] - the calendar\n   * @example Info.months()[0] //=> 'January'\n   * @example Info.months('short')[0] //=> 'Jan'\n   * @example Info.months('numeric')[0] //=> '1'\n   * @example Info.months('short', { locale: 'fr-CA' } )[0] //=> 'janv.'\n   * @example Info.months('numeric', { locale: 'ar' })[0] //=> '١'\n   * @example Info.months('long', { outputCalendar: 'islamic' })[0] //=> 'Rabiʻ I'\n   * @return {Array}\n   */\n  static months(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length);\n  }\n\n  /**\n   * Return an array of format month names.\n   * Format months differ from standalone months in that they're meant to appear next to the day of the month. In some languages, that\n   * changes the string.\n   * See {@link Info#months}\n   * @param {string} [length='long'] - the length of the month representation, such as \"numeric\", \"2-digit\", \"narrow\", \"short\", \"long\"\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @param {string} [opts.outputCalendar='gregory'] - the calendar\n   * @return {Array}\n   */\n  static monthsFormat(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null, outputCalendar = \"gregory\" } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, outputCalendar)).months(length, true);\n  }\n\n  /**\n   * Return an array of standalone week names.\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param {string} [length='long'] - the length of the weekday representation, such as \"narrow\", \"short\", \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @example Info.weekdays()[0] //=> 'Monday'\n   * @example Info.weekdays('short')[0] //=> 'Mon'\n   * @example Info.weekdays('short', { locale: 'fr-CA' })[0] //=> 'lun.'\n   * @example Info.weekdays('short', { locale: 'ar' })[0] //=> 'الاثنين'\n   * @return {Array}\n   */\n  static weekdays(length = \"long\", { locale = null, numberingSystem = null, locObj = null } = {}) {\n    return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length);\n  }\n\n  /**\n   * Return an array of format week names.\n   * Format weekdays differ from standalone weekdays in that they're meant to appear next to more date information. In some languages, that\n   * changes the string.\n   * See {@link Info#weekdays}\n   * @param {string} [length='long'] - the length of the month representation, such as \"narrow\", \"short\", \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale=null] - the locale code\n   * @param {string} [opts.numberingSystem=null] - the numbering system\n   * @param {string} [opts.locObj=null] - an existing locale object to use\n   * @return {Array}\n   */\n  static weekdaysFormat(\n    length = \"long\",\n    { locale = null, numberingSystem = null, locObj = null } = {}\n  ) {\n    return (locObj || Locale.create(locale, numberingSystem, null)).weekdays(length, true);\n  }\n\n  /**\n   * Return an array of meridiems.\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @example Info.meridiems() //=> [ 'AM', 'PM' ]\n   * @example Info.meridiems({ locale: 'my' }) //=> [ 'နံနက်', 'ညနေ' ]\n   * @return {Array}\n   */\n  static meridiems({ locale = null } = {}) {\n    return Locale.create(locale).meridiems();\n  }\n\n  /**\n   * Return an array of eras, such as ['BC', 'AD']. The locale can be specified, but the calendar system is always Gregorian.\n   * @param {string} [length='short'] - the length of the era representation, such as \"short\" or \"long\".\n   * @param {Object} opts - options\n   * @param {string} [opts.locale] - the locale code\n   * @example Info.eras() //=> [ 'BC', 'AD' ]\n   * @example Info.eras('long') //=> [ 'Before Christ', 'Anno Domini' ]\n   * @example Info.eras('long', { locale: 'fr' }) //=> [ 'avant Jésus-Christ', 'après Jésus-Christ' ]\n   * @return {Array}\n   */\n  static eras(length = \"short\", { locale = null } = {}) {\n    return Locale.create(locale, null, \"gregory\").eras(length);\n  }\n\n  /**\n   * Return the set of available features in this environment.\n   * Some features of Luxon are not available in all environments. For example, on older browsers, relative time formatting support is not available. Use this function to figure out if that's the case.\n   * Keys:\n   * * `relative`: whether this environment supports relative time formatting\n   * * `localeWeek`: whether this environment supports different weekdays for the start of the week based on the locale\n   * @example Info.features() //=> { relative: false, localeWeek: true }\n   * @return {Object}\n   */\n  static features() {\n    return { relative: hasRelative(), localeWeek: hasLocaleWeekInfo() };\n  }\n}\n\nfunction dayDiff(earlier, later) {\n  const utcDayStart = (dt) => dt.toUTC(0, { keepLocalTime: true }).startOf(\"day\").valueOf(),\n    ms = utcDayStart(later) - utcDayStart(earlier);\n  return Math.floor(Duration.fromMillis(ms).as(\"days\"));\n}\n\nfunction highOrderDiffs(cursor, later, units) {\n  const differs = [\n    [\"years\", (a, b) => b.year - a.year],\n    [\"quarters\", (a, b) => b.quarter - a.quarter + (b.year - a.year) * 4],\n    [\"months\", (a, b) => b.month - a.month + (b.year - a.year) * 12],\n    [\n      \"weeks\",\n      (a, b) => {\n        const days = dayDiff(a, b);\n        return (days - (days % 7)) / 7;\n      },\n    ],\n    [\"days\", dayDiff],\n  ];\n\n  const results = {};\n  const earlier = cursor;\n  let lowestOrder, highWater;\n\n  /* This loop tries to diff using larger units first.\n     If we overshoot, we backtrack and try the next smaller unit.\n     \"cursor\" starts out at the earlier timestamp and moves closer and closer to \"later\"\n     as we use smaller and smaller units.\n     highWater keeps track of where we would be if we added one more of the smallest unit,\n     this is used later to potentially convert any difference smaller than the smallest higher order unit\n     into a fraction of that smallest higher order unit\n  */\n  for (const [unit, differ] of differs) {\n    if (units.indexOf(unit) >= 0) {\n      lowestOrder = unit;\n\n      results[unit] = differ(cursor, later);\n      highWater = earlier.plus(results);\n\n      if (highWater > later) {\n        // we overshot the end point, backtrack cursor by 1\n        results[unit]--;\n        cursor = earlier.plus(results);\n\n        // if we are still overshooting now, we need to backtrack again\n        // this happens in certain situations when diffing times in different zones,\n        // because this calculation ignores time zones\n        if (cursor > later) {\n          // keep the \"overshot by 1\" around as highWater\n          highWater = cursor;\n          // backtrack cursor by 1\n          results[unit]--;\n          cursor = earlier.plus(results);\n        }\n      } else {\n        cursor = highWater;\n      }\n    }\n  }\n\n  return [cursor, results, highWater, lowestOrder];\n}\n\nfunction diff (earlier, later, units, opts) {\n  let [cursor, results, highWater, lowestOrder] = highOrderDiffs(earlier, later, units);\n\n  const remainingMillis = later - cursor;\n\n  const lowerOrderUnits = units.filter(\n    (u) => [\"hours\", \"minutes\", \"seconds\", \"milliseconds\"].indexOf(u) >= 0\n  );\n\n  if (lowerOrderUnits.length === 0) {\n    if (highWater < later) {\n      highWater = cursor.plus({ [lowestOrder]: 1 });\n    }\n\n    if (highWater !== cursor) {\n      results[lowestOrder] = (results[lowestOrder] || 0) + remainingMillis / (highWater - cursor);\n    }\n  }\n\n  const duration = Duration.fromObject(results, opts);\n\n  if (lowerOrderUnits.length > 0) {\n    return Duration.fromMillis(remainingMillis, opts)\n      .shiftTo(...lowerOrderUnits)\n      .plus(duration);\n  } else {\n    return duration;\n  }\n}\n\nconst MISSING_FTP = \"missing Intl.DateTimeFormat.formatToParts support\";\n\nfunction intUnit(regex, post = (i) => i) {\n  return { regex, deser: ([s]) => post(parseDigits(s)) };\n}\n\nconst NBSP = String.fromCharCode(160);\nconst spaceOrNBSP = `[ ${NBSP}]`;\nconst spaceOrNBSPRegExp = new RegExp(spaceOrNBSP, \"g\");\n\nfunction fixListRegex(s) {\n  // make dots optional and also make them literal\n  // make space and non breakable space characters interchangeable\n  return s.replace(/\\./g, \"\\\\.?\").replace(spaceOrNBSPRegExp, spaceOrNBSP);\n}\n\nfunction stripInsensitivities(s) {\n  return s\n    .replace(/\\./g, \"\") // ignore dots that were made optional\n    .replace(spaceOrNBSPRegExp, \" \") // interchange space and nbsp\n    .toLowerCase();\n}\n\nfunction oneOf(strings, startIndex) {\n  if (strings === null) {\n    return null;\n  } else {\n    return {\n      regex: RegExp(strings.map(fixListRegex).join(\"|\")),\n      deser: ([s]) =>\n        strings.findIndex((i) => stripInsensitivities(s) === stripInsensitivities(i)) + startIndex,\n    };\n  }\n}\n\nfunction offset(regex, groups) {\n  return { regex, deser: ([, h, m]) => signedOffset(h, m), groups };\n}\n\nfunction simple(regex) {\n  return { regex, deser: ([s]) => s };\n}\n\nfunction escapeToken(value) {\n  return value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\n}\n\n/**\n * @param token\n * @param {Locale} loc\n */\nfunction unitForToken(token, loc) {\n  const one = digitRegex(loc),\n    two = digitRegex(loc, \"{2}\"),\n    three = digitRegex(loc, \"{3}\"),\n    four = digitRegex(loc, \"{4}\"),\n    six = digitRegex(loc, \"{6}\"),\n    oneOrTwo = digitRegex(loc, \"{1,2}\"),\n    oneToThree = digitRegex(loc, \"{1,3}\"),\n    oneToSix = digitRegex(loc, \"{1,6}\"),\n    oneToNine = digitRegex(loc, \"{1,9}\"),\n    twoToFour = digitRegex(loc, \"{2,4}\"),\n    fourToSix = digitRegex(loc, \"{4,6}\"),\n    literal = (t) => ({ regex: RegExp(escapeToken(t.val)), deser: ([s]) => s, literal: true }),\n    unitate = (t) => {\n      if (token.literal) {\n        return literal(t);\n      }\n      switch (t.val) {\n        // era\n        case \"G\":\n          return oneOf(loc.eras(\"short\"), 0);\n        case \"GG\":\n          return oneOf(loc.eras(\"long\"), 0);\n        // years\n        case \"y\":\n          return intUnit(oneToSix);\n        case \"yy\":\n          return intUnit(twoToFour, untruncateYear);\n        case \"yyyy\":\n          return intUnit(four);\n        case \"yyyyy\":\n          return intUnit(fourToSix);\n        case \"yyyyyy\":\n          return intUnit(six);\n        // months\n        case \"M\":\n          return intUnit(oneOrTwo);\n        case \"MM\":\n          return intUnit(two);\n        case \"MMM\":\n          return oneOf(loc.months(\"short\", true), 1);\n        case \"MMMM\":\n          return oneOf(loc.months(\"long\", true), 1);\n        case \"L\":\n          return intUnit(oneOrTwo);\n        case \"LL\":\n          return intUnit(two);\n        case \"LLL\":\n          return oneOf(loc.months(\"short\", false), 1);\n        case \"LLLL\":\n          return oneOf(loc.months(\"long\", false), 1);\n        // dates\n        case \"d\":\n          return intUnit(oneOrTwo);\n        case \"dd\":\n          return intUnit(two);\n        // ordinals\n        case \"o\":\n          return intUnit(oneToThree);\n        case \"ooo\":\n          return intUnit(three);\n        // time\n        case \"HH\":\n          return intUnit(two);\n        case \"H\":\n          return intUnit(oneOrTwo);\n        case \"hh\":\n          return intUnit(two);\n        case \"h\":\n          return intUnit(oneOrTwo);\n        case \"mm\":\n          return intUnit(two);\n        case \"m\":\n          return intUnit(oneOrTwo);\n        case \"q\":\n          return intUnit(oneOrTwo);\n        case \"qq\":\n          return intUnit(two);\n        case \"s\":\n          return intUnit(oneOrTwo);\n        case \"ss\":\n          return intUnit(two);\n        case \"S\":\n          return intUnit(oneToThree);\n        case \"SSS\":\n          return intUnit(three);\n        case \"u\":\n          return simple(oneToNine);\n        case \"uu\":\n          return simple(oneOrTwo);\n        case \"uuu\":\n          return intUnit(one);\n        // meridiem\n        case \"a\":\n          return oneOf(loc.meridiems(), 0);\n        // weekYear (k)\n        case \"kkkk\":\n          return intUnit(four);\n        case \"kk\":\n          return intUnit(twoToFour, untruncateYear);\n        // weekNumber (W)\n        case \"W\":\n          return intUnit(oneOrTwo);\n        case \"WW\":\n          return intUnit(two);\n        // weekdays\n        case \"E\":\n        case \"c\":\n          return intUnit(one);\n        case \"EEE\":\n          return oneOf(loc.weekdays(\"short\", false), 1);\n        case \"EEEE\":\n          return oneOf(loc.weekdays(\"long\", false), 1);\n        case \"ccc\":\n          return oneOf(loc.weekdays(\"short\", true), 1);\n        case \"cccc\":\n          return oneOf(loc.weekdays(\"long\", true), 1);\n        // offset/zone\n        case \"Z\":\n        case \"ZZ\":\n          return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`), 2);\n        case \"ZZZ\":\n          return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`), 2);\n        // we don't support ZZZZ (PST) or ZZZZZ (Pacific Standard Time) in parsing\n        // because we don't have any way to figure out what they are\n        case \"z\":\n          return simple(/[a-z_+-/]{1,256}?/i);\n        // this special-case \"token\" represents a place where a macro-token expanded into a white-space literal\n        // in this case we accept any non-newline white-space\n        case \" \":\n          return simple(/[^\\S\\n\\r]/);\n        default:\n          return literal(t);\n      }\n    };\n\n  const unit = unitate(token) || {\n    invalidReason: MISSING_FTP,\n  };\n\n  unit.token = token;\n\n  return unit;\n}\n\nconst partTypeStyleToTokenVal = {\n  year: {\n    \"2-digit\": \"yy\",\n    numeric: \"yyyyy\",\n  },\n  month: {\n    numeric: \"M\",\n    \"2-digit\": \"MM\",\n    short: \"MMM\",\n    long: \"MMMM\",\n  },\n  day: {\n    numeric: \"d\",\n    \"2-digit\": \"dd\",\n  },\n  weekday: {\n    short: \"EEE\",\n    long: \"EEEE\",\n  },\n  dayperiod: \"a\",\n  dayPeriod: \"a\",\n  hour12: {\n    numeric: \"h\",\n    \"2-digit\": \"hh\",\n  },\n  hour24: {\n    numeric: \"H\",\n    \"2-digit\": \"HH\",\n  },\n  minute: {\n    numeric: \"m\",\n    \"2-digit\": \"mm\",\n  },\n  second: {\n    numeric: \"s\",\n    \"2-digit\": \"ss\",\n  },\n  timeZoneName: {\n    long: \"ZZZZZ\",\n    short: \"ZZZ\",\n  },\n};\n\nfunction tokenForPart(part, formatOpts, resolvedOpts) {\n  const { type, value } = part;\n\n  if (type === \"literal\") {\n    const isSpace = /^\\s+$/.test(value);\n    return {\n      literal: !isSpace,\n      val: isSpace ? \" \" : value,\n    };\n  }\n\n  const style = formatOpts[type];\n\n  // The user might have explicitly specified hour12 or hourCycle\n  // if so, respect their decision\n  // if not, refer back to the resolvedOpts, which are based on the locale\n  let actualType = type;\n  if (type === \"hour\") {\n    if (formatOpts.hour12 != null) {\n      actualType = formatOpts.hour12 ? \"hour12\" : \"hour24\";\n    } else if (formatOpts.hourCycle != null) {\n      if (formatOpts.hourCycle === \"h11\" || formatOpts.hourCycle === \"h12\") {\n        actualType = \"hour12\";\n      } else {\n        actualType = \"hour24\";\n      }\n    } else {\n      // tokens only differentiate between 24 hours or not,\n      // so we do not need to check hourCycle here, which is less supported anyways\n      actualType = resolvedOpts.hour12 ? \"hour12\" : \"hour24\";\n    }\n  }\n  let val = partTypeStyleToTokenVal[actualType];\n  if (typeof val === \"object\") {\n    val = val[style];\n  }\n\n  if (val) {\n    return {\n      literal: false,\n      val,\n    };\n  }\n\n  return undefined;\n}\n\nfunction buildRegex(units) {\n  const re = units.map((u) => u.regex).reduce((f, r) => `${f}(${r.source})`, \"\");\n  return [`^${re}$`, units];\n}\n\nfunction match(input, regex, handlers) {\n  const matches = input.match(regex);\n\n  if (matches) {\n    const all = {};\n    let matchIndex = 1;\n    for (const i in handlers) {\n      if (hasOwnProperty(handlers, i)) {\n        const h = handlers[i],\n          groups = h.groups ? h.groups + 1 : 1;\n        if (!h.literal && h.token) {\n          all[h.token.val[0]] = h.deser(matches.slice(matchIndex, matchIndex + groups));\n        }\n        matchIndex += groups;\n      }\n    }\n    return [matches, all];\n  } else {\n    return [matches, {}];\n  }\n}\n\nfunction dateTimeFromMatches(matches) {\n  const toField = (token) => {\n    switch (token) {\n      case \"S\":\n        return \"millisecond\";\n      case \"s\":\n        return \"second\";\n      case \"m\":\n        return \"minute\";\n      case \"h\":\n      case \"H\":\n        return \"hour\";\n      case \"d\":\n        return \"day\";\n      case \"o\":\n        return \"ordinal\";\n      case \"L\":\n      case \"M\":\n        return \"month\";\n      case \"y\":\n        return \"year\";\n      case \"E\":\n      case \"c\":\n        return \"weekday\";\n      case \"W\":\n        return \"weekNumber\";\n      case \"k\":\n        return \"weekYear\";\n      case \"q\":\n        return \"quarter\";\n      default:\n        return null;\n    }\n  };\n\n  let zone = null;\n  let specificOffset;\n  if (!isUndefined(matches.z)) {\n    zone = IANAZone.create(matches.z);\n  }\n\n  if (!isUndefined(matches.Z)) {\n    if (!zone) {\n      zone = new FixedOffsetZone(matches.Z);\n    }\n    specificOffset = matches.Z;\n  }\n\n  if (!isUndefined(matches.q)) {\n    matches.M = (matches.q - 1) * 3 + 1;\n  }\n\n  if (!isUndefined(matches.h)) {\n    if (matches.h < 12 && matches.a === 1) {\n      matches.h += 12;\n    } else if (matches.h === 12 && matches.a === 0) {\n      matches.h = 0;\n    }\n  }\n\n  if (matches.G === 0 && matches.y) {\n    matches.y = -matches.y;\n  }\n\n  if (!isUndefined(matches.u)) {\n    matches.S = parseMillis(matches.u);\n  }\n\n  const vals = Object.keys(matches).reduce((r, k) => {\n    const f = toField(k);\n    if (f) {\n      r[f] = matches[k];\n    }\n\n    return r;\n  }, {});\n\n  return [vals, zone, specificOffset];\n}\n\nlet dummyDateTimeCache = null;\n\nfunction getDummyDateTime() {\n  if (!dummyDateTimeCache) {\n    dummyDateTimeCache = DateTime.fromMillis(1555555555555);\n  }\n\n  return dummyDateTimeCache;\n}\n\nfunction maybeExpandMacroToken(token, locale) {\n  if (token.literal) {\n    return token;\n  }\n\n  const formatOpts = Formatter.macroTokenToFormatOpts(token.val);\n  const tokens = formatOptsToTokens(formatOpts, locale);\n\n  if (tokens == null || tokens.includes(undefined)) {\n    return token;\n  }\n\n  return tokens;\n}\n\nfunction expandMacroTokens(tokens, locale) {\n  return Array.prototype.concat(...tokens.map((t) => maybeExpandMacroToken(t, locale)));\n}\n\n/**\n * @private\n */\n\nclass TokenParser {\n  constructor(locale, format) {\n    this.locale = locale;\n    this.format = format;\n    this.tokens = expandMacroTokens(Formatter.parseFormat(format), locale);\n    this.units = this.tokens.map((t) => unitForToken(t, locale));\n    this.disqualifyingUnit = this.units.find((t) => t.invalidReason);\n\n    if (!this.disqualifyingUnit) {\n      const [regexString, handlers] = buildRegex(this.units);\n      this.regex = RegExp(regexString, \"i\");\n      this.handlers = handlers;\n    }\n  }\n\n  explainFromTokens(input) {\n    if (!this.isValid) {\n      return { input, tokens: this.tokens, invalidReason: this.invalidReason };\n    } else {\n      const [rawMatches, matches] = match(input, this.regex, this.handlers),\n        [result, zone, specificOffset] = matches\n          ? dateTimeFromMatches(matches)\n          : [null, null, undefined];\n      if (hasOwnProperty(matches, \"a\") && hasOwnProperty(matches, \"H\")) {\n        throw new ConflictingSpecificationError(\n          \"Can't include meridiem when specifying 24-hour format\"\n        );\n      }\n      return {\n        input,\n        tokens: this.tokens,\n        regex: this.regex,\n        rawMatches,\n        matches,\n        result,\n        zone,\n        specificOffset,\n      };\n    }\n  }\n\n  get isValid() {\n    return !this.disqualifyingUnit;\n  }\n\n  get invalidReason() {\n    return this.disqualifyingUnit ? this.disqualifyingUnit.invalidReason : null;\n  }\n}\n\nfunction explainFromTokens(locale, input, format) {\n  const parser = new TokenParser(locale, format);\n  return parser.explainFromTokens(input);\n}\n\nfunction parseFromTokens(locale, input, format) {\n  const { result, zone, specificOffset, invalidReason } = explainFromTokens(locale, input, format);\n  return [result, zone, specificOffset, invalidReason];\n}\n\nfunction formatOptsToTokens(formatOpts, locale) {\n  if (!formatOpts) {\n    return null;\n  }\n\n  const formatter = Formatter.create(locale, formatOpts);\n  const df = formatter.dtFormatter(getDummyDateTime());\n  const parts = df.formatToParts();\n  const resolvedOpts = df.resolvedOptions();\n  return parts.map((p) => tokenForPart(p, formatOpts, resolvedOpts));\n}\n\nconst INVALID = \"Invalid DateTime\";\nconst MAX_DATE = 8.64e15;\n\nfunction unsupportedZone(zone) {\n  return new Invalid(\"unsupported zone\", `the zone \"${zone.name}\" is not supported`);\n}\n\n// we cache week data on the DT object and this intermediates the cache\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedWeekData(dt) {\n  if (dt.weekData === null) {\n    dt.weekData = gregorianToWeek(dt.c);\n  }\n  return dt.weekData;\n}\n\n/**\n * @param {DateTime} dt\n */\nfunction possiblyCachedLocalWeekData(dt) {\n  if (dt.localWeekData === null) {\n    dt.localWeekData = gregorianToWeek(\n      dt.c,\n      dt.loc.getMinDaysInFirstWeek(),\n      dt.loc.getStartOfWeek()\n    );\n  }\n  return dt.localWeekData;\n}\n\n// clone really means, \"make a new object with these modifications\". all \"setters\" really use this\n// to create a new object while only changing some of the properties\nfunction clone(inst, alts) {\n  const current = {\n    ts: inst.ts,\n    zone: inst.zone,\n    c: inst.c,\n    o: inst.o,\n    loc: inst.loc,\n    invalid: inst.invalid,\n  };\n  return new DateTime({ ...current, ...alts, old: current });\n}\n\n// find the right offset a given local time. The o input is our guess, which determines which\n// offset we'll pick in ambiguous cases (e.g. there are two 3 AMs b/c Fallback DST)\nfunction fixOffset(localTS, o, tz) {\n  // Our UTC time is just a guess because our offset is just a guess\n  let utcGuess = localTS - o * 60 * 1000;\n\n  // Test whether the zone matches the offset for this ts\n  const o2 = tz.offset(utcGuess);\n\n  // If so, offset didn't change and we're done\n  if (o === o2) {\n    return [utcGuess, o];\n  }\n\n  // If not, change the ts by the difference in the offset\n  utcGuess -= (o2 - o) * 60 * 1000;\n\n  // If that gives us the local time we want, we're done\n  const o3 = tz.offset(utcGuess);\n  if (o2 === o3) {\n    return [utcGuess, o2];\n  }\n\n  // If it's different, we're in a hole time. The offset has changed, but the we don't adjust the time\n  return [localTS - Math.min(o2, o3) * 60 * 1000, Math.max(o2, o3)];\n}\n\n// convert an epoch timestamp into a calendar object with the given offset\nfunction tsToObj(ts, offset) {\n  ts += offset * 60 * 1000;\n\n  const d = new Date(ts);\n\n  return {\n    year: d.getUTCFullYear(),\n    month: d.getUTCMonth() + 1,\n    day: d.getUTCDate(),\n    hour: d.getUTCHours(),\n    minute: d.getUTCMinutes(),\n    second: d.getUTCSeconds(),\n    millisecond: d.getUTCMilliseconds(),\n  };\n}\n\n// convert a calendar object to a epoch timestamp\nfunction objToTS(obj, offset, zone) {\n  return fixOffset(objToLocalTS(obj), offset, zone);\n}\n\n// create a new DT instance by adding a duration, adjusting for DSTs\nfunction adjustTime(inst, dur) {\n  const oPre = inst.o,\n    year = inst.c.year + Math.trunc(dur.years),\n    month = inst.c.month + Math.trunc(dur.months) + Math.trunc(dur.quarters) * 3,\n    c = {\n      ...inst.c,\n      year,\n      month,\n      day:\n        Math.min(inst.c.day, daysInMonth(year, month)) +\n        Math.trunc(dur.days) +\n        Math.trunc(dur.weeks) * 7,\n    },\n    millisToAdd = Duration.fromObject({\n      years: dur.years - Math.trunc(dur.years),\n      quarters: dur.quarters - Math.trunc(dur.quarters),\n      months: dur.months - Math.trunc(dur.months),\n      weeks: dur.weeks - Math.trunc(dur.weeks),\n      days: dur.days - Math.trunc(dur.days),\n      hours: dur.hours,\n      minutes: dur.minutes,\n      seconds: dur.seconds,\n      milliseconds: dur.milliseconds,\n    }).as(\"milliseconds\"),\n    localTS = objToLocalTS(c);\n\n  let [ts, o] = fixOffset(localTS, oPre, inst.zone);\n\n  if (millisToAdd !== 0) {\n    ts += millisToAdd;\n    // that could have changed the offset by going over a DST, but we want to keep the ts the same\n    o = inst.zone.offset(ts);\n  }\n\n  return { ts, o };\n}\n\n// helper useful in turning the results of parsing into real dates\n// by handling the zone options\nfunction parseDataToDateTime(parsed, parsedZone, opts, format, text, specificOffset) {\n  const { setZone, zone } = opts;\n  if ((parsed && Object.keys(parsed).length !== 0) || parsedZone) {\n    const interpretationZone = parsedZone || zone,\n      inst = DateTime.fromObject(parsed, {\n        ...opts,\n        zone: interpretationZone,\n        specificOffset,\n      });\n    return setZone ? inst : inst.setZone(zone);\n  } else {\n    return DateTime.invalid(\n      new Invalid(\"unparsable\", `the input \"${text}\" can't be parsed as ${format}`)\n    );\n  }\n}\n\n// if you want to output a technical format (e.g. RFC 2822), this helper\n// helps handle the details\nfunction toTechFormat(dt, format, allowZ = true) {\n  return dt.isValid\n    ? Formatter.create(Locale.create(\"en-US\"), {\n        allowZ,\n        forceSimple: true,\n      }).formatDateTimeFromString(dt, format)\n    : null;\n}\n\nfunction toISODate(o, extended, precision) {\n  const longFormat = o.c.year > 9999 || o.c.year < 0;\n  let c = \"\";\n  if (longFormat && o.c.year >= 0) c += \"+\";\n  c += padStart(o.c.year, longFormat ? 6 : 4);\n  if (precision === \"year\") return c;\n  if (extended) {\n    c += \"-\";\n    c += padStart(o.c.month);\n    if (precision === \"month\") return c;\n    c += \"-\";\n  } else {\n    c += padStart(o.c.month);\n    if (precision === \"month\") return c;\n  }\n  c += padStart(o.c.day);\n  return c;\n}\n\nfunction toISOTime(\n  o,\n  extended,\n  suppressSeconds,\n  suppressMilliseconds,\n  includeOffset,\n  extendedZone,\n  precision\n) {\n  let showSeconds = !suppressSeconds || o.c.millisecond !== 0 || o.c.second !== 0,\n    c = \"\";\n  switch (precision) {\n    case \"day\":\n    case \"month\":\n    case \"year\":\n      break;\n    default:\n      c += padStart(o.c.hour);\n      if (precision === \"hour\") break;\n      if (extended) {\n        c += \":\";\n        c += padStart(o.c.minute);\n        if (precision === \"minute\") break;\n        if (showSeconds) {\n          c += \":\";\n          c += padStart(o.c.second);\n        }\n      } else {\n        c += padStart(o.c.minute);\n        if (precision === \"minute\") break;\n        if (showSeconds) {\n          c += padStart(o.c.second);\n        }\n      }\n      if (precision === \"second\") break;\n      if (showSeconds && (!suppressMilliseconds || o.c.millisecond !== 0)) {\n        c += \".\";\n        c += padStart(o.c.millisecond, 3);\n      }\n  }\n\n  if (includeOffset) {\n    if (o.isOffsetFixed && o.offset === 0 && !extendedZone) {\n      c += \"Z\";\n    } else if (o.o < 0) {\n      c += \"-\";\n      c += padStart(Math.trunc(-o.o / 60));\n      c += \":\";\n      c += padStart(Math.trunc(-o.o % 60));\n    } else {\n      c += \"+\";\n      c += padStart(Math.trunc(o.o / 60));\n      c += \":\";\n      c += padStart(Math.trunc(o.o % 60));\n    }\n  }\n\n  if (extendedZone) {\n    c += \"[\" + o.zone.ianaName + \"]\";\n  }\n  return c;\n}\n\n// defaults for unspecified units in the supported calendars\nconst defaultUnitValues = {\n    month: 1,\n    day: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  },\n  defaultWeekUnitValues = {\n    weekNumber: 1,\n    weekday: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  },\n  defaultOrdinalUnitValues = {\n    ordinal: 1,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0,\n  };\n\n// Units in the supported calendars, sorted by bigness\nconst orderedUnits = [\"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"millisecond\"],\n  orderedWeekUnits = [\n    \"weekYear\",\n    \"weekNumber\",\n    \"weekday\",\n    \"hour\",\n    \"minute\",\n    \"second\",\n    \"millisecond\",\n  ],\n  orderedOrdinalUnits = [\"year\", \"ordinal\", \"hour\", \"minute\", \"second\", \"millisecond\"];\n\n// standardize case and plurality in units\nfunction normalizeUnit(unit) {\n  const normalized = {\n    year: \"year\",\n    years: \"year\",\n    month: \"month\",\n    months: \"month\",\n    day: \"day\",\n    days: \"day\",\n    hour: \"hour\",\n    hours: \"hour\",\n    minute: \"minute\",\n    minutes: \"minute\",\n    quarter: \"quarter\",\n    quarters: \"quarter\",\n    second: \"second\",\n    seconds: \"second\",\n    millisecond: \"millisecond\",\n    milliseconds: \"millisecond\",\n    weekday: \"weekday\",\n    weekdays: \"weekday\",\n    weeknumber: \"weekNumber\",\n    weeksnumber: \"weekNumber\",\n    weeknumbers: \"weekNumber\",\n    weekyear: \"weekYear\",\n    weekyears: \"weekYear\",\n    ordinal: \"ordinal\",\n  }[unit.toLowerCase()];\n\n  if (!normalized) throw new InvalidUnitError(unit);\n\n  return normalized;\n}\n\nfunction normalizeUnitWithLocalWeeks(unit) {\n  switch (unit.toLowerCase()) {\n    case \"localweekday\":\n    case \"localweekdays\":\n      return \"localWeekday\";\n    case \"localweeknumber\":\n    case \"localweeknumbers\":\n      return \"localWeekNumber\";\n    case \"localweekyear\":\n    case \"localweekyears\":\n      return \"localWeekYear\";\n    default:\n      return normalizeUnit(unit);\n  }\n}\n\n// cache offsets for zones based on the current timestamp when this function is\n// first called. When we are handling a datetime from components like (year,\n// month, day, hour) in a time zone, we need a guess about what the timezone\n// offset is so that we can convert into a UTC timestamp. One way is to find the\n// offset of now in the zone. The actual date may have a different offset (for\n// example, if we handle a date in June while we're in December in a zone that\n// observes DST), but we can check and adjust that.\n//\n// When handling many dates, calculating the offset for now every time is\n// expensive. It's just a guess, so we can cache the offset to use even if we\n// are right on a time change boundary (we'll just correct in the other\n// direction). Using a timestamp from first read is a slight optimization for\n// handling dates close to the current date, since those dates will usually be\n// in the same offset (we could set the timestamp statically, instead). We use a\n// single timestamp for all zones to make things a bit more predictable.\n//\n// This is safe for quickDT (used by local() and utc()) because we don't fill in\n// higher-order units from tsNow (as we do in fromObject, this requires that\n// offset is calculated from tsNow).\n/**\n * @param {Zone} zone\n * @return {number}\n */\nfunction guessOffsetForZone(zone) {\n  if (zoneOffsetTs === undefined) {\n    zoneOffsetTs = Settings.now();\n  }\n\n  // Do not cache anything but IANA zones, because it is not safe to do so.\n  // Guessing an offset which is not present in the zone can cause wrong results from fixOffset\n  if (zone.type !== \"iana\") {\n    return zone.offset(zoneOffsetTs);\n  }\n  const zoneName = zone.name;\n  let offsetGuess = zoneOffsetGuessCache.get(zoneName);\n  if (offsetGuess === undefined) {\n    offsetGuess = zone.offset(zoneOffsetTs);\n    zoneOffsetGuessCache.set(zoneName, offsetGuess);\n  }\n  return offsetGuess;\n}\n\n// this is a dumbed down version of fromObject() that runs about 60% faster\n// but doesn't do any validation, makes a bunch of assumptions about what units\n// are present, and so on.\nfunction quickDT(obj, opts) {\n  const zone = normalizeZone(opts.zone, Settings.defaultZone);\n  if (!zone.isValid) {\n    return DateTime.invalid(unsupportedZone(zone));\n  }\n\n  const loc = Locale.fromObject(opts);\n\n  let ts, o;\n\n  // assume we have the higher-order units\n  if (!isUndefined(obj.year)) {\n    for (const u of orderedUnits) {\n      if (isUndefined(obj[u])) {\n        obj[u] = defaultUnitValues[u];\n      }\n    }\n\n    const invalid = hasInvalidGregorianData(obj) || hasInvalidTimeData(obj);\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    }\n\n    const offsetProvis = guessOffsetForZone(zone);\n    [ts, o] = objToTS(obj, offsetProvis, zone);\n  } else {\n    ts = Settings.now();\n  }\n\n  return new DateTime({ ts, zone, loc, o });\n}\n\nfunction diffRelative(start, end, opts) {\n  const round = isUndefined(opts.round) ? true : opts.round,\n    rounding = isUndefined(opts.rounding) ? \"trunc\" : opts.rounding,\n    format = (c, unit) => {\n      c = roundTo(c, round || opts.calendary ? 0 : 2, opts.calendary ? \"round\" : rounding);\n      const formatter = end.loc.clone(opts).relFormatter(opts);\n      return formatter.format(c, unit);\n    },\n    differ = (unit) => {\n      if (opts.calendary) {\n        if (!end.hasSame(start, unit)) {\n          return end.startOf(unit).diff(start.startOf(unit), unit).get(unit);\n        } else return 0;\n      } else {\n        return end.diff(start, unit).get(unit);\n      }\n    };\n\n  if (opts.unit) {\n    return format(differ(opts.unit), opts.unit);\n  }\n\n  for (const unit of opts.units) {\n    const count = differ(unit);\n    if (Math.abs(count) >= 1) {\n      return format(count, unit);\n    }\n  }\n  return format(start > end ? -0 : 0, opts.units[opts.units.length - 1]);\n}\n\nfunction lastOpts(argList) {\n  let opts = {},\n    args;\n  if (argList.length > 0 && typeof argList[argList.length - 1] === \"object\") {\n    opts = argList[argList.length - 1];\n    args = Array.from(argList).slice(0, argList.length - 1);\n  } else {\n    args = Array.from(argList);\n  }\n  return [opts, args];\n}\n\n/**\n * Timestamp to use for cached zone offset guesses (exposed for test)\n */\nlet zoneOffsetTs;\n/**\n * Cache for zone offset guesses (exposed for test).\n *\n * This optimizes quickDT via guessOffsetForZone to avoid repeated calls of\n * zone.offset().\n */\nconst zoneOffsetGuessCache = new Map();\n\n/**\n * A DateTime is an immutable data structure representing a specific date and time and accompanying methods. It contains class and instance methods for creating, parsing, interrogating, transforming, and formatting them.\n *\n * A DateTime comprises of:\n * * A timestamp. Each DateTime instance refers to a specific millisecond of the Unix epoch.\n * * A time zone. Each instance is considered in the context of a specific zone (by default the local system's zone).\n * * Configuration properties that effect how output strings are formatted, such as `locale`, `numberingSystem`, and `outputCalendar`.\n *\n * Here is a brief overview of the most commonly used functionality it provides:\n *\n * * **Creation**: To create a DateTime from its components, use one of its factory class methods: {@link DateTime.local}, {@link DateTime.utc}, and (most flexibly) {@link DateTime.fromObject}. To create one from a standard string format, use {@link DateTime.fromISO}, {@link DateTime.fromHTTP}, and {@link DateTime.fromRFC2822}. To create one from a custom string format, use {@link DateTime.fromFormat}. To create one from a native JS date, use {@link DateTime.fromJSDate}.\n * * **Gregorian calendar and time**: To examine the Gregorian properties of a DateTime individually (i.e as opposed to collectively through {@link DateTime#toObject}), use the {@link DateTime#year}, {@link DateTime#month},\n * {@link DateTime#day}, {@link DateTime#hour}, {@link DateTime#minute}, {@link DateTime#second}, {@link DateTime#millisecond} accessors.\n * * **Week calendar**: For ISO week calendar attributes, see the {@link DateTime#weekYear}, {@link DateTime#weekNumber}, and {@link DateTime#weekday} accessors.\n * * **Configuration** See the {@link DateTime#locale} and {@link DateTime#numberingSystem} accessors.\n * * **Transformation**: To transform the DateTime into other DateTimes, use {@link DateTime#set}, {@link DateTime#reconfigure}, {@link DateTime#setZone}, {@link DateTime#setLocale}, {@link DateTime.plus}, {@link DateTime#minus}, {@link DateTime#endOf}, {@link DateTime#startOf}, {@link DateTime#toUTC}, and {@link DateTime#toLocal}.\n * * **Output**: To convert the DateTime to other representations, use the {@link DateTime#toRelative}, {@link DateTime#toRelativeCalendar}, {@link DateTime#toJSON}, {@link DateTime#toISO}, {@link DateTime#toHTTP}, {@link DateTime#toObject}, {@link DateTime#toRFC2822}, {@link DateTime#toString}, {@link DateTime#toLocaleString}, {@link DateTime#toFormat}, {@link DateTime#toMillis} and {@link DateTime#toJSDate}.\n *\n * There's plenty others documented below. In addition, for more information on subtler topics like internationalization, time zones, alternative calendars, validity, and so on, see the external documentation.\n */\nclass DateTime {\n  /**\n   * @access private\n   */\n  constructor(config) {\n    const zone = config.zone || Settings.defaultZone;\n\n    let invalid =\n      config.invalid ||\n      (Number.isNaN(config.ts) ? new Invalid(\"invalid input\") : null) ||\n      (!zone.isValid ? unsupportedZone(zone) : null);\n    /**\n     * @access private\n     */\n    this.ts = isUndefined(config.ts) ? Settings.now() : config.ts;\n\n    let c = null,\n      o = null;\n    if (!invalid) {\n      const unchanged = config.old && config.old.ts === this.ts && config.old.zone.equals(zone);\n\n      if (unchanged) {\n        [c, o] = [config.old.c, config.old.o];\n      } else {\n        // If an offset has been passed and we have not been called from\n        // clone(), we can trust it and avoid the offset calculation.\n        const ot = isNumber(config.o) && !config.old ? config.o : zone.offset(this.ts);\n        c = tsToObj(this.ts, ot);\n        invalid = Number.isNaN(c.year) ? new Invalid(\"invalid input\") : null;\n        c = invalid ? null : c;\n        o = invalid ? null : ot;\n      }\n    }\n\n    /**\n     * @access private\n     */\n    this._zone = zone;\n    /**\n     * @access private\n     */\n    this.loc = config.loc || Locale.create();\n    /**\n     * @access private\n     */\n    this.invalid = invalid;\n    /**\n     * @access private\n     */\n    this.weekData = null;\n    /**\n     * @access private\n     */\n    this.localWeekData = null;\n    /**\n     * @access private\n     */\n    this.c = c;\n    /**\n     * @access private\n     */\n    this.o = o;\n    /**\n     * @access private\n     */\n    this.isLuxonDateTime = true;\n  }\n\n  // CONSTRUCT\n\n  /**\n   * Create a DateTime for the current instant, in the system's time zone.\n   *\n   * Use Settings to override these default values if needed.\n   * @example DateTime.now().toISO() //~> now in the ISO format\n   * @return {DateTime}\n   */\n  static now() {\n    return new DateTime({});\n  }\n\n  /**\n   * Create a local DateTime\n   * @param {number} [year] - The calendar year. If omitted (as in, call `local()` with no arguments), the current time will be used\n   * @param {number} [month=1] - The month, 1-indexed\n   * @param {number} [day=1] - The day of the month, 1-indexed\n   * @param {number} [hour=0] - The hour of the day, in 24-hour time\n   * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n   * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n   * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n   * @example DateTime.local()                                  //~> now\n   * @example DateTime.local({ zone: \"America/New_York\" })      //~> now, in US east coast time\n   * @example DateTime.local(2017)                              //~> 2017-01-01T00:00:00\n   * @example DateTime.local(2017, 3)                           //~> 2017-03-01T00:00:00\n   * @example DateTime.local(2017, 3, 12, { locale: \"fr\" })     //~> 2017-03-12T00:00:00, with a French locale\n   * @example DateTime.local(2017, 3, 12, 5)                    //~> 2017-03-12T05:00:00\n   * @example DateTime.local(2017, 3, 12, 5, { zone: \"utc\" })   //~> 2017-03-12T05:00:00, in UTC\n   * @example DateTime.local(2017, 3, 12, 5, 45)                //~> 2017-03-12T05:45:00\n   * @example DateTime.local(2017, 3, 12, 5, 45, 10)            //~> 2017-03-12T05:45:10\n   * @example DateTime.local(2017, 3, 12, 5, 45, 10, 765)       //~> 2017-03-12T05:45:10.765\n   * @return {DateTime}\n   */\n  static local() {\n    const [opts, args] = lastOpts(arguments),\n      [year, month, day, hour, minute, second, millisecond] = args;\n    return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n  }\n\n  /**\n   * Create a DateTime in UTC\n   * @param {number} [year] - The calendar year. If omitted (as in, call `utc()` with no arguments), the current time will be used\n   * @param {number} [month=1] - The month, 1-indexed\n   * @param {number} [day=1] - The day of the month\n   * @param {number} [hour=0] - The hour of the day, in 24-hour time\n   * @param {number} [minute=0] - The minute of the hour, meaning a number between 0 and 59\n   * @param {number} [second=0] - The second of the minute, meaning a number between 0 and 59\n   * @param {number} [millisecond=0] - The millisecond of the second, meaning a number between 0 and 999\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} [options.outputCalendar] - the output calendar to set on the resulting DateTime instance\n   * @param {string} [options.numberingSystem] - the numbering system to set on the resulting DateTime instance\n   * @param {string} [options.weekSettings] - the week settings to set on the resulting DateTime instance\n   * @example DateTime.utc()                                              //~> now\n   * @example DateTime.utc(2017)                                          //~> 2017-01-01T00:00:00Z\n   * @example DateTime.utc(2017, 3)                                       //~> 2017-03-01T00:00:00Z\n   * @example DateTime.utc(2017, 3, 12)                                   //~> 2017-03-12T00:00:00Z\n   * @example DateTime.utc(2017, 3, 12, 5)                                //~> 2017-03-12T05:00:00Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45)                            //~> 2017-03-12T05:45:00Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45, { locale: \"fr\" })          //~> 2017-03-12T05:45:00Z with a French locale\n   * @example DateTime.utc(2017, 3, 12, 5, 45, 10)                        //~> 2017-03-12T05:45:10Z\n   * @example DateTime.utc(2017, 3, 12, 5, 45, 10, 765, { locale: \"fr\" }) //~> 2017-03-12T05:45:10.765Z with a French locale\n   * @return {DateTime}\n   */\n  static utc() {\n    const [opts, args] = lastOpts(arguments),\n      [year, month, day, hour, minute, second, millisecond] = args;\n\n    opts.zone = FixedOffsetZone.utcInstance;\n    return quickDT({ year, month, day, hour, minute, second, millisecond }, opts);\n  }\n\n  /**\n   * Create a DateTime from a JavaScript Date object. Uses the default zone.\n   * @param {Date} date - a JavaScript Date object\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @return {DateTime}\n   */\n  static fromJSDate(date, options = {}) {\n    const ts = isDate(date) ? date.valueOf() : NaN;\n    if (Number.isNaN(ts)) {\n      return DateTime.invalid(\"invalid input\");\n    }\n\n    const zoneToUse = normalizeZone(options.zone, Settings.defaultZone);\n    if (!zoneToUse.isValid) {\n      return DateTime.invalid(unsupportedZone(zoneToUse));\n    }\n\n    return new DateTime({\n      ts: ts,\n      zone: zoneToUse,\n      loc: Locale.fromObject(options),\n    });\n  }\n\n  /**\n   * Create a DateTime from a number of milliseconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n   * @param {number} milliseconds - a number of milliseconds since 1970 UTC\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromMillis(milliseconds, options = {}) {\n    if (!isNumber(milliseconds)) {\n      throw new InvalidArgumentError(\n        `fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`\n      );\n    } else if (milliseconds < -MAX_DATE || milliseconds > MAX_DATE) {\n      // this isn't perfect because we can still end up out of range because of additional shifting, but it's a start\n      return DateTime.invalid(\"Timestamp out of range\");\n    } else {\n      return new DateTime({\n        ts: milliseconds,\n        zone: normalizeZone(options.zone, Settings.defaultZone),\n        loc: Locale.fromObject(options),\n      });\n    }\n  }\n\n  /**\n   * Create a DateTime from a number of seconds since the epoch (meaning since 1 January 1970 00:00:00 UTC). Uses the default zone.\n   * @param {number} seconds - a number of seconds since 1970 UTC\n   * @param {Object} options - configuration options for the DateTime\n   * @param {string|Zone} [options.zone='local'] - the zone to place the DateTime into\n   * @param {string} [options.locale] - a locale to set on the resulting DateTime instance\n   * @param {string} options.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} options.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} options.weekSettings - the week settings to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromSeconds(seconds, options = {}) {\n    if (!isNumber(seconds)) {\n      throw new InvalidArgumentError(\"fromSeconds requires a numerical input\");\n    } else {\n      return new DateTime({\n        ts: seconds * 1000,\n        zone: normalizeZone(options.zone, Settings.defaultZone),\n        loc: Locale.fromObject(options),\n      });\n    }\n  }\n\n  /**\n   * Create a DateTime from a JavaScript object with keys like 'year' and 'hour' with reasonable defaults.\n   * @param {Object} obj - the object to create the DateTime from\n   * @param {number} obj.year - a year, such as 1987\n   * @param {number} obj.month - a month, 1-12\n   * @param {number} obj.day - a day of the month, 1-31, depending on the month\n   * @param {number} obj.ordinal - day of the year, 1-365 or 366\n   * @param {number} obj.weekYear - an ISO week year\n   * @param {number} obj.weekNumber - an ISO week number, between 1 and 52 or 53, depending on the year\n   * @param {number} obj.weekday - an ISO weekday, 1-7, where 1 is Monday and 7 is Sunday\n   * @param {number} obj.localWeekYear - a week year, according to the locale\n   * @param {number} obj.localWeekNumber - a week number, between 1 and 52 or 53, depending on the year, according to the locale\n   * @param {number} obj.localWeekday - a weekday, 1-7, where 1 is the first and 7 is the last day of the week, according to the locale\n   * @param {number} obj.hour - hour of the day, 0-23\n   * @param {number} obj.minute - minute of the hour, 0-59\n   * @param {number} obj.second - second of the minute, 0-59\n   * @param {number} obj.millisecond - millisecond of the second, 0-999\n   * @param {Object} opts - options for creating this DateTime\n   * @param {string|Zone} [opts.zone='local'] - interpret the numbers in the context of a particular zone. Can take any value taken as the first argument to setZone()\n   * @param {string} [opts.locale='system\\'s locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @example DateTime.fromObject({ year: 1982, month: 5, day: 25}).toISODate() //=> '1982-05-25'\n   * @example DateTime.fromObject({ year: 1982 }).toISODate() //=> '1982-01-01'\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }) //~> today at 10:26:06\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'utc' }),\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'local' })\n   * @example DateTime.fromObject({ hour: 10, minute: 26, second: 6 }, { zone: 'America/New_York' })\n   * @example DateTime.fromObject({ weekYear: 2016, weekNumber: 2, weekday: 3 }).toISODate() //=> '2016-01-13'\n   * @example DateTime.fromObject({ localWeekYear: 2022, localWeekNumber: 1, localWeekday: 1 }, { locale: \"en-US\" }).toISODate() //=> '2021-12-26'\n   * @return {DateTime}\n   */\n  static fromObject(obj, opts = {}) {\n    obj = obj || {};\n    const zoneToUse = normalizeZone(opts.zone, Settings.defaultZone);\n    if (!zoneToUse.isValid) {\n      return DateTime.invalid(unsupportedZone(zoneToUse));\n    }\n\n    const loc = Locale.fromObject(opts);\n    const normalized = normalizeObject(obj, normalizeUnitWithLocalWeeks);\n    const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, loc);\n\n    const tsNow = Settings.now(),\n      offsetProvis = !isUndefined(opts.specificOffset)\n        ? opts.specificOffset\n        : zoneToUse.offset(tsNow),\n      containsOrdinal = !isUndefined(normalized.ordinal),\n      containsGregorYear = !isUndefined(normalized.year),\n      containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n      containsGregor = containsGregorYear || containsGregorMD,\n      definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n    // cases:\n    // just a weekday -> this week's instance of that weekday, no worries\n    // (gregorian data or ordinal) + (weekYear or weekNumber) -> error\n    // (gregorian month or day) + ordinal -> error\n    // otherwise just use weeks or ordinals or gregorian, depending on what's specified\n\n    if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n      throw new ConflictingSpecificationError(\n        \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n      );\n    }\n\n    if (containsGregorMD && containsOrdinal) {\n      throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n    }\n\n    const useWeekData = definiteWeekDef || (normalized.weekday && !containsGregor);\n\n    // configure ourselves to deal with gregorian dates or week stuff\n    let units,\n      defaultValues,\n      objNow = tsToObj(tsNow, offsetProvis);\n    if (useWeekData) {\n      units = orderedWeekUnits;\n      defaultValues = defaultWeekUnitValues;\n      objNow = gregorianToWeek(objNow, minDaysInFirstWeek, startOfWeek);\n    } else if (containsOrdinal) {\n      units = orderedOrdinalUnits;\n      defaultValues = defaultOrdinalUnitValues;\n      objNow = gregorianToOrdinal(objNow);\n    } else {\n      units = orderedUnits;\n      defaultValues = defaultUnitValues;\n    }\n\n    // set default values for missing stuff\n    let foundFirst = false;\n    for (const u of units) {\n      const v = normalized[u];\n      if (!isUndefined(v)) {\n        foundFirst = true;\n      } else if (foundFirst) {\n        normalized[u] = defaultValues[u];\n      } else {\n        normalized[u] = objNow[u];\n      }\n    }\n\n    // make sure the values we have are in range\n    const higherOrderInvalid = useWeekData\n        ? hasInvalidWeekData(normalized, minDaysInFirstWeek, startOfWeek)\n        : containsOrdinal\n        ? hasInvalidOrdinalData(normalized)\n        : hasInvalidGregorianData(normalized),\n      invalid = higherOrderInvalid || hasInvalidTimeData(normalized);\n\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    }\n\n    // compute the actual time\n    const gregorian = useWeekData\n        ? weekToGregorian(normalized, minDaysInFirstWeek, startOfWeek)\n        : containsOrdinal\n        ? ordinalToGregorian(normalized)\n        : normalized,\n      [tsFinal, offsetFinal] = objToTS(gregorian, offsetProvis, zoneToUse),\n      inst = new DateTime({\n        ts: tsFinal,\n        zone: zoneToUse,\n        o: offsetFinal,\n        loc,\n      });\n\n    // gregorian data + weekday serves only to validate\n    if (normalized.weekday && containsGregor && obj.weekday !== inst.weekday) {\n      return DateTime.invalid(\n        \"mismatched weekday\",\n        `you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`\n      );\n    }\n\n    if (!inst.isValid) {\n      return DateTime.invalid(inst.invalid);\n    }\n\n    return inst;\n  }\n\n  /**\n   * Create a DateTime from an ISO 8601 string\n   * @param {string} text - the ISO string\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the time to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} [opts.outputCalendar] - the output calendar to set on the resulting DateTime instance\n   * @param {string} [opts.numberingSystem] - the numbering system to set on the resulting DateTime instance\n   * @param {string} [opts.weekSettings] - the week settings to set on the resulting DateTime instance\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123')\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00')\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123+06:00', {setZone: true})\n   * @example DateTime.fromISO('2016-05-25T09:08:34.123', {zone: 'utc'})\n   * @example DateTime.fromISO('2016-W05-4')\n   * @return {DateTime}\n   */\n  static fromISO(text, opts = {}) {\n    const [vals, parsedZone] = parseISODate(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"ISO 8601\", text);\n  }\n\n  /**\n   * Create a DateTime from an RFC 2822 string\n   * @param {string} text - the RFC 2822 string\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since the offset is always specified in the string itself, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n   * @param {boolean} [opts.setZone=false] - override the zone with a fixed-offset zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @example DateTime.fromRFC2822('25 Nov 2016 13:23:12 GMT')\n   * @example DateTime.fromRFC2822('Fri, 25 Nov 2016 13:23:12 +0600')\n   * @example DateTime.fromRFC2822('25 Nov 2016 13:23 Z')\n   * @return {DateTime}\n   */\n  static fromRFC2822(text, opts = {}) {\n    const [vals, parsedZone] = parseRFC2822Date(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"RFC 2822\", text);\n  }\n\n  /**\n   * Create a DateTime from an HTTP header date\n   * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n   * @param {string} text - the HTTP header date\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - convert the time to this zone. Since HTTP dates are always in UTC, this has no effect on the interpretation of string, merely the zone the resulting DateTime is expressed in.\n   * @param {boolean} [opts.setZone=false] - override the zone with the fixed-offset zone specified in the string. For HTTP dates, this is always UTC, so this option is equivalent to setting the `zone` option to 'utc', but this option is included for consistency with similar methods.\n   * @param {string} [opts.locale='system's locale'] - a locale to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @param {string} opts.numberingSystem - the numbering system to set on the resulting DateTime instance\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @example DateTime.fromHTTP('Sun, 06 Nov 1994 08:49:37 GMT')\n   * @example DateTime.fromHTTP('Sunday, 06-Nov-94 08:49:37 GMT')\n   * @example DateTime.fromHTTP('Sun Nov  6 08:49:37 1994')\n   * @return {DateTime}\n   */\n  static fromHTTP(text, opts = {}) {\n    const [vals, parsedZone] = parseHTTPDate(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"HTTP\", opts);\n  }\n\n  /**\n   * Create a DateTime from an input string and format string.\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/parsing?id=table-of-tokens).\n   * @param {string} text - the string to parse\n   * @param {string} fmt - the format the string is expected to be in (see the link below for the formats)\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n   * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @return {DateTime}\n   */\n  static fromFormat(text, fmt, opts = {}) {\n    if (isUndefined(text) || isUndefined(fmt)) {\n      throw new InvalidArgumentError(\"fromFormat requires an input string and a format\");\n    }\n\n    const { locale = null, numberingSystem = null } = opts,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      }),\n      [vals, parsedZone, specificOffset, invalid] = parseFromTokens(localeToUse, text, fmt);\n    if (invalid) {\n      return DateTime.invalid(invalid);\n    } else {\n      return parseDataToDateTime(vals, parsedZone, opts, `format ${fmt}`, text, specificOffset);\n    }\n  }\n\n  /**\n   * @deprecated use fromFormat instead\n   */\n  static fromString(text, fmt, opts = {}) {\n    return DateTime.fromFormat(text, fmt, opts);\n  }\n\n  /**\n   * Create a DateTime from a SQL date, time, or datetime\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale\n   * @param {string} text - the string to parse\n   * @param {Object} opts - options to affect the creation\n   * @param {string|Zone} [opts.zone='local'] - use this zone if no offset is specified in the input string itself. Will also convert the DateTime to this zone\n   * @param {boolean} [opts.setZone=false] - override the zone with a zone specified in the string itself, if it specifies one\n   * @param {string} [opts.locale='en-US'] - a locale string to use when parsing. Will also set the DateTime to this locale\n   * @param {string} opts.numberingSystem - the numbering system to use when parsing. Will also set the resulting DateTime to this numbering system\n   * @param {string} opts.weekSettings - the week settings to set on the resulting DateTime instance\n   * @param {string} opts.outputCalendar - the output calendar to set on the resulting DateTime instance\n   * @example DateTime.fromSQL('2017-05-15')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342+06:00')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles')\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342 America/Los_Angeles', { setZone: true })\n   * @example DateTime.fromSQL('2017-05-15 09:12:34.342', { zone: 'America/Los_Angeles' })\n   * @example DateTime.fromSQL('09:12:34.342')\n   * @return {DateTime}\n   */\n  static fromSQL(text, opts = {}) {\n    const [vals, parsedZone] = parseSQL(text);\n    return parseDataToDateTime(vals, parsedZone, opts, \"SQL\", text);\n  }\n\n  /**\n   * Create an invalid DateTime.\n   * @param {string} reason - simple string of why this DateTime is invalid. Should not contain parameters or anything else data-dependent.\n   * @param {string} [explanation=null] - longer explanation, may include parameters and other useful debugging information\n   * @return {DateTime}\n   */\n  static invalid(reason, explanation = null) {\n    if (!reason) {\n      throw new InvalidArgumentError(\"need to specify a reason the DateTime is invalid\");\n    }\n\n    const invalid = reason instanceof Invalid ? reason : new Invalid(reason, explanation);\n\n    if (Settings.throwOnInvalid) {\n      throw new InvalidDateTimeError(invalid);\n    } else {\n      return new DateTime({ invalid });\n    }\n  }\n\n  /**\n   * Check if an object is an instance of DateTime. Works across context boundaries\n   * @param {object} o\n   * @return {boolean}\n   */\n  static isDateTime(o) {\n    return (o && o.isLuxonDateTime) || false;\n  }\n\n  /**\n   * Produce the format string for a set of options\n   * @param formatOpts\n   * @param localeOpts\n   * @returns {string}\n   */\n  static parseFormatForOpts(formatOpts, localeOpts = {}) {\n    const tokenList = formatOptsToTokens(formatOpts, Locale.fromObject(localeOpts));\n    return !tokenList ? null : tokenList.map((t) => (t ? t.val : null)).join(\"\");\n  }\n\n  /**\n   * Produce the the fully expanded format token for the locale\n   * Does NOT quote characters, so quoted tokens will not round trip correctly\n   * @param fmt\n   * @param localeOpts\n   * @returns {string}\n   */\n  static expandFormat(fmt, localeOpts = {}) {\n    const expanded = expandMacroTokens(Formatter.parseFormat(fmt), Locale.fromObject(localeOpts));\n    return expanded.map((t) => t.val).join(\"\");\n  }\n\n  static resetCache() {\n    zoneOffsetTs = undefined;\n    zoneOffsetGuessCache.clear();\n  }\n\n  // INFO\n\n  /**\n   * Get the value of unit.\n   * @param {string} unit - a unit such as 'minute' or 'day'\n   * @example DateTime.local(2017, 7, 4).get('month'); //=> 7\n   * @example DateTime.local(2017, 7, 4).get('day'); //=> 4\n   * @return {number}\n   */\n  get(unit) {\n    return this[unit];\n  }\n\n  /**\n   * Returns whether the DateTime is valid. Invalid DateTimes occur when:\n   * * The DateTime was created from invalid calendar information, such as the 13th month or February 30\n   * * The DateTime was created by an operation on another invalid date\n   * @type {boolean}\n   */\n  get isValid() {\n    return this.invalid === null;\n  }\n\n  /**\n   * Returns an error code if this DateTime is invalid, or null if the DateTime is valid\n   * @type {string}\n   */\n  get invalidReason() {\n    return this.invalid ? this.invalid.reason : null;\n  }\n\n  /**\n   * Returns an explanation of why this DateTime became invalid, or null if the DateTime is valid\n   * @type {string}\n   */\n  get invalidExplanation() {\n    return this.invalid ? this.invalid.explanation : null;\n  }\n\n  /**\n   * Get the locale of a DateTime, such 'en-GB'. The locale is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get locale() {\n    return this.isValid ? this.loc.locale : null;\n  }\n\n  /**\n   * Get the numbering system of a DateTime, such 'beng'. The numbering system is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get numberingSystem() {\n    return this.isValid ? this.loc.numberingSystem : null;\n  }\n\n  /**\n   * Get the output calendar of a DateTime, such 'islamic'. The output calendar is used when formatting the DateTime\n   *\n   * @type {string}\n   */\n  get outputCalendar() {\n    return this.isValid ? this.loc.outputCalendar : null;\n  }\n\n  /**\n   * Get the time zone associated with this DateTime.\n   * @type {Zone}\n   */\n  get zone() {\n    return this._zone;\n  }\n\n  /**\n   * Get the name of the time zone.\n   * @type {string}\n   */\n  get zoneName() {\n    return this.isValid ? this.zone.name : null;\n  }\n\n  /**\n   * Get the year\n   * @example DateTime.local(2017, 5, 25).year //=> 2017\n   * @type {number}\n   */\n  get year() {\n    return this.isValid ? this.c.year : NaN;\n  }\n\n  /**\n   * Get the quarter\n   * @example DateTime.local(2017, 5, 25).quarter //=> 2\n   * @type {number}\n   */\n  get quarter() {\n    return this.isValid ? Math.ceil(this.c.month / 3) : NaN;\n  }\n\n  /**\n   * Get the month (1-12).\n   * @example DateTime.local(2017, 5, 25).month //=> 5\n   * @type {number}\n   */\n  get month() {\n    return this.isValid ? this.c.month : NaN;\n  }\n\n  /**\n   * Get the day of the month (1-30ish).\n   * @example DateTime.local(2017, 5, 25).day //=> 25\n   * @type {number}\n   */\n  get day() {\n    return this.isValid ? this.c.day : NaN;\n  }\n\n  /**\n   * Get the hour of the day (0-23).\n   * @example DateTime.local(2017, 5, 25, 9).hour //=> 9\n   * @type {number}\n   */\n  get hour() {\n    return this.isValid ? this.c.hour : NaN;\n  }\n\n  /**\n   * Get the minute of the hour (0-59).\n   * @example DateTime.local(2017, 5, 25, 9, 30).minute //=> 30\n   * @type {number}\n   */\n  get minute() {\n    return this.isValid ? this.c.minute : NaN;\n  }\n\n  /**\n   * Get the second of the minute (0-59).\n   * @example DateTime.local(2017, 5, 25, 9, 30, 52).second //=> 52\n   * @type {number}\n   */\n  get second() {\n    return this.isValid ? this.c.second : NaN;\n  }\n\n  /**\n   * Get the millisecond of the second (0-999).\n   * @example DateTime.local(2017, 5, 25, 9, 30, 52, 654).millisecond //=> 654\n   * @type {number}\n   */\n  get millisecond() {\n    return this.isValid ? this.c.millisecond : NaN;\n  }\n\n  /**\n   * Get the week year\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2014, 12, 31).weekYear //=> 2015\n   * @type {number}\n   */\n  get weekYear() {\n    return this.isValid ? possiblyCachedWeekData(this).weekYear : NaN;\n  }\n\n  /**\n   * Get the week number of the week year (1-52ish).\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2017, 5, 25).weekNumber //=> 21\n   * @type {number}\n   */\n  get weekNumber() {\n    return this.isValid ? possiblyCachedWeekData(this).weekNumber : NaN;\n  }\n\n  /**\n   * Get the day of the week.\n   * 1 is Monday and 7 is Sunday\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2014, 11, 31).weekday //=> 4\n   * @type {number}\n   */\n  get weekday() {\n    return this.isValid ? possiblyCachedWeekData(this).weekday : NaN;\n  }\n\n  /**\n   * Returns true if this date is on a weekend according to the locale, false otherwise\n   * @returns {boolean}\n   */\n  get isWeekend() {\n    return this.isValid && this.loc.getWeekendDays().includes(this.weekday);\n  }\n\n  /**\n   * Get the day of the week according to the locale.\n   * 1 is the first day of the week and 7 is the last day of the week.\n   * If the locale assigns Sunday as the first day of the week, then a date which is a Sunday will return 1,\n   * @returns {number}\n   */\n  get localWeekday() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekday : NaN;\n  }\n\n  /**\n   * Get the week number of the week year according to the locale. Different locales assign week numbers differently,\n   * because the week can start on different days of the week (see localWeekday) and because a different number of days\n   * is required for a week to count as the first week of a year.\n   * @returns {number}\n   */\n  get localWeekNumber() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekNumber : NaN;\n  }\n\n  /**\n   * Get the week year according to the locale. Different locales assign week numbers (and therefor week years)\n   * differently, see localWeekNumber.\n   * @returns {number}\n   */\n  get localWeekYear() {\n    return this.isValid ? possiblyCachedLocalWeekData(this).weekYear : NaN;\n  }\n\n  /**\n   * Get the ordinal (meaning the day of the year)\n   * @example DateTime.local(2017, 5, 25).ordinal //=> 145\n   * @type {number|DateTime}\n   */\n  get ordinal() {\n    return this.isValid ? gregorianToOrdinal(this.c).ordinal : NaN;\n  }\n\n  /**\n   * Get the human readable short month name, such as 'Oct'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).monthShort //=> Oct\n   * @type {string}\n   */\n  get monthShort() {\n    return this.isValid ? Info.months(\"short\", { locObj: this.loc })[this.month - 1] : null;\n  }\n\n  /**\n   * Get the human readable long month name, such as 'October'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).monthLong //=> October\n   * @type {string}\n   */\n  get monthLong() {\n    return this.isValid ? Info.months(\"long\", { locObj: this.loc })[this.month - 1] : null;\n  }\n\n  /**\n   * Get the human readable short weekday, such as 'Mon'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).weekdayShort //=> Mon\n   * @type {string}\n   */\n  get weekdayShort() {\n    return this.isValid ? Info.weekdays(\"short\", { locObj: this.loc })[this.weekday - 1] : null;\n  }\n\n  /**\n   * Get the human readable long weekday, such as 'Monday'.\n   * Defaults to the system's locale if no locale has been specified\n   * @example DateTime.local(2017, 10, 30).weekdayLong //=> Monday\n   * @type {string}\n   */\n  get weekdayLong() {\n    return this.isValid ? Info.weekdays(\"long\", { locObj: this.loc })[this.weekday - 1] : null;\n  }\n\n  /**\n   * Get the UTC offset of this DateTime in minutes\n   * @example DateTime.now().offset //=> -240\n   * @example DateTime.utc().offset //=> 0\n   * @type {number}\n   */\n  get offset() {\n    return this.isValid ? +this.o : NaN;\n  }\n\n  /**\n   * Get the short human name for the zone's current offset, for example \"EST\" or \"EDT\".\n   * Defaults to the system's locale if no locale has been specified\n   * @type {string}\n   */\n  get offsetNameShort() {\n    if (this.isValid) {\n      return this.zone.offsetName(this.ts, {\n        format: \"short\",\n        locale: this.locale,\n      });\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get the long human name for the zone's current offset, for example \"Eastern Standard Time\" or \"Eastern Daylight Time\".\n   * Defaults to the system's locale if no locale has been specified\n   * @type {string}\n   */\n  get offsetNameLong() {\n    if (this.isValid) {\n      return this.zone.offsetName(this.ts, {\n        format: \"long\",\n        locale: this.locale,\n      });\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * Get whether this zone's offset ever changes, as in a DST.\n   * @type {boolean}\n   */\n  get isOffsetFixed() {\n    return this.isValid ? this.zone.isUniversal : null;\n  }\n\n  /**\n   * Get whether the DateTime is in a DST.\n   * @type {boolean}\n   */\n  get isInDST() {\n    if (this.isOffsetFixed) {\n      return false;\n    } else {\n      return (\n        this.offset > this.set({ month: 1, day: 1 }).offset ||\n        this.offset > this.set({ month: 5 }).offset\n      );\n    }\n  }\n\n  /**\n   * Get those DateTimes which have the same local time as this DateTime, but a different offset from UTC\n   * in this DateTime's zone. During DST changes local time can be ambiguous, for example\n   * `2023-10-29T02:30:00` in `Europe/Berlin` can have offset `+01:00` or `+02:00`.\n   * This method will return both possible DateTimes if this DateTime's local time is ambiguous.\n   * @returns {DateTime[]}\n   */\n  getPossibleOffsets() {\n    if (!this.isValid || this.isOffsetFixed) {\n      return [this];\n    }\n    const dayMs = 86400000;\n    const minuteMs = 60000;\n    const localTS = objToLocalTS(this.c);\n    const oEarlier = this.zone.offset(localTS - dayMs);\n    const oLater = this.zone.offset(localTS + dayMs);\n\n    const o1 = this.zone.offset(localTS - oEarlier * minuteMs);\n    const o2 = this.zone.offset(localTS - oLater * minuteMs);\n    if (o1 === o2) {\n      return [this];\n    }\n    const ts1 = localTS - o1 * minuteMs;\n    const ts2 = localTS - o2 * minuteMs;\n    const c1 = tsToObj(ts1, o1);\n    const c2 = tsToObj(ts2, o2);\n    if (\n      c1.hour === c2.hour &&\n      c1.minute === c2.minute &&\n      c1.second === c2.second &&\n      c1.millisecond === c2.millisecond\n    ) {\n      return [clone(this, { ts: ts1 }), clone(this, { ts: ts2 })];\n    }\n    return [this];\n  }\n\n  /**\n   * Returns true if this DateTime is in a leap year, false otherwise\n   * @example DateTime.local(2016).isInLeapYear //=> true\n   * @example DateTime.local(2013).isInLeapYear //=> false\n   * @type {boolean}\n   */\n  get isInLeapYear() {\n    return isLeapYear(this.year);\n  }\n\n  /**\n   * Returns the number of days in this DateTime's month\n   * @example DateTime.local(2016, 2).daysInMonth //=> 29\n   * @example DateTime.local(2016, 3).daysInMonth //=> 31\n   * @type {number}\n   */\n  get daysInMonth() {\n    return daysInMonth(this.year, this.month);\n  }\n\n  /**\n   * Returns the number of days in this DateTime's year\n   * @example DateTime.local(2016).daysInYear //=> 366\n   * @example DateTime.local(2013).daysInYear //=> 365\n   * @type {number}\n   */\n  get daysInYear() {\n    return this.isValid ? daysInYear(this.year) : NaN;\n  }\n\n  /**\n   * Returns the number of weeks in this DateTime's year\n   * @see https://en.wikipedia.org/wiki/ISO_week_date\n   * @example DateTime.local(2004).weeksInWeekYear //=> 53\n   * @example DateTime.local(2013).weeksInWeekYear //=> 52\n   * @type {number}\n   */\n  get weeksInWeekYear() {\n    return this.isValid ? weeksInWeekYear(this.weekYear) : NaN;\n  }\n\n  /**\n   * Returns the number of weeks in this DateTime's local week year\n   * @example DateTime.local(2020, 6, {locale: 'en-US'}).weeksInLocalWeekYear //=> 52\n   * @example DateTime.local(2020, 6, {locale: 'de-DE'}).weeksInLocalWeekYear //=> 53\n   * @type {number}\n   */\n  get weeksInLocalWeekYear() {\n    return this.isValid\n      ? weeksInWeekYear(\n          this.localWeekYear,\n          this.loc.getMinDaysInFirstWeek(),\n          this.loc.getStartOfWeek()\n        )\n      : NaN;\n  }\n\n  /**\n   * Returns the resolved Intl options for this DateTime.\n   * This is useful in understanding the behavior of formatting methods\n   * @param {Object} opts - the same options as toLocaleString\n   * @return {Object}\n   */\n  resolvedLocaleOptions(opts = {}) {\n    const { locale, numberingSystem, calendar } = Formatter.create(\n      this.loc.clone(opts),\n      opts\n    ).resolvedOptions(this);\n    return { locale, numberingSystem, outputCalendar: calendar };\n  }\n\n  // TRANSFORM\n\n  /**\n   * \"Set\" the DateTime's zone to UTC. Returns a newly-constructed DateTime.\n   *\n   * Equivalent to {@link DateTime#setZone}('utc')\n   * @param {number} [offset=0] - optionally, an offset from UTC in minutes\n   * @param {Object} [opts={}] - options to pass to `setZone()`\n   * @return {DateTime}\n   */\n  toUTC(offset = 0, opts = {}) {\n    return this.setZone(FixedOffsetZone.instance(offset), opts);\n  }\n\n  /**\n   * \"Set\" the DateTime's zone to the host's local zone. Returns a newly-constructed DateTime.\n   *\n   * Equivalent to `setZone('local')`\n   * @return {DateTime}\n   */\n  toLocal() {\n    return this.setZone(Settings.defaultZone);\n  }\n\n  /**\n   * \"Set\" the DateTime's zone to specified zone. Returns a newly-constructed DateTime.\n   *\n   * By default, the setter keeps the underlying time the same (as in, the same timestamp), but the new instance will report different local times and consider DSTs when making computations, as with {@link DateTime#plus}. You may wish to use {@link DateTime#toLocal} and {@link DateTime#toUTC} which provide simple convenience wrappers for commonly used zones.\n   * @param {string|Zone} [zone='local'] - a zone identifier. As a string, that can be any IANA zone supported by the host environment, or a fixed-offset name of the form 'UTC+3', or the strings 'local' or 'utc'. You may also supply an instance of a {@link DateTime#Zone} class.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.keepLocalTime=false] - If true, adjust the underlying time so that the local time stays the same, but in the target zone. You should rarely need this.\n   * @return {DateTime}\n   */\n  setZone(zone, { keepLocalTime = false, keepCalendarTime = false } = {}) {\n    zone = normalizeZone(zone, Settings.defaultZone);\n    if (zone.equals(this.zone)) {\n      return this;\n    } else if (!zone.isValid) {\n      return DateTime.invalid(unsupportedZone(zone));\n    } else {\n      let newTS = this.ts;\n      if (keepLocalTime || keepCalendarTime) {\n        const offsetGuess = zone.offset(this.ts);\n        const asObj = this.toObject();\n        [newTS] = objToTS(asObj, offsetGuess, zone);\n      }\n      return clone(this, { ts: newTS, zone });\n    }\n  }\n\n  /**\n   * \"Set\" the locale, numberingSystem, or outputCalendar. Returns a newly-constructed DateTime.\n   * @param {Object} properties - the properties to set\n   * @example DateTime.local(2017, 5, 25).reconfigure({ locale: 'en-GB' })\n   * @return {DateTime}\n   */\n  reconfigure({ locale, numberingSystem, outputCalendar } = {}) {\n    const loc = this.loc.clone({ locale, numberingSystem, outputCalendar });\n    return clone(this, { loc });\n  }\n\n  /**\n   * \"Set\" the locale. Returns a newly-constructed DateTime.\n   * Just a convenient alias for reconfigure({ locale })\n   * @example DateTime.local(2017, 5, 25).setLocale('en-GB')\n   * @return {DateTime}\n   */\n  setLocale(locale) {\n    return this.reconfigure({ locale });\n  }\n\n  /**\n   * \"Set\" the values of specified units. Returns a newly-constructed DateTime.\n   * You can only set units with this method; for \"setting\" metadata, see {@link DateTime#reconfigure} and {@link DateTime#setZone}.\n   *\n   * This method also supports setting locale-based week units, i.e. `localWeekday`, `localWeekNumber` and `localWeekYear`.\n   * They cannot be mixed with ISO-week units like `weekday`.\n   * @param {Object} values - a mapping of units to numbers\n   * @example dt.set({ year: 2017 })\n   * @example dt.set({ hour: 8, minute: 30 })\n   * @example dt.set({ weekday: 5 })\n   * @example dt.set({ year: 2005, ordinal: 234 })\n   * @return {DateTime}\n   */\n  set(values) {\n    if (!this.isValid) return this;\n\n    const normalized = normalizeObject(values, normalizeUnitWithLocalWeeks);\n    const { minDaysInFirstWeek, startOfWeek } = usesLocalWeekValues(normalized, this.loc);\n\n    const settingWeekStuff =\n        !isUndefined(normalized.weekYear) ||\n        !isUndefined(normalized.weekNumber) ||\n        !isUndefined(normalized.weekday),\n      containsOrdinal = !isUndefined(normalized.ordinal),\n      containsGregorYear = !isUndefined(normalized.year),\n      containsGregorMD = !isUndefined(normalized.month) || !isUndefined(normalized.day),\n      containsGregor = containsGregorYear || containsGregorMD,\n      definiteWeekDef = normalized.weekYear || normalized.weekNumber;\n\n    if ((containsGregor || containsOrdinal) && definiteWeekDef) {\n      throw new ConflictingSpecificationError(\n        \"Can't mix weekYear/weekNumber units with year/month/day or ordinals\"\n      );\n    }\n\n    if (containsGregorMD && containsOrdinal) {\n      throw new ConflictingSpecificationError(\"Can't mix ordinal dates with month/day\");\n    }\n\n    let mixed;\n    if (settingWeekStuff) {\n      mixed = weekToGregorian(\n        { ...gregorianToWeek(this.c, minDaysInFirstWeek, startOfWeek), ...normalized },\n        minDaysInFirstWeek,\n        startOfWeek\n      );\n    } else if (!isUndefined(normalized.ordinal)) {\n      mixed = ordinalToGregorian({ ...gregorianToOrdinal(this.c), ...normalized });\n    } else {\n      mixed = { ...this.toObject(), ...normalized };\n\n      // if we didn't set the day but we ended up on an overflow date,\n      // use the last day of the right month\n      if (isUndefined(normalized.day)) {\n        mixed.day = Math.min(daysInMonth(mixed.year, mixed.month), mixed.day);\n      }\n    }\n\n    const [ts, o] = objToTS(mixed, this.o, this.zone);\n    return clone(this, { ts, o });\n  }\n\n  /**\n   * Add a period of time to this DateTime and return the resulting DateTime\n   *\n   * Adding hours, minutes, seconds, or milliseconds increases the timestamp by the right number of milliseconds. Adding days, months, or years shifts the calendar, accounting for DSTs and leap years along the way. Thus, `dt.plus({ hours: 24 })` may result in a different time than `dt.plus({ days: 1 })` if there's a DST shift in between.\n   * @param {Duration|Object|number} duration - The amount to add. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   * @example DateTime.now().plus(123) //~> in 123 milliseconds\n   * @example DateTime.now().plus({ minutes: 15 }) //~> in 15 minutes\n   * @example DateTime.now().plus({ days: 1 }) //~> this time tomorrow\n   * @example DateTime.now().plus({ days: -1 }) //~> this time yesterday\n   * @example DateTime.now().plus({ hours: 3, minutes: 13 }) //~> in 3 hr, 13 min\n   * @example DateTime.now().plus(Duration.fromObject({ hours: 3, minutes: 13 })) //~> in 3 hr, 13 min\n   * @return {DateTime}\n   */\n  plus(duration) {\n    if (!this.isValid) return this;\n    const dur = Duration.fromDurationLike(duration);\n    return clone(this, adjustTime(this, dur));\n  }\n\n  /**\n   * Subtract a period of time to this DateTime and return the resulting DateTime\n   * See {@link DateTime#plus}\n   * @param {Duration|Object|number} duration - The amount to subtract. Either a Luxon Duration, a number of milliseconds, the object argument to Duration.fromObject()\n   @return {DateTime}\n   */\n  minus(duration) {\n    if (!this.isValid) return this;\n    const dur = Duration.fromDurationLike(duration).negate();\n    return clone(this, adjustTime(this, dur));\n  }\n\n  /**\n   * \"Set\" this DateTime to the beginning of a unit of time.\n   * @param {string} unit - The unit to go to the beginning of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n   * @example DateTime.local(2014, 3, 3).startOf('month').toISODate(); //=> '2014-03-01'\n   * @example DateTime.local(2014, 3, 3).startOf('year').toISODate(); //=> '2014-01-01'\n   * @example DateTime.local(2014, 3, 3).startOf('week').toISODate(); //=> '2014-03-03', weeks always start on Mondays\n   * @example DateTime.local(2014, 3, 3, 5, 30).startOf('day').toISOTime(); //=> '00:00.000-05:00'\n   * @example DateTime.local(2014, 3, 3, 5, 30).startOf('hour').toISOTime(); //=> '05:00:00.000-05:00'\n   * @return {DateTime}\n   */\n  startOf(unit, { useLocaleWeeks = false } = {}) {\n    if (!this.isValid) return this;\n\n    const o = {},\n      normalizedUnit = Duration.normalizeUnit(unit);\n    switch (normalizedUnit) {\n      case \"years\":\n        o.month = 1;\n      // falls through\n      case \"quarters\":\n      case \"months\":\n        o.day = 1;\n      // falls through\n      case \"weeks\":\n      case \"days\":\n        o.hour = 0;\n      // falls through\n      case \"hours\":\n        o.minute = 0;\n      // falls through\n      case \"minutes\":\n        o.second = 0;\n      // falls through\n      case \"seconds\":\n        o.millisecond = 0;\n        break;\n      // no default, invalid units throw in normalizeUnit()\n    }\n\n    if (normalizedUnit === \"weeks\") {\n      if (useLocaleWeeks) {\n        const startOfWeek = this.loc.getStartOfWeek();\n        const { weekday } = this;\n        if (weekday < startOfWeek) {\n          o.weekNumber = this.weekNumber - 1;\n        }\n        o.weekday = startOfWeek;\n      } else {\n        o.weekday = 1;\n      }\n    }\n\n    if (normalizedUnit === \"quarters\") {\n      const q = Math.ceil(this.month / 3);\n      o.month = (q - 1) * 3 + 1;\n    }\n\n    return this.set(o);\n  }\n\n  /**\n   * \"Set\" this DateTime to the end (meaning the last millisecond) of a unit of time\n   * @param {string} unit - The unit to go to the end of. Can be 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', or 'millisecond'.\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week\n   * @example DateTime.local(2014, 3, 3).endOf('month').toISO(); //=> '2014-03-31T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3).endOf('year').toISO(); //=> '2014-12-31T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3).endOf('week').toISO(); // => '2014-03-09T23:59:59.999-05:00', weeks start on Mondays\n   * @example DateTime.local(2014, 3, 3, 5, 30).endOf('day').toISO(); //=> '2014-03-03T23:59:59.999-05:00'\n   * @example DateTime.local(2014, 3, 3, 5, 30).endOf('hour').toISO(); //=> '2014-03-03T05:59:59.999-05:00'\n   * @return {DateTime}\n   */\n  endOf(unit, opts) {\n    return this.isValid\n      ? this.plus({ [unit]: 1 })\n          .startOf(unit, opts)\n          .minus(1)\n      : this;\n  }\n\n  // OUTPUT\n\n  /**\n   * Returns a string representation of this DateTime formatted according to the specified format string.\n   * **You may not want this.** See {@link DateTime#toLocaleString} for a more flexible formatting tool. For a table of tokens and their interpretations, see [here](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).\n   * Defaults to en-US if no locale has been specified, regardless of the system's locale.\n   * @param {string} fmt - the format string\n   * @param {Object} opts - opts to override the configuration options on this DateTime\n   * @example DateTime.now().toFormat('yyyy LLL dd') //=> '2017 Apr 22'\n   * @example DateTime.now().setLocale('fr').toFormat('yyyy LLL dd') //=> '2017 avr. 22'\n   * @example DateTime.now().toFormat('yyyy LLL dd', { locale: \"fr\" }) //=> '2017 avr. 22'\n   * @example DateTime.now().toFormat(\"HH 'hours and' mm 'minutes'\") //=> '20 hours and 55 minutes'\n   * @return {string}\n   */\n  toFormat(fmt, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this, fmt)\n      : INVALID;\n  }\n\n  /**\n   * Returns a localized string representing this date. Accepts the same options as the Intl.DateTimeFormat constructor and any presets defined by Luxon, such as `DateTime.DATE_FULL` or `DateTime.TIME_SIMPLE`.\n   * The exact behavior of this method is browser-specific, but in general it will return an appropriate representation\n   * of the DateTime in the assigned locale.\n   * Defaults to the system's locale if no locale has been specified\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat\n   * @param formatOpts {Object} - Intl.DateTimeFormat constructor options and configuration options\n   * @param {Object} opts - opts to override the configuration options on this DateTime\n   * @example DateTime.now().toLocaleString(); //=> 4/20/2017\n   * @example DateTime.now().setLocale('en-gb').toLocaleString(); //=> '20/04/2017'\n   * @example DateTime.now().toLocaleString(DateTime.DATE_FULL); //=> 'April 20, 2017'\n   * @example DateTime.now().toLocaleString(DateTime.DATE_FULL, { locale: 'fr' }); //=> '28 août 2022'\n   * @example DateTime.now().toLocaleString(DateTime.TIME_SIMPLE); //=> '11:32 AM'\n   * @example DateTime.now().toLocaleString(DateTime.DATETIME_SHORT); //=> '4/20/2017, 11:32 AM'\n   * @example DateTime.now().toLocaleString({ weekday: 'long', month: 'long', day: '2-digit' }); //=> 'Thursday, April 20'\n   * @example DateTime.now().toLocaleString({ weekday: 'short', month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }); //=> 'Thu, Apr 20, 11:27 AM'\n   * @example DateTime.now().toLocaleString({ hour: '2-digit', minute: '2-digit', hourCycle: 'h23' }); //=> '11:32'\n   * @return {string}\n   */\n  toLocaleString(formatOpts = DATE_SHORT, opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.clone(opts), formatOpts).formatDateTime(this)\n      : INVALID;\n  }\n\n  /**\n   * Returns an array of format \"parts\", meaning individual tokens along with metadata. This is allows callers to post-process individual sections of the formatted output.\n   * Defaults to the system's locale if no locale has been specified\n   * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/formatToParts\n   * @param opts {Object} - Intl.DateTimeFormat constructor options, same as `toLocaleString`.\n   * @example DateTime.now().toLocaleParts(); //=> [\n   *                                   //=>   { type: 'day', value: '25' },\n   *                                   //=>   { type: 'literal', value: '/' },\n   *                                   //=>   { type: 'month', value: '05' },\n   *                                   //=>   { type: 'literal', value: '/' },\n   *                                   //=>   { type: 'year', value: '1982' }\n   *                                   //=> ]\n   */\n  toLocaleParts(opts = {}) {\n    return this.isValid\n      ? Formatter.create(this.loc.clone(opts), opts).formatDateTimeParts(this)\n      : [];\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.extendedZone=false] - add the time zone format extension\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'years', 'months', 'days', 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n   * @example DateTime.utc(1983, 5, 25).toISO() //=> '1982-05-25T00:00:00.000Z'\n   * @example DateTime.now().toISO() //=> '2017-04-22T20:47:05.335-04:00'\n   * @example DateTime.now().toISO({ includeOffset: false }) //=> '2017-04-22T20:47:05.335'\n   * @example DateTime.now().toISO({ format: 'basic' }) //=> '20170422T204705.335-0400'\n   * @example DateTime.now().toISO({ precision: 'day' }) //=> '2017-04-22Z'\n   * @example DateTime.now().toISO({ precision: 'minute' }) //=> '2017-04-22T20:47Z'\n   * @return {string|null}\n   */\n  toISO({\n    format = \"extended\",\n    suppressSeconds = false,\n    suppressMilliseconds = false,\n    includeOffset = true,\n    extendedZone = false,\n    precision = \"milliseconds\",\n  } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    precision = normalizeUnit(precision);\n    const ext = format === \"extended\";\n\n    let c = toISODate(this, ext, precision);\n    if (orderedUnits.indexOf(precision) >= 3) c += \"T\";\n    c += toISOTime(\n      this,\n      ext,\n      suppressSeconds,\n      suppressMilliseconds,\n      includeOffset,\n      extendedZone,\n      precision\n    );\n    return c;\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's date component\n   * @param {Object} opts - options\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @param {string} [opts.precision='day'] - truncate output to desired precision: 'years', 'months', or 'days'.\n   * @example DateTime.utc(1982, 5, 25).toISODate() //=> '1982-05-25'\n   * @example DateTime.utc(1982, 5, 25).toISODate({ format: 'basic' }) //=> '19820525'\n   * @example DateTime.utc(1982, 5, 25).toISODate({ precision: 'month' }) //=> '1982-05'\n   * @return {string|null}\n   */\n  toISODate({ format = \"extended\", precision = \"day\" } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n    return toISODate(this, format === \"extended\", normalizeUnit(precision));\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's week date\n   * @example DateTime.utc(1982, 5, 25).toISOWeekDate() //=> '1982-W21-2'\n   * @return {string}\n   */\n  toISOWeekDate() {\n    return toTechFormat(this, \"kkkk-'W'WW-c\");\n  }\n\n  /**\n   * Returns an ISO 8601-compliant string representation of this DateTime's time component\n   * @param {Object} opts - options\n   * @param {boolean} [opts.suppressMilliseconds=false] - exclude milliseconds from the format if they're 0\n   * @param {boolean} [opts.suppressSeconds=false] - exclude seconds from the format if they're 0\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.extendedZone=true] - add the time zone format extension\n   * @param {boolean} [opts.includePrefix=false] - include the `T` prefix\n   * @param {string} [opts.format='extended'] - choose between the basic and extended format\n   * @param {string} [opts.precision='milliseconds'] - truncate output to desired presicion: 'hours', 'minutes', 'seconds' or 'milliseconds'. When precision and suppressSeconds or suppressMilliseconds are used together, precision sets the maximum unit shown in the output, however seconds or milliseconds will still be suppressed if they are 0.\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime() //=> '07:34:19.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34, seconds: 0, milliseconds: 0 }).toISOTime({ suppressSeconds: true }) //=> '07:34Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ format: 'basic' }) //=> '073419.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34 }).toISOTime({ includePrefix: true }) //=> 'T07:34:19.361Z'\n   * @example DateTime.utc().set({ hour: 7, minute: 34, second: 56 }).toISOTime({ precision: 'minute' }) //=> '07:34Z'\n   * @return {string}\n   */\n  toISOTime({\n    suppressMilliseconds = false,\n    suppressSeconds = false,\n    includeOffset = true,\n    includePrefix = false,\n    extendedZone = false,\n    format = \"extended\",\n    precision = \"milliseconds\",\n  } = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    precision = normalizeUnit(precision);\n    let c = includePrefix && orderedUnits.indexOf(precision) >= 3 ? \"T\" : \"\";\n    return (\n      c +\n      toISOTime(\n        this,\n        format === \"extended\",\n        suppressSeconds,\n        suppressMilliseconds,\n        includeOffset,\n        extendedZone,\n        precision\n      )\n    );\n  }\n\n  /**\n   * Returns an RFC 2822-compatible string representation of this DateTime\n   * @example DateTime.utc(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 +0000'\n   * @example DateTime.local(2014, 7, 13).toRFC2822() //=> 'Sun, 13 Jul 2014 00:00:00 -0400'\n   * @return {string}\n   */\n  toRFC2822() {\n    return toTechFormat(this, \"EEE, dd LLL yyyy HH:mm:ss ZZZ\", false);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in HTTP headers. The output is always expressed in GMT.\n   * Specifically, the string conforms to RFC 1123.\n   * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1\n   * @example DateTime.utc(2014, 7, 13).toHTTP() //=> 'Sun, 13 Jul 2014 00:00:00 GMT'\n   * @example DateTime.utc(2014, 7, 13, 19).toHTTP() //=> 'Sun, 13 Jul 2014 19:00:00 GMT'\n   * @return {string}\n   */\n  toHTTP() {\n    return toTechFormat(this.toUTC(), \"EEE, dd LLL yyyy HH:mm:ss 'GMT'\");\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL Date\n   * @example DateTime.utc(2014, 7, 13).toSQLDate() //=> '2014-07-13'\n   * @return {string|null}\n   */\n  toSQLDate() {\n    if (!this.isValid) {\n      return null;\n    }\n    return toISODate(this, true);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL Time\n   * @param {Object} opts - options\n   * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n   * @example DateTime.utc().toSQL() //=> '05:15:16.345'\n   * @example DateTime.now().toSQL() //=> '05:15:16.345 -04:00'\n   * @example DateTime.now().toSQL({ includeOffset: false }) //=> '05:15:16.345'\n   * @example DateTime.now().toSQL({ includeZone: false }) //=> '05:15:16.345 America/New_York'\n   * @return {string}\n   */\n  toSQLTime({ includeOffset = true, includeZone = false, includeOffsetSpace = true } = {}) {\n    let fmt = \"HH:mm:ss.SSS\";\n\n    if (includeZone || includeOffset) {\n      if (includeOffsetSpace) {\n        fmt += \" \";\n      }\n      if (includeZone) {\n        fmt += \"z\";\n      } else if (includeOffset) {\n        fmt += \"ZZ\";\n      }\n    }\n\n    return toTechFormat(this, fmt, true);\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for use in SQL DateTime\n   * @param {Object} opts - options\n   * @param {boolean} [opts.includeZone=false] - include the zone, such as 'America/New_York'. Overrides includeOffset.\n   * @param {boolean} [opts.includeOffset=true] - include the offset, such as 'Z' or '-04:00'\n   * @param {boolean} [opts.includeOffsetSpace=true] - include the space between the time and the offset, such as '05:15:16.345 -04:00'\n   * @example DateTime.utc(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 Z'\n   * @example DateTime.local(2014, 7, 13).toSQL() //=> '2014-07-13 00:00:00.000 -04:00'\n   * @example DateTime.local(2014, 7, 13).toSQL({ includeOffset: false }) //=> '2014-07-13 00:00:00.000'\n   * @example DateTime.local(2014, 7, 13).toSQL({ includeZone: true }) //=> '2014-07-13 00:00:00.000 America/New_York'\n   * @return {string}\n   */\n  toSQL(opts = {}) {\n    if (!this.isValid) {\n      return null;\n    }\n\n    return `${this.toSQLDate()} ${this.toSQLTime(opts)}`;\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for debugging\n   * @return {string}\n   */\n  toString() {\n    return this.isValid ? this.toISO() : INVALID;\n  }\n\n  /**\n   * Returns a string representation of this DateTime appropriate for the REPL.\n   * @return {string}\n   */\n  [Symbol.for(\"nodejs.util.inspect.custom\")]() {\n    if (this.isValid) {\n      return `DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`;\n    } else {\n      return `DateTime { Invalid, reason: ${this.invalidReason} }`;\n    }\n  }\n\n  /**\n   * Returns the epoch milliseconds of this DateTime. Alias of {@link DateTime#toMillis}\n   * @return {number}\n   */\n  valueOf() {\n    return this.toMillis();\n  }\n\n  /**\n   * Returns the epoch milliseconds of this DateTime.\n   * @return {number}\n   */\n  toMillis() {\n    return this.isValid ? this.ts : NaN;\n  }\n\n  /**\n   * Returns the epoch seconds (including milliseconds in the fractional part) of this DateTime.\n   * @return {number}\n   */\n  toSeconds() {\n    return this.isValid ? this.ts / 1000 : NaN;\n  }\n\n  /**\n   * Returns the epoch seconds (as a whole number) of this DateTime.\n   * @return {number}\n   */\n  toUnixInteger() {\n    return this.isValid ? Math.floor(this.ts / 1000) : NaN;\n  }\n\n  /**\n   * Returns an ISO 8601 representation of this DateTime appropriate for use in JSON.\n   * @return {string}\n   */\n  toJSON() {\n    return this.toISO();\n  }\n\n  /**\n   * Returns a BSON serializable equivalent to this DateTime.\n   * @return {Date}\n   */\n  toBSON() {\n    return this.toJSDate();\n  }\n\n  /**\n   * Returns a JavaScript object with this DateTime's year, month, day, and so on.\n   * @param opts - options for generating the object\n   * @param {boolean} [opts.includeConfig=false] - include configuration attributes in the output\n   * @example DateTime.now().toObject() //=> { year: 2017, month: 4, day: 22, hour: 20, minute: 49, second: 42, millisecond: 268 }\n   * @return {Object}\n   */\n  toObject(opts = {}) {\n    if (!this.isValid) return {};\n\n    const base = { ...this.c };\n\n    if (opts.includeConfig) {\n      base.outputCalendar = this.outputCalendar;\n      base.numberingSystem = this.loc.numberingSystem;\n      base.locale = this.loc.locale;\n    }\n    return base;\n  }\n\n  /**\n   * Returns a JavaScript Date equivalent to this DateTime.\n   * @return {Date}\n   */\n  toJSDate() {\n    return new Date(this.isValid ? this.ts : NaN);\n  }\n\n  // COMPARE\n\n  /**\n   * Return the difference between two DateTimes as a Duration.\n   * @param {DateTime} otherDateTime - the DateTime to compare this one to\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or array of units (such as 'hours' or 'days') to include in the duration.\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @example\n   * var i1 = DateTime.fromISO('1982-05-25T09:45'),\n   *     i2 = DateTime.fromISO('1983-10-14T10:30');\n   * i2.diff(i1).toObject() //=> { milliseconds: 43807500000 }\n   * i2.diff(i1, 'hours').toObject() //=> { hours: 12168.75 }\n   * i2.diff(i1, ['months', 'days']).toObject() //=> { months: 16, days: 19.03125 }\n   * i2.diff(i1, ['months', 'days', 'hours']).toObject() //=> { months: 16, days: 19, hours: 0.75 }\n   * @return {Duration}\n   */\n  diff(otherDateTime, unit = \"milliseconds\", opts = {}) {\n    if (!this.isValid || !otherDateTime.isValid) {\n      return Duration.invalid(\"created by diffing an invalid DateTime\");\n    }\n\n    const durOpts = { locale: this.locale, numberingSystem: this.numberingSystem, ...opts };\n\n    const units = maybeArray(unit).map(Duration.normalizeUnit),\n      otherIsLater = otherDateTime.valueOf() > this.valueOf(),\n      earlier = otherIsLater ? this : otherDateTime,\n      later = otherIsLater ? otherDateTime : this,\n      diffed = diff(earlier, later, units, durOpts);\n\n    return otherIsLater ? diffed.negate() : diffed;\n  }\n\n  /**\n   * Return the difference between this DateTime and right now.\n   * See {@link DateTime#diff}\n   * @param {string|string[]} [unit=['milliseconds']] - the unit or units units (such as 'hours' or 'days') to include in the duration\n   * @param {Object} opts - options that affect the creation of the Duration\n   * @param {string} [opts.conversionAccuracy='casual'] - the conversion system to use\n   * @return {Duration}\n   */\n  diffNow(unit = \"milliseconds\", opts = {}) {\n    return this.diff(DateTime.now(), unit, opts);\n  }\n\n  /**\n   * Return an Interval spanning between this DateTime and another DateTime\n   * @param {DateTime} otherDateTime - the other end point of the Interval\n   * @return {Interval|DateTime}\n   */\n  until(otherDateTime) {\n    return this.isValid ? Interval.fromDateTimes(this, otherDateTime) : this;\n  }\n\n  /**\n   * Return whether this DateTime is in the same unit of time as another DateTime.\n   * Higher-order units must also be identical for this function to return `true`.\n   * Note that time zones are **ignored** in this comparison, which compares the **local** calendar time. Use {@link DateTime#setZone} to convert one of the dates if needed.\n   * @param {DateTime} otherDateTime - the other DateTime\n   * @param {string} unit - the unit of time to check sameness on\n   * @param {Object} opts - options\n   * @param {boolean} [opts.useLocaleWeeks=false] - If true, use weeks based on the locale, i.e. use the locale-dependent start of the week; only the locale of this DateTime is used\n   * @example DateTime.now().hasSame(otherDT, 'day'); //~> true if otherDT is in the same current calendar day\n   * @return {boolean}\n   */\n  hasSame(otherDateTime, unit, opts) {\n    if (!this.isValid) return false;\n\n    const inputMs = otherDateTime.valueOf();\n    const adjustedToZone = this.setZone(otherDateTime.zone, { keepLocalTime: true });\n    return (\n      adjustedToZone.startOf(unit, opts) <= inputMs && inputMs <= adjustedToZone.endOf(unit, opts)\n    );\n  }\n\n  /**\n   * Equality check\n   * Two DateTimes are equal if and only if they represent the same millisecond, have the same zone and location, and are both valid.\n   * To compare just the millisecond values, use `+dt1 === +dt2`.\n   * @param {DateTime} other - the other DateTime\n   * @return {boolean}\n   */\n  equals(other) {\n    return (\n      this.isValid &&\n      other.isValid &&\n      this.valueOf() === other.valueOf() &&\n      this.zone.equals(other.zone) &&\n      this.loc.equals(other.loc)\n    );\n  }\n\n  /**\n   * Returns a string representation of a this time relative to now, such as \"in two days\". Can only internationalize if your\n   * platform supports Intl.RelativeTimeFormat. Rounds towards zero by default.\n   * @param {Object} options - options that affect the output\n   * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n   * @param {string} [options.style=\"long\"] - the style of units, must be \"long\", \"short\", or \"narrow\"\n   * @param {string|string[]} options.unit - use a specific unit or array of units; if omitted, or an array, the method will pick the best unit. Use an array or one of \"years\", \"quarters\", \"months\", \"weeks\", \"days\", \"hours\", \"minutes\", or \"seconds\"\n   * @param {boolean} [options.round=true] - whether to round the numbers in the output.\n   * @param {string} [options.rounding=\"trunc\"] - rounding method to use when rounding the numbers in the output. Can be \"trunc\" (toward zero), \"expand\" (away from zero), \"round\", \"floor\", or \"ceil\".\n   * @param {number} [options.padding=0] - padding in milliseconds. This allows you to round up the result if it fits inside the threshold. Don't use in combination with {round: false} because the decimal output will include the padding.\n   * @param {string} options.locale - override the locale of this DateTime\n   * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n   * @example DateTime.now().plus({ days: 1 }).toRelative() //=> \"in 1 day\"\n   * @example DateTime.now().setLocale(\"es\").toRelative({ days: 1 }) //=> \"dentro de 1 día\"\n   * @example DateTime.now().plus({ days: 1 }).toRelative({ locale: \"fr\" }) //=> \"dans 23 heures\"\n   * @example DateTime.now().minus({ days: 2 }).toRelative() //=> \"2 days ago\"\n   * @example DateTime.now().minus({ days: 2 }).toRelative({ unit: \"hours\" }) //=> \"48 hours ago\"\n   * @example DateTime.now().minus({ hours: 36 }).toRelative({ round: false }) //=> \"1.5 days ago\"\n   */\n  toRelative(options = {}) {\n    if (!this.isValid) return null;\n    const base = options.base || DateTime.fromObject({}, { zone: this.zone }),\n      padding = options.padding ? (this < base ? -options.padding : options.padding) : 0;\n    let units = [\"years\", \"months\", \"days\", \"hours\", \"minutes\", \"seconds\"];\n    let unit = options.unit;\n    if (Array.isArray(options.unit)) {\n      units = options.unit;\n      unit = undefined;\n    }\n    return diffRelative(base, this.plus(padding), {\n      ...options,\n      numeric: \"always\",\n      units,\n      unit,\n    });\n  }\n\n  /**\n   * Returns a string representation of this date relative to today, such as \"yesterday\" or \"next month\".\n   * Only internationalizes on platforms that supports Intl.RelativeTimeFormat.\n   * @param {Object} options - options that affect the output\n   * @param {DateTime} [options.base=DateTime.now()] - the DateTime to use as the basis to which this time is compared. Defaults to now.\n   * @param {string} options.locale - override the locale of this DateTime\n   * @param {string} options.unit - use a specific unit; if omitted, the method will pick the unit. Use one of \"years\", \"quarters\", \"months\", \"weeks\", or \"days\"\n   * @param {string} options.numberingSystem - override the numberingSystem of this DateTime. The Intl system may choose not to honor this\n   * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar() //=> \"tomorrow\"\n   * @example DateTime.now().setLocale(\"es\").plus({ days: 1 }).toRelative() //=> \"\"mañana\"\n   * @example DateTime.now().plus({ days: 1 }).toRelativeCalendar({ locale: \"fr\" }) //=> \"demain\"\n   * @example DateTime.now().minus({ days: 2 }).toRelativeCalendar() //=> \"2 days ago\"\n   */\n  toRelativeCalendar(options = {}) {\n    if (!this.isValid) return null;\n\n    return diffRelative(options.base || DateTime.fromObject({}, { zone: this.zone }), this, {\n      ...options,\n      numeric: \"auto\",\n      units: [\"years\", \"months\", \"days\"],\n      calendary: true,\n    });\n  }\n\n  /**\n   * Return the min of several date times\n   * @param {...DateTime} dateTimes - the DateTimes from which to choose the minimum\n   * @return {DateTime} the min DateTime, or undefined if called with no argument\n   */\n  static min(...dateTimes) {\n    if (!dateTimes.every(DateTime.isDateTime)) {\n      throw new InvalidArgumentError(\"min requires all arguments be DateTimes\");\n    }\n    return bestBy(dateTimes, (i) => i.valueOf(), Math.min);\n  }\n\n  /**\n   * Return the max of several date times\n   * @param {...DateTime} dateTimes - the DateTimes from which to choose the maximum\n   * @return {DateTime} the max DateTime, or undefined if called with no argument\n   */\n  static max(...dateTimes) {\n    if (!dateTimes.every(DateTime.isDateTime)) {\n      throw new InvalidArgumentError(\"max requires all arguments be DateTimes\");\n    }\n    return bestBy(dateTimes, (i) => i.valueOf(), Math.max);\n  }\n\n  // MISC\n\n  /**\n   * Explain how a string would be parsed by fromFormat()\n   * @param {string} text - the string to parse\n   * @param {string} fmt - the format the string is expected to be in (see description)\n   * @param {Object} options - options taken by fromFormat()\n   * @return {Object}\n   */\n  static fromFormatExplain(text, fmt, options = {}) {\n    const { locale = null, numberingSystem = null } = options,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      });\n    return explainFromTokens(localeToUse, text, fmt);\n  }\n\n  /**\n   * @deprecated use fromFormatExplain instead\n   */\n  static fromStringExplain(text, fmt, options = {}) {\n    return DateTime.fromFormatExplain(text, fmt, options);\n  }\n\n  /**\n   * Build a parser for `fmt` using the given locale. This parser can be passed\n   * to {@link DateTime.fromFormatParser} to a parse a date in this format. This\n   * can be used to optimize cases where many dates need to be parsed in a\n   * specific format.\n   *\n   * @param {String} fmt - the format the string is expected to be in (see\n   * description)\n   * @param {Object} options - options used to set locale and numberingSystem\n   * for parser\n   * @returns {TokenParser} - opaque object to be used\n   */\n  static buildFormatParser(fmt, options = {}) {\n    const { locale = null, numberingSystem = null } = options,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      });\n    return new TokenParser(localeToUse, fmt);\n  }\n\n  /**\n   * Create a DateTime from an input string and format parser.\n   *\n   * The format parser must have been created with the same locale as this call.\n   *\n   * @param {String} text - the string to parse\n   * @param {TokenParser} formatParser - parser from {@link DateTime.buildFormatParser}\n   * @param {Object} opts - options taken by fromFormat()\n   * @returns {DateTime}\n   */\n  static fromFormatParser(text, formatParser, opts = {}) {\n    if (isUndefined(text) || isUndefined(formatParser)) {\n      throw new InvalidArgumentError(\n        \"fromFormatParser requires an input string and a format parser\"\n      );\n    }\n    const { locale = null, numberingSystem = null } = opts,\n      localeToUse = Locale.fromOpts({\n        locale,\n        numberingSystem,\n        defaultToEN: true,\n      });\n\n    if (!localeToUse.equals(formatParser.locale)) {\n      throw new InvalidArgumentError(\n        `fromFormatParser called with a locale of ${localeToUse}, ` +\n          `but the format parser was created for ${formatParser.locale}`\n      );\n    }\n\n    const { result, zone, specificOffset, invalidReason } = formatParser.explainFromTokens(text);\n\n    if (invalidReason) {\n      return DateTime.invalid(invalidReason);\n    } else {\n      return parseDataToDateTime(\n        result,\n        zone,\n        opts,\n        `format ${formatParser.format}`,\n        text,\n        specificOffset\n      );\n    }\n  }\n\n  // FORMAT PRESETS\n\n  /**\n   * {@link DateTime#toLocaleString} format like 10/14/1983\n   * @type {Object}\n   */\n  static get DATE_SHORT() {\n    return DATE_SHORT;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_MED() {\n    return DATE_MED;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Fri, Oct 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_MED_WITH_WEEKDAY() {\n    return DATE_MED_WITH_WEEKDAY;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_FULL() {\n    return DATE_FULL;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Tuesday, October 14, 1983'\n   * @type {Object}\n   */\n  static get DATE_HUGE() {\n    return DATE_HUGE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_SIMPLE() {\n    return TIME_SIMPLE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_SECONDS() {\n    return TIME_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_SHORT_OFFSET() {\n    return TIME_WITH_SHORT_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get TIME_WITH_LONG_OFFSET() {\n    return TIME_WITH_LONG_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_SIMPLE() {\n    return TIME_24_SIMPLE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_SECONDS() {\n    return TIME_24_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 EDT', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_SHORT_OFFSET() {\n    return TIME_24_WITH_SHORT_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '09:30:23 Eastern Daylight Time', always 24-hour.\n   * @type {Object}\n   */\n  static get TIME_24_WITH_LONG_OFFSET() {\n    return TIME_24_WITH_LONG_OFFSET;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_SHORT() {\n    return DATETIME_SHORT;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like '10/14/1983, 9:30:33 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_SHORT_WITH_SECONDS() {\n    return DATETIME_SHORT_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED() {\n    return DATETIME_MED;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Oct 14, 1983, 9:30:33 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED_WITH_SECONDS() {\n    return DATETIME_MED_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Fri, 14 Oct 1983, 9:30 AM'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_MED_WITH_WEEKDAY() {\n    return DATETIME_MED_WITH_WEEKDAY;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_FULL() {\n    return DATETIME_FULL;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'October 14, 1983, 9:30:33 AM EDT'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_FULL_WITH_SECONDS() {\n    return DATETIME_FULL_WITH_SECONDS;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_HUGE() {\n    return DATETIME_HUGE;\n  }\n\n  /**\n   * {@link DateTime#toLocaleString} format like 'Friday, October 14, 1983, 9:30:33 AM Eastern Daylight Time'. Only 12-hour if the locale is.\n   * @type {Object}\n   */\n  static get DATETIME_HUGE_WITH_SECONDS() {\n    return DATETIME_HUGE_WITH_SECONDS;\n  }\n}\n\n/**\n * @private\n */\nfunction friendlyDateTime(dateTimeish) {\n  if (DateTime.isDateTime(dateTimeish)) {\n    return dateTimeish;\n  } else if (dateTimeish && dateTimeish.valueOf && isNumber(dateTimeish.valueOf())) {\n    return DateTime.fromJSDate(dateTimeish);\n  } else if (dateTimeish && typeof dateTimeish === \"object\") {\n    return DateTime.fromObject(dateTimeish);\n  } else {\n    throw new InvalidArgumentError(\n      `Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`\n    );\n  }\n}\n\nconst VERSION = \"3.7.2\";\n\nexport { DateTime, Duration, FixedOffsetZone, IANAZone, Info, Interval, InvalidZone, Settings, SystemZone, VERSION, Zone };\n//# sourceMappingURL=luxon.mjs.map\n","var e={22(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ItemController=void 0;var a=n(681),s=n(825),u=function(e){function t(t){var n=e.call(this)||this;return n.item=t,n}return o(t,e),t.prototype.setComponent=function(e){this.component=e,this.setRenderer(),this.hasSeparator(),this.hasDisable(),this.hasSplitMenu(),this.hasGroupName()},t.prototype.setRenderer=function(){var e=this.UserComponentHandler.getItemRendererDetails(this.item,this.createRendererParams());this.component.setRenderer(e)},t.prototype.createRendererParams=function(){return{label:this.item.getLabel(),hasSubmenu:this.hasChild(),hasSeparator:this.item.isSeparator(),hasDisabled:this.item.isDisabled(),parentElem:this.component.getElement(),api:this.menuModelApi}},t.prototype.addItemListener=function(){},t.prototype.getID=function(){return this.item.getId()},t.prototype.getParentId=function(){return this.item.getParentId()},t.prototype.getCustomElement=function(){return this.item.getCustomElement()},t.prototype.getElement=function(){return this.component.getElement()},t.prototype.hasSeparator=function(){this.item.isSeparator()&&this.component.setClassName(\"ZCC-divider\")},t.prototype.hasSplitMenu=function(){this.item.isSplitMenu()&&this.component.setClassName(\"ZC-SplitMenu\")},t.prototype.hasGroupName=function(){this.item.isGroupName()&&this.component.setClassName(\"ZC-Group-Title\")},t.prototype.hasDisable=function(){this.item.isDisabled()&&this.component.setClassName(\"ZCC-disableState\")},t.prototype.addFocus=function(){this.component.setFocus(!0),this.component.getElement().focus({preventScroll:!0})},t.prototype.removeFocus=function(){this.component.setFocus(!1)},t.prototype.hasChild=function(){return this.item.hasItems()},t.prototype.getChild=function(){return this.item.getItems()},t.prototype.getClassName=function(){return this.item.getClassName()},t.prototype.getLabel=function(){return this.item.getLabel()},t.prototype.destroy=function(){e.prototype.destroy.call(this)},i([(0,s.AutoWired)(s.BEAN_NAME.USER_COMPONENT_HANDLER)],t.prototype,\"UserComponentHandler\",void 0),i([(0,s.AutoWired)(a.CONTEXT_MENU_BEAN_NAME.MENU_MODEL_API)],t.prototype,\"menuModelApi\",void 0),t}(s.EventEmitter);t.ItemController=u},92(e,t,n){var r=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Controller=void 0;var o=n(825),i=n(681),a=function(){function e(){}return e.prototype.setContextMenuController=function(e){this.contextMenuController=e},e.prototype.getContextMenuController=function(){return this.contextMenuController},e=r([(0,o.Bean)(i.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_CONTROLLER)],e)}();t.Controller=a},125(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.OptionHandler=void 0;var a=n(825),s=n(681),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.init=function(){var e,t;this.element=null!==(t=null===(e=this.configuration)||void 0===e?void 0:e.element)&&void 0!==t?t:document.body},t.prototype.getDocument=function(){return this.element?this.element.ownerDocument:document},t.prototype.getPosition=function(){var e;return null!==(e=this.configuration.position)&&void 0!==e?e:\"auto\"},t.prototype.getCallout=function(){var e;return null!==(e=this.configuration.callOut)&&void 0!==e&&e},t.prototype.getForElement=function(){var e;return null!==(e=this.configuration.forElement)&&void 0!==e?e:document.body},t.prototype.getShowMenuEvent=function(){var e;return null!==(e=this.configuration.openOn)&&void 0!==e?e:\"click\"},t.prototype.getCircularNavigation=function(){var e;return null===(e=this.configuration.wrapAround)||void 0===e||e},t.prototype.getClassName=function(){var e;return null!==(e=this.configuration.className)&&void 0!==e?e:null},t.prototype.getDefaultFocus=function(){var e;return null!==(e=this.configuration.defaultFocus)&&void 0!==e&&e},t.prototype.getAddListener=function(){var e;return null!==(e=this.configuration.addListener)&&void 0!==e&&e},t.prototype.onBefore=function(e,t){var n,r=l(e,\"Before\");return\"function\"!=typeof this.configuration[r]||(null===(n=this.configuration[r](t))||void 0===n||n)},t.prototype.onAfter=function(e,t){var n=l(e,\"After\");\"function\"==typeof this.configuration[n]&&this.configuration[n](t)},t.prototype.getGapX=function(){var e;return null!==(e=this.configuration.gapX)&&void 0!==e?e:0},t.prototype.getGapY=function(){var e;return null!==(e=this.configuration.gapY)&&void 0!==e?e:0},t.prototype.getPopupParent=function(){var e;return null!==(e=this.configuration.appendTo)&&void 0!==e?e:null},t.prototype.isRTL=function(){return!1},i([(0,a.AutoWired)(s.CONTEXT_MENU_BEAN_NAME.CONFIGURATION)],t.prototype,\"configuration\",void 0),i([(0,a.PostConstruct)()],t.prototype,\"init\",null),t=i([(0,a.Bean)(a.BEAN_NAME.OPTION_HANDLER)],t)}(a.EventEmitter);function l(e,t){return e&&2==e.length?e:\"on\".concat(t).concat(e[0].toUpperCase()).concat(e.slice(1))}t.OptionHandler=u},164(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.NAVIGATION_KEY=void 0,t.NAVIGATION_KEY={ARROW_LEFT:\"ArrowLeft\",ARROW_RIGHT:\"ArrowRight\",ARROW_UP:\"ArrowUp\",ARROW_DOWN:\"ArrowDown\",ENTER:\"Enter\",SPACE:\" \",ESCAPE:\"Escape\"}},175(e,t){var n=this&&this.__values||function(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&\"number\"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},r=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.values=function(e){if(e instanceof Set||e instanceof Map){var t=[];return e.forEach(function(e){return t.push(e)}),t}return Object.values(e)},t.exists=function(e,t){void 0===t&&(t=!1);return null!=e&&(\"\"!==e||t)},t.toStringOrNull=function(e){return null!=e&&\"function\"==typeof e.toString?e.toString():null},t.createArrayOfNumbers=function(e,t){for(var n=[],r=e;r<=t;r++)n.push(r);return n},t.traverseObject=function(e,t){var o,i;if(null==e)return;if(Array.isArray(e)){for(var a=0;a<e.length;a++)t(a.toString(),e[a]);return}try{for(var s=n(Object.entries(e)),u=s.next();!u.done;u=s.next()){var l=r(u.value,2);t(l[0],l[1])}}catch(e){o={error:e}}finally{try{u&&!u.done&&(i=s.return)&&i.call(s)}finally{if(o)throw o.error}}}},205(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextMenuComponent=void 0;var a=n(825),s=n(622);var u=function(e){function t(t){var n,r=e.call(this)||this;r.menuComponents={},r.dom=((n=document.createElement(\"div\")).setAttribute(\"ref\",\"name\"),n),r.setTemplate(r.dom);var o={setClassName:function(e){return r.setClassName(e)},setId:function(e){return r.setId(e)},getDom:function(){return r.getDom()},setTabIndex:function(e){return r.setTabIndex(e)},setStyle:function(e,t){return r.setStyle(e,t)},setController:function(e){return r.setController(e)},getElement:function(){return r.getElement()},destroyMenu:function(e){return r.destroyMenu(e)},setPosition:function(e){return r.setPosition(e)},appendChildtoParent:function(e,t){return r.appendChildtoParent(e,t)},destroy:function(){return r.destroy()}};return t.setComponent(o),r}return o(t,e),t.prototype.appendChildtoParent=function(e,t){this.appendChild(e,t)},t.prototype.getElement=function(){return this.getGui()},t.prototype.setClassName=function(e){this.addCssClass(e)},t.prototype.setId=function(e){this.getDom().setAttribute(\"id\",e)},t.prototype.setTabIndex=function(e){this.getDom().setAttribute(\"tabindex\",e)},t.prototype.setStyle=function(e,t){this.getDom().style[e]=t},t.prototype.getDom=function(){return this.getGui()},t.prototype.setController=function(e){var t=this.createManagedBean(new s.MenuComponent(e));this.menuComponents[t.getID()]=t},t.prototype.setPosition=function(e){var t={popUpElement:this.getGui(),gapX:e.gapX,gapY:e.gapY,keepWithinBounds:!0,sourceElement:e.sourceElement,position:e.position,menuId:e.menuId},n=this.popupHandler.positionPopupByComponent.bind(this.popupHandler,t),r=this.popupHandler.addPopup({childElement:this.getGui(),positionCallback:n,ariaLabel:\"\",anchorToElement:e.sourceElement});r&&this.addDestroyFunc(function(){return r.hideFunction()})},t.prototype.destroy=function(){this.popupHideFunc&&this.popupHideFunc(),e.prototype.destroy.call(this)},t.prototype.destroyMenu=function(e){var t=this.menuComponents[e];t&&(t.destroy(),t.getGui().remove(),this.menuComponents[e]=null)},i([(0,a.queryAssignedNodes)(\"name\")],t.prototype,\"name\",void 0),i([(0,a.AutoWired)(a.BEAN_NAME.POPUP_HANDLER)],t.prototype,\"popupHandler\",void 0),t}(a.Component);t.ContextMenuComponent=u},214(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.Menu=void 0;var n=function(){function e(e,t,n){void 0===t&&(t=[]),this.id=e,this.items=t,this.parentId=null!=n?n:\"\"}return e.prototype.getId=function(){return this.id},e.prototype.getItems=function(){return this.items},e.prototype.getParentId=function(){return this.parentId},e.prototype.hasItems=function(){return 0!==this.items.length},e}();t.Menu=n},284(e,t,n){n.r(t)},289(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.itemElement=void 0;var a=n(825),s=function(e){function t(){return e.call(this,t.getTemplate())||this}return o(t,e),t.prototype.init=function(e){this.param=e,this.setLabel(),this.setVisibility(e.hasSubmenu)},t.prototype.setVisibility=function(e){this.eSubMenuArrow.classList.toggle(\"ZCC-hide\",!e)},t.prototype.setLabel=function(){var e=this.param.label;null!=e&&(this.divElement.innerText=e)},t.getTemplate=function(){var e=document.createElement(\"div\");return e.innerHTML='<div ref=\"divElement\" class=\"ZG-listOption ZG-listOptionPad\"></div>\\n            <span class=\"ZG-subMenuArrow\" ref=\"eSubMenuArrow\"></span>',e},t.prototype.destroy=function(){e.prototype.destroy.call(this)},i([(0,a.queryAssignedNodes)(\"divElement\")],t.prototype,\"divElement\",void 0),i([(0,a.queryAssignedNodes)(\"eSubMenuArrow\")],t.prototype,\"eSubMenuArrow\",void 0),t}(a.Component);t.itemElement=s},308(e,t,n){n.r(t)},337(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.Item=void 0;var i=n(825),a=n(910),s=function(e){function t(t,n,r){var o,i,s,u,l,c,p,d,f;void 0===r&&(r=[]);var h=e.call(this)||this;return h.alreadyRenderer=!0,h.id=void 0===t.id?a.UID_Generator.generate_itemID():t.id,h.label=null!==(o=t.label)&&void 0!==o?o:null,h.className=null!==(i=t.className)&&void 0!==i?i:\"ZG-contextMenuList\",h.separator=null!==(s=t.separator)&&void 0!==s&&s,h.disabled=null!==(u=t.disabled)&&void 0!==u&&u,h.items=null!=r?r:[],h.action=t.action,h.parentId=n,h.groupName=null!==(l=t.groupName)&&void 0!==l&&l,h.splitMenu=null!==(c=t.splitMenu)&&void 0!==c&&c,h.customElement=t.customElement,h.renderer=t.renderer,h.rendererParams=t.rendererParams,h.value=null!==(p=t.value)&&void 0!==p?p:null,h.selectionState=null!==(d=t.selectionState)&&void 0!==d&&d,h.actionParams=null!==(f=t.actionParams)&&void 0!==f?f:{},h}return o(t,e),t.prototype.getRenderer=function(){return this.renderer},t.prototype.isGroupName=function(){return this.groupName},t.prototype.isSplitMenu=function(){return this.splitMenu},t.prototype.getId=function(){return this.id},t.prototype.getValue=function(){return this.value},t.prototype.getCustomElement=function(){if(this.customElement)return this.customElement},t.prototype.dispatchCallBack=function(){this.action&&this.action(this.getActionParams())},t.prototype.getLabel=function(){return this.label},t.prototype.getClassName=function(){return this.className},t.prototype.isSeparatorforfocus=function(){return this.separator},t.prototype.isSeparator=function(){return this.separator},t.prototype.isDisabled=function(){return this.disabled},t.prototype.getItems=function(){return this.items},t.prototype.getParentId=function(){return this.parentId},t.prototype.hasItems=function(){return 0!==this.items.length},t.prototype.getRendererParams=function(){return this.rendererParams},t.prototype.setAlreadyRenderer=function(e){this.alreadyRenderer=e},t.prototype.isAlreadyRenderer=function(){return this.alreadyRenderer},t.prototype.isNavigatale=function(){return!(!this.alreadyRenderer&&this.disabled&&this.separator)},t.prototype.setSelectionState=function(e){this.selectionState=e},t.prototype.isSelectionState=function(){return this.selectionState},t.prototype.getAction=function(){return\"function\"==typeof this.action?this.action:null},t.prototype.getActionParams=function(){var e;return null!==(e=this.actionParams)&&void 0!==e?e:{}},t}(i.EventEmitter);t.Item=s},350(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.PopupHandler=void 0;var a=n(825),s=n(681),u=n(840),l=n(748),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.positionPopupByComponent=function(e){var t=this,n=e.popUpElement,r=e.gapX,o=e.gapY,i=e.keepWithinBounds,a=e.sourceElement,s=e.position,u=e.menuId,c=this.getGapPosition(s,n),p=c.x,d=c.y;r&&(r+=p),o&&(o+=d);var f=(0,l.getElementRectWithMargin)(a),h=this.getParentRect(),m=this.getPopupIndex(n);-1!==m&&(this.popupList[m].alignedToElement=a);var y=this.getWrapperElement(n);this.positionPopup({popUpElement:y,gapX:r,gapY:o,keepWithinBounds:i,updatePosition:function(){var i,l=0;if(\"bottomLeft\"===s||\"topLeft\"===s)i=s,l=f.left-h.left;else if(\"bottomRight\"===s||\"topRight\"===s)i=s,l=f.left-(n.offsetWidth-a.offsetWidth);else if(\"bottom\"===s||\"top\"===s)i=s,l=f.left-n.offsetWidth/2+a.offsetWidth/2;else if(\"right\"===s){\"left\"===(c=t.calculateLeftOrRightPopupPosition(n,f,h,s,r))?(i=c,l=f.left-n.offsetWidth-(r||2)):(l=a.offsetWidth+f.left+(r||2)-2,i=s)}else if(\"left\"===s){var c;\"left\"===(c=t.calculateLeftOrRightPopupPosition(n,f,h,s,r))?(i=c,l=f.left-n.offsetWidth-(r||2)):(i=\"right\",l=a.offsetWidth+f.left+(r||2))}else if(\"auto\"===s){var p=t.calculateAutoPostionForX(n,f,h,o,r,a);l=p.x,i=p.XPosition}else{var d=t.calculateDefault(f,h,n,e.position,r);l=d.x,i=d.XPosition}t.setAlignedStyles(n,i),t.setAlignedStyles(n,\"default\");var m,y=0;if(\"bottomLeft\"===s||\"bottom\"===s||\"bottomRight\"===s)y=f.top-h.top+(o||0)+a.offsetHeight,m=s;else if(\"top\"===s||\"topLeft\"===s||\"topRight\"===s)y=a.offsetTop-n.offsetHeight-(o||2),m=\"top\";else if(\"right\"===s||\"left\"===s)y=f.top-n.offsetHeight/2,m=s;else if(\"auto\"===s){var g=t.calculateAutoPostionForY(n,f,h,o,r,a);y=g.y,m=g.YPosition}else{\"above\"===t.calculatePopupPosition(n,f,h,e.position,o)?(y=f.top+(o||0),m=\"top\"):(y=f.top+(o||0),m=\"bottom\")}return t.setAlignedStyles(n,m),t.menuModel.isRoot(u)&&t.addClassForCallOut(s,i,m),{x:l,y}}})},t.prototype.calculateAutoPostionForX=function(e,t,n,r,o,i){var a=t.left-n.left-e.offsetWidth,s=\"bottom\",u=this.calculatePopupPositionForAuto(e,t,n,r),l=this.calculateLeftOrRightForAuto(e,t,n,o);return l&&\"right\"===l?(s=l,{x:a=i.offsetWidth+t.left,XPosition:s}):l&&\"left\"===l?(s=l,{x:a=t.left-e.offsetWidth-(o||2),XPosition:s}):u?{x:a=t.left-n.left,XPosition:s}:{x:a,XPosition:s}},t.prototype.calculateAutoPostionForY=function(e,t,n,r,o,i){var a=t.top+i.offsetHeight+(r||2),s=\"top\",u=this.calculatePopupPositionForAuto(e,t,n,r);return u&&\"above\"===u?(s=\"top\",{y:a=i.offsetTop-e.offsetHeight-(r||2),YPosition:s}):u&&\"under\"===u?(s=\"bottom\",{y:a=t.top+i.offsetHeight+(r||2),YPosition:s}):this.calculateLeftOrRightForAuto(e,t,n,o)?{y:a=t.top-e.offsetHeight/2,YPosition:s}:{y:a,YPosition:s}},t.prototype.calculatePopupPositionForAuto=function(e,t,n,r){var o=n.bottom-t.bottom,i=t.top-n.top,a=e.offsetHeight+r;return o>a?\"under\":!!(i>a||i>o)&&\"above\"},t.prototype.calculateLeftOrRightForAuto=function(e,t,n,r){var o=n.right-t.right,i=t.left-n.left,a=e.offsetWidth+r;return o>a?\"right\":!!(i>a||i>o)&&\"left\"},t.prototype.calculateDefault=function(e,t,n,r,o){var i=0,a=\"bottom\",s=this.calculateLeftOrRightPopupPosition(n,e,t,r,o);return\"left\"===s?(a=s,i=e.left-t.left-n.offsetWidth-2*(o||0),this.setAlignedStyles(n,s)):\"right\"===s&&(a=s,i=e.left+e.width+(o||0)-t.left,this.setAlignedStyles(n,r)),{x:i,XPosition:a}},t.prototype.getWrapperElement=function(e){var t=this.getPopupIndex(e);return this.popupList[t].wrapper},t.prototype.addPopup=function(e){var t=this,n=this.optionsHandler.getDocument(),r=e.childElement,o=e.ariaLabel,i=e.positionCallback,a=e.anchorToElement,s=e.afterGuiAttached,u=this.getPopupParent();if(!n)return{hideFunction:function(){}};var l=this.getPopupIndex(r);if(-1!==l)return{hideFunction:this.popupList[l].hideFunction};var c=this.createPopupWrapper(r,o);this.wrapperElements=c,this.initialisePopupPosition(c);var p=function(){u&&(u.removeChild(c),t.removePopupFromPopupList(r))};return s&&s({hidePopup:p}),this.popupList.push({element:r,wrapper:c,hideFunction:p,instanceId:this.instanceId++,alignedToElement:a}),i&&i(),{hideFunction:p}},t.prototype.getPopupParent=function(){var e=this.optionsHandler.getPopupParent();return e||document.body},t.prototype.getwrapperElement=function(){return this.wrapperElements},t.prototype.getGapPosition=function(e,t){var n=0,r=0;return this.optionsHandler.getCallout()&&(r=10,\"right\"!==e&&\"left\"!==e&&\"auto\"!==e||(n=10)),{x:n,y:r}},t.prototype.createPopupWrapper=function(e,t){var n=this.getPopupParent(),r=document.createElement(\"div\"),o=this.optionsHandler.getClassName();return o&&r.classList.add(o),r.classList.add(\"ZG-popup\"),r.classList.add(\"ZG-context-menu-popup\"),e.classList.add(this.optionsHandler.isRTL()?\"ZG-rtl\":\"ZG-ltr\",\"ZG-popup-child\"),e.hasAttribute(\"role\")||(0,a.setAriaRole)(e,\"dialog\"),(0,a.setAriaLabel)(e,t),r.appendChild(e),n.appendChild(r),r},t.prototype.addClassForCallOut=function(e,t,n){if(\"right\"===e||\"left\"===e){var r=this.menuModel.getID(),o=this.controller.getContextMenuController().getMenuControllers()[r];this.optionsHandler.getCallout()?o.addCallOutClassName(t):o.addCallOutClassName(\"default\")}else{r=this.menuModel.getID(),o=this.controller.getContextMenuController().getMenuControllers()[r];this.optionsHandler.getCallout()?o.addCallOutClassName(n):o.addCallOutClassName(\"default\")}},i([(0,a.AutoWired)(s.CONTEXT_MENU_BEAN_NAME.MENU_MODEL)],t.prototype,\"menuModel\",void 0),i([(0,a.AutoWired)(s.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_CONTROLLER)],t.prototype,\"controller\",void 0),t=i([(0,a.Bean)(a.BEAN_NAME.POPUP_HANDLER)],t)}(u.AbstractPopupHandler);t.PopupHandler=c},406(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__values||function(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&\"number\"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MenuController=void 0;var a=n(22),s=function(e){function t(t){var n=e.call(this)||this;return n.itemControllers={},n.menuList=t,n}return o(t,e),t.prototype.setCompononet=function(e){e.setClassName(\"ZG-contextMenu\"),e.setId(this.getId()),this.component=e},t.prototype.addClassName=function(e){this.component.setClassName(e)},t.prototype.addCallOutClassName=function(e){this.component.setClassName(\"ZG-callOut-\".concat(e))},t.prototype.CreateItemController=function(){var e,t;if(this.menuList){var n=this.menuList.getItems();try{for(var r=i(n),o=r.next();!o.done;o=r.next()){var s=o.value,u=this.optionsHandler.onBefore(\"itemRenderer\",s.getId());if(u){var l=this.createManagedBean(new a.ItemController(s));this.itemControllers[s.getId()]=l,this.component.setControllers(l)}u||s.setAlreadyRenderer(!1)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}}},t.prototype.getElement=function(){return this.component.getElement()},t.prototype.getId=function(){return this.menuList?this.menuList.getId():\"null\"},t.prototype.getParentId=function(){return this.menuList?this.menuList.getParentId():\"null\"},t.prototype.getItems=function(){if(this.menuList)return this.menuList.getItems()},t.prototype.addFocus=function(e){var t=this.itemControllers[e];t&&t.addFocus()},t.prototype.removeFocus=function(e){var t=this.itemControllers[e];t&&t.removeFocus()},t.prototype.destroy=function(){Object.values(this.itemControllers).forEach(function(e){e.destroy()}),e.prototype.destroy.call(this)},t.prototype.getItemController=function(e){return this.itemControllers[e]},t.prototype.getItemControllers=function(){return this.itemControllers},t.prototype.setPosition=function(e){this.component.setPosition({sourceElement:e.sourceElement,gapX:e.gapX,gapY:e.gapY,position:e.position})},t}(n(825).EventEmitter);t.MenuController=s},510(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ItemComponent=void 0;var a=n(825),s=n(748);var u=function(e){function t(t){var n,r=e.call(this)||this;r.setTemplate(((n=document.createElement(\"div\")).innerHTML='<li ref=\"liElement\" class=\"ZG-contextMenuList\"></li>',n.firstChild)),r.itemController=t;var o={setClassName:function(e){return r.addCssClass(e)},setFocus:function(e){return r.addOrRemoveCssClass(\"ZCC-focus\",e)},getElement:function(){return r.getGui()},setRenderer:function(e){return r.setRenderer(e)}};return r.itemController.setComponent(o),r}return o(t,e),t.prototype.getID=function(){return this.itemController.getID()},t.prototype.setRenderer=function(e){if(e){var t=e.newInstance(),n=this.afterRenderer.bind(this);t&&t.then(n)}},t.prototype.afterRenderer=function(e){this.isAlive()&&(this.itemRenderer=e,this.itemRendererElement=e.getGui(),this.itemRendererElement&&((0,s.clearElement)(this.getGui()),this.appendChild(this.itemRendererElement)))},t.prototype.destroy=function(){this.destroyRenderer(),e.prototype.destroy.call(this)},t.prototype.destroyRenderer=function(){this.itemRenderer&&this.itemRenderer.destroy&&this.itemRenderer.destroy()},i([(0,a.queryAssignedNodes)(\"liElement\")],t.prototype,\"liElement\",void 0),t}(a.Component);t.ItemComponent=u},549(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextMenuEventHandler=void 0;var a=n(825),s=n(681),u=n(686),l=n(205),c=n(164),p=function(e){function t(){var t=e.call(this)||this;return t.curserPresenceInContextMenu=!1,t.addDesroyFunctionCallback=[],t.menuState={},t.curserPresence={},t}return o(t,e),t.prototype.setUserConfigEvent=function(){this.userConfigEvent=this.optionsHandler.getShowMenuEvent()},t.prototype.clearMenuState=function(e){this.menuState[e]=!1,this.curserPresenceInContextMenu=!1,this.navigationHandler.menuState[e]=!1},t.prototype.setMenuState=function(e,t){this.menuState[e]=t},t.prototype.handleUserEvent=function(){this.setUserConfigEvent(),this.optionsHandler.getAddListener()&&(\"click\"===this.userConfigEvent||\"contextmenu\"===this.userConfigEvent?this.clickEventHandler(this.userConfigEvent):\"hover\"===this.userConfigEvent&&this.hoverEventHandlerForEnter())},t.prototype.isInside=function(e,t){return this.area(this.buttonCurserX,this.buttonCurserY,this.leftX,this.leftY,this.rightX,this.rightY)===this.area(e,t,this.leftX,this.leftY,this.rightX,this.rightY)+this.area(this.buttonCurserX,this.buttonCurserY,e,t,this.rightX,this.rightY)+this.area(this.buttonCurserX,this.buttonCurserY,this.leftX,this.leftY,e,t)},t.prototype.area=function(e,t,n,r,o,i){return Math.abs((e*(r-i)+n*(i-t)+o*(t-r))/2)},t.prototype.clickEventHandler=function(e){var t=this,n=this.optionsHandler.getForElement();if(this.forElement=n,n){var r=this.menuModel.getContextMenu(),o=this.menuModel.getID();this.addContextMenuListener(document.body,\"click\",function(e){t.isElementWithinSameElement(e.target)||t.menuState[o]&&(t.controller.destroy(),t.menuState[o]=!1,t.menuModel.menuState[o]=!1,t.optionsHandler.onAfter(\"close\",o),t.forElement.setAttribute(\"aria-expanded\",\"false\"),t.forElement.classList.remove(\"ZG-contextMenuActiveBtn\"))},{capture:!0}),this.addContextMenuListener(n,e,function(e){e.preventDefault(),t.createContextMenuController(r,o)})}},t.prototype.isElementWithinSameElement=function(e){for(var t=e,n=this.optionsHandler.getDocument();t&&t!==n.body;){if(t===this.forElement)return!0;t=t.parentElement}return!1},t.prototype.setExpanded=function(e){var t=this.optionsHandler.getForElement();t&&(t.setAttribute(\"aria-expanded\",e),\"true\"===e?t.classList.add(\"ZG-contextMenuActiveBtn\"):t.classList.remove(\"ZG-contextMenuActiveBtn\"))},t.prototype.createContextMenuController=function(e,t){this.close(t)&&this.open(e,t)},t.prototype.open=function(e,t){if(!this.menuState[t]&&(this.forElement=this.optionsHandler.getForElement(),this.optionsHandler.onBefore(\"open\",t))){var n=this.createManagedBean(new u.ContextMenuController);this.controller=n,this.createManagedBean(new l.ContextMenuComponent(n)),this.controller.onCreateContextMenu(e),this.navigationHandler.updateCurrentMenuItem(),n.getGui().focus(),this.menuState[t]=!0,this.menuModel.menuState[t]=!0,this.forElement.setAttribute(\"aria-expanded\",\"true\"),this.forElement.classList.add(\"ZG-contextMenuActiveBtn\"),this.optionsHandler.onAfter(\"open\",t)}},t.prototype.close=function(e){return!this.menuState[e]||(this.forElement=this.optionsHandler.getForElement(),this.optionsHandler.onBefore(\"close\",e)&&(this.controller.destroy(),this.forElement.setAttribute(\"aria-expanded\",\"false\"),this.forElement.classList.remove(\"ZG-contextMenuActiveBtn\"),this.menuState[e]=!1,this.menuModel.menuState[e]=!1,this.optionsHandler.onAfter(\"close\",e)),!1)},t.prototype.hoverEventHandlerForEnter=function(){var e=this,t=this.optionsHandler.getForElement(),n=this.menuModel.getContextMenu(),r=this.menuModel.getID(),o=this,i=this.optionsHandler.getPosition();this.addContextMenuListener(t,\"mouseover\",function(a){var s=e.optionsHandler.onBefore(\"open\",r);if(!o.navigationHandler.menuState[r]&&s){e.optionsHandler.onAfter(\"open\",r);var p=o.createManagedBean(new u.ContextMenuController);o.controller=p,o.createManagedBean(new l.ContextMenuComponent(p)),o.controller.onCreateContextMenu(n),o.navigationHandler.menuState[r]=!0,e.navigationHandler.updateCurrentMenuItem(),o.menuState[r]=!0,p.getGui().focus(),o.updateMenuState(p,o),e.contextMenuDom=o.controller.getGui();var d=e.contextMenuDom.getBoundingClientRect();switch(t.setAttribute(\"aria-expanded\",\"true\"),e.forElement.classList.add(\"ZG-contextMenuActiveBtn\"),e.contextMenuDom&&(e.contextMenuDom.addEventListener(\"mouseenter\",function(){e.curserPresenceInContextMenu=!0}),e.contextMenuDom.addEventListener(\"keydown\",function(t){t.key!==c.NAVIGATION_KEY.ARROW_DOWN&&t.key!==c.NAVIGATION_KEY.ARROW_UP||(e.curserPresenceInContextMenu=!0)})),i){case\"bottom\":case\"bottomLeft\":case\"bottomRight\":o.buttonCurserX=a.clientX,o.buttonCurserY=a.clientY,o.leftX=d.x,o.leftY=d.y,o.rightX=d.x+d.width,o.rightY=d.y;break;case\"top\":case\"topLeft\":case\"topRight\":o.buttonCurserX=a.clientX,o.buttonCurserY=a.clientY,o.leftX=d.x,o.leftY=d.y+d.height,o.rightX=d.x+d.width,o.rightY=d.y+ +d.height;break;case\"right\":o.buttonCurserX=a.clientX,o.buttonCurserY=a.clientY,o.leftX=d.x,o.leftY=d.y,o.rightX=d.x,o.rightY=d.y+ +d.height;break;case\"left\":o.buttonCurserX=a.clientX,o.buttonCurserY=a.clientY,o.leftX=d.x+d.width,o.leftY=d.y,o.rightX=d.x+d.width,o.rightY=d.y+ +d.height}}}),this.addContextMenuListener(t,\"mouseleave\",function(n){var i=e.optionsHandler.onBefore(\"close\",r),a=0,s=n.clientX,u=n.clientY;e.isInside(s,u)&&(a=1e3),setTimeout(function(){!e.curserPresenceInContextMenu&&i&&e.menuState[r]&&(o.controller.destroy(),o.menuState[r]=!1,e.optionsHandler.onAfter(\"close\",r),o.navigationHandler.menuState[r]=!1,t.setAttribute(\"aria-expanded\",\"false\"),e.forElement.classList.remove(\"ZG-contextMenuActiveBtn\"))},a)}),this.addContextMenuListener(t,\"mousedown\",function(){var n=e.optionsHandler.onBefore(\"close\",r);e.menuState[r]&&n&&(e.controller.destroy(),t.setAttribute(\"aria-expanded\",\"false\"),e.forElement.classList.remove(\"ZG-contextMenuActiveBtn\"),e.optionsHandler.onAfter(\"close\",r),e.menuState[r]=!1,e.menuModel.menuState[r]=!1,e.navigationHandler.menuState[r]=!1)})},t.prototype.updateMenuState=function(e,t){var n=e.getGui(),r=t.menuModel.getID();n.addEventListener(\"mouseenter\",function(e){t.curserPresence[r]=!0})},t.prototype.setCurserPresence=function(e){this.curserPresenceInContextMenu=e},t.prototype.addContextMenuListener=function(e,t,n,r){e.addEventListener(t,n,r),this.addDesroyFunctionCallback.push(function(){e.removeEventListener(t,n,r)})},t.prototype.destroyComponent=function(){this.addDesroyFunctionCallback.forEach(function(e){return e()})},i([(0,a.AutoWired)(s.CONTEXT_MENU_BEAN_NAME.MENU_MODEL)],t.prototype,\"menuModel\",void 0),i([(0,a.AutoWired)(s.CONTEXT_MENU_BEAN_NAME.NAVIGATION_HANDLER)],t.prototype,\"navigationHandler\",void 0),t=i([(0,a.Bean)(s.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_EVENT_HANDLER)],t)}(a.EventEmitter);t.ContextMenuEventHandler=p},563(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.NavigationHandler=void 0;var u=n(681),l=n(825),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.delay={},t.curserPresence={},t.menuState={},t.stopInteraction={},t.initialFocus=!0,t}return o(t,e),t.prototype.postConstructMethods=function(){},t.prototype.clearMenuState=function(){this.menuState={},this.delay={},this.curserPresence={},this.stopInteraction={}},t.prototype.setCheckedStatus=function(e){this.checkedStatus=e},t.prototype.getCurrentMenuDetails=function(){return{currentMenu:this.currentMenu,currentMenuItem:this.curentMenuItem}},t.prototype.getInitialFocus=function(){return this.initialFocus},t.prototype.setInitialFocus=function(e){this.initialFocus=e},t.prototype.getMenuState=function(e){return this.menuState[e]},t.prototype.getDelay=function(e){return this.delay[e]},t.prototype.setDelay=function(e,t){this.delay[e]=t},t.prototype.getCurserPresence=function(e){return this.curserPresence[e]},t.prototype.setCurserPresence=function(e,t){this.curserPresence[e]=t},t.prototype.getCurrentMenu=function(){var e,t;return{currentMenu:null!==(e=this.currentMenuEvent)&&void 0!==e?e:this.currentMenu,currentMenuItem:null!==(t=this.currentMenuItemEvent)&&void 0!==t?t:this.curentMenuItem}},t.prototype.updateCurrentMenu=function(e,t){this.currentMenu=e,this.curentMenuItem=t},t.prototype.updateCurrentMenuItem=function(){var e=this.menuTree.getContextMenu();e&&(this.currentMenu=e.getId(),this.curentMenuItem=this.findcurrentMenuItem(e.getItems()[0].getId()))},t.prototype.findcurrentMenuItem=function(e){var t=this.menuTree.searchNode(e);if(!t)return null;var n=t.index,r=t.currentMenu;n>=r.length&&(n=0);for(var o=r[n].isSeparatorforfocus(),i=r[n].isDisabled(),a=r[n].isGroupName(),s=r[n].isAlreadyRenderer();o||i||a||!s;){if((n+=1)>r.length)return!1;o=r[n].isSeparatorforfocus(),i=r[n].isDisabled(),a=r[n].isGroupName(),s=r[n].isAlreadyRenderer()}return r[n].getId()},t.prototype.onMouseEnter=function(e){var t=this.menuTree.searchNode(e);if(!t)return null;var n=t.index,r=t.currentMenu;n>=r.length&&(n=0);var o=r[n].isSeparatorforfocus(),i=r[n].isDisabled(),a=r[n].isGroupName(),s=r[n].isAlreadyRenderer();return o||i||a||!s?null:(this.curentMenuItem=e,this.curentMenuItem)},t.prototype.escape=function(){var e=this.menuTree.getID();this.optionHandler.onBefore(\"close\",e)&&(this.controller.getContextMenuController().destroy(),this.updateCurrentMenuItem(),this.contextMenuEventHandler.setMenuState(e,!1),this.menuTree.clearMenuState(),this.clearMenuState(),this.optionHandler.onAfter(\"close\",\"escape\"))},t.prototype.enter=function(){if(!this.curentMenuItem)return null;var e=this.menuTree.searchNode(this.curentMenuItem);if(!e)return null;var t=e.index,n=e.currentMenu,r=n[t].isSeparatorforfocus(),o=n[t].isDisabled(),i=n[t].isGroupName(),a=n[t].isAlreadyRenderer();if(r||o||i||!a)return null;var s=this.menuTree.hasChild(this.curentMenuItem);if(!this.optionsHandler.onBefore(\"select\",this.curentMenuItem))return null;if(s){if(!this.optionsHandler.onBefore(\"open\",this.curentMenuItem))return null;var u=this.menuTree.getChild(this.curentMenuItem),l=u[0].getItems()[0];return this.curentMenuItem=this.findcurrentMenuItem(l.getId()),this.currentMenu=u[0].getId(),this.menuState[this.currentMenu]=!0,this.optionsHandler.onAfter(\"select\",this.curentMenuItem),u[0]}var c=this.menuTree.searchNode(this.curentMenuItem);if(c){var p=c.currentMenu[c.index];this.optionsHandler.onAfter(\"select\",this.curentMenuItem),p.dispatchCallBack()}var d=this.menuTree.getID();return this.optionHandler.onBefore(\"close\",d)&&(this.controller.getContextMenuController().destroy(),this.updateCurrentMenuItem(),this.contextMenuEventHandler.setMenuState(d,!1),this.menuTree.clearMenuState(),this.contextMenuEventHandler.setExpanded(\"false\"),this.clearMenuState(),this.optionHandler.onAfter(\"close\",\"enter\")),null},t.prototype.onClick=function(e){var t=this.menuTree.searchNode(e);if(!t)return null;var n=t.index,r=t.currentMenu,o=r[n].isSeparatorforfocus(),i=r[n].isDisabled(),a=r[n].isGroupName(),s=r[n].isAlreadyRenderer(),u=r[n].isSplitMenu(),l=this.menuTree.hasChild(e);if(o||i||a||!s)return\"stop\";if(l&&!u)return\"stop\";var c=this.optionsHandler.onBefore(\"select\",e);if(!l&&c){var p=this.menuTree.searchNode(e);if(p)p.currentMenu[p.index].dispatchCallBack(),this.optionsHandler.onAfter(\"select\",e);var d=this.menuTree.getID();this.optionHandler.onBefore(\"close\",d)&&(this.controller.getContextMenuController().destroy(),this.updateCurrentMenuItem(),this.contextMenuEventHandler.setMenuState(d,!1),this.contextMenuEventHandler.setExpanded(\"false\"),this.menuTree.clearMenuState(),this.clearMenuState(),this.optionHandler.onAfter(\"close\",d))}},t.prototype.destroyWholeMenu=function(e){this.menuTree.getID()!==e||this.controller.getContextMenuController().destroyMenu(e)},t.prototype.getLastItemId=function(){var e=this.menuTree.getContextMenu();if(e){var t=e.getItems(),n=t[t.length-1].getId(),r=this.menuTree.getID();return this.currentMenu=r,this.curentMenuItem=n,{lastItemId:n,currentMenu:r}}},t.prototype.right=function(){var e=this.optionsHandler.onBefore(\"open\",this.curentMenuItem);if(!this.curentMenuItem||!e)return null;if(this.menuTree.hasChild(this.curentMenuItem)){var t=this.menuTree.getChild(this.curentMenuItem),n=t[0],r=t[0].getId(),o=this.findcurrentMenuItem(t[0].getItems()[0].getId());return this.curentMenuItem=o,this.currentMenu=r,this.menuState[this.currentMenu]=!0,{newContextMenu:n,subMenu:r,subMenuItem:o}}return null},t.prototype.left=function(){var e=this.optionsHandler.onBefore(\"close\",this.currentMenu);if(!this.curentMenuItem||!e)return null;var t=this.menuTree.getParentId(this.curentMenuItem);if(!t)return null;var n=this.menuTree.getParentId(t);return t===n?null:n?(this.currentMenu=n,this.curentMenuItem=t,this.menuState[t]=!1,{parentID:t,grandParentID:n}):null},t.prototype.up=function(){if(!this.curentMenuItem)return null;this.menuTree.hasChild(this.curentMenuItem)&&this.menuState[this.curentMenuItem]&&this.controller.getContextMenuController().destroyMenu(this.curentMenuItem);var e=this.NavigateToUp(this.curentMenuItem);return e?(this.curentMenuItem=e.NextSibling,e):null},t.prototype.down=function(){if(!this.curentMenuItem)return null;this.menuTree.hasChild(this.curentMenuItem)&&this.menuState[this.curentMenuItem]&&this.controller.getContextMenuController().destroyMenu(this.curentMenuItem);var e=this.NavigateToDown(this.curentMenuItem);return e?(this.curentMenuItem=e.NextSibling,e):null},t.prototype.NavigateToDown=function(e){var t=this.menuTree.searchNode(e);if(!t)return null;var n=t.index+1,r=t.currentMenu;n>=r.length&&(n=this.optionHandler.getCircularNavigation()?0:r.length-1);for(var o=r[n].isSeparatorforfocus(),i=r[n].isDisabled(),a=r[n].isGroupName(),s=r[n].isAlreadyRenderer();o||i||a||!s;)(n+=1)>=r.length&&(n=0),o=r[n].isSeparatorforfocus(),i=r[n].isDisabled(),a=r[n].isGroupName(),s=r[n].isAlreadyRenderer();return{NextSibling:r[n].getId(),NextSiblingParentID:r[n].getParentId()}},t.prototype.NavigateToUp=function(e){var t=this.menuTree.searchNode(e);if(!t)return null;var n=t.index-1,r=t.currentMenu;-1===n&&(n=this.optionHandler.getCircularNavigation()?r.length-1:0);for(var o=r[n].isSeparatorforfocus(),i=r[n].isDisabled(),a=r[n].isGroupName(),s=r[n].isAlreadyRenderer();o||i||a||!s;)-1===(n-=1)&&(n=r.length-1),o=r[n].isSeparatorforfocus(),i=r[n].isDisabled(),a=r[n].isGroupName(),s=r[n].isAlreadyRenderer();return{NextSibling:r[n].getId(),NextSiblingParentID:r[n].getParentId()}},t.prototype.closeSubMenu=function(e){this.controller.getContextMenuController().removeFocus(this.currentMenu,this.curentMenuItem),this.initialFocus=!1;var t=this.menuTree.searchNode(e.menuItemId),n=t.currentMenu,r=n[t.index].isSeparatorforfocus(),o=n[t.index].isDisabled(),i=n[t.index].isGroupName();if(!r&&!o&&!i){var a=this.menuTree.hasChild(this.currentMenu),s=this.menuTree.getParentId(e.menuItemId);if(this.curentMenuItem!=e.menuId&&this.currentMenu!=s&&this.menuState[this.currentMenu]&&(this.destroySubMenu(this.currentMenu,e.menuId),this.optionHandler.onAfter(\"close\",e.menuItemId)),a){var u=this.menuTree.getParentId(e.menuItemId);this.controller.getContextMenuController().removeFocus(u,this.currentMenu),this.controller.getContextMenuController().removeFocus(this.currentMenu,this.curentMenuItem),this.curentMenuItem=e.menuItemId,this.currentMenu=u}}},t.prototype.onMouseleave=function(e,t){var n=this.menuTree.getParentId(t);return this.curentMenuItem!=e&&this.currentMenu!=n},t.prototype.openSubMenu=function(e,t){var n=this.menuTree.getParentId(e.menuItemId);this.menuTree.hasChild(e.menuItemId);if(this.curentMenuItem!=e.menuId&&this.currentMenu!=n){if(!t){if(this.currentMenu!==e.menuId)return this.stopInteraction[this.currentMenu]=!1,null;this.stopInteraction[this.currentMenu]=!0}if(this.stopInteraction[this.currentMenu])return null;t&&(this.destroySubMenu(this.currentMenu,e.menuId),this.checkedStatus||(this.optionsHandler.onAfter(\"close\",e.menuItemId),this.checkedStatus=!0),this.controller.getContextMenuController().removeFocus(e.menuId,this.curentMenuItem),this.currentMenu=e.menuId,this.curentMenuItem=e.menuItemId)}if(this.menuState[e.menuItemId])return this.subMenuDom;if(this.stopInteraction[this.currentMenu])return null;var r=this.menuTree.searchNode(e.menuItemId),o=r.currentMenu,i=o[r.index].isSeparatorforfocus(),a=o[r.index].isDisabled(),s=o[r.index].isGroupName();if(!i&&!a&&!s){this.controller.getContextMenuController().removeFocus(this.currentMenu,this.curentMenuItem),this.controller.getContextMenuController().addFocus(e.menuId,e.menuItemId),this.initialFocus=!1;var u=this.menuTree.hasChild(e.menuItemId);if(!this.menuState[e.menuItemId]){if(u){var l=this.menuTree.getChild(e.menuItemId);this.menuState[e.menuItemId]=!0,this.controller.getContextMenuController().onCreateContextMenu(l[0]),this.curentMenuItem=this.findcurrentMenuItem(l[0].getItems()[0].getId()),this.currentMenu=l[0].getId();var c=this.menuTree.getParentId(this.currentMenu);this.controller.getContextMenuController().addFocus(c,this.currentMenu);var p=this.controller.getContextMenuController().getMenuControllers()[this.currentMenu];return this.subMenuDom=p.getElement(),this.initialFocus=!0,this.checkedStatus||(this.optionsHandler.onAfter(\"open\",e.menuItemId),this.checkedStatus=!0),this.subMenuDom}this.currentMenu=e.menuId,this.curentMenuItem=e.menuItemId}}return null},t.prototype.destroySubMenu=function(e,t){var n=e;this.menuTree.getID()!==n&&n!==t&&(this.controller.getContextMenuController().destroyMenu(e),this.menuState[e]=!1,n=this.menuTree.getParentId(e),this.currentMenu=n,this.curentMenuItem=e,this.destroySubMenu(n,t))},i([(0,l.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.MENU_MODEL)],t.prototype,\"menuTree\",void 0),i([(0,l.AutoWired)(l.BEAN_NAME.OPTION_HANDLER)],t.prototype,\"optionHandler\",void 0),i([(0,l.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_CONTROLLER)],t.prototype,\"controller\",void 0),i([(0,l.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_EVENT_HANDLER)],t.prototype,\"contextMenuEventHandler\",void 0),i([(0,l.PostConstruct)()],t.prototype,\"postConstructMethods\",null),t=i([(0,l.Bean)(u.CONTEXT_MENU_BEAN_NAME.NAVIGATION_HANDLER)],t)}(l.EventEmitter);t.NavigationHandler=c},622(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MenuComponent=void 0;var a=n(510),s=n(825);var u=function(e){function t(t){var n,r=e.call(this)||this;r.itemComponents={},r.setTemplate(((n=document.createElement(\"ul\")).setAttribute(\"ref\",\"ul\"),n));var o={setClassName:function(e){return r.addCssClass(e)},setId:function(e){return r.setId(e)},setStyle:function(e,t){return r.setStyle(e,t)},setControllers:function(e){return r.setController(e)},getElement:function(){return r.getGui()},setPosition:function(e){return r.setPosition(e)}};return r.menuController=t,t.setCompononet(o),r}return o(t,e),t.prototype.getID=function(){return this.menuController.getId()},t.prototype.setId=function(e){this.getGui().setAttribute(\"id\",e)},t.prototype.setTabIndex=function(e){this.getDom().setAttribute(\"tabindex\",e)},t.prototype.setStyle=function(e,t){this.getDom().style[e]=t},t.prototype.getDom=function(){return this.getGui()},t.prototype.setController=function(e){var t=this.createManagedBean(new a.ItemComponent(e));this.itemComponents[e.getID()]=t,this.appendChild(t)},t.prototype.destroy=function(){Object.values(this.itemComponents).forEach(function(e){e.getGui().remove(),e.destroy()}),e.prototype.destroy.call(this)},t.prototype.setPosition=function(e){var t={popUpElement:this.getGui(),gapX:e.gapX,gapY:e.gapY,keepWithinBounds:!0,sourceElement:e.sourceElement,position:e.position},n=this.popupHandler.positionPopupByComponent.bind(this.popupHandler,t),r=this.popupHandler.addPopup({childElement:this.getGui(),positionCallback:n,ariaLabel:\"\",anchorToElement:e.sourceElement});r&&this.addDestroyFunc(function(){r.hideFunction()})},i([(0,s.queryAssignedNodes)(\"ul\")],t.prototype,\"ul\",void 0),i([(0,s.AutoWired)(s.BEAN_NAME.POPUP_HANDLER)],t.prototype,\"popupHandler\",void 0),t}(s.Component);t.MenuComponent=u},681(e,t){var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CONTEXT_MENU_BEAN_NAME=void 0;t.CONTEXT_MENU_BEAN_NAME=n({},{MENU_MODEL:\"menuModel\",NAVIGATION_HANDLER:\"navigationHandler\",UI_Part_Navigator:\"navigationHandler\",CONTEXT_MENU_CONTROLLER:\"contextMenuController\",MENU_MODEL_API:\"menuModelAPI\",CONTROLLER:\"controller\",CONTEXT_MENU_EVENT_HANDLER:\"contextMenuEventHandler\",CONFIGURATION:\"configuration\"})},686(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextMenuController=void 0;var u=n(681),l=n(406),c=n(698),p=n(825),d=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.menuControllers={},t.menuState={},t}return o(t,e),t.prototype.postConstructMethods=function(){var e=this;this.contextMenuNavigationHandler=this.createManagedBean(new c.ContextMenuNavigationHandler),this.addDestroyFunc(function(){var t;null===(t=e.contextMenuNavigationHandler)||void 0===t||t.destroy(),e.contextMenuNavigationHandler=null}),this.mainController.setContextMenuController(this)},t.prototype.setComponent=function(e){var t;this.component=e,this.component.setId(\"parentDiv\"),this.component.setTabIndex(\"0\"),null===(t=this.contextMenuNavigationHandler)||void 0===t||t.setComponent(e)},t.prototype.onCreateContextMenu=function(e,t,n){if(e){var r=this.createManagedBean(new l.MenuController(e)),o=r.getId();if(this.menuControllers[o]=r,this.component.setController(r),r.CreateItemController(),this.setMenuState(o,!0),this.setPosition(r),(null==t?void 0:t.x)||(null==t?void 0:t.y)||0===(null==t?void 0:t.x)||0===(null==t?void 0:t.y)){var i=this.popUpHandler.getwrapperElement(),a=this.optionsHandler.getGapX(),s=this.optionsHandler.getGapY(),u=this.calculateLeftOrRight(t.x,i,n)+a,c=this.calculateTopOrDown(t.y,i,n)+s;i.style.left=\"\".concat(u,\"px\"),i.style.top=\"\".concat(c,\"px\")}this.addEvents(r),this.getGui().focus()}},t.prototype.setMenuState=function(e,t){this.menuState[e]=t},t.prototype.getMenuState=function(e){return this.menuState[e]},t.prototype.setCoordinatePosition=function(e,t){var n=e.getElement(),r=this.optionsHandler.getGapX(),o=this.optionsHandler.getGapY(),i=\"\".concat(t.x+r,\"px\"),a=\"\".concat(t.y+o,\"px\");console.log(i+a),n.style.left=i,n.style.top=a},t.prototype.calculateLeftOrRight=function(e,t,n){if(!n)return e;var r=n.getBoundingClientRect(),o=e;return e+t.offsetWidth>r.width&&(o=e-t.offsetWidth),o},t.prototype.calculateTopOrDown=function(e,t,n){if(!n)return e;var r=n.getBoundingClientRect(),o=e;return e+t.offsetHeight>r.height&&(o=e-t.offsetHeight),o},t.prototype.getMenuControllers=function(){return this.menuControllers},t.prototype.getMenuController=function(e){return this.menuControllers[e]},t.prototype.setPosition=function(e){var t,n=e.getId(),r=e.getParentId(),o=this.optionsHandler.getForElement(),i=this.optionsHandler.getGapX(),a=this.optionsHandler.getGapY();if(this.isRoot(n))t=this.optionsHandler.getPosition(),this.component.appendChildtoParent(e.getElement()),this.component.setPosition({sourceElement:o,gapX:i,gapY:a,position:t,menuId:n});else{if(n==r)return;o=this.menuControllers[r].getItemController(n).getElement(),t=\"default\",e.setPosition({sourceElement:o,position:t,gapX:i,gapY:2,menuId:n})}},t.prototype.isRoot=function(e){return this.menuModel.isRoot(e)},t.prototype.addFocus=function(e,t){var n=this.menuControllers[e];n&&n.addFocus(t)},t.prototype.removeFocus=function(e,t){var n=this.menuControllers[e];n&&n.removeFocus(t)},t.prototype.destroyMenu=function(e){var t=this.menuControllers[e];this.setMenuState(e,!1),t&&(t.destroy(),this.component.destroyMenu(e))},t.prototype.destroy=function(){this.component.destroy();for(var t=Object.values(this.menuControllers),n=Object.keys(this.menuControllers),r=Object.keys(this.menuState),o=0;o<t.length;o++){t[o].destroy();var i=r[o];this.setMenuState(i,!1),this.component.destroyMenu(n[o])}e.prototype.destroy.call(this)},t.prototype.getGui=function(){return this.component.getElement()},t.prototype.addEvents=function(e){for(var t,n=e.getItemControllers(),r=Object.values(n),o=0;o<r.length;o++){var i=r[o];null===(t=this.contextMenuNavigationHandler)||void 0===t||t.setMouseEvents(i)}},i([(0,p.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.MENU_MODEL)],t.prototype,\"menuModel\",void 0),i([(0,p.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_CONTROLLER)],t.prototype,\"mainController\",void 0),i([(0,p.AutoWired)(p.BEAN_NAME.POPUP_HANDLER)],t.prototype,\"popUpHandler\",void 0),i([(0,p.PostConstruct)()],t.prototype,\"postConstructMethods\",null),t=i([(0,p.Bean)(u.CONTEXT_MENU_BEAN_NAME.CONTROLLER)],t)}(p.EventEmitter);t.ContextMenuController=d},698(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextMenuNavigationHandler=void 0;var u=n(681),l=n(164),c=n(825),p=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.curserPresenceOnMenuItem={},t.newCurserPresence={},t.subMenuPresence={},t.curserPath={},t.stopInteraction={},t.openTimerId={},t.longHoverId={},t.closeTimeId={},t.longHover=!0,t}return o(t,e),t.prototype.setComponent=function(e){this.component=e,this.addListener(e.getElement(),\"keydown\",this.onKeyDown.bind(this)),this.addListener(e.getElement(),\"mouseleave\",this.onMouseLeave.bind(this))},t.prototype.getComponent=function(){return this.component},t.prototype.setMouseEvents=function(e){var t=this;this.itemController=e;var n,r=this.itemController.getElement(),o=this.itemController.getID(),i=this.menuModel.getParentId(o),a={menuId:i,menuItemId:o},s=this,u=s.menuModel.isFirstChild(i,o),l=function(e){if(!s.stopInteraction[i]){if(e.stopPropagation(),!t.menuModel.hasChild(s.lastItemId))return(n=s.navigationHandler.openSubMenu(a,!0))&&s.addEventSubMenu(n,o,s),void(s.longHover=!1);if(s.curserPath[s.lastItemId]){s.longHover=!0,s.curserPresenceOnMenuItem[o]=!0;var r=setTimeout(function(){if(s.subMenuPresence[s.lastItemId])s.curserPath[s.lastItemId]=!1;else if(!s.subMenuPresence[s.lastItemId]){if(s.lastItemId!=o&&(s.curserPath[s.lastItemId]=!1),s.newCurserPresence[o]){var e=!0;s.checkedStatus||(e=s.optionsHandler.onBefore(\"close\",o),s.checkedStatus=!0),n=s.navigationHandler.openSubMenu(a,e),s.clearTimeOut(s.closeTimeId),s.closeTimeId={}}s.lastItemId=o,n&&t.addEventSubMenu(n,o,s)}},200);s.openTimerId&&(s.openTimerId[o]=r)}else{var u=!0;s.checkedStatus||(u=t.optionsHandler.onBefore(\"close\",o),s.checkedStatus=!0),n=s.navigationHandler.openSubMenu(a,u),s.curserPath[s.lastItemId]=!1,n&&(t.addEventSubMenu(n,o,s),s.longHover=!1)}}};this.addListener(r,\"mousedown\",this.onClick.bind(this,o)),r.addEventListener(\"mouseenter\",function(e){if(t.menuModel.hasChild(o)){if(t.optionsHandler.onBefore(\"open\",o)||(s.controller.getContextMenuController().addFocus(i,o),r.removeEventListener(\"mousemove\",l),s.optionsHandler.onAfter(\"open\",o),r.removeEventListener(\"mouseleave\",c),r.addEventListener(\"mouseleave\",function(){s.controller.getContextMenuController().removeFocus(i,o)})),s.stopInteraction[i])return;var p=setTimeout(function(){if(!u&&s.longHover&&!s.subMenuPresence[o]){var e;e=t.optionsHandler.onBefore(\"close\",o),t.checkedStatus=!0,n=s.navigationHandler.openSubMenu(a,e),s.clearTimeOut(s.openTimerId),s.clearTimeOut(s.closeTimeId),s.openTimerId={},s.closeTimeId={},s.lastItemId=o,n&&t.addEventSubMenu(n,o,s)}},300);t.longHoverId[o]=p}}),r.addEventListener(\"mousemove\",l),r.addEventListener(\"mousemove\",function(e){if(n){var t=n.getBoundingClientRect(),r=t.x,o=t.y,i=t.height,a=t.right,u=s.navigationHandler.getCurrentMenuDetails().currentMenu,l=s.menuModel.getParentId(u),c=s.controller.getContextMenuController().getMenuController(l).getElement().getBoundingClientRect();s.freezeCurserX=e.clientX,s.freezeCurserY=e.clientY,r<c.left?(s.topX=a,s.bottomX=a):(s.topX=r,s.bottomX=r),s.topY=o,s.bottomY=o+i}});var c=function(e){var n=t.navigationHandler.onMouseEnter(o);if(!s.stopInteraction[i]&&n){var r=!0;if(t.menuModel.hasChild(o)&&(r=t.optionsHandler.onBefore(\"close\",o),t.navigationHandler.setCheckedStatus(!1)),r){if(r){s.newCurserPresence[o]=!1;var u=e.clientX,l=e.clientY,c=s.isInside(u,l);if(s.curserPath[o]=c,!s.curserPresenceOnMenuItem[o])if(s.curserPath[o]){s.lastItemId=o;var p=setTimeout(function(){s.subMenuPresence[o]||t.mouseLeave||(s.navigationHandler.closeSubMenu(a),t.onMouseLeave.bind(t))},200);s.closeTimeId[o]=p}else s.navigationHandler.closeSubMenu(a),t.clearTimeOut(s.openTimerId),s.openTimerId={},s.lastItemId=o;s.curserPresenceOnMenuItem[o]=!1}}else{var d=t.menuModel.getID();if(s.stopInteraction[d]=!0,d===i)return;for(var f=i;f;){if(d===f)return;d!=f&&(s.stopInteraction[i]=!0,f=t.menuModel.getParentId(i))}}}};r.addEventListener(\"mouseleave\",c)},t.prototype.addEventSubMenu=function(e,t,n){var r=this;e.addEventListener(\"mouseenter\",function(e){n.longHover=!1,r.clearTimeOut(n.longHoverId),r.clearTimeOut(n.openTimerId),r.clearTimeOut(n.closeTimeId),n.longHoverId={},n.openTimerId={},n.closeTimeId={},n.subMenuPresence[t]=!0,n.curserPath[t]=!1,n.lastItemId=r.navigationHandler.getCurrentMenuDetails().currentMenuItem}),e.addEventListener(\"mouseleave\",function(e){if(n.subMenuPresence[t]=!1,n.curserPresent=!1,n.lastItemId=r.navigationHandler.getCurrentMenuDetails().currentMenuItem,n.curserPath[t]=!1,r.controller.getContextMenuController().getMenuState(t)){var o=r.navigationHandler.getCurrentMenuDetails();n.mouseLeave=!0,n.controller.getContextMenuController().addFocus(o.currentMenu,o.currentMenuItem)}})},t.prototype.clearTimeOut=function(e){if(e){for(var t=Object.values(e),n=0;n<t.length;n++){var r=t[n];window.clearTimeout(r)}e={}}},t.prototype.isInside=function(e,t){return this.area(this.freezeCurserX,this.freezeCurserY,this.topX,this.topY,this.bottomX,this.bottomY)===this.area(e,t,this.topX,this.topY,this.bottomX,this.bottomY)+this.area(this.freezeCurserX,this.freezeCurserY,e,t,this.bottomX,this.bottomY)+this.area(this.freezeCurserX,this.freezeCurserY,this.topX,this.topY,e,t)},t.prototype.area=function(e,t,n,r,o,i){return Math.abs((e*(r-i)+n*(i-t)+o*(t-r))/2)},t.prototype.onKeyDown=function(e){switch(e.stopPropagation(),e.preventDefault(),e.key){case l.NAVIGATION_KEY.ARROW_DOWN:this.onArrowDown();break;case l.NAVIGATION_KEY.ARROW_UP:this.onArrowUp();break;case l.NAVIGATION_KEY.ARROW_LEFT:this.onArrowLeft();break;case l.NAVIGATION_KEY.ARROW_RIGHT:this.onArrowRight();break;case l.NAVIGATION_KEY.ENTER:case l.NAVIGATION_KEY.SPACE:case l.NAVIGATION_KEY.SPACE:this.onEnter();break;case l.NAVIGATION_KEY.ESCAPE:this.onEscape()}},t.prototype.onMouseLeave=function(){var e=this.menuModel.getID();if(this.controller.getContextMenuController().getMenuState(e)){var t=this.navigationHandler.getCurrentMenuDetails();this.mouseLeave=!0,this.controller.getContextMenuController().addFocus(t.currentMenu,t.currentMenuItem)}},t.prototype.onClick=function(e,t){\"stop\"===this.navigationHandler.onClick(e)&&(t.stopPropagation(),t.stopImmediatePropagation()),t.stopPropagation()},t.prototype.onEscape=function(){return this.navigationHandler.escape()},t.prototype.onEnter=function(){var e=this.navigationHandler.enter();if(e)this.controller.getContextMenuController().onCreateContextMenu(e),this.navigationHandler.setInitialFocus(!0);else{var t=this.menuModel.getID();this.contextMenuEventHandler.clearMenuState(t),this.contextMenuEventHandler.setMenuState(t,!1),this.navigationHandler.setInitialFocus(!0)}},t.prototype.onArrowDown=function(){var e=this.navigationHandler.getCurrentMenuDetails();if(this.navigationHandler.getInitialFocus())return this.controller.getContextMenuController().addFocus(e.currentMenu,e.currentMenuItem),this.contextMenuEventHandler.setCurserPresence(!0),this.contextMenuEventHandler.setMenuState(e.currentMenu,!0),void this.navigationHandler.setInitialFocus(!1);var t=this.navigationHandler.down();t&&(this.controller.getContextMenuController().removeFocus(e.currentMenu,e.currentMenuItem),this.controller.getContextMenuController().addFocus(t.NextSiblingParentID,t.NextSibling))},t.prototype.onArrowUp=function(){var e=this.navigationHandler.getCurrentMenuDetails(),t=e.currentMenu,n=e.currentMenuItem,r=this.navigationHandler.up();r&&(this.navigationHandler.setInitialFocus(!1),this.controller.getContextMenuController().removeFocus(t,n),this.controller.getContextMenuController().addFocus(r.NextSiblingParentID,r.NextSibling))},t.prototype.onArrowLeft=function(){var e=this.navigationHandler.left();e&&(this.controller.getContextMenuController().destroyMenu(e.parentID),this.controller.getContextMenuController().addFocus(e.grandParentID,e.parentID),this.optionsHandler.onAfter(\"close\",e.parentID))},t.prototype.onArrowRight=function(){var e=this.navigationHandler.right();e&&(this.controller.getContextMenuController().onCreateContextMenu(e.newContextMenu),this.controller.getContextMenuController().addFocus(e.subMenu,e.subMenuItem),this.optionsHandler.onAfter(\"open\",e.subMenu))},t.prototype.destroy=function(){e.prototype.destroy.call(this)},i([(0,c.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.NAVIGATION_HANDLER)],t.prototype,\"navigationHandler\",void 0),i([(0,c.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_CONTROLLER)],t.prototype,\"controller\",void 0),i([(0,c.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.MENU_MODEL)],t.prototype,\"menuModel\",void 0),i([(0,c.AutoWired)(u.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_EVENT_HANDLER)],t.prototype,\"contextMenuEventHandler\",void 0),t}(c.EventEmitter);t.ContextMenuNavigationHandler=p},748(e,t,n){Object.defineProperty(t,\"__esModule\",{value:!0}),t.getElementSize=s,t.getElementRectWithOffset=function(e){var t=e.getBoundingClientRect(),n=s(e),r=n.borderTopWidth,o=n.borderLeftWidth,i=n.borderRightWidth,a=n.borderBottomWidth;return{top:t.top+(null!=r?r:0),left:t.left+(null!=o?o:0),right:t.right+(null!=i?i:0),bottom:t.bottom+(null!=a?a:0)}},t.getElementRectWithMargin=function(e){var t=e.getBoundingClientRect(),n=s(e),r=n.borderTopWidth,o=n.borderLeftWidth,i=n.borderRightWidth,a=n.borderBottomWidth,u=n.marginTop,l=n.marginBottom,c=n.marginLeft,p=n.marginRight;return{top:t.top+(null!=r?r:0)-(null!=u?u:0),left:t.left+(null!=o?o:0)-(null!=c?c:0),right:t.right+(null!=i?i:0)+(null!=p?p:0),bottom:t.bottom+(null!=a?a:0)+(null!=l?l:0),width:t.width+(null!=o?o:0)+(null!=i?i:0)+(null!=c?c:0)+(null!=p?p:0),height:t.height+(null!=r?r:0)+(null!=a?a:0)+(null!=u?u:0)+(null!=l?l:0),toJSON:function(){return 0},y:t.top+(null!=r?r:0)-(null!=u?u:0),x:t.left+(null!=o?o:0)-(null!=c?c:0)}},t.getAbsoluteHeight=function(e){var t=s(e),n=t.marginBottom+t.marginTop;return Math.ceil(e.offsetHeight+n)},t.getAbsoluteWidth=function(e){var t=s(e),n=t.marginLeft+t.marginRight;return Math.ceil(e.offsetWidth+n)},t.removeFromParent=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)},t.addTemplate=function(e){var t=document.createElement(\"div\");return t.innerHTML=(e||\"\").trim(),t.firstChild},t.setDisplayed=function(e,t,n){void 0===n&&(n={});var o=n.skipAriaHidden;e.classList.toggle(\"comp-hidden\",!t),o||(0,r.setAriaHidden)(e,!t)},t.setVisible=function(e,t,n){void 0===n&&(n={});var o=n.skipAriaHidden;e.classList.toggle(\"comp-invisible\",!t),o||(0,r.setAriaHidden)(e,!t)},t.setDisabled=function(e,t){var n=\"disabled\",r=t?function(e){return e.setAttribute(n,\"\")}:function(e){return e.removeAttribute(n)};r(e),o(e.querySelectorAll(\"input\"),function(e){return r(e)})},t.forEachNodeInList=o,t.cloneNodeList=function(e){if(null==e)return[];var t=[];return o(e,function(e){return t.push(e)}),t},t.forEachAttributeInMap=function(e,t){if(!e)return;for(var n=0;n<e.length;n++){var r=e[n];t(r.name,r.value)}},t.toggleAttribute=function(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n.toString())},t.forEachAttributeInNamedNodeMap=function(e,t){if(!e)return;for(var n=0;n<e.length;n++){var r=e[n];t(r.name,r.value)}},t.isNodeOrHTMLElement=function(e){return e instanceof Node||e instanceof HTMLElement},t.clearElement=function(e){for(;e&&e.firstChild;)e.removeChild(e.firstChild)},t.setElementWidth=function(e,t){\"flex\"===t?(e.style.removeProperty(\"width\"),e.style.removeProperty(\"minWidth\"),e.style.removeProperty(\"maxWidth\"),e.style.flex=\"1 1 auto\"):i(e,t)},t.setFixedWidth=i,t.formatSize=a,t.addOrRemoveAttribute=function(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n.toString())},t.ensureDomOrder=function(e,t,n){if(n&&n.nextSibling===t)return;n?n.nextSibling?e.insertBefore(t,n.nextSibling):e.appendChild(t):e.firstChild&&e.firstChild!==t&&e.insertAdjacentElement(\"afterbegin\",t)},t.insertWithDomOrder=function(e,t,n){n?n.insertAdjacentElement(\"afterend\",t):e.firstChild?e.insertAdjacentElement(\"afterbegin\",t):e.appendChild(t)},t.setFixedHeight=function(e,t){t=a(t),e.style.height=t.toString(),e.style.maxHeight=t.toString(),e.style.minHeight=t.toString()};var r=n(887);function o(e,t){if(null!=e)for(var n=0;n<e.length;n++)t(e[n])}function i(e,t){t=a(t),e.style.width=t.toString(),e.style.maxWidth=t.toString(),e.style.minWidth=t.toString()}function a(e){return\"number\"==typeof e?\"\".concat(e,\"px\"):e}function s(e){var t=window.getComputedStyle(e),n=t.height,r=t.width,o=t.borderTopWidth,i=t.borderRightWidth,a=t.borderBottomWidth,s=t.borderLeftWidth,u=t.paddingTop,l=t.paddingRight,c=t.paddingBottom,p=t.paddingLeft,d=t.marginTop,f=t.marginRight,h=t.marginBottom,m=t.marginLeft,y=t.boxSizing;return{height:parseFloat(n),width:parseFloat(r),borderTopWidth:parseFloat(o),borderRightWidth:parseFloat(i),borderBottomWidth:parseFloat(a),borderLeftWidth:parseFloat(s),paddingTop:parseFloat(u),paddingRight:parseFloat(l),paddingBottom:parseFloat(c),paddingLeft:parseFloat(p),marginTop:parseFloat(d),marginRight:parseFloat(f),marginBottom:parseFloat(h),marginLeft:parseFloat(m),boxSizing:y}}},752(e,t,n){Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextMenu=void 0;var r=n(681),o=n(944),i=n(563),a=n(686),s=n(92),u=n(834),l=n(350),c=n(125),p=n(289),d=n(175),f=n(825),h=n(782),m=n(783),y=n(838),g=n(549),A=function(e,t){var n=this;(new v).initializeContextMenu(e,t,function(e){n.api=e})};t.ContextMenu=A;var v=function(){function e(){}return e.prototype.initializeContextMenu=function(e,t,n){void 0===t&&(t={});var o=this.createuserConfiguration(e,t),i=this.CreateBeanClasses(),a=new f.Context;a.registerBeanClasses(i,o),this.registryDefaultComponent(a),this.setConfiguration(a,e),a.getBean(r.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_EVENT_HANDLER).handleUserEvent(),window.context=a,this.setApi(a,n)},e.prototype.setApi=function(e,t){var n=e.getBean(r.CONTEXT_MENU_BEAN_NAME.MENU_MODEL_API);t&&t(n)},e.prototype.setConfiguration=function(e,t){e.getBean(r.CONTEXT_MENU_BEAN_NAME.MENU_MODEL).addItems(t)},e.prototype.CreateBeanClasses=function(){return new Set([o.MenuModel,f.EventHandler,f.ComponentsRegistry,i.NavigationHandler,s.Controller,a.ContextMenuController,u.ContextMenuUserComponentHandler,l.PopupHandler,g.ContextMenuEventHandler,c.OptionHandler,y.MenuModelAPI,f.UserComponentRegistry,h.ContextMenuComponentMetadataProvider,m.ContextMenuComponentUtility])},e.prototype.registryDefaultComponent=function(e){var t=e.getBean(f.BEAN_NAME.USER_COMPONENT_REGISTRY),n={itemRenderer:p.itemElement};(0,d.traverseObject)(n,function(e,n){t.registerDefaultComponent(e,n)})},e.prototype.createuserConfiguration=function(e,t){var n,r,o=null!==(n=t.frameworkOverrides)&&void 0!==n?n:null;return o||(o=new f.VanillaFrameWorkOverrider),{configuration:e,frameWorkOverrides:o,frameworkComponentWrapper:t.frameworkComponentWrapper,globalEventListener:null!==(r=t.globalEventListener)&&void 0!==r?r:null}},e}()},782(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextMenuComponentMetadataProvider=void 0;var a=n(825),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.postConstructMethods=function(){var e=this.getBeanInstanceByBeanName(a.BEAN_NAME.COMPONENT_UTILITY);this.componentMetaData={itemRenderer:{mandatoryMethodList:[],optionalMethodList:[\"afterGuiAttached\"],functionAdapter:e.adaptItemRendererFunction.bind(e)}}},t.prototype.retrieve=function(e){return this.componentMetaData[e]},i([(0,a.AutoWired)(a.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstanceByBeanName\",void 0),t=i([(0,a.Bean)(a.BEAN_NAME.COMPONENT_META_DATA_PROVIDER)],t)}(a.ComponentMetadataProvider);t.ContextMenuComponentMetadataProvider=s},783(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextMenuComponentUtility=void 0;var a=n(825),s=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.adaptFunction=function(e,t){var n=this.componentMetadataProvider.retrieve(e);return n&&n.functionAdapter?n.functionAdapter(t):null},t.prototype.adaptItemRendererFunction=function(e){return this.adaptRendererFunction(e)},t.prototype.doesImplementIComponent=function(e){return!!e&&(e.prototype&&\"getGui\"in e.prototype)},t=i([(0,a.Bean)(a.BEAN_NAME.COMPONENT_UTILITY)],t)}(a.ComponentUtility);t.ContextMenuComponentUtility=s},825(e,t,n){n.r(t),n.d(t,{AttributeAnnotationTargetType:()=>s,AutoWired:()=>u,BEAN_NAME:()=>l,BaseComponentWrapper:()=>c,Bean:()=>p,BeanDefinitionSymbol:()=>d,BeanDependencyType:()=>f,Component:()=>h,ComponentMetadataProvider:()=>m,ComponentUtility:()=>y,Components:()=>g,ComponentsRegistry:()=>A,Context:()=>v,EventEmitter:()=>b,EventHandler:()=>C,Optional:()=>M,PostConstruct:()=>E,PreConstruct:()=>O,PreDestroy:()=>P,Qualifier:()=>_,QuerySelector:()=>N,UserComponentHandler:()=>I,UserComponentRegistry:()=>x,VanillaFrameWorkOverrider:()=>T,WireFunction:()=>S,__esModule:()=>R,_getAttributeAnnotationsForMethod:()=>j,_getBeanDefinition:()=>D,_preinitAttributeAnnotationsForMethod:()=>B,addAriaAttribute:()=>w,addOrRemoveAttribute:()=>H,addSafePassiveEventListener:()=>L,addTemplate:()=>F,ariaAttributeName:()=>W,clearElement:()=>U,cloneNodeList:()=>G,createArrayOfNumbers:()=>k,default:()=>a,ensureDomOrder:()=>X,exists:()=>V,forEachAttributeInMap:()=>Y,forEachAttributeInNamedNodeMap:()=>z,forEachNodeInList:()=>q,formatSize:()=>K,getAbsoluteHeight:()=>Q,getAbsoluteWidth:()=>Z,getElementRectWithMargin:()=>J,getElementRectWithOffset:()=>$,getElementSize:()=>ee,getFunctionName:()=>te,insertWithDomOrder:()=>ne,isNodeOrHTMLElement:()=>re,makeMethodAttributeAnnotation:()=>oe,makeMethodParameterAnnotation:()=>ie,makeRegisterAnnotation:()=>ae,queryAssignedNodes:()=>se,removeAriaAttribute:()=>ue,removeFromParent:()=>le,setAriaActiveDescendant:()=>ce,setAriaAtomic:()=>pe,setAriaAutocomplete:()=>de,setAriaBraillelabel:()=>fe,setAriaBrailleroledescription:()=>he,setAriaBusy:()=>me,setAriaChecked:()=>ye,setAriaColCount:()=>ge,setAriaColIndex:()=>Ae,setAriaColIndexText:()=>ve,setAriaColSpan:()=>be,setAriaControls:()=>Ce,setAriaCurrent:()=>Me,setAriaDescribedBy:()=>Ee,setAriaDescription:()=>Oe,setAriaDetails:()=>Pe,setAriaDisabled:()=>_e,setAriaErrorMessage:()=>Ne,setAriaExpanded:()=>Ie,setAriaFlowTo:()=>xe,setAriaHasPopUp:()=>Te,setAriaHidden:()=>Se,setAriaInvalid:()=>Re,setAriaKeyShortCuts:()=>je,setAriaLabel:()=>De,setAriaLabelledBy:()=>Be,setAriaLevel:()=>we,setAriaLive:()=>He,setAriaModal:()=>Le,setAriaMultiLine:()=>Fe,setAriaMultiSelectable:()=>We,setAriaOrientation:()=>Ue,setAriaPlaceHolder:()=>Ge,setAriaPosInSet:()=>ke,setAriaPressed:()=>Xe,setAriaReadOnly:()=>Ve,setAriaRelevant:()=>Ye,setAriaRequired:()=>ze,setAriaRole:()=>qe,setAriaRoleDescription:()=>Ke,setAriaRowCount:()=>Qe,setAriaRowIndex:()=>Ze,setAriaRowIndexText:()=>Je,setAriaRowSpan:()=>$e,setAriaSelected:()=>et,setAriaSetSize:()=>tt,setAriaSort:()=>nt,setAriaValueMax:()=>rt,setAriaValueMin:()=>ot,setAriaValueNow:()=>it,setAriaValueText:()=>at,setDisabled:()=>st,setDisplayed:()=>ut,setElementWidth:()=>lt,setFixedHeight:()=>ct,setFixedWidth:()=>pt,setVisible:()=>dt,toStringOrNull:()=>ft,toggleAriaAttribute:()=>ht,toggleAttribute:()=>mt,traverseObject:()=>yt,values:()=>gt});var r={11(e,t){var n,r;Object.defineProperty(t,\"__esModule\",{value:!0}),t.AttributeAnnotationTargetType=t.BeanDependencyType=void 0,function(e){e[e.CONSTRUCTOR=0]=\"CONSTRUCTOR\",e[e.AUTOWIRE=1]=\"AUTOWIRE\"}(n||(t.BeanDependencyType=n={})),function(e){e[e.Class=0]=\"Class\",e[e.Method=1]=\"Method\"}(r||(t.AttributeAnnotationTargetType=r={}))},283(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Component=void 0;var u=n(693),l=n(284),c=n(350),p=n(682),d=n(589),f=function(e){function t(t){var n=e.call(this)||this;return n.displayed=!0,n.visible=!0,t&&n.setTemplate(t),n}return o(t,e),t.prototype.preConstructMethods=function(){this.createChildComponentsPreConstruct()},t.prototype.createChildComponentsFromTags=function(e,t){var n=this;(0,p.cloneNodeList)(e.childNodes).forEach(function(r){if(r instanceof HTMLElement){var o=n.createComponentFromElement(r,function(e){e.getGui()&&n.copyAttributesFromNode(r,e.getGui())},t);if(o){if(o.addItems&&r.children.length){n.createChildComponentsFromTags(r,t);var i=Array.prototype.slice.call(r.children);o.addItems(i)}n.swapComponentForNode(o,e,r)}else r.childNodes&&n.createChildComponentsFromTags(r,t)}})},t.prototype.createComponentFromElement=function(e,n,r){var o=e.nodeName,i=r?r[e.getAttribute(\"ref\")]:void 0,a=this.componentRegistry.getComponentClass(o);if(a){t.elementGettingCreated=e;var s=new a(i);return s.setParentComponent(this),this.createBean(s,null,n),s}return null},t.prototype.copyAttributesFromNode=function(e,t){(0,p.forEachAttributeInNamedNodeMap)(e.attributes,function(e,n){\"class\"!==e?t.setAttribute(e,n):(n||\"\").split(\" \").forEach(function(e){return t.classList.add(e)})})},t.prototype.swapComponentForNode=function(e,t,n){var r=e.getGui();t.replaceChild(r,n),this.addDestroyFunc(this.destroyBean.bind(this,e)),this.swapInComponentForRefSelectors(e,n)},t.prototype.swapInComponentForRefSelectors=function(e,t){var n=this;this.iterateOverQuerySelectors(function(r){n[r.attributeName]===t&&(n[r.attributeName]=e)})},t.prototype.iterateOverQuerySelectors=function(e){for(var t=Object.getPrototypeOf(this);null!=t;){var n=Reflect.get(t,c.Components.METADATA),r=(0,c.getFunctionName)(t.constructor);n&&Reflect.has(n,r)&&Reflect.has(n[r],\"querySelectors\")&&n[r].querySelectors.forEach(function(t){return e(t)}),t=Object.getPrototypeOf(t)}},t.prototype.createChildComponentsPreConstruct=function(){this.getGui()&&this.createChildComponentsFromTags(this.getGui())},t.prototype.activateTabIndex=function(e){e||(e=[]),e.length||e.push(this.getGui()),e.forEach(function(e){return e.setAttribute(\"tabindex\",(0).toString())})},t.prototype.wireQuerySelectors=function(){var e=this;if(this.eGui){var t=this;this.iterateOverQuerySelectors(function(n){var r=function(e){return t[n.attributeName]=e};if(n.refSelector&&e.getAttribute(\"ref\")===n.refSelector)r(e.eGui);else{var o=e.eGui.querySelector(n.querySelector);o&&r(o.Component||o)}})}},t.prototype.setGui=function(e){this.eGui=e},t.prototype.queryForHtmlElement=function(e){return this.eGui.querySelector(e)},t.prototype.queryForHtmlInputElement=function(e){return this.eGui.querySelector(e)},t.prototype.destroy=function(){this.parentComponent&&(this.parentComponent=void 0),e.prototype.destroy.call(this)},t.prototype.setTemplate=function(e,t){this.setTemplateFromElement(e,t)},t.prototype.setTemplateFromElement=function(e,t){this.eGui=e,this.eGui.Component=this,this.wireQuerySelectors(),this.getContext()&&this.createChildComponentsFromTags(this.getGui(),t)},t.prototype.getGui=function(){return this.eGui},t.prototype.getFocusableElement=function(){return this.eGui},t.prototype.getAriaElement=function(){return this.getFocusableElement()},t.prototype.setParentComponent=function(e){this.parentComponent=e},t.prototype.getParentComponent=function(){return this.parentComponent},t.prototype.appendChild=function(e,t){if(void 0===t&&(t=this.eGui),null!=e)if((0,p.isNodeOrHTMLElement)(e))t.appendChild(e);else{var n=e;t.appendChild(n.getGui())}},t.prototype.isDisplayed=function(){return this.displayed},t.prototype.setVisible=function(e,t){if(void 0===t&&(t={}),e!==this.visible){this.visible=e;var n=t.skipAriaHidden;(0,p.setVisible)(this.eGui,e,{skipAriaHidden:n})}},t.prototype.setDisplayed=function(e,n){if(void 0===n&&(n={}),e!==this.displayed){this.displayed=e;var r=n.skipAriaHidden;(0,p.setDisplayed)(this.eGui,e,{skipAriaHidden:r});var o={type:t.EVENT_DISPLAYED_CHANGED,visible:this.displayed};this.dispatchEvent(o)}},t.prototype.addGuiEventListener=function(e,t,n){var r=this;this.eGui.addEventListener(e,t,n),this.addDestroyFunc(function(){return r.eGui.removeEventListener(e,t)})},t.prototype.addCssClass=function(e){var t,n=this.getGui(),r=(e||\"\").split(\" \");null==n||(t=n.classList).add.apply(t,s([],a(r),!1))},t.prototype.removeCssClass=function(e){var t,n=this.getGui(),r=(e||\"\").split(\" \");null==n||(t=n.classList).remove.apply(t,s([],a(r),!1))},t.prototype.containsCssClass=function(e){var t=this.getGui();return!!t&&t.classList.contains(e)},t.prototype.addOrRemoveCssClass=function(e,t){var n=this;if(e){if(e.indexOf(\" \")>=0){var r=(e||\"\").split(\" \");if(r.length>1)return void r.forEach(function(e){return n.addOrRemoveCssClass(e,t)})}if(e.length){var o=this.getGui();o&&o.classList.toggle(e,t)}}},t.prototype.getAttribute=function(e){var t=this.getGui();return t?t.getAttribute(e):null},t.prototype.getRefElement=function(e){return this.queryForHtmlElement('[ref=\"'.concat(e,'\"]'))},t.EVENT_DISPLAYED_CHANGED=\"displayedChanged\",i([(0,d.AutoWired)(u.BEAN_NAME.COMPONENT_REGISTRY)],t.prototype,\"componentRegistry\",void 0),i([(0,d.PreConstruct)()],t.prototype,\"preConstructMethods\",null),t}(l.EventEmitter);t.Component=f},284(e,t,n){var r=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventEmitter=void 0,t.addSafePassiveEventListener=u;var o=n(589),i=n(693),a=n(642),s=function(){function e(){this.destroyFunctions=[],this.destroyed=!1}return e.prototype.getFrameWorkOverrides=function(){return this.frameWorkOverrides},e.prototype.createBean=function(e,t,n){return t?t.createBean(e):this.getContext().createBean(e),n&&n(e),e},e.prototype.destroyBean=function(e,t){return(t||this.getContext()).destroyBean(e)},e.prototype.destroyBeans=function(e,t){var n=this;return e&&e.forEach(function(e){return n.destroyBean(e,t)}),[]},e.prototype.destroy=function(){this.dispatchEvent({type:e.EVENT_DESTROYED}),this.destroyFunctions.forEach(function(e){return e()}),this.destroyFunctions.length=0,this.destroyed=!0},e.prototype.getContext=function(){return this.context},e.prototype.addEventListener=function(e,t){this.eventHandler||(this.eventHandler=new a.EventHandler),this.eventHandler.addEventListener(e,t)},e.prototype.removeEventListener=function(e,t){this.eventHandler&&this.eventHandler.removeEventListener(e,t)},e.prototype.dispatchEventAsync=function(e){var t=this;window.setTimeout(function(){return t.dispatchEvent(e)},0)},e.prototype.dispatchEvent=function(e){this.eventHandler&&this.eventHandler.dispatchEvent(e)},e.prototype.addListener=function(e,t,n){var r=this;if(!this.destroyed){e instanceof HTMLElement?u(e,t,n):e.addEventListener(t,n);var o=function(){return e.removeEventListener(t,n),null};return this.destroyFunctions.push(o),function(){return o(),r.destroyFunctions=r.destroyFunctions.filter(function(e){return e!==o}),null}}},e.prototype.isAlive=function(){return!this.destroyed},e.prototype.addDestroyFunc=function(e){this.isAlive()?this.destroyFunctions.push(e):e()},e.prototype.createManagedBean=function(e,t){var n=this.createBean(e,t);return this.addDestroyFunc(this.destroyBean.bind(this,e,t)),n},e.EVENT_DESTROYED=\"destroyed\",r([(0,o.AutoWired)(i.BEAN_NAME.EVENT_HANDLER)],e.prototype,\"eventHandler\",void 0),r([(0,o.AutoWired)(i.BEAN_NAME.OPTION_HANDLER)],e.prototype,\"optionsHandler\",void 0),r([(0,o.AutoWired)(i.BEAN_NAME.FRAME_WORK_OVERRIDES)],e.prototype,\"frameWorkOverrides\",void 0),r([(0,o.AutoWired)(\"context\")],e.prototype,\"context\",void 0),e}();function u(e,t,n){e&&e.addEventListener(t,n,void 0)}t.EventEmitter=s},350(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.Components=void 0,t.getFunctionName=r,t.queryAssignedNodes=function(e){return function(t,n,r){o(t,\"querySelectors\",{attributeName:n,querySelector:\"[ref=\".concat(e,\"]\"),refSelector:e})}},t.QuerySelector=function(e){return void 0===e&&(e=null),function(t,n,r){null!==e?\"number\"!=typeof r?o(t,\"querySelectors\",{attributeName:n,querySelector:e,refSelector:void 0}):console.error(\"QuerySelector should be on an attribute\"):console.error(\"QuerySelector should not be null\")}};var n={METADATA:\"COMPONENT_META_DATA\"};function r(e){if(e.name)return e.name}function o(e,t,o){var i=function(e,t){return Reflect.has(e,n.METADATA)||Reflect.set(e,n.METADATA,{}),Reflect.has(e[n.METADATA],t)||Reflect.set(e[n.METADATA],t,{}),Reflect.get(e[n.METADATA],t)}(e,r(e.constructor));i[t]||(i[t]=[]),i[t].push(o)}t.Components=n},363(e,t){var n=this&&this.__values||function(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&\"number\"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},r=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.values=function(e){if(e instanceof Set||e instanceof Map){var t=[];return e.forEach(function(e){return t.push(e)}),t}return Object.values(e)},t.exists=function(e,t){return void 0===t&&(t=!1),null!=e&&(\"\"!==e||t)},t.toStringOrNull=function(e){return null!=e&&\"function\"==typeof e.toString?e.toString():null},t.createArrayOfNumbers=function(e,t){for(var n=[],r=e;r<=t;r++)n.push(r);return n},t.traverseObject=function(e,t){var o,i;if(null!=e)if(Array.isArray(e))for(var a=0;a<e.length;a++)t(a.toString(),e[a]);else try{for(var s=n(Object.entries(e)),u=s.next();!u.done;u=s.next()){var l=r(u.value,2);t(l[0],l[1])}}catch(e){o={error:e}}finally{try{u&&!u.done&&(i=s.return)&&i.call(s)}finally{if(o)throw o.error}}}},388(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.UserComponentHandler=void 0;var a=n(589),s=n(693),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.getComponentDetails=function(e,t,n,r){var o=this,i=this.getComponentMeta(e,t,n),a=i.componentName,u=i.frameworkComponent,l=i.jsComponent,c=function(e){var t=o.getBeanInstance(s.BEAN_NAME.USER_COMPONENT_REGISTRY).retrieve(e);t&&(l=t.componentFrameWork?void 0:t.component,u=t.componentFrameWork?t.component:void 0)};if(null!=a&&c(a),null==l&&null==u&&null!=r&&c(r),l||u){var p=null==l,d=l||u;return{componentFramework:p,componentClass:d,params:n,propertyName:t,newInstance:function(){return o.newInstance(d,p,t,n)}}}},t.prototype.getComponentMeta=function(e,t,n){var r=this,o=null,i=null,a=null;return function(e){\"string\"==typeof e?o=e:null!=e&&!0!==e&&(r.getFrameWorkOverrides().isFrameworkComponent(e)?a=e:i=e)}(this.getComponent(e,t)),{componentName:o,frameworkComponent:a,jsComponent:i}},t.prototype.getComponent=function(e,t){},t.prototype.newInstance=function(e,t,n,r){var o,i=this.getBeanInstance(s.BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER),a=this.getBeanInstance(s.BEAN_NAME.COMPONENT_META_DATA_PROVIDER);if(t){var u=a.retrieve(n);o=i.wrap(e,u.mandatoryMethodList,u.optionalMethodList)}else o=new e;return this.initComponent(o,r),o},t.prototype.initComponent=function(e,t){if(this.context.createBean(e),null!=e.init)return e.init(t)},i([(0,a.AutoWired)(s.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstance\",void 0),i([(0,a.Bean)(s.BEAN_NAME.USER_COMPONENT_HANDLER)],t)}(n(284).EventEmitter);t.UserComponentHandler=u},408(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentMetadataProvider=void 0;var u=n(589),l=n(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.componentMetaData={},t}return o(t,e),t.prototype.retrieve=function(e){return this.componentMetaData[e]},i([(0,u.AutoWired)(l.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstanceByBeanName\",void 0),i([(0,u.Bean)(l.BEAN_NAME.COMPONENT_META_DATA_PROVIDER)],t)}(n(284).EventEmitter);t.ComponentMetadataProvider=c},530(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentUtility=void 0;var a=n(589),s=n(693),u=n(284),l=n(682),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.adaptFunction=function(e,t){var n=this.componentMetadataProvider.retrieve(e);return n&&n.functionAdapter?n.functionAdapter(t):null},t.prototype.adaptRendererFunction=function(e){return function(){function t(){}return t.prototype.getGui=function(){return this.eGui},t.prototype.init=function(t){var n=e(t),r=typeof n;this.eGui=\"string\"!==r&&\"number\"!==r&&\"boolean\"!==r?null!=n?n:(0,l.addTemplate)(\"<span></span>\"):(0,l.addTemplate)(\"<span>\"+n+\"</span>\")},t}()},t.prototype.doesImplementIComponent=function(e){return!!e&&e.prototype&&\"getGui\"in e.prototype},i([(0,a.AutoWired)(s.BEAN_NAME.COMPONENT_META_DATA_PROVIDER)],t.prototype,\"componentMetadataProvider\",void 0),i([(0,a.Bean)(s.BEAN_NAME.COMPONENT_UTILITY)],t)}(u.EventEmitter);t.ComponentUtility=c},589(e,t,n){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BeanDefinitionSymbol=void 0,t.Qualifier=function(e){return c({name:e})},t.AutoWired=function(e,t){return a(e,!1,t)},t.Bean=function(e){return s({componentType:\"bean\",beanName:e})},t.Optional=function(e,t){return a(e,!0,t)},t.PostConstruct=function(e){return function(e,t,n){var r,o=i(e,\"prototype\");if(\"function\"!=typeof n.value)throw Error(\"@PostConstructor is can use only to method\");return o.postConstruct&&(o.postConstruct=[]),null===(r=o.postConstruct)||void 0===r||r.push(t),n}},t.PreConstruct=function(e){return function(e,t,n){var r,o=i(e,\"prototype\");if(\"function\"!=typeof n.value)throw Error(\"@PreConstructor is can use only to method\");return o.preConstruct&&(o.preConstruct=[]),null===(r=o.preConstruct)||void 0===r||r.push(t),n}},t.PreDestroy=function(e){return function(e,t,n){var r=i(e,\"prototype\");if(\"function\"!=typeof n.value)throw Error(\"@PreDestroy is can use only to method\");return r.preDestroy||(r.preDestroy=[]),r.preDestroy.push(t),n}},t.WireFunction=a,t._getAttributeAnnotationsForMethod=u,t._getBeanDefinition=i,t._preinitAttributeAnnotationsForMethod=l,t.makeMethodAttributeAnnotation=function(e){return function(e,t,n){var r=u(i(e,\"prototype\"),t);r.targetDescriptor=n,l(r,n)}},t.makeMethodParameterAnnotation=c,t.makeRegisterAnnotation=s;var r=n(11),o=Symbol(\"BeanDefinition\");function i(e,t){var n;if((n=\"class\"===t||\"function\"==typeof e?e:\"prototype\"===t?e.constructor:Object.getPrototypeOf(e)).hasOwnProperty(o))return n[o];var r={uniqueId:Symbol(),className:\"\",beanName:\"\",componentTypes:[],dependencies:[],constructor:null,existInstance:null,preConstruct:[],postConstruct:[],preDestroy:[],attributeAnnotations:[]};return Object.defineProperty(n,o,{value:r,writable:!1}),r}function a(e,t,n){return function(o,a){var s=i(o,\"prototype\"),u=n&&n.lazy||!1;if(n&&n.name)s.dependencies.push({type:r.BeanDependencyType.AUTOWIRE,autowireField:a,autowireLazy:u,beanName:n.name,className:e,optional:t});else{if(\"string\"!=typeof a)throw new Error(\"property name must be string without beanName\");s.dependencies.push({type:r.BeanDependencyType.AUTOWIRE,autowireField:a,autowireLazy:u,beanName:e,className:e,optional:t})}}}function s(e){return function(t){var n=e.beanName||t.name,o=i(t,\"class\");return o.className=t.name,o.beanName=n,o.constructor=t,o.componentTypes.push(e.componentType),o.attributeAnnotations.push({targetType:r.AttributeAnnotationTargetType.Class,targetDescriptor:null}),t}}function u(e,t){var n=e.attributeAnnotations.find(function(e){return e.targetType===r.AttributeAnnotationTargetType.Method&&e.targetPropertyKey===t});return n||(n={targetType:r.AttributeAnnotationTargetType.Method,targetPropertyKey:t,targetDescriptor:void 0,parameters:void 0},e.attributeAnnotations.push(n)),n}function l(e,t){var n=t.value,r=Array(n.length);if(e.targetDescriptor=t,e.parameters){if(e.parameters.length!=n.length)for(var o=0;o<r.length;o++)e.parameters[o]||(e.parameters[o]=void 0)}else e.parameters=r}function c(e){return function(t,n,r){var o=u(i(t,\"prototype\"),n);o.parameters||(o.parameters=[]),o.parameters[r]={index:r,name:e.name}}}t.BeanDefinitionSymbol=o},631(e,t,n){Object.defineProperty(t,\"__esModule\",{value:!0}),t.Context=void 0;var r=n(589),o=n(693),i=n(363),a=function(){function e(){this.beanWrappers={},this.destroyed=!1}return e.prototype.getBeanInstances=function(){return Object.values(this.beanWrappers)},e.prototype.registerBeanClasses=function(e,t){this.beanClasses=e,this.registerUserContextParams(t),this.createBeans();var n=this.getBeanInstances();this.wireBeans(n)},e.prototype.registerUserContextParams=function(e){this.userConfigurations=null!=e?e:{}},e.prototype.createBean=function(e,t){if(!e)throw Error(\"Can't wire to bean since it is null\");return this.wireBeans([e]),e},e.prototype.createBeans=function(){var e=this;this.beanClasses.forEach(function(t){var n=t[r.BeanDefinitionSymbol];if(n){var o=n.beanName,i=new t;e.beanWrappers[o]=i}})},e.prototype.wireBeans=function(e){this.autoWireBeans(e),this.methodWireBeans(e),this.callLifeCycleMethods(e,\"preConstruct\"),this.callLifeCycleMethods(e,\"postConstruct\")},e.prototype.autoWireBeans=function(e){var t=this;e.forEach(function(e){t.forEachMetaDataInHierarchyBeanDefinition(e,function(n,r){var i=n.dependencies;i&&i.forEach(function(n){if(n.autowireLazy)Object.defineProperty(e,n.autowireField,{get:function(){var e=t.getBeanInstance(r,n.beanName,n.optional);if(n.beanName===o.BEAN_NAME.BEANS&&(e=t.getBeanInstance.bind(t,r)),!e)throw new Error(\"Unknown beanName=\".concat(n.autowireField));return e},configurable:!1});else{var i;i=n.beanName===o.BEAN_NAME.BEANS?t.getBeanInstance.bind(t,r):t.getBeanInstance(r,n.beanName,n.optional),Object.defineProperty(e,n.autowireField,{value:i,configurable:!!i,writable:!1})}})})})},e.prototype.methodWireBeans=function(e){var t=this;e.forEach(function(e){t.forEachMetaDataInHierarchyBeanDefinition(e,function(n,r){n.attributeAnnotations.forEach(function(n){if(n.targetPropertyKey&&n.parameters){var o=t.getBeansForParameters(n.parameters,r);console.log(o),e[n.targetPropertyKey].apply(e)}})})})},e.prototype.getBeansForParameters=function(e,t){var n=this,r=[];return e&&(0,i.traverseObject)(e,function(e,o){if(o){var i=n.getBeanInstance(t,o.name);r[Number(o.index)]=i}}),r},e.prototype.getBeanInstance=function(e,t,n){return void 0===n&&(n=!1),this.destroyed?null:t===o.BEAN_NAME.CONTEXT?(r=this,{createBean:function(e){return r.createBean(e)},destroyBean:function(e){return r.destroyBean(e)},destroy:function(){r.destroy()}}):this.userConfigurations&&this.userConfigurations.hasOwnProperty(t)?this.userConfigurations[t]:this.beanWrappers[t]||(n||console.error(\"Component: unable to find bean reference \".concat(t,\" while initialising \").concat(e)),null);var r},e.prototype.callLifeCycleMethods=function(e,t){var n=this;e.forEach(function(e){return n.callLifeCycleMethodsOnBean(e,t)})},e.prototype.callLifeCycleMethodsOnBean=function(e,t,n){var r={};this.forEachMetaDataInHierarchyBeanDefinition(e,function(e){var o=e[t];o&&o.forEach(function(e){e!=n&&(r[e]=!0)})}),Object.keys(r).forEach(function(t){return e[t]()})},e.prototype.forEachMetaDataInHierarchyBeanDefinition=function(e,t){for(var n=Object.getPrototypeOf(e);null!=n;){var o=n.constructor;o.hasOwnProperty(r.BeanDefinitionSymbol)&&t(o[r.BeanDefinitionSymbol],this.getBeanName(o)),n=Object.getPrototypeOf(n)}},e.prototype.getBeanName=function(e){if(e[r.BeanDefinitionSymbol]&&e[r.BeanDefinitionSymbol].beanName)return e[r.BeanDefinitionSymbol].beanName;var t=e.toString();return t.substring(9,t.indexOf(\"(\"))},e.prototype.getBean=function(e){return this.getBeanInstance(\"getBean\",e,!0)},e.prototype.destroy=function(){if(!this.destroyed){this.destroyed=!0;var e=this.getBeanInstances();this.destroyBeans(e),this.userConfigurations=null}},e.prototype.destroyBean=function(e){e&&this.destroyBeans([e])},e.prototype.destroyBeans=function(e){var t=this;return e?(e.forEach(function(e){t.callLifeCycleMethodsOnBean(e,\"preDestroy\",\"destroy\");var n=e;\"function\"==typeof n.destroy&&n.destroy()}),[]):[]},e.prototype.isDestroyed=function(){return this.destroyed},e}();t.Context=a},642(e,t,n){var r=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventHandler=void 0;var o=n(589),i=n(693),a=function(){function e(){this.allSyncListeners=new Map,this.allAsyncListeners=new Map,this.globalSyncListeners=new Set,this.globalAsyncListeners=new Set,this.asyncFunctionsQueue=[],this.scheduled=!1,this.firedEvents={}}return e.prototype.setBeans=function(e,t,n){if(void 0===t&&(t=null),void 0===n&&(n=null),this.optionHandler=e,t){var r=e.useAsyncEvents();this.addGlobalListener(t,r)}n&&this.addGlobalListener(n,!1)},e.prototype.getListeners=function(e,t,n){var r=t?this.allAsyncListeners:this.allSyncListeners,o=r.get(e);return!o&&n&&(o=new Set,r.set(e,o)),o},e.prototype.noRegisteredListenersExist=function(){return 0===this.allSyncListeners.size&&0===this.allAsyncListeners.size&&0===this.globalSyncListeners.size&&0===this.globalAsyncListeners.size},e.prototype.addEventListener=function(e,t,n){void 0===n&&(n=!1),this.getListeners(e,n,!0).add(t)},e.prototype.removeEventListener=function(e,t,n){void 0===n&&(n=!1);var r=this.getListeners(e,n,!1);r&&(r.delete(t),0===r.size&&(n?this.allAsyncListeners:this.allSyncListeners).delete(e))},e.prototype.addGlobalListener=function(e,t){void 0===t&&(t=!1),(t?this.globalAsyncListeners:this.globalSyncListeners).add(e)},e.prototype.removeGlobalListener=function(e,t){void 0===t&&(t=!1),(t?this.globalAsyncListeners:this.globalSyncListeners).delete(e)},e.prototype.dispatchEvent=function(e){var t=e;if(this.optionHandler){var n=this.optionHandler.api;t.api=n}this.dispatchToListeners(t,!0),this.dispatchToListeners(t,!1),this.firedEvents[t.type]=!0},e.prototype.dispatchEventOnce=function(e){this.firedEvents[e.type]||this.dispatchEvent(e)},e.prototype.dispatchToListeners=function(e,t){var n=this,r=e.type,o=new Set(this.getListeners(r,t,!1));o.size>0&&function(r){r.forEach(function(r){t?n.dispatchAsync(function(){return r(e)}):r(e)})}(o),new Set(t?this.globalAsyncListeners:this.globalSyncListeners).forEach(function(o){t?n.dispatchAsync(function(){return o(r,e)}):o(r,e)})},e.prototype.dispatchAsync=function(e){this.asyncFunctionsQueue.push(e),this.scheduled||(window.setTimeout(this.flushAsyncQueue.bind(this),0),this.scheduled=!0)},e.prototype.flushAsyncQueue=function(){this.scheduled=!1;var e=this.asyncFunctionsQueue.slice();this.asyncFunctionsQueue=[],e.forEach(function(e){return e()})},r([(0,o.Bean)(i.BEAN_NAME.EVENT_HANDLER)],e)}();t.EventHandler=a},661(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BaseComponentWrapper=void 0;var n=function(){function e(){}return e.prototype.wrap=function(e,t,n){var r=this;void 0===n&&(n=[]);var o=this.createWrapper(e);return t.forEach(function(e){r.createMethod(o,e,!0)}),n.forEach(function(e){r.createMethod(o,e,!1)}),o},e.prototype.createMethod=function(e,t,n){e.addMethod(t,this.createMethodProxy(e,t,n))},e.prototype.createMethodProxy=function(e,t,n){return function(){return e.hasMethod(t)?e.callMethod(t,arguments):(n&&console.warn(\"Framework component is missing the method \".concat(t,\"()\")),null)}},e}();t.BaseComponentWrapper=n},682(e,t,n){Object.defineProperty(t,\"__esModule\",{value:!0}),t.setDisplayed=function(e,t,n){void 0===n&&(n={});var o=n.skipAriaHidden;e.classList.toggle(\"comp-hidden\",!t),o||(0,r.setAriaHidden)(e,!t)},t.setVisible=function(e,t,n){void 0===n&&(n={});var o=n.skipAriaHidden;e.classList.toggle(\"comp-invisible\",!t),o||(0,r.setAriaHidden)(e,!t)},t.setDisabled=function(e,t){var n=\"disabled\",r=t?function(e){return e.setAttribute(n,\"\")}:function(e){return e.removeAttribute(n)};r(e),o(e.querySelectorAll(\"input\"),function(e){return r(e)})},t.forEachNodeInList=o,t.cloneNodeList=function(e){if(null==e)return[];var t=[];return o(e,function(e){return t.push(e)}),t},t.forEachAttributeInMap=function(e,t){if(e)for(var n=0;n<e.length;n++){var r=e[n];t(r.name,r.value)}},t.toggleAttribute=function(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n.toString())},t.forEachAttributeInNamedNodeMap=function(e,t){if(e)for(var n=0;n<e.length;n++){var r=e[n];t(r.name,r.value)}},t.isNodeOrHTMLElement=function(e){return e instanceof Node||e instanceof HTMLElement},t.clearElement=function(e){for(;e&&e.firstChild;)e.removeChild(e.firstChild)},t.setElementWidth=function(e,t){\"flex\"===t?(e.style.removeProperty(\"width\"),e.style.removeProperty(\"minWidth\"),e.style.removeProperty(\"maxWidth\"),e.style.flex=\"1 1 auto\"):i(e,t)},t.setFixedWidth=i,t.formatSize=a,t.addOrRemoveAttribute=function(e,t,n){null==n?e.removeAttribute(t):e.setAttribute(t,n.toString())},t.ensureDomOrder=function(e,t,n){n&&n.nextSibling===t||(n?n.nextSibling?e.insertBefore(t,n.nextSibling):e.appendChild(t):e.firstChild&&e.firstChild!==t&&e.insertAdjacentElement(\"afterbegin\",t))},t.insertWithDomOrder=function(e,t,n){n?n.insertAdjacentElement(\"afterend\",t):e.firstChild?e.insertAdjacentElement(\"afterbegin\",t):e.appendChild(t)},t.setFixedHeight=function(e,t){t=a(t),e.style.height=t.toString(),e.style.maxHeight=t.toString(),e.style.minHeight=t.toString()},t.addTemplate=function(e){var t=document.createElement(\"div\");return t.innerHTML=(e||\"\").trim(),t.firstChild},t.removeFromParent=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)},t.getAbsoluteWidth=function(e){var t=s(e),n=t.marginLeft+t.marginRight;return Math.ceil(e.offsetWidth+n)},t.getAbsoluteHeight=function(e){var t=s(e),n=t.marginBottom+t.marginTop;return Math.ceil(e.offsetHeight+n)},t.getElementRectWithMargin=function(e){var t=e.getBoundingClientRect(),n=s(e),r=n.borderTopWidth,o=n.borderLeftWidth,i=n.borderRightWidth,a=n.borderBottomWidth,u=n.marginTop,l=n.marginBottom,c=n.marginLeft,p=n.marginRight;return{top:t.top+(null!=r?r:0)-(null!=u?u:0),left:t.left+(null!=o?o:0)-(null!=c?c:0),right:t.right+(null!=i?i:0)+(null!=p?p:0),bottom:t.bottom+(null!=a?a:0)+(null!=l?l:0),width:t.width+(null!=o?o:0)+(null!=i?i:0)+(null!=c?c:0)+(null!=p?p:0),height:t.height+(null!=r?r:0)+(null!=a?a:0)+(null!=u?u:0)+(null!=l?l:0),toJSON:function(){return 0},y:t.top+(null!=r?r:0)-(null!=u?u:0),x:t.left+(null!=o?o:0)-(null!=c?c:0)}},t.getElementRectWithOffset=function(e){var t=e.getBoundingClientRect(),n=s(e),r=n.borderTopWidth,o=n.borderLeftWidth,i=n.borderRightWidth,a=n.borderBottomWidth;return{top:t.top+(null!=r?r:0),left:t.left+(null!=o?o:0),right:t.right+(null!=i?i:0),bottom:t.bottom+(null!=a?a:0),width:t.width,height:t.height}},t.getElementSize=s;var r=n(777);function o(e,t){if(null!=e)for(var n=0;n<e.length;n++)t(e[n])}function i(e,t){t=a(t),e.style.width=t.toString(),e.style.maxWidth=t.toString(),e.style.minWidth=t.toString()}function a(e){return\"number\"==typeof e?\"\".concat(e,\"px\"):e}function s(e){var t=window.getComputedStyle(e),n=t.height,r=t.width,o=t.borderTopWidth,i=t.borderRightWidth,a=t.borderBottomWidth,s=t.borderLeftWidth,u=t.paddingTop,l=t.paddingRight,c=t.paddingBottom,p=t.paddingLeft,d=t.marginTop,f=t.marginRight,h=t.marginBottom,m=t.marginLeft,y=t.boxSizing;return{height:parseFloat(n),width:parseFloat(r),borderTopWidth:parseFloat(o),borderRightWidth:parseFloat(i),borderBottomWidth:parseFloat(a),borderLeftWidth:parseFloat(s),paddingTop:parseFloat(u),paddingRight:parseFloat(l),paddingBottom:parseFloat(c),paddingLeft:parseFloat(p),marginTop:parseFloat(d),marginRight:parseFloat(f),marginBottom:parseFloat(h),marginLeft:parseFloat(m),boxSizing:y}}},688(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentsRegistry=void 0;var u=n(589),l=n(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.componentsMappedByName={},t}return o(t,e),t.prototype.setupComponents=function(e){var t=this;e&&e.forEach(function(e){return t.addComponent(e)})},t.prototype.addComponent=function(e){var t=e.componentName,n=e.componentClass,r=e.template,o=t.toUpperCase();r&&(n.getTemplate=r),this.componentsMappedByName[o]=n},t.prototype.getComponentClass=function(e){return this.componentsMappedByName[e]},i([(0,u.Bean)(l.BEAN_NAME.COMPONENT_REGISTRY)],t)}(n(284).EventEmitter);t.ComponentsRegistry=c},693(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BEAN_NAME=void 0,t.BEAN_NAME={CONTEXT:\"context\",COMPONENT_REGISTRY:\"componentRegistry\",EVENT_HANDLER:\"eventHandler\",USER_COMPONENT_HANDLER:\"userComponentHandler\",POPUP_HANDLER:\"popupHandler\",OPTION_HANDLER:\"optionHandler\",USER_COMPONENT_REGISTRY:\"userComponentRegistry\",COMPONENT_META_DATA_PROVIDER:\"componentMetaDataProvider\",COMPONENT_UTILITY:\"componentUtility\",FRAME_WORK_COMPONENT_WRAPPER:\"frameworkComponentWrapper\",FRAME_WORK_OVERRIDES:\"frameWorkOverrides\",BEANS:\"lookupBeanInstances\"}},777(e,t){function n(e){return\"aria-\".concat(e)}function r(e,t,n){null==n||\"\"==n?i(e,t):o(e,t,n)}function o(e,t,r){e.setAttribute(n(t),r.toString())}function i(e,t){e.removeAttribute(n(t))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.ariaAttributeName=n,t.toggleAriaAttribute=r,t.addAriaAttribute=o,t.removeAriaAttribute=i,t.setAriaRole=function(e,t){t?e.setAttribute(\"role\",t):e.removeAttribute(\"role\")},t.setAriaActiveDescendant=function(e,t){r(e,\"activedescendant\",t)},t.setAriaAtomic=function(e,t){r(e,\"atomic\",t)},t.setAriaAutocomplete=function(e,t){r(e,\"autocomplete\",t)},t.setAriaBraillelabel=function(e,t){r(e,\"braillelabel\",t)},t.setAriaBrailleroledescription=function(e,t){r(e,\"brailleroledescription\",t)},t.setAriaBusy=function(e,t){r(e,\"busy\",t)},t.setAriaChecked=function(e,t){r(e,\"checked\",t)},t.setAriaColCount=function(e,t){r(e,\"colcount\",t)},t.setAriaColIndex=function(e,t){r(e,\"colindex\",t)},t.setAriaColIndexText=function(e,t){r(e,\"colindextext\",t)},t.setAriaColSpan=function(e,t){r(e,\"colspan\",t)},t.setAriaControls=function(e,t){r(e,\"controls\",t)},t.setAriaCurrent=function(e,t){r(e,\"current\",t)},t.setAriaDescribedBy=function(e,t){r(e,\"describedby\",t)},t.setAriaDescription=function(e,t){r(e,\"description\",t)},t.setAriaDetails=function(e,t){r(e,\"details\",t)},t.setAriaDisabled=function(e,t){r(e,\"disabled\",t)},t.setAriaErrorMessage=function(e,t){r(e,\"errormessage\",t)},t.setAriaExpanded=function(e,t){r(e,\"expanded\",t)},t.setAriaFlowTo=function(e,t){r(e,\"flowto\",t)},t.setAriaHasPopUp=function(e,t){r(e,\"haspopup\",t)},t.setAriaHidden=function(e,t){r(e,\"hidden\",t)},t.setAriaInvalid=function(e,t){r(e,\"invalid\",t)},t.setAriaKeyShortCuts=function(e,t){r(e,\"keyshortcuts\",t)},t.setAriaLabel=function(e,t){r(e,\"label\",t)},t.setAriaLabelledBy=function(e,t){r(e,\"labelledby\",t)},t.setAriaLevel=function(e,t){r(e,\"level\",t)},t.setAriaLive=function(e,t){r(e,\"live\",t)},t.setAriaModal=function(e,t){r(e,\"modal\",t)},t.setAriaMultiLine=function(e,t){r(e,\"multiline\",t)},t.setAriaMultiSelectable=function(e,t){r(e,\"multiselectable\",t)},t.setAriaOrientation=function(e,t){r(e,\"orientation\",t)},t.setAriaPlaceHolder=function(e,t){r(e,\"placeholder\",t)},t.setAriaPosInSet=function(e,t){r(e,\"posinset\",t)},t.setAriaPressed=function(e,t){r(e,\"pressed\",t)},t.setAriaReadOnly=function(e,t){r(e,\"readonly\",t)},t.setAriaRelevant=function(e,t){r(e,\"relevant\",t)},t.setAriaRequired=function(e,t){r(e,\"required\",t)},t.setAriaRoleDescription=function(e,t){r(e,\"roledescription\",t)},t.setAriaRowCount=function(e,t){r(e,\"rowcount\",t)},t.setAriaRowIndex=function(e,t){r(e,\"rowindex\",t)},t.setAriaRowIndexText=function(e,t){r(e,\"rowindextext\",t)},t.setAriaRowSpan=function(e,t){r(e,\"rowspan\",t)},t.setAriaSelected=function(e,t){r(e,\"selected\",t)},t.setAriaSetSize=function(e,t){r(e,\"setsize\",t)},t.setAriaSort=function(e,t){r(e,\"sort\",t)},t.setAriaValueMax=function(e,t){r(e,\"valuemax\",t)},t.setAriaValueMin=function(e,t){r(e,\"valuemin\",t)},t.setAriaValueNow=function(e,t){r(e,\"valuenow\",t)},t.setAriaValueText=function(e,t){r(e,\"valuetext\",t)}},825(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.VanillaFrameWorkOverrider=void 0;var n=function(){function e(){this.renderingEngine=\"vanilla\"}return e.prototype.frameworkComponent=function(e,t){return null},e.prototype.isFrameworkComponent=function(e){return!1},e}();t.VanillaFrameWorkOverrider=n},970(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.UserComponentRegistry=void 0;var u=n(589),l=n(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.defaultComp={},t.jsComponents={},t}return o(t,e),t.prototype.registerDefaultComponent=function(e,t){this.defaultComp[e]||(this.defaultComp[e]=t)},t.prototype.registerJSComponent=function(e,t){this.jsComponents[e]=t},t.prototype.retrieve=function(e){var t=function(e,t){return{componentFrameWork:t,component:e}},n=this.getFrameWorkOverrides().frameworkComponent(e,this.userComponent);if(null!=n)return t(n,!0);var r=this.jsComponents[e];if(r)return t(r,this.getFrameWorkOverrides().isFrameworkComponent(r));var o=this.defaultComp[e];return o?t(o,!1):null},i([(0,u.Bean)(l.BEAN_NAME.USER_COMPONENT_REGISTRY)],t)}(n(284).EventEmitter);t.UserComponentRegistry=c}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var n=o[e]={exports:{}};return r[e].call(n.exports,n,n.exports,i),n.exports}var a={};(()=>{var e=a;Object.defineProperty(e,\"__esModule\",{value:!0}),e.setAriaPressed=e.setAriaPosInSet=e.setAriaPlaceHolder=e.setAriaOrientation=e.setAriaMultiSelectable=e.setAriaMultiLine=e.setAriaModal=e.setAriaLive=e.setAriaLevel=e.setAriaLabelledBy=e.setAriaLabel=e.setAriaKeyShortCuts=e.setAriaInvalid=e.setAriaHidden=e.setAriaHasPopUp=e.setAriaFlowTo=e.setAriaExpanded=e.setAriaErrorMessage=e.setAriaDisabled=e.setAriaDetails=e.setAriaDescription=e.setAriaDescribedBy=e.setAriaCurrent=e.setAriaControls=e.setAriaColSpan=e.setAriaColIndexText=e.setAriaColIndex=e.setAriaColCount=e.setAriaChecked=e.setAriaBusy=e.setAriaBrailleroledescription=e.setAriaBraillelabel=e.setAriaAutocomplete=e.setAriaAtomic=e.setAriaActiveDescendant=e.setAriaRole=e.removeAriaAttribute=e.addAriaAttribute=e.toggleAriaAttribute=e.ariaAttributeName=e.values=e.traverseObject=e.toStringOrNull=e.exists=e.createArrayOfNumbers=e.queryAssignedNodes=e.getFunctionName=e.QuerySelector=e.Components=e.Context=void 0,e.BaseComponentWrapper=e.ComponentUtility=e.ComponentMetadataProvider=e.EventHandler=e.addSafePassiveEventListener=e.EventEmitter=e.BEAN_NAME=e.UserComponentRegistry=e.UserComponentHandler=e.ComponentsRegistry=e.Component=e.getElementSize=e.getElementRectWithOffset=e.getElementRectWithMargin=e.getAbsoluteHeight=e.getAbsoluteWidth=e.removeFromParent=e.addTemplate=e.setFixedHeight=e.insertWithDomOrder=e.ensureDomOrder=e.addOrRemoveAttribute=e.formatSize=e.setFixedWidth=e.setElementWidth=e.clearElement=e.isNodeOrHTMLElement=e.forEachAttributeInNamedNodeMap=e.toggleAttribute=e.forEachAttributeInMap=e.cloneNodeList=e.forEachNodeInList=e.setDisabled=e.setVisible=e.setDisplayed=e.setAriaValueText=e.setAriaValueNow=e.setAriaValueMin=e.setAriaValueMax=e.setAriaSort=e.setAriaSetSize=e.setAriaSelected=e.setAriaRowSpan=e.setAriaRowIndexText=e.setAriaRowIndex=e.setAriaRowCount=e.setAriaRoleDescription=e.setAriaRequired=e.setAriaRelevant=e.setAriaReadOnly=void 0,e.BeanDependencyType=e.AttributeAnnotationTargetType=e.BeanDefinitionSymbol=e.makeRegisterAnnotation=e.makeMethodParameterAnnotation=e.makeMethodAttributeAnnotation=e._preinitAttributeAnnotationsForMethod=e._getBeanDefinition=e._getAttributeAnnotationsForMethod=e.WireFunction=e.PreDestroy=e.PreConstruct=e.PostConstruct=e.Optional=e.Bean=e.AutoWired=e.Qualifier=e.VanillaFrameWorkOverrider=void 0;var t=i(631);Object.defineProperty(e,\"Context\",{enumerable:!0,get:function(){return t.Context}});var n=i(350);Object.defineProperty(e,\"Components\",{enumerable:!0,get:function(){return n.Components}}),Object.defineProperty(e,\"QuerySelector\",{enumerable:!0,get:function(){return n.QuerySelector}}),Object.defineProperty(e,\"getFunctionName\",{enumerable:!0,get:function(){return n.getFunctionName}}),Object.defineProperty(e,\"queryAssignedNodes\",{enumerable:!0,get:function(){return n.queryAssignedNodes}});var r=i(363);Object.defineProperty(e,\"createArrayOfNumbers\",{enumerable:!0,get:function(){return r.createArrayOfNumbers}}),Object.defineProperty(e,\"exists\",{enumerable:!0,get:function(){return r.exists}}),Object.defineProperty(e,\"toStringOrNull\",{enumerable:!0,get:function(){return r.toStringOrNull}}),Object.defineProperty(e,\"traverseObject\",{enumerable:!0,get:function(){return r.traverseObject}}),Object.defineProperty(e,\"values\",{enumerable:!0,get:function(){return r.values}});var o=i(777);Object.defineProperty(e,\"ariaAttributeName\",{enumerable:!0,get:function(){return o.ariaAttributeName}}),Object.defineProperty(e,\"toggleAriaAttribute\",{enumerable:!0,get:function(){return o.toggleAriaAttribute}}),Object.defineProperty(e,\"addAriaAttribute\",{enumerable:!0,get:function(){return o.addAriaAttribute}}),Object.defineProperty(e,\"removeAriaAttribute\",{enumerable:!0,get:function(){return o.removeAriaAttribute}}),Object.defineProperty(e,\"setAriaRole\",{enumerable:!0,get:function(){return o.setAriaRole}}),Object.defineProperty(e,\"setAriaActiveDescendant\",{enumerable:!0,get:function(){return o.setAriaActiveDescendant}}),Object.defineProperty(e,\"setAriaAtomic\",{enumerable:!0,get:function(){return o.setAriaAtomic}}),Object.defineProperty(e,\"setAriaAutocomplete\",{enumerable:!0,get:function(){return o.setAriaAutocomplete}}),Object.defineProperty(e,\"setAriaBraillelabel\",{enumerable:!0,get:function(){return o.setAriaBraillelabel}}),Object.defineProperty(e,\"setAriaBrailleroledescription\",{enumerable:!0,get:function(){return o.setAriaBrailleroledescription}}),Object.defineProperty(e,\"setAriaBusy\",{enumerable:!0,get:function(){return o.setAriaBusy}}),Object.defineProperty(e,\"setAriaChecked\",{enumerable:!0,get:function(){return o.setAriaChecked}}),Object.defineProperty(e,\"setAriaColCount\",{enumerable:!0,get:function(){return o.setAriaColCount}}),Object.defineProperty(e,\"setAriaColIndex\",{enumerable:!0,get:function(){return o.setAriaColIndex}}),Object.defineProperty(e,\"setAriaColIndexText\",{enumerable:!0,get:function(){return o.setAriaColIndexText}}),Object.defineProperty(e,\"setAriaColSpan\",{enumerable:!0,get:function(){return o.setAriaColSpan}}),Object.defineProperty(e,\"setAriaControls\",{enumerable:!0,get:function(){return o.setAriaControls}}),Object.defineProperty(e,\"setAriaCurrent\",{enumerable:!0,get:function(){return o.setAriaCurrent}}),Object.defineProperty(e,\"setAriaDescribedBy\",{enumerable:!0,get:function(){return o.setAriaDescribedBy}}),Object.defineProperty(e,\"setAriaDescription\",{enumerable:!0,get:function(){return o.setAriaDescription}}),Object.defineProperty(e,\"setAriaDetails\",{enumerable:!0,get:function(){return o.setAriaDetails}}),Object.defineProperty(e,\"setAriaDisabled\",{enumerable:!0,get:function(){return o.setAriaDisabled}}),Object.defineProperty(e,\"setAriaErrorMessage\",{enumerable:!0,get:function(){return o.setAriaErrorMessage}}),Object.defineProperty(e,\"setAriaExpanded\",{enumerable:!0,get:function(){return o.setAriaExpanded}}),Object.defineProperty(e,\"setAriaFlowTo\",{enumerable:!0,get:function(){return o.setAriaFlowTo}}),Object.defineProperty(e,\"setAriaHasPopUp\",{enumerable:!0,get:function(){return o.setAriaHasPopUp}}),Object.defineProperty(e,\"setAriaHidden\",{enumerable:!0,get:function(){return o.setAriaHidden}}),Object.defineProperty(e,\"setAriaInvalid\",{enumerable:!0,get:function(){return o.setAriaInvalid}}),Object.defineProperty(e,\"setAriaKeyShortCuts\",{enumerable:!0,get:function(){return o.setAriaKeyShortCuts}}),Object.defineProperty(e,\"setAriaLabel\",{enumerable:!0,get:function(){return o.setAriaLabel}}),Object.defineProperty(e,\"setAriaLabelledBy\",{enumerable:!0,get:function(){return o.setAriaLabelledBy}}),Object.defineProperty(e,\"setAriaLevel\",{enumerable:!0,get:function(){return o.setAriaLevel}}),Object.defineProperty(e,\"setAriaLive\",{enumerable:!0,get:function(){return o.setAriaLive}}),Object.defineProperty(e,\"setAriaModal\",{enumerable:!0,get:function(){return o.setAriaModal}}),Object.defineProperty(e,\"setAriaMultiLine\",{enumerable:!0,get:function(){return o.setAriaMultiLine}}),Object.defineProperty(e,\"setAriaMultiSelectable\",{enumerable:!0,get:function(){return o.setAriaMultiSelectable}}),Object.defineProperty(e,\"setAriaOrientation\",{enumerable:!0,get:function(){return o.setAriaOrientation}}),Object.defineProperty(e,\"setAriaPlaceHolder\",{enumerable:!0,get:function(){return o.setAriaPlaceHolder}}),Object.defineProperty(e,\"setAriaPosInSet\",{enumerable:!0,get:function(){return o.setAriaPosInSet}}),Object.defineProperty(e,\"setAriaPressed\",{enumerable:!0,get:function(){return o.setAriaPressed}}),Object.defineProperty(e,\"setAriaReadOnly\",{enumerable:!0,get:function(){return o.setAriaReadOnly}}),Object.defineProperty(e,\"setAriaRelevant\",{enumerable:!0,get:function(){return o.setAriaRelevant}}),Object.defineProperty(e,\"setAriaRequired\",{enumerable:!0,get:function(){return o.setAriaRequired}}),Object.defineProperty(e,\"setAriaRoleDescription\",{enumerable:!0,get:function(){return o.setAriaRoleDescription}}),Object.defineProperty(e,\"setAriaRowCount\",{enumerable:!0,get:function(){return o.setAriaRowCount}}),Object.defineProperty(e,\"setAriaRowIndex\",{enumerable:!0,get:function(){return o.setAriaRowIndex}}),Object.defineProperty(e,\"setAriaRowIndexText\",{enumerable:!0,get:function(){return o.setAriaRowIndexText}}),Object.defineProperty(e,\"setAriaRowSpan\",{enumerable:!0,get:function(){return o.setAriaRowSpan}}),Object.defineProperty(e,\"setAriaSelected\",{enumerable:!0,get:function(){return o.setAriaSelected}}),Object.defineProperty(e,\"setAriaSetSize\",{enumerable:!0,get:function(){return o.setAriaSetSize}}),Object.defineProperty(e,\"setAriaSort\",{enumerable:!0,get:function(){return o.setAriaSort}}),Object.defineProperty(e,\"setAriaValueMax\",{enumerable:!0,get:function(){return o.setAriaValueMax}}),Object.defineProperty(e,\"setAriaValueMin\",{enumerable:!0,get:function(){return o.setAriaValueMin}}),Object.defineProperty(e,\"setAriaValueNow\",{enumerable:!0,get:function(){return o.setAriaValueNow}}),Object.defineProperty(e,\"setAriaValueText\",{enumerable:!0,get:function(){return o.setAriaValueText}});var s=i(682);Object.defineProperty(e,\"setDisplayed\",{enumerable:!0,get:function(){return s.setDisplayed}}),Object.defineProperty(e,\"setVisible\",{enumerable:!0,get:function(){return s.setVisible}}),Object.defineProperty(e,\"setDisabled\",{enumerable:!0,get:function(){return s.setDisabled}}),Object.defineProperty(e,\"forEachNodeInList\",{enumerable:!0,get:function(){return s.forEachNodeInList}}),Object.defineProperty(e,\"cloneNodeList\",{enumerable:!0,get:function(){return s.cloneNodeList}}),Object.defineProperty(e,\"forEachAttributeInMap\",{enumerable:!0,get:function(){return s.forEachAttributeInMap}}),Object.defineProperty(e,\"toggleAttribute\",{enumerable:!0,get:function(){return s.toggleAttribute}}),Object.defineProperty(e,\"forEachAttributeInNamedNodeMap\",{enumerable:!0,get:function(){return s.forEachAttributeInNamedNodeMap}}),Object.defineProperty(e,\"isNodeOrHTMLElement\",{enumerable:!0,get:function(){return s.isNodeOrHTMLElement}}),Object.defineProperty(e,\"clearElement\",{enumerable:!0,get:function(){return s.clearElement}}),Object.defineProperty(e,\"setElementWidth\",{enumerable:!0,get:function(){return s.setElementWidth}}),Object.defineProperty(e,\"setFixedWidth\",{enumerable:!0,get:function(){return s.setFixedWidth}}),Object.defineProperty(e,\"formatSize\",{enumerable:!0,get:function(){return s.formatSize}}),Object.defineProperty(e,\"addOrRemoveAttribute\",{enumerable:!0,get:function(){return s.addOrRemoveAttribute}}),Object.defineProperty(e,\"ensureDomOrder\",{enumerable:!0,get:function(){return s.ensureDomOrder}}),Object.defineProperty(e,\"insertWithDomOrder\",{enumerable:!0,get:function(){return s.insertWithDomOrder}}),Object.defineProperty(e,\"setFixedHeight\",{enumerable:!0,get:function(){return s.setFixedHeight}}),Object.defineProperty(e,\"addTemplate\",{enumerable:!0,get:function(){return s.addTemplate}}),Object.defineProperty(e,\"removeFromParent\",{enumerable:!0,get:function(){return s.removeFromParent}}),Object.defineProperty(e,\"getAbsoluteWidth\",{enumerable:!0,get:function(){return s.getAbsoluteWidth}}),Object.defineProperty(e,\"getAbsoluteHeight\",{enumerable:!0,get:function(){return s.getAbsoluteHeight}}),Object.defineProperty(e,\"getElementRectWithMargin\",{enumerable:!0,get:function(){return s.getElementRectWithMargin}}),Object.defineProperty(e,\"getElementRectWithOffset\",{enumerable:!0,get:function(){return s.getElementRectWithOffset}}),Object.defineProperty(e,\"getElementSize\",{enumerable:!0,get:function(){return s.getElementSize}});var u=i(283);Object.defineProperty(e,\"Component\",{enumerable:!0,get:function(){return u.Component}});var l=i(688);Object.defineProperty(e,\"ComponentsRegistry\",{enumerable:!0,get:function(){return l.ComponentsRegistry}});var c=i(388);Object.defineProperty(e,\"UserComponentHandler\",{enumerable:!0,get:function(){return c.UserComponentHandler}});var p=i(970);Object.defineProperty(e,\"UserComponentRegistry\",{enumerable:!0,get:function(){return p.UserComponentRegistry}});var d=i(693);Object.defineProperty(e,\"BEAN_NAME\",{enumerable:!0,get:function(){return d.BEAN_NAME}});var f=i(284);Object.defineProperty(e,\"EventEmitter\",{enumerable:!0,get:function(){return f.EventEmitter}}),Object.defineProperty(e,\"addSafePassiveEventListener\",{enumerable:!0,get:function(){return f.addSafePassiveEventListener}});var h=i(642);Object.defineProperty(e,\"EventHandler\",{enumerable:!0,get:function(){return h.EventHandler}});var m=i(408);Object.defineProperty(e,\"ComponentMetadataProvider\",{enumerable:!0,get:function(){return m.ComponentMetadataProvider}});var y=i(530);Object.defineProperty(e,\"ComponentUtility\",{enumerable:!0,get:function(){return y.ComponentUtility}});var g=i(661);Object.defineProperty(e,\"BaseComponentWrapper\",{enumerable:!0,get:function(){return g.BaseComponentWrapper}});var A=i(825);Object.defineProperty(e,\"VanillaFrameWorkOverrider\",{enumerable:!0,get:function(){return A.VanillaFrameWorkOverrider}});var v=i(589);Object.defineProperty(e,\"Qualifier\",{enumerable:!0,get:function(){return v.Qualifier}}),Object.defineProperty(e,\"AutoWired\",{enumerable:!0,get:function(){return v.AutoWired}}),Object.defineProperty(e,\"Bean\",{enumerable:!0,get:function(){return v.Bean}}),Object.defineProperty(e,\"Optional\",{enumerable:!0,get:function(){return v.Optional}}),Object.defineProperty(e,\"PostConstruct\",{enumerable:!0,get:function(){return v.PostConstruct}}),Object.defineProperty(e,\"PreConstruct\",{enumerable:!0,get:function(){return v.PreConstruct}}),Object.defineProperty(e,\"PreDestroy\",{enumerable:!0,get:function(){return v.PreDestroy}}),Object.defineProperty(e,\"WireFunction\",{enumerable:!0,get:function(){return v.WireFunction}}),Object.defineProperty(e,\"_getAttributeAnnotationsForMethod\",{enumerable:!0,get:function(){return v._getAttributeAnnotationsForMethod}}),Object.defineProperty(e,\"_getBeanDefinition\",{enumerable:!0,get:function(){return v._getBeanDefinition}}),Object.defineProperty(e,\"_preinitAttributeAnnotationsForMethod\",{enumerable:!0,get:function(){return v._preinitAttributeAnnotationsForMethod}}),Object.defineProperty(e,\"makeMethodAttributeAnnotation\",{enumerable:!0,get:function(){return v.makeMethodAttributeAnnotation}}),Object.defineProperty(e,\"makeMethodParameterAnnotation\",{enumerable:!0,get:function(){return v.makeMethodParameterAnnotation}}),Object.defineProperty(e,\"makeRegisterAnnotation\",{enumerable:!0,get:function(){return v.makeRegisterAnnotation}}),Object.defineProperty(e,\"BeanDefinitionSymbol\",{enumerable:!0,get:function(){return v.BeanDefinitionSymbol}});var b=i(11);Object.defineProperty(e,\"AttributeAnnotationTargetType\",{enumerable:!0,get:function(){return b.AttributeAnnotationTargetType}}),Object.defineProperty(e,\"BeanDependencyType\",{enumerable:!0,get:function(){return b.BeanDependencyType}})})();const s=a.AttributeAnnotationTargetType,u=a.AutoWired,l=a.BEAN_NAME,c=a.BaseComponentWrapper,p=a.Bean,d=a.BeanDefinitionSymbol,f=a.BeanDependencyType,h=a.Component,m=a.ComponentMetadataProvider,y=a.ComponentUtility,g=a.Components,A=a.ComponentsRegistry,v=a.Context,b=a.EventEmitter,C=a.EventHandler,M=a.Optional,E=a.PostConstruct,O=a.PreConstruct,P=a.PreDestroy,_=a.Qualifier,N=a.QuerySelector,I=a.UserComponentHandler,x=a.UserComponentRegistry,T=a.VanillaFrameWorkOverrider,S=a.WireFunction,R=a.__esModule,j=a._getAttributeAnnotationsForMethod,D=a._getBeanDefinition,B=a._preinitAttributeAnnotationsForMethod,w=a.addAriaAttribute,H=a.addOrRemoveAttribute,L=a.addSafePassiveEventListener,F=a.addTemplate,W=a.ariaAttributeName,U=a.clearElement,G=a.cloneNodeList,k=a.createArrayOfNumbers,X=a.ensureDomOrder,V=a.exists,Y=a.forEachAttributeInMap,z=a.forEachAttributeInNamedNodeMap,q=a.forEachNodeInList,K=a.formatSize,Q=a.getAbsoluteHeight,Z=a.getAbsoluteWidth,J=a.getElementRectWithMargin,$=a.getElementRectWithOffset,ee=a.getElementSize,te=a.getFunctionName,ne=a.insertWithDomOrder,re=a.isNodeOrHTMLElement,oe=a.makeMethodAttributeAnnotation,ie=a.makeMethodParameterAnnotation,ae=a.makeRegisterAnnotation,se=a.queryAssignedNodes,ue=a.removeAriaAttribute,le=a.removeFromParent,ce=a.setAriaActiveDescendant,pe=a.setAriaAtomic,de=a.setAriaAutocomplete,fe=a.setAriaBraillelabel,he=a.setAriaBrailleroledescription,me=a.setAriaBusy,ye=a.setAriaChecked,ge=a.setAriaColCount,Ae=a.setAriaColIndex,ve=a.setAriaColIndexText,be=a.setAriaColSpan,Ce=a.setAriaControls,Me=a.setAriaCurrent,Ee=a.setAriaDescribedBy,Oe=a.setAriaDescription,Pe=a.setAriaDetails,_e=a.setAriaDisabled,Ne=a.setAriaErrorMessage,Ie=a.setAriaExpanded,xe=a.setAriaFlowTo,Te=a.setAriaHasPopUp,Se=a.setAriaHidden,Re=a.setAriaInvalid,je=a.setAriaKeyShortCuts,De=a.setAriaLabel,Be=a.setAriaLabelledBy,we=a.setAriaLevel,He=a.setAriaLive,Le=a.setAriaModal,Fe=a.setAriaMultiLine,We=a.setAriaMultiSelectable,Ue=a.setAriaOrientation,Ge=a.setAriaPlaceHolder,ke=a.setAriaPosInSet,Xe=a.setAriaPressed,Ve=a.setAriaReadOnly,Ye=a.setAriaRelevant,ze=a.setAriaRequired,qe=a.setAriaRole,Ke=a.setAriaRoleDescription,Qe=a.setAriaRowCount,Ze=a.setAriaRowIndex,Je=a.setAriaRowIndexText,$e=a.setAriaRowSpan,et=a.setAriaSelected,tt=a.setAriaSetSize,nt=a.setAriaSort,rt=a.setAriaValueMax,ot=a.setAriaValueMin,it=a.setAriaValueNow,at=a.setAriaValueText,st=a.setDisabled,ut=a.setDisplayed,lt=a.setElementWidth,ct=a.setFixedHeight,pt=a.setFixedWidth,dt=a.setVisible,ft=a.toStringOrNull,ht=a.toggleAriaAttribute,mt=a.toggleAttribute,yt=a.traverseObject,gt=a.values},834(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__assign||function(){return i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},i.apply(this,arguments)},a=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ContextMenuUserComponentHandler=void 0;var s=n(825),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.getItemRendererDetails=function(e,t){return this.getComponentDetails(e,\"itemRenderer\",t,\"itemRenderer\")},t.prototype.getComponentDetails=function(e,t,n,r){var o=this,i=this.getComponentMeta(e,t,n),a=i.componentName,u=i.frameworkComponent,l=i.jsComponent,c=function(e){var t=o.getBeanInstanceByBeanName(s.BEAN_NAME.USER_COMPONENT_REGISTRY).retrieve(e);t&&(l=t.componentFrameWork?void 0:t.component,u=t.componentFrameWork?t.component:void 0)};if(null!=a&&c(a),null==l&&null==u&&null!=r&&c(r),l||u){var p=null==l,d=l||u,f=this.getMergeParams(e,t,n);return{componentFramework:p,componentClass:d,params:f,propertyName:t,newInstance:function(){return o.newInstance(d,p,t,f)}}}},t.prototype.getComponentMeta=function(e,t,n){var r=this,o=null,i=null,a=null;return function(e){if(\"string\"==typeof e)o=e;else if(null!=e&&!0!==e){r.getFrameWorkOverrides().isFrameworkComponent(e)?a=e:i=e}}(this.getComponent(e,t)),{componentName:o,frameworkComponent:a,jsComponent:i}},t.prototype.getComponent=function(e,t){if(\"itemRenderer\"===t)return e.getRenderer()},t.prototype.newInstance=function(e,t,n,r){var o,i=this.getBeanInstanceByBeanName(s.BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER),a=this.getBeanInstanceByBeanName(s.BEAN_NAME.COMPONENT_META_DATA_PROVIDER);if(t){var u=a.retrieve(n);o=i.wrap(e,u.mandatoryMethodList,u.optionalMethodList)}else o=new e;var l=this.initComponent(o,r);return null==l?Promise.resolve(o):l.then(function(){return o})},t.prototype.initComponent=function(e,t){if(this.context.createBean(e),null!=e.init)return e.init(t)},t.prototype.getMergeParams=function(e,t,n){return i(i({},n),this.getUserParams(e,t,n))},t.prototype.getUserParams=function(e,t,n){return\"itemRenderer\"===t?this.getUserRendererParams(e,n):{}},t.prototype.getUserRendererParams=function(e,t){var n=e.getRendererParams(),r={};return\"function\"==typeof n?r=n(t):\"object\"==typeof n&&(r=n),r},a([(0,s.AutoWired)(s.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstanceByBeanName\",void 0),t=a([(0,s.Bean)(s.BEAN_NAME.USER_COMPONENT_HANDLER)],t)}(s.UserComponentHandler);t.ContextMenuUserComponentHandler=u},838(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MenuModelAPI=void 0;var u=n(825),l=n(681),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.menuState=!1,t}return o(t,e),t.prototype.addItemBefore=function(e,t){this.getBeanInstanceByBeanName(l.CONTEXT_MENU_BEAN_NAME.MENU_MODEL).addItemBefore(e,t)},t.prototype.addItem=function(e,t){this.getBeanInstanceByBeanName(l.CONTEXT_MENU_BEAN_NAME.MENU_MODEL).addItem(e,t)},t.prototype.addItemAfter=function(e,t){this.getBeanInstanceByBeanName(l.CONTEXT_MENU_BEAN_NAME.MENU_MODEL).addItemAfter(e,t)},t.prototype.open=function(e,t){var n=this.menuModel.getContextMenu(),r=this.menuModel.getID();this.contextMenuEventhandler.open(n,r)},t.prototype.close=function(){var e=this.menuModel.getID();this.contextMenuEventhandler.close(e)},t.prototype.isMenuPresent=function(){var e=this.menuModel.getID();return this.menuModel.getMenuState(e)},t.prototype.destroyComponent=function(){this.contextMenuEventhandler.destroyComponent()},i([(0,u.AutoWired)(l.CONTEXT_MENU_BEAN_NAME.MENU_MODEL)],t.prototype,\"menuModel\",void 0),i([(0,u.AutoWired)(l.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_EVENT_HANDLER)],t.prototype,\"contextMenuEventhandler\",void 0),i([(0,u.AutoWired)(l.CONTEXT_MENU_BEAN_NAME.NAVIGATION_HANDLER)],t.prototype,\"navigationHandler\",void 0),i([(0,u.AutoWired)(l.CONTEXT_MENU_BEAN_NAME.CONTROLLER)],t.prototype,\"controller\",void 0),i([(0,u.AutoWired)(u.BEAN_NAME.OPTION_HANDLER)],t.prototype,\"optionHandler\",void 0),t=i([(0,u.Bean)(l.CONTEXT_MENU_BEAN_NAME.MENU_MODEL_API)],t)}(u.EventEmitter);t.MenuModelAPI=c},840(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.AbstractPopupHandler=t.DIRECTION=void 0;var u,l=n(748),c=n(887),p=n(681),d=n(825);!function(e){e[e.vertical=0]=\"vertical\",e[e.horizontal=1]=\"horizontal\"}(u||(t.DIRECTION=u={}));var f=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.popupList=[],t.instanceId=0,t}return o(t,e),t.prototype.positionPopupByComponent=function(e){var t=this,n=e.popUpElement,r=e.gapX,o=e.gapY,i=e.keepWithinBounds,a=e.sourceElement,s=e.alignSide,u=void 0===s?\"left\":s,l=e.position,c=void 0===l?\"over\":l,p=a.getBoundingClientRect(),d=this.getParentRect(),f=this.getPopupIndex(n);-1!==f&&(this.popupList[f].alignedToElement=a);this.positionPopup({popUpElement:n,gapX:r,gapY:o,keepWithinBounds:i,updatePosition:function(){var r=p.left-d.left;\"right\"===u&&(r-=n.offsetWidth-p.width);var i=0;\"over\"===c?(i=p.top-d.top,t.setAlignedStyles(n,\"over\")):(i=\"under\"===t.calculatePopupPosition(n,p,d,e.position,e.gapY||0)?p.top-d.top+p.height:p.top-n.offsetHeight-2*(o||0)-d.top,t.setAlignedStyles(n,\"under\"));return{x:r,y:i}}})},t.prototype.positionPopup=function(e){var t,n,r,o=this,i=e.popUpElement,a=e.keepWithinBounds,s=e.updatePosition,l={width:0,height:0};t=s(),n=t.x,r=t.y,i.clientWidth===l.width&&i.clientHeight===l.height||(l.width=i.clientWidth,l.height=i.clientHeight,a&&(n=o.ensureXYBoundaries(i,n,u.horizontal),r=o.ensureXYBoundaries(i,r,u.vertical)),i.style.left=\"\".concat(n,\"px\"),i.style.top=\"\".concat(r,\"px\"))},t.prototype.addPopup=function(e){var t=this,n=this.optionsHandler.getDocument(),r=e.childElement,o=e.ariaLabel,i=e.positionCallback,a=e.anchorToElement,s=e.afterGuiAttached,u=this.getPopupParent();if(!n)return{hideFunction:function(){}};var l=this.getPopupIndex(r);if(-1!==l)return{hideFunction:this.popupList[l].hideFunction};this.initialisePopupPosition(r);var c=this.createPopupWrapper(r,o),p=function(){u&&(u.removeChild(c),t.removePopupFromPopupList(c))};return s&&s({hidePopup:p}),this.popupList.push({element:r,wrapper:c,hideFunction:p,instanceId:this.instanceId++,alignedToElement:a}),i&&i(),{hideFunction:p}},t.prototype.getPopupParent=function(){var e=this.getBeanInstanceByBeanName(p.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_CONTROLLER),t=this.optionsHandler.getPopupParent();return t||e.getContextMenuController().getGui()},t.prototype.setAlignedStyles=function(e,t){var n=this.getPopupIndex(e);if(-1!==n){var r=this.popupList[n].alignedToElement;if(r){[\"above\",\"left\",\"right\",\"under\",\"over\",\"bottomLeft\",\"bottomRight\"].forEach(function(t){r.classList.remove(\"ZG-has-popup-positioned-\".concat(t)),e.classList.remove(\"ZG-popup-positioned-\".concat(t))}),t&&(r.classList.add(\"ZG-has-popup-positioned-\".concat(t)),e.classList.add(\"ZG-popup-positioned-\".concat(t)))}}},t.prototype.getPopupIndex=function(e){return this.popupList.findIndex(function(t){return t.element===e})},t.prototype.initialisePopupPosition=function(e){var t=this.getPopupParent().getBoundingClientRect();e&&(e.style.top=\"\".concat(-1*t.top,\"px\"),e.style.left=\"\".concat(-1*t.left,\"px\"))},t.prototype.calculatePopupPosition=function(e,t,n,r,o){var i=n.bottom-t.bottom,a=t.top-n.top,s=e.offsetHeight+o,u=a>s||a>i;return\"top\"!==r&&\"topLeft\"!==r&&\"topRight\"!==r&&\"default\"!==r||!u?i>s?\"under\":u?\"above\":\"under\":\"above\"},t.prototype.calculateLeftOrRightPopupPosition=function(e,t,n,r,o){var i=n.right-t.right,a=t.left-n.left,s=e.offsetWidth+o,u=a>s||a>i;return\"left\"===r&&u?\"left\":i>s?\"right\":u?\"left\":\"right\"},t.prototype.ensureXYBoundaries=function(e,t,n){var r=n===u.vertical,o=r?\"clientHeight\":\"clientWidth\",i=r?\"top\":\"left\",a=r?\"offsetHeight\":\"offsetWidth\",s=r?\"scrollTop\":\"scrollLeft\",c=this.optionsHandler.getDocument(),p=c.documentElement,d=this.getPopupParent(),f=d.getBoundingClientRect(),h=c.documentElement.getBoundingClientRect(),m=d===c.body,y=e[a],g=r?l.getAbsoluteHeight:l.getAbsoluteWidth,A=m?g(p)+p[s]:d[o];m&&(A-=Math.abs(h[i]-f[i]));var v=A-y;return Math.min(Math.max(t,0),Math.abs(v))},t.prototype.getParentRect=function(){var e=this.optionsHandler.getDocument(),t=this.getPopupParent();return t===e.body?t=e.documentElement:this.isPopUpElementIsStatic(t)&&(t=t.offsetParent),(0,l.getElementRectWithOffset)(t)},t.prototype.isPopUpElementIsStatic=function(e){return\"static\"===getComputedStyle(e).position},t.prototype.createPopupWrapper=function(e,t){var n=this.getPopupParent(),r=document.createElement(\"div\");return r.classList.add(\"ZG-popup\"),e.classList.add(this.optionsHandler.isRTL()?\"ZG-rtl\":\"ZG-ltr\",\"ZG-popup-child\"),e.hasAttribute(\"role\")||(0,c.setAriaRole)(e,\"dialog\"),(0,c.setAriaLabel)(e,t),r.appendChild(e),n.appendChild(r),r},t.prototype.removePopupFromPopupList=function(e){this.setAlignedStyles(e,null),this.popupList=this.popupList.filter(function(t){return t.element!==e})},i([(0,d.AutoWired)(d.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstanceByBeanName\",void 0),t=i([(0,d.Bean)(d.BEAN_NAME.POPUP_HANDLER)],t)}(d.EventEmitter);t.AbstractPopupHandler=f},854(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.createOptionsFromInstance=function(e){var t={};return Object.keys(e).forEach(function(n){t[n]=e[n]}),t}},887(e,t){function n(e){return\"aria-\".concat(e)}function r(e,t,n){null==n||\"\"==n?i(e,t):o(e,t,n)}function o(e,t,r){e.setAttribute(n(t),r.toString())}function i(e,t){e.removeAttribute(n(t))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.ariaAttributeName=n,t.toggleAriaAttribute=r,t.addAriaAttribute=o,t.removeAriaAttribute=i,t.setAriaRole=function(e,t){t?e.setAttribute(\"role\",t):e.removeAttribute(\"role\")},t.setAriaActiveDescendant=function(e,t){r(e,\"activedescendant\",t)},t.setAriaAtomic=function(e,t){r(e,\"atomic\",t)},t.setAriaAutocomplete=function(e,t){r(e,\"autocomplete\",t)},t.setAriaBraillelabel=function(e,t){r(e,\"braillelabel\",t)},t.setAriaBrailleroledescription=function(e,t){r(e,\"brailleroledescription\",t)},t.setAriaBusy=function(e,t){r(e,\"busy\",t)},t.setAriaChecked=function(e,t){r(e,\"checked\",t)},t.setAriaColCount=function(e,t){r(e,\"colcount\",t)},t.setAriaColIndex=function(e,t){r(e,\"colindex\",t)},t.setAriaColIndexText=function(e,t){r(e,\"colindextext\",t)},t.setAriaColSpan=function(e,t){r(e,\"colspan\",t)},t.setAriaControls=function(e,t){r(e,\"controls\",t)},t.setAriaCurrent=function(e,t){r(e,\"current\",t)},t.setAriaDescribedBy=function(e,t){r(e,\"describedby\",t)},t.setAriaDescription=function(e,t){r(e,\"description\",t)},t.setAriaDetails=function(e,t){r(e,\"details\",t)},t.setAriaDisabled=function(e,t){r(e,\"disabled\",t)},t.setAriaErrorMessage=function(e,t){r(e,\"errormessage\",t)},t.setAriaExpanded=function(e,t){r(e,\"expanded\",t)},t.setAriaFlowTo=function(e,t){r(e,\"flowto\",t)},t.setAriaHasPopUp=function(e,t){r(e,\"haspopup\",t)},t.setAriaHidden=function(e,t){r(e,\"hidden\",t)},t.setAriaInvalid=function(e,t){r(e,\"invalid\",t)},t.setAriaKeyShortCuts=function(e,t){r(e,\"keyshortcuts\",t)},t.setAriaLabel=function(e,t){r(e,\"label\",t)},t.setAriaLabelledBy=function(e,t){r(e,\"labelledby\",t)},t.setAriaLevel=function(e,t){r(e,\"level\",t)},t.setAriaLive=function(e,t){r(e,\"live\",t)},t.setAriaModal=function(e,t){r(e,\"modal\",t)},t.setAriaMultiLine=function(e,t){r(e,\"multiline\",t)},t.setAriaMultiSelectable=function(e,t){r(e,\"multiselectable\",t)},t.setAriaOrientation=function(e,t){r(e,\"orientation\",t)},t.setAriaPlaceHolder=function(e,t){r(e,\"placeholder\",t)},t.setAriaPosInSet=function(e,t){r(e,\"posinset\",t)},t.setAriaPressed=function(e,t){r(e,\"pressed\",t)},t.setAriaReadOnly=function(e,t){r(e,\"readonly\",t)},t.setAriaRelevant=function(e,t){r(e,\"relevant\",t)},t.setAriaRequired=function(e,t){r(e,\"required\",t)},t.setAriaRoleDescription=function(e,t){r(e,\"roledescription\",t)},t.setAriaRowCount=function(e,t){r(e,\"rowcount\",t)},t.setAriaRowIndex=function(e,t){r(e,\"rowindex\",t)},t.setAriaRowIndexText=function(e,t){r(e,\"rowindextext\",t)},t.setAriaRowSpan=function(e,t){r(e,\"rowspan\",t)},t.setAriaSelected=function(e,t){r(e,\"selected\",t)},t.setAriaSetSize=function(e,t){r(e,\"setsize\",t)},t.setAriaSort=function(e,t){r(e,\"sort\",t)},t.setAriaValueMax=function(e,t){r(e,\"valuemax\",t)},t.setAriaValueMin=function(e,t){r(e,\"valuemin\",t)},t.setAriaValueNow=function(e,t){r(e,\"valuenow\",t)},t.setAriaValueText=function(e,t){r(e,\"valuetext\",t)}},910(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.UID_Generator=void 0;var n=function(){function e(){}return e.generate_parentId=function(){return this.Parentcounter++,\"CM_\".concat(this.Parentcounter)},e.generate_itemID=function(){return this.Itemcounter++,\"MI_\".concat(this.Itemcounter)},e.Parentcounter=0,e.Itemcounter=0,e}();t.UID_Generator=n},944(e,t,n){var r,o=this&&this.__extends||(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),i=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},a=this&&this.__read||function(e,t){var n=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))},u=this&&this.__values||function(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&\"number\"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MenuModel=void 0;var l=n(910),c=n(681),p=n(825),d=n(337),f=n(214),h=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.menuState={},t.Menu=null,t}return o(t,e),t.prototype.getID=function(){return this.Menu?this.Menu.getId():null},t.prototype.clearMenuState=function(){this.menuState={}},t.prototype.getMenuState=function(e){return this.menuState[e]},t.prototype.getFirstChildId=function(e){return this.getChild(e)[0].getId()},t.prototype.isFirstChild=function(e,t){return this.getFirstChildId(e)===t},t.prototype.addItems=function(e){for(var t=void 0===e.id?l.UID_Generator.generate_parentId():e.id,n=[],r=0;r<e.items.length;r++){var o=e.items[r],i=new d.Item(o,t);o.items&&0!=o.items.length&&this.createSubMenu(o,i.getId(),t,i),n.push(i)}var a=new f.Menu(t,n);this.Menu=a,this.dispatchEvent({type:\"EVENT_MENU_UPADTED\"})},t.prototype.createSubMenu=function(e,t,n,r){if(e.items&&0!=e.items.length){for(var o=e.items,i=[],a=0;a<o.length;a++){var s=o[a],u=new d.Item(s,t);this.createSubMenu(s,u.getId(),t,u),i.push(u)}var l=new f.Menu(t,i,n);r.getItems().push(l)}},t.prototype.getContextMenu=function(){return this.Menu},t.prototype.getItems=function(){var e;return null===(e=this.Menu)||void 0===e?void 0:e.getItems()},t.prototype.hasChild=function(e,t){var n,r;if(void 0===t&&(t=this.Menu),!t)return null;if(t.getId()===e&&0!=t.getItems().length)return!0;var o=null==t?void 0:t.getItems();if(o)try{for(var i=u(o),a=i.next();!a.done;a=i.next()){var s=a.value,l=this.hasChild(e,s);if(l)return l}}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return!1},t.prototype.getChild=function(e,t){var n,r;if(void 0===t&&(t=this.Menu),!t)return null;if(t.getId()===e&&0!=t.getItems().length)return t.getItems();var o=null==t?void 0:t.getItems();if(o)try{for(var i=u(o),a=i.next();!a.done;a=i.next()){var s=a.value,l=this.getChild(e,s);if(l)return l}}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return null},t.prototype.getParentId=function(e,t){var n,r;if(void 0===t&&(t=this.Menu),(null==t?void 0:t.getId())===e)return null==t?void 0:t.getParentId();var o=null==t?void 0:t.getItems();if(o)try{for(var i=u(o),a=i.next();!a.done;a=i.next()){var s=a.value,l=this.getParentId(e,s);if(l)return l}}catch(e){n={error:e}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}return null},t.prototype.searchNode=function(e,t){var n,r;if(void 0===t&&(t=this.Menu.getItems()),!this.Menu)return null;if(!t)return null;for(var o=0;o<(null==t?void 0:t.length);o++){var i=t[o].getId(),a=t[o];if(i===e)return{index:t.indexOf(a),currentMenu:t}}try{for(var s=u(t),l=s.next();!l.done;l=s.next()){if((a=l.value).hasItems()){var c=a.getItems()[0].getItems(),p=this.searchNode(e,c);if(p)return p}}}catch(e){n={error:e}}finally{try{l&&!l.done&&(r=s.return)&&r.call(s)}finally{if(n)throw n.error}}return null},t.prototype.addItem=function(e,t){if(this.Menu){var n=this.searchNode(e),r=this.getParentId(e),o=0,i=[],a=this.Menu.getItems().length;n&&(o=a,i=n.currentMenu);var s=new d.Item(t,r);i.splice(o,0,s);var u=this.Menu,l=this.getID();this.menuState[l]&&(this.controller.getContextMenuController().destroy(),this.menuState[l]=!1,this.eventHandlers.menuState[l]=!1),this.eventHandlers.createContextMenuController(u,l)}},t.prototype.addItemBefore=function(e,t){var n=this.searchNode(e),r=this.getParentId(e),o=0,i=[];n&&(0===n.index?(o=n.index,i=n.currentMenu):(o=n.index-1,i=n.currentMenu));var a=new d.Item(t,r);i.splice(o,0,a);var s=this.Menu,u=this.getID();this.controller.getContextMenuController().destroy(),this.controller.getContextMenuController().destroyMenu(this.getID()),this.menuState[u]&&(this.controller.getContextMenuController().destroy(),this.menuState[u]=!1,this.eventHandlers.menuState[u]=!1),this.eventHandlers.createContextMenuController(s,u)},t.prototype.addItemAfter=function(e,t){var n=this.searchNode(e),r=this.getParentId(e),o=0,i=[];n&&(o=n.index+1,i=n.currentMenu);var a=new d.Item(t,r);i.splice(o,0,a);var s=this.Menu,u=this.getID();this.menuState[u]&&(this.controller.getContextMenuController().destroy(),this.menuState[u]=!1,this.eventHandlers.menuState[u]=!1),this.eventHandlers.createContextMenuController(s,u)},t.prototype.isRoot=function(e){return e===this.getID()},t.prototype.isNavigatable=function(e){var t=this.searchNode(e),n=t.currentMenu,r=n[t.index].isSeparatorforfocus(),o=n[t.index].isDisabled(),i=n[t.index].isGroupName(),a=this.optionsHandler.getBeforeItemRenderer(e);return!(r||o||i||a)},i([(0,p.AutoWired)(c.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_CONTROLLER)],t.prototype,\"controller\",void 0),i([(0,p.AutoWired)(c.CONTEXT_MENU_BEAN_NAME.CONTEXT_MENU_EVENT_HANDLER)],t.prototype,\"eventHandlers\",void 0),t=i([(0,p.Bean)(c.CONTEXT_MENU_BEAN_NAME.MENU_MODEL)],t)}(p.EventEmitter);t.MenuModel=h}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})};var r={};(()=>{var e=r;Object.defineProperty(e,\"__esModule\",{value:!0}),e.forEachAttributeInMap=e.exists=e.ensureDomOrder=e.createArrayOfNumbers=e.cloneNodeList=e.clearElement=e.ariaAttributeName=e.addTemplate=e.addSafePassiveEventListener=e.addOrRemoveAttribute=e.addAriaAttribute=e.VanillaFrameWorkOverrider=e.UserComponentRegistry=e.UserComponentHandler=e.QuerySelector=e.EventHandler=e.EventEmitter=e.Context=e.ComponentsRegistry=e.Components=e.ComponentUtility=e.ComponentMetadataProvider=e.Component=e.BaseComponentWrapper=e.BEAN_NAME=e.CONTEXT_MENU_BEAN_NAME=e.Item=e.Menu=e.MenuModel=e.UID_Generator=e.ContextMenuComponent=e.ItemComponent=e.itemElement=e.MenuComponent=e.ContextMenuNavigationHandler=e.NAVIGATION_KEY=e.ContextMenuController=e.MenuController=e.Controller=e.ItemController=e.ContextMenuComponentMetadataProvider=e.ContextMenuUserComponentHandler=e.PopupHandler=e.OptionHandler=e.ContextMenuEventHandler=e.AbstractPopupHandler=e.DIRECTION=e.NavigationHandler=e.createOptionsFromInstance=e.ContextMenu=void 0,e.setAriaReadOnly=e.setAriaPressed=e.setAriaPosInSet=e.setAriaPlaceHolder=e.setAriaOrientation=e.setAriaMultiSelectable=e.setAriaMultiLine=e.setAriaModal=e.setAriaLive=e.setAriaLevel=e.setAriaLabelledBy=e.setAriaLabel=e.setAriaKeyShortCuts=e.setAriaInvalid=e.setAriaHidden=e.setAriaHasPopUp=e.setAriaFlowTo=e.setAriaExpanded=e.setAriaErrorMessage=e.setAriaDisabled=e.setAriaDetails=e.setAriaDescription=e.setAriaDescribedBy=e.setAriaCurrent=e.setAriaControls=e.setAriaColSpan=e.setAriaColIndexText=e.setAriaColIndex=e.setAriaColCount=e.setAriaChecked=e.setAriaBusy=e.setAriaBrailleroledescription=e.setAriaBraillelabel=e.setAriaAutocomplete=e.setAriaAtomic=e.setAriaActiveDescendant=e.removeFromParent=e.removeAriaAttribute=e.queryAssignedNodes=e.isNodeOrHTMLElement=e.insertWithDomOrder=e.getFunctionName=e.getElementSize=e.getElementRectWithOffset=e.getElementRectWithMargin=e.getAbsoluteWidth=e.getAbsoluteHeight=e.formatSize=e.forEachNodeInList=e.forEachAttributeInNamedNodeMap=void 0,e.makeRegisterAnnotation=e.makeMethodParameterAnnotation=e.makeMethodAttributeAnnotation=e._preinitAttributeAnnotationsForMethod=e._getBeanDefinition=e._getAttributeAnnotationsForMethod=e.WireFunction=e.Qualifier=e.PreDestroy=e.PreConstruct=e.PostConstruct=e.Optional=e.BeanDependencyType=e.BeanDefinitionSymbol=e.Bean=e.AutoWired=e.AttributeAnnotationTargetType=e.values=e.traverseObject=e.toggleAttribute=e.toggleAriaAttribute=e.toStringOrNull=e.setVisible=e.setFixedWidth=e.setFixedHeight=e.setElementWidth=e.setDisplayed=e.setDisabled=e.setAriaValueText=e.setAriaValueNow=e.setAriaValueMin=e.setAriaValueMax=e.setAriaSort=e.setAriaSetSize=e.setAriaSelected=e.setAriaRowSpan=e.setAriaRowIndexText=e.setAriaRowIndex=e.setAriaRowCount=e.setAriaRoleDescription=e.setAriaRole=e.setAriaRequired=e.setAriaRelevant=void 0;var t=n(752);Object.defineProperty(e,\"ContextMenu\",{enumerable:!0,get:function(){return t.ContextMenu}});var o=n(854);Object.defineProperty(e,\"createOptionsFromInstance\",{enumerable:!0,get:function(){return o.createOptionsFromInstance}});var i=n(563);Object.defineProperty(e,\"NavigationHandler\",{enumerable:!0,get:function(){return i.NavigationHandler}});var a=n(840);Object.defineProperty(e,\"DIRECTION\",{enumerable:!0,get:function(){return a.DIRECTION}}),Object.defineProperty(e,\"AbstractPopupHandler\",{enumerable:!0,get:function(){return a.AbstractPopupHandler}});var s=n(549);Object.defineProperty(e,\"ContextMenuEventHandler\",{enumerable:!0,get:function(){return s.ContextMenuEventHandler}});var u=n(125);Object.defineProperty(e,\"OptionHandler\",{enumerable:!0,get:function(){return u.OptionHandler}});var l=n(350);Object.defineProperty(e,\"PopupHandler\",{enumerable:!0,get:function(){return l.PopupHandler}});var c=n(834);Object.defineProperty(e,\"ContextMenuUserComponentHandler\",{enumerable:!0,get:function(){return c.ContextMenuUserComponentHandler}});var p=n(782);Object.defineProperty(e,\"ContextMenuComponentMetadataProvider\",{enumerable:!0,get:function(){return p.ContextMenuComponentMetadataProvider}});var d=n(22);Object.defineProperty(e,\"ItemController\",{enumerable:!0,get:function(){return d.ItemController}});var f=n(92);Object.defineProperty(e,\"Controller\",{enumerable:!0,get:function(){return f.Controller}});var h=n(406);Object.defineProperty(e,\"MenuController\",{enumerable:!0,get:function(){return h.MenuController}});var m=n(686);Object.defineProperty(e,\"ContextMenuController\",{enumerable:!0,get:function(){return m.ContextMenuController}});var y=n(164);Object.defineProperty(e,\"NAVIGATION_KEY\",{enumerable:!0,get:function(){return y.NAVIGATION_KEY}});var g=n(698);Object.defineProperty(e,\"ContextMenuNavigationHandler\",{enumerable:!0,get:function(){return g.ContextMenuNavigationHandler}});var A=n(622);Object.defineProperty(e,\"MenuComponent\",{enumerable:!0,get:function(){return A.MenuComponent}});var v=n(289);Object.defineProperty(e,\"itemElement\",{enumerable:!0,get:function(){return v.itemElement}});var b=n(510);Object.defineProperty(e,\"ItemComponent\",{enumerable:!0,get:function(){return b.ItemComponent}});var C=n(205);Object.defineProperty(e,\"ContextMenuComponent\",{enumerable:!0,get:function(){return C.ContextMenuComponent}});var M=n(910);Object.defineProperty(e,\"UID_Generator\",{enumerable:!0,get:function(){return M.UID_Generator}});var E=n(944);Object.defineProperty(e,\"MenuModel\",{enumerable:!0,get:function(){return E.MenuModel}});var O=n(214);Object.defineProperty(e,\"Menu\",{enumerable:!0,get:function(){return O.Menu}});var P=n(337);Object.defineProperty(e,\"Item\",{enumerable:!0,get:function(){return P.Item}});var _=n(681);Object.defineProperty(e,\"CONTEXT_MENU_BEAN_NAME\",{enumerable:!0,get:function(){return _.CONTEXT_MENU_BEAN_NAME}}),n(308),n(284);var N=n(825);Object.defineProperty(e,\"BEAN_NAME\",{enumerable:!0,get:function(){return N.BEAN_NAME}}),Object.defineProperty(e,\"BaseComponentWrapper\",{enumerable:!0,get:function(){return N.BaseComponentWrapper}}),Object.defineProperty(e,\"Component\",{enumerable:!0,get:function(){return N.Component}}),Object.defineProperty(e,\"ComponentMetadataProvider\",{enumerable:!0,get:function(){return N.ComponentMetadataProvider}}),Object.defineProperty(e,\"ComponentUtility\",{enumerable:!0,get:function(){return N.ComponentUtility}}),Object.defineProperty(e,\"Components\",{enumerable:!0,get:function(){return N.Components}}),Object.defineProperty(e,\"ComponentsRegistry\",{enumerable:!0,get:function(){return N.ComponentsRegistry}}),Object.defineProperty(e,\"Context\",{enumerable:!0,get:function(){return N.Context}}),Object.defineProperty(e,\"EventEmitter\",{enumerable:!0,get:function(){return N.EventEmitter}}),Object.defineProperty(e,\"EventHandler\",{enumerable:!0,get:function(){return N.EventHandler}}),Object.defineProperty(e,\"QuerySelector\",{enumerable:!0,get:function(){return N.QuerySelector}}),Object.defineProperty(e,\"UserComponentHandler\",{enumerable:!0,get:function(){return N.UserComponentHandler}}),Object.defineProperty(e,\"UserComponentRegistry\",{enumerable:!0,get:function(){return N.UserComponentRegistry}}),Object.defineProperty(e,\"VanillaFrameWorkOverrider\",{enumerable:!0,get:function(){return N.VanillaFrameWorkOverrider}}),Object.defineProperty(e,\"addAriaAttribute\",{enumerable:!0,get:function(){return N.addAriaAttribute}}),Object.defineProperty(e,\"addOrRemoveAttribute\",{enumerable:!0,get:function(){return N.addOrRemoveAttribute}}),Object.defineProperty(e,\"addSafePassiveEventListener\",{enumerable:!0,get:function(){return N.addSafePassiveEventListener}}),Object.defineProperty(e,\"addTemplate\",{enumerable:!0,get:function(){return N.addTemplate}}),Object.defineProperty(e,\"ariaAttributeName\",{enumerable:!0,get:function(){return N.ariaAttributeName}}),Object.defineProperty(e,\"clearElement\",{enumerable:!0,get:function(){return N.clearElement}}),Object.defineProperty(e,\"cloneNodeList\",{enumerable:!0,get:function(){return N.cloneNodeList}}),Object.defineProperty(e,\"createArrayOfNumbers\",{enumerable:!0,get:function(){return N.createArrayOfNumbers}}),Object.defineProperty(e,\"ensureDomOrder\",{enumerable:!0,get:function(){return N.ensureDomOrder}}),Object.defineProperty(e,\"exists\",{enumerable:!0,get:function(){return N.exists}}),Object.defineProperty(e,\"forEachAttributeInMap\",{enumerable:!0,get:function(){return N.forEachAttributeInMap}}),Object.defineProperty(e,\"forEachAttributeInNamedNodeMap\",{enumerable:!0,get:function(){return N.forEachAttributeInNamedNodeMap}}),Object.defineProperty(e,\"forEachNodeInList\",{enumerable:!0,get:function(){return N.forEachNodeInList}}),Object.defineProperty(e,\"formatSize\",{enumerable:!0,get:function(){return N.formatSize}}),Object.defineProperty(e,\"getAbsoluteHeight\",{enumerable:!0,get:function(){return N.getAbsoluteHeight}}),Object.defineProperty(e,\"getAbsoluteWidth\",{enumerable:!0,get:function(){return N.getAbsoluteWidth}}),Object.defineProperty(e,\"getElementRectWithMargin\",{enumerable:!0,get:function(){return N.getElementRectWithMargin}}),Object.defineProperty(e,\"getElementRectWithOffset\",{enumerable:!0,get:function(){return N.getElementRectWithOffset}}),Object.defineProperty(e,\"getElementSize\",{enumerable:!0,get:function(){return N.getElementSize}}),Object.defineProperty(e,\"getFunctionName\",{enumerable:!0,get:function(){return N.getFunctionName}}),Object.defineProperty(e,\"insertWithDomOrder\",{enumerable:!0,get:function(){return N.insertWithDomOrder}}),Object.defineProperty(e,\"isNodeOrHTMLElement\",{enumerable:!0,get:function(){return N.isNodeOrHTMLElement}}),Object.defineProperty(e,\"queryAssignedNodes\",{enumerable:!0,get:function(){return N.queryAssignedNodes}}),Object.defineProperty(e,\"removeAriaAttribute\",{enumerable:!0,get:function(){return N.removeAriaAttribute}}),Object.defineProperty(e,\"removeFromParent\",{enumerable:!0,get:function(){return N.removeFromParent}}),Object.defineProperty(e,\"setAriaActiveDescendant\",{enumerable:!0,get:function(){return N.setAriaActiveDescendant}}),Object.defineProperty(e,\"setAriaAtomic\",{enumerable:!0,get:function(){return N.setAriaAtomic}}),Object.defineProperty(e,\"setAriaAutocomplete\",{enumerable:!0,get:function(){return N.setAriaAutocomplete}}),Object.defineProperty(e,\"setAriaBraillelabel\",{enumerable:!0,get:function(){return N.setAriaBraillelabel}}),Object.defineProperty(e,\"setAriaBrailleroledescription\",{enumerable:!0,get:function(){return N.setAriaBrailleroledescription}}),Object.defineProperty(e,\"setAriaBusy\",{enumerable:!0,get:function(){return N.setAriaBusy}}),Object.defineProperty(e,\"setAriaChecked\",{enumerable:!0,get:function(){return N.setAriaChecked}}),Object.defineProperty(e,\"setAriaColCount\",{enumerable:!0,get:function(){return N.setAriaColCount}}),Object.defineProperty(e,\"setAriaColIndex\",{enumerable:!0,get:function(){return N.setAriaColIndex}}),Object.defineProperty(e,\"setAriaColIndexText\",{enumerable:!0,get:function(){return N.setAriaColIndexText}}),Object.defineProperty(e,\"setAriaColSpan\",{enumerable:!0,get:function(){return N.setAriaColSpan}}),Object.defineProperty(e,\"setAriaControls\",{enumerable:!0,get:function(){return N.setAriaControls}}),Object.defineProperty(e,\"setAriaCurrent\",{enumerable:!0,get:function(){return N.setAriaCurrent}}),Object.defineProperty(e,\"setAriaDescribedBy\",{enumerable:!0,get:function(){return N.setAriaDescribedBy}}),Object.defineProperty(e,\"setAriaDescription\",{enumerable:!0,get:function(){return N.setAriaDescription}}),Object.defineProperty(e,\"setAriaDetails\",{enumerable:!0,get:function(){return N.setAriaDetails}}),Object.defineProperty(e,\"setAriaDisabled\",{enumerable:!0,get:function(){return N.setAriaDisabled}}),Object.defineProperty(e,\"setAriaErrorMessage\",{enumerable:!0,get:function(){return N.setAriaErrorMessage}}),Object.defineProperty(e,\"setAriaExpanded\",{enumerable:!0,get:function(){return N.setAriaExpanded}}),Object.defineProperty(e,\"setAriaFlowTo\",{enumerable:!0,get:function(){return N.setAriaFlowTo}}),Object.defineProperty(e,\"setAriaHasPopUp\",{enumerable:!0,get:function(){return N.setAriaHasPopUp}}),Object.defineProperty(e,\"setAriaHidden\",{enumerable:!0,get:function(){return N.setAriaHidden}}),Object.defineProperty(e,\"setAriaInvalid\",{enumerable:!0,get:function(){return N.setAriaInvalid}}),Object.defineProperty(e,\"setAriaKeyShortCuts\",{enumerable:!0,get:function(){return N.setAriaKeyShortCuts}}),Object.defineProperty(e,\"setAriaLabel\",{enumerable:!0,get:function(){return N.setAriaLabel}}),Object.defineProperty(e,\"setAriaLabelledBy\",{enumerable:!0,get:function(){return N.setAriaLabelledBy}}),Object.defineProperty(e,\"setAriaLevel\",{enumerable:!0,get:function(){return N.setAriaLevel}}),Object.defineProperty(e,\"setAriaLive\",{enumerable:!0,get:function(){return N.setAriaLive}}),Object.defineProperty(e,\"setAriaModal\",{enumerable:!0,get:function(){return N.setAriaModal}}),Object.defineProperty(e,\"setAriaMultiLine\",{enumerable:!0,get:function(){return N.setAriaMultiLine}}),Object.defineProperty(e,\"setAriaMultiSelectable\",{enumerable:!0,get:function(){return N.setAriaMultiSelectable}}),Object.defineProperty(e,\"setAriaOrientation\",{enumerable:!0,get:function(){return N.setAriaOrientation}}),Object.defineProperty(e,\"setAriaPlaceHolder\",{enumerable:!0,get:function(){return N.setAriaPlaceHolder}}),Object.defineProperty(e,\"setAriaPosInSet\",{enumerable:!0,get:function(){return N.setAriaPosInSet}}),Object.defineProperty(e,\"setAriaPressed\",{enumerable:!0,get:function(){return N.setAriaPressed}}),Object.defineProperty(e,\"setAriaReadOnly\",{enumerable:!0,get:function(){return N.setAriaReadOnly}}),Object.defineProperty(e,\"setAriaRelevant\",{enumerable:!0,get:function(){return N.setAriaRelevant}}),Object.defineProperty(e,\"setAriaRequired\",{enumerable:!0,get:function(){return N.setAriaRequired}}),Object.defineProperty(e,\"setAriaRole\",{enumerable:!0,get:function(){return N.setAriaRole}}),Object.defineProperty(e,\"setAriaRoleDescription\",{enumerable:!0,get:function(){return N.setAriaRoleDescription}}),Object.defineProperty(e,\"setAriaRowCount\",{enumerable:!0,get:function(){return N.setAriaRowCount}}),Object.defineProperty(e,\"setAriaRowIndex\",{enumerable:!0,get:function(){return N.setAriaRowIndex}}),Object.defineProperty(e,\"setAriaRowIndexText\",{enumerable:!0,get:function(){return N.setAriaRowIndexText}}),Object.defineProperty(e,\"setAriaRowSpan\",{enumerable:!0,get:function(){return N.setAriaRowSpan}}),Object.defineProperty(e,\"setAriaSelected\",{enumerable:!0,get:function(){return N.setAriaSelected}}),Object.defineProperty(e,\"setAriaSetSize\",{enumerable:!0,get:function(){return N.setAriaSetSize}}),Object.defineProperty(e,\"setAriaSort\",{enumerable:!0,get:function(){return N.setAriaSort}}),Object.defineProperty(e,\"setAriaValueMax\",{enumerable:!0,get:function(){return N.setAriaValueMax}}),Object.defineProperty(e,\"setAriaValueMin\",{enumerable:!0,get:function(){return N.setAriaValueMin}}),Object.defineProperty(e,\"setAriaValueNow\",{enumerable:!0,get:function(){return N.setAriaValueNow}}),Object.defineProperty(e,\"setAriaValueText\",{enumerable:!0,get:function(){return N.setAriaValueText}}),Object.defineProperty(e,\"setDisabled\",{enumerable:!0,get:function(){return N.setDisabled}}),Object.defineProperty(e,\"setDisplayed\",{enumerable:!0,get:function(){return N.setDisplayed}}),Object.defineProperty(e,\"setElementWidth\",{enumerable:!0,get:function(){return N.setElementWidth}}),Object.defineProperty(e,\"setFixedHeight\",{enumerable:!0,get:function(){return N.setFixedHeight}}),Object.defineProperty(e,\"setFixedWidth\",{enumerable:!0,get:function(){return N.setFixedWidth}}),Object.defineProperty(e,\"setVisible\",{enumerable:!0,get:function(){return N.setVisible}}),Object.defineProperty(e,\"toStringOrNull\",{enumerable:!0,get:function(){return N.toStringOrNull}}),Object.defineProperty(e,\"toggleAriaAttribute\",{enumerable:!0,get:function(){return N.toggleAriaAttribute}}),Object.defineProperty(e,\"toggleAttribute\",{enumerable:!0,get:function(){return N.toggleAttribute}}),Object.defineProperty(e,\"traverseObject\",{enumerable:!0,get:function(){return N.traverseObject}}),Object.defineProperty(e,\"values\",{enumerable:!0,get:function(){return N.values}}),Object.defineProperty(e,\"AttributeAnnotationTargetType\",{enumerable:!0,get:function(){return N.AttributeAnnotationTargetType}}),Object.defineProperty(e,\"AutoWired\",{enumerable:!0,get:function(){return N.AutoWired}}),Object.defineProperty(e,\"Bean\",{enumerable:!0,get:function(){return N.Bean}}),Object.defineProperty(e,\"BeanDefinitionSymbol\",{enumerable:!0,get:function(){return N.BeanDefinitionSymbol}}),Object.defineProperty(e,\"BeanDependencyType\",{enumerable:!0,get:function(){return N.BeanDependencyType}}),Object.defineProperty(e,\"Optional\",{enumerable:!0,get:function(){return N.Optional}}),Object.defineProperty(e,\"PostConstruct\",{enumerable:!0,get:function(){return N.PostConstruct}}),Object.defineProperty(e,\"PreConstruct\",{enumerable:!0,get:function(){return N.PreConstruct}}),Object.defineProperty(e,\"PreDestroy\",{enumerable:!0,get:function(){return N.PreDestroy}}),Object.defineProperty(e,\"Qualifier\",{enumerable:!0,get:function(){return N.Qualifier}}),Object.defineProperty(e,\"WireFunction\",{enumerable:!0,get:function(){return N.WireFunction}}),Object.defineProperty(e,\"_getAttributeAnnotationsForMethod\",{enumerable:!0,get:function(){return N._getAttributeAnnotationsForMethod}}),Object.defineProperty(e,\"_getBeanDefinition\",{enumerable:!0,get:function(){return N._getBeanDefinition}}),Object.defineProperty(e,\"_preinitAttributeAnnotationsForMethod\",{enumerable:!0,get:function(){return N._preinitAttributeAnnotationsForMethod}}),Object.defineProperty(e,\"makeMethodAttributeAnnotation\",{enumerable:!0,get:function(){return N.makeMethodAttributeAnnotation}}),Object.defineProperty(e,\"makeMethodParameterAnnotation\",{enumerable:!0,get:function(){return N.makeMethodParameterAnnotation}}),Object.defineProperty(e,\"makeRegisterAnnotation\",{enumerable:!0,get:function(){return N.makeRegisterAnnotation}})})();const o=r.AbstractPopupHandler,i=r.AttributeAnnotationTargetType,a=r.AutoWired,s=r.BEAN_NAME,u=r.BaseComponentWrapper,l=r.Bean,c=r.BeanDefinitionSymbol,p=r.BeanDependencyType,d=r.CONTEXT_MENU_BEAN_NAME,f=r.Component,h=r.ComponentMetadataProvider,m=r.ComponentUtility,y=r.Components,g=r.ComponentsRegistry,A=r.Context,v=r.ContextMenu,b=r.ContextMenuComponent,C=r.ContextMenuComponentMetadataProvider,M=r.ContextMenuController,E=r.ContextMenuEventHandler,O=r.ContextMenuNavigationHandler,P=r.ContextMenuUserComponentHandler,_=r.Controller,N=r.DIRECTION,I=r.EventEmitter,x=r.EventHandler,T=r.Item,S=r.ItemComponent,R=r.ItemController,j=r.Menu,D=r.MenuComponent,B=r.MenuController,w=r.MenuModel,H=r.NAVIGATION_KEY,L=r.NavigationHandler,F=r.OptionHandler,W=r.Optional,U=r.PopupHandler,G=r.PostConstruct,k=r.PreConstruct,X=r.PreDestroy,V=r.Qualifier,Y=r.QuerySelector,z=r.UID_Generator,q=r.UserComponentHandler,K=r.UserComponentRegistry,Q=r.VanillaFrameWorkOverrider,Z=r.WireFunction,J=r.__esModule,$=r._getAttributeAnnotationsForMethod,ee=r._getBeanDefinition,te=r._preinitAttributeAnnotationsForMethod,ne=r.addAriaAttribute,re=r.addOrRemoveAttribute,oe=r.addSafePassiveEventListener,ie=r.addTemplate,ae=r.ariaAttributeName,se=r.clearElement,ue=r.cloneNodeList,le=r.createArrayOfNumbers,ce=r.createOptionsFromInstance,pe=r.ensureDomOrder,de=r.exists,fe=r.forEachAttributeInMap,he=r.forEachAttributeInNamedNodeMap,me=r.forEachNodeInList,ye=r.formatSize,ge=r.getAbsoluteHeight,Ae=r.getAbsoluteWidth,ve=r.getElementRectWithMargin,be=r.getElementRectWithOffset,Ce=r.getElementSize,Me=r.getFunctionName,Ee=r.insertWithDomOrder,Oe=r.isNodeOrHTMLElement,Pe=r.itemElement,_e=r.makeMethodAttributeAnnotation,Ne=r.makeMethodParameterAnnotation,Ie=r.makeRegisterAnnotation,xe=r.queryAssignedNodes,Te=r.removeAriaAttribute,Se=r.removeFromParent,Re=r.setAriaActiveDescendant,je=r.setAriaAtomic,De=r.setAriaAutocomplete,Be=r.setAriaBraillelabel,we=r.setAriaBrailleroledescription,He=r.setAriaBusy,Le=r.setAriaChecked,Fe=r.setAriaColCount,We=r.setAriaColIndex,Ue=r.setAriaColIndexText,Ge=r.setAriaColSpan,ke=r.setAriaControls,Xe=r.setAriaCurrent,Ve=r.setAriaDescribedBy,Ye=r.setAriaDescription,ze=r.setAriaDetails,qe=r.setAriaDisabled,Ke=r.setAriaErrorMessage,Qe=r.setAriaExpanded,Ze=r.setAriaFlowTo,Je=r.setAriaHasPopUp,$e=r.setAriaHidden,et=r.setAriaInvalid,tt=r.setAriaKeyShortCuts,nt=r.setAriaLabel,rt=r.setAriaLabelledBy,ot=r.setAriaLevel,it=r.setAriaLive,at=r.setAriaModal,st=r.setAriaMultiLine,ut=r.setAriaMultiSelectable,lt=r.setAriaOrientation,ct=r.setAriaPlaceHolder,pt=r.setAriaPosInSet,dt=r.setAriaPressed,ft=r.setAriaReadOnly,ht=r.setAriaRelevant,mt=r.setAriaRequired,yt=r.setAriaRole,gt=r.setAriaRoleDescription,At=r.setAriaRowCount,vt=r.setAriaRowIndex,bt=r.setAriaRowIndexText,Ct=r.setAriaRowSpan,Mt=r.setAriaSelected,Et=r.setAriaSetSize,Ot=r.setAriaSort,Pt=r.setAriaValueMax,_t=r.setAriaValueMin,Nt=r.setAriaValueNow,It=r.setAriaValueText,xt=r.setDisabled,Tt=r.setDisplayed,St=r.setElementWidth,Rt=r.setFixedHeight,jt=r.setFixedWidth,Dt=r.setVisible,Bt=r.toStringOrNull,wt=r.toggleAriaAttribute,Ht=r.toggleAttribute,Lt=r.traverseObject,Ft=r.values;export{o as AbstractPopupHandler,i as AttributeAnnotationTargetType,a as AutoWired,s as BEAN_NAME,u as BaseComponentWrapper,l as Bean,c as BeanDefinitionSymbol,p as BeanDependencyType,d as CONTEXT_MENU_BEAN_NAME,f as Component,h as ComponentMetadataProvider,m as ComponentUtility,y as Components,g as ComponentsRegistry,A as Context,v as ContextMenu,b as ContextMenuComponent,C as ContextMenuComponentMetadataProvider,M as ContextMenuController,E as ContextMenuEventHandler,O as ContextMenuNavigationHandler,P as ContextMenuUserComponentHandler,_ as Controller,N as DIRECTION,I as EventEmitter,x as EventHandler,T as Item,S as ItemComponent,R as ItemController,j as Menu,D as MenuComponent,B as MenuController,w as MenuModel,H as NAVIGATION_KEY,L as NavigationHandler,F as OptionHandler,W as Optional,U as PopupHandler,G as PostConstruct,k as PreConstruct,X as PreDestroy,V as Qualifier,Y as QuerySelector,z as UID_Generator,q as UserComponentHandler,K as UserComponentRegistry,Q as VanillaFrameWorkOverrider,Z as WireFunction,J as __esModule,$ as _getAttributeAnnotationsForMethod,ee as _getBeanDefinition,te as _preinitAttributeAnnotationsForMethod,ne as addAriaAttribute,re as addOrRemoveAttribute,oe as addSafePassiveEventListener,ie as addTemplate,ae as ariaAttributeName,se as clearElement,ue as cloneNodeList,le as createArrayOfNumbers,ce as createOptionsFromInstance,pe as ensureDomOrder,de as exists,fe as forEachAttributeInMap,he as forEachAttributeInNamedNodeMap,me as forEachNodeInList,ye as formatSize,ge as getAbsoluteHeight,Ae as getAbsoluteWidth,ve as getElementRectWithMargin,be as getElementRectWithOffset,Ce as getElementSize,Me as getFunctionName,Ee as insertWithDomOrder,Oe as isNodeOrHTMLElement,Pe as itemElement,_e as makeMethodAttributeAnnotation,Ne as makeMethodParameterAnnotation,Ie as makeRegisterAnnotation,xe as queryAssignedNodes,Te as removeAriaAttribute,Se as removeFromParent,Re as setAriaActiveDescendant,je as setAriaAtomic,De as setAriaAutocomplete,Be as setAriaBraillelabel,we as setAriaBrailleroledescription,He as setAriaBusy,Le as setAriaChecked,Fe as setAriaColCount,We as setAriaColIndex,Ue as setAriaColIndexText,Ge as setAriaColSpan,ke as setAriaControls,Xe as setAriaCurrent,Ve as setAriaDescribedBy,Ye as setAriaDescription,ze as setAriaDetails,qe as setAriaDisabled,Ke as setAriaErrorMessage,Qe as setAriaExpanded,Ze as setAriaFlowTo,Je as setAriaHasPopUp,$e as setAriaHidden,et as setAriaInvalid,tt as setAriaKeyShortCuts,nt as setAriaLabel,rt as setAriaLabelledBy,ot as setAriaLevel,it as setAriaLive,at as setAriaModal,st as setAriaMultiLine,ut as setAriaMultiSelectable,lt as setAriaOrientation,ct as setAriaPlaceHolder,pt as setAriaPosInSet,dt as setAriaPressed,ft as setAriaReadOnly,ht as setAriaRelevant,mt as setAriaRequired,yt as setAriaRole,gt as setAriaRoleDescription,At as setAriaRowCount,vt as setAriaRowIndex,bt as setAriaRowIndexText,Ct as setAriaRowSpan,Mt as setAriaSelected,Et as setAriaSetSize,Ot as setAriaSort,Pt as setAriaValueMax,_t as setAriaValueMin,Nt as setAriaValueNow,It as setAriaValueText,xt as setDisabled,Tt as setDisplayed,St as setElementWidth,Rt as setFixedHeight,jt as setFixedWidth,Dt as setVisible,Bt as toStringOrNull,wt as toggleAriaAttribute,Ht as toggleAttribute,Lt as traverseObject,Ft as values,r as default};","var e={11(e,t){var r,n;Object.defineProperty(t,\"__esModule\",{value:!0}),t.AttributeAnnotationTargetType=t.BeanDependencyType=void 0,function(e){e[e.CONSTRUCTOR=0]=\"CONSTRUCTOR\",e[e.AUTOWIRE=1]=\"AUTOWIRE\"}(r||(t.BeanDependencyType=r={})),function(e){e[e.Class=0]=\"Class\",e[e.Method=1]=\"Method\"}(n||(t.AttributeAnnotationTargetType=n={}))},283(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},a=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Component=void 0;var u=r(693),l=r(284),c=r(350),p=r(682),d=r(589),f=function(e){function t(t){var r=e.call(this)||this;return r.displayed=!0,r.visible=!0,t&&r.setTemplate(t),r}return o(t,e),t.prototype.preConstructMethods=function(){this.createChildComponentsPreConstruct()},t.prototype.createChildComponentsFromTags=function(e,t){var r=this;(0,p.cloneNodeList)(e.childNodes).forEach(function(n){if(n instanceof HTMLElement){var o=r.createComponentFromElement(n,function(e){e.getGui()&&r.copyAttributesFromNode(n,e.getGui())},t);if(o){if(o.addItems&&n.children.length){r.createChildComponentsFromTags(n,t);var i=Array.prototype.slice.call(n.children);o.addItems(i)}r.swapComponentForNode(o,e,n)}else n.childNodes&&r.createChildComponentsFromTags(n,t)}})},t.prototype.createComponentFromElement=function(e,r,n){var o=e.nodeName,i=n?n[e.getAttribute(\"ref\")]:void 0,a=this.componentRegistry.getComponentClass(o);if(a){t.elementGettingCreated=e;var s=new a(i);return s.setParentComponent(this),this.createBean(s,null,r),s}return null},t.prototype.copyAttributesFromNode=function(e,t){(0,p.forEachAttributeInNamedNodeMap)(e.attributes,function(e,r){\"class\"!==e?t.setAttribute(e,r):(r||\"\").split(\" \").forEach(function(e){return t.classList.add(e)})})},t.prototype.swapComponentForNode=function(e,t,r){var n=e.getGui();t.replaceChild(n,r),this.addDestroyFunc(this.destroyBean.bind(this,e)),this.swapInComponentForRefSelectors(e,r)},t.prototype.swapInComponentForRefSelectors=function(e,t){var r=this;this.iterateOverQuerySelectors(function(n){r[n.attributeName]===t&&(r[n.attributeName]=e)})},t.prototype.iterateOverQuerySelectors=function(e){for(var t=Object.getPrototypeOf(this);null!=t;){var r=Reflect.get(t,c.Components.METADATA),n=(0,c.getFunctionName)(t.constructor);if(r&&Reflect.has(r,n)&&Reflect.has(r[n],\"querySelectors\"))r[n].querySelectors.forEach(function(t){return e(t)});t=Object.getPrototypeOf(t)}},t.prototype.createChildComponentsPreConstruct=function(){this.getGui()&&this.createChildComponentsFromTags(this.getGui())},t.prototype.activateTabIndex=function(e){e||(e=[]),e.length||e.push(this.getGui()),e.forEach(function(e){return e.setAttribute(\"tabindex\",(0).toString())})},t.prototype.wireQuerySelectors=function(){var e=this;if(this.eGui){var t=this;this.iterateOverQuerySelectors(function(r){var n=function(e){return t[r.attributeName]=e};if(r.refSelector&&e.getAttribute(\"ref\")===r.refSelector)n(e.eGui);else{var o=e.eGui.querySelector(r.querySelector);o&&n(o.Component||o)}})}},t.prototype.setGui=function(e){this.eGui=e},t.prototype.queryForHtmlElement=function(e){return this.eGui.querySelector(e)},t.prototype.queryForHtmlInputElement=function(e){return this.eGui.querySelector(e)},t.prototype.destroy=function(){this.parentComponent&&(this.parentComponent=void 0),e.prototype.destroy.call(this)},t.prototype.setTemplate=function(e,t){this.setTemplateFromElement(e,t)},t.prototype.setTemplateFromElement=function(e,t){this.eGui=e,this.eGui.Component=this,this.wireQuerySelectors(),this.getContext()&&this.createChildComponentsFromTags(this.getGui(),t)},t.prototype.getGui=function(){return this.eGui},t.prototype.getFocusableElement=function(){return this.eGui},t.prototype.getAriaElement=function(){return this.getFocusableElement()},t.prototype.setParentComponent=function(e){this.parentComponent=e},t.prototype.getParentComponent=function(){return this.parentComponent},t.prototype.appendChild=function(e,t){if(void 0===t&&(t=this.eGui),null!=e)if((0,p.isNodeOrHTMLElement)(e))t.appendChild(e);else{var r=e;t.appendChild(r.getGui())}},t.prototype.isDisplayed=function(){return this.displayed},t.prototype.setVisible=function(e,t){if(void 0===t&&(t={}),e!==this.visible){this.visible=e;var r=t.skipAriaHidden;(0,p.setVisible)(this.eGui,e,{skipAriaHidden:r})}},t.prototype.setDisplayed=function(e,r){if(void 0===r&&(r={}),e!==this.displayed){this.displayed=e;var n=r.skipAriaHidden;(0,p.setDisplayed)(this.eGui,e,{skipAriaHidden:n});var o={type:t.EVENT_DISPLAYED_CHANGED,visible:this.displayed};this.dispatchEvent(o)}},t.prototype.addGuiEventListener=function(e,t,r){var n=this;this.eGui.addEventListener(e,t,r),this.addDestroyFunc(function(){return n.eGui.removeEventListener(e,t)})},t.prototype.addCssClass=function(e){var t,r=this.getGui(),n=(e||\"\").split(\" \");null==r||(t=r.classList).add.apply(t,s([],a(n),!1))},t.prototype.removeCssClass=function(e){var t,r=this.getGui(),n=(e||\"\").split(\" \");null==r||(t=r.classList).remove.apply(t,s([],a(n),!1))},t.prototype.containsCssClass=function(e){var t=this.getGui();return!!t&&t.classList.contains(e)},t.prototype.addOrRemoveCssClass=function(e,t){var r=this;if(e){if(e.indexOf(\" \")>=0){var n=(e||\"\").split(\" \");if(n.length>1)return void n.forEach(function(e){return r.addOrRemoveCssClass(e,t)})}if(e.length){var o=this.getGui();o&&o.classList.toggle(e,t)}}},t.prototype.getAttribute=function(e){var t=this.getGui();return t?t.getAttribute(e):null},t.prototype.getRefElement=function(e){return this.queryForHtmlElement('[ref=\"'.concat(e,'\"]'))},t.EVENT_DISPLAYED_CHANGED=\"displayedChanged\",i([(0,d.AutoWired)(u.BEAN_NAME.COMPONENT_REGISTRY)],t.prototype,\"componentRegistry\",void 0),i([(0,d.PreConstruct)()],t.prototype,\"preConstructMethods\",null),t}(l.EventEmitter);t.Component=f},284(e,t,r){var n=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventEmitter=void 0,t.addSafePassiveEventListener=u;var o=r(589),i=r(693),a=r(642),s=function(){function e(){this.destroyFunctions=[],this.destroyed=!1}return e.prototype.getFrameWorkOverrides=function(){return this.frameWorkOverrides},e.prototype.createBean=function(e,t,r){return t?t.createBean(e):this.getContext().createBean(e),r&&r(e),e},e.prototype.destroyBean=function(e,t){return(t||this.getContext()).destroyBean(e)},e.prototype.destroyBeans=function(e,t){var r=this;return e&&e.forEach(function(e){return r.destroyBean(e,t)}),[]},e.prototype.destroy=function(){this.dispatchEvent({type:e.EVENT_DESTROYED}),this.destroyFunctions.forEach(function(e){return e()}),this.destroyFunctions.length=0,this.destroyed=!0},e.prototype.getContext=function(){return this.context},e.prototype.addEventListener=function(e,t){this.eventHandler||(this.eventHandler=new a.EventHandler),this.eventHandler.addEventListener(e,t)},e.prototype.removeEventListener=function(e,t){this.eventHandler&&this.eventHandler.removeEventListener(e,t)},e.prototype.dispatchEventAsync=function(e){var t=this;window.setTimeout(function(){return t.dispatchEvent(e)},0)},e.prototype.dispatchEvent=function(e){this.eventHandler&&this.eventHandler.dispatchEvent(e)},e.prototype.addListener=function(e,t,r){var n=this;if(!this.destroyed){e instanceof HTMLElement?u(e,t,r):e.addEventListener(t,r);var o=function(){return e.removeEventListener(t,r),null};return this.destroyFunctions.push(o),function(){return o(),n.destroyFunctions=n.destroyFunctions.filter(function(e){return e!==o}),null}}},e.prototype.isAlive=function(){return!this.destroyed},e.prototype.addDestroyFunc=function(e){this.isAlive()?this.destroyFunctions.push(e):e()},e.prototype.createManagedBean=function(e,t){var r=this.createBean(e,t);return this.addDestroyFunc(this.destroyBean.bind(this,e,t)),r},e.EVENT_DESTROYED=\"destroyed\",n([(0,o.AutoWired)(i.BEAN_NAME.EVENT_HANDLER)],e.prototype,\"eventHandler\",void 0),n([(0,o.AutoWired)(i.BEAN_NAME.OPTION_HANDLER)],e.prototype,\"optionsHandler\",void 0),n([(0,o.AutoWired)(i.BEAN_NAME.FRAME_WORK_OVERRIDES)],e.prototype,\"frameWorkOverrides\",void 0),n([(0,o.AutoWired)(\"context\")],e.prototype,\"context\",void 0),e}();function u(e,t,r){e&&e.addEventListener(t,r,void 0)}t.EventEmitter=s},350(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.Components=void 0,t.getFunctionName=n,t.queryAssignedNodes=function(e){return function(t,r,n){o(t,\"querySelectors\",{attributeName:r,querySelector:\"[ref=\".concat(e,\"]\"),refSelector:e})}},t.QuerySelector=function(e){void 0===e&&(e=null);return function(t,r,n){null!==e?\"number\"!=typeof n?o(t,\"querySelectors\",{attributeName:r,querySelector:e,refSelector:void 0}):console.error(\"QuerySelector should be on an attribute\"):console.error(\"QuerySelector should not be null\")}};var r={METADATA:\"COMPONENT_META_DATA\"};function n(e){if(e.name)return e.name}function o(e,t,o){var i=function(e,t){var n=Reflect.has(e,r.METADATA);n||Reflect.set(e,r.METADATA,{});var o=Reflect.has(e[r.METADATA],t);o||Reflect.set(e[r.METADATA],t,{});return Reflect.get(e[r.METADATA],t)}(e,n(e.constructor));i[t]||(i[t]=[]),i[t].push(o)}t.Components=r},363(e,t){var r=this&&this.__values||function(e){var t=\"function\"==typeof Symbol&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&\"number\"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?\"Object is not iterable.\":\"Symbol.iterator is not defined.\")},n=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.values=function(e){if(e instanceof Set||e instanceof Map){var t=[];return e.forEach(function(e){return t.push(e)}),t}return Object.values(e)},t.exists=function(e,t){void 0===t&&(t=!1);return null!=e&&(\"\"!==e||t)},t.toStringOrNull=function(e){return null!=e&&\"function\"==typeof e.toString?e.toString():null},t.createArrayOfNumbers=function(e,t){for(var r=[],n=e;n<=t;n++)r.push(n);return r},t.traverseObject=function(e,t){var o,i;if(null==e)return;if(Array.isArray(e)){for(var a=0;a<e.length;a++)t(a.toString(),e[a]);return}try{for(var s=r(Object.entries(e)),u=s.next();!u.done;u=s.next()){var l=n(u.value,2);t(l[0],l[1])}}catch(e){o={error:e}}finally{try{u&&!u.done&&(i=s.return)&&i.call(s)}finally{if(o)throw o.error}}}},388(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.UserComponentHandler=void 0;var a=r(589),s=r(693),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.getComponentDetails=function(e,t,r,n){var o=this,i=this.getComponentMeta(e,t,r),a=i.componentName,u=i.frameworkComponent,l=i.jsComponent,c=function(e){var t=o.getBeanInstance(s.BEAN_NAME.USER_COMPONENT_REGISTRY).retrieve(e);t&&(l=t.componentFrameWork?void 0:t.component,u=t.componentFrameWork?t.component:void 0)};if(null!=a&&c(a),null==l&&null==u&&null!=n&&c(n),l||u){var p=null==l,d=l||u;return{componentFramework:p,componentClass:d,params:r,propertyName:t,newInstance:function(){return o.newInstance(d,p,t,r)}}}},t.prototype.getComponentMeta=function(e,t,r){var n=this,o=null,i=null,a=null;return function(e){if(\"string\"==typeof e)o=e;else if(null!=e&&!0!==e){n.getFrameWorkOverrides().isFrameworkComponent(e)?a=e:i=e}}(this.getComponent(e,t)),{componentName:o,frameworkComponent:a,jsComponent:i}},t.prototype.getComponent=function(e,t){},t.prototype.newInstance=function(e,t,r,n){var o,i=this.getBeanInstance(s.BEAN_NAME.FRAME_WORK_COMPONENT_WRAPPER),a=this.getBeanInstance(s.BEAN_NAME.COMPONENT_META_DATA_PROVIDER);if(t){var u=a.retrieve(r);o=i.wrap(e,u.mandatoryMethodList,u.optionalMethodList)}else o=new e;return this.initComponent(o,n),o},t.prototype.initComponent=function(e,t){if(this.context.createBean(e),null!=e.init)return e.init(t)},i([(0,a.AutoWired)(s.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstance\",void 0),t=i([(0,a.Bean)(s.BEAN_NAME.USER_COMPONENT_HANDLER)],t)}(r(284).EventEmitter);t.UserComponentHandler=u},408(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},a=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentMetadataProvider=void 0;var u=r(589),l=r(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.componentMetaData={},t}return o(t,e),t.prototype.retrieve=function(e){return this.componentMetaData[e]},i([(0,u.AutoWired)(l.BEAN_NAME.BEANS)],t.prototype,\"getBeanInstanceByBeanName\",void 0),t=i([(0,u.Bean)(l.BEAN_NAME.COMPONENT_META_DATA_PROVIDER)],t)}(r(284).EventEmitter);t.ComponentMetadataProvider=c},530(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentUtility=void 0;var a=r(589),s=r(693),u=r(284),l=r(682),c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t.prototype.adaptFunction=function(e,t){var r=this.componentMetadataProvider.retrieve(e);return r&&r.functionAdapter?r.functionAdapter(t):null},t.prototype.adaptRendererFunction=function(e){return function(){function t(){}return t.prototype.getGui=function(){return this.eGui},t.prototype.init=function(t){var r=e(t),n=typeof r;this.eGui=\"string\"!==n&&\"number\"!==n&&\"boolean\"!==n?null!=r?r:(0,l.addTemplate)(\"<span></span>\"):(0,l.addTemplate)(\"<span>\"+r+\"</span>\")},t}()},t.prototype.doesImplementIComponent=function(e){return!!e&&(e.prototype&&\"getGui\"in e.prototype)},i([(0,a.AutoWired)(s.BEAN_NAME.COMPONENT_META_DATA_PROVIDER)],t.prototype,\"componentMetadataProvider\",void 0),t=i([(0,a.Bean)(s.BEAN_NAME.COMPONENT_UTILITY)],t)}(u.EventEmitter);t.ComponentUtility=c},589(e,t,r){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BeanDefinitionSymbol=void 0,t.Qualifier=function(e){return c({name:e})},t.AutoWired=function(e,t){return a(e,!1,t)},t.Bean=function(e){return s({componentType:\"bean\",beanName:e})},t.Optional=function(e,t){return a(e,!0,t)},t.PostConstruct=function(e){return function(e,t,r){var n,o=i(e,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PostConstructor is can use only to method\");return o.postConstruct&&(o.postConstruct=[]),null===(n=o.postConstruct)||void 0===n||n.push(t),r}},t.PreConstruct=function(e){return function(e,t,r){var n,o=i(e,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PreConstructor is can use only to method\");return o.preConstruct&&(o.preConstruct=[]),null===(n=o.preConstruct)||void 0===n||n.push(t),r}},t.PreDestroy=function(e){return function(e,t,r){var n=i(e,\"prototype\");if(\"function\"!=typeof r.value)throw Error(\"@PreDestroy is can use only to method\");return n.preDestroy||(n.preDestroy=[]),n.preDestroy.push(t),r}},t.WireFunction=a,t._getAttributeAnnotationsForMethod=u,t._getBeanDefinition=i,t._preinitAttributeAnnotationsForMethod=l,t.makeMethodAttributeAnnotation=function(e){return function(e,t,r){var n=u(i(e,\"prototype\"),t);n.targetDescriptor=r,l(n,r)}},t.makeMethodParameterAnnotation=c,t.makeRegisterAnnotation=s;var n=r(11),o=Symbol(\"BeanDefinition\");function i(e,t){var r;if((r=\"class\"===t||\"function\"==typeof e?e:\"prototype\"===t?e.constructor:Object.getPrototypeOf(e)).hasOwnProperty(o))return r[o];var n={uniqueId:Symbol(),className:\"\",beanName:\"\",componentTypes:[],dependencies:[],constructor:null,existInstance:null,preConstruct:[],postConstruct:[],preDestroy:[],attributeAnnotations:[]};return Object.defineProperty(r,o,{value:n,writable:!1}),n}function a(e,t,r){return function(o,a){var s=i(o,\"prototype\"),u=r&&r.lazy||!1;if(r&&r.name)s.dependencies.push({type:n.BeanDependencyType.AUTOWIRE,autowireField:a,autowireLazy:u,beanName:r.name,className:e,optional:t});else{if(\"string\"!=typeof a)throw new Error(\"property name must be string without beanName\");s.dependencies.push({type:n.BeanDependencyType.AUTOWIRE,autowireField:a,autowireLazy:u,beanName:e,className:e,optional:t})}}}function s(e){return function(t){var r=e.beanName||t.name,o=i(t,\"class\");return o.className=t.name,o.beanName=r,o.constructor=t,o.componentTypes.push(e.componentType),o.attributeAnnotations.push({targetType:n.AttributeAnnotationTargetType.Class,targetDescriptor:null}),t}}function u(e,t){var r=e.attributeAnnotations.find(function(e){return e.targetType===n.AttributeAnnotationTargetType.Method&&e.targetPropertyKey===t});return r||(r={targetType:n.AttributeAnnotationTargetType.Method,targetPropertyKey:t,targetDescriptor:void 0,parameters:void 0},e.attributeAnnotations.push(r)),r}function l(e,t){var r=t.value,n=Array(r.length);if(e.targetDescriptor=t,e.parameters){if(e.parameters.length!=r.length)for(var o=0;o<n.length;o++)e.parameters[o]||(e.parameters[o]=void 0)}else e.parameters=n}function c(e){return function(t,r,n){var o=u(i(t,\"prototype\"),r);o.parameters||(o.parameters=[]),o.parameters[n]={index:n,name:e.name}}}t.BeanDefinitionSymbol=o},631(e,t,r){Object.defineProperty(t,\"__esModule\",{value:!0}),t.Context=void 0;var n=r(589),o=r(693),i=r(363);var a=function(){function e(){this.beanWrappers={},this.destroyed=!1}return e.prototype.getBeanInstances=function(){return Object.values(this.beanWrappers)},e.prototype.registerBeanClasses=function(e,t){this.beanClasses=e,this.registerUserContextParams(t),this.createBeans();var r=this.getBeanInstances();this.wireBeans(r)},e.prototype.registerUserContextParams=function(e){this.userConfigurations=null!=e?e:{}},e.prototype.createBean=function(e,t){if(!e)throw Error(\"Can't wire to bean since it is null\");return this.wireBeans([e]),e},e.prototype.createBeans=function(){var e=this;this.beanClasses.forEach(function(t){var r=t[n.BeanDefinitionSymbol];if(r){var o=r.beanName,i=new t;e.beanWrappers[o]=i}})},e.prototype.wireBeans=function(e){this.autoWireBeans(e),this.methodWireBeans(e),this.callLifeCycleMethods(e,\"preConstruct\"),this.callLifeCycleMethods(e,\"postConstruct\")},e.prototype.autoWireBeans=function(e){var t=this;e.forEach(function(e){t.forEachMetaDataInHierarchyBeanDefinition(e,function(r,n){var i=r.dependencies;i&&i.forEach(function(r){if(r.autowireLazy)Object.defineProperty(e,r.autowireField,{get:function(){var e=t.getBeanInstance(n,r.beanName,r.optional);if(r.beanName===o.BEAN_NAME.BEANS&&(e=t.getBeanInstance.bind(t,n)),!e)throw new Error(\"Unknown beanName=\".concat(r.autowireField));return e},configurable:!1});else{var i=void 0;i=r.beanName===o.BEAN_NAME.BEANS?t.getBeanInstance.bind(t,n):t.getBeanInstance(n,r.beanName,r.optional),Object.defineProperty(e,r.autowireField,{value:i,configurable:!!i,writable:!1})}})})})},e.prototype.methodWireBeans=function(e){var t=this;e.forEach(function(e){t.forEachMetaDataInHierarchyBeanDefinition(e,function(r,n){r.attributeAnnotations.forEach(function(r){if(r.targetPropertyKey&&r.parameters){var o=t.getBeansForParameters(r.parameters,n);console.log(o),e[r.targetPropertyKey].apply(e)}})})})},e.prototype.getBeansForParameters=function(e,t){var r=this,n=[];return e&&(0,i.traverseObject)(e,function(e,o){if(o){var i=r.getBeanInstance(t,o.name);n[Number(o.index)]=i}}),n},e.prototype.getBeanInstance=function(e,t,r){if(void 0===r&&(r=!1),this.destroyed)return null;if(t===o.BEAN_NAME.CONTEXT)return n=this,{createBean:function(e){return n.createBean(e)},destroyBean:function(e){return n.destroyBean(e)},destroy:function(){n.destroy()}};var n;if(this.userConfigurations&&this.userConfigurations.hasOwnProperty(t))return this.userConfigurations[t];var i=this.beanWrappers[t];return i||(r||console.error(\"Component: unable to find bean reference \".concat(t,\" while initialising \").concat(e)),null)},e.prototype.callLifeCycleMethods=function(e,t){var r=this;e.forEach(function(e){return r.callLifeCycleMethodsOnBean(e,t)})},e.prototype.callLifeCycleMethodsOnBean=function(e,t,r){var n={};this.forEachMetaDataInHierarchyBeanDefinition(e,function(e){var o=e[t];o&&o.forEach(function(e){e!=r&&(n[e]=!0)})}),Object.keys(n).forEach(function(t){return e[t]()})},e.prototype.forEachMetaDataInHierarchyBeanDefinition=function(e,t){for(var r=Object.getPrototypeOf(e);null!=r;){var o=r.constructor;if(o.hasOwnProperty(n.BeanDefinitionSymbol))t(o[n.BeanDefinitionSymbol],this.getBeanName(o));r=Object.getPrototypeOf(r)}},e.prototype.getBeanName=function(e){if(e[n.BeanDefinitionSymbol]&&e[n.BeanDefinitionSymbol].beanName)return e[n.BeanDefinitionSymbol].beanName;var t=e.toString();return t.substring(9,t.indexOf(\"(\"))},e.prototype.getBean=function(e){return this.getBeanInstance(\"getBean\",e,!0)},e.prototype.destroy=function(){if(!this.destroyed){this.destroyed=!0;var e=this.getBeanInstances();this.destroyBeans(e),this.userConfigurations=null}},e.prototype.destroyBean=function(e){e&&this.destroyBeans([e])},e.prototype.destroyBeans=function(e){var t=this;return e?(e.forEach(function(e){t.callLifeCycleMethodsOnBean(e,\"preDestroy\",\"destroy\");var r=e;\"function\"==typeof r.destroy&&r.destroy()}),[]):[]},e.prototype.isDestroyed=function(){return this.destroyed},e}();t.Context=a},642(e,t,r){var n=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a};Object.defineProperty(t,\"__esModule\",{value:!0}),t.EventHandler=void 0;var o=r(589),i=r(693),a=function(){function e(){this.allSyncListeners=new Map,this.allAsyncListeners=new Map,this.globalSyncListeners=new Set,this.globalAsyncListeners=new Set,this.asyncFunctionsQueue=[],this.scheduled=!1,this.firedEvents={}}return e.prototype.setBeans=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=null),this.optionHandler=e,t){var n=e.useAsyncEvents();this.addGlobalListener(t,n)}r&&this.addGlobalListener(r,!1)},e.prototype.getListeners=function(e,t,r){var n=t?this.allAsyncListeners:this.allSyncListeners,o=n.get(e);return!o&&r&&(o=new Set,n.set(e,o)),o},e.prototype.noRegisteredListenersExist=function(){return 0===this.allSyncListeners.size&&0===this.allAsyncListeners.size&&0===this.globalSyncListeners.size&&0===this.globalAsyncListeners.size},e.prototype.addEventListener=function(e,t,r){void 0===r&&(r=!1),this.getListeners(e,r,!0).add(t)},e.prototype.removeEventListener=function(e,t,r){void 0===r&&(r=!1);var n=this.getListeners(e,r,!1);n&&(n.delete(t),0===n.size&&(r?this.allAsyncListeners:this.allSyncListeners).delete(e))},e.prototype.addGlobalListener=function(e,t){void 0===t&&(t=!1),(t?this.globalAsyncListeners:this.globalSyncListeners).add(e)},e.prototype.removeGlobalListener=function(e,t){void 0===t&&(t=!1),(t?this.globalAsyncListeners:this.globalSyncListeners).delete(e)},e.prototype.dispatchEvent=function(e){var t=e;if(this.optionHandler){var r=this.optionHandler.api;t.api=r}this.dispatchToListeners(t,!0),this.dispatchToListeners(t,!1),this.firedEvents[t.type]=!0},e.prototype.dispatchEventOnce=function(e){this.firedEvents[e.type]||this.dispatchEvent(e)},e.prototype.dispatchToListeners=function(e,t){var r=this,n=e.type,o=new Set(this.getListeners(n,t,!1));o.size>0&&function(n){n.forEach(function(n){t?r.dispatchAsync(function(){return n(e)}):n(e)})}(o),new Set(t?this.globalAsyncListeners:this.globalSyncListeners).forEach(function(o){t?r.dispatchAsync(function(){return o(n,e)}):o(n,e)})},e.prototype.dispatchAsync=function(e){this.asyncFunctionsQueue.push(e),this.scheduled||(window.setTimeout(this.flushAsyncQueue.bind(this),0),this.scheduled=!0)},e.prototype.flushAsyncQueue=function(){this.scheduled=!1;var e=this.asyncFunctionsQueue.slice();this.asyncFunctionsQueue=[],e.forEach(function(e){return e()})},e=n([(0,o.Bean)(i.BEAN_NAME.EVENT_HANDLER)],e)}();t.EventHandler=a},661(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BaseComponentWrapper=void 0;var r=function(){function e(){}return e.prototype.wrap=function(e,t,r){var n=this;void 0===r&&(r=[]);var o=this.createWrapper(e);return t.forEach(function(e){n.createMethod(o,e,!0)}),r.forEach(function(e){n.createMethod(o,e,!1)}),o},e.prototype.createMethod=function(e,t,r){e.addMethod(t,this.createMethodProxy(e,t,r))},e.prototype.createMethodProxy=function(e,t,r){return function(){return e.hasMethod(t)?e.callMethod(t,arguments):(r&&console.warn(\"Framework component is missing the method \".concat(t,\"()\")),null)}},e}();t.BaseComponentWrapper=r},682(e,t,r){Object.defineProperty(t,\"__esModule\",{value:!0}),t.setDisplayed=function(e,t,r){void 0===r&&(r={});var o=r.skipAriaHidden;e.classList.toggle(\"comp-hidden\",!t),o||(0,n.setAriaHidden)(e,!t)},t.setVisible=function(e,t,r){void 0===r&&(r={});var o=r.skipAriaHidden;e.classList.toggle(\"comp-invisible\",!t),o||(0,n.setAriaHidden)(e,!t)},t.setDisabled=function(e,t){var r=\"disabled\",n=t?function(e){return e.setAttribute(r,\"\")}:function(e){return e.removeAttribute(r)};n(e),o(e.querySelectorAll(\"input\"),function(e){return n(e)})},t.forEachNodeInList=o,t.cloneNodeList=function(e){if(null==e)return[];var t=[];return o(e,function(e){return t.push(e)}),t},t.forEachAttributeInMap=function(e,t){if(!e)return;for(var r=0;r<e.length;r++){var n=e[r];t(n.name,n.value)}},t.toggleAttribute=function(e,t,r){null==r?e.removeAttribute(t):e.setAttribute(t,r.toString())},t.forEachAttributeInNamedNodeMap=function(e,t){if(!e)return;for(var r=0;r<e.length;r++){var n=e[r];t(n.name,n.value)}},t.isNodeOrHTMLElement=function(e){return e instanceof Node||e instanceof HTMLElement},t.clearElement=function(e){for(;e&&e.firstChild;)e.removeChild(e.firstChild)},t.setElementWidth=function(e,t){\"flex\"===t?(e.style.removeProperty(\"width\"),e.style.removeProperty(\"minWidth\"),e.style.removeProperty(\"maxWidth\"),e.style.flex=\"1 1 auto\"):i(e,t)},t.setFixedWidth=i,t.formatSize=a,t.addOrRemoveAttribute=function(e,t,r){null==r?e.removeAttribute(t):e.setAttribute(t,r.toString())},t.ensureDomOrder=function(e,t,r){if(r&&r.nextSibling===t)return;r?r.nextSibling?e.insertBefore(t,r.nextSibling):e.appendChild(t):e.firstChild&&e.firstChild!==t&&e.insertAdjacentElement(\"afterbegin\",t)},t.insertWithDomOrder=function(e,t,r){r?r.insertAdjacentElement(\"afterend\",t):e.firstChild?e.insertAdjacentElement(\"afterbegin\",t):e.appendChild(t)},t.setFixedHeight=function(e,t){t=a(t),e.style.height=t.toString(),e.style.maxHeight=t.toString(),e.style.minHeight=t.toString()},t.addTemplate=function(e){var t=document.createElement(\"div\");return t.innerHTML=(e||\"\").trim(),t.firstChild},t.removeFromParent=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)},t.getAbsoluteWidth=function(e){var t=s(e),r=t.marginLeft+t.marginRight;return Math.ceil(e.offsetWidth+r)},t.getAbsoluteHeight=function(e){var t=s(e),r=t.marginBottom+t.marginTop;return Math.ceil(e.offsetHeight+r)},t.getElementRectWithMargin=function(e){var t=e.getBoundingClientRect(),r=s(e),n=r.borderTopWidth,o=r.borderLeftWidth,i=r.borderRightWidth,a=r.borderBottomWidth,u=r.marginTop,l=r.marginBottom,c=r.marginLeft,p=r.marginRight;return{top:t.top+(null!=n?n:0)-(null!=u?u:0),left:t.left+(null!=o?o:0)-(null!=c?c:0),right:t.right+(null!=i?i:0)+(null!=p?p:0),bottom:t.bottom+(null!=a?a:0)+(null!=l?l:0),width:t.width+(null!=o?o:0)+(null!=i?i:0)+(null!=c?c:0)+(null!=p?p:0),height:t.height+(null!=n?n:0)+(null!=a?a:0)+(null!=u?u:0)+(null!=l?l:0),toJSON:function(){return 0},y:t.top+(null!=n?n:0)-(null!=u?u:0),x:t.left+(null!=o?o:0)-(null!=c?c:0)}},t.getElementRectWithOffset=function(e){var t=e.getBoundingClientRect(),r=s(e),n=r.borderTopWidth,o=r.borderLeftWidth,i=r.borderRightWidth,a=r.borderBottomWidth;return{top:t.top+(null!=n?n:0),left:t.left+(null!=o?o:0),right:t.right+(null!=i?i:0),bottom:t.bottom+(null!=a?a:0),width:t.width,height:t.height}},t.getElementSize=s;var n=r(777);function o(e,t){if(null!=e)for(var r=0;r<e.length;r++)t(e[r])}function i(e,t){t=a(t),e.style.width=t.toString(),e.style.maxWidth=t.toString(),e.style.minWidth=t.toString()}function a(e){return\"number\"==typeof e?\"\".concat(e,\"px\"):e}function s(e){var t=window.getComputedStyle(e),r=t.height,n=t.width,o=t.borderTopWidth,i=t.borderRightWidth,a=t.borderBottomWidth,s=t.borderLeftWidth,u=t.paddingTop,l=t.paddingRight,c=t.paddingBottom,p=t.paddingLeft,d=t.marginTop,f=t.marginRight,y=t.marginBottom,A=t.marginLeft,m=t.boxSizing;return{height:parseFloat(r),width:parseFloat(n),borderTopWidth:parseFloat(o),borderRightWidth:parseFloat(i),borderBottomWidth:parseFloat(a),borderLeftWidth:parseFloat(s),paddingTop:parseFloat(u),paddingRight:parseFloat(l),paddingBottom:parseFloat(c),paddingLeft:parseFloat(p),marginTop:parseFloat(d),marginRight:parseFloat(f),marginBottom:parseFloat(y),marginLeft:parseFloat(A),boxSizing:m}}},688(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},a=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ComponentsRegistry=void 0;var u=r(589),l=r(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.componentsMappedByName={},t}return o(t,e),t.prototype.setupComponents=function(e){var t=this;e&&e.forEach(function(e){return t.addComponent(e)})},t.prototype.addComponent=function(e){var t=e.componentName,r=e.componentClass,n=e.template,o=t.toUpperCase();n&&(r.getTemplate=n),this.componentsMappedByName[o]=r},t.prototype.getComponentClass=function(e){return this.componentsMappedByName[e]},t=i([(0,u.Bean)(l.BEAN_NAME.COMPONENT_REGISTRY)],t)}(r(284).EventEmitter);t.ComponentsRegistry=c},693(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.BEAN_NAME=void 0,t.BEAN_NAME={CONTEXT:\"context\",COMPONENT_REGISTRY:\"componentRegistry\",EVENT_HANDLER:\"eventHandler\",USER_COMPONENT_HANDLER:\"userComponentHandler\",POPUP_HANDLER:\"popupHandler\",OPTION_HANDLER:\"optionHandler\",USER_COMPONENT_REGISTRY:\"userComponentRegistry\",COMPONENT_META_DATA_PROVIDER:\"componentMetaDataProvider\",COMPONENT_UTILITY:\"componentUtility\",FRAME_WORK_COMPONENT_WRAPPER:\"frameworkComponentWrapper\",FRAME_WORK_OVERRIDES:\"frameWorkOverrides\",BEANS:\"lookupBeanInstances\"}},777(e,t){function r(e){return\"aria-\".concat(e)}function n(e,t,r){null==r||\"\"==r?i(e,t):o(e,t,r)}function o(e,t,n){e.setAttribute(r(t),n.toString())}function i(e,t){e.removeAttribute(r(t))}Object.defineProperty(t,\"__esModule\",{value:!0}),t.ariaAttributeName=r,t.toggleAriaAttribute=n,t.addAriaAttribute=o,t.removeAriaAttribute=i,t.setAriaRole=function(e,t){t?e.setAttribute(\"role\",t):e.removeAttribute(\"role\")},t.setAriaActiveDescendant=function(e,t){n(e,\"activedescendant\",t)},t.setAriaAtomic=function(e,t){n(e,\"atomic\",t)},t.setAriaAutocomplete=function(e,t){n(e,\"autocomplete\",t)},t.setAriaBraillelabel=function(e,t){n(e,\"braillelabel\",t)},t.setAriaBrailleroledescription=function(e,t){n(e,\"brailleroledescription\",t)},t.setAriaBusy=function(e,t){n(e,\"busy\",t)},t.setAriaChecked=function(e,t){n(e,\"checked\",t)},t.setAriaColCount=function(e,t){n(e,\"colcount\",t)},t.setAriaColIndex=function(e,t){n(e,\"colindex\",t)},t.setAriaColIndexText=function(e,t){n(e,\"colindextext\",t)},t.setAriaColSpan=function(e,t){n(e,\"colspan\",t)},t.setAriaControls=function(e,t){n(e,\"controls\",t)},t.setAriaCurrent=function(e,t){n(e,\"current\",t)},t.setAriaDescribedBy=function(e,t){n(e,\"describedby\",t)},t.setAriaDescription=function(e,t){n(e,\"description\",t)},t.setAriaDetails=function(e,t){n(e,\"details\",t)},t.setAriaDisabled=function(e,t){n(e,\"disabled\",t)},t.setAriaErrorMessage=function(e,t){n(e,\"errormessage\",t)},t.setAriaExpanded=function(e,t){n(e,\"expanded\",t)},t.setAriaFlowTo=function(e,t){n(e,\"flowto\",t)},t.setAriaHasPopUp=function(e,t){n(e,\"haspopup\",t)},t.setAriaHidden=function(e,t){n(e,\"hidden\",t)},t.setAriaInvalid=function(e,t){n(e,\"invalid\",t)},t.setAriaKeyShortCuts=function(e,t){n(e,\"keyshortcuts\",t)},t.setAriaLabel=function(e,t){n(e,\"label\",t)},t.setAriaLabelledBy=function(e,t){n(e,\"labelledby\",t)},t.setAriaLevel=function(e,t){n(e,\"level\",t)},t.setAriaLive=function(e,t){n(e,\"live\",t)},t.setAriaModal=function(e,t){n(e,\"modal\",t)},t.setAriaMultiLine=function(e,t){n(e,\"multiline\",t)},t.setAriaMultiSelectable=function(e,t){n(e,\"multiselectable\",t)},t.setAriaOrientation=function(e,t){n(e,\"orientation\",t)},t.setAriaPlaceHolder=function(e,t){n(e,\"placeholder\",t)},t.setAriaPosInSet=function(e,t){n(e,\"posinset\",t)},t.setAriaPressed=function(e,t){n(e,\"pressed\",t)},t.setAriaReadOnly=function(e,t){n(e,\"readonly\",t)},t.setAriaRelevant=function(e,t){n(e,\"relevant\",t)},t.setAriaRequired=function(e,t){n(e,\"required\",t)},t.setAriaRoleDescription=function(e,t){n(e,\"roledescription\",t)},t.setAriaRowCount=function(e,t){n(e,\"rowcount\",t)},t.setAriaRowIndex=function(e,t){n(e,\"rowindex\",t)},t.setAriaRowIndexText=function(e,t){n(e,\"rowindextext\",t)},t.setAriaRowSpan=function(e,t){n(e,\"rowspan\",t)},t.setAriaSelected=function(e,t){n(e,\"selected\",t)},t.setAriaSetSize=function(e,t){n(e,\"setsize\",t)},t.setAriaSort=function(e,t){n(e,\"sort\",t)},t.setAriaValueMax=function(e,t){n(e,\"valuemax\",t)},t.setAriaValueMin=function(e,t){n(e,\"valuemin\",t)},t.setAriaValueNow=function(e,t){n(e,\"valuenow\",t)},t.setAriaValueText=function(e,t){n(e,\"valuetext\",t)}},825(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.VanillaFrameWorkOverrider=void 0;var r=function(){function e(){this.renderingEngine=\"vanilla\"}return e.prototype.frameworkComponent=function(e,t){return null},e.prototype.isFrameworkComponent=function(e){return!1},e}();t.VanillaFrameWorkOverrider=r},970(e,t,r){var n,o=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},n(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),i=this&&this.__decorate||function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},a=this&&this.__read||function(e,t){var r=\"function\"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,i=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=i.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return a},s=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.UserComponentRegistry=void 0;var u=r(589),l=r(693),c=function(e){function t(){var t=e.apply(this,s([],a(arguments),!1))||this;return t.defaultComp={},t.jsComponents={},t}return o(t,e),t.prototype.registerDefaultComponent=function(e,t){this.defaultComp[e]||(this.defaultComp[e]=t)},t.prototype.registerJSComponent=function(e,t){this.jsComponents[e]=t},t.prototype.retrieve=function(e){var t=function(e,t){return{componentFrameWork:t,component:e}},r=this.getFrameWorkOverrides().frameworkComponent(e,this.userComponent);if(null!=r)return t(r,!0);var n=this.jsComponents[e];if(n)return t(n,this.getFrameWorkOverrides().isFrameworkComponent(n));var o=this.defaultComp[e];return o?t(o,!1):null},t=i([(0,u.Bean)(l.BEAN_NAME.USER_COMPONENT_REGISTRY)],t)}(r(284).EventEmitter);t.UserComponentRegistry=c}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n].call(i.exports,i,i.exports,r),i.exports}var n={};(()=>{var e=n;Object.defineProperty(e,\"__esModule\",{value:!0}),e.setAriaPressed=e.setAriaPosInSet=e.setAriaPlaceHolder=e.setAriaOrientation=e.setAriaMultiSelectable=e.setAriaMultiLine=e.setAriaModal=e.setAriaLive=e.setAriaLevel=e.setAriaLabelledBy=e.setAriaLabel=e.setAriaKeyShortCuts=e.setAriaInvalid=e.setAriaHidden=e.setAriaHasPopUp=e.setAriaFlowTo=e.setAriaExpanded=e.setAriaErrorMessage=e.setAriaDisabled=e.setAriaDetails=e.setAriaDescription=e.setAriaDescribedBy=e.setAriaCurrent=e.setAriaControls=e.setAriaColSpan=e.setAriaColIndexText=e.setAriaColIndex=e.setAriaColCount=e.setAriaChecked=e.setAriaBusy=e.setAriaBrailleroledescription=e.setAriaBraillelabel=e.setAriaAutocomplete=e.setAriaAtomic=e.setAriaActiveDescendant=e.setAriaRole=e.removeAriaAttribute=e.addAriaAttribute=e.toggleAriaAttribute=e.ariaAttributeName=e.values=e.traverseObject=e.toStringOrNull=e.exists=e.createArrayOfNumbers=e.queryAssignedNodes=e.getFunctionName=e.QuerySelector=e.Components=e.Context=void 0,e.BaseComponentWrapper=e.ComponentUtility=e.ComponentMetadataProvider=e.EventHandler=e.addSafePassiveEventListener=e.EventEmitter=e.BEAN_NAME=e.UserComponentRegistry=e.UserComponentHandler=e.ComponentsRegistry=e.Component=e.getElementSize=e.getElementRectWithOffset=e.getElementRectWithMargin=e.getAbsoluteHeight=e.getAbsoluteWidth=e.removeFromParent=e.addTemplate=e.setFixedHeight=e.insertWithDomOrder=e.ensureDomOrder=e.addOrRemoveAttribute=e.formatSize=e.setFixedWidth=e.setElementWidth=e.clearElement=e.isNodeOrHTMLElement=e.forEachAttributeInNamedNodeMap=e.toggleAttribute=e.forEachAttributeInMap=e.cloneNodeList=e.forEachNodeInList=e.setDisabled=e.setVisible=e.setDisplayed=e.setAriaValueText=e.setAriaValueNow=e.setAriaValueMin=e.setAriaValueMax=e.setAriaSort=e.setAriaSetSize=e.setAriaSelected=e.setAriaRowSpan=e.setAriaRowIndexText=e.setAriaRowIndex=e.setAriaRowCount=e.setAriaRoleDescription=e.setAriaRequired=e.setAriaRelevant=e.setAriaReadOnly=void 0,e.BeanDependencyType=e.AttributeAnnotationTargetType=e.BeanDefinitionSymbol=e.makeRegisterAnnotation=e.makeMethodParameterAnnotation=e.makeMethodAttributeAnnotation=e._preinitAttributeAnnotationsForMethod=e._getBeanDefinition=e._getAttributeAnnotationsForMethod=e.WireFunction=e.PreDestroy=e.PreConstruct=e.PostConstruct=e.Optional=e.Bean=e.AutoWired=e.Qualifier=e.VanillaFrameWorkOverrider=void 0;var t=r(631);Object.defineProperty(e,\"Context\",{enumerable:!0,get:function(){return t.Context}});var o=r(350);Object.defineProperty(e,\"Components\",{enumerable:!0,get:function(){return o.Components}}),Object.defineProperty(e,\"QuerySelector\",{enumerable:!0,get:function(){return o.QuerySelector}}),Object.defineProperty(e,\"getFunctionName\",{enumerable:!0,get:function(){return o.getFunctionName}}),Object.defineProperty(e,\"queryAssignedNodes\",{enumerable:!0,get:function(){return o.queryAssignedNodes}});var i=r(363);Object.defineProperty(e,\"createArrayOfNumbers\",{enumerable:!0,get:function(){return i.createArrayOfNumbers}}),Object.defineProperty(e,\"exists\",{enumerable:!0,get:function(){return i.exists}}),Object.defineProperty(e,\"toStringOrNull\",{enumerable:!0,get:function(){return i.toStringOrNull}}),Object.defineProperty(e,\"traverseObject\",{enumerable:!0,get:function(){return i.traverseObject}}),Object.defineProperty(e,\"values\",{enumerable:!0,get:function(){return i.values}});var a=r(777);Object.defineProperty(e,\"ariaAttributeName\",{enumerable:!0,get:function(){return a.ariaAttributeName}}),Object.defineProperty(e,\"toggleAriaAttribute\",{enumerable:!0,get:function(){return a.toggleAriaAttribute}}),Object.defineProperty(e,\"addAriaAttribute\",{enumerable:!0,get:function(){return a.addAriaAttribute}}),Object.defineProperty(e,\"removeAriaAttribute\",{enumerable:!0,get:function(){return a.removeAriaAttribute}}),Object.defineProperty(e,\"setAriaRole\",{enumerable:!0,get:function(){return a.setAriaRole}}),Object.defineProperty(e,\"setAriaActiveDescendant\",{enumerable:!0,get:function(){return a.setAriaActiveDescendant}}),Object.defineProperty(e,\"setAriaAtomic\",{enumerable:!0,get:function(){return a.setAriaAtomic}}),Object.defineProperty(e,\"setAriaAutocomplete\",{enumerable:!0,get:function(){return a.setAriaAutocomplete}}),Object.defineProperty(e,\"setAriaBraillelabel\",{enumerable:!0,get:function(){return a.setAriaBraillelabel}}),Object.defineProperty(e,\"setAriaBrailleroledescription\",{enumerable:!0,get:function(){return a.setAriaBrailleroledescription}}),Object.defineProperty(e,\"setAriaBusy\",{enumerable:!0,get:function(){return a.setAriaBusy}}),Object.defineProperty(e,\"setAriaChecked\",{enumerable:!0,get:function(){return a.setAriaChecked}}),Object.defineProperty(e,\"setAriaColCount\",{enumerable:!0,get:function(){return a.setAriaColCount}}),Object.defineProperty(e,\"setAriaColIndex\",{enumerable:!0,get:function(){return a.setAriaColIndex}}),Object.defineProperty(e,\"setAriaColIndexText\",{enumerable:!0,get:function(){return a.setAriaColIndexText}}),Object.defineProperty(e,\"setAriaColSpan\",{enumerable:!0,get:function(){return a.setAriaColSpan}}),Object.defineProperty(e,\"setAriaControls\",{enumerable:!0,get:function(){return a.setAriaControls}}),Object.defineProperty(e,\"setAriaCurrent\",{enumerable:!0,get:function(){return a.setAriaCurrent}}),Object.defineProperty(e,\"setAriaDescribedBy\",{enumerable:!0,get:function(){return a.setAriaDescribedBy}}),Object.defineProperty(e,\"setAriaDescription\",{enumerable:!0,get:function(){return a.setAriaDescription}}),Object.defineProperty(e,\"setAriaDetails\",{enumerable:!0,get:function(){return a.setAriaDetails}}),Object.defineProperty(e,\"setAriaDisabled\",{enumerable:!0,get:function(){return a.setAriaDisabled}}),Object.defineProperty(e,\"setAriaErrorMessage\",{enumerable:!0,get:function(){return a.setAriaErrorMessage}}),Object.defineProperty(e,\"setAriaExpanded\",{enumerable:!0,get:function(){return a.setAriaExpanded}}),Object.defineProperty(e,\"setAriaFlowTo\",{enumerable:!0,get:function(){return a.setAriaFlowTo}}),Object.defineProperty(e,\"setAriaHasPopUp\",{enumerable:!0,get:function(){return a.setAriaHasPopUp}}),Object.defineProperty(e,\"setAriaHidden\",{enumerable:!0,get:function(){return a.setAriaHidden}}),Object.defineProperty(e,\"setAriaInvalid\",{enumerable:!0,get:function(){return a.setAriaInvalid}}),Object.defineProperty(e,\"setAriaKeyShortCuts\",{enumerable:!0,get:function(){return a.setAriaKeyShortCuts}}),Object.defineProperty(e,\"setAriaLabel\",{enumerable:!0,get:function(){return a.setAriaLabel}}),Object.defineProperty(e,\"setAriaLabelledBy\",{enumerable:!0,get:function(){return a.setAriaLabelledBy}}),Object.defineProperty(e,\"setAriaLevel\",{enumerable:!0,get:function(){return a.setAriaLevel}}),Object.defineProperty(e,\"setAriaLive\",{enumerable:!0,get:function(){return a.setAriaLive}}),Object.defineProperty(e,\"setAriaModal\",{enumerable:!0,get:function(){return a.setAriaModal}}),Object.defineProperty(e,\"setAriaMultiLine\",{enumerable:!0,get:function(){return a.setAriaMultiLine}}),Object.defineProperty(e,\"setAriaMultiSelectable\",{enumerable:!0,get:function(){return a.setAriaMultiSelectable}}),Object.defineProperty(e,\"setAriaOrientation\",{enumerable:!0,get:function(){return a.setAriaOrientation}}),Object.defineProperty(e,\"setAriaPlaceHolder\",{enumerable:!0,get:function(){return a.setAriaPlaceHolder}}),Object.defineProperty(e,\"setAriaPosInSet\",{enumerable:!0,get:function(){return a.setAriaPosInSet}}),Object.defineProperty(e,\"setAriaPressed\",{enumerable:!0,get:function(){return a.setAriaPressed}}),Object.defineProperty(e,\"setAriaReadOnly\",{enumerable:!0,get:function(){return a.setAriaReadOnly}}),Object.defineProperty(e,\"setAriaRelevant\",{enumerable:!0,get:function(){return a.setAriaRelevant}}),Object.defineProperty(e,\"setAriaRequired\",{enumerable:!0,get:function(){return a.setAriaRequired}}),Object.defineProperty(e,\"setAriaRoleDescription\",{enumerable:!0,get:function(){return a.setAriaRoleDescription}}),Object.defineProperty(e,\"setAriaRowCount\",{enumerable:!0,get:function(){return a.setAriaRowCount}}),Object.defineProperty(e,\"setAriaRowIndex\",{enumerable:!0,get:function(){return a.setAriaRowIndex}}),Object.defineProperty(e,\"setAriaRowIndexText\",{enumerable:!0,get:function(){return a.setAriaRowIndexText}}),Object.defineProperty(e,\"setAriaRowSpan\",{enumerable:!0,get:function(){return a.setAriaRowSpan}}),Object.defineProperty(e,\"setAriaSelected\",{enumerable:!0,get:function(){return a.setAriaSelected}}),Object.defineProperty(e,\"setAriaSetSize\",{enumerable:!0,get:function(){return a.setAriaSetSize}}),Object.defineProperty(e,\"setAriaSort\",{enumerable:!0,get:function(){return a.setAriaSort}}),Object.defineProperty(e,\"setAriaValueMax\",{enumerable:!0,get:function(){return a.setAriaValueMax}}),Object.defineProperty(e,\"setAriaValueMin\",{enumerable:!0,get:function(){return a.setAriaValueMin}}),Object.defineProperty(e,\"setAriaValueNow\",{enumerable:!0,get:function(){return a.setAriaValueNow}}),Object.defineProperty(e,\"setAriaValueText\",{enumerable:!0,get:function(){return a.setAriaValueText}});var s=r(682);Object.defineProperty(e,\"setDisplayed\",{enumerable:!0,get:function(){return s.setDisplayed}}),Object.defineProperty(e,\"setVisible\",{enumerable:!0,get:function(){return s.setVisible}}),Object.defineProperty(e,\"setDisabled\",{enumerable:!0,get:function(){return s.setDisabled}}),Object.defineProperty(e,\"forEachNodeInList\",{enumerable:!0,get:function(){return s.forEachNodeInList}}),Object.defineProperty(e,\"cloneNodeList\",{enumerable:!0,get:function(){return s.cloneNodeList}}),Object.defineProperty(e,\"forEachAttributeInMap\",{enumerable:!0,get:function(){return s.forEachAttributeInMap}}),Object.defineProperty(e,\"toggleAttribute\",{enumerable:!0,get:function(){return s.toggleAttribute}}),Object.defineProperty(e,\"forEachAttributeInNamedNodeMap\",{enumerable:!0,get:function(){return s.forEachAttributeInNamedNodeMap}}),Object.defineProperty(e,\"isNodeOrHTMLElement\",{enumerable:!0,get:function(){return s.isNodeOrHTMLElement}}),Object.defineProperty(e,\"clearElement\",{enumerable:!0,get:function(){return s.clearElement}}),Object.defineProperty(e,\"setElementWidth\",{enumerable:!0,get:function(){return s.setElementWidth}}),Object.defineProperty(e,\"setFixedWidth\",{enumerable:!0,get:function(){return s.setFixedWidth}}),Object.defineProperty(e,\"formatSize\",{enumerable:!0,get:function(){return s.formatSize}}),Object.defineProperty(e,\"addOrRemoveAttribute\",{enumerable:!0,get:function(){return s.addOrRemoveAttribute}}),Object.defineProperty(e,\"ensureDomOrder\",{enumerable:!0,get:function(){return s.ensureDomOrder}}),Object.defineProperty(e,\"insertWithDomOrder\",{enumerable:!0,get:function(){return s.insertWithDomOrder}}),Object.defineProperty(e,\"setFixedHeight\",{enumerable:!0,get:function(){return s.setFixedHeight}}),Object.defineProperty(e,\"addTemplate\",{enumerable:!0,get:function(){return s.addTemplate}}),Object.defineProperty(e,\"removeFromParent\",{enumerable:!0,get:function(){return s.removeFromParent}}),Object.defineProperty(e,\"getAbsoluteWidth\",{enumerable:!0,get:function(){return s.getAbsoluteWidth}}),Object.defineProperty(e,\"getAbsoluteHeight\",{enumerable:!0,get:function(){return s.getAbsoluteHeight}}),Object.defineProperty(e,\"getElementRectWithMargin\",{enumerable:!0,get:function(){return s.getElementRectWithMargin}}),Object.defineProperty(e,\"getElementRectWithOffset\",{enumerable:!0,get:function(){return s.getElementRectWithOffset}}),Object.defineProperty(e,\"getElementSize\",{enumerable:!0,get:function(){return s.getElementSize}});var u=r(283);Object.defineProperty(e,\"Component\",{enumerable:!0,get:function(){return u.Component}});var l=r(688);Object.defineProperty(e,\"ComponentsRegistry\",{enumerable:!0,get:function(){return l.ComponentsRegistry}});var c=r(388);Object.defineProperty(e,\"UserComponentHandler\",{enumerable:!0,get:function(){return c.UserComponentHandler}});var p=r(970);Object.defineProperty(e,\"UserComponentRegistry\",{enumerable:!0,get:function(){return p.UserComponentRegistry}});var d=r(693);Object.defineProperty(e,\"BEAN_NAME\",{enumerable:!0,get:function(){return d.BEAN_NAME}});var f=r(284);Object.defineProperty(e,\"EventEmitter\",{enumerable:!0,get:function(){return f.EventEmitter}}),Object.defineProperty(e,\"addSafePassiveEventListener\",{enumerable:!0,get:function(){return f.addSafePassiveEventListener}});var y=r(642);Object.defineProperty(e,\"EventHandler\",{enumerable:!0,get:function(){return y.EventHandler}});var A=r(408);Object.defineProperty(e,\"ComponentMetadataProvider\",{enumerable:!0,get:function(){return A.ComponentMetadataProvider}});var m=r(530);Object.defineProperty(e,\"ComponentUtility\",{enumerable:!0,get:function(){return m.ComponentUtility}});var h=r(661);Object.defineProperty(e,\"BaseComponentWrapper\",{enumerable:!0,get:function(){return h.BaseComponentWrapper}});var b=r(825);Object.defineProperty(e,\"VanillaFrameWorkOverrider\",{enumerable:!0,get:function(){return b.VanillaFrameWorkOverrider}});var g=r(589);Object.defineProperty(e,\"Qualifier\",{enumerable:!0,get:function(){return g.Qualifier}}),Object.defineProperty(e,\"AutoWired\",{enumerable:!0,get:function(){return g.AutoWired}}),Object.defineProperty(e,\"Bean\",{enumerable:!0,get:function(){return g.Bean}}),Object.defineProperty(e,\"Optional\",{enumerable:!0,get:function(){return g.Optional}}),Object.defineProperty(e,\"PostConstruct\",{enumerable:!0,get:function(){return g.PostConstruct}}),Object.defineProperty(e,\"PreConstruct\",{enumerable:!0,get:function(){return g.PreConstruct}}),Object.defineProperty(e,\"PreDestroy\",{enumerable:!0,get:function(){return g.PreDestroy}}),Object.defineProperty(e,\"WireFunction\",{enumerable:!0,get:function(){return g.WireFunction}}),Object.defineProperty(e,\"_getAttributeAnnotationsForMethod\",{enumerable:!0,get:function(){return g._getAttributeAnnotationsForMethod}}),Object.defineProperty(e,\"_getBeanDefinition\",{enumerable:!0,get:function(){return g._getBeanDefinition}}),Object.defineProperty(e,\"_preinitAttributeAnnotationsForMethod\",{enumerable:!0,get:function(){return g._preinitAttributeAnnotationsForMethod}}),Object.defineProperty(e,\"makeMethodAttributeAnnotation\",{enumerable:!0,get:function(){return g.makeMethodAttributeAnnotation}}),Object.defineProperty(e,\"makeMethodParameterAnnotation\",{enumerable:!0,get:function(){return g.makeMethodParameterAnnotation}}),Object.defineProperty(e,\"makeRegisterAnnotation\",{enumerable:!0,get:function(){return g.makeRegisterAnnotation}}),Object.defineProperty(e,\"BeanDefinitionSymbol\",{enumerable:!0,get:function(){return g.BeanDefinitionSymbol}});var v=r(11);Object.defineProperty(e,\"AttributeAnnotationTargetType\",{enumerable:!0,get:function(){return v.AttributeAnnotationTargetType}}),Object.defineProperty(e,\"BeanDependencyType\",{enumerable:!0,get:function(){return v.BeanDependencyType}})})();const o=n.AttributeAnnotationTargetType,i=n.AutoWired,a=n.BEAN_NAME,s=n.BaseComponentWrapper,u=n.Bean,l=n.BeanDefinitionSymbol,c=n.BeanDependencyType,p=n.Component,d=n.ComponentMetadataProvider,f=n.ComponentUtility,y=n.Components,A=n.ComponentsRegistry,m=n.Context,h=n.EventEmitter,b=n.EventHandler,g=n.Optional,v=n.PostConstruct,O=n.PreConstruct,E=n.PreDestroy,C=n.Qualifier,P=n.QuerySelector,_=n.UserComponentHandler,N=n.UserComponentRegistry,M=n.VanillaFrameWorkOverrider,j=n.WireFunction,R=n.__esModule,S=n._getAttributeAnnotationsForMethod,B=n._getBeanDefinition,T=n._preinitAttributeAnnotationsForMethod,D=n.addAriaAttribute,w=n.addOrRemoveAttribute,x=n.addSafePassiveEventListener,L=n.addTemplate,F=n.ariaAttributeName,W=n.clearElement,I=n.cloneNodeList,H=n.createArrayOfNumbers,k=n.ensureDomOrder,V=n.exists,G=n.forEachAttributeInMap,U=n.forEachAttributeInNamedNodeMap,z=n.forEachNodeInList,q=n.formatSize,Q=n.getAbsoluteHeight,K=n.getAbsoluteWidth,Y=n.getElementRectWithMargin,J=n.getElementRectWithOffset,X=n.getElementSize,Z=n.getFunctionName,$=n.insertWithDomOrder,ee=n.isNodeOrHTMLElement,te=n.makeMethodAttributeAnnotation,re=n.makeMethodParameterAnnotation,ne=n.makeRegisterAnnotation,oe=n.queryAssignedNodes,ie=n.removeAriaAttribute,ae=n.removeFromParent,se=n.setAriaActiveDescendant,ue=n.setAriaAtomic,le=n.setAriaAutocomplete,ce=n.setAriaBraillelabel,pe=n.setAriaBrailleroledescription,de=n.setAriaBusy,fe=n.setAriaChecked,ye=n.setAriaColCount,Ae=n.setAriaColIndex,me=n.setAriaColIndexText,he=n.setAriaColSpan,be=n.setAriaControls,ge=n.setAriaCurrent,ve=n.setAriaDescribedBy,Oe=n.setAriaDescription,Ee=n.setAriaDetails,Ce=n.setAriaDisabled,Pe=n.setAriaErrorMessage,_e=n.setAriaExpanded,Ne=n.setAriaFlowTo,Me=n.setAriaHasPopUp,je=n.setAriaHidden,Re=n.setAriaInvalid,Se=n.setAriaKeyShortCuts,Be=n.setAriaLabel,Te=n.setAriaLabelledBy,De=n.setAriaLevel,we=n.setAriaLive,xe=n.setAriaModal,Le=n.setAriaMultiLine,Fe=n.setAriaMultiSelectable,We=n.setAriaOrientation,Ie=n.setAriaPlaceHolder,He=n.setAriaPosInSet,ke=n.setAriaPressed,Ve=n.setAriaReadOnly,Ge=n.setAriaRelevant,Ue=n.setAriaRequired,ze=n.setAriaRole,qe=n.setAriaRoleDescription,Qe=n.setAriaRowCount,Ke=n.setAriaRowIndex,Ye=n.setAriaRowIndexText,Je=n.setAriaRowSpan,Xe=n.setAriaSelected,Ze=n.setAriaSetSize,$e=n.setAriaSort,et=n.setAriaValueMax,tt=n.setAriaValueMin,rt=n.setAriaValueNow,nt=n.setAriaValueText,ot=n.setDisabled,it=n.setDisplayed,at=n.setElementWidth,st=n.setFixedHeight,ut=n.setFixedWidth,lt=n.setVisible,ct=n.toStringOrNull,pt=n.toggleAriaAttribute,dt=n.toggleAttribute,ft=n.traverseObject,yt=n.values;export{o as AttributeAnnotationTargetType,i as AutoWired,a as BEAN_NAME,s as BaseComponentWrapper,u as Bean,l as BeanDefinitionSymbol,c as BeanDependencyType,p as Component,d as ComponentMetadataProvider,f as ComponentUtility,y as Components,A as ComponentsRegistry,m as Context,h as EventEmitter,b as EventHandler,g as Optional,v as PostConstruct,O as PreConstruct,E as PreDestroy,C as Qualifier,P as QuerySelector,_ as UserComponentHandler,N as UserComponentRegistry,M as VanillaFrameWorkOverrider,j as WireFunction,R as __esModule,S as _getAttributeAnnotationsForMethod,B as _getBeanDefinition,T as _preinitAttributeAnnotationsForMethod,D as addAriaAttribute,w as addOrRemoveAttribute,x as addSafePassiveEventListener,L as addTemplate,F as ariaAttributeName,W as clearElement,I as cloneNodeList,H as createArrayOfNumbers,k as ensureDomOrder,V as exists,G as forEachAttributeInMap,U as forEachAttributeInNamedNodeMap,z as forEachNodeInList,q as formatSize,Q as getAbsoluteHeight,K as getAbsoluteWidth,Y as getElementRectWithMargin,J as getElementRectWithOffset,X as getElementSize,Z as getFunctionName,$ as insertWithDomOrder,ee as isNodeOrHTMLElement,te as makeMethodAttributeAnnotation,re as makeMethodParameterAnnotation,ne as makeRegisterAnnotation,oe as queryAssignedNodes,ie as removeAriaAttribute,ae as removeFromParent,se as setAriaActiveDescendant,ue as setAriaAtomic,le as setAriaAutocomplete,ce as setAriaBraillelabel,pe as setAriaBrailleroledescription,de as setAriaBusy,fe as setAriaChecked,ye as setAriaColCount,Ae as setAriaColIndex,me as setAriaColIndexText,he as setAriaColSpan,be as setAriaControls,ge as setAriaCurrent,ve as setAriaDescribedBy,Oe as setAriaDescription,Ee as setAriaDetails,Ce as setAriaDisabled,Pe as setAriaErrorMessage,_e as setAriaExpanded,Ne as setAriaFlowTo,Me as setAriaHasPopUp,je as setAriaHidden,Re as setAriaInvalid,Se as setAriaKeyShortCuts,Be as setAriaLabel,Te as setAriaLabelledBy,De as setAriaLevel,we as setAriaLive,xe as setAriaModal,Le as setAriaMultiLine,Fe as setAriaMultiSelectable,We as setAriaOrientation,Ie as setAriaPlaceHolder,He as setAriaPosInSet,ke as setAriaPressed,Ve as setAriaReadOnly,Ge as setAriaRelevant,Ue as setAriaRequired,ze as setAriaRole,qe as setAriaRoleDescription,Qe as setAriaRowCount,Ke as setAriaRowIndex,Ye as setAriaRowIndexText,Je as setAriaRowSpan,Xe as setAriaSelected,Ze as setAriaSetSize,$e as setAriaSort,et as setAriaValueMax,tt as setAriaValueMin,rt as setAriaValueNow,nt as setAriaValueText,ot as setDisabled,it as setDisplayed,at as setElementWidth,st as setFixedHeight,ut as setFixedWidth,lt as setVisible,ct as toStringOrNull,pt as toggleAriaAttribute,dt as toggleAttribute,ft as traverseObject,yt as values,n as default};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import \"./css/grid.css\";\nimport \"./css/fieldcomponentCustomization.css\";\nimport './css/common.css';\nimport \"../Demo/Gantt/gannt-view.css\";\nimport \"./css/groupingGrid.css\";\nimport \"../Sub_Components/src/fieldcomponents/dg-base/demo/styles/tooltip.css\"\nimport \"./css/tempgallery.css\";\n// import \"./VerticalCalendar/vertical-calendar.css\";\n\n\nimport '../userpresence/core/src/css/userpresence.css';\n\n","\nimport { GridMain,VerticalCalendar } from './Grid';\nimport { List } from '../ListModelClasses/List';\nimport { Gallery } from '../GalleryModelClasses/Gallery';\nimport { Gantt } from '../GanttModelClasses/Gantt';\nimport { Kanban } from '../Kanban/Kanban';\nimport { LayoutModule } from './Grid';\n\nexport {\n    GridMain,\n    List,\n    Gallery,\n    Gantt,\n    Kanban,\n    LayoutModule,\n    VerticalCalendar\n}\n "],"names":["isInCache","FILTER_CONDITIONS","data","defaultComparer","sort","PropertyName","item","_a","_b","TooltipStates","TooltipTriggerStates","DIRECTION","Position","date","isToday","wrapper","element","subElement","template","value","DateTimeInputKeys","DateTimeCombinationKeys","adjuster","hookInitiator","params","val","isNum","tokenType","separator","dropdownController","option","_c","ownerState","instanceID","readonly","index","id","filter","hasParentCollapsed","includeDraftRows","parentNode","cacheBlock","parentKeysArr","parentBlock","hasChildren","rowDefinition","rowNode","count","getBeanInstanceByBeanName","component","quarterStartMonth","yearsDiff","monthIndex","dayOfMonth","daysInMonth","hour","minute","second","millisecond","dayFraction","monthFraction","anchorQuarter","targetQuarter","quartersDiff","monthIndexInQuarter","left","timestamp","timelineContainer","optionHandler","ganttViewHookManager","metas","api","mainElement","days","FloatingRowHookAction","columnIds","CellRangeParams","_userConfiguration","columnNode","columnPinPosition","GRID_TYPE","ScrollSource","HScrollSource","currentScrollHolderTop","isAfterViewportEnd","isBeforeViewportStart","rowHeaderFieldHandler","HookEventsName","i","alignSide","popupIndex","Priority","minIndex","floatingRecordHandler","className","fieldData","centerHandler","offsetWidth","cellEditor","versionCopy","event","mouseEvent","StylingHandler","RowType","ROW_CONTAINER_NAME","RowContainerType","treeModel","ctrl","maxColumnHeaderLabelHeightPx","SELECTION_TYPE","ids","node","middleHandler","seg","end","current","top","IEventData","CellClearType","target","events","dragEventParams","_d","_e","childNodes","group"],"sourceRoot":""}