@toclocoinc/lattice-grid 1.80.0 → 1.81.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/angular/package.json +1 -1
- package/docs/API.html +4 -4
- package/docs/THEMING.md +6 -3
- package/docs/api/adapters.html +1 -1
- package/docs/api/ai.html +1 -1
- package/docs/api/alarms.html +1 -1
- package/docs/api/charts.html +1 -1
- package/docs/api/dashboard.html +1 -1
- package/docs/api/data-router.html +1 -1
- package/docs/api/deckgl.html +1 -1
- package/docs/api/gantt.html +1 -1
- package/docs/api/geometry.html +1 -1
- package/docs/api/grid.html +2 -2
- package/docs/api/index.html +1 -1
- package/docs/api/kanban.html +1 -1
- package/docs/api/kpi.html +1 -1
- package/docs/api/layout.html +1 -1
- package/docs/api/leaflet.html +1 -1
- package/docs/api/list.html +1 -1
- package/docs/api/mock-socket.html +1 -1
- package/docs/api/presets.html +1 -1
- package/docs/api/tabs.html +1 -1
- package/docs/api/types.html +1 -1
- package/docs/api-detail.html +4 -4
- package/docs/warnings.json +1 -1
- package/lattice-grid.d.ts +1 -1
- package/lattice-grid.esm.min.js +3 -3
- package/lattice-grid.min.cjs +3 -3
- package/lattice-grid.min.css +1 -1
- package/lattice-grid.min.js +3 -3
- package/modules/ai.d.ts +1 -1
- package/modules/ai.esm.min.js +2 -2
- package/modules/ai.min.cjs +2 -2
- package/modules/ai.min.js +2 -2
- package/modules/alarms.d.ts +1 -1
- package/modules/alarms.esm.min.js +2 -2
- package/modules/alarms.min.cjs +2 -2
- package/modules/alarms.min.js +2 -2
- package/modules/angular.d.ts +1 -1
- package/modules/angular.esm.min.js +2 -2
- package/modules/angular.min.cjs +2 -2
- package/modules/angular.min.js +2 -2
- package/modules/chart-alluvial.d.ts +1 -1
- package/modules/chart-alluvial.esm.min.js +1 -1
- package/modules/chart-alluvial.min.cjs +1 -1
- package/modules/chart-alluvial.min.js +1 -1
- package/modules/chart-arc.d.ts +1 -1
- package/modules/chart-arc.esm.min.js +1 -1
- package/modules/chart-arc.min.cjs +1 -1
- package/modules/chart-arc.min.js +1 -1
- package/modules/chart-bubblemap.d.ts +1 -1
- package/modules/chart-bubblemap.esm.min.js +1 -1
- package/modules/chart-bubblemap.min.cjs +1 -1
- package/modules/chart-bubblemap.min.js +1 -1
- package/modules/chart-bump.d.ts +1 -1
- package/modules/chart-bump.esm.min.js +1 -1
- package/modules/chart-bump.min.cjs +1 -1
- package/modules/chart-bump.min.js +1 -1
- package/modules/chart-calendar.d.ts +1 -1
- package/modules/chart-calendar.esm.min.js +1 -1
- package/modules/chart-calendar.min.cjs +1 -1
- package/modules/chart-calendar.min.js +1 -1
- package/modules/chart-choropleth.d.ts +1 -1
- package/modules/chart-choropleth.esm.min.js +1 -1
- package/modules/chart-choropleth.min.cjs +1 -1
- package/modules/chart-choropleth.min.js +1 -1
- package/modules/chart-decomposition.d.ts +1 -1
- package/modules/chart-decomposition.esm.min.js +1 -1
- package/modules/chart-decomposition.min.cjs +1 -1
- package/modules/chart-decomposition.min.js +1 -1
- package/modules/chart-diverging.d.ts +1 -1
- package/modules/chart-diverging.esm.min.js +1 -1
- package/modules/chart-diverging.min.cjs +1 -1
- package/modules/chart-diverging.min.js +1 -1
- package/modules/chart-dumbbell.d.ts +1 -1
- package/modules/chart-dumbbell.esm.min.js +1 -1
- package/modules/chart-dumbbell.min.cjs +1 -1
- package/modules/chart-dumbbell.min.js +1 -1
- package/modules/chart-fan.d.ts +1 -1
- package/modules/chart-fan.esm.min.js +1 -1
- package/modules/chart-fan.min.cjs +1 -1
- package/modules/chart-fan.min.js +1 -1
- package/modules/chart-hexbin.d.ts +1 -1
- package/modules/chart-hexbin.esm.min.js +1 -1
- package/modules/chart-hexbin.min.cjs +1 -1
- package/modules/chart-hexbin.min.js +1 -1
- package/modules/chart-hexmap.d.ts +1 -1
- package/modules/chart-hexmap.esm.min.js +1 -1
- package/modules/chart-hexmap.min.cjs +1 -1
- package/modules/chart-hexmap.min.js +1 -1
- package/modules/chart-icicle.d.ts +1 -1
- package/modules/chart-icicle.esm.min.js +1 -1
- package/modules/chart-icicle.min.cjs +1 -1
- package/modules/chart-icicle.min.js +1 -1
- package/modules/chart-markermap.d.ts +1 -1
- package/modules/chart-markermap.esm.min.js +1 -1
- package/modules/chart-markermap.min.cjs +1 -1
- package/modules/chart-markermap.min.js +1 -1
- package/modules/chart-parallel.d.ts +1 -1
- package/modules/chart-parallel.esm.min.js +1 -1
- package/modules/chart-parallel.min.cjs +1 -1
- package/modules/chart-parallel.min.js +1 -1
- package/modules/chart-ridgeline.d.ts +1 -1
- package/modules/chart-ridgeline.esm.min.js +1 -1
- package/modules/chart-ridgeline.min.cjs +1 -1
- package/modules/chart-ridgeline.min.js +1 -1
- package/modules/chart-roc.d.ts +1 -1
- package/modules/chart-roc.esm.min.js +1 -1
- package/modules/chart-roc.min.cjs +1 -1
- package/modules/chart-roc.min.js +1 -1
- package/modules/chart-slope.d.ts +1 -1
- package/modules/chart-slope.esm.min.js +1 -1
- package/modules/chart-slope.min.cjs +1 -1
- package/modules/chart-slope.min.js +1 -1
- package/modules/chart-splom.d.ts +1 -1
- package/modules/chart-splom.esm.min.js +1 -1
- package/modules/chart-splom.min.cjs +1 -1
- package/modules/chart-splom.min.js +1 -1
- package/modules/chart-waffle.d.ts +1 -1
- package/modules/chart-waffle.esm.min.js +1 -1
- package/modules/chart-waffle.min.cjs +1 -1
- package/modules/chart-waffle.min.js +1 -1
- package/modules/charts.d.ts +1 -1
- package/modules/charts.esm.min.js +2 -2
- package/modules/charts.min.cjs +2 -2
- package/modules/charts.min.js +2 -2
- package/modules/dashboard.d.ts +1 -1
- package/modules/dashboard.esm.min.js +2 -2
- package/modules/dashboard.min.cjs +2 -2
- package/modules/dashboard.min.js +2 -2
- package/modules/data-router.d.ts +1 -1
- package/modules/data-router.esm.min.js +2 -2
- package/modules/data-router.min.cjs +2 -2
- package/modules/data-router.min.js +2 -2
- package/modules/deckgl.d.ts +1 -1
- package/modules/deckgl.esm.min.js +2 -2
- package/modules/deckgl.min.cjs +2 -2
- package/modules/deckgl.min.js +2 -2
- package/modules/devtools.d.ts +1 -1
- package/modules/devtools.esm.min.js +1 -1
- package/modules/devtools.min.cjs +1 -1
- package/modules/devtools.min.js +1 -1
- package/modules/dhtmlx-compat.d.ts +1 -1
- package/modules/dhtmlx-compat.esm.min.js +2 -2
- package/modules/dhtmlx-compat.min.cjs +2 -2
- package/modules/dhtmlx-compat.min.js +2 -2
- package/modules/gantt.d.ts +1 -1
- package/modules/gantt.esm.min.js +2 -2
- package/modules/gantt.min.cjs +2 -2
- package/modules/gantt.min.js +2 -2
- package/modules/geo-europe-nuts.d.ts +1 -1
- package/modules/geo-europe-nuts.esm.min.js +1 -1
- package/modules/geo-europe-nuts.min.cjs +1 -1
- package/modules/geo-europe-nuts.min.js +1 -1
- package/modules/geo-uk.d.ts +1 -1
- package/modules/geo-uk.esm.min.js +1 -1
- package/modules/geo-uk.min.cjs +1 -1
- package/modules/geo-uk.min.js +1 -1
- package/modules/geo-us-states.d.ts +1 -1
- package/modules/geo-us-states.esm.min.js +1 -1
- package/modules/geo-us-states.min.cjs +1 -1
- package/modules/geo-us-states.min.js +1 -1
- package/modules/geo-world-110m.d.ts +1 -1
- package/modules/geo-world-110m.esm.min.js +1 -1
- package/modules/geo-world-110m.min.cjs +1 -1
- package/modules/geo-world-110m.min.js +1 -1
- package/modules/geo-world-50m.d.ts +1 -1
- package/modules/geo-world-50m.esm.min.js +1 -1
- package/modules/geo-world-50m.min.cjs +1 -1
- package/modules/geo-world-50m.min.js +1 -1
- package/modules/geometry.d.ts +1 -1
- package/modules/geometry.esm.min.js +2 -2
- package/modules/geometry.min.cjs +2 -2
- package/modules/geometry.min.js +2 -2
- package/modules/htmx.d.ts +1 -1
- package/modules/htmx.esm.min.js +3 -3
- package/modules/htmx.min.cjs +3 -3
- package/modules/htmx.min.js +3 -3
- package/modules/kanban.d.ts +1 -1
- package/modules/kanban.esm.min.js +2 -2
- package/modules/kanban.min.cjs +2 -2
- package/modules/kanban.min.js +2 -2
- package/modules/kpi.d.ts +1 -1
- package/modules/kpi.esm.min.js +2 -2
- package/modules/kpi.min.cjs +2 -2
- package/modules/kpi.min.js +2 -2
- package/modules/layout.d.ts +1 -1
- package/modules/layout.esm.min.js +2 -2
- package/modules/layout.min.cjs +2 -2
- package/modules/layout.min.js +2 -2
- package/modules/leaflet.d.ts +1 -1
- package/modules/leaflet.esm.min.js +2 -2
- package/modules/leaflet.min.cjs +2 -2
- package/modules/leaflet.min.js +2 -2
- package/modules/list.d.ts +1 -1
- package/modules/list.esm.min.js +2 -2
- package/modules/list.min.cjs +2 -2
- package/modules/list.min.js +2 -2
- package/modules/mock-socket.d.ts +1 -1
- package/modules/mock-socket.esm.min.js +1 -1
- package/modules/mock-socket.min.cjs +1 -1
- package/modules/mock-socket.min.js +1 -1
- package/modules/presets/antd5.css +23 -0
- package/modules/presets/bootstrap5.css +46 -5
- package/modules/presets/fluent2.css +31 -4
- package/modules/presets/material3.css +53 -5
- package/modules/presets.d.ts +1 -1
- package/modules/presets.esm.min.js +2 -2
- package/modules/presets.min.cjs +2 -2
- package/modules/presets.min.js +2 -2
- package/modules/react.d.ts +1 -1
- package/modules/react.esm.min.js +2 -2
- package/modules/react.min.cjs +2 -2
- package/modules/react.min.js +2 -2
- package/modules/svelte.d.ts +1 -1
- package/modules/svelte.esm.min.js +2 -2
- package/modules/svelte.min.cjs +2 -2
- package/modules/svelte.min.js +2 -2
- package/modules/tabs.d.ts +1 -1
- package/modules/tabs.esm.min.js +2 -2
- package/modules/tabs.min.cjs +2 -2
- package/modules/tabs.min.js +2 -2
- package/modules/vue.d.ts +1 -1
- package/modules/vue.esm.min.js +2 -2
- package/modules/vue.min.cjs +2 -2
- package/modules/vue.min.js +2 -2
- package/modules/webcomponent.d.ts +1 -1
- package/modules/webcomponent.esm.min.js +3 -3
- package/modules/webcomponent.min.cjs +3 -3
- package/modules/webcomponent.min.js +3 -3
- package/package.json +1 -1
package/modules/kanban.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.81.0, kanban module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
var je=Object.create(null),Ee=Object.create(null);function Ae($,ue){je[$]=ue}function Ne($){var ue=Ee[$];if(ue)return ue;var d=Object.create(null);Ee[$]=d;var D=je[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,Ne),d}Ae("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return T}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.80.0";async function D(){return d}const E="1.80.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function P(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const _e=k[ke];be[_e]==null&&(be[_e]={}),be=be[_e]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function x(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class T{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),Ae("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return x=>{const S=y(x);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return x=>E(x,p)}function Y(y,p,x,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(x,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[x,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[x]={field:S.field,edit:!!S.edit,editor:S.editor}:p[x]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const x=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(x.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let T;if(x.length?T=[...x.map(M=>M.id),...B.filter(M=>!S.has(M))]:T=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>T.includes(m));T=[...M,...T.filter(m=>!M.includes(m))]}return T.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const x=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),T={};for(const[M,m]of Object.entries(y.cardSpecs))T[M]=Y(y,p,x,m.field);return{key:x,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:T}}function ye(y,p,x={}){const S=J(Z(y,p),x),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,T=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,x)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){T.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);T.length&&D(`kanban:unplaced:${y.columnProperty}`,`${T.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,x):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:T,filtered:M}}function J(y,p){let x=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,T)=>[X,T]));x=[...y].sort((X,T)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(T.id)?B.get(T.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return x.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((x,S)=>H(x.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((x,S)=>x+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,x){if(x.filters&&x.filters.size){for(const X of x.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,x)||!w(y,p,x))return!1;const S=typeof x.quickFilter=="string"?x.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const P="\0backlog",h="\0default";function l(y,p,x){if(x.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return x.sprint===P?U(S)||S==="":String(S)===String(x.sprint)}function w(y,p,x){return x.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(x.epic)}function C(y,p,x,S){const B=oe(x),X=y.pointsProperty?oe(y.pointsProperty):()=>0,T=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=T.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},T.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...T.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,x,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],T=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of x.values()){const I=j(B(A.row));!T.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=T.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,x){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,T=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<x;I++)T.push(I);return T}if(!M){for(let I=0;I<x;I++)T.push(X-(x-I));return T}if(!m){for(let I=0;I<x;I++)T.push(B+1+I);return T}const A=(X-B)/(x+1);for(let I=0;I<x;I++)T.push(B+A*(I+1));return T}function ge(y,p,x,S,B=3){const X=x>0?x:1,T=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,T+M);return{start:T,end:m,padTop:T*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(x=>f(x)&&x.done).map(x=>String(x.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(x=>f(x)?{id:x.id,title:x.title}:{id:x}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),Ae("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
6
|
+
var je=Object.create(null),Ee=Object.create(null);function Ae($,ue){je[$]=ue}function Ne($){var ue=Ee[$];if(ue)return ue;var d=Object.create(null);Ee[$]=d;var D=je[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,Ne),d}Ae("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return T}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.81.0";async function D(){return d}const E="1.81.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function P(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const _e=k[ke];be[_e]==null&&(be[_e]={}),be=be[_e]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function x(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class T{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),Ae("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return x=>{const S=y(x);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return x=>E(x,p)}function Y(y,p,x,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(x,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[x,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[x]={field:S.field,edit:!!S.edit,editor:S.editor}:p[x]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const x=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(x.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let T;if(x.length?T=[...x.map(M=>M.id),...B.filter(M=>!S.has(M))]:T=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>T.includes(m));T=[...M,...T.filter(m=>!M.includes(m))]}return T.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const x=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),T={};for(const[M,m]of Object.entries(y.cardSpecs))T[M]=Y(y,p,x,m.field);return{key:x,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:T}}function ye(y,p,x={}){const S=J(Z(y,p),x),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,T=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,x)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){T.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);T.length&&D(`kanban:unplaced:${y.columnProperty}`,`${T.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,x):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:T,filtered:M}}function J(y,p){let x=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,T)=>[X,T]));x=[...y].sort((X,T)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(T.id)?B.get(T.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return x.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((x,S)=>H(x.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((x,S)=>x+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,x){if(x.filters&&x.filters.size){for(const X of x.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,x)||!w(y,p,x))return!1;const S=typeof x.quickFilter=="string"?x.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const P="\0backlog",h="\0default";function l(y,p,x){if(x.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return x.sprint===P?U(S)||S==="":String(S)===String(x.sprint)}function w(y,p,x){return x.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(x.epic)}function C(y,p,x,S){const B=oe(x),X=y.pointsProperty?oe(y.pointsProperty):()=>0,T=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=T.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},T.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...T.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,x,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],T=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of x.values()){const I=j(B(A.row));!T.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=T.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,x){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,T=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<x;I++)T.push(I);return T}if(!M){for(let I=0;I<x;I++)T.push(X-(x-I));return T}if(!m){for(let I=0;I<x;I++)T.push(B+1+I);return T}const A=(X-B)/(x+1);for(let I=0;I<x;I++)T.push(B+A*(I+1));return T}function ge(y,p,x,S,B=3){const X=x>0?x:1,T=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,T+M);return{start:T,end:m,padTop:T*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(x=>f(x)&&x.done).map(x=>String(x.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(x=>f(x)?{id:x.id,title:x.title}:{id:x}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),Ae("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
7
7
|
.${d}{
|
|
8
8
|
display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
|
|
9
9
|
box-sizing:border-box; width:100%; height:100%; min-height:0;
|
package/modules/kanban.min.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.81.0, kanban module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
(function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.80.0";async function D(){return d}const E="1.80.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function P(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function x(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return x=>{const S=y(x);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return x=>E(x,p)}function Y(y,p,x,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(x,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[x,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[x]={field:S.field,edit:!!S.edit,editor:S.editor}:p[x]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const x=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(x.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(x.length?L=[...x.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const x=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,x,m.field);return{key:x,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,x={}){const S=J(Z(y,p),x),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,x)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,x):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let x=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));x=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return x.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((x,S)=>H(x.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((x,S)=>x+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,x){if(x.filters&&x.filters.size){for(const X of x.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,x)||!w(y,p,x))return!1;const S=typeof x.quickFilter=="string"?x.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const P="\0backlog",h="\0default";function l(y,p,x){if(x.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return x.sprint===P?U(S)||S==="":String(S)===String(x.sprint)}function w(y,p,x){return x.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(x.epic)}function C(y,p,x,S){const B=oe(x),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,x,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of x.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,x){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<x;I++)L.push(I);return L}if(!M){for(let I=0;I<x;I++)L.push(X-(x-I));return L}if(!m){for(let I=0;I<x;I++)L.push(B+1+I);return L}const A=(X-B)/(x+1);for(let I=0;I<x;I++)L.push(B+A*(I+1));return L}function ge(y,p,x,S,B=3){const X=x>0?x:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(x=>f(x)&&x.done).map(x=>String(x.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(x=>f(x)?{id:x.id,title:x.title}:{id:x}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
6
|
+
(function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.81.0";async function D(){return d}const E="1.81.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function P(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function x(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return x=>{const S=y(x);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return x=>E(x,p)}function Y(y,p,x,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(x,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[x,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[x]={field:S.field,edit:!!S.edit,editor:S.editor}:p[x]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const x=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(x.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(x.length?L=[...x.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const x=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,x,m.field);return{key:x,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,x={}){const S=J(Z(y,p),x),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,x)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,x):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let x=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));x=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return x.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((x,S)=>H(x.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((x,S)=>x+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,x){if(x.filters&&x.filters.size){for(const X of x.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,x)||!w(y,p,x))return!1;const S=typeof x.quickFilter=="string"?x.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const P="\0backlog",h="\0default";function l(y,p,x){if(x.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return x.sprint===P?U(S)||S==="":String(S)===String(x.sprint)}function w(y,p,x){return x.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(x.epic)}function C(y,p,x,S){const B=oe(x),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,x,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of x.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,x){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<x;I++)L.push(I);return L}if(!M){for(let I=0;I<x;I++)L.push(X-(x-I));return L}if(!m){for(let I=0;I<x;I++)L.push(B+1+I);return L}const A=(X-B)/(x+1);for(let I=0;I<x;I++)L.push(B+A*(I+1));return L}function ge(y,p,x,S,B=3){const X=x>0?x:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(x=>f(x)&&x.done).map(x=>String(x.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(x=>f(x)?{id:x.id,title:x.title}:{id:x}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
7
7
|
.${d}{
|
|
8
8
|
display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
|
|
9
9
|
box-sizing:border-box; width:100%; height:100%; min-height:0;
|
package/modules/kanban.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.81.0, kanban module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
(function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.80.0";async function D(){return d}const E="1.80.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function P(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function x(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return x=>{const S=y(x);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return x=>E(x,p)}function Y(y,p,x,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(x,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[x,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[x]={field:S.field,edit:!!S.edit,editor:S.editor}:p[x]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const x=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(x.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(x.length?L=[...x.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const x=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,x,m.field);return{key:x,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,x={}){const S=J(Z(y,p),x),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,x)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,x):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let x=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));x=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return x.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((x,S)=>H(x.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((x,S)=>x+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,x){if(x.filters&&x.filters.size){for(const X of x.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,x)||!w(y,p,x))return!1;const S=typeof x.quickFilter=="string"?x.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const P="\0backlog",h="\0default";function l(y,p,x){if(x.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return x.sprint===P?U(S)||S==="":String(S)===String(x.sprint)}function w(y,p,x){return x.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(x.epic)}function C(y,p,x,S){const B=oe(x),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,x,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of x.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,x){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<x;I++)L.push(I);return L}if(!M){for(let I=0;I<x;I++)L.push(X-(x-I));return L}if(!m){for(let I=0;I<x;I++)L.push(B+1+I);return L}const A=(X-B)/(x+1);for(let I=0;I<x;I++)L.push(B+A*(I+1));return L}function ge(y,p,x,S,B=3){const X=x>0?x:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(x=>f(x)&&x.done).map(x=>String(x.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(x=>f(x)?{id:x.id,title:x.title}:{id:x}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
6
|
+
(function(Fe){"use strict";var Ee=Object.create(null),Ne=Object.create(null);function _e($,ue){Ee[$]=ue}function De($){var ue=Ne[$];if(ue)return ue;var d=Object.create(null);Ne[$]=d;var D=Ee[$];if(!D)throw new Error("[lattice] missing module: "+$);return D(d,De),d}_e("packages/core/src/internal/util.js",function($,ue){"use strict";Object.defineProperty($,"VERSION",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"reportedWarnings",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"warnOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"infoOnce",{enumerable:!0,get:function(){return se}}),Object.defineProperty($,"resetWarnings",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"fail",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"invariant",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"DEV",{enumerable:!0,get:function(){return J}}),Object.defineProperty($,"isObject",{enumerable:!0,get:function(){return u}}),Object.defineProperty($,"isFunction",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"isNil",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"isBlank",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"isCtor",{enumerable:!0,get:function(){return l}}),Object.defineProperty($,"pathGetter",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"pathSetter",{enumerable:!0,get:function(){return N}}),Object.defineProperty($,"getPath",{enumerable:!0,get:function(){return H}}),Object.defineProperty($,"setPath",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"humanise",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"escapeHtml",{enumerable:!0,get:function(){return $e}}),Object.defineProperty($,"titleCase",{enumerable:!0,get:function(){return y}}),Object.defineProperty($,"expand",{enumerable:!0,get:function(){return p}}),Object.defineProperty($,"toArray",{enumerable:!0,get:function(){return x}}),Object.defineProperty($,"merge",{enumerable:!0,get:function(){return B}}),Object.defineProperty($,"mergeRow",{enumerable:!0,get:function(){return X}}),Object.defineProperty($,"Lru",{enumerable:!0,get:function(){return L}}),Object.defineProperty($,"collator",{enumerable:!0,get:function(){return m}}),Object.defineProperty($,"defaultCompare",{enumerable:!0,get:function(){return A}}),Object.defineProperty($,"now",{enumerable:!0,get:function(){return I}}),Object.defineProperty($,"nextFrame",{enumerable:!0,get:function(){return he}}),Object.defineProperty($,"cancelFrame",{enumerable:!0,get:function(){return ce}}),Object.defineProperty($,"frameBatched",{enumerable:!0,get:function(){return z}}),Object.defineProperty($,"settleDebounce",{enumerable:!0,get:function(){return ve}}),Object.defineProperty($,"whenIdle",{enumerable:!0,get:function(){return we}}),Object.defineProperty($,"uid",{enumerable:!0,get:function(){return o}});const d="1.81.0";async function D(){return d}const E="1.81.0",F=new Set,U=2e3;function f(c){if(F.add(c),F.size>U){const g=F.values().next().value;g!==void 0&&F.delete(g)}}const ae=[],oe=500;function ee(c,g,k){ae.push({key:c,level:g,message:k.map(K=>typeof K=="string"?K:W(K)).join(" "),at:Date.now()}),ae.length>oe&&ae.shift()}function W(c){if(c instanceof Error)return c.message;try{return JSON.stringify(c)}catch{return String(c)}}function Y(){return ae.map(c=>({...c}))}function q(c){if(c.length===0||typeof c[0]!="string")return c;const g=c[0].replace(/^\[lattice\]\s*/,"");return g===c[0]?c:[g,...c.slice(1)]}function Z(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"warn",k),console.warn("[lattice]",...k)}function se(c,...g){if(F.has(c))return;f(c);const k=q(g);ee(c,"info",k),console.info("[lattice]",...k)}function fe(){F.clear(),ae.length=0}function pe(c,g){const k=new Error(`[lattice] ${c}`);throw g!==void 0&&(k.cause=g),k}function ye(c,g){c||pe(g)}const J=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function u(c){return c!==null&&typeof c=="object"&&!Array.isArray(c)}function _(c){return typeof c=="function"}function P(c){return c==null}function h(c){return c==null||c===""}function l(c){return typeof c!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(c))?!0:!!(c.prototype&&Object.getOwnPropertyNames(c.prototype).length>1)}const w=new Map;function C(c){let g=w.get(c);if(g)return g;if(!c.includes("."))g=k=>k?.[c];else{const k=c.split("."),K=k.length;g=re=>{let me=re;for(let be=0;be<K;be++){if(me==null)return;me=me[k[be]]}return me}}return w.set(c,g),g}const j=new Map;function N(c){let g=j.get(c);if(g)return g;if(!c.includes("."))g=(k,K)=>{k!=null&&(k[c]=K)};else{const k=c.split("."),K=k.length-1;g=(re,me)=>{let be=re;for(let ke=0;ke<K;ke++){if(be==null)return;const Ae=k[ke];be[Ae]==null&&(be[Ae]={}),be=be[Ae]}be!=null&&(be[k[K]]=me)}}return j.set(c,g),g}function H(c,g){return C(g)(c)}function Q(c,g,k){N(g)(c,k)}function ge(c){return c?(c.includes(".")?c.slice(c.lastIndexOf(".")+1):c).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,k=>k.toUpperCase()):""}const de={"&":"&","<":"<",">":">",'"':""","'":"'"};function $e(c){const g=c==null?"":String(c);return/[&<>"']/.test(g)?g.replace(/[&<>"']/g,k=>de[k]):g}function y(c){return String(c).replace(/\w\S*/g,g=>g[0].toUpperCase()+g.slice(1).toLowerCase())}function p(c,g,k){if(c!==void 0)return c===!0?{enabled:!0,...k}:c===!1?{enabled:!1}:u(c)?c:{[g]:c,enabled:!0}}function x(c){return c==null?[]:Array.isArray(c)?c:[c]}const S=Object.freeze(new Set(["__proto__","constructor","prototype"]));function B(c,g){if(!u(c))return u(g)?{...g}:g;if(!u(g))return g===void 0?c:g;const k={...c};for(const K of Object.keys(g)){if(S.has(K))continue;const re=g[K];re!==void 0&&(k[K]=u(re)&&u(k[K])?B(k[K],re):re)}return k}function X(c,g){if(!u(c)||!u(g)||c===g)return g;const k=Object.create(Object.getPrototypeOf(c));return Object.assign(k,c,g),k}class L{#t;#e=new Map;#n;constructor(g=256,k=null){this.#t=g,this.#n=k}get size(){return this.#e.size}get max(){return this.#t}set max(g){this.#t=g,this.#r()}has(g){return this.#e.has(g)}get(g){const k=this.#e;if(!k.has(g))return;const K=k.get(g);return k.delete(g),k.set(g,K),K}peek(g){return this.#e.get(g)}set(g,k){const K=this.#e;return K.has(g)&&K.delete(g),K.set(g,k),this.#r(),k}delete(g){const k=this.#e.get(g);return this.#e.delete(g)&&this.#n&&this.#n(k,g),k}clear(){if(this.#n)for(const[g,k]of this.#e)this.#n(k,g);this.#e.clear()}keys(){return this.#e.keys()}values(){return this.#e.values()}#r(){const g=this.#e;for(;g.size>this.#t;){const k=g.keys().next().value,K=g.get(k);g.delete(k),this.#n&&this.#n(K,k)}}}const M=new Map;function m(c,g){const k=`${c||""}|${g?JSON.stringify(g):""}`;let K=M.get(k);return K||(K=new Intl.Collator(c||void 0,{numeric:!0,sensitivity:"variant",...g}),M.set(k,K)),K}function A(c,g){if(c===g)return 0;if(c==null)return 1;if(g==null)return-1;if(typeof c=="number"&&typeof g=="number")return Number.isNaN(c)?Number.isNaN(g)?0:1:Number.isNaN(g)||c<g?-1:c>g?1:0;const k=String(c),K=String(g);return k<K?-1:k>K?1:0}function I(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const te=typeof requestAnimationFrame=="function";function he(c){return te?requestAnimationFrame(c):setTimeout(()=>c(I()),16)}function ce(c){c!=null&&(te?cancelAnimationFrame(c):clearTimeout(c))}function z(c){let g=null,k=null;const K=()=>{g=null;const me=k;k=null,c(...me||[])},re=(...me)=>{k=me,g===null&&(g=he(K))};return re.cancel=()=>{ce(g),g=null,k=null},re.flush=()=>{g!==null&&(ce(g),K())},re}function ve(c,g){let k=null,K=null;const re=()=>{if(k=null,K===null)return;const ke=K;K=null,c(...ke),me()},me=()=>{k=setTimeout(re,g),typeof k?.unref=="function"&&k.unref()},be=(...ke)=>{k===null?(c(...ke),me()):(K=ke,clearTimeout(k),me())};return be.flush=()=>{if(k!==null&&clearTimeout(k),k=null,K===null)return;const ke=K;K=null,c(...ke)},be.cancel=()=>{k!==null&&clearTimeout(k),k=null,K=null},be.pending=()=>k!==null||K!==null,be}function we(c,g=50){return typeof requestIdleCallback=="function"?requestIdleCallback(c,{timeout:g}):setTimeout(()=>c({timeRemaining:()=>0,didTimeout:!0}),1)}let R=0;function o(c="l"){return`${c}${(++R).toString(36)}`}}),_e("packages/modules/kanban/model.js",function($,ue){"use strict";Object.defineProperty($,"accessorFor",{enumerable:!0,get:function(){return oe}}),Object.defineProperty($,"keyFn",{enumerable:!0,get:function(){return W}}),Object.defineProperty($,"fieldText",{enumerable:!0,get:function(){return Y}}),Object.defineProperty($,"cardSpecs",{enumerable:!0,get:function(){return q}}),Object.defineProperty($,"deriveColumns",{enumerable:!0,get:function(){return Z}}),Object.defineProperty($,"columnIdOf",{enumerable:!0,get:function(){return fe}}),Object.defineProperty($,"buildCard",{enumerable:!0,get:function(){return pe}}),Object.defineProperty($,"groupRows",{enumerable:!0,get:function(){return ye}}),Object.defineProperty($,"passesFilter",{enumerable:!0,get:function(){return _}}),Object.defineProperty($,"BACKLOG",{enumerable:!0,get:function(){return P}}),Object.defineProperty($,"DEFAULT_FILTER",{enumerable:!0,get:function(){return h}}),Object.defineProperty($,"rollup",{enumerable:!0,get:function(){return C}}),Object.defineProperty($,"laneIdOf",{enumerable:!0,get:function(){return j}}),Object.defineProperty($,"computeOrders",{enumerable:!0,get:function(){return Q}}),Object.defineProperty($,"windowRange",{enumerable:!0,get:function(){return ge}}),Object.defineProperty($,"deriveDoneColumns",{enumerable:!0,get:function(){return de}}),Object.defineProperty($,"resolveContext",{enumerable:!0,get:function(){return $e}});const d=ue("packages/core/src/internal/util.js"),D=d.warnOnce,E=d.getPath,F=d.isFunction,U=d.isNil,f=d.isObject,ae=d.humanise;function oe(y){return F(y)?y:typeof y=="string"?p=>E(p,y):()=>{}}function ee(y){return Array.isArray(y)?"array":y===null?"null":typeof y}function W(y){if(y!==void 0&&typeof y!="function"&&!(typeof y=="string"&&y.length>0))throw new Error("lattice-kanban: rowKey must be a property name or a function; composite keys are not supported on boards.");if(F(y))return x=>{const S=y(x);if(typeof S=="string"||typeof S=="number"&&Number.isFinite(S))return S;throw new Error(`lattice-kanban: rowKey function must return a string or number; got ${ee(S)}.`)};const p=typeof y=="string"?y:"id";return x=>E(x,p)}function Y(y,p,x,S){if(U(S))return"";if(y.grid&&typeof S=="string")try{if(y.grid.columns&&y.grid.columns.get&&y.grid.columns.get(S)){const X=y.grid.rows.text(x,S);if(!U(X))return String(X)}}catch{}const B=oe(S)(p);return U(B)?"":String(B)}function q(y){const p={};for(const[x,S]of Object.entries(y))S&&typeof S=="object"&&!F(S)?p[x]={field:S.field,edit:!!S.edit,editor:S.editor}:p[x]={field:S,edit:!1,editor:void 0};return p}function Z(y,p){const x=Array.isArray(y.columns)?y.columns.map(se):[],S=new Map(x.map(M=>[M.id,M])),B=[],X=oe(y.columnProperty);for(const M of p){const m=X(M),A=fe(m);A!==null&&!S.has(A)&&!B.includes(A)&&B.push(A)}let L;if(x.length?L=[...x.map(M=>M.id),...B.filter(M=>!S.has(M))]:L=B,Array.isArray(y.columnOrder)&&y.columnOrder.length){const M=y.columnOrder.filter(m=>L.includes(m));L=[...M,...L.filter(m=>!M.includes(m))]}return L.map(M=>{const m=S.get(M)||{id:M,title:ae(String(M))};return{id:M,title:U(m.title)?ae(String(M)):String(m.title),color:m.color??null,wipLimit:Number.isFinite(m.wipLimit)?m.wipLimit:null,collapsed:!!m.collapsed}})}function se(y){return typeof y=="string"?{id:y}:f(y)&&!U(y.id)?y:{id:String(y)}}function fe(y){return U(y)?null:String(y)}function pe(y,p){const x=y.key(p),S=fe(oe(y.columnProperty)(p)),B=y.pointsProperty?oe(y.pointsProperty)(p):void 0,X=Number(B),L={};for(const[M,m]of Object.entries(y.cardSpecs))L[M]=Y(y,p,x,m.field);return{key:x,row:p,columnId:S,points:Number.isFinite(X)?X:0,hasPoints:Number.isFinite(X),swimlane:y.swimlaneProperty?oe(y.swimlaneProperty)(p):void 0,sprint:y.sprintProperty?oe(y.sprintProperty)(p):void 0,epic:y.epicProperty?oe(y.epicProperty)(p):void 0,order:y.orderProperty?oe(y.orderProperty)(p):void 0,fields:L}}function ye(y,p,x={}){const S=J(Z(y,p),x),B=new Map(S.map(I=>[I.id,{...I,cards:[],points:0}])),X=new Map,L=[];let M=0;for(const I of p){const te=pe(y,I);if(!_(y,te,x)){M+=1;continue}X.set(te.key,te);const he=te.columnId===null?null:B.get(te.columnId);if(!he){L.push(te);continue}he.cards.push(te)}for(const I of B.values())u(y,I);L.length&&D(`kanban:unplaced:${y.columnProperty}`,`${L.length} card(s) have a "${y.columnProperty}" value outside the configured columns and are not shown; add the column or map the value.`);const m=[...B.values()],A=y.swimlanes?N(y,m,X,x):null;return{columns:m,lanes:A,cardsByKey:X,unplaced:L,filtered:M}}function J(y,p){let x=y;if(Array.isArray(p.columnOrder)&&p.columnOrder.length){const B=new Map(p.columnOrder.map((X,L)=>[X,L]));x=[...y].sort((X,L)=>{const M=B.has(X.id)?B.get(X.id):Number.MAX_SAFE_INTEGER,m=B.has(L.id)?B.get(L.id):Number.MAX_SAFE_INTEGER;return M-m})}const S=p.collapsedColumns;return x.map(B=>({...B,collapsed:B.collapsed||!!(S&&S.has(B.id))}))}function u(y,p){y.orderProperty&&p.cards.sort((x,S)=>H(x.order)-H(S.order)),p.count=p.cards.length,p.points=p.cards.reduce((x,S)=>x+(S.hasPoints?S.points:0),0),p.over=p.wipLimit!==null&&p.count>p.wipLimit}function _(y,p,x){if(x.filters&&x.filters.size){for(const X of x.filters.values())if(!X(p.row,p))return!1}if(!l(y,p,x)||!w(y,p,x))return!1;const S=typeof x.quickFilter=="string"?x.quickFilter.trim().toLowerCase():"";return S?Object.values(p.fields).join(" ").toLowerCase().includes(S)||String(p.columnId).toLowerCase().includes(S):!0}const P="\0backlog",h="\0default";function l(y,p,x){if(x.sprint===void 0||!y.sprintProperty)return!0;const S=oe(y.sprintProperty)(p.row);return x.sprint===P?U(S)||S==="":String(S)===String(x.sprint)}function w(y,p,x){return x.epic===void 0||!y.epicProperty?!0:String(oe(y.epicProperty)(p.row))===String(x.epic)}function C(y,p,x,S){const B=oe(x),X=y.pointsProperty?oe(y.pointsProperty):()=>0,L=new Map;for(const m of p){const A=B(m),I=U(A)?"":String(A);let te=L.get(I);te||(te={value:A,count:0,points:0,doneCount:0,donePoints:0,progress:0},L.set(I,te));const he=Number(X(m)),ce=Number.isFinite(he)?he:0;te.count+=1,te.points+=ce,F(S)&&S(m)&&(te.doneCount+=1,te.donePoints+=ce)}const M=[...L.values()];for(const m of M){const A=m.points||m.count||1,I=m.points?m.donePoints:m.doneCount;m.progress=Math.round(I/A*1e3)/1e3}return M.sort((m,A)=>A.points-m.points||A.count-m.count)}function j(y){return U(y)?"":String(y)}function N(y,p,x,S){const B=oe(y.swimlaneProperty),X=Array.isArray(y.lanes)?y.lanes.map(A=>typeof A=="string"?{id:A}:A):[],L=new Map(X.map(A=>[A.id,A]));let M=X.map(A=>A.id);for(const A of x.values()){const I=j(B(A.row));!L.has(I)&&!M.includes(I)&&M.push(I)}if(Array.isArray(S.laneOrder)&&S.laneOrder.length){const A=S.laneOrder.filter(I=>M.includes(I));M=[...A,...M.filter(I=>!A.includes(I))]}const m=S.collapsedLanes;return M.map(A=>{const I=L.get(A)||{id:A},te=p.map(he=>{const ce=he.cards.filter(z=>j(B(z.row))===A);return{id:he.id,title:he.title,cards:ce,count:ce.length,points:ce.reduce((z,ve)=>z+(ve.hasPoints?ve.points:0),0)}});return{id:A,title:U(I.title)?A===""?"":ae(A):String(I.title),collapsed:!!(m&&m.has(A)),columns:te,count:te.reduce((he,ce)=>he+ce.count,0),points:te.reduce((he,ce)=>he+ce.points,0)}})}function H(y){const p=Number(y);return Number.isFinite(p)?p:Number.POSITIVE_INFINITY}function Q(y,p,x){const S=Math.max(0,Math.min(p,y.length)),B=S>0?Number(y[S-1]):null,X=S<y.length?Number(y[S]):null,L=[],M=B!==null&&Number.isFinite(B),m=X!==null&&Number.isFinite(X);if(!M&&!m){for(let I=0;I<x;I++)L.push(I);return L}if(!M){for(let I=0;I<x;I++)L.push(X-(x-I));return L}if(!m){for(let I=0;I<x;I++)L.push(B+1+I);return L}const A=(X-B)/(x+1);for(let I=0;I<x;I++)L.push(B+A*(I+1));return L}function ge(y,p,x,S,B=3){const X=x>0?x:1,L=Math.max(0,Math.floor(y/X)-B),M=Math.ceil(p/X)+B*2,m=Math.min(S,L+M);return{start:L,end:m,padTop:L*X,padBottom:Math.max(0,(S-m)*X)}}function de(y,p){return new Set([...Array.isArray(y)?y.map(String):[],...Array.isArray(p)?p.filter(x=>f(x)&&x.done).map(x=>String(x.id)):[]])}function $e(y){const p=f(y)?y:{};return U(p.columnProperty)&&!p.grid&&!Array.isArray(p.columns)&&D("kanban:columnProperty",'a board needs a "columnProperty" to group cards into columns.'),{grid:p.grid||null,key:W(p.rowKey??"id"),rowKey:p.rowKey??"id",columnProperty:p.columnProperty??null,columns:p.columns??null,columnOrder:p.columnOrder??null,pointsProperty:p.pointsProperty??null,orderProperty:p.orderProperty??null,swimlaneProperty:p.swimlaneProperty??null,sprintProperty:p.sprintProperty??null,epicProperty:p.epicProperty??null,enforceWip:!!p.enforceWip,sprintList:Array.isArray(p.sprints)?p.sprints.map(x=>f(x)?{id:x.id,title:x.title}:{id:x}):null,swimlanes:!!p.swimlanes,lanes:Array.isArray(p.lanes)?p.lanes:null,doneColumns:de(p.doneColumns,p.columns),showPoints:!!p.showPoints,card:f(p.card)?p.card:{},cardSpecs:q(f(p.card)?p.card:{}),emptyText:typeof p.emptyText=="string"?p.emptyText:"",virtualize:p.virtualize?{rowHeight:f(p.virtualize)&&p.virtualize.rowHeight||96,overscan:f(p.virtualize)&&p.virtualize.overscan||3,threshold:f(p.virtualize)&&p.virtualize.threshold||50,viewport:f(p.virtualize)&&p.virtualize.viewport||600}:null}}}),_e("packages/modules/kanban/styles.js",function($,ue){"use strict";Object.defineProperty($,"NS",{enumerable:!0,get:function(){return d}}),Object.defineProperty($,"css",{enumerable:!0,get:function(){return E}}),Object.defineProperty($,"injectStyles",{enumerable:!0,get:function(){return F}});const d="lat-kanban",D="data-lattice-kanban-styles";function E(){return`
|
|
7
7
|
.${d}{
|
|
8
8
|
display:flex; flex-direction:row; align-items:stretch; gap:var(--lattice-gap,8px);
|
|
9
9
|
box-sizing:border-box; width:100%; height:100%; min-height:0;
|
package/modules/kpi.d.ts
CHANGED
package/modules/kpi.esm.min.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.81.0, kpi module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
var Ft=Object.create(null),It=Object.create(null);function Me(p,ce){Ft[p]=ce}function Mt(p){var ce=It[p];if(ce)return ce;var ee=Object.create(null);It[p]=ee;var Q=Ft[p];if(!Q)throw new Error("[lattice] missing module: "+p);return Q(ee,Mt),ee}Me("packages/core/src/internal/util.js",function(p,ce){"use strict";Object.defineProperty(p,"VERSION",{enumerable:!0,get:function(){return T}}),Object.defineProperty(p,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"warnOnce",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"infoOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"resetWarnings",{enumerable:!0,get:function(){return G}}),Object.defineProperty(p,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(p,"invariant",{enumerable:!0,get:function(){return y}}),Object.defineProperty(p,"DEV",{enumerable:!0,get:function(){return v}}),Object.defineProperty(p,"isObject",{enumerable:!0,get:function(){return g}}),Object.defineProperty(p,"isFunction",{enumerable:!0,get:function(){return b}}),Object.defineProperty(p,"isNil",{enumerable:!0,get:function(){return $}}),Object.defineProperty(p,"isBlank",{enumerable:!0,get:function(){return k}}),Object.defineProperty(p,"isCtor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(p,"pathGetter",{enumerable:!0,get:function(){return fe}}),Object.defineProperty(p,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(p,"getPath",{enumerable:!0,get:function(){return w}}),Object.defineProperty(p,"setPath",{enumerable:!0,get:function(){return F}}),Object.defineProperty(p,"humanise",{enumerable:!0,get:function(){return _}}),Object.defineProperty(p,"escapeHtml",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(p,"titleCase",{enumerable:!0,get:function(){return de}}),Object.defineProperty(p,"expand",{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(p,"toArray",{enumerable:!0,get:function(){return S}}),Object.defineProperty(p,"merge",{enumerable:!0,get:function(){return W}}),Object.defineProperty(p,"mergeRow",{enumerable:!0,get:function(){return te}}),Object.defineProperty(p,"Lru",{enumerable:!0,get:function(){return be}}),Object.defineProperty(p,"collator",{enumerable:!0,get:function(){return U}}),Object.defineProperty(p,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(p,"now",{enumerable:!0,get:function(){return N}}),Object.defineProperty(p,"nextFrame",{enumerable:!0,get:function(){return r}}),Object.defineProperty(p,"cancelFrame",{enumerable:!0,get:function(){return i}}),Object.defineProperty(p,"frameBatched",{enumerable:!0,get:function(){return t}}),Object.defineProperty(p,"settleDebounce",{enumerable:!0,get:function(){return n}}),Object.defineProperty(p,"whenIdle",{enumerable:!0,get:function(){return s}}),Object.defineProperty(p,"uid",{enumerable:!0,get:function(){return c}});const ee="1.80.0";async function Q(){return ee}const T="1.80.0",O=new Set,m=2e3;function C(o){if(O.add(o),O.size>m){const l=O.values().next().value;l!==void 0&&O.delete(l)}}const a=[],E=500;function I(o,l,f){a.push({key:o,level:l,message:f.map(A=>typeof A=="string"?A:x(A)).join(" "),at:Date.now()}),a.length>E&&a.shift()}function x(o){if(o instanceof Error)return o.message;try{return JSON.stringify(o)}catch{return String(o)}}function P(){return a.map(o=>({...o}))}function L(o){if(o.length===0||typeof o[0]!="string")return o;const l=o[0].replace(/^\[lattice\]\s*/,"");return l===o[0]?o:[l,...o.slice(1)]}function D(o,...l){if(O.has(o))return;C(o);const f=L(l);I(o,"warn",f),console.warn("[lattice]",...f)}function Z(o,...l){if(O.has(o))return;C(o);const f=L(l);I(o,"info",f),console.info("[lattice]",...f)}function G(){O.clear(),a.length=0}function d(o,l){const f=new Error(`[lattice] ${o}`);throw l!==void 0&&(f.cause=l),f}function y(o,l){o||d(l)}const v=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function g(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function b(o){return typeof o=="function"}function $(o){return o==null}function k(o){return o==null||o===""}function M(o){return typeof o!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(o))?!0:!!(o.prototype&&Object.getOwnPropertyNames(o.prototype).length>1)}const z=new Map;function fe(o){let l=z.get(o);if(l)return l;if(!o.includes("."))l=f=>f?.[o];else{const f=o.split("."),A=f.length;l=V=>{let ue=V;for(let se=0;se<A;se++){if(ue==null)return;ue=ue[f[se]]}return ue}}return z.set(o,l),l}const q=new Map;function h(o){let l=q.get(o);if(l)return l;if(!o.includes("."))l=(f,A)=>{f!=null&&(f[o]=A)};else{const f=o.split("."),A=f.length-1;l=(V,ue)=>{let se=V;for(let he=0;he<A;he++){if(se==null)return;const Se=f[he];se[Se]==null&&(se[Se]={}),se=se[Se]}se!=null&&(se[f[A]]=ue)}}return q.set(o,l),l}function w(o,l){return fe(l)(o)}function F(o,l,f){h(l)(o,f)}function _(o){return o?(o.includes(".")?o.slice(o.lastIndexOf(".")+1):o).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const H={"&":"&","<":"<",">":">",'"':""","'":"'"};function ie(o){const l=o==null?"":String(o);return/[&<>"']/.test(l)?l.replace(/[&<>"']/g,f=>H[f]):l}function de(o){return String(o).replace(/\w\S*/g,l=>l[0].toUpperCase()+l.slice(1).toLowerCase())}function Ae(o,l,f){if(o!==void 0)return o===!0?{enabled:!0,...f}:o===!1?{enabled:!1}:g(o)?o:{[l]:o,enabled:!0}}function S(o){return o==null?[]:Array.isArray(o)?o:[o]}const R=Object.freeze(new Set(["__proto__","constructor","prototype"]));function W(o,l){if(!g(o))return g(l)?{...l}:l;if(!g(l))return l===void 0?o:l;const f={...o};for(const A of Object.keys(l)){if(R.has(A))continue;const V=l[A];V!==void 0&&(f[A]=g(V)&&g(f[A])?W(f[A],V):V)}return f}function te(o,l){if(!g(o)||!g(l)||o===l)return l;const f=Object.create(Object.getPrototypeOf(o));return Object.assign(f,o,l),f}class be{#e;#t=new Map;#n;constructor(l=256,f=null){this.#e=l,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(l){this.#e=l,this.#r()}has(l){return this.#t.has(l)}get(l){const f=this.#t;if(!f.has(l))return;const A=f.get(l);return f.delete(l),f.set(l,A),A}peek(l){return this.#t.get(l)}set(l,f){const A=this.#t;return A.has(l)&&A.delete(l),A.set(l,f),this.#r(),f}delete(l){const f=this.#t.get(l);return this.#t.delete(l)&&this.#n&&this.#n(f,l),f}clear(){if(this.#n)for(const[l,f]of this.#t)this.#n(f,l);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const l=this.#t;for(;l.size>this.#e;){const f=l.keys().next().value,A=l.get(f);l.delete(f),this.#n&&this.#n(A,f)}}}const j=new Map;function U(o,l){const f=`${o||""}|${l?JSON.stringify(l):""}`;let A=j.get(f);return A||(A=new Intl.Collator(o||void 0,{numeric:!0,sensitivity:"variant",...l}),j.set(f,A)),A}function K(o,l){if(o===l)return 0;if(o==null)return 1;if(l==null)return-1;if(typeof o=="number"&&typeof l=="number")return Number.isNaN(o)?Number.isNaN(l)?0:1:Number.isNaN(l)||o<l?-1:o>l?1:0;const f=String(o),A=String(l);return f<A?-1:f>A?1:0}function N(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const e=typeof requestAnimationFrame=="function";function r(o){return e?requestAnimationFrame(o):setTimeout(()=>o(N()),16)}function i(o){o!=null&&(e?cancelAnimationFrame(o):clearTimeout(o))}function t(o){let l=null,f=null;const A=()=>{l=null;const ue=f;f=null,o(...ue||[])},V=(...ue)=>{f=ue,l===null&&(l=r(A))};return V.cancel=()=>{i(l),l=null,f=null},V.flush=()=>{l!==null&&(i(l),A())},V}function n(o,l){let f=null,A=null;const V=()=>{if(f=null,A===null)return;const he=A;A=null,o(...he),ue()},ue=()=>{f=setTimeout(V,l),typeof f?.unref=="function"&&f.unref()},se=(...he)=>{f===null?(o(...he),ue()):(A=he,clearTimeout(f),ue())};return se.flush=()=>{if(f!==null&&clearTimeout(f),f=null,A===null)return;const he=A;A=null,o(...he)},se.cancel=()=>{f!==null&&clearTimeout(f),f=null,A=null},se.pending=()=>f!==null||A!==null,se}function s(o,l=50){return typeof requestIdleCallback=="function"?requestIdleCallback(o,{timeout:l}):setTimeout(()=>o({timeRemaining:()=>0,didTimeout:!0}),1)}let u=0;function c(o="l"){return`${o}${(++u).toString(36)}`}}),Me("packages/modules/kpi/aggregate.js",function(p,ce){"use strict";Object.defineProperty(p,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(p,"makeAccumulator",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"accessorFor",{enumerable:!0,get:function(){return I}}),Object.defineProperty(p,"bandFor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(p,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"statusFor",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"barBounds",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"barPercent",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"formatValue",{enumerable:!0,get:function(){return G}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isNil,T=ee.isFunction,O=ee.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function C(d){if(Q(d)||d==="")return null;const y=typeof d=="number"?d:Number(d);return Number.isFinite(y)?y:null}function a(d){switch(d){case"count":{let y=0;return{add(){y+=1},remove(){y-=1},value(){return y}}}case"sum":{let y=0,v=0;return{add(g){const b=C(g);b!==null&&(y+=b,v+=1)},remove(g){const b=C(g);b!==null&&(y-=b,v-=1)},value(){return v>0?y:0}}}case"avg":{let y=0,v=0;return{add(g){const b=C(g);b!==null&&(y+=b,v+=1)},remove(g){const b=C(g);b!==null&&(y-=b,v-=1)},value(){return v>0?y/v:null}}}case"countDistinct":{const y=new Map;return{add(v){Q(v)||y.set(v,(y.get(v)||0)+1)},remove(v){if(Q(v))return;const g=y.get(v);g&&(g===1?y.delete(v):y.set(v,g-1))},value(){return y.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const y=new Map;let v=null,g=!1;const b=(k,M)=>d?k>M:k<M,$=()=>{let k=null;for(const M of y.keys())(k===null||b(M,k))&&(k=M);return k};return{add(k){const M=C(k);M!==null&&(y.set(M,(y.get(M)||0)+1),!g&&(v===null||b(M,v))&&(v=M))},remove(k){const M=C(k);if(M===null)return;const z=y.get(M);z&&(z===1?(y.delete(M),M===v&&(g=!0)):y.set(M,z-1))},value(){return y.size===0?null:(g&&(v=$(),g=!1),v)}}}function I(d){return T(d)?d:typeof d=="string"&&d?O(d):()=>{}}function x(d,y){if(d==null||Number.isNaN(d))return null;if(Array.isArray(y.bands)){for(const b of y.bands){const $=Q(b.min)?-1/0:b.min,k=Q(b.max)?1/0:b.max;if(d>=$&&d<k)return b.status??null}return null}const v=y.thresholds;return!v||Q(v.warn)||Q(v.critical)?null:v.direction==="lowerIsBetter"?d<=v.warn?"good":d<=v.critical?"warn":"critical":d>=v.warn?"good":d>=v.critical?"warn":"critical"}const P="unknown";function L(d,y,v){return v?x(d,y):P}function D(d){if(!d)return null;const y=[];let v=!1;const g=k=>{if(Q(k))return!1;const M=Number(k);return Number.isFinite(M)?(y.push(M),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const k of d.bands||[])g(k&&k.min)||(v=!0),g(k&&k.max)||(v=!0);else d.thresholds&&!Q(d.thresholds.warn)&&!Q(d.thresholds.critical)&&(g(d.thresholds.warn),g(d.thresholds.critical)),v=!0;if(g(d.target),v&&y.push(0),!y.length)return null;const b=Math.min(...y),$=Math.max(...y);return $>b?{lo:b,hi:$}:null}function Z(d,y){if(!y||Q(d))return null;const v=Number(d);if(!Number.isFinite(v))return null;const g=y.hi-y.lo;return g?Math.max(0,Math.min(1,(v-y.lo)/g))*100:null}function G(d,y,v="—"){if(d==null||Number.isNaN(d))return v;const g=typeof y=="string"?{type:y}:y||{},b=g.type||"number",$=g.locale||void 0,k={};b==="currency"?(k.style="currency",k.currency=g.currency||"USD"):b==="percent"?k.style="percent":b==="compact"&&(k.notation="compact"),Q(g.decimals)||(k.minimumFractionDigits=g.decimals,k.maximumFractionDigits=g.decimals);const M=typeof g.prefix=="string"?g.prefix:"",z=typeof g.suffix=="string"?g.suffix:"";try{return M+new Intl.NumberFormat($,k).format(d)+z}catch{return M+String(d)+z}}}),Me("packages/core/src/source/tree.js",function(p,ce){"use strict";Object.defineProperty(p,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(p,"buildFromPath",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"assignLevels",{enumerable:!0,get:function(){return x}}),Object.defineProperty(p,"resolveTree",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"buildTree",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"indexTree",{enumerable:!0,get:function(){return D}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.warnOnce,O="",m="\0tree:";function C(Z,G){return{physical:Z,key:G,level:0,children:[],value:void 0}}function a(Z,G){const d=[],y=new Map;for(let v=0;v<Z.length;v++){const g=Z[v],b=G.pathOf(g),$=Array.isArray(b)?b.map(M=>String(M)):[];if(!$.length){const M=C(g,G.keyOf(g));d.push(M);continue}let k=null;for(let M=0;M<$.length;M++){const z=$.slice(0,M+1).join(O),fe=M===$.length-1;let q=y.get(z);q&&fe&&q.physical===-1&&(q.physical=g,q.key=G.keyOf(g)),q||(q=C(fe?g:-1,fe?G.keyOf(g):m+z),q.level=M,q.value=$[M],y.set(z,q),k?k.children.push(q):d.push(q)),k=q}}return{roots:d,nodes:y}}function E(Z,G){const d=new Map,y=[];for(let $=0;$<Z.length;$++){const k=Z[$],M=G.keyOf(k),z=C(k,M);d.set(M,z);const fe=G.parentOf(k);fe!=null&&fe!==""&&y.push({node:z,parent:String(fe)})}let v=null;const g=new Map;for(const{node:$,parent:k}of y){const M=d.get(k);if(M){g.set($.key,M);continue}G.orphans&&G.orphans!=="root"&&(v||(v=C(-1,`${m}orphans`),v.value=G.orphans),g.set($.key,v))}const b=[];for(const $ of d.values()){const k=g.get($.key);k?k.children.push($):b.push($)}return v&&v.children.length&&b.push(v),{roots:I(b,d,G.orphans,v),nodes:d}}function I(Z,G,d,y){const v=new Set,g=[...Z];for(;g.length;){const z=g.pop();if(!v.has(z.key)){v.add(z.key);for(const fe of z.children)g.push(fe)}}const b=[];for(const z of G.values())v.has(z.key)||b.push(z);if(!b.length)return Z;const $=!!d&&d!=="root";T("tree.cycle",`tree.parentKey produced ${b.length} row(s) inside a parent cycle; `+($?`they are shown under "${d}".`:"they are shown at the root."));for(const z of b)z.children=z.children.filter(fe=>v.has(fe.key));if(!$)return[...Z,...b];let k=y;const M=[...Z];return k||(k=C(-1,`${m}orphans`),k.value=d,M.push(k)),k.children.push(...b),M}function x(Z){let G=0;const d=(y,v)=>{for(const g of y)g.level=v,v>G&&(G=v),g.children.length&&d(g.children,v+1)};return d(Z,0),G}function P(Z,G){if(!Z||typeof Z!="object")return null;const d=Z.path,y=Z.parentKey,v=Q(Z.hasChildren)?g=>!!Z.hasChildren(G.dataAt(g)):null;if(Q(d))return{mode:"path",pathOf:g=>d(G.dataAt(g)),keyOf:G.keyOf,declaresChildren:v};if(y!=null){const g=Q(y)?y:b=>b?.[y];return{mode:"parentKey",parentOf:b=>g(G.dataAt(b)),keyOf:G.keyOf,orphans:Z.orphans||"root",declaresChildren:v}}return T("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function L(Z,G){const d=G.mode==="path"?a(Z,G):E(Z,G),y=x(d.roots);return{...d,depth:y}}function D(Z,G){const d=new Map,y=v=>{for(let g=0;g<v.length;g++){const b=v[g];if(b.physical>=0){const $=G?G(b.physical):!1,k=$&&b.children.length===0;d.set(b.physical,{level:b.level,posinset:g+1,setsize:v.length,hasChildren:b.children.length>0||$,lazy:k})}b.children.length&&y(b.children)}};return y(Z),d}}),Me("packages/modules/kpi/tree.js",function(p,ce){"use strict";Object.defineProperty(p,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"worseOf",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"resolveHierarchy",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(p,"allNodes",{enumerable:!0,get:function(){return y}}),Object.defineProperty(p,"visibleNodes",{enumerable:!0,get:function(){return v}}),Object.defineProperty(p,"branchKeys",{enumerable:!0,get:function(){return g}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.isObject,O=ee.warnOnce,m=ce("packages/core/src/source/tree.js"),C=m.resolveTree,a=m.buildTree,E=".",I=Object.freeze({good:1,warn:2,critical:3}),x=Object.freeze([null,"good","warn","critical"]);function P(b){return!!b&&b.kind!=="clock"&&(b.value===null||b.value===void 0)}function L(b,$){const k=Math.max(I[b]||0,I[$]||0);return x[k]}function D(b,$){if(!$.length||b===!1)return null;if(b==null)return $.some(h=>h.id.includes(E))&&O("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const k=T(b)?b:{},M=$.map((h,w)=>w),z=h=>$[h].id;if(Q(k.path)||k.parentKey!==null&&k.parentKey!==void 0){const h=C(k,{dataAt:w=>$[w].spec,keyOf:z});return h?Z({...a(M,h),mode:h.mode},$):null}const fe=typeof k.separator=="string"&&k.separator?k.separator:E;if(!$.some(h=>h.id.includes(fe)))return null;const q=C({path:h=>String(h).split(fe)},{dataAt:h=>$[h].id,keyOf:z});return Z({...a(M,q),mode:"id"},$)}function Z(b,$){const k=new Set,M=new Set($.map(q=>q.id)),z=(q,h)=>{for(const w of q){const F=w.physical>=0?w.key:w.value===null||w.value===void 0?"":String(w.value),_=`${h}/${F}`;w.physical>=0?k.add(w.physical):M.has(_)||(w.key=_,M.add(_)),z(w.children,_)}};z(b.roots,"");const fe=$.filter((q,h)=>!k.has(h)).map(q=>q.id);return fe.length&&O("kpi:tree:unplaced",`${fe.length} KPI tile(s) are not on the tree and will not render: ${fe.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),b}function G(b,$){return b&&b.spec&&b.spec.label!==null&&b.spec.label!==void 0?String(b.spec.label):$!=null?String($):b?b.label:""}function d(b,$,k,M){const z=(fe,q,h,w)=>{const F=fe.physical>=0?$[fe.physical]:null,_=F?k.get(F.id):null,H=fe.children.map((R,W)=>z(R,q+1,W,fe.children.length)),ie=_?_.status:null;let de=I[ie]?ie:null,Ae=ie==="unknown"||P(_)?1:0,S=_?1:0;for(const R of H)de=L(de,R.rollup),Ae+=R.unknown,S+=R.items;return{key:fe.key,id:_?_.id:null,label:G(F,fe.value),level:q,posinset:h+1,setsize:w,hasChildren:H.length>0,expanded:H.length>0&&M.has(fe.key),children:H,tile:_,value:_?_.value:null,formatted:_?_.formatted:null,status:ie??null,rollup:de,unknown:Ae,items:S}};return b.roots.map((fe,q)=>z(fe,0,q,b.roots.length))}function y(b){const $=[],k=M=>{for(const z of M)$.push(z),k(z.children)};return k(b),$}function v(b){const $=[],k=M=>{for(const z of M)$.push(z),z.expanded&&k(z.children)};return k(b),$}function g(b){const $=[],k=M=>{for(const z of M)z.children.length&&($.push(z.key),k(z.children))};return k(b),$}}),Me("packages/modules/kpi/messages.js",function(p,ce){"use strict";Object.defineProperty(p,"FALLBACK_EN",{enumerable:!0,get:function(){return O}}),Object.defineProperty(p,"resolveMessages",{enumerable:!0,get:function(){return C}}),Object.defineProperty(p,"fallbackT",{enumerable:!0,get:function(){return a}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.isObject,O=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,I){return I?E.replace(/\{(\w+)\}/g,(x,P)=>P in I?String(I[P]):x):E}function C(E){const I=T(E.messages)&&Q(E.messages.t)&&E.messages||T(E.grid)&&T(E.grid.messages)&&Q(E.grid.messages.t)&&E.grid.messages||null;return(x,P)=>{if(I){let L;try{L=I.t(x,P)}catch{L=null}if(typeof L=="string"&&L&&L!==x)return L}return m(O[x]||x,P)}}const a=C({})}),Me("packages/modules/kpi/view.js",function(p,ce){"use strict";Object.defineProperty(p,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"Emitter",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"injectStyles",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"sparkPoints",{enumerable:!0,get:function(){return G}}),Object.defineProperty(p,"tileMinFor",{enumerable:!0,get:function(){return g}}),Object.defineProperty(p,"renderKPI",{enumerable:!0,get:function(){return z}});const Q=ce("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,O=ce("packages/modules/kpi/tree.js").visibleNodes,C=ce("packages/modules/kpi/messages.js").fallbackT,a="lat-kpi",E=C("kpi.status.unknown"),I=C,x=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function P(t,n){return n?t(`kpi.status.${n}`):""}function L(t){return t&&t.stale?"kpi.status.stale":"kpi.status.unknown"}class D{constructor(){this.map=new Map}on(n,s){return this.map.has(n)||this.map.set(n,new Set),this.map.get(n).add(s),()=>this.off(n,s)}off(n,s){this.map.get(n)?.delete(s)}emit(n,s){for(const u of this.map.get(n)||[])u(s)}}function Z(t){if(!t||t.getElementById&&t.getElementById(`${a}-styles`))return;const n=t.createElement("style");n.id=`${a}-styles`,n.setAttribute("id",`${a}-styles`),n.textContent=`
|
|
6
|
+
var Ft=Object.create(null),It=Object.create(null);function Me(p,ce){Ft[p]=ce}function Mt(p){var ce=It[p];if(ce)return ce;var ee=Object.create(null);It[p]=ee;var Q=Ft[p];if(!Q)throw new Error("[lattice] missing module: "+p);return Q(ee,Mt),ee}Me("packages/core/src/internal/util.js",function(p,ce){"use strict";Object.defineProperty(p,"VERSION",{enumerable:!0,get:function(){return T}}),Object.defineProperty(p,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"warnOnce",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"infoOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"resetWarnings",{enumerable:!0,get:function(){return G}}),Object.defineProperty(p,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(p,"invariant",{enumerable:!0,get:function(){return y}}),Object.defineProperty(p,"DEV",{enumerable:!0,get:function(){return v}}),Object.defineProperty(p,"isObject",{enumerable:!0,get:function(){return g}}),Object.defineProperty(p,"isFunction",{enumerable:!0,get:function(){return b}}),Object.defineProperty(p,"isNil",{enumerable:!0,get:function(){return $}}),Object.defineProperty(p,"isBlank",{enumerable:!0,get:function(){return k}}),Object.defineProperty(p,"isCtor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(p,"pathGetter",{enumerable:!0,get:function(){return fe}}),Object.defineProperty(p,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(p,"getPath",{enumerable:!0,get:function(){return w}}),Object.defineProperty(p,"setPath",{enumerable:!0,get:function(){return F}}),Object.defineProperty(p,"humanise",{enumerable:!0,get:function(){return _}}),Object.defineProperty(p,"escapeHtml",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(p,"titleCase",{enumerable:!0,get:function(){return de}}),Object.defineProperty(p,"expand",{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(p,"toArray",{enumerable:!0,get:function(){return S}}),Object.defineProperty(p,"merge",{enumerable:!0,get:function(){return W}}),Object.defineProperty(p,"mergeRow",{enumerable:!0,get:function(){return te}}),Object.defineProperty(p,"Lru",{enumerable:!0,get:function(){return be}}),Object.defineProperty(p,"collator",{enumerable:!0,get:function(){return U}}),Object.defineProperty(p,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(p,"now",{enumerable:!0,get:function(){return N}}),Object.defineProperty(p,"nextFrame",{enumerable:!0,get:function(){return r}}),Object.defineProperty(p,"cancelFrame",{enumerable:!0,get:function(){return i}}),Object.defineProperty(p,"frameBatched",{enumerable:!0,get:function(){return t}}),Object.defineProperty(p,"settleDebounce",{enumerable:!0,get:function(){return n}}),Object.defineProperty(p,"whenIdle",{enumerable:!0,get:function(){return s}}),Object.defineProperty(p,"uid",{enumerable:!0,get:function(){return c}});const ee="1.81.0";async function Q(){return ee}const T="1.81.0",O=new Set,m=2e3;function C(o){if(O.add(o),O.size>m){const l=O.values().next().value;l!==void 0&&O.delete(l)}}const a=[],E=500;function I(o,l,f){a.push({key:o,level:l,message:f.map(A=>typeof A=="string"?A:x(A)).join(" "),at:Date.now()}),a.length>E&&a.shift()}function x(o){if(o instanceof Error)return o.message;try{return JSON.stringify(o)}catch{return String(o)}}function P(){return a.map(o=>({...o}))}function L(o){if(o.length===0||typeof o[0]!="string")return o;const l=o[0].replace(/^\[lattice\]\s*/,"");return l===o[0]?o:[l,...o.slice(1)]}function D(o,...l){if(O.has(o))return;C(o);const f=L(l);I(o,"warn",f),console.warn("[lattice]",...f)}function Z(o,...l){if(O.has(o))return;C(o);const f=L(l);I(o,"info",f),console.info("[lattice]",...f)}function G(){O.clear(),a.length=0}function d(o,l){const f=new Error(`[lattice] ${o}`);throw l!==void 0&&(f.cause=l),f}function y(o,l){o||d(l)}const v=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function g(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function b(o){return typeof o=="function"}function $(o){return o==null}function k(o){return o==null||o===""}function M(o){return typeof o!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(o))?!0:!!(o.prototype&&Object.getOwnPropertyNames(o.prototype).length>1)}const z=new Map;function fe(o){let l=z.get(o);if(l)return l;if(!o.includes("."))l=f=>f?.[o];else{const f=o.split("."),A=f.length;l=V=>{let ue=V;for(let se=0;se<A;se++){if(ue==null)return;ue=ue[f[se]]}return ue}}return z.set(o,l),l}const q=new Map;function h(o){let l=q.get(o);if(l)return l;if(!o.includes("."))l=(f,A)=>{f!=null&&(f[o]=A)};else{const f=o.split("."),A=f.length-1;l=(V,ue)=>{let se=V;for(let he=0;he<A;he++){if(se==null)return;const Se=f[he];se[Se]==null&&(se[Se]={}),se=se[Se]}se!=null&&(se[f[A]]=ue)}}return q.set(o,l),l}function w(o,l){return fe(l)(o)}function F(o,l,f){h(l)(o,f)}function _(o){return o?(o.includes(".")?o.slice(o.lastIndexOf(".")+1):o).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const H={"&":"&","<":"<",">":">",'"':""","'":"'"};function ie(o){const l=o==null?"":String(o);return/[&<>"']/.test(l)?l.replace(/[&<>"']/g,f=>H[f]):l}function de(o){return String(o).replace(/\w\S*/g,l=>l[0].toUpperCase()+l.slice(1).toLowerCase())}function Ae(o,l,f){if(o!==void 0)return o===!0?{enabled:!0,...f}:o===!1?{enabled:!1}:g(o)?o:{[l]:o,enabled:!0}}function S(o){return o==null?[]:Array.isArray(o)?o:[o]}const R=Object.freeze(new Set(["__proto__","constructor","prototype"]));function W(o,l){if(!g(o))return g(l)?{...l}:l;if(!g(l))return l===void 0?o:l;const f={...o};for(const A of Object.keys(l)){if(R.has(A))continue;const V=l[A];V!==void 0&&(f[A]=g(V)&&g(f[A])?W(f[A],V):V)}return f}function te(o,l){if(!g(o)||!g(l)||o===l)return l;const f=Object.create(Object.getPrototypeOf(o));return Object.assign(f,o,l),f}class be{#e;#t=new Map;#n;constructor(l=256,f=null){this.#e=l,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(l){this.#e=l,this.#r()}has(l){return this.#t.has(l)}get(l){const f=this.#t;if(!f.has(l))return;const A=f.get(l);return f.delete(l),f.set(l,A),A}peek(l){return this.#t.get(l)}set(l,f){const A=this.#t;return A.has(l)&&A.delete(l),A.set(l,f),this.#r(),f}delete(l){const f=this.#t.get(l);return this.#t.delete(l)&&this.#n&&this.#n(f,l),f}clear(){if(this.#n)for(const[l,f]of this.#t)this.#n(f,l);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const l=this.#t;for(;l.size>this.#e;){const f=l.keys().next().value,A=l.get(f);l.delete(f),this.#n&&this.#n(A,f)}}}const j=new Map;function U(o,l){const f=`${o||""}|${l?JSON.stringify(l):""}`;let A=j.get(f);return A||(A=new Intl.Collator(o||void 0,{numeric:!0,sensitivity:"variant",...l}),j.set(f,A)),A}function K(o,l){if(o===l)return 0;if(o==null)return 1;if(l==null)return-1;if(typeof o=="number"&&typeof l=="number")return Number.isNaN(o)?Number.isNaN(l)?0:1:Number.isNaN(l)||o<l?-1:o>l?1:0;const f=String(o),A=String(l);return f<A?-1:f>A?1:0}function N(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const e=typeof requestAnimationFrame=="function";function r(o){return e?requestAnimationFrame(o):setTimeout(()=>o(N()),16)}function i(o){o!=null&&(e?cancelAnimationFrame(o):clearTimeout(o))}function t(o){let l=null,f=null;const A=()=>{l=null;const ue=f;f=null,o(...ue||[])},V=(...ue)=>{f=ue,l===null&&(l=r(A))};return V.cancel=()=>{i(l),l=null,f=null},V.flush=()=>{l!==null&&(i(l),A())},V}function n(o,l){let f=null,A=null;const V=()=>{if(f=null,A===null)return;const he=A;A=null,o(...he),ue()},ue=()=>{f=setTimeout(V,l),typeof f?.unref=="function"&&f.unref()},se=(...he)=>{f===null?(o(...he),ue()):(A=he,clearTimeout(f),ue())};return se.flush=()=>{if(f!==null&&clearTimeout(f),f=null,A===null)return;const he=A;A=null,o(...he)},se.cancel=()=>{f!==null&&clearTimeout(f),f=null,A=null},se.pending=()=>f!==null||A!==null,se}function s(o,l=50){return typeof requestIdleCallback=="function"?requestIdleCallback(o,{timeout:l}):setTimeout(()=>o({timeRemaining:()=>0,didTimeout:!0}),1)}let u=0;function c(o="l"){return`${o}${(++u).toString(36)}`}}),Me("packages/modules/kpi/aggregate.js",function(p,ce){"use strict";Object.defineProperty(p,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(p,"makeAccumulator",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"accessorFor",{enumerable:!0,get:function(){return I}}),Object.defineProperty(p,"bandFor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(p,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"statusFor",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"barBounds",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"barPercent",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"formatValue",{enumerable:!0,get:function(){return G}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isNil,T=ee.isFunction,O=ee.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function C(d){if(Q(d)||d==="")return null;const y=typeof d=="number"?d:Number(d);return Number.isFinite(y)?y:null}function a(d){switch(d){case"count":{let y=0;return{add(){y+=1},remove(){y-=1},value(){return y}}}case"sum":{let y=0,v=0;return{add(g){const b=C(g);b!==null&&(y+=b,v+=1)},remove(g){const b=C(g);b!==null&&(y-=b,v-=1)},value(){return v>0?y:0}}}case"avg":{let y=0,v=0;return{add(g){const b=C(g);b!==null&&(y+=b,v+=1)},remove(g){const b=C(g);b!==null&&(y-=b,v-=1)},value(){return v>0?y/v:null}}}case"countDistinct":{const y=new Map;return{add(v){Q(v)||y.set(v,(y.get(v)||0)+1)},remove(v){if(Q(v))return;const g=y.get(v);g&&(g===1?y.delete(v):y.set(v,g-1))},value(){return y.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const y=new Map;let v=null,g=!1;const b=(k,M)=>d?k>M:k<M,$=()=>{let k=null;for(const M of y.keys())(k===null||b(M,k))&&(k=M);return k};return{add(k){const M=C(k);M!==null&&(y.set(M,(y.get(M)||0)+1),!g&&(v===null||b(M,v))&&(v=M))},remove(k){const M=C(k);if(M===null)return;const z=y.get(M);z&&(z===1?(y.delete(M),M===v&&(g=!0)):y.set(M,z-1))},value(){return y.size===0?null:(g&&(v=$(),g=!1),v)}}}function I(d){return T(d)?d:typeof d=="string"&&d?O(d):()=>{}}function x(d,y){if(d==null||Number.isNaN(d))return null;if(Array.isArray(y.bands)){for(const b of y.bands){const $=Q(b.min)?-1/0:b.min,k=Q(b.max)?1/0:b.max;if(d>=$&&d<k)return b.status??null}return null}const v=y.thresholds;return!v||Q(v.warn)||Q(v.critical)?null:v.direction==="lowerIsBetter"?d<=v.warn?"good":d<=v.critical?"warn":"critical":d>=v.warn?"good":d>=v.critical?"warn":"critical"}const P="unknown";function L(d,y,v){return v?x(d,y):P}function D(d){if(!d)return null;const y=[];let v=!1;const g=k=>{if(Q(k))return!1;const M=Number(k);return Number.isFinite(M)?(y.push(M),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const k of d.bands||[])g(k&&k.min)||(v=!0),g(k&&k.max)||(v=!0);else d.thresholds&&!Q(d.thresholds.warn)&&!Q(d.thresholds.critical)&&(g(d.thresholds.warn),g(d.thresholds.critical)),v=!0;if(g(d.target),v&&y.push(0),!y.length)return null;const b=Math.min(...y),$=Math.max(...y);return $>b?{lo:b,hi:$}:null}function Z(d,y){if(!y||Q(d))return null;const v=Number(d);if(!Number.isFinite(v))return null;const g=y.hi-y.lo;return g?Math.max(0,Math.min(1,(v-y.lo)/g))*100:null}function G(d,y,v="—"){if(d==null||Number.isNaN(d))return v;const g=typeof y=="string"?{type:y}:y||{},b=g.type||"number",$=g.locale||void 0,k={};b==="currency"?(k.style="currency",k.currency=g.currency||"USD"):b==="percent"?k.style="percent":b==="compact"&&(k.notation="compact"),Q(g.decimals)||(k.minimumFractionDigits=g.decimals,k.maximumFractionDigits=g.decimals);const M=typeof g.prefix=="string"?g.prefix:"",z=typeof g.suffix=="string"?g.suffix:"";try{return M+new Intl.NumberFormat($,k).format(d)+z}catch{return M+String(d)+z}}}),Me("packages/core/src/source/tree.js",function(p,ce){"use strict";Object.defineProperty(p,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(p,"buildFromPath",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"assignLevels",{enumerable:!0,get:function(){return x}}),Object.defineProperty(p,"resolveTree",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"buildTree",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"indexTree",{enumerable:!0,get:function(){return D}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.warnOnce,O="",m="\0tree:";function C(Z,G){return{physical:Z,key:G,level:0,children:[],value:void 0}}function a(Z,G){const d=[],y=new Map;for(let v=0;v<Z.length;v++){const g=Z[v],b=G.pathOf(g),$=Array.isArray(b)?b.map(M=>String(M)):[];if(!$.length){const M=C(g,G.keyOf(g));d.push(M);continue}let k=null;for(let M=0;M<$.length;M++){const z=$.slice(0,M+1).join(O),fe=M===$.length-1;let q=y.get(z);q&&fe&&q.physical===-1&&(q.physical=g,q.key=G.keyOf(g)),q||(q=C(fe?g:-1,fe?G.keyOf(g):m+z),q.level=M,q.value=$[M],y.set(z,q),k?k.children.push(q):d.push(q)),k=q}}return{roots:d,nodes:y}}function E(Z,G){const d=new Map,y=[];for(let $=0;$<Z.length;$++){const k=Z[$],M=G.keyOf(k),z=C(k,M);d.set(M,z);const fe=G.parentOf(k);fe!=null&&fe!==""&&y.push({node:z,parent:String(fe)})}let v=null;const g=new Map;for(const{node:$,parent:k}of y){const M=d.get(k);if(M){g.set($.key,M);continue}G.orphans&&G.orphans!=="root"&&(v||(v=C(-1,`${m}orphans`),v.value=G.orphans),g.set($.key,v))}const b=[];for(const $ of d.values()){const k=g.get($.key);k?k.children.push($):b.push($)}return v&&v.children.length&&b.push(v),{roots:I(b,d,G.orphans,v),nodes:d}}function I(Z,G,d,y){const v=new Set,g=[...Z];for(;g.length;){const z=g.pop();if(!v.has(z.key)){v.add(z.key);for(const fe of z.children)g.push(fe)}}const b=[];for(const z of G.values())v.has(z.key)||b.push(z);if(!b.length)return Z;const $=!!d&&d!=="root";T("tree.cycle",`tree.parentKey produced ${b.length} row(s) inside a parent cycle; `+($?`they are shown under "${d}".`:"they are shown at the root."));for(const z of b)z.children=z.children.filter(fe=>v.has(fe.key));if(!$)return[...Z,...b];let k=y;const M=[...Z];return k||(k=C(-1,`${m}orphans`),k.value=d,M.push(k)),k.children.push(...b),M}function x(Z){let G=0;const d=(y,v)=>{for(const g of y)g.level=v,v>G&&(G=v),g.children.length&&d(g.children,v+1)};return d(Z,0),G}function P(Z,G){if(!Z||typeof Z!="object")return null;const d=Z.path,y=Z.parentKey,v=Q(Z.hasChildren)?g=>!!Z.hasChildren(G.dataAt(g)):null;if(Q(d))return{mode:"path",pathOf:g=>d(G.dataAt(g)),keyOf:G.keyOf,declaresChildren:v};if(y!=null){const g=Q(y)?y:b=>b?.[y];return{mode:"parentKey",parentOf:b=>g(G.dataAt(b)),keyOf:G.keyOf,orphans:Z.orphans||"root",declaresChildren:v}}return T("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function L(Z,G){const d=G.mode==="path"?a(Z,G):E(Z,G),y=x(d.roots);return{...d,depth:y}}function D(Z,G){const d=new Map,y=v=>{for(let g=0;g<v.length;g++){const b=v[g];if(b.physical>=0){const $=G?G(b.physical):!1,k=$&&b.children.length===0;d.set(b.physical,{level:b.level,posinset:g+1,setsize:v.length,hasChildren:b.children.length>0||$,lazy:k})}b.children.length&&y(b.children)}};return y(Z),d}}),Me("packages/modules/kpi/tree.js",function(p,ce){"use strict";Object.defineProperty(p,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"worseOf",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"resolveHierarchy",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(p,"allNodes",{enumerable:!0,get:function(){return y}}),Object.defineProperty(p,"visibleNodes",{enumerable:!0,get:function(){return v}}),Object.defineProperty(p,"branchKeys",{enumerable:!0,get:function(){return g}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.isObject,O=ee.warnOnce,m=ce("packages/core/src/source/tree.js"),C=m.resolveTree,a=m.buildTree,E=".",I=Object.freeze({good:1,warn:2,critical:3}),x=Object.freeze([null,"good","warn","critical"]);function P(b){return!!b&&b.kind!=="clock"&&(b.value===null||b.value===void 0)}function L(b,$){const k=Math.max(I[b]||0,I[$]||0);return x[k]}function D(b,$){if(!$.length||b===!1)return null;if(b==null)return $.some(h=>h.id.includes(E))&&O("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const k=T(b)?b:{},M=$.map((h,w)=>w),z=h=>$[h].id;if(Q(k.path)||k.parentKey!==null&&k.parentKey!==void 0){const h=C(k,{dataAt:w=>$[w].spec,keyOf:z});return h?Z({...a(M,h),mode:h.mode},$):null}const fe=typeof k.separator=="string"&&k.separator?k.separator:E;if(!$.some(h=>h.id.includes(fe)))return null;const q=C({path:h=>String(h).split(fe)},{dataAt:h=>$[h].id,keyOf:z});return Z({...a(M,q),mode:"id"},$)}function Z(b,$){const k=new Set,M=new Set($.map(q=>q.id)),z=(q,h)=>{for(const w of q){const F=w.physical>=0?w.key:w.value===null||w.value===void 0?"":String(w.value),_=`${h}/${F}`;w.physical>=0?k.add(w.physical):M.has(_)||(w.key=_,M.add(_)),z(w.children,_)}};z(b.roots,"");const fe=$.filter((q,h)=>!k.has(h)).map(q=>q.id);return fe.length&&O("kpi:tree:unplaced",`${fe.length} KPI tile(s) are not on the tree and will not render: ${fe.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),b}function G(b,$){return b&&b.spec&&b.spec.label!==null&&b.spec.label!==void 0?String(b.spec.label):$!=null?String($):b?b.label:""}function d(b,$,k,M){const z=(fe,q,h,w)=>{const F=fe.physical>=0?$[fe.physical]:null,_=F?k.get(F.id):null,H=fe.children.map((R,W)=>z(R,q+1,W,fe.children.length)),ie=_?_.status:null;let de=I[ie]?ie:null,Ae=ie==="unknown"||P(_)?1:0,S=_?1:0;for(const R of H)de=L(de,R.rollup),Ae+=R.unknown,S+=R.items;return{key:fe.key,id:_?_.id:null,label:G(F,fe.value),level:q,posinset:h+1,setsize:w,hasChildren:H.length>0,expanded:H.length>0&&M.has(fe.key),children:H,tile:_,value:_?_.value:null,formatted:_?_.formatted:null,status:ie??null,rollup:de,unknown:Ae,items:S}};return b.roots.map((fe,q)=>z(fe,0,q,b.roots.length))}function y(b){const $=[],k=M=>{for(const z of M)$.push(z),k(z.children)};return k(b),$}function v(b){const $=[],k=M=>{for(const z of M)$.push(z),z.expanded&&k(z.children)};return k(b),$}function g(b){const $=[],k=M=>{for(const z of M)z.children.length&&($.push(z.key),k(z.children))};return k(b),$}}),Me("packages/modules/kpi/messages.js",function(p,ce){"use strict";Object.defineProperty(p,"FALLBACK_EN",{enumerable:!0,get:function(){return O}}),Object.defineProperty(p,"resolveMessages",{enumerable:!0,get:function(){return C}}),Object.defineProperty(p,"fallbackT",{enumerable:!0,get:function(){return a}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.isObject,O=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,I){return I?E.replace(/\{(\w+)\}/g,(x,P)=>P in I?String(I[P]):x):E}function C(E){const I=T(E.messages)&&Q(E.messages.t)&&E.messages||T(E.grid)&&T(E.grid.messages)&&Q(E.grid.messages.t)&&E.grid.messages||null;return(x,P)=>{if(I){let L;try{L=I.t(x,P)}catch{L=null}if(typeof L=="string"&&L&&L!==x)return L}return m(O[x]||x,P)}}const a=C({})}),Me("packages/modules/kpi/view.js",function(p,ce){"use strict";Object.defineProperty(p,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"Emitter",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"injectStyles",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"sparkPoints",{enumerable:!0,get:function(){return G}}),Object.defineProperty(p,"tileMinFor",{enumerable:!0,get:function(){return g}}),Object.defineProperty(p,"renderKPI",{enumerable:!0,get:function(){return z}});const Q=ce("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,O=ce("packages/modules/kpi/tree.js").visibleNodes,C=ce("packages/modules/kpi/messages.js").fallbackT,a="lat-kpi",E=C("kpi.status.unknown"),I=C,x=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function P(t,n){return n?t(`kpi.status.${n}`):""}function L(t){return t&&t.stale?"kpi.status.stale":"kpi.status.unknown"}class D{constructor(){this.map=new Map}on(n,s){return this.map.has(n)||this.map.set(n,new Set),this.map.get(n).add(s),()=>this.off(n,s)}off(n,s){this.map.get(n)?.delete(s)}emit(n,s){for(const u of this.map.get(n)||[])u(s)}}function Z(t){if(!t||t.getElementById&&t.getElementById(`${a}-styles`))return;const n=t.createElement("style");n.id=`${a}-styles`,n.setAttribute("id",`${a}-styles`),n.textContent=`
|
|
7
7
|
.${a}{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(var(--${a}-tile-min,160px),1fr));font-family:var(--${a}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));font-size:var(--${a}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));line-height:var(--${a}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)));color:var(--${a}-fg,var(--lattice-foreground));--${a}-meter-w:var(--${a}-meter-width,calc(34px * var(--lat-chrome-scale,1)))}
|
|
8
8
|
.${a}__tile{border:1px solid var(--${a}-border,var(--lattice-border-color,#d7dbe0));border-radius:8px;padding:12px 14px;background:var(--${a}-bg,var(--lattice-background,#fff));display:flex;flex-direction:column;gap:4px;margin:0;min-width:0}
|
|
9
9
|
.${a}__tile:focus-visible{outline:2px solid var(--${a}-focus,var(--lattice-focus-color,#2563eb));outline-offset:2px}
|
package/modules/kpi.min.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.81.0, kpi module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
6
|
-
(function(_t){"use strict";var Pt=Object.create(null),jt=Object.create(null);function Me(p,ce){Pt[p]=ce}function St(p){var ce=jt[p];if(ce)return ce;var ee=Object.create(null);jt[p]=ee;var Q=Pt[p];if(!Q)throw new Error("[lattice] missing module: "+p);return Q(ee,St),ee}Me("packages/core/src/internal/util.js",function(p,ce){"use strict";Object.defineProperty(p,"VERSION",{enumerable:!0,get:function(){return T}}),Object.defineProperty(p,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"warnOnce",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"infoOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"resetWarnings",{enumerable:!0,get:function(){return G}}),Object.defineProperty(p,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(p,"invariant",{enumerable:!0,get:function(){return y}}),Object.defineProperty(p,"DEV",{enumerable:!0,get:function(){return v}}),Object.defineProperty(p,"isObject",{enumerable:!0,get:function(){return g}}),Object.defineProperty(p,"isFunction",{enumerable:!0,get:function(){return b}}),Object.defineProperty(p,"isNil",{enumerable:!0,get:function(){return $}}),Object.defineProperty(p,"isBlank",{enumerable:!0,get:function(){return k}}),Object.defineProperty(p,"isCtor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(p,"pathGetter",{enumerable:!0,get:function(){return fe}}),Object.defineProperty(p,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(p,"getPath",{enumerable:!0,get:function(){return w}}),Object.defineProperty(p,"setPath",{enumerable:!0,get:function(){return F}}),Object.defineProperty(p,"humanise",{enumerable:!0,get:function(){return _}}),Object.defineProperty(p,"escapeHtml",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(p,"titleCase",{enumerable:!0,get:function(){return de}}),Object.defineProperty(p,"expand",{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(p,"toArray",{enumerable:!0,get:function(){return S}}),Object.defineProperty(p,"merge",{enumerable:!0,get:function(){return W}}),Object.defineProperty(p,"mergeRow",{enumerable:!0,get:function(){return te}}),Object.defineProperty(p,"Lru",{enumerable:!0,get:function(){return be}}),Object.defineProperty(p,"collator",{enumerable:!0,get:function(){return U}}),Object.defineProperty(p,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(p,"now",{enumerable:!0,get:function(){return N}}),Object.defineProperty(p,"nextFrame",{enumerable:!0,get:function(){return r}}),Object.defineProperty(p,"cancelFrame",{enumerable:!0,get:function(){return i}}),Object.defineProperty(p,"frameBatched",{enumerable:!0,get:function(){return t}}),Object.defineProperty(p,"settleDebounce",{enumerable:!0,get:function(){return n}}),Object.defineProperty(p,"whenIdle",{enumerable:!0,get:function(){return s}}),Object.defineProperty(p,"uid",{enumerable:!0,get:function(){return c}});const ee="1.80.0";async function Q(){return ee}const T="1.80.0",O=new Set,m=2e3;function C(o){if(O.add(o),O.size>m){const l=O.values().next().value;l!==void 0&&O.delete(l)}}const a=[],E=500;function I(o,l,f){a.push({key:o,level:l,message:f.map(A=>typeof A=="string"?A:x(A)).join(" "),at:Date.now()}),a.length>E&&a.shift()}function x(o){if(o instanceof Error)return o.message;try{return JSON.stringify(o)}catch{return String(o)}}function P(){return a.map(o=>({...o}))}function L(o){if(o.length===0||typeof o[0]!="string")return o;const l=o[0].replace(/^\[lattice\]\s*/,"");return l===o[0]?o:[l,...o.slice(1)]}function D(o,...l){if(O.has(o))return;C(o);const f=L(l);I(o,"warn",f),console.warn("[lattice]",...f)}function Z(o,...l){if(O.has(o))return;C(o);const f=L(l);I(o,"info",f),console.info("[lattice]",...f)}function G(){O.clear(),a.length=0}function d(o,l){const f=new Error(`[lattice] ${o}`);throw l!==void 0&&(f.cause=l),f}function y(o,l){o||d(l)}const v=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function g(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function b(o){return typeof o=="function"}function $(o){return o==null}function k(o){return o==null||o===""}function M(o){return typeof o!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(o))?!0:!!(o.prototype&&Object.getOwnPropertyNames(o.prototype).length>1)}const z=new Map;function fe(o){let l=z.get(o);if(l)return l;if(!o.includes("."))l=f=>f?.[o];else{const f=o.split("."),A=f.length;l=V=>{let ue=V;for(let se=0;se<A;se++){if(ue==null)return;ue=ue[f[se]]}return ue}}return z.set(o,l),l}const q=new Map;function h(o){let l=q.get(o);if(l)return l;if(!o.includes("."))l=(f,A)=>{f!=null&&(f[o]=A)};else{const f=o.split("."),A=f.length-1;l=(V,ue)=>{let se=V;for(let he=0;he<A;he++){if(se==null)return;const Se=f[he];se[Se]==null&&(se[Se]={}),se=se[Se]}se!=null&&(se[f[A]]=ue)}}return q.set(o,l),l}function w(o,l){return fe(l)(o)}function F(o,l,f){h(l)(o,f)}function _(o){return o?(o.includes(".")?o.slice(o.lastIndexOf(".")+1):o).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const H={"&":"&","<":"<",">":">",'"':""","'":"'"};function ie(o){const l=o==null?"":String(o);return/[&<>"']/.test(l)?l.replace(/[&<>"']/g,f=>H[f]):l}function de(o){return String(o).replace(/\w\S*/g,l=>l[0].toUpperCase()+l.slice(1).toLowerCase())}function Ae(o,l,f){if(o!==void 0)return o===!0?{enabled:!0,...f}:o===!1?{enabled:!1}:g(o)?o:{[l]:o,enabled:!0}}function S(o){return o==null?[]:Array.isArray(o)?o:[o]}const R=Object.freeze(new Set(["__proto__","constructor","prototype"]));function W(o,l){if(!g(o))return g(l)?{...l}:l;if(!g(l))return l===void 0?o:l;const f={...o};for(const A of Object.keys(l)){if(R.has(A))continue;const V=l[A];V!==void 0&&(f[A]=g(V)&&g(f[A])?W(f[A],V):V)}return f}function te(o,l){if(!g(o)||!g(l)||o===l)return l;const f=Object.create(Object.getPrototypeOf(o));return Object.assign(f,o,l),f}class be{#e;#t=new Map;#n;constructor(l=256,f=null){this.#e=l,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(l){this.#e=l,this.#r()}has(l){return this.#t.has(l)}get(l){const f=this.#t;if(!f.has(l))return;const A=f.get(l);return f.delete(l),f.set(l,A),A}peek(l){return this.#t.get(l)}set(l,f){const A=this.#t;return A.has(l)&&A.delete(l),A.set(l,f),this.#r(),f}delete(l){const f=this.#t.get(l);return this.#t.delete(l)&&this.#n&&this.#n(f,l),f}clear(){if(this.#n)for(const[l,f]of this.#t)this.#n(f,l);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const l=this.#t;for(;l.size>this.#e;){const f=l.keys().next().value,A=l.get(f);l.delete(f),this.#n&&this.#n(A,f)}}}const j=new Map;function U(o,l){const f=`${o||""}|${l?JSON.stringify(l):""}`;let A=j.get(f);return A||(A=new Intl.Collator(o||void 0,{numeric:!0,sensitivity:"variant",...l}),j.set(f,A)),A}function K(o,l){if(o===l)return 0;if(o==null)return 1;if(l==null)return-1;if(typeof o=="number"&&typeof l=="number")return Number.isNaN(o)?Number.isNaN(l)?0:1:Number.isNaN(l)||o<l?-1:o>l?1:0;const f=String(o),A=String(l);return f<A?-1:f>A?1:0}function N(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const e=typeof requestAnimationFrame=="function";function r(o){return e?requestAnimationFrame(o):setTimeout(()=>o(N()),16)}function i(o){o!=null&&(e?cancelAnimationFrame(o):clearTimeout(o))}function t(o){let l=null,f=null;const A=()=>{l=null;const ue=f;f=null,o(...ue||[])},V=(...ue)=>{f=ue,l===null&&(l=r(A))};return V.cancel=()=>{i(l),l=null,f=null},V.flush=()=>{l!==null&&(i(l),A())},V}function n(o,l){let f=null,A=null;const V=()=>{if(f=null,A===null)return;const he=A;A=null,o(...he),ue()},ue=()=>{f=setTimeout(V,l),typeof f?.unref=="function"&&f.unref()},se=(...he)=>{f===null?(o(...he),ue()):(A=he,clearTimeout(f),ue())};return se.flush=()=>{if(f!==null&&clearTimeout(f),f=null,A===null)return;const he=A;A=null,o(...he)},se.cancel=()=>{f!==null&&clearTimeout(f),f=null,A=null},se.pending=()=>f!==null||A!==null,se}function s(o,l=50){return typeof requestIdleCallback=="function"?requestIdleCallback(o,{timeout:l}):setTimeout(()=>o({timeRemaining:()=>0,didTimeout:!0}),1)}let u=0;function c(o="l"){return`${o}${(++u).toString(36)}`}}),Me("packages/modules/kpi/aggregate.js",function(p,ce){"use strict";Object.defineProperty(p,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(p,"makeAccumulator",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"accessorFor",{enumerable:!0,get:function(){return I}}),Object.defineProperty(p,"bandFor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(p,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"statusFor",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"barBounds",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"barPercent",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"formatValue",{enumerable:!0,get:function(){return G}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isNil,T=ee.isFunction,O=ee.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function C(d){if(Q(d)||d==="")return null;const y=typeof d=="number"?d:Number(d);return Number.isFinite(y)?y:null}function a(d){switch(d){case"count":{let y=0;return{add(){y+=1},remove(){y-=1},value(){return y}}}case"sum":{let y=0,v=0;return{add(g){const b=C(g);b!==null&&(y+=b,v+=1)},remove(g){const b=C(g);b!==null&&(y-=b,v-=1)},value(){return v>0?y:0}}}case"avg":{let y=0,v=0;return{add(g){const b=C(g);b!==null&&(y+=b,v+=1)},remove(g){const b=C(g);b!==null&&(y-=b,v-=1)},value(){return v>0?y/v:null}}}case"countDistinct":{const y=new Map;return{add(v){Q(v)||y.set(v,(y.get(v)||0)+1)},remove(v){if(Q(v))return;const g=y.get(v);g&&(g===1?y.delete(v):y.set(v,g-1))},value(){return y.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const y=new Map;let v=null,g=!1;const b=(k,M)=>d?k>M:k<M,$=()=>{let k=null;for(const M of y.keys())(k===null||b(M,k))&&(k=M);return k};return{add(k){const M=C(k);M!==null&&(y.set(M,(y.get(M)||0)+1),!g&&(v===null||b(M,v))&&(v=M))},remove(k){const M=C(k);if(M===null)return;const z=y.get(M);z&&(z===1?(y.delete(M),M===v&&(g=!0)):y.set(M,z-1))},value(){return y.size===0?null:(g&&(v=$(),g=!1),v)}}}function I(d){return T(d)?d:typeof d=="string"&&d?O(d):()=>{}}function x(d,y){if(d==null||Number.isNaN(d))return null;if(Array.isArray(y.bands)){for(const b of y.bands){const $=Q(b.min)?-1/0:b.min,k=Q(b.max)?1/0:b.max;if(d>=$&&d<k)return b.status??null}return null}const v=y.thresholds;return!v||Q(v.warn)||Q(v.critical)?null:v.direction==="lowerIsBetter"?d<=v.warn?"good":d<=v.critical?"warn":"critical":d>=v.warn?"good":d>=v.critical?"warn":"critical"}const P="unknown";function L(d,y,v){return v?x(d,y):P}function D(d){if(!d)return null;const y=[];let v=!1;const g=k=>{if(Q(k))return!1;const M=Number(k);return Number.isFinite(M)?(y.push(M),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const k of d.bands||[])g(k&&k.min)||(v=!0),g(k&&k.max)||(v=!0);else d.thresholds&&!Q(d.thresholds.warn)&&!Q(d.thresholds.critical)&&(g(d.thresholds.warn),g(d.thresholds.critical)),v=!0;if(g(d.target),v&&y.push(0),!y.length)return null;const b=Math.min(...y),$=Math.max(...y);return $>b?{lo:b,hi:$}:null}function Z(d,y){if(!y||Q(d))return null;const v=Number(d);if(!Number.isFinite(v))return null;const g=y.hi-y.lo;return g?Math.max(0,Math.min(1,(v-y.lo)/g))*100:null}function G(d,y,v="—"){if(d==null||Number.isNaN(d))return v;const g=typeof y=="string"?{type:y}:y||{},b=g.type||"number",$=g.locale||void 0,k={};b==="currency"?(k.style="currency",k.currency=g.currency||"USD"):b==="percent"?k.style="percent":b==="compact"&&(k.notation="compact"),Q(g.decimals)||(k.minimumFractionDigits=g.decimals,k.maximumFractionDigits=g.decimals);const M=typeof g.prefix=="string"?g.prefix:"",z=typeof g.suffix=="string"?g.suffix:"";try{return M+new Intl.NumberFormat($,k).format(d)+z}catch{return M+String(d)+z}}}),Me("packages/core/src/source/tree.js",function(p,ce){"use strict";Object.defineProperty(p,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(p,"buildFromPath",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"assignLevels",{enumerable:!0,get:function(){return x}}),Object.defineProperty(p,"resolveTree",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"buildTree",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"indexTree",{enumerable:!0,get:function(){return D}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.warnOnce,O="",m="\0tree:";function C(Z,G){return{physical:Z,key:G,level:0,children:[],value:void 0}}function a(Z,G){const d=[],y=new Map;for(let v=0;v<Z.length;v++){const g=Z[v],b=G.pathOf(g),$=Array.isArray(b)?b.map(M=>String(M)):[];if(!$.length){const M=C(g,G.keyOf(g));d.push(M);continue}let k=null;for(let M=0;M<$.length;M++){const z=$.slice(0,M+1).join(O),fe=M===$.length-1;let q=y.get(z);q&&fe&&q.physical===-1&&(q.physical=g,q.key=G.keyOf(g)),q||(q=C(fe?g:-1,fe?G.keyOf(g):m+z),q.level=M,q.value=$[M],y.set(z,q),k?k.children.push(q):d.push(q)),k=q}}return{roots:d,nodes:y}}function E(Z,G){const d=new Map,y=[];for(let $=0;$<Z.length;$++){const k=Z[$],M=G.keyOf(k),z=C(k,M);d.set(M,z);const fe=G.parentOf(k);fe!=null&&fe!==""&&y.push({node:z,parent:String(fe)})}let v=null;const g=new Map;for(const{node:$,parent:k}of y){const M=d.get(k);if(M){g.set($.key,M);continue}G.orphans&&G.orphans!=="root"&&(v||(v=C(-1,`${m}orphans`),v.value=G.orphans),g.set($.key,v))}const b=[];for(const $ of d.values()){const k=g.get($.key);k?k.children.push($):b.push($)}return v&&v.children.length&&b.push(v),{roots:I(b,d,G.orphans,v),nodes:d}}function I(Z,G,d,y){const v=new Set,g=[...Z];for(;g.length;){const z=g.pop();if(!v.has(z.key)){v.add(z.key);for(const fe of z.children)g.push(fe)}}const b=[];for(const z of G.values())v.has(z.key)||b.push(z);if(!b.length)return Z;const $=!!d&&d!=="root";T("tree.cycle",`tree.parentKey produced ${b.length} row(s) inside a parent cycle; `+($?`they are shown under "${d}".`:"they are shown at the root."));for(const z of b)z.children=z.children.filter(fe=>v.has(fe.key));if(!$)return[...Z,...b];let k=y;const M=[...Z];return k||(k=C(-1,`${m}orphans`),k.value=d,M.push(k)),k.children.push(...b),M}function x(Z){let G=0;const d=(y,v)=>{for(const g of y)g.level=v,v>G&&(G=v),g.children.length&&d(g.children,v+1)};return d(Z,0),G}function P(Z,G){if(!Z||typeof Z!="object")return null;const d=Z.path,y=Z.parentKey,v=Q(Z.hasChildren)?g=>!!Z.hasChildren(G.dataAt(g)):null;if(Q(d))return{mode:"path",pathOf:g=>d(G.dataAt(g)),keyOf:G.keyOf,declaresChildren:v};if(y!=null){const g=Q(y)?y:b=>b?.[y];return{mode:"parentKey",parentOf:b=>g(G.dataAt(b)),keyOf:G.keyOf,orphans:Z.orphans||"root",declaresChildren:v}}return T("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function L(Z,G){const d=G.mode==="path"?a(Z,G):E(Z,G),y=x(d.roots);return{...d,depth:y}}function D(Z,G){const d=new Map,y=v=>{for(let g=0;g<v.length;g++){const b=v[g];if(b.physical>=0){const $=G?G(b.physical):!1,k=$&&b.children.length===0;d.set(b.physical,{level:b.level,posinset:g+1,setsize:v.length,hasChildren:b.children.length>0||$,lazy:k})}b.children.length&&y(b.children)}};return y(Z),d}}),Me("packages/modules/kpi/tree.js",function(p,ce){"use strict";Object.defineProperty(p,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"worseOf",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"resolveHierarchy",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(p,"allNodes",{enumerable:!0,get:function(){return y}}),Object.defineProperty(p,"visibleNodes",{enumerable:!0,get:function(){return v}}),Object.defineProperty(p,"branchKeys",{enumerable:!0,get:function(){return g}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.isObject,O=ee.warnOnce,m=ce("packages/core/src/source/tree.js"),C=m.resolveTree,a=m.buildTree,E=".",I=Object.freeze({good:1,warn:2,critical:3}),x=Object.freeze([null,"good","warn","critical"]);function P(b){return!!b&&b.kind!=="clock"&&(b.value===null||b.value===void 0)}function L(b,$){const k=Math.max(I[b]||0,I[$]||0);return x[k]}function D(b,$){if(!$.length||b===!1)return null;if(b==null)return $.some(h=>h.id.includes(E))&&O("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const k=T(b)?b:{},M=$.map((h,w)=>w),z=h=>$[h].id;if(Q(k.path)||k.parentKey!==null&&k.parentKey!==void 0){const h=C(k,{dataAt:w=>$[w].spec,keyOf:z});return h?Z({...a(M,h),mode:h.mode},$):null}const fe=typeof k.separator=="string"&&k.separator?k.separator:E;if(!$.some(h=>h.id.includes(fe)))return null;const q=C({path:h=>String(h).split(fe)},{dataAt:h=>$[h].id,keyOf:z});return Z({...a(M,q),mode:"id"},$)}function Z(b,$){const k=new Set,M=new Set($.map(q=>q.id)),z=(q,h)=>{for(const w of q){const F=w.physical>=0?w.key:w.value===null||w.value===void 0?"":String(w.value),_=`${h}/${F}`;w.physical>=0?k.add(w.physical):M.has(_)||(w.key=_,M.add(_)),z(w.children,_)}};z(b.roots,"");const fe=$.filter((q,h)=>!k.has(h)).map(q=>q.id);return fe.length&&O("kpi:tree:unplaced",`${fe.length} KPI tile(s) are not on the tree and will not render: ${fe.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),b}function G(b,$){return b&&b.spec&&b.spec.label!==null&&b.spec.label!==void 0?String(b.spec.label):$!=null?String($):b?b.label:""}function d(b,$,k,M){const z=(fe,q,h,w)=>{const F=fe.physical>=0?$[fe.physical]:null,_=F?k.get(F.id):null,H=fe.children.map((R,W)=>z(R,q+1,W,fe.children.length)),ie=_?_.status:null;let de=I[ie]?ie:null,Ae=ie==="unknown"||P(_)?1:0,S=_?1:0;for(const R of H)de=L(de,R.rollup),Ae+=R.unknown,S+=R.items;return{key:fe.key,id:_?_.id:null,label:G(F,fe.value),level:q,posinset:h+1,setsize:w,hasChildren:H.length>0,expanded:H.length>0&&M.has(fe.key),children:H,tile:_,value:_?_.value:null,formatted:_?_.formatted:null,status:ie??null,rollup:de,unknown:Ae,items:S}};return b.roots.map((fe,q)=>z(fe,0,q,b.roots.length))}function y(b){const $=[],k=M=>{for(const z of M)$.push(z),k(z.children)};return k(b),$}function v(b){const $=[],k=M=>{for(const z of M)$.push(z),z.expanded&&k(z.children)};return k(b),$}function g(b){const $=[],k=M=>{for(const z of M)z.children.length&&($.push(z.key),k(z.children))};return k(b),$}}),Me("packages/modules/kpi/messages.js",function(p,ce){"use strict";Object.defineProperty(p,"FALLBACK_EN",{enumerable:!0,get:function(){return O}}),Object.defineProperty(p,"resolveMessages",{enumerable:!0,get:function(){return C}}),Object.defineProperty(p,"fallbackT",{enumerable:!0,get:function(){return a}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.isObject,O=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,I){return I?E.replace(/\{(\w+)\}/g,(x,P)=>P in I?String(I[P]):x):E}function C(E){const I=T(E.messages)&&Q(E.messages.t)&&E.messages||T(E.grid)&&T(E.grid.messages)&&Q(E.grid.messages.t)&&E.grid.messages||null;return(x,P)=>{if(I){let L;try{L=I.t(x,P)}catch{L=null}if(typeof L=="string"&&L&&L!==x)return L}return m(O[x]||x,P)}}const a=C({})}),Me("packages/modules/kpi/view.js",function(p,ce){"use strict";Object.defineProperty(p,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"Emitter",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"injectStyles",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"sparkPoints",{enumerable:!0,get:function(){return G}}),Object.defineProperty(p,"tileMinFor",{enumerable:!0,get:function(){return g}}),Object.defineProperty(p,"renderKPI",{enumerable:!0,get:function(){return z}});const Q=ce("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,O=ce("packages/modules/kpi/tree.js").visibleNodes,C=ce("packages/modules/kpi/messages.js").fallbackT,a="lat-kpi",E=C("kpi.status.unknown"),I=C,x=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function P(t,n){return n?t(`kpi.status.${n}`):""}function L(t){return t&&t.stale?"kpi.status.stale":"kpi.status.unknown"}class D{constructor(){this.map=new Map}on(n,s){return this.map.has(n)||this.map.set(n,new Set),this.map.get(n).add(s),()=>this.off(n,s)}off(n,s){this.map.get(n)?.delete(s)}emit(n,s){for(const u of this.map.get(n)||[])u(s)}}function Z(t){if(!t||t.getElementById&&t.getElementById(`${a}-styles`))return;const n=t.createElement("style");n.id=`${a}-styles`,n.setAttribute("id",`${a}-styles`),n.textContent=`
|
|
6
|
+
(function(_t){"use strict";var Pt=Object.create(null),jt=Object.create(null);function Me(p,ce){Pt[p]=ce}function St(p){var ce=jt[p];if(ce)return ce;var ee=Object.create(null);jt[p]=ee;var Q=Pt[p];if(!Q)throw new Error("[lattice] missing module: "+p);return Q(ee,St),ee}Me("packages/core/src/internal/util.js",function(p,ce){"use strict";Object.defineProperty(p,"VERSION",{enumerable:!0,get:function(){return T}}),Object.defineProperty(p,"reportedWarnings",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"warnOnce",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"infoOnce",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"resetWarnings",{enumerable:!0,get:function(){return G}}),Object.defineProperty(p,"fail",{enumerable:!0,get:function(){return d}}),Object.defineProperty(p,"invariant",{enumerable:!0,get:function(){return y}}),Object.defineProperty(p,"DEV",{enumerable:!0,get:function(){return v}}),Object.defineProperty(p,"isObject",{enumerable:!0,get:function(){return g}}),Object.defineProperty(p,"isFunction",{enumerable:!0,get:function(){return b}}),Object.defineProperty(p,"isNil",{enumerable:!0,get:function(){return $}}),Object.defineProperty(p,"isBlank",{enumerable:!0,get:function(){return k}}),Object.defineProperty(p,"isCtor",{enumerable:!0,get:function(){return M}}),Object.defineProperty(p,"pathGetter",{enumerable:!0,get:function(){return fe}}),Object.defineProperty(p,"pathSetter",{enumerable:!0,get:function(){return h}}),Object.defineProperty(p,"getPath",{enumerable:!0,get:function(){return w}}),Object.defineProperty(p,"setPath",{enumerable:!0,get:function(){return F}}),Object.defineProperty(p,"humanise",{enumerable:!0,get:function(){return _}}),Object.defineProperty(p,"escapeHtml",{enumerable:!0,get:function(){return ie}}),Object.defineProperty(p,"titleCase",{enumerable:!0,get:function(){return de}}),Object.defineProperty(p,"expand",{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(p,"toArray",{enumerable:!0,get:function(){return S}}),Object.defineProperty(p,"merge",{enumerable:!0,get:function(){return W}}),Object.defineProperty(p,"mergeRow",{enumerable:!0,get:function(){return te}}),Object.defineProperty(p,"Lru",{enumerable:!0,get:function(){return be}}),Object.defineProperty(p,"collator",{enumerable:!0,get:function(){return U}}),Object.defineProperty(p,"defaultCompare",{enumerable:!0,get:function(){return K}}),Object.defineProperty(p,"now",{enumerable:!0,get:function(){return N}}),Object.defineProperty(p,"nextFrame",{enumerable:!0,get:function(){return r}}),Object.defineProperty(p,"cancelFrame",{enumerable:!0,get:function(){return i}}),Object.defineProperty(p,"frameBatched",{enumerable:!0,get:function(){return t}}),Object.defineProperty(p,"settleDebounce",{enumerable:!0,get:function(){return n}}),Object.defineProperty(p,"whenIdle",{enumerable:!0,get:function(){return s}}),Object.defineProperty(p,"uid",{enumerable:!0,get:function(){return c}});const ee="1.81.0";async function Q(){return ee}const T="1.81.0",O=new Set,m=2e3;function C(o){if(O.add(o),O.size>m){const l=O.values().next().value;l!==void 0&&O.delete(l)}}const a=[],E=500;function I(o,l,f){a.push({key:o,level:l,message:f.map(A=>typeof A=="string"?A:x(A)).join(" "),at:Date.now()}),a.length>E&&a.shift()}function x(o){if(o instanceof Error)return o.message;try{return JSON.stringify(o)}catch{return String(o)}}function P(){return a.map(o=>({...o}))}function L(o){if(o.length===0||typeof o[0]!="string")return o;const l=o[0].replace(/^\[lattice\]\s*/,"");return l===o[0]?o:[l,...o.slice(1)]}function D(o,...l){if(O.has(o))return;C(o);const f=L(l);I(o,"warn",f),console.warn("[lattice]",...f)}function Z(o,...l){if(O.has(o))return;C(o);const f=L(l);I(o,"info",f),console.info("[lattice]",...f)}function G(){O.clear(),a.length=0}function d(o,l){const f=new Error(`[lattice] ${o}`);throw l!==void 0&&(f.cause=l),f}function y(o,l){o||d(l)}const v=(()=>{try{return!(typeof process<"u"&&process.env&&process.env.NODE_ENV==="production")}catch{return!0}})();function g(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function b(o){return typeof o=="function"}function $(o){return o==null}function k(o){return o==null||o===""}function M(o){return typeof o!="function"?!1:/^class[\s{]/.test(Function.prototype.toString.call(o))?!0:!!(o.prototype&&Object.getOwnPropertyNames(o.prototype).length>1)}const z=new Map;function fe(o){let l=z.get(o);if(l)return l;if(!o.includes("."))l=f=>f?.[o];else{const f=o.split("."),A=f.length;l=V=>{let ue=V;for(let se=0;se<A;se++){if(ue==null)return;ue=ue[f[se]]}return ue}}return z.set(o,l),l}const q=new Map;function h(o){let l=q.get(o);if(l)return l;if(!o.includes("."))l=(f,A)=>{f!=null&&(f[o]=A)};else{const f=o.split("."),A=f.length-1;l=(V,ue)=>{let se=V;for(let he=0;he<A;he++){if(se==null)return;const Se=f[he];se[Se]==null&&(se[Se]={}),se=se[Se]}se!=null&&(se[f[A]]=ue)}}return q.set(o,l),l}function w(o,l){return fe(l)(o)}function F(o,l,f){h(l)(o,f)}function _(o){return o?(o.includes(".")?o.slice(o.lastIndexOf(".")+1):o).replace(/[_-]+/g," ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").replace(/\s+/g," ").trim().replace(/^./,f=>f.toUpperCase()):""}const H={"&":"&","<":"<",">":">",'"':""","'":"'"};function ie(o){const l=o==null?"":String(o);return/[&<>"']/.test(l)?l.replace(/[&<>"']/g,f=>H[f]):l}function de(o){return String(o).replace(/\w\S*/g,l=>l[0].toUpperCase()+l.slice(1).toLowerCase())}function Ae(o,l,f){if(o!==void 0)return o===!0?{enabled:!0,...f}:o===!1?{enabled:!1}:g(o)?o:{[l]:o,enabled:!0}}function S(o){return o==null?[]:Array.isArray(o)?o:[o]}const R=Object.freeze(new Set(["__proto__","constructor","prototype"]));function W(o,l){if(!g(o))return g(l)?{...l}:l;if(!g(l))return l===void 0?o:l;const f={...o};for(const A of Object.keys(l)){if(R.has(A))continue;const V=l[A];V!==void 0&&(f[A]=g(V)&&g(f[A])?W(f[A],V):V)}return f}function te(o,l){if(!g(o)||!g(l)||o===l)return l;const f=Object.create(Object.getPrototypeOf(o));return Object.assign(f,o,l),f}class be{#e;#t=new Map;#n;constructor(l=256,f=null){this.#e=l,this.#n=f}get size(){return this.#t.size}get max(){return this.#e}set max(l){this.#e=l,this.#r()}has(l){return this.#t.has(l)}get(l){const f=this.#t;if(!f.has(l))return;const A=f.get(l);return f.delete(l),f.set(l,A),A}peek(l){return this.#t.get(l)}set(l,f){const A=this.#t;return A.has(l)&&A.delete(l),A.set(l,f),this.#r(),f}delete(l){const f=this.#t.get(l);return this.#t.delete(l)&&this.#n&&this.#n(f,l),f}clear(){if(this.#n)for(const[l,f]of this.#t)this.#n(f,l);this.#t.clear()}keys(){return this.#t.keys()}values(){return this.#t.values()}#r(){const l=this.#t;for(;l.size>this.#e;){const f=l.keys().next().value,A=l.get(f);l.delete(f),this.#n&&this.#n(A,f)}}}const j=new Map;function U(o,l){const f=`${o||""}|${l?JSON.stringify(l):""}`;let A=j.get(f);return A||(A=new Intl.Collator(o||void 0,{numeric:!0,sensitivity:"variant",...l}),j.set(f,A)),A}function K(o,l){if(o===l)return 0;if(o==null)return 1;if(l==null)return-1;if(typeof o=="number"&&typeof l=="number")return Number.isNaN(o)?Number.isNaN(l)?0:1:Number.isNaN(l)||o<l?-1:o>l?1:0;const f=String(o),A=String(l);return f<A?-1:f>A?1:0}function N(){return typeof performance<"u"&&performance.now?performance.now():Date.now()}const e=typeof requestAnimationFrame=="function";function r(o){return e?requestAnimationFrame(o):setTimeout(()=>o(N()),16)}function i(o){o!=null&&(e?cancelAnimationFrame(o):clearTimeout(o))}function t(o){let l=null,f=null;const A=()=>{l=null;const ue=f;f=null,o(...ue||[])},V=(...ue)=>{f=ue,l===null&&(l=r(A))};return V.cancel=()=>{i(l),l=null,f=null},V.flush=()=>{l!==null&&(i(l),A())},V}function n(o,l){let f=null,A=null;const V=()=>{if(f=null,A===null)return;const he=A;A=null,o(...he),ue()},ue=()=>{f=setTimeout(V,l),typeof f?.unref=="function"&&f.unref()},se=(...he)=>{f===null?(o(...he),ue()):(A=he,clearTimeout(f),ue())};return se.flush=()=>{if(f!==null&&clearTimeout(f),f=null,A===null)return;const he=A;A=null,o(...he)},se.cancel=()=>{f!==null&&clearTimeout(f),f=null,A=null},se.pending=()=>f!==null||A!==null,se}function s(o,l=50){return typeof requestIdleCallback=="function"?requestIdleCallback(o,{timeout:l}):setTimeout(()=>o({timeRemaining:()=>0,didTimeout:!0}),1)}let u=0;function c(o="l"){return`${o}${(++u).toString(36)}`}}),Me("packages/modules/kpi/aggregate.js",function(p,ce){"use strict";Object.defineProperty(p,"AGGREGATIONS",{enumerable:!0,get:function(){return m}}),Object.defineProperty(p,"makeAccumulator",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"accessorFor",{enumerable:!0,get:function(){return I}}),Object.defineProperty(p,"bandFor",{enumerable:!0,get:function(){return x}}),Object.defineProperty(p,"UNKNOWN_STATUS",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"statusFor",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"barBounds",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"barPercent",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"formatValue",{enumerable:!0,get:function(){return G}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isNil,T=ee.isFunction,O=ee.pathGetter,m=Object.freeze(["sum","avg","min","max","count","countDistinct","custom"]);function C(d){if(Q(d)||d==="")return null;const y=typeof d=="number"?d:Number(d);return Number.isFinite(y)?y:null}function a(d){switch(d){case"count":{let y=0;return{add(){y+=1},remove(){y-=1},value(){return y}}}case"sum":{let y=0,v=0;return{add(g){const b=C(g);b!==null&&(y+=b,v+=1)},remove(g){const b=C(g);b!==null&&(y-=b,v-=1)},value(){return v>0?y:0}}}case"avg":{let y=0,v=0;return{add(g){const b=C(g);b!==null&&(y+=b,v+=1)},remove(g){const b=C(g);b!==null&&(y-=b,v-=1)},value(){return v>0?y/v:null}}}case"countDistinct":{const y=new Map;return{add(v){Q(v)||y.set(v,(y.get(v)||0)+1)},remove(v){if(Q(v))return;const g=y.get(v);g&&(g===1?y.delete(v):y.set(v,g-1))},value(){return y.size}}}case"min":case"max":return E(d==="max");default:return null}}function E(d){const y=new Map;let v=null,g=!1;const b=(k,M)=>d?k>M:k<M,$=()=>{let k=null;for(const M of y.keys())(k===null||b(M,k))&&(k=M);return k};return{add(k){const M=C(k);M!==null&&(y.set(M,(y.get(M)||0)+1),!g&&(v===null||b(M,v))&&(v=M))},remove(k){const M=C(k);if(M===null)return;const z=y.get(M);z&&(z===1?(y.delete(M),M===v&&(g=!0)):y.set(M,z-1))},value(){return y.size===0?null:(g&&(v=$(),g=!1),v)}}}function I(d){return T(d)?d:typeof d=="string"&&d?O(d):()=>{}}function x(d,y){if(d==null||Number.isNaN(d))return null;if(Array.isArray(y.bands)){for(const b of y.bands){const $=Q(b.min)?-1/0:b.min,k=Q(b.max)?1/0:b.max;if(d>=$&&d<k)return b.status??null}return null}const v=y.thresholds;return!v||Q(v.warn)||Q(v.critical)?null:v.direction==="lowerIsBetter"?d<=v.warn?"good":d<=v.critical?"warn":"critical":d>=v.warn?"good":d>=v.critical?"warn":"critical"}const P="unknown";function L(d,y,v){return v?x(d,y):P}function D(d){if(!d)return null;const y=[];let v=!1;const g=k=>{if(Q(k))return!1;const M=Number(k);return Number.isFinite(M)?(y.push(M),!0):!1};if(Array.isArray(d.bands)&&d.bands.length)for(const k of d.bands||[])g(k&&k.min)||(v=!0),g(k&&k.max)||(v=!0);else d.thresholds&&!Q(d.thresholds.warn)&&!Q(d.thresholds.critical)&&(g(d.thresholds.warn),g(d.thresholds.critical)),v=!0;if(g(d.target),v&&y.push(0),!y.length)return null;const b=Math.min(...y),$=Math.max(...y);return $>b?{lo:b,hi:$}:null}function Z(d,y){if(!y||Q(d))return null;const v=Number(d);if(!Number.isFinite(v))return null;const g=y.hi-y.lo;return g?Math.max(0,Math.min(1,(v-y.lo)/g))*100:null}function G(d,y,v="—"){if(d==null||Number.isNaN(d))return v;const g=typeof y=="string"?{type:y}:y||{},b=g.type||"number",$=g.locale||void 0,k={};b==="currency"?(k.style="currency",k.currency=g.currency||"USD"):b==="percent"?k.style="percent":b==="compact"&&(k.notation="compact"),Q(g.decimals)||(k.minimumFractionDigits=g.decimals,k.maximumFractionDigits=g.decimals);const M=typeof g.prefix=="string"?g.prefix:"",z=typeof g.suffix=="string"?g.suffix:"";try{return M+new Intl.NumberFormat($,k).format(d)+z}catch{return M+String(d)+z}}}),Me("packages/core/src/source/tree.js",function(p,ce){"use strict";Object.defineProperty(p,"SYNTHETIC",{enumerable:!0,get:function(){return m}}),Object.defineProperty(p,"buildFromPath",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"buildFromParentKey",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"assignLevels",{enumerable:!0,get:function(){return x}}),Object.defineProperty(p,"resolveTree",{enumerable:!0,get:function(){return P}}),Object.defineProperty(p,"buildTree",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"indexTree",{enumerable:!0,get:function(){return D}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.warnOnce,O="",m="\0tree:";function C(Z,G){return{physical:Z,key:G,level:0,children:[],value:void 0}}function a(Z,G){const d=[],y=new Map;for(let v=0;v<Z.length;v++){const g=Z[v],b=G.pathOf(g),$=Array.isArray(b)?b.map(M=>String(M)):[];if(!$.length){const M=C(g,G.keyOf(g));d.push(M);continue}let k=null;for(let M=0;M<$.length;M++){const z=$.slice(0,M+1).join(O),fe=M===$.length-1;let q=y.get(z);q&&fe&&q.physical===-1&&(q.physical=g,q.key=G.keyOf(g)),q||(q=C(fe?g:-1,fe?G.keyOf(g):m+z),q.level=M,q.value=$[M],y.set(z,q),k?k.children.push(q):d.push(q)),k=q}}return{roots:d,nodes:y}}function E(Z,G){const d=new Map,y=[];for(let $=0;$<Z.length;$++){const k=Z[$],M=G.keyOf(k),z=C(k,M);d.set(M,z);const fe=G.parentOf(k);fe!=null&&fe!==""&&y.push({node:z,parent:String(fe)})}let v=null;const g=new Map;for(const{node:$,parent:k}of y){const M=d.get(k);if(M){g.set($.key,M);continue}G.orphans&&G.orphans!=="root"&&(v||(v=C(-1,`${m}orphans`),v.value=G.orphans),g.set($.key,v))}const b=[];for(const $ of d.values()){const k=g.get($.key);k?k.children.push($):b.push($)}return v&&v.children.length&&b.push(v),{roots:I(b,d,G.orphans,v),nodes:d}}function I(Z,G,d,y){const v=new Set,g=[...Z];for(;g.length;){const z=g.pop();if(!v.has(z.key)){v.add(z.key);for(const fe of z.children)g.push(fe)}}const b=[];for(const z of G.values())v.has(z.key)||b.push(z);if(!b.length)return Z;const $=!!d&&d!=="root";T("tree.cycle",`tree.parentKey produced ${b.length} row(s) inside a parent cycle; `+($?`they are shown under "${d}".`:"they are shown at the root."));for(const z of b)z.children=z.children.filter(fe=>v.has(fe.key));if(!$)return[...Z,...b];let k=y;const M=[...Z];return k||(k=C(-1,`${m}orphans`),k.value=d,M.push(k)),k.children.push(...b),M}function x(Z){let G=0;const d=(y,v)=>{for(const g of y)g.level=v,v>G&&(G=v),g.children.length&&d(g.children,v+1)};return d(Z,0),G}function P(Z,G){if(!Z||typeof Z!="object")return null;const d=Z.path,y=Z.parentKey,v=Q(Z.hasChildren)?g=>!!Z.hasChildren(G.dataAt(g)):null;if(Q(d))return{mode:"path",pathOf:g=>d(G.dataAt(g)),keyOf:G.keyOf,declaresChildren:v};if(y!=null){const g=Q(y)?y:b=>b?.[y];return{mode:"parentKey",parentOf:b=>g(G.dataAt(b)),keyOf:G.keyOf,orphans:Z.orphans||"root",declaresChildren:v}}return T("tree.shape","tree is configured with neither `path` nor `parentKey`; rows stay flat."),null}function L(Z,G){const d=G.mode==="path"?a(Z,G):E(Z,G),y=x(d.roots);return{...d,depth:y}}function D(Z,G){const d=new Map,y=v=>{for(let g=0;g<v.length;g++){const b=v[g];if(b.physical>=0){const $=G?G(b.physical):!1,k=$&&b.children.length===0;d.set(b.physical,{level:b.level,posinset:g+1,setsize:v.length,hasChildren:b.children.length>0||$,lazy:k})}b.children.length&&y(b.children)}};return y(Z),d}}),Me("packages/modules/kpi/tree.js",function(p,ce){"use strict";Object.defineProperty(p,"DEFAULT_SEPARATOR",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"worseOf",{enumerable:!0,get:function(){return L}}),Object.defineProperty(p,"resolveHierarchy",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"decorateNodes",{enumerable:!0,get:function(){return d}}),Object.defineProperty(p,"allNodes",{enumerable:!0,get:function(){return y}}),Object.defineProperty(p,"visibleNodes",{enumerable:!0,get:function(){return v}}),Object.defineProperty(p,"branchKeys",{enumerable:!0,get:function(){return g}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.isObject,O=ee.warnOnce,m=ce("packages/core/src/source/tree.js"),C=m.resolveTree,a=m.buildTree,E=".",I=Object.freeze({good:1,warn:2,critical:3}),x=Object.freeze([null,"good","warn","critical"]);function P(b){return!!b&&b.kind!=="clock"&&(b.value===null||b.value===void 0)}function L(b,$){const k=Math.max(I[b]||0,I[$]||0);return x[k]}function D(b,$){if(!$.length||b===!1)return null;if(b==null)return $.some(h=>h.id.includes(E))&&O("kpi:tree:dotted-id","kpi: tile ids contain dots; set `tree` to render them as a hierarchy."),null;const k=T(b)?b:{},M=$.map((h,w)=>w),z=h=>$[h].id;if(Q(k.path)||k.parentKey!==null&&k.parentKey!==void 0){const h=C(k,{dataAt:w=>$[w].spec,keyOf:z});return h?Z({...a(M,h),mode:h.mode},$):null}const fe=typeof k.separator=="string"&&k.separator?k.separator:E;if(!$.some(h=>h.id.includes(fe)))return null;const q=C({path:h=>String(h).split(fe)},{dataAt:h=>$[h].id,keyOf:z});return Z({...a(M,q),mode:"id"},$)}function Z(b,$){const k=new Set,M=new Set($.map(q=>q.id)),z=(q,h)=>{for(const w of q){const F=w.physical>=0?w.key:w.value===null||w.value===void 0?"":String(w.value),_=`${h}/${F}`;w.physical>=0?k.add(w.physical):M.has(_)||(w.key=_,M.add(_)),z(w.children,_)}};z(b.roots,"");const fe=$.filter((q,h)=>!k.has(h)).map(q=>q.id);return fe.length&&O("kpi:tree:unplaced",`${fe.length} KPI tile(s) are not on the tree and will not render: ${fe.join(", ")}. Two tiles cannot share one path; a path names the tile's own place, last segment included.`),b}function G(b,$){return b&&b.spec&&b.spec.label!==null&&b.spec.label!==void 0?String(b.spec.label):$!=null?String($):b?b.label:""}function d(b,$,k,M){const z=(fe,q,h,w)=>{const F=fe.physical>=0?$[fe.physical]:null,_=F?k.get(F.id):null,H=fe.children.map((R,W)=>z(R,q+1,W,fe.children.length)),ie=_?_.status:null;let de=I[ie]?ie:null,Ae=ie==="unknown"||P(_)?1:0,S=_?1:0;for(const R of H)de=L(de,R.rollup),Ae+=R.unknown,S+=R.items;return{key:fe.key,id:_?_.id:null,label:G(F,fe.value),level:q,posinset:h+1,setsize:w,hasChildren:H.length>0,expanded:H.length>0&&M.has(fe.key),children:H,tile:_,value:_?_.value:null,formatted:_?_.formatted:null,status:ie??null,rollup:de,unknown:Ae,items:S}};return b.roots.map((fe,q)=>z(fe,0,q,b.roots.length))}function y(b){const $=[],k=M=>{for(const z of M)$.push(z),k(z.children)};return k(b),$}function v(b){const $=[],k=M=>{for(const z of M)$.push(z),z.expanded&&k(z.children)};return k(b),$}function g(b){const $=[],k=M=>{for(const z of M)z.children.length&&($.push(z.key),k(z.children))};return k(b),$}}),Me("packages/modules/kpi/messages.js",function(p,ce){"use strict";Object.defineProperty(p,"FALLBACK_EN",{enumerable:!0,get:function(){return O}}),Object.defineProperty(p,"resolveMessages",{enumerable:!0,get:function(){return C}}),Object.defineProperty(p,"fallbackT",{enumerable:!0,get:function(){return a}});const ee=ce("packages/core/src/internal/util.js"),Q=ee.isFunction,T=ee.isObject,O=Object.freeze({"kpi.status.good":"good","kpi.status.warn":"warn","kpi.status.critical":"critical","kpi.status.unknown":"No data","kpi.status.stale":"No recent data","kpi.engine":"computed by the data engine over every matching row","kpi.node.item":"{count} item","kpi.node.items":"{count} items","kpi.node.worst":"worst status {status}","kpi.node.unknown":"{count} unknown"});function m(E,I){return I?E.replace(/\{(\w+)\}/g,(x,P)=>P in I?String(I[P]):x):E}function C(E){const I=T(E.messages)&&Q(E.messages.t)&&E.messages||T(E.grid)&&T(E.grid.messages)&&Q(E.grid.messages.t)&&E.grid.messages||null;return(x,P)=>{if(I){let L;try{L=I.t(x,P)}catch{L=null}if(typeof L=="string"&&L&&L!==x)return L}return m(O[x]||x,P)}}const a=C({})}),Me("packages/modules/kpi/view.js",function(p,ce){"use strict";Object.defineProperty(p,"NS",{enumerable:!0,get:function(){return a}}),Object.defineProperty(p,"EMPTY_TEXT",{enumerable:!0,get:function(){return E}}),Object.defineProperty(p,"Emitter",{enumerable:!0,get:function(){return D}}),Object.defineProperty(p,"injectStyles",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(p,"sparkPoints",{enumerable:!0,get:function(){return G}}),Object.defineProperty(p,"tileMinFor",{enumerable:!0,get:function(){return g}}),Object.defineProperty(p,"renderKPI",{enumerable:!0,get:function(){return z}});const Q=ce("packages/modules/kpi/aggregate.js").UNKNOWN_STATUS,O=ce("packages/modules/kpi/tree.js").visibleNodes,C=ce("packages/modules/kpi/messages.js").fallbackT,a="lat-kpi",E=C("kpi.status.unknown"),I=C,x=Object.freeze({good:"●",warn:"▲",critical:"■",unknown:"○"});function P(t,n){return n?t(`kpi.status.${n}`):""}function L(t){return t&&t.stale?"kpi.status.stale":"kpi.status.unknown"}class D{constructor(){this.map=new Map}on(n,s){return this.map.has(n)||this.map.set(n,new Set),this.map.get(n).add(s),()=>this.off(n,s)}off(n,s){this.map.get(n)?.delete(s)}emit(n,s){for(const u of this.map.get(n)||[])u(s)}}function Z(t){if(!t||t.getElementById&&t.getElementById(`${a}-styles`))return;const n=t.createElement("style");n.id=`${a}-styles`,n.setAttribute("id",`${a}-styles`),n.textContent=`
|
|
7
7
|
.${a}{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(var(--${a}-tile-min,160px),1fr));font-family:var(--${a}-font-family,var(--lattice-font-family,var(--lat-chrome-font-family,system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif)));font-size:var(--${a}-font-size,var(--lattice-font-size,var(--lat-chrome-font-size,13px)));line-height:var(--${a}-line-height,var(--lattice-line-height,var(--lat-chrome-line-height,1.4)));color:var(--${a}-fg,var(--lattice-foreground));--${a}-meter-w:var(--${a}-meter-width,calc(34px * var(--lat-chrome-scale,1)))}
|
|
8
8
|
.${a}__tile{border:1px solid var(--${a}-border,var(--lattice-border-color,#d7dbe0));border-radius:8px;padding:12px 14px;background:var(--${a}-bg,var(--lattice-background,#fff));display:flex;flex-direction:column;gap:4px;margin:0;min-width:0}
|
|
9
9
|
.${a}__tile:focus-visible{outline:2px solid var(--${a}-focus,var(--lattice-focus-color,#2563eb));outline-offset:2px}
|