@burdenoff/microfe-planmagnet 2026.1008.1 → 2026.1008.3
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/dist/_virtual/__vite-browser-external.js +0 -2
- package/dist/components/MarkdownEditor.js +0 -2
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +0 -2
- package/dist/node_modules/@apollo/client/errors/ServerError.js +0 -2
- package/dist/node_modules/@apollo/client/errors/utils.js +0 -2
- package/dist/node_modules/clsx/dist/clsx.js +0 -2
- package/dist/node_modules/d3-array/src/ascending.js +0 -2
- package/dist/node_modules/d3-array/src/bisect.js +0 -2
- package/dist/node_modules/d3-array/src/bisector.js +0 -2
- package/dist/node_modules/d3-array/src/descending.js +0 -2
- package/dist/node_modules/d3-array/src/max.js +0 -2
- package/dist/node_modules/d3-array/src/min.js +0 -2
- package/dist/node_modules/d3-array/src/number.js +0 -2
- package/dist/node_modules/d3-array/src/quantile.js +0 -2
- package/dist/node_modules/d3-array/src/quickselect.js +0 -2
- package/dist/node_modules/d3-array/src/range.js +0 -2
- package/dist/node_modules/d3-array/src/sort.js +0 -2
- package/dist/node_modules/d3-array/src/ticks.js +0 -2
- package/dist/node_modules/d3-color/src/color.js +0 -2
- package/dist/node_modules/d3-color/src/define.js +0 -2
- package/dist/node_modules/d3-format/src/defaultLocale.js +0 -2
- package/dist/node_modules/d3-format/src/exponent.js +0 -2
- package/dist/node_modules/d3-format/src/formatDecimal.js +0 -2
- package/dist/node_modules/d3-format/src/formatGroup.js +0 -2
- package/dist/node_modules/d3-format/src/formatNumerals.js +0 -2
- package/dist/node_modules/d3-format/src/formatPrefixAuto.js +0 -2
- package/dist/node_modules/d3-format/src/formatRounded.js +0 -2
- package/dist/node_modules/d3-format/src/formatSpecifier.js +0 -2
- package/dist/node_modules/d3-format/src/formatTrim.js +0 -2
- package/dist/node_modules/d3-format/src/formatTypes.js +0 -2
- package/dist/node_modules/d3-format/src/identity.js +0 -2
- package/dist/node_modules/d3-format/src/locale.js +0 -2
- package/dist/node_modules/d3-format/src/precisionFixed.js +0 -2
- package/dist/node_modules/d3-format/src/precisionPrefix.js +0 -2
- package/dist/node_modules/d3-format/src/precisionRound.js +0 -2
- package/dist/node_modules/d3-interpolate/src/array.js +0 -2
- package/dist/node_modules/d3-interpolate/src/basis.js +0 -2
- package/dist/node_modules/d3-interpolate/src/basisClosed.js +0 -2
- package/dist/node_modules/d3-interpolate/src/color.js +0 -2
- package/dist/node_modules/d3-interpolate/src/constant.js +0 -2
- package/dist/node_modules/d3-interpolate/src/date.js +0 -2
- package/dist/node_modules/d3-interpolate/src/number.js +0 -2
- package/dist/node_modules/d3-interpolate/src/numberArray.js +0 -2
- package/dist/node_modules/d3-interpolate/src/object.js +0 -2
- package/dist/node_modules/d3-interpolate/src/piecewise.js +0 -2
- package/dist/node_modules/d3-interpolate/src/rgb.js +0 -2
- package/dist/node_modules/d3-interpolate/src/round.js +0 -2
- package/dist/node_modules/d3-interpolate/src/string.js +0 -2
- package/dist/node_modules/d3-interpolate/src/value.js +0 -2
- package/dist/node_modules/d3-path/src/path.js +0 -2
- package/dist/node_modules/d3-scale/src/band.js +0 -2
- package/dist/node_modules/d3-scale/src/constant.js +0 -2
- package/dist/node_modules/d3-scale/src/continuous.js +0 -2
- package/dist/node_modules/d3-scale/src/diverging.js +0 -2
- package/dist/node_modules/d3-scale/src/identity.js +0 -2
- package/dist/node_modules/d3-scale/src/init.js +0 -2
- package/dist/node_modules/d3-scale/src/linear.js +0 -2
- package/dist/node_modules/d3-scale/src/log.js +0 -2
- package/dist/node_modules/d3-scale/src/nice.js +0 -2
- package/dist/node_modules/d3-scale/src/number.js +0 -2
- package/dist/node_modules/d3-scale/src/ordinal.js +0 -2
- package/dist/node_modules/d3-scale/src/pow.js +0 -2
- package/dist/node_modules/d3-scale/src/quantile.js +0 -2
- package/dist/node_modules/d3-scale/src/quantize.js +0 -2
- package/dist/node_modules/d3-scale/src/radial.js +0 -2
- package/dist/node_modules/d3-scale/src/sequential.js +0 -2
- package/dist/node_modules/d3-scale/src/sequentialQuantile.js +0 -2
- package/dist/node_modules/d3-scale/src/symlog.js +0 -2
- package/dist/node_modules/d3-scale/src/threshold.js +0 -2
- package/dist/node_modules/d3-scale/src/tickFormat.js +0 -2
- package/dist/node_modules/d3-scale/src/time.js +0 -2
- package/dist/node_modules/d3-scale/src/utcTime.js +0 -2
- package/dist/node_modules/d3-shape/src/area.js +0 -2
- package/dist/node_modules/d3-shape/src/array.js +0 -2
- package/dist/node_modules/d3-shape/src/constant.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/basis.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/basisClosed.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/basisOpen.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/bump.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/linear.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/linearClosed.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/monotone.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/natural.js +0 -2
- package/dist/node_modules/d3-shape/src/curve/step.js +0 -2
- package/dist/node_modules/d3-shape/src/line.js +0 -2
- package/dist/node_modules/d3-shape/src/math.js +0 -2
- package/dist/node_modules/d3-shape/src/noop.js +0 -2
- package/dist/node_modules/d3-shape/src/offset/expand.js +0 -2
- package/dist/node_modules/d3-shape/src/offset/none.js +0 -2
- package/dist/node_modules/d3-shape/src/offset/silhouette.js +0 -2
- package/dist/node_modules/d3-shape/src/offset/wiggle.js +0 -2
- package/dist/node_modules/d3-shape/src/order/none.js +0 -2
- package/dist/node_modules/d3-shape/src/path.js +0 -2
- package/dist/node_modules/d3-shape/src/point.js +0 -2
- package/dist/node_modules/d3-shape/src/stack.js +0 -2
- package/dist/node_modules/d3-shape/src/symbol/circle.js +0 -2
- package/dist/node_modules/d3-shape/src/symbol/cross.js +0 -2
- package/dist/node_modules/d3-shape/src/symbol/diamond.js +0 -2
- package/dist/node_modules/d3-shape/src/symbol/square.js +0 -2
- package/dist/node_modules/d3-shape/src/symbol/star.js +0 -2
- package/dist/node_modules/d3-shape/src/symbol/triangle.js +0 -2
- package/dist/node_modules/d3-shape/src/symbol/wye.js +0 -2
- package/dist/node_modules/d3-shape/src/symbol.js +0 -2
- package/dist/node_modules/d3-time/src/day.js +0 -2
- package/dist/node_modules/d3-time/src/duration.js +0 -2
- package/dist/node_modules/d3-time/src/hour.js +0 -2
- package/dist/node_modules/d3-time/src/interval.js +0 -2
- package/dist/node_modules/d3-time/src/millisecond.js +0 -2
- package/dist/node_modules/d3-time/src/minute.js +0 -2
- package/dist/node_modules/d3-time/src/month.js +0 -2
- package/dist/node_modules/d3-time/src/second.js +0 -2
- package/dist/node_modules/d3-time/src/ticks.js +0 -2
- package/dist/node_modules/d3-time/src/week.js +0 -2
- package/dist/node_modules/d3-time/src/year.js +0 -2
- package/dist/node_modules/d3-time-format/src/defaultLocale.js +0 -2
- package/dist/node_modules/d3-time-format/src/locale.js +0 -2
- package/dist/node_modules/decimal.js-light/decimal.js +0 -2
- package/dist/node_modules/eventemitter3/index.js +0 -2
- package/dist/node_modules/fast-equals/dist/es/index.js +0 -2
- package/dist/node_modules/fflate/esm/browser.js +0 -2
- package/dist/node_modules/internmap/src/index.js +0 -2
- package/dist/node_modules/jszip/dist/jszip.min.js +0 -2
- package/dist/node_modules/lodash/_DataView.js +0 -2
- package/dist/node_modules/lodash/_Hash.js +0 -2
- package/dist/node_modules/lodash/_ListCache.js +0 -2
- package/dist/node_modules/lodash/_Map.js +0 -2
- package/dist/node_modules/lodash/_MapCache.js +0 -2
- package/dist/node_modules/lodash/_Promise.js +0 -2
- package/dist/node_modules/lodash/_Set.js +0 -2
- package/dist/node_modules/lodash/_SetCache.js +0 -2
- package/dist/node_modules/lodash/_Stack.js +0 -2
- package/dist/node_modules/lodash/_Symbol.js +0 -2
- package/dist/node_modules/lodash/_Uint8Array.js +0 -2
- package/dist/node_modules/lodash/_WeakMap.js +0 -2
- package/dist/node_modules/lodash/_apply.js +0 -2
- package/dist/node_modules/lodash/_arrayEach.js +0 -2
- package/dist/node_modules/lodash/_arrayEvery.js +0 -2
- package/dist/node_modules/lodash/_arrayFilter.js +0 -2
- package/dist/node_modules/lodash/_arrayIncludes.js +0 -2
- package/dist/node_modules/lodash/_arrayIncludesWith.js +0 -2
- package/dist/node_modules/lodash/_arrayLikeKeys.js +0 -2
- package/dist/node_modules/lodash/_arrayMap.js +0 -2
- package/dist/node_modules/lodash/_arrayPush.js +0 -2
- package/dist/node_modules/lodash/_arraySome.js +0 -2
- package/dist/node_modules/lodash/_asciiToArray.js +0 -2
- package/dist/node_modules/lodash/_assignValue.js +0 -2
- package/dist/node_modules/lodash/_assocIndexOf.js +0 -2
- package/dist/node_modules/lodash/_baseAssign.js +0 -2
- package/dist/node_modules/lodash/_baseAssignIn.js +0 -2
- package/dist/node_modules/lodash/_baseAssignValue.js +0 -2
- package/dist/node_modules/lodash/_baseClone.js +0 -2
- package/dist/node_modules/lodash/_baseCreate.js +0 -2
- package/dist/node_modules/lodash/_baseEach.js +0 -2
- package/dist/node_modules/lodash/_baseEvery.js +0 -2
- package/dist/node_modules/lodash/_baseExtremum.js +0 -2
- package/dist/node_modules/lodash/_baseFindIndex.js +0 -2
- package/dist/node_modules/lodash/_baseFlatten.js +0 -2
- package/dist/node_modules/lodash/_baseFor.js +0 -2
- package/dist/node_modules/lodash/_baseForOwn.js +0 -2
- package/dist/node_modules/lodash/_baseGet.js +0 -2
- package/dist/node_modules/lodash/_baseGetAllKeys.js +0 -2
- package/dist/node_modules/lodash/_baseGetTag.js +0 -2
- package/dist/node_modules/lodash/_baseGt.js +0 -2
- package/dist/node_modules/lodash/_baseHasIn.js +0 -2
- package/dist/node_modules/lodash/_baseIndexOf.js +0 -2
- package/dist/node_modules/lodash/_baseIsArguments.js +0 -2
- package/dist/node_modules/lodash/_baseIsEqual.js +0 -2
- package/dist/node_modules/lodash/_baseIsEqualDeep.js +0 -2
- package/dist/node_modules/lodash/_baseIsMap.js +0 -2
- package/dist/node_modules/lodash/_baseIsMatch.js +0 -2
- package/dist/node_modules/lodash/_baseIsNaN.js +0 -2
- package/dist/node_modules/lodash/_baseIsNative.js +0 -2
- package/dist/node_modules/lodash/_baseIsSet.js +0 -2
- package/dist/node_modules/lodash/_baseIsTypedArray.js +0 -2
- package/dist/node_modules/lodash/_baseIteratee.js +0 -2
- package/dist/node_modules/lodash/_baseKeys.js +0 -2
- package/dist/node_modules/lodash/_baseKeysIn.js +0 -2
- package/dist/node_modules/lodash/_baseLt.js +0 -2
- package/dist/node_modules/lodash/_baseMap.js +0 -2
- package/dist/node_modules/lodash/_baseMatches.js +0 -2
- package/dist/node_modules/lodash/_baseMatchesProperty.js +0 -2
- package/dist/node_modules/lodash/_baseOrderBy.js +0 -2
- package/dist/node_modules/lodash/_baseProperty.js +0 -2
- package/dist/node_modules/lodash/_basePropertyDeep.js +0 -2
- package/dist/node_modules/lodash/_baseRange.js +0 -2
- package/dist/node_modules/lodash/_baseRest.js +0 -2
- package/dist/node_modules/lodash/_baseSetToString.js +0 -2
- package/dist/node_modules/lodash/_baseSlice.js +0 -2
- package/dist/node_modules/lodash/_baseSome.js +0 -2
- package/dist/node_modules/lodash/_baseSortBy.js +0 -2
- package/dist/node_modules/lodash/_baseSum.js +0 -2
- package/dist/node_modules/lodash/_baseTimes.js +0 -2
- package/dist/node_modules/lodash/_baseToString.js +0 -2
- package/dist/node_modules/lodash/_baseTrim.js +0 -2
- package/dist/node_modules/lodash/_baseUnary.js +0 -2
- package/dist/node_modules/lodash/_baseUniq.js +0 -2
- package/dist/node_modules/lodash/_baseUnset.js +0 -2
- package/dist/node_modules/lodash/_cacheHas.js +0 -2
- package/dist/node_modules/lodash/_castPath.js +0 -2
- package/dist/node_modules/lodash/_castSlice.js +0 -2
- package/dist/node_modules/lodash/_cloneArrayBuffer.js +0 -2
- package/dist/node_modules/lodash/_cloneBuffer.js +0 -2
- package/dist/node_modules/lodash/_cloneDataView.js +0 -2
- package/dist/node_modules/lodash/_cloneRegExp.js +0 -2
- package/dist/node_modules/lodash/_cloneSymbol.js +0 -2
- package/dist/node_modules/lodash/_cloneTypedArray.js +0 -2
- package/dist/node_modules/lodash/_compareAscending.js +0 -2
- package/dist/node_modules/lodash/_compareMultiple.js +0 -2
- package/dist/node_modules/lodash/_copyArray.js +0 -2
- package/dist/node_modules/lodash/_copyObject.js +0 -2
- package/dist/node_modules/lodash/_copySymbols.js +0 -2
- package/dist/node_modules/lodash/_copySymbolsIn.js +0 -2
- package/dist/node_modules/lodash/_coreJsData.js +0 -2
- package/dist/node_modules/lodash/_createBaseEach.js +0 -2
- package/dist/node_modules/lodash/_createBaseFor.js +0 -2
- package/dist/node_modules/lodash/_createCaseFirst.js +0 -2
- package/dist/node_modules/lodash/_createFind.js +0 -2
- package/dist/node_modules/lodash/_createRange.js +0 -2
- package/dist/node_modules/lodash/_createSet.js +0 -2
- package/dist/node_modules/lodash/_customOmitClone.js +0 -2
- package/dist/node_modules/lodash/_defineProperty.js +0 -2
- package/dist/node_modules/lodash/_equalArrays.js +0 -2
- package/dist/node_modules/lodash/_equalByTag.js +0 -2
- package/dist/node_modules/lodash/_equalObjects.js +0 -2
- package/dist/node_modules/lodash/_flatRest.js +0 -2
- package/dist/node_modules/lodash/_freeGlobal.js +0 -2
- package/dist/node_modules/lodash/_getAllKeys.js +0 -2
- package/dist/node_modules/lodash/_getAllKeysIn.js +0 -2
- package/dist/node_modules/lodash/_getMapData.js +0 -2
- package/dist/node_modules/lodash/_getMatchData.js +0 -2
- package/dist/node_modules/lodash/_getNative.js +0 -2
- package/dist/node_modules/lodash/_getPrototype.js +0 -2
- package/dist/node_modules/lodash/_getRawTag.js +0 -2
- package/dist/node_modules/lodash/_getSymbols.js +0 -2
- package/dist/node_modules/lodash/_getSymbolsIn.js +0 -2
- package/dist/node_modules/lodash/_getTag.js +0 -2
- package/dist/node_modules/lodash/_getValue.js +0 -2
- package/dist/node_modules/lodash/_hasPath.js +0 -2
- package/dist/node_modules/lodash/_hasUnicode.js +0 -2
- package/dist/node_modules/lodash/_hashClear.js +0 -2
- package/dist/node_modules/lodash/_hashDelete.js +0 -2
- package/dist/node_modules/lodash/_hashGet.js +0 -2
- package/dist/node_modules/lodash/_hashHas.js +0 -2
- package/dist/node_modules/lodash/_hashSet.js +0 -2
- package/dist/node_modules/lodash/_initCloneArray.js +0 -2
- package/dist/node_modules/lodash/_initCloneByTag.js +0 -2
- package/dist/node_modules/lodash/_initCloneObject.js +0 -2
- package/dist/node_modules/lodash/_isFlattenable.js +0 -2
- package/dist/node_modules/lodash/_isIndex.js +0 -2
- package/dist/node_modules/lodash/_isIterateeCall.js +0 -2
- package/dist/node_modules/lodash/_isKey.js +0 -2
- package/dist/node_modules/lodash/_isKeyable.js +0 -2
- package/dist/node_modules/lodash/_isMasked.js +0 -2
- package/dist/node_modules/lodash/_isPrototype.js +0 -2
- package/dist/node_modules/lodash/_isStrictComparable.js +0 -2
- package/dist/node_modules/lodash/_listCacheClear.js +0 -2
- package/dist/node_modules/lodash/_listCacheDelete.js +0 -2
- package/dist/node_modules/lodash/_listCacheGet.js +0 -2
- package/dist/node_modules/lodash/_listCacheHas.js +0 -2
- package/dist/node_modules/lodash/_listCacheSet.js +0 -2
- package/dist/node_modules/lodash/_mapCacheClear.js +0 -2
- package/dist/node_modules/lodash/_mapCacheDelete.js +0 -2
- package/dist/node_modules/lodash/_mapCacheGet.js +0 -2
- package/dist/node_modules/lodash/_mapCacheHas.js +0 -2
- package/dist/node_modules/lodash/_mapCacheSet.js +0 -2
- package/dist/node_modules/lodash/_mapToArray.js +0 -2
- package/dist/node_modules/lodash/_matchesStrictComparable.js +0 -2
- package/dist/node_modules/lodash/_memoizeCapped.js +0 -2
- package/dist/node_modules/lodash/_nativeCreate.js +0 -2
- package/dist/node_modules/lodash/_nativeKeys.js +0 -2
- package/dist/node_modules/lodash/_nativeKeysIn.js +0 -2
- package/dist/node_modules/lodash/_nodeUtil.js +0 -2
- package/dist/node_modules/lodash/_objectToString.js +0 -2
- package/dist/node_modules/lodash/_overArg.js +0 -2
- package/dist/node_modules/lodash/_overRest.js +0 -2
- package/dist/node_modules/lodash/_parent.js +0 -2
- package/dist/node_modules/lodash/_root.js +0 -2
- package/dist/node_modules/lodash/_setCacheAdd.js +0 -2
- package/dist/node_modules/lodash/_setCacheHas.js +0 -2
- package/dist/node_modules/lodash/_setToArray.js +0 -2
- package/dist/node_modules/lodash/_setToString.js +0 -2
- package/dist/node_modules/lodash/_shortOut.js +0 -2
- package/dist/node_modules/lodash/_stackClear.js +0 -2
- package/dist/node_modules/lodash/_stackDelete.js +0 -2
- package/dist/node_modules/lodash/_stackGet.js +0 -2
- package/dist/node_modules/lodash/_stackHas.js +0 -2
- package/dist/node_modules/lodash/_stackSet.js +0 -2
- package/dist/node_modules/lodash/_strictIndexOf.js +0 -2
- package/dist/node_modules/lodash/_stringToArray.js +0 -2
- package/dist/node_modules/lodash/_stringToPath.js +0 -2
- package/dist/node_modules/lodash/_toKey.js +0 -2
- package/dist/node_modules/lodash/_toSource.js +0 -2
- package/dist/node_modules/lodash/_trimmedEndIndex.js +0 -2
- package/dist/node_modules/lodash/_unicodeToArray.js +0 -2
- package/dist/node_modules/lodash/constant.js +0 -2
- package/dist/node_modules/lodash/debounce.js +0 -2
- package/dist/node_modules/lodash/eq.js +0 -2
- package/dist/node_modules/lodash/every.js +0 -2
- package/dist/node_modules/lodash/find.js +0 -2
- package/dist/node_modules/lodash/findIndex.js +0 -2
- package/dist/node_modules/lodash/flatMap.js +0 -2
- package/dist/node_modules/lodash/flatten.js +0 -2
- package/dist/node_modules/lodash/get.js +0 -2
- package/dist/node_modules/lodash/hasIn.js +0 -2
- package/dist/node_modules/lodash/identity.js +0 -2
- package/dist/node_modules/lodash/isArguments.js +0 -2
- package/dist/node_modules/lodash/isArray.js +0 -2
- package/dist/node_modules/lodash/isArrayLike.js +0 -2
- package/dist/node_modules/lodash/isBoolean.js +0 -2
- package/dist/node_modules/lodash/isBuffer.js +0 -2
- package/dist/node_modules/lodash/isEqual.js +0 -2
- package/dist/node_modules/lodash/isFunction.js +0 -2
- package/dist/node_modules/lodash/isLength.js +0 -2
- package/dist/node_modules/lodash/isMap.js +0 -2
- package/dist/node_modules/lodash/isNaN.js +0 -2
- package/dist/node_modules/lodash/isNil.js +0 -2
- package/dist/node_modules/lodash/isNumber.js +0 -2
- package/dist/node_modules/lodash/isObject.js +0 -2
- package/dist/node_modules/lodash/isObjectLike.js +0 -2
- package/dist/node_modules/lodash/isPlainObject.js +0 -2
- package/dist/node_modules/lodash/isSet.js +0 -2
- package/dist/node_modules/lodash/isString.js +0 -2
- package/dist/node_modules/lodash/isSymbol.js +0 -2
- package/dist/node_modules/lodash/isTypedArray.js +0 -2
- package/dist/node_modules/lodash/keys.js +0 -2
- package/dist/node_modules/lodash/keysIn.js +0 -2
- package/dist/node_modules/lodash/last.js +0 -2
- package/dist/node_modules/lodash/map.js +0 -2
- package/dist/node_modules/lodash/mapValues.js +0 -2
- package/dist/node_modules/lodash/max.js +0 -2
- package/dist/node_modules/lodash/maxBy.js +0 -2
- package/dist/node_modules/lodash/memoize.js +0 -2
- package/dist/node_modules/lodash/min.js +0 -2
- package/dist/node_modules/lodash/noop.js +0 -2
- package/dist/node_modules/lodash/now.js +0 -2
- package/dist/node_modules/lodash/omit.js +0 -2
- package/dist/node_modules/lodash/property.js +0 -2
- package/dist/node_modules/lodash/range.js +0 -2
- package/dist/node_modules/lodash/some.js +0 -2
- package/dist/node_modules/lodash/sortBy.js +0 -2
- package/dist/node_modules/lodash/stubArray.js +0 -2
- package/dist/node_modules/lodash/stubFalse.js +0 -2
- package/dist/node_modules/lodash/sumBy.js +0 -2
- package/dist/node_modules/lodash/throttle.js +0 -2
- package/dist/node_modules/lodash/toFinite.js +0 -2
- package/dist/node_modules/lodash/toInteger.js +0 -2
- package/dist/node_modules/lodash/toNumber.js +0 -2
- package/dist/node_modules/lodash/toString.js +0 -2
- package/dist/node_modules/lodash/uniqBy.js +0 -2
- package/dist/node_modules/lodash/upperFirst.js +0 -2
- package/dist/node_modules/object-assign/index.js +0 -2
- package/dist/node_modules/pptxgenjs/dist/pptxgen.es.js +0 -2
- package/dist/node_modules/prop-types/checkPropTypes.js +0 -2
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js +0 -2
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js +0 -2
- package/dist/node_modules/prop-types/index.js +0 -2
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js +0 -2
- package/dist/node_modules/prop-types/lib/has.js +0 -2
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js +0 -2
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js +0 -2
- package/dist/node_modules/prop-types/node_modules/react-is/index.js +0 -2
- package/dist/node_modules/react-is/cjs/react-is.development.js +0 -2
- package/dist/node_modules/react-is/cjs/react-is.production.min.js +0 -2
- package/dist/node_modules/react-is/index.js +0 -2
- package/dist/node_modules/react-smooth/es6/Animate.js +0 -2
- package/dist/node_modules/react-smooth/es6/AnimateManager.js +0 -2
- package/dist/node_modules/react-smooth/es6/configUpdate.js +0 -2
- package/dist/node_modules/react-smooth/es6/easing.js +0 -2
- package/dist/node_modules/react-smooth/es6/index.js +0 -2
- package/dist/node_modules/react-smooth/es6/setRafTimeout.js +0 -2
- package/dist/node_modules/react-smooth/es6/util.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/Area.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/Bar.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/Brush.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/Line.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/XAxis.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/YAxis.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js +0 -2
- package/dist/node_modules/recharts/es6/cartesian/getTicks.js +0 -2
- package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js +0 -2
- package/dist/node_modules/recharts/es6/chart/AreaChart.js +0 -2
- package/dist/node_modules/recharts/es6/chart/BarChart.js +0 -2
- package/dist/node_modules/recharts/es6/chart/LineChart.js +0 -2
- package/dist/node_modules/recharts/es6/chart/Sankey.js +0 -2
- package/dist/node_modules/recharts/es6/chart/Treemap.js +0 -2
- package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js +0 -2
- package/dist/node_modules/recharts/es6/component/Cell.js +0 -2
- package/dist/node_modules/recharts/es6/component/Cursor.js +0 -2
- package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js +0 -2
- package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js +0 -2
- package/dist/node_modules/recharts/es6/component/Label.js +0 -2
- package/dist/node_modules/recharts/es6/component/LabelList.js +0 -2
- package/dist/node_modules/recharts/es6/component/Legend.js +0 -2
- package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js +0 -2
- package/dist/node_modules/recharts/es6/component/Text.js +0 -2
- package/dist/node_modules/recharts/es6/component/Tooltip.js +0 -2
- package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js +0 -2
- package/dist/node_modules/recharts/es6/container/Layer.js +0 -2
- package/dist/node_modules/recharts/es6/container/Surface.js +0 -2
- package/dist/node_modules/recharts/es6/context/chartLayoutContext.js +0 -2
- package/dist/node_modules/recharts/es6/shape/Cross.js +0 -2
- package/dist/node_modules/recharts/es6/shape/Curve.js +0 -2
- package/dist/node_modules/recharts/es6/shape/Dot.js +0 -2
- package/dist/node_modules/recharts/es6/shape/Polygon.js +0 -2
- package/dist/node_modules/recharts/es6/shape/Rectangle.js +0 -2
- package/dist/node_modules/recharts/es6/shape/Sector.js +0 -2
- package/dist/node_modules/recharts/es6/shape/Symbols.js +0 -2
- package/dist/node_modules/recharts/es6/shape/Trapezoid.js +0 -2
- package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/BarUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/CartesianUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/ChartUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/Constants.js +0 -2
- package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/DOMUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/DataUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js +0 -2
- package/dist/node_modules/recharts/es6/util/Events.js +0 -2
- package/dist/node_modules/recharts/es6/util/Global.js +0 -2
- package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js +0 -2
- package/dist/node_modules/recharts/es6/util/LogUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/PolarUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/ReactUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js +0 -2
- package/dist/node_modules/recharts/es6/util/ShallowEqual.js +0 -2
- package/dist/node_modules/recharts/es6/util/TickUtils.js +0 -2
- package/dist/node_modules/recharts/es6/util/calculateViewBox.js +0 -2
- package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js +0 -2
- package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js +0 -2
- package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js +0 -2
- package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js +0 -2
- package/dist/node_modules/recharts/es6/util/getLegendProps.js +0 -2
- package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js +0 -2
- package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js +0 -2
- package/dist/node_modules/recharts/es6/util/tooltip/translate.js +0 -2
- package/dist/node_modules/recharts/es6/util/types.js +0 -2
- package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js +0 -2
- package/dist/node_modules/recharts-scale/es6/util/arithmetic.js +0 -2
- package/dist/node_modules/recharts-scale/es6/util/utils.js +0 -2
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -2
- package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js +0 -2
- package/dist/node_modules/victory-vendor/es/d3-scale.js +0 -2
- package/dist/node_modules/write-excel-file/modules/export/convertFileContentToUint8ArrayBrowser.js +0 -2
- package/dist/node_modules/write-excel-file/modules/export/convertFilesContentToUint8Arrays.js +0 -2
- package/dist/node_modules/write-excel-file/modules/export/downloadBlob.js +0 -2
- package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileBrowser.js +0 -2
- package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileUniversal.js +0 -2
- package/dist/node_modules/write-excel-file/modules/getSheetData/getSheetData.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/features/conditionalFormatting.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/features/images.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/features/stickyRowsOrColumns.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/_Content_Types_.xml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.rels.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/rels.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sharedStrings.xml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/cell.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/column.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/columns.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/drawingReference.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/helpers/getCellStyleProperties.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/mergedCellsDescription.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageMargins.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageSetup.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/processMergedCells.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/row.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheet.xml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetData.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetViews.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml.rels.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/styles.xml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.rels.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/generateXlsxFileContents.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/getFeatures.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/convertDateToSerialNumber.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getElementXml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getWrittenFiles.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/transformContent.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getAlignmentXml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getBorderXml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getCellAddress.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFileExtensionForContentType.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFillXml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFontXml.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getOrderOfSiblings.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getXlsxColorForHexColor.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasAlignment.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasBorder.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFill.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFont.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isCellObject.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isObject.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/orderOfSiblings.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeSharedStrings.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeSheets.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeStyles.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetData.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetName.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/appendMarkupInsideElement.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/applyEnclosingElementOffset.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/escapeXmlSpecialCharacters.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/findElement.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/findElementInsideElement.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/findElementsNonRecursive_.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/getAttributesString.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/getChildElements.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/getClosingTagMarkup.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/getMarkupInsideElement.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/getOpeningTagMarkup.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/getSelfClosingTagMarkup.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/insertElementMarkupAccordingToOrderOfSiblings.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/prependMarkupInsideElement.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/removeInvalidXmlCharacters.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/replaceElement.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeName.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeValue.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeTextContent.js +0 -2
- package/dist/node_modules/write-excel-file/modules/xml/setMarkupInsideElement.js +0 -2
- package/dist/node_modules/write-excel-file/modules/zip/zipToArrayBuffer.js +0 -2
- package/dist/planmagnet/PlanMagnetRoot.js +0 -2
- package/dist/planmagnet/PlanMagnetRoutes.js +0 -2
- package/dist/planmagnet/activity/activityDescribe.js +0 -2
- package/dist/planmagnet/activity/relativeTime.js +0 -2
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.js +0 -2
- package/dist/planmagnet/automation/AutomationExecutionsPanel.js +0 -2
- package/dist/planmagnet/automation/AutomationRuleFields.js +0 -2
- package/dist/planmagnet/automation/automationRuleTypes.js +0 -2
- package/dist/planmagnet/board/BoardViewBar.js +0 -2
- package/dist/planmagnet/board/BulkActions.js +0 -2
- package/dist/planmagnet/board/ProjectBoard.js +0 -2
- package/dist/planmagnet/board/boardViewConfig.js +0 -2
- package/dist/planmagnet/budgets/BudgetControls.js +0 -2
- package/dist/planmagnet/budgets/ExpenseControls.js +0 -2
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.js +0 -2
- package/dist/planmagnet/budgets/budgetMath.js +0 -2
- package/dist/planmagnet/comments/CommentAttachmentUpload.js +0 -2
- package/dist/planmagnet/comments/CommentAttachments.js +0 -2
- package/dist/planmagnet/comments/CommentBody.js +0 -2
- package/dist/planmagnet/comments/CommentThread.js +0 -2
- package/dist/planmagnet/comments/MentionComposer.js +0 -2
- package/dist/planmagnet/comments/RoadmapComments.js +0 -2
- package/dist/planmagnet/comments/TargetComments.js +0 -2
- package/dist/planmagnet/comments/WorkItemActivity.js +0 -2
- package/dist/planmagnet/comments/WorkItemComments.js +0 -2
- package/dist/planmagnet/comments/commentAttachmentUploadClient.js +0 -2
- package/dist/planmagnet/comments/commentImageTokens.js +0 -2
- package/dist/planmagnet/comments/commentTokens.js +0 -2
- package/dist/planmagnet/comments/fileDisplay.js +0 -2
- package/dist/planmagnet/comments/useCommentFileUrl.js +0 -2
- package/dist/planmagnet/controls/AutomationRuleControls.js +0 -2
- package/dist/planmagnet/controls/CompetitorControls.js +0 -2
- package/dist/planmagnet/controls/ConfirmButton.js +0 -2
- package/dist/planmagnet/controls/CustomFieldControls.js +0 -2
- package/dist/planmagnet/controls/CustomFieldValuesPanel.js +0 -2
- package/dist/planmagnet/controls/FeatureControls.js +0 -2
- package/dist/planmagnet/controls/FeatureTriage.js +0 -2
- package/dist/planmagnet/controls/FeedbackControls.js +0 -2
- package/dist/planmagnet/controls/LiveStatus.js +0 -2
- package/dist/planmagnet/controls/MilestoneControls.js +0 -2
- package/dist/planmagnet/controls/ObjectiveControls.js +0 -2
- package/dist/planmagnet/controls/Pickers.js +0 -2
- package/dist/planmagnet/controls/PortfolioControls.js +0 -2
- package/dist/planmagnet/controls/PrioritizationControls.js +0 -2
- package/dist/planmagnet/controls/ProgramControls.js +0 -2
- package/dist/planmagnet/controls/ProjectControls.js +0 -2
- package/dist/planmagnet/controls/QualityGateControls.js +0 -2
- package/dist/planmagnet/controls/ReleaseControls.js +0 -2
- package/dist/planmagnet/controls/RiskControls.js +0 -2
- package/dist/planmagnet/controls/SyncControls.js +0 -2
- package/dist/planmagnet/controls/TemplateControls.js +0 -2
- package/dist/planmagnet/controls/WebhookSubscriptionControls.js +0 -2
- package/dist/planmagnet/controls/WorkItemControls.js +0 -2
- package/dist/planmagnet/create/CreateDialogs.js +0 -2
- package/dist/planmagnet/dashboards/DashboardUI.js +0 -2
- package/dist/planmagnet/dashboards/cards/DeliveryTimelineCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/ObjectivesProgressCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/PortfolioHealthCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/QualityMetricsCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/RiskSeverityCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/RoadmapHorizonCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/SprintCapacityCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/TaskCompletionCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/TeamCapacityCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/TeamOverviewCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/TeamWorkloadCard.js +0 -2
- package/dist/planmagnet/dashboards/cards/TimeLoggedCard.js +0 -2
- package/dist/planmagnet/dependency/DependencyGraph.js +0 -2
- package/dist/planmagnet/dependency/DependencyPanel.js +0 -2
- package/dist/planmagnet/dependency/GanttChart.js +0 -2
- package/dist/planmagnet/dependency/useProjectWorkItemsGraph.js +0 -2
- package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js +0 -2
- package/dist/planmagnet/docs/DocDiffView.js +0 -2
- package/dist/planmagnet/docs/DocStatusBadge.js +0 -2
- package/dist/planmagnet/docs/DocSuggestionsPanel.js +0 -2
- package/dist/planmagnet/docs/DocVersionCompare.js +0 -2
- package/dist/planmagnet/export/ExportWorkItemsButton.js +0 -2
- package/dist/planmagnet/export/workItemsCsv.js +0 -2
- package/dist/planmagnet/forecast/DeliveryForecastCard.js +0 -2
- package/dist/planmagnet/forecast/ProjectOutlookCard.js +0 -2
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js +0 -2
- package/dist/planmagnet/forecast/ResourceForecastCard.js +0 -2
- package/dist/planmagnet/forecast/riskFlags.js +0 -2
- package/dist/planmagnet/hooks/useCounts.js +0 -2
- package/dist/planmagnet/hooks/useEntityId.js +0 -2
- package/dist/planmagnet/hooks/useLiveRefresh.js +0 -2
- package/dist/planmagnet/hooks/usePresence.js +0 -2
- package/dist/planmagnet/hooks/useProjectWorkflow.js +0 -2
- package/dist/planmagnet/import/exportColumns.js +0 -2
- package/dist/planmagnet/integrations/routes.js +0 -2
- package/dist/planmagnet/integrations/syncTypes.js +0 -2
- package/dist/planmagnet/integrations/useSyncProviderCapabilities.js +0 -2
- package/dist/planmagnet/links/CodeLinksPanel.js +0 -2
- package/dist/planmagnet/links/IssueLinksPanel.js +0 -2
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.js +0 -2
- package/dist/planmagnet/meetings/MeetingsCard.js +0 -2
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js +0 -2
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.js +0 -2
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.js +0 -2
- package/dist/planmagnet/meetings/meetingActions.js +0 -2
- package/dist/planmagnet/meetings/meetingGraphql.js +0 -2
- package/dist/planmagnet/meetings/meetingModel.js +0 -2
- package/dist/planmagnet/milestones/MilestoneControls.js +0 -2
- package/dist/planmagnet/pages/ActivityActivityPagePage.js +0 -2
- package/dist/planmagnet/pages/AiActivityPagePage.js +0 -2
- package/dist/planmagnet/pages/AiPlanPagePage.js +0 -2
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +0 -2
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js +0 -2
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +0 -2
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +0 -2
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +0 -2
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +0 -2
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js +0 -2
- package/dist/planmagnet/pages/DashboardsExecutivePagePage.js +0 -2
- package/dist/planmagnet/pages/DashboardsLeadershipPagePage.js +0 -2
- package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.js +0 -2
- package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.js +0 -2
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/DocsDocsPagePage.js +0 -2
- package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js +0 -2
- package/dist/planmagnet/pages/GoalsGoalsPagePage.js +0 -2
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js +0 -2
- package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js +0 -2
- package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js +0 -2
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js +0 -2
- package/dist/planmagnet/pages/NotFoundPage.js +0 -2
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js +0 -2
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js +0 -2
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsEditRoadmapPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsPrioritizationPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsProductLinesPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js +0 -2
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js +0 -2
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsGanttPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsQualityGatesPagePage.js +0 -2
- package/dist/planmagnet/pages/ProjectsWorkflowPagePage.js +0 -2
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +0 -2
- package/dist/planmagnet/pages/ReportsEditReportPagePage.js +0 -2
- package/dist/planmagnet/pages/ReportsReportPagePage.js +0 -2
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +0 -2
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js +0 -2
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksImportPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksMyDashboardPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksMyWorkPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksTasksPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.js +0 -2
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +0 -2
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +99 -101
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js +0 -2
- package/dist/planmagnet/pages/TeamTeamEditPagePage.js +0 -2
- package/dist/planmagnet/pages/TeamTeamPagePage.js +0 -2
- package/dist/planmagnet/pages/TeamTeamsListPagePage.js +0 -2
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js +0 -2
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js +0 -2
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +0 -2
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +0 -2
- package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js +0 -2
- package/dist/planmagnet/pages/analytics/MetricsCard.js +0 -2
- package/dist/planmagnet/pages/analytics/QualityMetricsCard.js +0 -2
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js +0 -2
- package/dist/planmagnet/pages/analytics/StatusFlowCard.js +0 -2
- package/dist/planmagnet/pages/analytics/ThroughputCard.js +0 -2
- package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js +0 -2
- package/dist/planmagnet/pages/analytics/analyticsRange.js +0 -2
- package/dist/planmagnet/people/People.js +0 -2
- package/dist/planmagnet/presence/PresenceAvatars.js +0 -2
- package/dist/planmagnet/product/FeatureLinkPanels.js +0 -2
- package/dist/planmagnet/product/ProductControls.js +0 -2
- package/dist/planmagnet/product/ProductFeatureControls.js +0 -2
- package/dist/planmagnet/product/ProductFeatureLinkCard.js +0 -2
- package/dist/planmagnet/product/ProductLineControls.js +0 -2
- package/dist/planmagnet/product/ProductTeamsPanel.js +0 -2
- package/dist/planmagnet/product/WorkItemProductFeatureChip.js +0 -2
- package/dist/planmagnet/product/hierarchy.js +0 -2
- package/dist/planmagnet/product/hierarchyOperations.js +0 -2
- package/dist/planmagnet/product/refusal.js +0 -2
- package/dist/planmagnet/product/routes.js +0 -2
- package/dist/planmagnet/providers/PlanMagnetProvider.js +0 -2
- package/dist/planmagnet/releases/ReleaseChecklistCard.js +0 -2
- package/dist/planmagnet/releases/ReleaseGatesCard.js +0 -2
- package/dist/planmagnet/releases/ReleaseNotesCard.js +0 -2
- package/dist/planmagnet/releases/ReleaseReadinessCard.js +0 -2
- package/dist/planmagnet/releases/ReleaseWorkItemsCard.js +0 -2
- package/dist/planmagnet/releases/useReleaseOptions.js +0 -2
- package/dist/planmagnet/reports/ExportMenu.js +0 -2
- package/dist/planmagnet/reports/PrintReportView.js +0 -2
- package/dist/planmagnet/reports/ReportBuilderCanvas.js +0 -2
- package/dist/planmagnet/reports/ReportBuilderPage.js +0 -2
- package/dist/planmagnet/reports/ReportRunHistory.js +0 -2
- package/dist/planmagnet/reports/ReportWidgetRenderer.js +0 -2
- package/dist/planmagnet/reports/SchedulesPanel.js +0 -2
- package/dist/planmagnet/reports/ShareDialog.js +0 -2
- package/dist/planmagnet/reports/SharedReportPage.js +0 -2
- package/dist/planmagnet/reports/WidgetEditorDialog.js +0 -2
- package/dist/planmagnet/reports/reportExportPptx.js +0 -2
- package/dist/planmagnet/reports/reportExportXlsx.js +0 -2
- package/dist/planmagnet/reports/reportGraphql.js +0 -2
- package/dist/planmagnet/reports/reportModel.js +0 -2
- package/dist/planmagnet/reports/sharedReportRoute.js +0 -2
- package/dist/planmagnet/roadmaps/FeatureInitiativeCard.js +0 -2
- package/dist/planmagnet/roadmaps/RoadmapControls.js +0 -2
- package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js +0 -2
- package/dist/planmagnet/roadmaps/RoadmapPresentation.js +0 -2
- package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js +0 -2
- package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js +0 -2
- package/dist/planmagnet/roadmaps/planningFocus.js +0 -2
- package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.js +0 -2
- package/dist/planmagnet/satisfaction/SatisfactionFigures.js +0 -2
- package/dist/planmagnet/satisfaction/SatisfactionImportDialog.js +0 -2
- package/dist/planmagnet/satisfaction/SatisfactionLinkFields.js +0 -2
- package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.js +0 -2
- package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.js +0 -2
- package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.js +0 -2
- package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.js +0 -2
- package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.js +0 -2
- package/dist/planmagnet/satisfaction/satisfaction.js +0 -2
- package/dist/planmagnet/satisfaction/satisfactionCsv.js +0 -2
- package/dist/planmagnet/satisfaction/satisfactionForm.js +0 -2
- package/dist/planmagnet/satisfaction/satisfactionOperations.js +0 -2
- package/dist/planmagnet/satisfaction/useSatisfactionAccess.js +0 -2
- package/dist/planmagnet/skills/RequiredSkillsEditor.js +0 -2
- package/dist/planmagnet/skills/SkillChips.js +0 -2
- package/dist/planmagnet/skills/SkillCoverageCard.js +0 -2
- package/dist/planmagnet/skills/WorkItemRequiredSkills.js +0 -2
- package/dist/planmagnet/skills/skillOperations.js +0 -2
- package/dist/planmagnet/skills/skillTags.js +0 -2
- package/dist/planmagnet/skills/useRequiredSkillsDraft.js +0 -2
- package/dist/planmagnet/sprints/SprintControls.js +0 -2
- package/dist/planmagnet/sprints/SprintDates.js +0 -2
- package/dist/planmagnet/store/planmagnetStore.js +0 -2
- package/dist/planmagnet/team/PendingInvitations.d.ts +1 -3
- package/dist/planmagnet/team/PendingInvitations.js +62 -65
- package/dist/planmagnet/team/TeamControls.js +0 -2
- package/dist/planmagnet/team/UnmatchedCrewIdentities.js +0 -2
- package/dist/planmagnet/team/invitationEmail.js +0 -2
- package/dist/planmagnet/time/TaskTimePanel.js +0 -2
- package/dist/planmagnet/time/TimeEntryControls.js +0 -2
- package/dist/planmagnet/time/TimesheetControls.js +0 -2
- package/dist/planmagnet/time/timeShared.js +0 -2
- package/dist/planmagnet/utils/cn.js +0 -2
- package/dist/planmagnet/utils/email.js +0 -2
- package/dist/planmagnet/utils/formValidation.js +0 -2
- package/dist/planmagnet/utils/graphqlErrors.js +0 -2
- package/dist/planmagnet/utils/lineDiff.js +0 -2
- package/dist/planmagnet/utils/mutationResult.js +0 -2
- package/dist/planmagnet/utils/navigation.js +0 -2
- package/dist/planmagnet/utils/qualityGateCriteria.js +0 -2
- package/dist/planmagnet/utils/rowNavigation.js +0 -2
- package/dist/planmagnet/utils/statusColor.js +0 -2
- package/dist/planmagnet/utils/urlParam.js +0 -2
- package/dist/planmagnet/webhooks/webhookTypes.js +0 -2
- package/dist/shared/hooks/useTr.js +0 -2
- package/dist/shared/utils/i18n.js +0 -2
- package/package.json +2 -1
- package/dist/_virtual/__vite-browser-external.js.map +0 -1
- package/dist/components/Button.d.ts.map +0 -1
- package/dist/components/Button.stories.d.ts.map +0 -1
- package/dist/components/MarkdownEditor.d.ts.map +0 -1
- package/dist/components/MarkdownEditor.js.map +0 -1
- package/dist/dev/main.d.ts.map +0 -1
- package/dist/generated/global-operations.d.ts.map +0 -1
- package/dist/generated/global-types.d.ts.map +0 -1
- package/dist/generated/wspace-operations.d.ts.map +0 -1
- package/dist/generated/wspace-types.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +0 -1
- package/dist/node_modules/@apollo/client/errors/ServerError.js.map +0 -1
- package/dist/node_modules/@apollo/client/errors/utils.js.map +0 -1
- package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/d3-array/src/ascending.js.map +0 -1
- package/dist/node_modules/d3-array/src/bisect.js.map +0 -1
- package/dist/node_modules/d3-array/src/bisector.js.map +0 -1
- package/dist/node_modules/d3-array/src/descending.js.map +0 -1
- package/dist/node_modules/d3-array/src/max.js.map +0 -1
- package/dist/node_modules/d3-array/src/min.js.map +0 -1
- package/dist/node_modules/d3-array/src/number.js.map +0 -1
- package/dist/node_modules/d3-array/src/quantile.js.map +0 -1
- package/dist/node_modules/d3-array/src/quickselect.js.map +0 -1
- package/dist/node_modules/d3-array/src/range.js.map +0 -1
- package/dist/node_modules/d3-array/src/sort.js.map +0 -1
- package/dist/node_modules/d3-array/src/ticks.js.map +0 -1
- package/dist/node_modules/d3-color/src/color.js.map +0 -1
- package/dist/node_modules/d3-color/src/define.js.map +0 -1
- package/dist/node_modules/d3-format/src/defaultLocale.js.map +0 -1
- package/dist/node_modules/d3-format/src/exponent.js.map +0 -1
- package/dist/node_modules/d3-format/src/formatDecimal.js.map +0 -1
- package/dist/node_modules/d3-format/src/formatGroup.js.map +0 -1
- package/dist/node_modules/d3-format/src/formatNumerals.js.map +0 -1
- package/dist/node_modules/d3-format/src/formatPrefixAuto.js.map +0 -1
- package/dist/node_modules/d3-format/src/formatRounded.js.map +0 -1
- package/dist/node_modules/d3-format/src/formatSpecifier.js.map +0 -1
- package/dist/node_modules/d3-format/src/formatTrim.js.map +0 -1
- package/dist/node_modules/d3-format/src/formatTypes.js.map +0 -1
- package/dist/node_modules/d3-format/src/identity.js.map +0 -1
- package/dist/node_modules/d3-format/src/locale.js.map +0 -1
- package/dist/node_modules/d3-format/src/precisionFixed.js.map +0 -1
- package/dist/node_modules/d3-format/src/precisionPrefix.js.map +0 -1
- package/dist/node_modules/d3-format/src/precisionRound.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/array.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/basis.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/basisClosed.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/color.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/constant.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/date.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/number.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/numberArray.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/object.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/piecewise.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/rgb.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/round.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/string.js.map +0 -1
- package/dist/node_modules/d3-interpolate/src/value.js.map +0 -1
- package/dist/node_modules/d3-path/src/path.js.map +0 -1
- package/dist/node_modules/d3-scale/src/band.js.map +0 -1
- package/dist/node_modules/d3-scale/src/constant.js.map +0 -1
- package/dist/node_modules/d3-scale/src/continuous.js.map +0 -1
- package/dist/node_modules/d3-scale/src/diverging.js.map +0 -1
- package/dist/node_modules/d3-scale/src/identity.js.map +0 -1
- package/dist/node_modules/d3-scale/src/init.js.map +0 -1
- package/dist/node_modules/d3-scale/src/linear.js.map +0 -1
- package/dist/node_modules/d3-scale/src/log.js.map +0 -1
- package/dist/node_modules/d3-scale/src/nice.js.map +0 -1
- package/dist/node_modules/d3-scale/src/number.js.map +0 -1
- package/dist/node_modules/d3-scale/src/ordinal.js.map +0 -1
- package/dist/node_modules/d3-scale/src/pow.js.map +0 -1
- package/dist/node_modules/d3-scale/src/quantile.js.map +0 -1
- package/dist/node_modules/d3-scale/src/quantize.js.map +0 -1
- package/dist/node_modules/d3-scale/src/radial.js.map +0 -1
- package/dist/node_modules/d3-scale/src/sequential.js.map +0 -1
- package/dist/node_modules/d3-scale/src/sequentialQuantile.js.map +0 -1
- package/dist/node_modules/d3-scale/src/symlog.js.map +0 -1
- package/dist/node_modules/d3-scale/src/threshold.js.map +0 -1
- package/dist/node_modules/d3-scale/src/tickFormat.js.map +0 -1
- package/dist/node_modules/d3-scale/src/time.js.map +0 -1
- package/dist/node_modules/d3-scale/src/utcTime.js.map +0 -1
- package/dist/node_modules/d3-shape/src/area.js.map +0 -1
- package/dist/node_modules/d3-shape/src/array.js.map +0 -1
- package/dist/node_modules/d3-shape/src/constant.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/basis.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/basisClosed.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/basisOpen.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/bump.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/linear.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/linearClosed.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/monotone.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/natural.js.map +0 -1
- package/dist/node_modules/d3-shape/src/curve/step.js.map +0 -1
- package/dist/node_modules/d3-shape/src/line.js.map +0 -1
- package/dist/node_modules/d3-shape/src/math.js.map +0 -1
- package/dist/node_modules/d3-shape/src/noop.js.map +0 -1
- package/dist/node_modules/d3-shape/src/offset/expand.js.map +0 -1
- package/dist/node_modules/d3-shape/src/offset/none.js.map +0 -1
- package/dist/node_modules/d3-shape/src/offset/silhouette.js.map +0 -1
- package/dist/node_modules/d3-shape/src/offset/wiggle.js.map +0 -1
- package/dist/node_modules/d3-shape/src/order/none.js.map +0 -1
- package/dist/node_modules/d3-shape/src/path.js.map +0 -1
- package/dist/node_modules/d3-shape/src/point.js.map +0 -1
- package/dist/node_modules/d3-shape/src/stack.js.map +0 -1
- package/dist/node_modules/d3-shape/src/symbol/circle.js.map +0 -1
- package/dist/node_modules/d3-shape/src/symbol/cross.js.map +0 -1
- package/dist/node_modules/d3-shape/src/symbol/diamond.js.map +0 -1
- package/dist/node_modules/d3-shape/src/symbol/square.js.map +0 -1
- package/dist/node_modules/d3-shape/src/symbol/star.js.map +0 -1
- package/dist/node_modules/d3-shape/src/symbol/triangle.js.map +0 -1
- package/dist/node_modules/d3-shape/src/symbol/wye.js.map +0 -1
- package/dist/node_modules/d3-shape/src/symbol.js.map +0 -1
- package/dist/node_modules/d3-time/src/day.js.map +0 -1
- package/dist/node_modules/d3-time/src/duration.js.map +0 -1
- package/dist/node_modules/d3-time/src/hour.js.map +0 -1
- package/dist/node_modules/d3-time/src/interval.js.map +0 -1
- package/dist/node_modules/d3-time/src/millisecond.js.map +0 -1
- package/dist/node_modules/d3-time/src/minute.js.map +0 -1
- package/dist/node_modules/d3-time/src/month.js.map +0 -1
- package/dist/node_modules/d3-time/src/second.js.map +0 -1
- package/dist/node_modules/d3-time/src/ticks.js.map +0 -1
- package/dist/node_modules/d3-time/src/week.js.map +0 -1
- package/dist/node_modules/d3-time/src/year.js.map +0 -1
- package/dist/node_modules/d3-time-format/src/defaultLocale.js.map +0 -1
- package/dist/node_modules/d3-time-format/src/locale.js.map +0 -1
- package/dist/node_modules/decimal.js-light/decimal.js.map +0 -1
- package/dist/node_modules/eventemitter3/index.js.map +0 -1
- package/dist/node_modules/fast-equals/dist/es/index.js.map +0 -1
- package/dist/node_modules/fflate/esm/browser.js.map +0 -1
- package/dist/node_modules/internmap/src/index.js.map +0 -1
- package/dist/node_modules/jszip/dist/jszip.min.js.map +0 -1
- package/dist/node_modules/lodash/_DataView.js.map +0 -1
- package/dist/node_modules/lodash/_Hash.js.map +0 -1
- package/dist/node_modules/lodash/_ListCache.js.map +0 -1
- package/dist/node_modules/lodash/_Map.js.map +0 -1
- package/dist/node_modules/lodash/_MapCache.js.map +0 -1
- package/dist/node_modules/lodash/_Promise.js.map +0 -1
- package/dist/node_modules/lodash/_Set.js.map +0 -1
- package/dist/node_modules/lodash/_SetCache.js.map +0 -1
- package/dist/node_modules/lodash/_Stack.js.map +0 -1
- package/dist/node_modules/lodash/_Symbol.js.map +0 -1
- package/dist/node_modules/lodash/_Uint8Array.js.map +0 -1
- package/dist/node_modules/lodash/_WeakMap.js.map +0 -1
- package/dist/node_modules/lodash/_apply.js.map +0 -1
- package/dist/node_modules/lodash/_arrayEach.js.map +0 -1
- package/dist/node_modules/lodash/_arrayEvery.js.map +0 -1
- package/dist/node_modules/lodash/_arrayFilter.js.map +0 -1
- package/dist/node_modules/lodash/_arrayIncludes.js.map +0 -1
- package/dist/node_modules/lodash/_arrayIncludesWith.js.map +0 -1
- package/dist/node_modules/lodash/_arrayLikeKeys.js.map +0 -1
- package/dist/node_modules/lodash/_arrayMap.js.map +0 -1
- package/dist/node_modules/lodash/_arrayPush.js.map +0 -1
- package/dist/node_modules/lodash/_arraySome.js.map +0 -1
- package/dist/node_modules/lodash/_asciiToArray.js.map +0 -1
- package/dist/node_modules/lodash/_assignValue.js.map +0 -1
- package/dist/node_modules/lodash/_assocIndexOf.js.map +0 -1
- package/dist/node_modules/lodash/_baseAssign.js.map +0 -1
- package/dist/node_modules/lodash/_baseAssignIn.js.map +0 -1
- package/dist/node_modules/lodash/_baseAssignValue.js.map +0 -1
- package/dist/node_modules/lodash/_baseClone.js.map +0 -1
- package/dist/node_modules/lodash/_baseCreate.js.map +0 -1
- package/dist/node_modules/lodash/_baseEach.js.map +0 -1
- package/dist/node_modules/lodash/_baseEvery.js.map +0 -1
- package/dist/node_modules/lodash/_baseExtremum.js.map +0 -1
- package/dist/node_modules/lodash/_baseFindIndex.js.map +0 -1
- package/dist/node_modules/lodash/_baseFlatten.js.map +0 -1
- package/dist/node_modules/lodash/_baseFor.js.map +0 -1
- package/dist/node_modules/lodash/_baseForOwn.js.map +0 -1
- package/dist/node_modules/lodash/_baseGet.js.map +0 -1
- package/dist/node_modules/lodash/_baseGetAllKeys.js.map +0 -1
- package/dist/node_modules/lodash/_baseGetTag.js.map +0 -1
- package/dist/node_modules/lodash/_baseGt.js.map +0 -1
- package/dist/node_modules/lodash/_baseHasIn.js.map +0 -1
- package/dist/node_modules/lodash/_baseIndexOf.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsArguments.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsEqual.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsEqualDeep.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsMap.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsMatch.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsNaN.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsNative.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsSet.js.map +0 -1
- package/dist/node_modules/lodash/_baseIsTypedArray.js.map +0 -1
- package/dist/node_modules/lodash/_baseIteratee.js.map +0 -1
- package/dist/node_modules/lodash/_baseKeys.js.map +0 -1
- package/dist/node_modules/lodash/_baseKeysIn.js.map +0 -1
- package/dist/node_modules/lodash/_baseLt.js.map +0 -1
- package/dist/node_modules/lodash/_baseMap.js.map +0 -1
- package/dist/node_modules/lodash/_baseMatches.js.map +0 -1
- package/dist/node_modules/lodash/_baseMatchesProperty.js.map +0 -1
- package/dist/node_modules/lodash/_baseOrderBy.js.map +0 -1
- package/dist/node_modules/lodash/_baseProperty.js.map +0 -1
- package/dist/node_modules/lodash/_basePropertyDeep.js.map +0 -1
- package/dist/node_modules/lodash/_baseRange.js.map +0 -1
- package/dist/node_modules/lodash/_baseRest.js.map +0 -1
- package/dist/node_modules/lodash/_baseSetToString.js.map +0 -1
- package/dist/node_modules/lodash/_baseSlice.js.map +0 -1
- package/dist/node_modules/lodash/_baseSome.js.map +0 -1
- package/dist/node_modules/lodash/_baseSortBy.js.map +0 -1
- package/dist/node_modules/lodash/_baseSum.js.map +0 -1
- package/dist/node_modules/lodash/_baseTimes.js.map +0 -1
- package/dist/node_modules/lodash/_baseToString.js.map +0 -1
- package/dist/node_modules/lodash/_baseTrim.js.map +0 -1
- package/dist/node_modules/lodash/_baseUnary.js.map +0 -1
- package/dist/node_modules/lodash/_baseUniq.js.map +0 -1
- package/dist/node_modules/lodash/_baseUnset.js.map +0 -1
- package/dist/node_modules/lodash/_cacheHas.js.map +0 -1
- package/dist/node_modules/lodash/_castPath.js.map +0 -1
- package/dist/node_modules/lodash/_castSlice.js.map +0 -1
- package/dist/node_modules/lodash/_cloneArrayBuffer.js.map +0 -1
- package/dist/node_modules/lodash/_cloneBuffer.js.map +0 -1
- package/dist/node_modules/lodash/_cloneDataView.js.map +0 -1
- package/dist/node_modules/lodash/_cloneRegExp.js.map +0 -1
- package/dist/node_modules/lodash/_cloneSymbol.js.map +0 -1
- package/dist/node_modules/lodash/_cloneTypedArray.js.map +0 -1
- package/dist/node_modules/lodash/_compareAscending.js.map +0 -1
- package/dist/node_modules/lodash/_compareMultiple.js.map +0 -1
- package/dist/node_modules/lodash/_copyArray.js.map +0 -1
- package/dist/node_modules/lodash/_copyObject.js.map +0 -1
- package/dist/node_modules/lodash/_copySymbols.js.map +0 -1
- package/dist/node_modules/lodash/_copySymbolsIn.js.map +0 -1
- package/dist/node_modules/lodash/_coreJsData.js.map +0 -1
- package/dist/node_modules/lodash/_createBaseEach.js.map +0 -1
- package/dist/node_modules/lodash/_createBaseFor.js.map +0 -1
- package/dist/node_modules/lodash/_createCaseFirst.js.map +0 -1
- package/dist/node_modules/lodash/_createFind.js.map +0 -1
- package/dist/node_modules/lodash/_createRange.js.map +0 -1
- package/dist/node_modules/lodash/_createSet.js.map +0 -1
- package/dist/node_modules/lodash/_customOmitClone.js.map +0 -1
- package/dist/node_modules/lodash/_defineProperty.js.map +0 -1
- package/dist/node_modules/lodash/_equalArrays.js.map +0 -1
- package/dist/node_modules/lodash/_equalByTag.js.map +0 -1
- package/dist/node_modules/lodash/_equalObjects.js.map +0 -1
- package/dist/node_modules/lodash/_flatRest.js.map +0 -1
- package/dist/node_modules/lodash/_freeGlobal.js.map +0 -1
- package/dist/node_modules/lodash/_getAllKeys.js.map +0 -1
- package/dist/node_modules/lodash/_getAllKeysIn.js.map +0 -1
- package/dist/node_modules/lodash/_getMapData.js.map +0 -1
- package/dist/node_modules/lodash/_getMatchData.js.map +0 -1
- package/dist/node_modules/lodash/_getNative.js.map +0 -1
- package/dist/node_modules/lodash/_getPrototype.js.map +0 -1
- package/dist/node_modules/lodash/_getRawTag.js.map +0 -1
- package/dist/node_modules/lodash/_getSymbols.js.map +0 -1
- package/dist/node_modules/lodash/_getSymbolsIn.js.map +0 -1
- package/dist/node_modules/lodash/_getTag.js.map +0 -1
- package/dist/node_modules/lodash/_getValue.js.map +0 -1
- package/dist/node_modules/lodash/_hasPath.js.map +0 -1
- package/dist/node_modules/lodash/_hasUnicode.js.map +0 -1
- package/dist/node_modules/lodash/_hashClear.js.map +0 -1
- package/dist/node_modules/lodash/_hashDelete.js.map +0 -1
- package/dist/node_modules/lodash/_hashGet.js.map +0 -1
- package/dist/node_modules/lodash/_hashHas.js.map +0 -1
- package/dist/node_modules/lodash/_hashSet.js.map +0 -1
- package/dist/node_modules/lodash/_initCloneArray.js.map +0 -1
- package/dist/node_modules/lodash/_initCloneByTag.js.map +0 -1
- package/dist/node_modules/lodash/_initCloneObject.js.map +0 -1
- package/dist/node_modules/lodash/_isFlattenable.js.map +0 -1
- package/dist/node_modules/lodash/_isIndex.js.map +0 -1
- package/dist/node_modules/lodash/_isIterateeCall.js.map +0 -1
- package/dist/node_modules/lodash/_isKey.js.map +0 -1
- package/dist/node_modules/lodash/_isKeyable.js.map +0 -1
- package/dist/node_modules/lodash/_isMasked.js.map +0 -1
- package/dist/node_modules/lodash/_isPrototype.js.map +0 -1
- package/dist/node_modules/lodash/_isStrictComparable.js.map +0 -1
- package/dist/node_modules/lodash/_listCacheClear.js.map +0 -1
- package/dist/node_modules/lodash/_listCacheDelete.js.map +0 -1
- package/dist/node_modules/lodash/_listCacheGet.js.map +0 -1
- package/dist/node_modules/lodash/_listCacheHas.js.map +0 -1
- package/dist/node_modules/lodash/_listCacheSet.js.map +0 -1
- package/dist/node_modules/lodash/_mapCacheClear.js.map +0 -1
- package/dist/node_modules/lodash/_mapCacheDelete.js.map +0 -1
- package/dist/node_modules/lodash/_mapCacheGet.js.map +0 -1
- package/dist/node_modules/lodash/_mapCacheHas.js.map +0 -1
- package/dist/node_modules/lodash/_mapCacheSet.js.map +0 -1
- package/dist/node_modules/lodash/_mapToArray.js.map +0 -1
- package/dist/node_modules/lodash/_matchesStrictComparable.js.map +0 -1
- package/dist/node_modules/lodash/_memoizeCapped.js.map +0 -1
- package/dist/node_modules/lodash/_nativeCreate.js.map +0 -1
- package/dist/node_modules/lodash/_nativeKeys.js.map +0 -1
- package/dist/node_modules/lodash/_nativeKeysIn.js.map +0 -1
- package/dist/node_modules/lodash/_nodeUtil.js.map +0 -1
- package/dist/node_modules/lodash/_objectToString.js.map +0 -1
- package/dist/node_modules/lodash/_overArg.js.map +0 -1
- package/dist/node_modules/lodash/_overRest.js.map +0 -1
- package/dist/node_modules/lodash/_parent.js.map +0 -1
- package/dist/node_modules/lodash/_root.js.map +0 -1
- package/dist/node_modules/lodash/_setCacheAdd.js.map +0 -1
- package/dist/node_modules/lodash/_setCacheHas.js.map +0 -1
- package/dist/node_modules/lodash/_setToArray.js.map +0 -1
- package/dist/node_modules/lodash/_setToString.js.map +0 -1
- package/dist/node_modules/lodash/_shortOut.js.map +0 -1
- package/dist/node_modules/lodash/_stackClear.js.map +0 -1
- package/dist/node_modules/lodash/_stackDelete.js.map +0 -1
- package/dist/node_modules/lodash/_stackGet.js.map +0 -1
- package/dist/node_modules/lodash/_stackHas.js.map +0 -1
- package/dist/node_modules/lodash/_stackSet.js.map +0 -1
- package/dist/node_modules/lodash/_strictIndexOf.js.map +0 -1
- package/dist/node_modules/lodash/_stringToArray.js.map +0 -1
- package/dist/node_modules/lodash/_stringToPath.js.map +0 -1
- package/dist/node_modules/lodash/_toKey.js.map +0 -1
- package/dist/node_modules/lodash/_toSource.js.map +0 -1
- package/dist/node_modules/lodash/_trimmedEndIndex.js.map +0 -1
- package/dist/node_modules/lodash/_unicodeToArray.js.map +0 -1
- package/dist/node_modules/lodash/constant.js.map +0 -1
- package/dist/node_modules/lodash/debounce.js.map +0 -1
- package/dist/node_modules/lodash/eq.js.map +0 -1
- package/dist/node_modules/lodash/every.js.map +0 -1
- package/dist/node_modules/lodash/find.js.map +0 -1
- package/dist/node_modules/lodash/findIndex.js.map +0 -1
- package/dist/node_modules/lodash/flatMap.js.map +0 -1
- package/dist/node_modules/lodash/flatten.js.map +0 -1
- package/dist/node_modules/lodash/get.js.map +0 -1
- package/dist/node_modules/lodash/hasIn.js.map +0 -1
- package/dist/node_modules/lodash/identity.js.map +0 -1
- package/dist/node_modules/lodash/isArguments.js.map +0 -1
- package/dist/node_modules/lodash/isArray.js.map +0 -1
- package/dist/node_modules/lodash/isArrayLike.js.map +0 -1
- package/dist/node_modules/lodash/isBoolean.js.map +0 -1
- package/dist/node_modules/lodash/isBuffer.js.map +0 -1
- package/dist/node_modules/lodash/isEqual.js.map +0 -1
- package/dist/node_modules/lodash/isFunction.js.map +0 -1
- package/dist/node_modules/lodash/isLength.js.map +0 -1
- package/dist/node_modules/lodash/isMap.js.map +0 -1
- package/dist/node_modules/lodash/isNaN.js.map +0 -1
- package/dist/node_modules/lodash/isNil.js.map +0 -1
- package/dist/node_modules/lodash/isNumber.js.map +0 -1
- package/dist/node_modules/lodash/isObject.js.map +0 -1
- package/dist/node_modules/lodash/isObjectLike.js.map +0 -1
- package/dist/node_modules/lodash/isPlainObject.js.map +0 -1
- package/dist/node_modules/lodash/isSet.js.map +0 -1
- package/dist/node_modules/lodash/isString.js.map +0 -1
- package/dist/node_modules/lodash/isSymbol.js.map +0 -1
- package/dist/node_modules/lodash/isTypedArray.js.map +0 -1
- package/dist/node_modules/lodash/keys.js.map +0 -1
- package/dist/node_modules/lodash/keysIn.js.map +0 -1
- package/dist/node_modules/lodash/last.js.map +0 -1
- package/dist/node_modules/lodash/map.js.map +0 -1
- package/dist/node_modules/lodash/mapValues.js.map +0 -1
- package/dist/node_modules/lodash/max.js.map +0 -1
- package/dist/node_modules/lodash/maxBy.js.map +0 -1
- package/dist/node_modules/lodash/memoize.js.map +0 -1
- package/dist/node_modules/lodash/min.js.map +0 -1
- package/dist/node_modules/lodash/noop.js.map +0 -1
- package/dist/node_modules/lodash/now.js.map +0 -1
- package/dist/node_modules/lodash/omit.js.map +0 -1
- package/dist/node_modules/lodash/property.js.map +0 -1
- package/dist/node_modules/lodash/range.js.map +0 -1
- package/dist/node_modules/lodash/some.js.map +0 -1
- package/dist/node_modules/lodash/sortBy.js.map +0 -1
- package/dist/node_modules/lodash/stubArray.js.map +0 -1
- package/dist/node_modules/lodash/stubFalse.js.map +0 -1
- package/dist/node_modules/lodash/sumBy.js.map +0 -1
- package/dist/node_modules/lodash/throttle.js.map +0 -1
- package/dist/node_modules/lodash/toFinite.js.map +0 -1
- package/dist/node_modules/lodash/toInteger.js.map +0 -1
- package/dist/node_modules/lodash/toNumber.js.map +0 -1
- package/dist/node_modules/lodash/toString.js.map +0 -1
- package/dist/node_modules/lodash/uniqBy.js.map +0 -1
- package/dist/node_modules/lodash/upperFirst.js.map +0 -1
- package/dist/node_modules/object-assign/index.js.map +0 -1
- package/dist/node_modules/pptxgenjs/dist/pptxgen.es.js.map +0 -1
- package/dist/node_modules/prop-types/checkPropTypes.js.map +0 -1
- package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +0 -1
- package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +0 -1
- package/dist/node_modules/prop-types/index.js.map +0 -1
- package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +0 -1
- package/dist/node_modules/prop-types/lib/has.js.map +0 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.development.js.map +0 -1
- package/dist/node_modules/prop-types/node_modules/react-is/cjs/react-is.production.min.js.map +0 -1
- package/dist/node_modules/prop-types/node_modules/react-is/index.js.map +0 -1
- package/dist/node_modules/react-is/cjs/react-is.development.js.map +0 -1
- package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +0 -1
- package/dist/node_modules/react-is/index.js.map +0 -1
- package/dist/node_modules/react-smooth/es6/Animate.js.map +0 -1
- package/dist/node_modules/react-smooth/es6/AnimateManager.js.map +0 -1
- package/dist/node_modules/react-smooth/es6/configUpdate.js.map +0 -1
- package/dist/node_modules/react-smooth/es6/easing.js.map +0 -1
- package/dist/node_modules/react-smooth/es6/index.js.map +0 -1
- package/dist/node_modules/react-smooth/es6/setRafTimeout.js.map +0 -1
- package/dist/node_modules/react-smooth/es6/util.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/Area.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/Bar.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/Brush.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/CartesianAxis.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/CartesianGrid.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/ErrorBar.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/Line.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceArea.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceDot.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/ReferenceLine.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/XAxis.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/YAxis.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/getEquidistantTicks.js.map +0 -1
- package/dist/node_modules/recharts/es6/cartesian/getTicks.js.map +0 -1
- package/dist/node_modules/recharts/es6/chart/AccessibilityManager.js.map +0 -1
- package/dist/node_modules/recharts/es6/chart/AreaChart.js.map +0 -1
- package/dist/node_modules/recharts/es6/chart/BarChart.js.map +0 -1
- package/dist/node_modules/recharts/es6/chart/LineChart.js.map +0 -1
- package/dist/node_modules/recharts/es6/chart/Sankey.js.map +0 -1
- package/dist/node_modules/recharts/es6/chart/Treemap.js.map +0 -1
- package/dist/node_modules/recharts/es6/chart/generateCategoricalChart.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/Cell.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/Cursor.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/DefaultLegendContent.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/DefaultTooltipContent.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/Label.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/LabelList.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/Legend.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/ResponsiveContainer.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/Text.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/Tooltip.js.map +0 -1
- package/dist/node_modules/recharts/es6/component/TooltipBoundingBox.js.map +0 -1
- package/dist/node_modules/recharts/es6/container/Layer.js.map +0 -1
- package/dist/node_modules/recharts/es6/container/Surface.js.map +0 -1
- package/dist/node_modules/recharts/es6/context/chartLayoutContext.js.map +0 -1
- package/dist/node_modules/recharts/es6/shape/Cross.js.map +0 -1
- package/dist/node_modules/recharts/es6/shape/Curve.js.map +0 -1
- package/dist/node_modules/recharts/es6/shape/Dot.js.map +0 -1
- package/dist/node_modules/recharts/es6/shape/Polygon.js.map +0 -1
- package/dist/node_modules/recharts/es6/shape/Rectangle.js.map +0 -1
- package/dist/node_modules/recharts/es6/shape/Sector.js.map +0 -1
- package/dist/node_modules/recharts/es6/shape/Symbols.js.map +0 -1
- package/dist/node_modules/recharts/es6/shape/Trapezoid.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/ActiveShapeUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/BarUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/CartesianUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/ChartUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/Constants.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/CssPrefixUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/DOMUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/DataUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/DetectReferenceElementsDomain.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/Events.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/Global.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/IfOverflowMatches.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/LogUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/PolarUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/ReactUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/ReduceCSSCalc.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/ShallowEqual.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/TickUtils.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/calculateViewBox.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/cursor/getCursorPoints.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/cursor/getCursorRectangle.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/cursor/getRadialCursorPoints.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/getEveryNthWithCondition.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/getLegendProps.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/isDomainSpecifiedByUser.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/payload/getUniqPayload.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/tooltip/translate.js.map +0 -1
- package/dist/node_modules/recharts/es6/util/types.js.map +0 -1
- package/dist/node_modules/recharts-scale/es6/getNiceTickValues.js.map +0 -1
- package/dist/node_modules/recharts-scale/es6/util/arithmetic.js.map +0 -1
- package/dist/node_modules/recharts-scale/es6/util/utils.js.map +0 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
- package/dist/node_modules/tiny-invariant/dist/esm/tiny-invariant.js.map +0 -1
- package/dist/node_modules/victory-vendor/es/d3-scale.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/export/convertFileContentToUint8ArrayBrowser.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/export/convertFilesContentToUint8Arrays.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/export/downloadBlob.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileBrowser.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/export/writeXlsxFileUniversal.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/getSheetData/getSheetData.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/features/conditionalFormatting.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/features/images.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/features/stickyRowsOrColumns.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/_Content_Types_.xml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/drawing.xml.rels.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/rels.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sharedStrings.xml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/cell.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/column.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/columns.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/drawingReference.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/helpers/getCellStyleProperties.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/mergedCellsDescription.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageMargins.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/pageSetup.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/processMergedCells.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/row.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheet.xml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetData.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml/sheetViews.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/sheet.xml.rels.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/styles.xml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/files/workbook.xml.rels.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/generateXlsxFileContents.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/getFeatures.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/convertDateToSerialNumber.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getAdditionalContent.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getElementXml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/getWrittenFiles.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/features/transformContent.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getAlignmentXml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getBorderXml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getCellAddress.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFileExtensionForContentType.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFillXml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getFontXml.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getOrderOfSiblings.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/getXlsxColorForHexColor.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasAlignment.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasBorder.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFill.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/hasFont.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isCellObject.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/isObject.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/helpers/orderOfSiblings.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeSharedStrings.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeSheets.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/initializeStyles.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetData.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xlsx/validateSheetName.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/appendMarkupInsideElement.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/applyEnclosingElementOffset.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/escapeXmlSpecialCharacters.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/findElement.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/findElementInsideElement.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/findElementsNonRecursive_.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/getAttributesString.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/getChildElements.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/getClosingTagMarkup.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/getMarkupInsideElement.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/getOpeningTagMarkup.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/getSelfClosingTagMarkup.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/insertElementMarkupAccordingToOrderOfSiblings.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/prependMarkupInsideElement.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/removeInvalidXmlCharacters.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/replaceElement.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeName.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeAttributeValue.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/sanitizeTextContent.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/xml/setMarkupInsideElement.js.map +0 -1
- package/dist/node_modules/write-excel-file/modules/zip/zipToArrayBuffer.js.map +0 -1
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +0 -1
- package/dist/planmagnet/PlanMagnetRoot.js.map +0 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +0 -1
- package/dist/planmagnet/PlanMagnetRoutes.js.map +0 -1
- package/dist/planmagnet/activity/activityDescribe.d.ts.map +0 -1
- package/dist/planmagnet/activity/activityDescribe.js.map +0 -1
- package/dist/planmagnet/activity/relativeTime.d.ts.map +0 -1
- package/dist/planmagnet/activity/relativeTime.js.map +0 -1
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.d.ts.map +0 -1
- package/dist/planmagnet/admin/PlanMagnetAdminRoot.js.map +0 -1
- package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts.map +0 -1
- package/dist/planmagnet/automation/AutomationExecutionsPanel.js.map +0 -1
- package/dist/planmagnet/automation/AutomationRuleFields.d.ts.map +0 -1
- package/dist/planmagnet/automation/AutomationRuleFields.js.map +0 -1
- package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +0 -1
- package/dist/planmagnet/automation/automationRuleTypes.js.map +0 -1
- package/dist/planmagnet/board/BoardViewBar.d.ts.map +0 -1
- package/dist/planmagnet/board/BoardViewBar.js.map +0 -1
- package/dist/planmagnet/board/BulkActions.d.ts.map +0 -1
- package/dist/planmagnet/board/BulkActions.js.map +0 -1
- package/dist/planmagnet/board/ProjectBoard.d.ts.map +0 -1
- package/dist/planmagnet/board/ProjectBoard.js.map +0 -1
- package/dist/planmagnet/board/boardViewConfig.d.ts.map +0 -1
- package/dist/planmagnet/board/boardViewConfig.js.map +0 -1
- package/dist/planmagnet/budgets/BudgetControls.d.ts.map +0 -1
- package/dist/planmagnet/budgets/BudgetControls.js.map +0 -1
- package/dist/planmagnet/budgets/ExpenseControls.d.ts.map +0 -1
- package/dist/planmagnet/budgets/ExpenseControls.js.map +0 -1
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts.map +0 -1
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.js.map +0 -1
- package/dist/planmagnet/budgets/budgetMath.d.ts.map +0 -1
- package/dist/planmagnet/budgets/budgetMath.js.map +0 -1
- package/dist/planmagnet/comments/CommentAttachmentUpload.d.ts.map +0 -1
- package/dist/planmagnet/comments/CommentAttachmentUpload.js.map +0 -1
- package/dist/planmagnet/comments/CommentAttachments.d.ts.map +0 -1
- package/dist/planmagnet/comments/CommentAttachments.js.map +0 -1
- package/dist/planmagnet/comments/CommentBody.d.ts.map +0 -1
- package/dist/planmagnet/comments/CommentBody.js.map +0 -1
- package/dist/planmagnet/comments/CommentThread.d.ts.map +0 -1
- package/dist/planmagnet/comments/CommentThread.js.map +0 -1
- package/dist/planmagnet/comments/MentionComposer.d.ts.map +0 -1
- package/dist/planmagnet/comments/MentionComposer.js.map +0 -1
- package/dist/planmagnet/comments/RoadmapComments.d.ts.map +0 -1
- package/dist/planmagnet/comments/RoadmapComments.js.map +0 -1
- package/dist/planmagnet/comments/TargetComments.d.ts.map +0 -1
- package/dist/planmagnet/comments/TargetComments.js.map +0 -1
- package/dist/planmagnet/comments/WorkItemActivity.d.ts.map +0 -1
- package/dist/planmagnet/comments/WorkItemActivity.js.map +0 -1
- package/dist/planmagnet/comments/WorkItemComments.d.ts.map +0 -1
- package/dist/planmagnet/comments/WorkItemComments.js.map +0 -1
- package/dist/planmagnet/comments/commentAttachmentUploadClient.d.ts.map +0 -1
- package/dist/planmagnet/comments/commentAttachmentUploadClient.js.map +0 -1
- package/dist/planmagnet/comments/commentImageTokens.d.ts.map +0 -1
- package/dist/planmagnet/comments/commentImageTokens.js.map +0 -1
- package/dist/planmagnet/comments/commentTokens.d.ts.map +0 -1
- package/dist/planmagnet/comments/commentTokens.js.map +0 -1
- package/dist/planmagnet/comments/fileDisplay.d.ts.map +0 -1
- package/dist/planmagnet/comments/fileDisplay.js.map +0 -1
- package/dist/planmagnet/comments/useCommentFileUrl.d.ts.map +0 -1
- package/dist/planmagnet/comments/useCommentFileUrl.js.map +0 -1
- package/dist/planmagnet/controls/AutomationRuleControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/AutomationRuleControls.js.map +0 -1
- package/dist/planmagnet/controls/CompetitorControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/CompetitorControls.js.map +0 -1
- package/dist/planmagnet/controls/ConfirmButton.d.ts.map +0 -1
- package/dist/planmagnet/controls/ConfirmButton.js.map +0 -1
- package/dist/planmagnet/controls/CustomFieldControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/CustomFieldControls.js.map +0 -1
- package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts.map +0 -1
- package/dist/planmagnet/controls/CustomFieldValuesPanel.js.map +0 -1
- package/dist/planmagnet/controls/FeatureControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/FeatureControls.js.map +0 -1
- package/dist/planmagnet/controls/FeatureTriage.d.ts.map +0 -1
- package/dist/planmagnet/controls/FeatureTriage.js.map +0 -1
- package/dist/planmagnet/controls/FeedbackControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/FeedbackControls.js.map +0 -1
- package/dist/planmagnet/controls/LiveStatus.d.ts.map +0 -1
- package/dist/planmagnet/controls/LiveStatus.js.map +0 -1
- package/dist/planmagnet/controls/MilestoneControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/MilestoneControls.js.map +0 -1
- package/dist/planmagnet/controls/ObjectiveControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/ObjectiveControls.js.map +0 -1
- package/dist/planmagnet/controls/Pickers.d.ts.map +0 -1
- package/dist/planmagnet/controls/Pickers.js.map +0 -1
- package/dist/planmagnet/controls/PortfolioControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/PortfolioControls.js.map +0 -1
- package/dist/planmagnet/controls/PrioritizationControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/PrioritizationControls.js.map +0 -1
- package/dist/planmagnet/controls/ProgramControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/ProgramControls.js.map +0 -1
- package/dist/planmagnet/controls/ProjectControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/ProjectControls.js.map +0 -1
- package/dist/planmagnet/controls/QualityGateControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/QualityGateControls.js.map +0 -1
- package/dist/planmagnet/controls/ReleaseControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/ReleaseControls.js.map +0 -1
- package/dist/planmagnet/controls/RiskControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/RiskControls.js.map +0 -1
- package/dist/planmagnet/controls/SyncControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/SyncControls.js.map +0 -1
- package/dist/planmagnet/controls/TemplateControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/TemplateControls.js.map +0 -1
- package/dist/planmagnet/controls/WebhookSubscriptionControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/WebhookSubscriptionControls.js.map +0 -1
- package/dist/planmagnet/controls/WorkItemControls.d.ts.map +0 -1
- package/dist/planmagnet/controls/WorkItemControls.js.map +0 -1
- package/dist/planmagnet/create/CreateDialogs.d.ts.map +0 -1
- package/dist/planmagnet/create/CreateDialogs.js.map +0 -1
- package/dist/planmagnet/dashboards/DashboardUI.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/DashboardUI.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/DeliveryTimelineCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/DeliveryTimelineCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/ObjectivesProgressCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/ObjectivesProgressCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/PortfolioHealthCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/PortfolioHealthCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/QualityMetricsCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/QualityMetricsCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/RiskSeverityCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/RiskSeverityCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/RoadmapHorizonCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/RoadmapHorizonCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/SprintCapacityCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/SprintCapacityCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/TaskCompletionCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/TaskCompletionCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/TeamCapacityCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/TeamCapacityCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/TeamOverviewCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/TeamOverviewCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/TeamWorkloadCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/TeamWorkloadCard.js.map +0 -1
- package/dist/planmagnet/dashboards/cards/TimeLoggedCard.d.ts.map +0 -1
- package/dist/planmagnet/dashboards/cards/TimeLoggedCard.js.map +0 -1
- package/dist/planmagnet/dependency/DependencyGraph.d.ts.map +0 -1
- package/dist/planmagnet/dependency/DependencyGraph.js.map +0 -1
- package/dist/planmagnet/dependency/DependencyPanel.d.ts.map +0 -1
- package/dist/planmagnet/dependency/DependencyPanel.js.map +0 -1
- package/dist/planmagnet/dependency/GanttChart.d.ts.map +0 -1
- package/dist/planmagnet/dependency/GanttChart.js.map +0 -1
- package/dist/planmagnet/dependency/useProjectWorkItemsGraph.d.ts.map +0 -1
- package/dist/planmagnet/dependency/useProjectWorkItemsGraph.js.map +0 -1
- package/dist/planmagnet/discussion/WorkItemDiscussionPanel.d.ts.map +0 -1
- package/dist/planmagnet/discussion/WorkItemDiscussionPanel.js.map +0 -1
- package/dist/planmagnet/docs/DocDiffView.d.ts.map +0 -1
- package/dist/planmagnet/docs/DocDiffView.js.map +0 -1
- package/dist/planmagnet/docs/DocStatusBadge.d.ts.map +0 -1
- package/dist/planmagnet/docs/DocStatusBadge.js.map +0 -1
- package/dist/planmagnet/docs/DocSuggestionsPanel.d.ts.map +0 -1
- package/dist/planmagnet/docs/DocSuggestionsPanel.js.map +0 -1
- package/dist/planmagnet/docs/DocVersionCompare.d.ts.map +0 -1
- package/dist/planmagnet/docs/DocVersionCompare.js.map +0 -1
- package/dist/planmagnet/export/ExportWorkItemsButton.d.ts.map +0 -1
- package/dist/planmagnet/export/ExportWorkItemsButton.js.map +0 -1
- package/dist/planmagnet/export/workItemsCsv.d.ts.map +0 -1
- package/dist/planmagnet/export/workItemsCsv.js.map +0 -1
- package/dist/planmagnet/forecast/DeliveryForecastCard.d.ts.map +0 -1
- package/dist/planmagnet/forecast/DeliveryForecastCard.js.map +0 -1
- package/dist/planmagnet/forecast/ProjectOutlookCard.d.ts.map +0 -1
- package/dist/planmagnet/forecast/ProjectOutlookCard.js.map +0 -1
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.d.ts.map +0 -1
- package/dist/planmagnet/forecast/ProjectRiskSummaryCard.js.map +0 -1
- package/dist/planmagnet/forecast/ResourceForecastCard.d.ts.map +0 -1
- package/dist/planmagnet/forecast/ResourceForecastCard.js.map +0 -1
- package/dist/planmagnet/forecast/riskFlags.d.ts.map +0 -1
- package/dist/planmagnet/forecast/riskFlags.js.map +0 -1
- package/dist/planmagnet/hooks/useCounts.d.ts.map +0 -1
- package/dist/planmagnet/hooks/useCounts.js.map +0 -1
- package/dist/planmagnet/hooks/useEntityId.d.ts.map +0 -1
- package/dist/planmagnet/hooks/useEntityId.js.map +0 -1
- package/dist/planmagnet/hooks/useLiveRefresh.d.ts.map +0 -1
- package/dist/planmagnet/hooks/useLiveRefresh.js.map +0 -1
- package/dist/planmagnet/hooks/usePresence.d.ts.map +0 -1
- package/dist/planmagnet/hooks/usePresence.js.map +0 -1
- package/dist/planmagnet/hooks/useProjectWorkflow.d.ts.map +0 -1
- package/dist/planmagnet/hooks/useProjectWorkflow.js.map +0 -1
- package/dist/planmagnet/import/exportColumns.d.ts.map +0 -1
- package/dist/planmagnet/import/exportColumns.js.map +0 -1
- package/dist/planmagnet/index.d.ts.map +0 -1
- package/dist/planmagnet/integrations/routes.d.ts.map +0 -1
- package/dist/planmagnet/integrations/routes.js.map +0 -1
- package/dist/planmagnet/integrations/syncTypes.d.ts.map +0 -1
- package/dist/planmagnet/integrations/syncTypes.js.map +0 -1
- package/dist/planmagnet/integrations/useSyncProviderCapabilities.d.ts.map +0 -1
- package/dist/planmagnet/integrations/useSyncProviderCapabilities.js.map +0 -1
- package/dist/planmagnet/links/CodeLinksPanel.d.ts.map +0 -1
- package/dist/planmagnet/links/CodeLinksPanel.js.map +0 -1
- package/dist/planmagnet/links/IssueLinksPanel.d.ts.map +0 -1
- package/dist/planmagnet/links/IssueLinksPanel.js.map +0 -1
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.d.ts.map +0 -1
- package/dist/planmagnet/meetings/MeetingActionItemsPanel.js.map +0 -1
- package/dist/planmagnet/meetings/MeetingsCard.d.ts.map +0 -1
- package/dist/planmagnet/meetings/MeetingsCard.js.map +0 -1
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.d.ts.map +0 -1
- package/dist/planmagnet/meetings/ScheduleCeremoniesDialog.js.map +0 -1
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.d.ts.map +0 -1
- package/dist/planmagnet/meetings/ScheduleMeetingDialog.js.map +0 -1
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.d.ts.map +0 -1
- package/dist/planmagnet/meetings/UnlinkMeetingDialog.js.map +0 -1
- package/dist/planmagnet/meetings/meetingActions.d.ts.map +0 -1
- package/dist/planmagnet/meetings/meetingActions.js.map +0 -1
- package/dist/planmagnet/meetings/meetingGraphql.d.ts.map +0 -1
- package/dist/planmagnet/meetings/meetingGraphql.js.map +0 -1
- package/dist/planmagnet/meetings/meetingModel.d.ts.map +0 -1
- package/dist/planmagnet/meetings/meetingModel.js.map +0 -1
- package/dist/planmagnet/milestones/MilestoneControls.d.ts.map +0 -1
- package/dist/planmagnet/milestones/MilestoneControls.js.map +0 -1
- package/dist/planmagnet/pages/ActivityActivityPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ActivityActivityPagePage.js.map +0 -1
- package/dist/planmagnet/pages/AiActivityPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/AiActivityPagePage.js.map +0 -1
- package/dist/planmagnet/pages/AiPlanPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/AiPlanPagePage.js.map +0 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js.map +0 -1
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +0 -1
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +0 -1
- package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +0 -1
- package/dist/planmagnet/pages/DashboardsExecutivePagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/DashboardsExecutivePagePage.js.map +0 -1
- package/dist/planmagnet/pages/DashboardsLeadershipPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/DashboardsLeadershipPagePage.js.map +0 -1
- package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/DashboardsProjectManagerPagePage.js.map +0 -1
- package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/DashboardsTeamUtilizationPagePage.js.map +0 -1
- package/dist/planmagnet/pages/DocsDocDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/DocsDocDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/DocsDocsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/DocsDocsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/GoalsCreateObjectivePagePage.js.map +0 -1
- package/dist/planmagnet/pages/GoalsGoalsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/GoalsGoalsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/GoalsObjectiveDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/IntegrationsNewSyncPagePage.js.map +0 -1
- package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/IntegrationsSyncDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/IntegrationsSyncsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/IntegrationsSyncsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/IntegrationsWebhooksPagePage.js.map +0 -1
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/MeetingsMeetingDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/MeetingsMeetingsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/NotFoundPage.d.ts.map +0 -1
- package/dist/planmagnet/pages/NotFoundPage.js.map +0 -1
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js.map +0 -1
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js.map +0 -1
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsCustomerSatisfactionPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsEditRoadmapPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsEditRoadmapPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsPrioritizationPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsPrioritizationPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsProductFeatureDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsProductHierarchyPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsProductLinesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsProductLinesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsAtRiskPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsGanttPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsGanttPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsQualityGatesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsQualityGatesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ProjectsWorkflowPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ProjectsWorkflowPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ReportsEditReportPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ReportsEditReportPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ReportsReportPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ReportsReportPagePage.js.map +0 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js.map +0 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksImportPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksImportPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksMyDashboardPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksMyDashboardPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksMyWorkPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksMyWorkPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TeamTeamDetailPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TeamTeamEditPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TeamTeamEditPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TeamTeamPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TeamTeamsListPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TeamTeamsListPagePage.js.map +0 -1
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js.map +0 -1
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +0 -1
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +0 -1
- package/dist/planmagnet/pages/analytics/DeliveryKpisCard.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/DeliveryKpisCard.js.map +0 -1
- package/dist/planmagnet/pages/analytics/MetricsCard.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/MetricsCard.js.map +0 -1
- package/dist/planmagnet/pages/analytics/QualityMetricsCard.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/QualityMetricsCard.js.map +0 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/SprintDeliveryCards.js.map +0 -1
- package/dist/planmagnet/pages/analytics/StatusFlowCard.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/StatusFlowCard.js.map +0 -1
- package/dist/planmagnet/pages/analytics/ThroughputCard.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/ThroughputCard.js.map +0 -1
- package/dist/planmagnet/pages/analytics/WorkBreakdownCard.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/WorkBreakdownCard.js.map +0 -1
- package/dist/planmagnet/pages/analytics/analyticsRange.d.ts.map +0 -1
- package/dist/planmagnet/pages/analytics/analyticsRange.js.map +0 -1
- package/dist/planmagnet/people/People.d.ts.map +0 -1
- package/dist/planmagnet/people/People.js.map +0 -1
- package/dist/planmagnet/presence/PresenceAvatars.d.ts.map +0 -1
- package/dist/planmagnet/presence/PresenceAvatars.js.map +0 -1
- package/dist/planmagnet/product/FeatureLinkPanels.d.ts.map +0 -1
- package/dist/planmagnet/product/FeatureLinkPanels.js.map +0 -1
- package/dist/planmagnet/product/ProductControls.d.ts.map +0 -1
- package/dist/planmagnet/product/ProductControls.js.map +0 -1
- package/dist/planmagnet/product/ProductFeatureControls.d.ts.map +0 -1
- package/dist/planmagnet/product/ProductFeatureControls.js.map +0 -1
- package/dist/planmagnet/product/ProductFeatureLinkCard.d.ts.map +0 -1
- package/dist/planmagnet/product/ProductFeatureLinkCard.js.map +0 -1
- package/dist/planmagnet/product/ProductLineControls.d.ts.map +0 -1
- package/dist/planmagnet/product/ProductLineControls.js.map +0 -1
- package/dist/planmagnet/product/ProductTeamsPanel.d.ts.map +0 -1
- package/dist/planmagnet/product/ProductTeamsPanel.js.map +0 -1
- package/dist/planmagnet/product/WorkItemProductFeatureChip.d.ts.map +0 -1
- package/dist/planmagnet/product/WorkItemProductFeatureChip.js.map +0 -1
- package/dist/planmagnet/product/hierarchy.d.ts.map +0 -1
- package/dist/planmagnet/product/hierarchy.js.map +0 -1
- package/dist/planmagnet/product/hierarchyOperations.d.ts.map +0 -1
- package/dist/planmagnet/product/hierarchyOperations.js.map +0 -1
- package/dist/planmagnet/product/refusal.d.ts.map +0 -1
- package/dist/planmagnet/product/refusal.js.map +0 -1
- package/dist/planmagnet/product/routes.d.ts.map +0 -1
- package/dist/planmagnet/product/routes.js.map +0 -1
- package/dist/planmagnet/providers/PlanMagnetProvider.d.ts.map +0 -1
- package/dist/planmagnet/providers/PlanMagnetProvider.js.map +0 -1
- package/dist/planmagnet/releases/ReleaseChecklistCard.d.ts.map +0 -1
- package/dist/planmagnet/releases/ReleaseChecklistCard.js.map +0 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.d.ts.map +0 -1
- package/dist/planmagnet/releases/ReleaseGatesCard.js.map +0 -1
- package/dist/planmagnet/releases/ReleaseNotesCard.d.ts.map +0 -1
- package/dist/planmagnet/releases/ReleaseNotesCard.js.map +0 -1
- package/dist/planmagnet/releases/ReleaseReadinessCard.d.ts.map +0 -1
- package/dist/planmagnet/releases/ReleaseReadinessCard.js.map +0 -1
- package/dist/planmagnet/releases/ReleaseWorkItemsCard.d.ts.map +0 -1
- package/dist/planmagnet/releases/ReleaseWorkItemsCard.js.map +0 -1
- package/dist/planmagnet/releases/useReleaseOptions.d.ts.map +0 -1
- package/dist/planmagnet/releases/useReleaseOptions.js.map +0 -1
- package/dist/planmagnet/reports/ExportMenu.d.ts.map +0 -1
- package/dist/planmagnet/reports/ExportMenu.js.map +0 -1
- package/dist/planmagnet/reports/PrintReportView.d.ts.map +0 -1
- package/dist/planmagnet/reports/PrintReportView.js.map +0 -1
- package/dist/planmagnet/reports/ReportBuilderCanvas.d.ts.map +0 -1
- package/dist/planmagnet/reports/ReportBuilderCanvas.js.map +0 -1
- package/dist/planmagnet/reports/ReportBuilderPage.d.ts.map +0 -1
- package/dist/planmagnet/reports/ReportBuilderPage.js.map +0 -1
- package/dist/planmagnet/reports/ReportRunHistory.d.ts.map +0 -1
- package/dist/planmagnet/reports/ReportRunHistory.js.map +0 -1
- package/dist/planmagnet/reports/ReportWidgetRenderer.d.ts.map +0 -1
- package/dist/planmagnet/reports/ReportWidgetRenderer.js.map +0 -1
- package/dist/planmagnet/reports/SchedulesPanel.d.ts.map +0 -1
- package/dist/planmagnet/reports/SchedulesPanel.js.map +0 -1
- package/dist/planmagnet/reports/ShareDialog.d.ts.map +0 -1
- package/dist/planmagnet/reports/ShareDialog.js.map +0 -1
- package/dist/planmagnet/reports/SharedReportPage.d.ts.map +0 -1
- package/dist/planmagnet/reports/SharedReportPage.js.map +0 -1
- package/dist/planmagnet/reports/WidgetEditorDialog.d.ts.map +0 -1
- package/dist/planmagnet/reports/WidgetEditorDialog.js.map +0 -1
- package/dist/planmagnet/reports/reportExportPptx.d.ts.map +0 -1
- package/dist/planmagnet/reports/reportExportPptx.js.map +0 -1
- package/dist/planmagnet/reports/reportExportXlsx.d.ts.map +0 -1
- package/dist/planmagnet/reports/reportExportXlsx.js.map +0 -1
- package/dist/planmagnet/reports/reportGraphql.d.ts.map +0 -1
- package/dist/planmagnet/reports/reportGraphql.js.map +0 -1
- package/dist/planmagnet/reports/reportModel.d.ts.map +0 -1
- package/dist/planmagnet/reports/reportModel.js.map +0 -1
- package/dist/planmagnet/reports/sharedReportRoute.d.ts.map +0 -1
- package/dist/planmagnet/reports/sharedReportRoute.js.map +0 -1
- package/dist/planmagnet/roadmaps/FeatureInitiativeCard.d.ts.map +0 -1
- package/dist/planmagnet/roadmaps/FeatureInitiativeCard.js.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapControls.d.ts.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapControls.js.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapNowNextLater.d.ts.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapNowNextLater.js.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapPresentation.d.ts.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapPresentation.js.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapReviewPanel.d.ts.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapReviewPanel.js.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.d.ts.map +0 -1
- package/dist/planmagnet/roadmaps/RoadmapVersionsPanel.js.map +0 -1
- package/dist/planmagnet/roadmaps/planningFocus.d.ts.map +0 -1
- package/dist/planmagnet/roadmaps/planningFocus.js.map +0 -1
- package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/DeliverySatisfactionSection.js.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionFigures.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionFigures.js.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionImportDialog.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionImportDialog.js.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionLinkFields.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionLinkFields.js.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionReleaseSelect.js.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionResponseDialog.js.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionResponsesTable.js.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionSummaryCard.js.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/SatisfactionWindowPicker.js.map +0 -1
- package/dist/planmagnet/satisfaction/satisfaction.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/satisfaction.js.map +0 -1
- package/dist/planmagnet/satisfaction/satisfactionCsv.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/satisfactionCsv.js.map +0 -1
- package/dist/planmagnet/satisfaction/satisfactionForm.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/satisfactionForm.js.map +0 -1
- package/dist/planmagnet/satisfaction/satisfactionOperations.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/satisfactionOperations.js.map +0 -1
- package/dist/planmagnet/satisfaction/useSatisfactionAccess.d.ts.map +0 -1
- package/dist/planmagnet/satisfaction/useSatisfactionAccess.js.map +0 -1
- package/dist/planmagnet/skills/RequiredSkillsEditor.d.ts.map +0 -1
- package/dist/planmagnet/skills/RequiredSkillsEditor.js.map +0 -1
- package/dist/planmagnet/skills/SkillChips.d.ts.map +0 -1
- package/dist/planmagnet/skills/SkillChips.js.map +0 -1
- package/dist/planmagnet/skills/SkillCoverageCard.d.ts.map +0 -1
- package/dist/planmagnet/skills/SkillCoverageCard.js.map +0 -1
- package/dist/planmagnet/skills/WorkItemRequiredSkills.d.ts.map +0 -1
- package/dist/planmagnet/skills/WorkItemRequiredSkills.js.map +0 -1
- package/dist/planmagnet/skills/skillOperations.d.ts.map +0 -1
- package/dist/planmagnet/skills/skillOperations.js.map +0 -1
- package/dist/planmagnet/skills/skillTags.d.ts.map +0 -1
- package/dist/planmagnet/skills/skillTags.js.map +0 -1
- package/dist/planmagnet/skills/useRequiredSkillsDraft.d.ts.map +0 -1
- package/dist/planmagnet/skills/useRequiredSkillsDraft.js.map +0 -1
- package/dist/planmagnet/sprints/SprintControls.d.ts.map +0 -1
- package/dist/planmagnet/sprints/SprintControls.js.map +0 -1
- package/dist/planmagnet/sprints/SprintDates.d.ts.map +0 -1
- package/dist/planmagnet/sprints/SprintDates.js.map +0 -1
- package/dist/planmagnet/store/planmagnetStore.d.ts.map +0 -1
- package/dist/planmagnet/store/planmagnetStore.js.map +0 -1
- package/dist/planmagnet/team/PendingInvitations.d.ts.map +0 -1
- package/dist/planmagnet/team/PendingInvitations.js.map +0 -1
- package/dist/planmagnet/team/TeamControls.d.ts.map +0 -1
- package/dist/planmagnet/team/TeamControls.js.map +0 -1
- package/dist/planmagnet/team/UnmatchedCrewIdentities.d.ts.map +0 -1
- package/dist/planmagnet/team/UnmatchedCrewIdentities.js.map +0 -1
- package/dist/planmagnet/team/invitationEmail.d.ts.map +0 -1
- package/dist/planmagnet/team/invitationEmail.js.map +0 -1
- package/dist/planmagnet/time/TaskTimePanel.d.ts.map +0 -1
- package/dist/planmagnet/time/TaskTimePanel.js.map +0 -1
- package/dist/planmagnet/time/TimeEntryControls.d.ts.map +0 -1
- package/dist/planmagnet/time/TimeEntryControls.js.map +0 -1
- package/dist/planmagnet/time/TimesheetControls.d.ts.map +0 -1
- package/dist/planmagnet/time/TimesheetControls.js.map +0 -1
- package/dist/planmagnet/time/timeShared.d.ts.map +0 -1
- package/dist/planmagnet/time/timeShared.js.map +0 -1
- package/dist/planmagnet/types/index.d.ts.map +0 -1
- package/dist/planmagnet/utils/cn.d.ts.map +0 -1
- package/dist/planmagnet/utils/cn.js.map +0 -1
- package/dist/planmagnet/utils/email.d.ts.map +0 -1
- package/dist/planmagnet/utils/email.js.map +0 -1
- package/dist/planmagnet/utils/formValidation.d.ts.map +0 -1
- package/dist/planmagnet/utils/formValidation.js.map +0 -1
- package/dist/planmagnet/utils/graphqlErrors.d.ts.map +0 -1
- package/dist/planmagnet/utils/graphqlErrors.js.map +0 -1
- package/dist/planmagnet/utils/lineDiff.d.ts.map +0 -1
- package/dist/planmagnet/utils/lineDiff.js.map +0 -1
- package/dist/planmagnet/utils/mutationResult.d.ts.map +0 -1
- package/dist/planmagnet/utils/mutationResult.js.map +0 -1
- package/dist/planmagnet/utils/navigation.d.ts.map +0 -1
- package/dist/planmagnet/utils/navigation.js.map +0 -1
- package/dist/planmagnet/utils/qualityGateCriteria.d.ts.map +0 -1
- package/dist/planmagnet/utils/qualityGateCriteria.js.map +0 -1
- package/dist/planmagnet/utils/rowNavigation.d.ts.map +0 -1
- package/dist/planmagnet/utils/rowNavigation.js.map +0 -1
- package/dist/planmagnet/utils/statusColor.d.ts.map +0 -1
- package/dist/planmagnet/utils/statusColor.js.map +0 -1
- package/dist/planmagnet/utils/urlParam.d.ts.map +0 -1
- package/dist/planmagnet/utils/urlParam.js.map +0 -1
- package/dist/planmagnet/webhooks/webhookTypes.d.ts.map +0 -1
- package/dist/planmagnet/webhooks/webhookTypes.js.map +0 -1
- package/dist/shared/hooks/useTr.d.ts.map +0 -1
- package/dist/shared/hooks/useTr.js.map +0 -1
- package/dist/shared/utils/i18n.d.ts.map +0 -1
- package/dist/shared/utils/i18n.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DocSuggestionsPanel.js","names":[],"sources":["../../../src/planmagnet/docs/DocSuggestionsPanel.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { FileEdit, Undo2 } from 'lucide-react';\nimport { PersonName } from '../people/People';\nimport { ConfirmButton, ErrorLine } from '../controls/ConfirmButton';\nimport { throwOnError } from '../utils/mutationResult';\nimport { isConflict, isForbidden, mutationErrorMessage } from '../utils/graphqlErrors';\nimport { lineDiff } from '../utils/lineDiff';\nimport { DocDiffHunks } from './DocDiffView';\n\n/**\n * Proposed edits against a doc (CWF-18 §2) that have not been applied: Open / Accepted / Rejected, each its own\n * tab and its own (paginated) `planmagnetDoc.suggestions(status: …)` read — Withdrawn ones are never shown here,\n * matching the three tabs this panel was scoped to (a withdrawn suggestion is, by design, gone from view — its\n * author already said it no longer applies).\n *\n * The diff preview is computed HERE, client-side (`lineDiff`): `planmagnetDocRevisionDiff` only compares two\n * already-saved revisions, and a suggestion's `proposedContent` was never saved as one — so the base side comes\n * from whichever loaded `PlanmagnetDocRevision` matches `baseVersion` (falling back to the live doc when the\n * suggestion is against the CURRENT version, which has no revision row of its own yet).\n *\n * Accept/Reject are shown to every viewer (the resolver is the real gate, same \"show it, let the server refuse\n * it\" house rule as every other write-tier control in this MFE) except Withdraw, which IS client-gated to the\n * suggestion's own author — `planmagnetWithdrawDocSuggestion`'s own schema doc says it is author-only, refused\n * NOT_FOUND (not FORBIDDEN) for anyone else, so showing it to a non-author would just be a button that always\n * fails.\n */\n\nconst PAGE = 10;\nconst SUGGESTION_QUERY_NAME = 'DocSuggestionsPanel';\n\nconst DOC_SUGGESTIONS = gql`\n query DocSuggestionsPanel(\n $docId: ID!\n $status: PlanmagnetDocSuggestionStatus\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetDoc(id: $docId) {\n id\n suggestions(status: $status, pagination: $pagination) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n id\n authorId\n baseVersion\n proposedTitle\n proposedContent\n note\n status\n createdAt\n decidedAt\n decidedBy\n }\n }\n }\n }\n`;\n\nconst DECIDE = gql`\n mutation PlanmagnetDecideDocSuggestionDecide($id: ID!, $accept: Boolean!) {\n planmagnetDecideDocSuggestion(id: $id, accept: $accept) {\n id\n status\n }\n }\n`;\n\nconst WITHDRAW = gql`\n mutation PlanmagnetWithdrawDocSuggestionWithdraw($id: ID!) {\n planmagnetWithdrawDocSuggestion(id: $id) {\n id\n status\n }\n }\n`;\n\ntype SuggestionStatus = 'OPEN' | 'ACCEPTED' | 'REJECTED';\n\ninterface Suggestion {\n id: string;\n authorId: string;\n baseVersion: number;\n proposedTitle: string | null;\n proposedContent: string;\n note: string | null;\n status: 'OPEN' | 'ACCEPTED' | 'REJECTED' | 'WITHDRAWN';\n createdAt: string;\n decidedAt: string | null;\n decidedBy: string | null;\n}\n\nexport interface DocRevisionForDiff {\n version: number;\n title: string;\n content: string;\n}\n\nconst when = (iso: string) => new Date(iso).toLocaleString();\n\nfunction SuggestionRow({\n suggestion,\n docTitle,\n docContent,\n revisions,\n currentUserId,\n}: {\n suggestion: Suggestion;\n docTitle: string;\n docContent: string;\n revisions: readonly DocRevisionForDiff[];\n currentUserId: string | undefined;\n}) {\n const [showDiff, setShowDiff] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const decideRefetch = {\n refetchQueries: [SUGGESTION_QUERY_NAME, 'DocDetail'],\n awaitRefetchQueries: true,\n };\n const [decide, decideState] = useMutation(DECIDE, decideRefetch);\n const [withdraw, withdrawState] = useMutation(WITHDRAW, {\n refetchQueries: [SUGGESTION_QUERY_NAME],\n awaitRefetchQueries: true,\n });\n\n // The suggestion's base version: a saved revision when the doc has moved on since, otherwise the live doc\n // itself (a suggestion against the CURRENT version has no PlanmagnetDocRevision row yet — only a save creates\n // one).\n const baseRevision = revisions.find((r) => r.version === suggestion.baseVersion);\n const baseContent = baseRevision?.content ?? docContent;\n const baseTitle = baseRevision?.title ?? docTitle;\n const diff = lineDiff(baseContent, suggestion.proposedContent);\n const titleChanged = suggestion.proposedTitle !== null && suggestion.proposedTitle !== baseTitle;\n const mine = suggestion.authorId === currentUserId;\n\n const act = async (action: () => Promise<{ error?: unknown }>, fallback: string) => {\n setError(null);\n try {\n await throwOnError(action());\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'Your role cannot decide this suggestion.'\n : isConflict(e)\n ? 'The doc changed since this was suggested.'\n : mutationErrorMessage(e, fallback)\n );\n }\n };\n\n return (\n <li\n className=\"space-y-2 rounded-md border border-border-default p-3\"\n data-testid=\"doc-suggestion\"\n >\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <p className=\"text-sm\">\n <span className=\"font-medium\">\n <PersonName id={suggestion.authorId} />\n </span>{' '}\n proposed {when(suggestion.createdAt)} against version {suggestion.baseVersion}\n </p>\n {suggestion.note && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{suggestion.note}</p>\n )}\n {suggestion.status !== 'OPEN' && (\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {suggestion.status === 'ACCEPTED' ? 'Accepted' : 'Rejected'}\n {suggestion.decidedBy ? (\n <>\n {' '}\n by <PersonName id={suggestion.decidedBy} />\n </>\n ) : null}\n {suggestion.decidedAt ? ` · ${when(suggestion.decidedAt)}` : ''}\n </p>\n )}\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 shrink-0 text-xs\"\n onClick={() => setShowDiff((v) => !v)}\n aria-expanded={showDiff}\n >\n {showDiff ? 'Hide diff' : 'Show diff'}\n </Button>\n </div>\n {error && <ErrorLine message={error} />}\n {showDiff && (\n <div className=\"space-y-1\">\n {titleChanged && (\n <p className=\"text-xs text-muted-foreground\">\n Title: <span className=\"line-through\">{baseTitle}</span> →{' '}\n <span className=\"font-medium text-foreground\">{suggestion.proposedTitle}</span>\n </p>\n )}\n <DocDiffHunks\n hunks={diff.hunks}\n truncated={diff.truncated}\n emptyMessage=\"No content differences.\"\n testId={`doc-suggestion-diff-${suggestion.id}`}\n />\n </div>\n )}\n {suggestion.status === 'OPEN' && (\n <div className=\"flex flex-wrap justify-end gap-2 border-t border-border-default pt-2\">\n {mine && (\n <ConfirmButton\n label=\"Withdraw\"\n icon={<Undo2 className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />}\n title=\"Withdraw this suggestion?\"\n description=\"It moves to Withdrawn and can no longer be accepted or rejected.\"\n confirmLabel=\"Withdraw\"\n variant=\"outline\"\n disabled={withdrawState.loading}\n onConfirm={() =>\n void act(\n () => withdraw({ variables: { id: suggestion.id } }),\n 'The suggestion could not be withdrawn.'\n )\n }\n testId=\"doc-suggestion-withdraw\"\n />\n )}\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={decideState.loading}\n data-testid=\"doc-suggestion-reject\"\n onClick={() =>\n void act(\n () => decide({ variables: { id: suggestion.id, accept: false } }),\n 'The suggestion could not be rejected.'\n )\n }\n >\n Reject\n </Button>\n <Button\n size=\"sm\"\n disabled={decideState.loading}\n data-testid=\"doc-suggestion-accept\"\n onClick={() =>\n void act(\n () => decide({ variables: { id: suggestion.id, accept: true } }),\n 'The suggestion could not be accepted.'\n )\n }\n >\n Accept\n </Button>\n </div>\n )}\n </li>\n );\n}\n\nfunction SuggestionList({\n docId,\n status,\n docTitle,\n docContent,\n revisions,\n currentUserId,\n}: {\n docId: string;\n status: SuggestionStatus;\n docTitle: string;\n docContent: string;\n revisions: readonly DocRevisionForDiff[];\n currentUserId: string | undefined;\n}) {\n const [loadingMore, setLoadingMore] = useState(false);\n const { data, loading, error, fetchMore } = useQuery<{\n planmagnetDoc: {\n id: string;\n suggestions: {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n items: Suggestion[];\n };\n } | null;\n }>(DOC_SUGGESTIONS, {\n variables: { docId, status, pagination: { first: PAGE } },\n skip: !docId,\n });\n\n const list = data?.planmagnetDoc?.suggestions;\n const items = list?.items ?? [];\n\n const loadMore = async () => {\n const after = list?.pageInfo.endCursor;\n if (!after) return;\n setLoadingMore(true);\n try {\n await fetchMore({\n variables: { docId, status, pagination: { first: PAGE, after } },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!prev.planmagnetDoc || !fetchMoreResult.planmagnetDoc) return prev;\n return {\n planmagnetDoc: {\n ...fetchMoreResult.planmagnetDoc,\n suggestions: {\n ...fetchMoreResult.planmagnetDoc.suggestions,\n items: [\n ...prev.planmagnetDoc.suggestions.items,\n ...fetchMoreResult.planmagnetDoc.suggestions.items,\n ],\n },\n },\n };\n },\n });\n } finally {\n setLoadingMore(false);\n }\n };\n\n return (\n <div className=\"space-y-2\">\n {loading && !data && <p className=\"text-sm text-muted-foreground\">Loading…</p>}\n {error && (\n <ErrorLine\n message={\n isForbidden(error)\n ? 'Your role cannot see this doc’s suggestions.'\n : `Suggestions could not be loaded: ${error.message}`\n }\n />\n )}\n {list && items.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n {status === 'OPEN'\n ? 'No open suggestions.'\n : status === 'ACCEPTED'\n ? 'None accepted yet.'\n : 'None rejected yet.'}\n </p>\n )}\n <ul className=\"space-y-2\">\n {items.map((s) => (\n <SuggestionRow\n key={s.id}\n suggestion={s}\n docTitle={docTitle}\n docContent={docContent}\n revisions={revisions}\n currentUserId={currentUserId}\n />\n ))}\n </ul>\n {list?.pageInfo.hasNextPage && (\n <Button size=\"sm\" variant=\"outline\" onClick={() => void loadMore()} disabled={loadingMore}>\n {loadingMore ? 'Loading…' : `Show more (${items.length} of ${list.totalCount})`}\n </Button>\n )}\n </div>\n );\n}\n\nexport function DocSuggestionsPanel({\n docId,\n docTitle,\n docContent,\n revisions,\n currentUserId,\n}: {\n docId: string;\n docTitle: string;\n docContent: string;\n revisions: readonly DocRevisionForDiff[];\n currentUserId: string | undefined;\n}) {\n const [tab, setTab] = useState<SuggestionStatus>('OPEN');\n return (\n <Card data-testid=\"doc-suggestions\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <FileEdit className=\"h-4 w-4\" aria-hidden=\"true\" />\n Suggestions\n </CardTitle>\n </CardHeader>\n <CardContent>\n <Tabs value={tab} onValueChange={(v) => setTab(v as SuggestionStatus)}>\n <TabsList>\n <TabsTrigger value=\"OPEN\" data-testid=\"doc-suggestions-tab-open\">\n Open\n </TabsTrigger>\n <TabsTrigger value=\"ACCEPTED\" data-testid=\"doc-suggestions-tab-accepted\">\n Accepted\n </TabsTrigger>\n <TabsTrigger value=\"REJECTED\" data-testid=\"doc-suggestions-tab-rejected\">\n Rejected\n </TabsTrigger>\n </TabsList>\n {(['OPEN', 'ACCEPTED', 'REJECTED'] as const).map((status) => (\n <TabsContent key={status} value={status} className=\"mt-3\">\n <SuggestionList\n docId={docId}\n status={status}\n docTitle={docTitle}\n docContent={docContent}\n revisions={revisions}\n currentUserId={currentUserId}\n />\n </TabsContent>\n ))}\n </Tabs>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAwCA,IAAM,IAAO,IACP,IAAwB,uBAExB,IAAkB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BrB,IAAS,CAAG;;;;;;;GASZ,IAAW,CAAG;;;;;;;GA8Bd,KAAQ,MAAgB,IAAI,KAAK,EAAI,CAAC,gBAAgB;AAE5D,SAAS,EAAc,EACrB,eACA,aACA,eACA,cACA,oBAOC;CACD,IAAM,CAAC,GAAU,KAAe,EAAS,GAAM,EACzC,CAAC,GAAO,KAAY,EAAwB,KAAK,EAKjD,CAAC,GAAQ,KAAe,EAAY,GAJpB;EACpB,gBAAgB,CAAC,GAAuB,YAAY;EACpD,qBAAqB;EACtB,CAC+D,EAC1D,CAAC,GAAU,KAAiB,EAAY,GAAU;EACtD,gBAAgB,CAAC,EAAsB;EACvC,qBAAqB;EACtB,CAAC,EAKI,IAAe,EAAU,MAAM,MAAM,EAAE,YAAY,EAAW,YAAY,EAC1E,IAAc,GAAc,WAAW,GACvC,IAAY,GAAc,SAAS,GACnC,IAAO,EAAS,GAAa,EAAW,gBAAgB,EACxD,IAAe,EAAW,kBAAkB,QAAQ,EAAW,kBAAkB,GACjF,IAAO,EAAW,aAAa,GAE/B,IAAM,OAAO,GAA4C,MAAqB;AAClF,IAAS,KAAK;AACd,MAAI;AACF,SAAM,EAAa,GAAQ,CAAC;WACrB,GAAG;AACV,KACE,EAAY,EAAE,GACV,6CACA,EAAW,EAAE,GACX,8CACA,EAAqB,GAAG,EAAS,CACxC;;;AAIL,QACE,kBAAC,MAAD;EACE,WAAU;EACV,eAAY;YAFd;GAIE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACE,kBAAC,QAAD;SAAM,WAAU;mBACd,kBAAC,GAAD,EAAY,IAAI,EAAW,UAAY,CAAA;SAClC,CAAA;QAAC;QAAI;QACF,EAAK,EAAW,UAAU;QAAC;QAAkB,EAAW;QAChE;;MACH,EAAW,QACV,kBAAC,KAAD;OAAG,WAAU;iBAAwC,EAAW;OAAS,CAAA;MAE1E,EAAW,WAAW,UACrB,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAW,WAAW,aAAa,aAAa;QAChD,EAAW,YACV,kBAAA,GAAA,EAAA,UAAA;SACG;SAAI;SACF,kBAAC,GAAD,EAAY,IAAI,EAAW,WAAa,CAAA;SAC1C,EAAA,CAAA,GACD;QACH,EAAW,YAAY,MAAM,EAAK,EAAW,UAAU,KAAK;QAC3D;;MAEF;QACN,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,WAAU;KACV,eAAe,GAAa,MAAM,CAAC,EAAE;KACrC,iBAAe;eAEd,IAAW,cAAc;KACnB,CAAA,CACL;;GACL,KAAS,kBAAC,GAAD,EAAW,SAAS,GAAS,CAAA;GACtC,KACC,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,KACC,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA6C;MACpC,kBAAC,QAAD;OAAM,WAAU;iBAAgB;OAAiB,CAAA;;MAAG;MAC3D,kBAAC,QAAD;OAAM,WAAU;iBAA+B,EAAW;OAAqB,CAAA;MAC7E;QAEN,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,WAAW,EAAK;KAChB,cAAa;KACb,QAAQ,uBAAuB,EAAW;KAC1C,CAAA,CACE;;GAEP,EAAW,WAAW,UACrB,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,KACC,kBAAC,GAAD;MACE,OAAM;MACN,MAAM,kBAAC,GAAD;OAAO,WAAU;OAAc,eAAY;OAAS,CAAA;MAC1D,OAAM;MACN,aAAY;MACZ,cAAa;MACb,SAAQ;MACR,UAAU,EAAc;MACxB,iBACE,KAAK,QACG,EAAS,EAAE,WAAW,EAAE,IAAI,EAAW,IAAI,EAAE,CAAC,EACpD,yCACD;MAEH,QAAO;MACP,CAAA;KAEJ,kBAAC,GAAD;MACE,MAAK;MACL,SAAQ;MACR,UAAU,EAAY;MACtB,eAAY;MACZ,eACE,KAAK,QACG,EAAO,EAAE,WAAW;OAAE,IAAI,EAAW;OAAI,QAAQ;OAAO,EAAE,CAAC,EACjE,wCACD;gBAEJ;MAEQ,CAAA;KACT,kBAAC,GAAD;MACE,MAAK;MACL,UAAU,EAAY;MACtB,eAAY;MACZ,eACE,KAAK,QACG,EAAO,EAAE,WAAW;OAAE,IAAI,EAAW;OAAI,QAAQ;OAAM,EAAE,CAAC,EAChE,wCACD;gBAEJ;MAEQ,CAAA;KACL;;GAEL;;;AAIT,SAAS,EAAe,EACtB,UACA,WACA,aACA,eACA,cACA,oBAQC;CACD,IAAM,CAAC,GAAa,KAAkB,EAAS,GAAM,EAC/C,EAAE,SAAM,YAAS,UAAO,iBAAc,EASzC,GAAiB;EAClB,WAAW;GAAE;GAAO;GAAQ,YAAY,EAAE,OAAO,GAAM;GAAE;EACzD,MAAM,CAAC;EACR,CAAC,EAEI,IAAO,GAAM,eAAe,aAC5B,IAAQ,GAAM,SAAS,EAAE,EAEzB,IAAW,YAAY;EAC3B,IAAM,IAAQ,GAAM,SAAS;AACxB,SACL;KAAe,GAAK;AACpB,OAAI;AACF,UAAM,EAAU;KACd,WAAW;MAAE;MAAO;MAAQ,YAAY;OAAE,OAAO;OAAM;OAAO;MAAE;KAChE,cAAc,GAAM,EAAE,yBAChB,CAAC,EAAK,iBAAiB,CAAC,EAAgB,gBAAsB,IAC3D,EACL,eAAe;MACb,GAAG,EAAgB;MACnB,aAAa;OACX,GAAG,EAAgB,cAAc;OACjC,OAAO,CACL,GAAG,EAAK,cAAc,YAAY,OAClC,GAAG,EAAgB,cAAc,YAAY,MAC9C;OACF;MACF,EACF;KAEJ,CAAC;aACM;AACR,MAAe,GAAM;;;;AAIzB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACG,KAAW,CAAC,KAAQ,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAAY,CAAA;GAC7E,KACC,kBAAC,GAAD,EACE,SACE,EAAY,EAAM,GACd,iDACA,oCAAoC,EAAM,WAEhD,CAAA;GAEH,KAAQ,EAAM,WAAW,KACxB,kBAAC,KAAD;IAAG,WAAU;cACV,MAAW,SACR,yBACA,MAAW,aACT,uBACA;IACJ,CAAA;GAEN,kBAAC,MAAD;IAAI,WAAU;cACX,EAAM,KAAK,MACV,kBAAC,GAAD;KAEE,YAAY;KACF;KACE;KACD;KACI;KACf,EANK,EAAE,GAMP,CACF;IACC,CAAA;GACJ,GAAM,SAAS,eACd,kBAAC,GAAD;IAAQ,MAAK;IAAK,SAAQ;IAAU,eAAe,KAAK,GAAU;IAAE,UAAU;cAC3E,IAAc,aAAa,cAAc,EAAM,OAAO,MAAM,EAAK,WAAW;IACtE,CAAA;GAEP;;;AAIV,SAAgB,EAAoB,EAClC,UACA,aACA,eACA,cACA,oBAOC;CACD,IAAM,CAAC,GAAK,KAAU,EAA2B,OAAO;AACxD,QACE,kBAAC,GAAD;EAAM,eAAY;YAAlB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB,CACE,kBAAC,GAAD;IAAU,WAAU;IAAU,eAAY;IAAS,CAAA,EAAA,cAEzC;MACD,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAM,OAAO;GAAK,gBAAgB,MAAM,EAAO,EAAsB;aAArE,CACE,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,GAAD;KAAa,OAAM;KAAO,eAAY;eAA2B;KAEnD,CAAA;IACd,kBAAC,GAAD;KAAa,OAAM;KAAW,eAAY;eAA+B;KAE3D,CAAA;IACd,kBAAC,GAAD;KAAa,OAAM;KAAW,eAAY;eAA+B;KAE3D,CAAA;IACL,EAAA,CAAA,EACT;IAAC;IAAQ;IAAY;IAAW,CAAW,KAAK,MAChD,kBAAC,GAAD;IAA0B,OAAO;IAAQ,WAAU;cACjD,kBAAC,GAAD;KACS;KACC;KACE;KACE;KACD;KACI;KACf,CAAA;IACU,EATI,EASJ,CACd,CACG;MACK,CAAA,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DocVersionCompare.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/docs/DocVersionCompare.tsx"],"names":[],"mappings":"AAwCA,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,SAAS;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1C,2CAwGA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DocVersionCompare.js","names":[],"sources":["../../../src/planmagnet/docs/DocVersionCompare.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useLazyQuery } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { GitCompare } from 'lucide-react';\nimport { ErrorLine } from '../controls/ConfirmButton';\nimport { isForbidden } from '../utils/graphqlErrors';\nimport { DocDiffHunks, type DocDiffHunkLike } from './DocDiffView';\n\n/**\n * Version compare in the doc's history panel (CWF-18 §3): pick two SAVED versions and diff them through the\n * server's `planmagnetDocRevisionDiff` (line-based, bounded, same hunk shape `DocDiffHunks` already renders for\n * a suggestion preview). \"To\" left as \"Current\" diffs against the doc's live version, matching the query's own\n * \"omit toVersion = against current\" contract.\n */\n\nconst DOC_REVISION_DIFF = gql`\n query PlanmagnetDocRevisionDiffPanel($docId: ID!, $fromVersion: Int!, $toVersion: Int) {\n planmagnetDocRevisionDiff(docId: $docId, fromVersion: $fromVersion, toVersion: $toVersion) {\n docId\n fromVersion\n toVersion\n truncated\n hunks {\n kind\n text\n }\n }\n }\n`;\n\ninterface RevisionDiffData {\n planmagnetDocRevisionDiff: {\n fromVersion: number;\n toVersion: number;\n truncated: boolean;\n hunks: DocDiffHunkLike[];\n };\n}\n\nexport function DocVersionCompare({\n docId,\n versions,\n}: {\n docId: string;\n versions: readonly { version: number }[];\n}) {\n const sorted = [...versions].sort((a, b) => b.version - a.version);\n const [fromVersion, setFromVersion] = useState('');\n const [toVersion, setToVersion] = useState('');\n const [runDiff, diffState] = useLazyQuery<RevisionDiffData>(DOC_REVISION_DIFF);\n\n const compare = () => {\n if (!fromVersion) return;\n void runDiff({\n variables: {\n docId,\n fromVersion: Number(fromVersion),\n toVersion: toVersion ? Number(toVersion) : undefined,\n },\n });\n };\n\n const diff = diffState.data?.planmagnetDocRevisionDiff ?? null;\n\n return (\n <div\n className=\"space-y-3 border-t border-border-default pt-3\"\n data-testid=\"doc-version-compare\"\n >\n <p className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n <GitCompare className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n Compare versions\n </p>\n {sorted.length < 2 ? (\n <p className=\"text-xs text-muted-foreground\">Needs at least two versions to compare.</p>\n ) : (\n <>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label htmlFor=\"doc-diff-from\" className=\"text-xs font-medium\">\n From\n </label>\n <select\n id=\"doc-diff-from\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm\"\n value={fromVersion}\n onChange={(e) => {\n const next = e.target.value;\n setFromVersion(next);\n // Same \"To\" cannot equal \"From\" rule RoadmapVersionsPanel's compare section uses: picking a\n // version as \"From\" that is already selected as \"To\" silently falls the visible \"To\" back to\n // \"Current\" — reset the state to match what a Compare click would actually send.\n setToVersion((prevTo) => (prevTo === next ? '' : prevTo));\n }}\n >\n <option value=\"\">Select a version</option>\n {sorted.map((v) => (\n <option key={v.version} value={v.version}>\n Version {v.version}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label htmlFor=\"doc-diff-to\" className=\"text-xs font-medium\">\n To\n </label>\n <select\n id=\"doc-diff-to\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm\"\n value={toVersion}\n onChange={(e) => setToVersion(e.target.value)}\n >\n <option value=\"\">Current</option>\n {sorted\n .filter((v) => String(v.version) !== fromVersion)\n .map((v) => (\n <option key={v.version} value={v.version}>\n Version {v.version}\n </option>\n ))}\n </select>\n </div>\n </div>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={compare}\n disabled={!fromVersion || diffState.loading}\n data-testid=\"doc-version-compare-run\"\n >\n {diffState.loading ? 'Comparing…' : 'Compare'}\n </Button>\n {diffState.error && (\n <ErrorLine\n message={\n isForbidden(diffState.error)\n ? 'Your role cannot compare versions of this doc.'\n : `The comparison could not be loaded: ${diffState.error.message}`\n }\n />\n )}\n {diff && (\n <DocDiffHunks hunks={diff.hunks} truncated={diff.truncated} testId=\"doc-version-diff\" />\n )}\n </>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAgBA,IAAM,IAAoB,CAAG;;;;;;;;;;;;;;AAwB7B,SAAgB,EAAkB,EAChC,UACA,eAIC;CACD,IAAM,IAAS,CAAC,GAAG,EAAS,CAAC,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,EAC5D,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAW,KAAgB,EAAS,GAAG,EACxC,CAAC,GAAS,KAAa,EAA+B,EAAkB,EAExE,UAAgB;AACf,OACA,EAAQ,EACX,WAAW;GACT;GACA,aAAa,OAAO,EAAY;GAChC,WAAW,IAAY,OAAO,EAAU,GAAG,KAAA;GAC5C,EACF,CAAC;IAGE,IAAO,EAAU,MAAM,6BAA6B;AAE1D,QACE,kBAAC,OAAD;EACE,WAAU;EACV,eAAY;YAFd,CAIE,kBAAC,KAAD;GAAG,WAAU;aAAb,CACE,kBAAC,GAAD;IAAY,WAAU;IAAc,eAAY;IAAS,CAAA,EAAA,mBAEvD;MACH,EAAO,SAAS,IACf,kBAAC,KAAD;GAAG,WAAU;aAAgC;GAA2C,CAAA,GAExF,kBAAA,GAAA,EAAA,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,SAAQ;KAAgB,WAAU;eAAsB;KAEvD,CAAA,EACR,kBAAC,UAAD;KACE,IAAG;KACH,WAAU;KACV,OAAO;KACP,WAAW,MAAM;MACf,IAAM,IAAO,EAAE,OAAO;AAKtB,MAJA,EAAe,EAAK,EAIpB,GAAc,MAAY,MAAW,IAAO,KAAK,EAAQ;;eAV7D,CAaE,kBAAC,UAAD;MAAQ,OAAM;gBAAG;MAAyB,CAAA,EACzC,EAAO,KAAK,MACX,kBAAC,UAAD;MAAwB,OAAO,EAAE;gBAAjC,CAA0C,YAC/B,EAAE,QACJ;QAFI,EAAE,QAEN,CACT,CACK;OACL,EAAA,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,SAAQ;KAAc,WAAU;eAAsB;KAErD,CAAA,EACR,kBAAC,UAAD;KACE,IAAG;KACH,WAAU;KACV,OAAO;KACP,WAAW,MAAM,EAAa,EAAE,OAAO,MAAM;eAJ/C,CAME,kBAAC,UAAD;MAAQ,OAAM;gBAAG;MAAgB,CAAA,EAChC,EACE,QAAQ,MAAM,OAAO,EAAE,QAAQ,KAAK,EAAY,CAChD,KAAK,MACJ,kBAAC,UAAD;MAAwB,OAAO,EAAE;gBAAjC,CAA0C,YAC/B,EAAE,QACJ;QAFI,EAAE,QAEN,CACT,CACG;OACL,EAAA,CAAA,CACF;;GACN,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,SAAS;IACT,UAAU,CAAC,KAAe,EAAU;IACpC,eAAY;cAEX,EAAU,UAAU,eAAe;IAC7B,CAAA;GACR,EAAU,SACT,kBAAC,GAAD,EACE,SACE,EAAY,EAAU,MAAM,GACxB,mDACA,uCAAuC,EAAU,MAAM,WAE7D,CAAA;GAEH,KACC,kBAAC,GAAD;IAAc,OAAO,EAAK;IAAO,WAAW,EAAK;IAAW,QAAO;IAAqB,CAAA;GAEzF,EAAA,CAAA,CAED"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ExportWorkItemsButton.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/export/ExportWorkItemsButton.tsx"],"names":[],"mappings":"AA2DA,wBAAgB,qBAAqB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAkF1E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ExportWorkItemsButton.js","names":[],"sources":["../../../src/planmagnet/export/ExportWorkItemsButton.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Download } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { downloadCsv, type ExportableWorkItem, workItemsCsv } from './workItemsCsv';\n\nconst PAGE = gql`\n query ExportWorkItemsPage($workspaceId: ID!, $filter: PlanmagnetWorkItemFilter, $after: String) {\n planmagnetWorkItems(\n workspaceId: $workspaceId\n filter: $filter\n pagination: { first: 100, after: $after }\n ) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n key\n title\n type\n status\n priority\n storyPoints\n assigneeId\n projectId\n sprintId\n dueDate\n createdAt\n updatedAt\n }\n }\n }\n`;\ninterface WorkItemsPage {\n planmagnetWorkItems: {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n items: ExportableWorkItem[];\n };\n}\n\nconst PROJECTS = gql`\n query ExportWorkItemsProjects($workspaceId: ID!) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n }\n }\n }\n`;\n\n/** Every page, not just the first 100 — an export that silently stops at a page is worse than none. */\nconst MAX_PAGES = 200;\n\nexport function ExportWorkItemsButton({ projectId }: { projectId?: string }) {\n const { workspaceId } = usePlanMagnet();\n const client = useApolloClient();\n const [state, setState] = useState<{ busy: boolean; message: string | null; error: boolean }>({\n busy: false,\n message: null,\n error: false,\n });\n\n const run = async () => {\n if (!workspaceId) return;\n setState({ busy: true, message: 'Preparing export…', error: false });\n try {\n const filter = projectId ? { projectId } : undefined;\n const items: ExportableWorkItem[] = [];\n let after: string | null = null;\n let total = 0;\n for (let page = 0; page < MAX_PAGES; page++) {\n const result: Awaited<ReturnType<typeof client.query<WorkItemsPage>>> =\n await client.query<WorkItemsPage>({\n query: PAGE,\n variables: { workspaceId, filter, after },\n fetchPolicy: 'network-only',\n });\n if (result.error) throw result.error;\n const list: WorkItemsPage['planmagnetWorkItems'] | undefined =\n result.data?.planmagnetWorkItems;\n if (!list) throw new Error('The work items could not be read.');\n total = list.totalCount;\n items.push(...list.items);\n if (!list.pageInfo.hasNextPage || !list.pageInfo.endCursor) break;\n after = list.pageInfo.endCursor;\n }\n if (items.length < total) {\n throw new Error(\n `Only ${items.length} of ${total} work items could be read; nothing was exported.`\n );\n }\n const projects = await client.query<{\n planmagnetProjects: { items: Array<{ id: string; name: string }> };\n }>({\n query: PROJECTS,\n variables: { workspaceId },\n fetchPolicy: 'network-only',\n });\n const names = new Map(\n (projects.data?.planmagnetProjects.items ?? []).map((p) => [p.id, p.name])\n );\n const stamp = new Date().toISOString().slice(0, 10);\n downloadCsv(`planmagnet-work-items-${stamp}.csv`, workItemsCsv(items, names));\n setState({ busy: false, message: `Exported ${items.length} work items.`, error: false });\n } catch (e) {\n setState({\n busy: false,\n message: e instanceof Error ? e.message : 'The export failed.',\n error: true,\n });\n }\n };\n\n return (\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={run}\n disabled={state.busy}\n data-testid=\"export-work-items\"\n >\n <Download className=\"mr-1 h-4 w-4\" />\n {state.busy ? 'Exporting…' : 'Export CSV'}\n </Button>\n {state.message && (\n <span\n role={state.error ? 'alert' : 'status'}\n className={`text-xs ${state.error ? 'text-destructive' : 'text-muted-foreground'}`}\n >\n {state.message}\n </span>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAQA,IAAM,IAAO,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCV,IAAW,CAAG;;;;;;;;;GAYd,IAAY;AAElB,SAAgB,EAAsB,EAAE,gBAAqC;CAC3E,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAS,GAAiB,EAC1B,CAAC,GAAO,KAAY,EAAoE;EAC5F,MAAM;EACN,SAAS;EACT,OAAO;EACR,CAAC;AAqDF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,SAxDM,YAAY;AACjB,WACL;OAAS;MAAE,MAAM;MAAM,SAAS;MAAqB,OAAO;MAAO,CAAC;AACpE,SAAI;MACF,IAAM,IAAS,IAAY,EAAE,cAAW,GAAG,KAAA,GACrC,IAA8B,EAAE,EAClC,IAAuB,MACvB,IAAQ;AACZ,WAAK,IAAI,IAAO,GAAG,IAAO,GAAW,KAAQ;OAC3C,IAAM,IACJ,MAAM,EAAO,MAAqB;QAChC,OAAO;QACP,WAAW;SAAE;SAAa;SAAQ;SAAO;QACzC,aAAa;QACd,CAAC;AACJ,WAAI,EAAO,MAAO,OAAM,EAAO;OAC/B,IAAM,IACJ,EAAO,MAAM;AACf,WAAI,CAAC,EAAM,OAAU,MAAM,oCAAoC;AAG/D,WAFA,IAAQ,EAAK,YACb,EAAM,KAAK,GAAG,EAAK,MAAM,EACrB,CAAC,EAAK,SAAS,eAAe,CAAC,EAAK,SAAS,UAAW;AAC5D,WAAQ,EAAK,SAAS;;AAExB,UAAI,EAAM,SAAS,EACjB,OAAU,MACR,QAAQ,EAAM,OAAO,MAAM,EAAM,kDAClC;MAEH,IAAM,IAAW,MAAM,EAAO,MAE3B;OACD,OAAO;OACP,WAAW,EAAE,gBAAa;OAC1B,aAAa;OACd,CAAC,EACI,IAAQ,IAAI,KACf,EAAS,MAAM,mBAAmB,SAAS,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAC3E;AAGD,MADA,EAAY,0CADE,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,GAAG,GAAG,CACR,OAAO,EAAa,GAAO,EAAM,CAAC,EAC7E,EAAS;OAAE,MAAM;OAAO,SAAS,YAAY,EAAM,OAAO;OAAe,OAAO;OAAO,CAAC;cACjF,GAAG;AACV,QAAS;OACP,MAAM;OACN,SAAS,aAAa,QAAQ,EAAE,UAAU;OAC1C,OAAO;OACR,CAAC;;;;GAUA,UAAU,EAAM;GAChB,eAAY;aALd,CAOE,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EACpC,EAAM,OAAO,eAAe,aACtB;MACR,EAAM,WACL,kBAAC,QAAD;GACE,MAAM,EAAM,QAAQ,UAAU;GAC9B,WAAW,WAAW,EAAM,QAAQ,qBAAqB;aAExD,EAAM;GACF,CAAA,CAEL"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workItemsCsv.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/export/workItemsCsv.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAmBD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAK/C;AAKD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,kBAAkB,EAAE,EAC3B,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CASR;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAS/D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workItemsCsv.js","names":[],"sources":["../../../src/planmagnet/export/workItemsCsv.ts"],"sourcesContent":["/**\n * Work items as CSV (P1.4 \"data cannot leave the product\").\n *\n * Built in the browser from the same API the pages use, so it exports exactly\n * what the caller may read. The platform's Takeout-style export\n * (wspace-export-svc) would need a PlanMagnet entity config in that shared\n * service — held — so this is the in-product path.\n */\n\nexport interface ExportableWorkItem {\n key: string;\n title: string;\n type: string;\n status: string;\n priority: string;\n storyPoints: number | null;\n assigneeId: string | null;\n projectId: string;\n sprintId: string | null;\n dueDate: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\nconst COLUMNS: Array<\n [header: string, value: (item: ExportableWorkItem, project: string) => unknown]\n> = [\n ['Key', (i) => i.key],\n ['Title', (i) => i.title],\n ['Type', (i) => i.type],\n ['Status', (i) => i.status],\n ['Priority', (i) => i.priority],\n ['Story points', (i) => i.storyPoints],\n ['Project', (_, project) => project],\n ['Assignee ID', (i) => i.assigneeId],\n ['Sprint ID', (i) => i.sprintId],\n ['Due date', (i) => i.dueDate],\n ['Created', (i) => i.createdAt],\n ['Updated', (i) => i.updatedAt],\n];\n\n/**\n * One CSV field. Quotes when needed (comma, quote, CR/LF) and neutralises\n * spreadsheet formulas: a cell starting with = + - @ TAB or CR is executed by\n * Excel/Sheets (\"CSV injection\"), so it is prefixed with a single quote.\n */\nexport function csvField(value: unknown): string {\n if (value === null || value === undefined) return '';\n let text = String(value);\n if (/^[=+\\-@\\t\\r]/.test(text)) text = `'${text}`;\n return /[\",\\r\\n]/.test(text) ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/** Makes Excel read the file as UTF-8. */\nconst UTF8_BOM = String.fromCharCode(0xfeff);\n\nexport function workItemsCsv(\n items: ExportableWorkItem[],\n projectNames: Map<string, string>\n): string {\n const header = COLUMNS.map(([name]) => csvField(name)).join(',');\n const rows = items.map((item) =>\n COLUMNS.map(([, value]) =>\n csvField(value(item, projectNames.get(item.projectId) ?? item.projectId))\n ).join(',')\n );\n // CRLF per RFC 4180; the BOM makes Excel read UTF-8 correctly.\n return `${UTF8_BOM}${[header, ...rows].join('\\r\\n')}\\r\\n`;\n}\n\nexport function downloadCsv(filename: string, csv: string): void {\n const url = URL.createObjectURL(new Blob([csv], { type: 'text/csv;charset=utf-8' }));\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n}\n"],"mappings":";AAwBA,IAAM,IAEF;CACF,CAAC,QAAQ,MAAM,EAAE,IAAI;CACrB,CAAC,UAAU,MAAM,EAAE,MAAM;CACzB,CAAC,SAAS,MAAM,EAAE,KAAK;CACvB,CAAC,WAAW,MAAM,EAAE,OAAO;CAC3B,CAAC,aAAa,MAAM,EAAE,SAAS;CAC/B,CAAC,iBAAiB,MAAM,EAAE,YAAY;CACtC,CAAC,YAAY,GAAG,MAAY,EAAQ;CACpC,CAAC,gBAAgB,MAAM,EAAE,WAAW;CACpC,CAAC,cAAc,MAAM,EAAE,SAAS;CAChC,CAAC,aAAa,MAAM,EAAE,QAAQ;CAC9B,CAAC,YAAY,MAAM,EAAE,UAAU;CAC/B,CAAC,YAAY,MAAM,EAAE,UAAU;CAChC;AAOD,SAAgB,EAAS,GAAwB;AAC/C,KAAI,KAAU,KAA6B,QAAO;CAClD,IAAI,IAAO,OAAO,EAAM;AAExB,QADI,eAAe,KAAK,EAAK,KAAE,IAAO,IAAI,MACnC,WAAW,KAAK,EAAK,GAAG,IAAI,EAAK,QAAQ,MAAM,OAAK,CAAC,KAAK;;AAInE,IAAM,IAAW;AAEjB,SAAgB,EACd,GACA,GACQ;AAQR,QAAO,GAAG,IAAW,CAPN,EAAQ,KAAK,CAAC,OAAU,EAAS,EAAK,CAAC,CAAC,KAAK,IAAI,EAOlC,GANjB,EAAM,KAAK,MACtB,EAAQ,KAAK,GAAG,OACd,EAAS,EAAM,GAAM,EAAa,IAAI,EAAK,UAAU,IAAI,EAAK,UAAU,CAAC,CAC1E,CAAC,KAAK,IAAI,CACZ,CAEqC,CAAC,KAAK,OAAO,CAAC;;AAGtD,SAAgB,EAAY,GAAkB,GAAmB;CAC/D,IAAM,IAAM,IAAI,gBAAgB,IAAI,KAAK,CAAC,EAAI,EAAE,EAAE,MAAM,0BAA0B,CAAC,CAAC,EAC9E,IAAO,SAAS,cAAc,IAAI;AAMxC,CALA,EAAK,OAAO,GACZ,EAAK,WAAW,GAChB,SAAS,KAAK,YAAY,EAAK,EAC/B,EAAK,OAAO,EACZ,EAAK,QAAQ,EACb,IAAI,gBAAgB,EAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeliveryForecastCard.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/forecast/DeliveryForecastCard.tsx"],"names":[],"mappings":"AAkFA,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,SAAS;AACT;;;oFAGoF;AACpF,QAAQ,EACR,UAAU,GACX,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,2CAwMA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeliveryForecastCard.js","names":[],"sources":["../../../src/planmagnet/forecast/DeliveryForecastCard.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Checkbox } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { CalendarRange } from 'lucide-react';\nimport { isForbidden } from '../utils/graphqlErrors';\n\n/**\n * ANR-02: the Monte Carlo delivery forecast (`planmagnetForecastDelivery`) — how many more\n * sprints a project's (or one sprint's) remaining scope is likely to take, and the calendar\n * dates those sprint counts land on. Shared by the project detail page and the Analytics page\n * (both project-scoped) so the wording and the insufficient-history handling can never drift\n * between the two.\n *\n * NEVER an AI/LLM call — the server resamples the trailing completed sprints' real velocities\n * (2,000 seeded trials, deterministic). Labelled \"Statistical forecast (Monte Carlo over past\n * sprints)\" everywhere it appears, never presented as AI.\n */\n\nconst GET_DELIVERY_FORECAST = gql`\n query PlanmagnetDeliveryForecast(\n $workspaceId: ID!\n $projectId: ID!\n $scope: PlanmagnetForecastScopeInput\n ) {\n planmagnetForecastDelivery(workspaceId: $workspaceId, projectId: $projectId, scope: $scope) {\n method\n insufficientHistory\n reason\n remainingPoints\n unestimatedItems\n scopeTruncated\n confidenceNote\n sprintsNeeded {\n p50\n p85\n p95\n }\n dates {\n p50\n p85\n p95\n }\n inputRefs {\n sprintId\n name\n completedPoints\n endDate\n }\n }\n }\n`;\n\ninterface DeliveryForecast {\n method: 'MONTE_CARLO_VELOCITY';\n insufficientHistory: boolean;\n reason: string | null;\n remainingPoints: number;\n unestimatedItems: number;\n scopeTruncated: boolean;\n confidenceNote: string;\n sprintsNeeded: { p50: number; p85: number; p95: number } | null;\n dates: { p50: string; p85: string; p95: string } | null;\n inputRefs: { sprintId: string; name: string; completedPoints: number; endDate: string | null }[];\n}\n\ninterface DeliveryForecastData {\n planmagnetForecastDelivery: DeliveryForecast;\n}\n\n/** Forecast dates are calendar days (UTC midnight, derived from Sprint.endDate); show them\n * without a time-zone shift — same convention as SprintDates.tsx's `day()` helper. */\nfunction formatDate(iso: string): string {\n return new Date(iso).toLocaleDateString(undefined, {\n timeZone: 'UTC',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n}\n\nexport function DeliveryForecastCard({\n workspaceId,\n projectId,\n /** When set, the card offers an \"only this sprint's items\" toggle that narrows\n * `scope.sprintId` to this sprint instead of the project's full remaining scope. Pass the\n * active/current sprint of whatever page hosts this card — omit it where no single sprint\n * is in context (the card then always forecasts the project's full open scope). */\n sprintId,\n sprintName,\n}: {\n workspaceId?: string | null;\n projectId: string;\n sprintId?: string | null;\n sprintName?: string | null;\n}) {\n const { t } = useI18n();\n const [scopeToSprint, setScopeToSprint] = useState(false);\n const effectiveScopeToSprint = scopeToSprint && Boolean(sprintId);\n const { data, loading, error } = useQuery<DeliveryForecastData>(GET_DELIVERY_FORECAST, {\n variables: {\n workspaceId,\n projectId,\n scope: effectiveScopeToSprint && sprintId ? { sprintId } : undefined,\n },\n skip: !workspaceId || !projectId,\n });\n const forecast = data?.planmagnetForecastDelivery;\n\n return (\n <Card data-testid=\"forecast-card\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <CalendarRange className=\"h-4 w-4\" />\n {t('planmagnet.forecast.delivery.title', 'Delivery forecast')}\n </CardTitle>\n <p className=\"text-xs text-muted-foreground\">\n {effectiveScopeToSprint\n ? t(\n 'planmagnet.forecast.delivery.subtitleSprint',\n 'For the open items of {{sprint}} only.',\n {\n sprint: sprintName ?? t('planmagnet.forecast.delivery.thisSprint', 'this sprint'),\n }\n )\n : t(\n 'planmagnet.forecast.delivery.subtitle',\n \"For this project's own open, estimated work items.\"\n )}\n </p>\n {sprintId && (\n <label\n htmlFor={`forecast-scope-sprint-${projectId}`}\n className=\"flex items-center gap-2 pt-1 text-xs font-normal text-muted-foreground\"\n >\n <Checkbox\n id={`forecast-scope-sprint-${projectId}`}\n checked={scopeToSprint}\n onCheckedChange={(checked) => setScopeToSprint(checked === true)}\n />\n {t(\n 'planmagnet.forecast.delivery.scopeToggle',\n \"Only this sprint's items ({{sprint}})\",\n { sprint: sprintName ?? t('planmagnet.forecast.delivery.thisSprint', 'this sprint') }\n )}\n </label>\n )}\n </CardHeader>\n <CardContent>\n {!projectId ? (\n <p className=\"text-sm text-muted-foreground\">\n {t('planmagnet.forecast.delivery.noProject', 'Select a project to see its forecast.')}\n </p>\n ) : loading && !data ? (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n ) : error ? (\n <p className=\"text-sm text-status-error-text\">\n {isForbidden(error)\n ? t(\n 'planmagnet.forecast.delivery.forbidden',\n 'You do not have access to the delivery forecast for this project.'\n )\n : `${t('planmagnet.forecast.delivery.error', 'Delivery forecast could not be loaded')}: ${error.message}`}\n </p>\n ) : !forecast ? null : forecast.insufficientHistory ? (\n <div className=\"space-y-2\" data-testid=\"forecast-insufficient\">\n <p className=\"text-sm text-muted-foreground\">\n {forecast.reason ??\n t(\n 'planmagnet.forecast.delivery.insufficientFallback',\n 'Not enough completed-sprint history yet to forecast a delivery date.'\n )}\n </p>\n <p className=\"text-xs text-muted-foreground\">{forecast.confidenceNote}</p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <dl className=\"grid grid-cols-3 gap-3 text-center\" data-testid=\"forecast-dates\">\n <div className=\"rounded-md border p-2.5\">\n <dt className=\"text-xs text-muted-foreground\">\n {t('planmagnet.forecast.delivery.p50Label', 'Likely by (p50)')}\n </dt>\n <dd className=\"mt-1 text-sm font-semibold\">\n {forecast.dates ? formatDate(forecast.dates.p50) : '—'}\n </dd>\n <dd className=\"text-xs text-muted-foreground\">\n {forecast.sprintsNeeded\n ? t('planmagnet.forecast.delivery.sprints', '{{count}} sprint(s)', {\n count: forecast.sprintsNeeded.p50,\n })\n : '—'}\n </dd>\n </div>\n <div className=\"rounded-md border p-2.5\">\n <dt className=\"text-xs text-muted-foreground\">\n {t('planmagnet.forecast.delivery.p85Label', 'Confident by (p85)')}\n </dt>\n <dd className=\"mt-1 text-sm font-semibold\">\n {forecast.dates ? formatDate(forecast.dates.p85) : '—'}\n </dd>\n <dd className=\"text-xs text-muted-foreground\">\n {forecast.sprintsNeeded\n ? t('planmagnet.forecast.delivery.sprints', '{{count}} sprint(s)', {\n count: forecast.sprintsNeeded.p85,\n })\n : '—'}\n </dd>\n </div>\n <div className=\"rounded-md border p-2.5\">\n <dt className=\"text-xs text-muted-foreground\">\n {t('planmagnet.forecast.delivery.p95Label', 'Very confident by (p95)')}\n </dt>\n <dd className=\"mt-1 text-sm font-semibold\">\n {forecast.dates ? formatDate(forecast.dates.p95) : '—'}\n </dd>\n <dd className=\"text-xs text-muted-foreground\">\n {forecast.sprintsNeeded\n ? t('planmagnet.forecast.delivery.sprints', '{{count}} sprint(s)', {\n count: forecast.sprintsNeeded.p95,\n })\n : '—'}\n </dd>\n </div>\n </dl>\n\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span>\n {t('planmagnet.forecast.delivery.remaining', 'Remaining: {{points}} pts', {\n points: forecast.remainingPoints,\n })}\n </span>\n {forecast.unestimatedItems > 0 && (\n <span className=\"text-status-warning-text\">\n {t(\n 'planmagnet.forecast.delivery.unestimated',\n '{{count}} open item(s) have no estimate (counted as 0 pts)',\n { count: forecast.unestimatedItems }\n )}\n </span>\n )}\n </div>\n\n {forecast.scopeTruncated && (\n <p className=\"text-xs text-status-warning-text\">\n {t(\n 'planmagnet.forecast.delivery.truncated',\n 'This scope is large enough that the scan stopped early — remaining points and unestimated items reflect only the first items found, not the whole project.'\n )}\n </p>\n )}\n\n <div>\n <h3 className=\"mb-1 text-sm font-medium\">\n {t('planmagnet.forecast.delivery.evidence', 'Based on')}\n </h3>\n <ul className=\"space-y-1 text-xs text-muted-foreground\" data-testid=\"forecast-inputs\">\n {forecast.inputRefs.map((ref) => (\n <li key={ref.sprintId} className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate\">{ref.name}</span>\n <span className=\"shrink-0 tabular-nums\">\n {t('planmagnet.forecast.delivery.evidenceRow', '{{points}} pts', {\n points: ref.completedPoints,\n })}\n {ref.endDate ? ` · ${formatDate(ref.endDate)}` : ''}\n </span>\n </li>\n ))}\n {forecast.inputRefs.length === 0 && (\n <li>\n {t('planmagnet.forecast.delivery.noInputs', 'No sprint history available.')}\n </li>\n )}\n </ul>\n </div>\n\n <p className=\"text-xs text-muted-foreground\">{forecast.confidenceNote}</p>\n\n <details className=\"text-xs text-muted-foreground\">\n <summary className=\"cursor-pointer select-none font-medium text-foreground\">\n {t('planmagnet.forecast.whatIsThis', 'What is this?')}\n </summary>\n <p className=\"mt-1\">\n {t(\n 'planmagnet.forecast.delivery.explainer',\n 'Statistical forecast (Monte Carlo over past sprints): a simulation that resamples this project’s trailing completed sprints’ real velocities thousands of times to see how many more sprints the remaining work is likely to take. It is never an AI/LLM call, and it never invents a date from a sample it doesn’t trust — when history is too thin, it says so instead of guessing.'\n )}\n </p>\n </details>\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectOutlookCard.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/forecast/ProjectOutlookCard.tsx"],"names":[],"mappings":"AAmHA,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,SAAS,GACV,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,2CAoMA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectOutlookCard.js","names":[],"sources":["../../../src/planmagnet/forecast/ProjectOutlookCard.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Badge, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Compass } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { isForbidden } from '../utils/graphqlErrors';\n\n/**\n * ANR-10: `planmagnetProjectOutlook` — a heuristic project health summary. Never an AI/LLM\n * call and never a made-up percentage: `successLikelihood` is HIGH/MEDIUM/LOW by the EXACT\n * rule in `successLikelihoodRule`, rendered verbatim so the badge is never unexplained.\n * Labelled HEURISTIC throughout, never presented as AI.\n */\n\nconst GET_PROJECT_OUTLOOK = gql`\n query PlanmagnetProjectOutlook($workspaceId: ID!, $projectId: ID!) {\n planmagnetProjectOutlook(workspaceId: $workspaceId, projectId: $projectId) {\n projectId\n method\n successLikelihood\n successLikelihoodRule\n timelineDeviationDays\n qualityTrend {\n recentDefectRatio\n priorDefectRatio\n trend\n }\n riskExposure {\n totalExposure\n topRisks {\n riskId\n title\n likelihood\n impact\n exposure\n }\n }\n budgetProjection {\n budgetId\n name\n spentAmount\n totalAmount\n burnRatePerDay\n projectedSpendAtForecastDate\n projectedOverage\n }\n inputs\n }\n }\n`;\n\ninterface ProjectOutlook {\n projectId: string;\n method: 'HEURISTIC';\n successLikelihood: 'HIGH' | 'MEDIUM' | 'LOW';\n successLikelihoodRule: string;\n timelineDeviationDays: number | null;\n qualityTrend: {\n recentDefectRatio: number | null;\n priorDefectRatio: number | null;\n trend: 'IMPROVING' | 'STABLE' | 'WORSENING' | 'UNKNOWN';\n };\n riskExposure: {\n totalExposure: number;\n topRisks: {\n riskId: string;\n title: string;\n likelihood: number | null;\n impact: number | null;\n exposure: number;\n }[];\n };\n budgetProjection:\n | {\n budgetId: string;\n name: string;\n spentAmount: number;\n totalAmount: number;\n burnRatePerDay: number;\n projectedSpendAtForecastDate: number | null;\n projectedOverage: number | null;\n }[]\n | null;\n inputs: string[];\n}\n\ninterface ProjectOutlookData {\n planmagnetProjectOutlook: ProjectOutlook;\n}\n\nconst LIKELIHOOD_BADGE: Record<\n ProjectOutlook['successLikelihood'],\n 'success' | 'warning' | 'destructive'\n> = {\n HIGH: 'success',\n MEDIUM: 'warning',\n LOW: 'destructive',\n};\n\nconst TREND_BADGE: Record<\n ProjectOutlook['qualityTrend']['trend'],\n 'success' | 'warning' | 'secondary' | 'outline'\n> = {\n IMPROVING: 'success',\n STABLE: 'secondary',\n WORSENING: 'warning',\n UNKNOWN: 'outline',\n};\n\nfunction pct(ratio: number | null): string {\n return ratio === null ? '—' : `${Math.round(ratio * 100)}%`;\n}\n\nexport function ProjectOutlookCard({\n workspaceId,\n projectId,\n}: {\n workspaceId?: string | null;\n projectId: string;\n}) {\n const { t } = useI18n();\n const navigate = usePlanMagnetNavigate();\n const { data, loading, error } = useQuery<ProjectOutlookData>(GET_PROJECT_OUTLOOK, {\n variables: { workspaceId, projectId },\n skip: !workspaceId || !projectId,\n });\n const outlook = data?.planmagnetProjectOutlook;\n\n return (\n <Card data-testid=\"outlook-card\">\n <CardHeader className=\"flex flex-row items-start justify-between space-y-0\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n <Compass className=\"h-4 w-4\" />\n {t('planmagnet.forecast.outlook.title', 'Project outlook')}\n </CardTitle>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'planmagnet.forecast.outlook.subtitle',\n 'Explicit rule-based heuristics over real data — never AI.'\n )}\n </p>\n </div>\n <Badge variant=\"outline\">{t('planmagnet.forecast.outlook.method', 'HEURISTIC')}</Badge>\n </CardHeader>\n <CardContent>\n {loading && !data ? (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n ) : error ? (\n <p className=\"text-sm text-status-error-text\">\n {isForbidden(error)\n ? t(\n 'planmagnet.forecast.outlook.forbidden',\n 'You do not have access to the outlook for this project.'\n )\n : `${t('planmagnet.forecast.outlook.error', 'Project outlook could not be loaded')}: ${error.message}`}\n </p>\n ) : !outlook ? null : (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge variant={LIKELIHOOD_BADGE[outlook.successLikelihood]}>\n {t(\n 'planmagnet.forecast.outlook.successLikelihood',\n 'Success likelihood: {{level}}',\n {\n level: outlook.successLikelihood,\n }\n )}\n </Badge>\n <span className=\"text-xs text-muted-foreground\">\n {t('planmagnet.forecast.outlook.timelineDeviation', 'Timeline: {{status}}', {\n status:\n outlook.timelineDeviationDays === null\n ? t(\n 'planmagnet.forecast.outlook.timelineUnknown',\n 'no forecast/target to compare'\n )\n : outlook.timelineDeviationDays > 0\n ? t('planmagnet.forecast.outlook.timelineLate', '{{days}} day(s) late', {\n days: outlook.timelineDeviationDays,\n })\n : outlook.timelineDeviationDays < 0\n ? t(\n 'planmagnet.forecast.outlook.timelineEarly',\n '{{days}} day(s) early',\n {\n days: Math.abs(outlook.timelineDeviationDays),\n }\n )\n : t('planmagnet.forecast.outlook.timelineOnTarget', 'on target'),\n })}\n </span>\n </div>\n {/* The rule text verbatim — the badge above is never unexplained. */}\n <p className=\"text-xs text-muted-foreground\">{outlook.successLikelihoodRule}</p>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div className=\"rounded-md border p-3\">\n <h3 className=\"mb-1 flex items-center gap-2 text-sm font-medium\">\n {t('planmagnet.forecast.outlook.quality', 'Quality trend')}\n <Badge variant={TREND_BADGE[outlook.qualityTrend.trend]}>\n {outlook.qualityTrend.trend}\n </Badge>\n </h3>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'planmagnet.forecast.outlook.qualityRatios',\n 'Recent 4wk defect ratio {{recent}}, prior 4wk {{prior}}',\n {\n recent: pct(outlook.qualityTrend.recentDefectRatio),\n prior: pct(outlook.qualityTrend.priorDefectRatio),\n }\n )}\n </p>\n </div>\n <div className=\"rounded-md border p-3\">\n <h3 className=\"mb-1 text-sm font-medium\">\n {t('planmagnet.forecast.outlook.riskExposure', 'Risk exposure')}\n </h3>\n <p className=\"text-xs text-muted-foreground mb-1\">\n {t(\n 'planmagnet.forecast.outlook.totalExposure',\n 'Total (likelihood × impact): {{value}}',\n {\n value: outlook.riskExposure.totalExposure,\n }\n )}\n </p>\n <ul className=\"space-y-0.5\">\n {outlook.riskExposure.topRisks.map((risk) => (\n <li key={risk.riskId}>\n <button\n type=\"button\"\n className=\"truncate text-left text-xs text-primary hover:underline\"\n onClick={() => navigate(detailPath('/risks/risk-detail-page', risk.riskId))}\n >\n {risk.title} ({risk.exposure})\n </button>\n </li>\n ))}\n {outlook.riskExposure.topRisks.length === 0 && (\n <li className=\"text-xs text-muted-foreground\">\n {t('planmagnet.forecast.outlook.noOpenRisks', 'No open risks.')}\n </li>\n )}\n </ul>\n </div>\n </div>\n\n <div>\n <h3 className=\"mb-1 text-sm font-medium\">\n {t('planmagnet.forecast.outlook.budget', 'Budget projection')}\n </h3>\n {outlook.budgetProjection === null ? (\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.forecast.outlook.noBudgets', 'This project has no budgets.')}\n </p>\n ) : (\n <ul className=\"space-y-1.5\">\n {outlook.budgetProjection.map((b) => (\n <li\n key={b.budgetId}\n className=\"flex items-center justify-between gap-2 text-xs\"\n >\n <span className=\"truncate font-medium text-foreground\">{b.name}</span>\n <span\n className={`shrink-0 tabular-nums ${\n b.projectedOverage !== null && b.projectedOverage > 0\n ? 'text-status-error-text'\n : 'text-muted-foreground'\n }`}\n >\n {b.spentAmount.toLocaleString()} / {b.totalAmount.toLocaleString()}\n {b.projectedOverage !== null &&\n ` · ${\n b.projectedOverage > 0\n ? t(\n 'planmagnet.forecast.outlook.projectedOver',\n 'projected +{{amount}} over',\n {\n amount: Math.round(b.projectedOverage).toLocaleString(),\n }\n )\n : t(\n 'planmagnet.forecast.outlook.projectedUnder',\n 'projected within plan'\n )\n }`}\n </span>\n </li>\n ))}\n </ul>\n )}\n </div>\n\n {outlook.inputs.length > 0 && (\n <div>\n <h3 className=\"mb-1 text-sm font-medium\">\n {t('planmagnet.forecast.outlook.inputs', 'What this is based on')}\n </h3>\n <ul className=\"list-inside list-disc space-y-0.5 text-xs text-muted-foreground\">\n {outlook.inputs.map((note, i) => (\n // Plain-language notes carry no stable id of their own; the list is short and never reordered.\n <li key={`${i}-${note.slice(0, 24)}`}>{note}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectRiskSummaryCard.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/forecast/ProjectRiskSummaryCard.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,SAAS,GACV,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,2CAkFA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectRiskSummaryCard.js","names":[],"sources":["../../../src/planmagnet/forecast/ProjectRiskSummaryCard.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Badge, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { ShieldAlert } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { isForbidden } from '../utils/graphqlErrors';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport {\n RISK_FLAG_KIND_ORDER,\n RISK_FLAG_SEVERITY_ORDER,\n riskFlagKindIcon,\n riskFlagSeverityBadgeVariant,\n type RiskFlagKindValue,\n type RiskFlagSeverityValue,\n} from './riskFlags';\n\n/**\n * AI-10 at-risk counts (`planmagnetProjectRiskSummary`), compact — a project-page tile that\n * links through to the full At-risk work list (`ProjectsAtRiskPagePage`). Rule-based, never\n * AI/LLM: every count here is a deterministic threshold rule, same as `planmagnetAtRiskWorkItems`.\n */\n\nconst GET_PROJECT_RISK_SUMMARY = gql`\n query PlanmagnetProjectRiskSummary($workspaceId: ID!, $projectId: ID!) {\n planmagnetProjectRiskSummary(workspaceId: $workspaceId, projectId: $projectId) {\n projectId\n totalFlaggedItems\n byKind {\n kind\n count\n }\n bySeverity {\n severity\n count\n }\n }\n }\n`;\n\ninterface ProjectRiskSummary {\n projectId: string;\n totalFlaggedItems: number;\n byKind: { kind: RiskFlagKindValue; count: number }[];\n bySeverity: { severity: RiskFlagSeverityValue; count: number }[];\n}\n\ninterface ProjectRiskSummaryData {\n planmagnetProjectRiskSummary: ProjectRiskSummary;\n}\n\nexport function ProjectRiskSummaryCard({\n workspaceId,\n projectId,\n}: {\n workspaceId?: string | null;\n projectId: string;\n}) {\n const { t } = useI18n();\n const navigate = usePlanMagnetNavigate();\n const { data, loading, error } = useQuery<ProjectRiskSummaryData>(GET_PROJECT_RISK_SUMMARY, {\n variables: { workspaceId, projectId },\n skip: !workspaceId || !projectId,\n });\n const summary = data?.planmagnetProjectRiskSummary;\n const byKind = new Map(summary?.byKind.map((k) => [k.kind, k.count]) ?? []);\n const bySeverity = new Map(summary?.bySeverity.map((s) => [s.severity, s.count]) ?? []);\n\n return (\n <Card data-testid=\"risk-summary\">\n <CardHeader className=\"flex flex-row items-start justify-between space-y-0\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n <ShieldAlert className=\"h-4 w-4\" />\n {t('planmagnet.forecast.riskSummary.title', 'At-risk work')}\n </CardTitle>\n <p className=\"text-xs text-muted-foreground\">\n {t('planmagnet.forecast.riskSummary.subtitle', 'Explicit threshold rules — never AI.')}\n </p>\n </div>\n <Badge variant=\"outline\">{t('planmagnet.forecast.riskSummary.method', 'Rule-based')}</Badge>\n </CardHeader>\n <CardContent>\n {loading && !data ? (\n <p className=\"text-sm text-muted-foreground\">\n {t('planmagnet.forecast.loading', 'Loading…')}\n </p>\n ) : error ? (\n <p className=\"text-sm text-status-error-text\">\n {isForbidden(error)\n ? t(\n 'planmagnet.forecast.riskSummary.forbidden',\n 'You do not have access to at-risk work for this project.'\n )\n : `${t('planmagnet.forecast.riskSummary.error', 'At-risk summary could not be loaded')}: ${error.message}`}\n </p>\n ) : !summary ? null : summary.totalFlaggedItems === 0 ? (\n <p className=\"text-sm text-muted-foreground\">\n {t('planmagnet.forecast.riskSummary.empty', 'No flagged work items right now.')}\n </p>\n ) : (\n <div className=\"space-y-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n {RISK_FLAG_SEVERITY_ORDER.filter((s) => (bySeverity.get(s) ?? 0) > 0).map((s) => (\n <Badge key={s} variant={riskFlagSeverityBadgeVariant(s)}>\n {enumLabel(s)}: {bySeverity.get(s)}\n </Badge>\n ))}\n </div>\n <ul className=\"space-y-1 text-xs\">\n {RISK_FLAG_KIND_ORDER.filter((k) => (byKind.get(k) ?? 0) > 0).map((k) => {\n const Icon = riskFlagKindIcon(k);\n return (\n <li key={k} className=\"flex items-center justify-between text-muted-foreground\">\n <span className=\"flex items-center gap-1.5\">\n <Icon className=\"h-3.5 w-3.5\" />\n {enumLabel(k)}\n </span>\n <span className=\"tabular-nums\">{byKind.get(k)}</span>\n </li>\n );\n })}\n </ul>\n <button\n type=\"button\"\n className=\"text-xs text-primary hover:underline\"\n onClick={() =>\n navigate(`/projects/at-risk-page?projectId=${encodeURIComponent(projectId)}`)\n }\n >\n {t('planmagnet.forecast.riskSummary.viewAll', 'View at-risk work ({{count}}) →', {\n count: summary.totalFlaggedItems,\n })}\n </button>\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;;AAuBA,IAAM,IAA2B,CAAG;;;;;;;;;;;;;;;;AA4BpC,SAAgB,EAAuB,EACrC,gBACA,gBAIC;CACD,IAAM,EAAE,SAAM,GAAS,EACjB,IAAW,GAAuB,EAClC,EAAE,SAAM,YAAS,aAAU,EAAiC,GAA0B;EAC1F,WAAW;GAAE;GAAa;GAAW;EACrC,MAAM,CAAC,KAAe,CAAC;EACxB,CAAC,EACI,IAAU,GAAM,8BAChB,IAAS,IAAI,IAAI,GAAS,OAAO,KAAK,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EACrE,IAAa,IAAI,IAAI,GAAS,WAAW,KAAK,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AAEvF,QACE,kBAAC,GAAD;EAAM,eAAY;YAAlB,CACE,kBAAC,GAAD;GAAY,WAAU;aAAtB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAW,WAAU;cAArB,CACE,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA,EAClC,EAAE,yCAAyC,eAAe,CACjD;OACZ,kBAAC,KAAD;IAAG,WAAU;cACV,EAAE,4CAA4C,uCAAuC;IACpF,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;IAAO,SAAQ;cAAW,EAAE,0CAA0C,aAAa;IAAS,CAAA,CACjF;MACb,kBAAC,GAAD,EAAA,UACG,KAAW,CAAC,IACX,kBAAC,KAAD;GAAG,WAAU;aACV,EAAE,+BAA+B,WAAW;GAC3C,CAAA,GACF,IACF,kBAAC,KAAD;GAAG,WAAU;aACV,EAAY,EAAM,GACf,EACE,6CACA,2DACD,GACD,GAAG,EAAE,yCAAyC,sCAAsC,CAAC,IAAI,EAAM;GACjG,CAAA,GACD,IAAiB,EAAQ,sBAAsB,IAClD,kBAAC,KAAD;GAAG,WAAU;aACV,EAAE,yCAAyC,mCAAmC;GAC7E,CAAA,GAEJ,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAyB,QAAQ,OAAO,EAAW,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,KAAK,MACzE,kBAAC,GAAD;MAAe,SAAS,EAA6B,EAAE;gBAAvD;OACG,EAAU,EAAE;OAAC;OAAG,EAAW,IAAI,EAAE;OAC5B;QAFI,EAEJ,CACR;KACE,CAAA;IACN,kBAAC,MAAD;KAAI,WAAU;eACX,EAAqB,QAAQ,OAAO,EAAO,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,KAAK,MAG/D,kBAAC,MAAD;MAAY,WAAU;gBAAtB,CACE,kBAAC,QAAD;OAAM,WAAU;iBAAhB,CACE,kBAJO,EAAiB,EAAE,EAI1B,EAAM,WAAU,eAAgB,CAAA,EAC/B,EAAU,EAAE,CACR;UACP,kBAAC,QAAD;OAAM,WAAU;iBAAgB,EAAO,IAAI,EAAE;OAAQ,CAAA,CAClD;QANI,EAMJ,CAEP;KACC,CAAA;IACL,kBAAC,UAAD;KACE,MAAK;KACL,WAAU;KACV,eACE,EAAS,oCAAoC,mBAAmB,EAAU,GAAG;eAG9E,EAAE,2CAA2C,mCAAmC,EAC/E,OAAO,EAAQ,mBAChB,CAAC;KACK,CAAA;IACL;OAtCO,MAwCH,CAAA,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceForecastCard.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/forecast/ResourceForecastCard.tsx"],"names":[],"mappings":"AAyEA,wBAAgB,oBAAoB,CAAC,EACnC,WAAW,EACX,MAAM,EACN,SAAS,EACT,cAAkB,GACnB,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,2CA6KA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ResourceForecastCard.js","names":[],"sources":["../../../src/planmagnet/forecast/ResourceForecastCard.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Gauge } from 'lucide-react';\nimport { isForbidden } from '../utils/graphqlErrors';\nimport { StatTile } from '../pages/analytics/DeliveryHealthCards';\n\n/**\n * ANR-11: `planmagnetResourceForecast` — open backlog vs historical velocity, and the resulting\n * per-sprint capacity gap over the horizon. Used on the team detail page (team scope) and the\n * project detail page (project scope) — same card either way, one of `teamId`/`projectId` set.\n *\n * Statistical, never AI/LLM: reuses the same trailing-sprint-velocity resolution\n * `planmagnetForecastDelivery` does. Demand is the CURRENT open backlog split evenly across the\n * horizon (not a burndown simulation) and capacity never trends — see the field doc comments in\n * graphql/wspace.graphql. Skills/roles are not modelled: this is a total-points forecast only.\n */\n\nconst GET_RESOURCE_FORECAST = gql`\n query PlanmagnetResourceForecast(\n $workspaceId: ID!\n $teamId: ID\n $projectId: ID\n $horizonSprints: Int\n ) {\n planmagnetResourceForecast(\n workspaceId: $workspaceId\n teamId: $teamId\n projectId: $projectId\n horizonSprints: $horizonSprints\n ) {\n scopeType\n horizonSprints\n openEstimatedPoints\n unestimatedOpenItems\n backlogTruncated\n insufficientHistory\n velocityP50\n sprintsToClear\n confidenceNote\n capacityGaps {\n sprintNumber\n demandPoints\n forecastCapacityPoints\n gapPoints\n }\n }\n }\n`;\n\ninterface ResourceForecast {\n scopeType: 'TEAM' | 'PROJECT';\n horizonSprints: number;\n openEstimatedPoints: number;\n unestimatedOpenItems: number;\n backlogTruncated: boolean;\n insufficientHistory: boolean;\n velocityP50: number | null;\n sprintsToClear: number | null;\n confidenceNote: string;\n capacityGaps: {\n sprintNumber: number;\n demandPoints: number;\n forecastCapacityPoints: number;\n gapPoints: number;\n }[];\n}\n\ninterface ResourceForecastData {\n planmagnetResourceForecast: ResourceForecast;\n}\n\nexport function ResourceForecastCard({\n workspaceId,\n teamId,\n projectId,\n horizonSprints = 3,\n}: {\n workspaceId?: string | null;\n /** Exactly one of teamId/projectId — the server requires it (`horizonSprints` schema doc). */\n teamId?: string;\n projectId?: string;\n horizonSprints?: number;\n}) {\n const { t } = useI18n();\n const { data, loading, error } = useQuery<ResourceForecastData>(GET_RESOURCE_FORECAST, {\n variables: { workspaceId, teamId, projectId, horizonSprints },\n skip: !workspaceId || (!teamId && !projectId),\n });\n const forecast = data?.planmagnetResourceForecast;\n const maxGapMagnitude = Math.max(\n 1,\n ...(forecast?.capacityGaps.map((g) => Math.abs(g.gapPoints)) ?? [1])\n );\n\n return (\n <Card data-testid=\"resource-forecast\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Gauge className=\"h-4 w-4\" />\n {t('planmagnet.forecast.resource.title', 'Resource forecast')}\n </CardTitle>\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'planmagnet.forecast.resource.subtitle',\n 'Open backlog vs. historical velocity, over the next {{count}} sprint(s).',\n { count: horizonSprints }\n )}\n </p>\n </CardHeader>\n <CardContent>\n {!teamId && !projectId ? null : loading && !data ? (\n <div className=\"flex justify-center py-8\">\n <div className=\"animate-spin h-6 w-6 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n ) : error ? (\n <p className=\"text-sm text-status-error-text\">\n {isForbidden(error)\n ? t(\n 'planmagnet.forecast.resource.forbidden',\n 'You do not have access to the resource forecast for this scope.'\n )\n : `${t('planmagnet.forecast.resource.error', 'Resource forecast could not be loaded')}: ${error.message}`}\n </p>\n ) : !forecast ? null : (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-4\">\n <StatTile\n label={t('planmagnet.forecast.resource.openPoints', 'Open est. points')}\n value={String(forecast.openEstimatedPoints)}\n />\n <StatTile\n label={t('planmagnet.forecast.resource.unestimated', 'Unestimated items')}\n value={String(forecast.unestimatedOpenItems)}\n />\n <StatTile\n label={t('planmagnet.forecast.resource.velocity', 'Velocity (p50)')}\n value={\n forecast.velocityP50 === null ? '—' : String(Math.round(forecast.velocityP50))\n }\n />\n <StatTile\n label={t('planmagnet.forecast.resource.sprintsToClear', 'Sprints to clear')}\n value={forecast.sprintsToClear === null ? '—' : forecast.sprintsToClear.toFixed(1)}\n />\n </div>\n\n {forecast.insufficientHistory ? (\n <p className=\"text-sm text-muted-foreground\">\n {t(\n 'planmagnet.forecast.resource.insufficient',\n 'Not enough completed-sprint history yet to forecast capacity for this scope.'\n )}\n </p>\n ) : (\n <div>\n <h3 className=\"mb-1 text-sm font-medium\">\n {t('planmagnet.forecast.resource.capacityGaps', 'Capacity vs. demand, by sprint')}\n </h3>\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"text-left text-muted-foreground\">\n <th className=\"py-1 pr-2 font-normal\">\n {t('planmagnet.forecast.resource.sprint', 'Sprint')}\n </th>\n <th className=\"py-1 pr-2 text-right font-normal\">\n {t('planmagnet.forecast.resource.demand', 'Demand')}\n </th>\n <th className=\"py-1 pr-2 text-right font-normal\">\n {t('planmagnet.forecast.resource.capacity', 'Capacity')}\n </th>\n <th className=\"w-1/3 py-1 text-right font-normal\">\n {t('planmagnet.forecast.resource.gap', 'Gap')}\n </th>\n </tr>\n </thead>\n <tbody>\n {forecast.capacityGaps.map((row) => {\n const short = row.gapPoints > 0;\n return (\n <tr key={row.sprintNumber} className=\"border-t align-middle\">\n <td className=\"py-1.5 pr-2\">\n {t('planmagnet.forecast.resource.sprintN', '+{{n}}', {\n n: row.sprintNumber,\n })}\n </td>\n <td className=\"py-1.5 pr-2 text-right tabular-nums\">\n {row.demandPoints}\n </td>\n <td className=\"py-1.5 pr-2 text-right tabular-nums\">\n {Math.round(row.forecastCapacityPoints)}\n </td>\n <td className=\"py-1.5\">\n <div\n role=\"meter\"\n aria-valuemin={0}\n aria-valuemax={maxGapMagnitude}\n aria-valuenow={Math.abs(row.gapPoints)}\n aria-label={`${short ? 'short' : 'surplus'} ${Math.abs(Math.round(row.gapPoints))} points`}\n className=\"flex h-2 w-full items-center overflow-hidden rounded-full bg-muted\"\n >\n <div\n className={`h-full rounded-full ${short ? 'bg-status-error' : 'bg-status-success'}`}\n style={{\n width: `${Math.min(100, (Math.abs(row.gapPoints) / maxGapMagnitude) * 100)}%`,\n }}\n />\n </div>\n <span\n className={`text-right block tabular-nums ${short ? 'text-status-error-text' : 'text-status-success-text'}`}\n >\n {short ? '+' : ''}\n {Math.round(row.gapPoints)}\n </span>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n\n {forecast.backlogTruncated && (\n <p className=\"text-xs text-status-warning-text\">\n {t(\n 'planmagnet.forecast.resource.truncated',\n 'This backlog is large enough that the scan stopped early — open points and unestimated items reflect only the first items found.'\n )}\n </p>\n )}\n\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'planmagnet.forecast.resource.skillsNoteCoverage',\n 'This forecasts total story points only, not which skills the backlog needs — the Skills coverage card on the project manager and team dashboards shows that.'\n )}\n </p>\n <p className=\"text-xs text-muted-foreground\">{forecast.confidenceNote}</p>\n\n <details className=\"text-xs text-muted-foreground\">\n <summary className=\"cursor-pointer select-none font-medium text-foreground\">\n {t('planmagnet.forecast.whatIsThis', 'What is this?')}\n </summary>\n <p className=\"mt-1\">\n {t(\n 'planmagnet.forecast.resource.explainer',\n 'Statistical forecast (not AI-generated): capacity is the median of the trailing completed sprints’ real velocity; demand is today’s open backlog split evenly across the horizon. Never an AI/LLM call.'\n )}\n </p>\n </details>\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"riskFlags.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/forecast/riskFlags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAG3C;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,eAAe,wGAOlB,CAAC;AACX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,eAAO,MAAM,oBAAoB,oCAAqC,CAAC;AACvE,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,iBAAiB,EACjB,aAAa,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAQtC,CAAC;AACF,0FAA0F;AAC1F,eAAO,MAAM,uBAAuB,2IAAe,CAAC;AAEpD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAKpF;AAED;uEACuE;AACvE,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAC3C,qBAAqB,EACrB,aAAa,GAAG,SAAS,GAAG,MAAM,CAKnC,CAAC;AAEF,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,GACf,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,WAAW,CAKlD;AAED;gFACgF;AAChF,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAAyB,CAAC;AAE/F,6CAA6C;AAC7C,eAAO,MAAM,oBAAoB,EAAE,SAAS,iBAAiB,EAAoB,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"riskFlags.js","names":[],"sources":["../../../src/planmagnet/forecast/riskFlags.ts"],"sourcesContent":["import type { ComponentType } from 'react';\nimport { AlertOctagon, CalendarClock, Link2, PlusCircle, Target, Timer, Users } from 'lucide-react';\n\n/**\n * AI-10 at-risk work-item flags: shared between the project risk-summary tile\n * (`ProjectRiskSummaryCard`) and the At-risk work page (`ProjectsAtRiskPagePage`), so the two\n * surfaces never disagree about a flag kind's icon or a severity's badge color.\n *\n * Every flag kind and severity below is drawn 1:1 from `PlanmagnetRiskFlagKind` /\n * `PlanmagnetRiskFlagSeverity` in graphql/wspace.graphql — see that file for exactly which rule\n * (with its threshold) raises each one. These are explicit rules over real data, never an\n * AI/LLM call: labelled \"Rule-based\" everywhere a flag is shown, per the reason text the API\n * itself already returns alongside `kind`.\n */\n\nexport const RISK_FLAG_KINDS = [\n 'AT_RISK_MILESTONE',\n 'BLOCKED',\n 'OVERCOMMITTED_ASSIGNEE',\n 'OVERDUE',\n 'SCOPE_CREEP',\n 'STALE',\n] as const;\nexport type RiskFlagKindValue = (typeof RISK_FLAG_KINDS)[number];\n\nexport const RISK_FLAG_SEVERITIES = ['HIGH', 'MEDIUM', 'LOW'] as const;\nexport type RiskFlagSeverityValue = (typeof RISK_FLAG_SEVERITIES)[number];\n\nexport const RISK_FLAG_KIND_ICON: Record<\n RiskFlagKindValue,\n ComponentType<{ className?: string }>\n> = {\n AT_RISK_MILESTONE: Target,\n BLOCKED: Link2,\n OVERCOMMITTED_ASSIGNEE: Users,\n OVERDUE: CalendarClock,\n SCOPE_CREEP: PlusCircle,\n STALE: Timer,\n};\n/** A kind this map doesn't know yet falls back to a generic icon rather than throwing. */\nexport const RISK_FLAG_FALLBACK_ICON = AlertOctagon;\n\nexport function riskFlagKindIcon(kind: string): ComponentType<{ className?: string }> {\n return (\n (RISK_FLAG_KIND_ICON as Record<string, ComponentType<{ className?: string }>>)[kind] ??\n RISK_FLAG_FALLBACK_ICON\n );\n}\n\n/** fe-libs Badge `variant` — same HIGH/MEDIUM/LOW → error/warning/info convention\n * `roadmaps/RoadmapNowNextLater.tsx` uses for its own risk levels. */\nexport const RISK_FLAG_SEVERITY_BADGE: Record<\n RiskFlagSeverityValue,\n 'destructive' | 'warning' | 'info'\n> = {\n HIGH: 'destructive',\n MEDIUM: 'warning',\n LOW: 'info',\n};\n\nexport function riskFlagSeverityBadgeVariant(\n severity: string\n): 'destructive' | 'warning' | 'info' | 'secondary' {\n return (\n (RISK_FLAG_SEVERITY_BADGE as Record<string, 'destructive' | 'warning' | 'info'>)[severity] ??\n 'secondary'\n );\n}\n\n/** Fixed severity order for counts/legends — never re-derived from whichever severities happen\n * to appear (same rule `utils/statusColor.ts` documents for status colors). */\nexport const RISK_FLAG_SEVERITY_ORDER: readonly RiskFlagSeverityValue[] = RISK_FLAG_SEVERITIES;\n\n/** Fixed kind order, for the same reason. */\nexport const RISK_FLAG_KIND_ORDER: readonly RiskFlagKindValue[] = RISK_FLAG_KINDS;\n"],"mappings":";;AAeA,IAAa,IAAkB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACD,EAGY,IAAuB;CAAC;CAAQ;CAAU;CAAM,EAGhD,IAGT;CACF,mBAAmB;CACnB,SAAS;CACT,wBAAwB;CACxB,SAAS;CACT,aAAa;CACb,OAAO;CACR,EAEY,IAA0B;AAEvC,SAAgB,EAAiB,GAAqD;AACpF,QACG,EAA8E,MAC/E;;AAMJ,IAAa,IAGT;CACF,MAAM;CACN,QAAQ;CACR,KAAK;CACN;AAED,SAAgB,EACd,GACkD;AAClD,QACG,EAAgF,MACjF;;AAMJ,IAAa,IAA6D,GAG7D,IAAqD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCounts.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/hooks/useCounts.ts"],"names":[],"mappings":"AAmDA,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAcvD;AAsCD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAgBrD;AAyED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CACZ,WAAW,GACX,cAAc,GACd,SAAS,GACT,aAAa,GACb,WAAW,GACX,UAAU,GACV,WAAW,EACb,MAAM,CACP,CAAC;CACH;AAED,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAiCvD;AAED,wGAAwG;AACxG,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE,GACvD,MAAM,GAAG,IAAI,CAWf"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCounts.js","names":[],"sources":["../../../src/planmagnet/hooks/useCounts.ts"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\n/**\n * One number per concept, from the server (BOFF-7969/7970/7965). Pages used to count the rows of whatever page they\n * had loaded — the 50 or 100 newest — so Dashboard, All Projects, Analytics and Sprint Management each showed a\n * different \"active\" count. These read `totalCount` of filtered queries (one request, aliased), so every page shows\n * the same number and nothing depends on how many rows a list happens to load.\n *\n * `null` while loading or when the counts could not be read: callers show \"—\", never a page-derived number.\n */\n\nconst PROJECT_COUNTS = gql`\n query CountsProjects($workspaceId: ID!) {\n all: planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 1 }) {\n totalCount\n }\n active: planmagnetProjects(\n workspaceId: $workspaceId\n filter: { status: ACTIVE }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n planning: planmagnetProjects(\n workspaceId: $workspaceId\n filter: { status: PLANNING }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n onHold: planmagnetProjects(\n workspaceId: $workspaceId\n filter: { status: ON_HOLD }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n completed: planmagnetProjects(\n workspaceId: $workspaceId\n filter: { status: COMPLETED }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n }\n`;\n\ntype Totals<K extends string> = Record<K, { totalCount: number }>;\n\nexport interface ProjectCounts {\n all: number;\n active: number;\n planning: number;\n onHold: number;\n completed: number;\n}\n\nexport function useProjectCounts(): ProjectCounts | null {\n const { workspaceId } = usePlanMagnet();\n const { data, error } = useQuery<Totals<keyof ProjectCounts>>(PROJECT_COUNTS, {\n variables: { workspaceId: workspaceId ?? '' },\n skip: !workspaceId,\n });\n if (!data || error) return null;\n return {\n all: data.all.totalCount,\n active: data.active.totalCount,\n planning: data.planning.totalCount,\n onHold: data.onHold.totalCount,\n completed: data.completed.totalCount,\n };\n}\n\nconst SPRINT_COUNTS = gql`\n query CountsSprints($workspaceId: ID!) {\n all: planmagnetSprints(workspaceId: $workspaceId, pagination: { first: 1 }) {\n totalCount\n }\n active: planmagnetSprints(\n workspaceId: $workspaceId\n filter: { status: ACTIVE }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n review: planmagnetSprints(\n workspaceId: $workspaceId\n filter: { status: REVIEW }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n planning: planmagnetSprints(\n workspaceId: $workspaceId\n filter: { status: PLANNING }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n completed: planmagnetSprints(\n workspaceId: $workspaceId\n filter: { status: COMPLETED }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n }\n`;\n\nexport interface SprintCounts {\n all: number;\n /** ACTIVE + REVIEW: a sprint in review is still running (the same rule on every page). */\n running: number;\n planning: number;\n completed: number;\n}\n\nexport function useSprintCounts(): SprintCounts | null {\n const { workspaceId } = usePlanMagnet();\n const { data, error } = useQuery<Totals<'all' | 'active' | 'review' | 'planning' | 'completed'>>(\n SPRINT_COUNTS,\n {\n variables: { workspaceId: workspaceId ?? '' },\n skip: !workspaceId,\n }\n );\n if (!data || error) return null;\n return {\n all: data.all.totalCount,\n running: data.active.totalCount + data.review.totalCount,\n planning: data.planning.totalCount,\n completed: data.completed.totalCount,\n };\n}\n\nconst FEATURE_COUNTS = gql`\n query CountsFeatures($workspaceId: ID!) {\n all: planmagnetFeatureRequests(workspaceId: $workspaceId, pagination: { first: 1 }) {\n totalCount\n }\n submitted: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { status: SUBMITTED }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n underReview: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { status: UNDER_REVIEW }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n planned: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { status: PLANNED }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n inProgress: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { status: IN_PROGRESS }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n completed: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { status: COMPLETED }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n declined: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { status: DECLINED }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n duplicate: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { status: DUPLICATE }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n triage: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { triage: true }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n snoozed: planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: { snoozed: true }\n pagination: { first: 1 }\n ) {\n totalCount\n }\n }\n`;\n\nexport interface FeatureCounts {\n all: number;\n /** Still wanted: SUBMITTED, UNDER_REVIEW, PLANNED or IN_PROGRESS. */\n open: number;\n /** Waiting for a triage decision: SUBMITTED and not snoozed (P1.3). */\n triage: number;\n /** SUBMITTED and snoozed into the future. */\n snoozed: number;\n byStatus: Record<\n | 'SUBMITTED'\n | 'UNDER_REVIEW'\n | 'PLANNED'\n | 'IN_PROGRESS'\n | 'COMPLETED'\n | 'DECLINED'\n | 'DUPLICATE',\n number\n >;\n}\n\nexport function useFeatureCounts(): FeatureCounts | null {\n const { workspaceId } = usePlanMagnet();\n const { data, error } = useQuery<\n Totals<\n | 'all'\n | 'submitted'\n | 'underReview'\n | 'planned'\n | 'inProgress'\n | 'completed'\n | 'declined'\n | 'duplicate'\n | 'triage'\n | 'snoozed'\n >\n >(FEATURE_COUNTS, { variables: { workspaceId: workspaceId ?? '' }, skip: !workspaceId });\n if (!data || error) return null;\n const byStatus = {\n SUBMITTED: data.submitted.totalCount,\n UNDER_REVIEW: data.underReview.totalCount,\n PLANNED: data.planned.totalCount,\n IN_PROGRESS: data.inProgress.totalCount,\n COMPLETED: data.completed.totalCount,\n DECLINED: data.declined.totalCount,\n DUPLICATE: data.duplicate.totalCount,\n };\n return {\n all: data.all.totalCount,\n open: byStatus.SUBMITTED + byStatus.UNDER_REVIEW + byStatus.PLANNED + byStatus.IN_PROGRESS,\n triage: data.triage.totalCount,\n snoozed: data.snoozed.totalCount,\n byStatus,\n };\n}\n\n/** \"—\" for a count that is loading or could not be read — never a number derived from a loaded page. */\nexport function countLabel(value: number | null | undefined): string {\n return value == null ? '—' : String(value);\n}\n\n/**\n * Progress of a set of work: DONE over everything except CANCELLED (cancelled work no longer needs doing), by\n * story points when there are any, otherwise by task count (BOFF-7989: an un-estimated sprint read 0% with every\n * task done, and cancelled work counted as unfinished). null when nothing is left to measure.\n */\nexport function workProgress(\n items: { status: string; storyPoints?: number | null }[]\n): number | null {\n const live = items.filter((i) => i.status !== 'CANCELLED');\n if (live.length === 0) return null;\n const points = live.reduce((sum, i) => sum + (i.storyPoints ?? 0), 0);\n if (points > 0) {\n const donePoints = live\n .filter((i) => i.status === 'DONE')\n .reduce((sum, i) => sum + (i.storyPoints ?? 0), 0);\n return Math.round((donePoints / points) * 100);\n }\n return Math.round((live.filter((i) => i.status === 'DONE').length / live.length) * 100);\n}\n"],"mappings":";;;;AAaA,IAAM,IAAiB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8C1B,SAAgB,IAAyC;CACvD,IAAM,EAAE,mBAAgB,GAAe,EACjC,EAAE,SAAM,aAAU,EAAsC,GAAgB;EAC5E,WAAW,EAAE,aAAa,KAAe,IAAI;EAC7C,MAAM,CAAC;EACR,CAAC;AAEF,QADI,CAAC,KAAQ,IAAc,OACpB;EACL,KAAK,EAAK,IAAI;EACd,QAAQ,EAAK,OAAO;EACpB,UAAU,EAAK,SAAS;EACxB,QAAQ,EAAK,OAAO;EACpB,WAAW,EAAK,UAAU;EAC3B;;AAGH,IAAM,IAAgB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CzB,SAAgB,IAAuC;CACrD,IAAM,EAAE,mBAAgB,GAAe,EACjC,EAAE,SAAM,aAAU,EACtB,GACA;EACE,WAAW,EAAE,aAAa,KAAe,IAAI;EAC7C,MAAM,CAAC;EACR,CACF;AAED,QADI,CAAC,KAAQ,IAAc,OACpB;EACL,KAAK,EAAK,IAAI;EACd,SAAS,EAAK,OAAO,aAAa,EAAK,OAAO;EAC9C,UAAU,EAAK,SAAS;EACxB,WAAW,EAAK,UAAU;EAC3B;;AAGH,IAAM,IAAiB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2F1B,SAAgB,IAAyC;CACvD,IAAM,EAAE,mBAAgB,GAAe,EACjC,EAAE,SAAM,aAAU,EAatB,GAAgB;EAAE,WAAW,EAAE,aAAa,KAAe,IAAI;EAAE,MAAM,CAAC;EAAa,CAAC;AACxF,KAAI,CAAC,KAAQ,EAAO,QAAO;CAC3B,IAAM,IAAW;EACf,WAAW,EAAK,UAAU;EAC1B,cAAc,EAAK,YAAY;EAC/B,SAAS,EAAK,QAAQ;EACtB,aAAa,EAAK,WAAW;EAC7B,WAAW,EAAK,UAAU;EAC1B,UAAU,EAAK,SAAS;EACxB,WAAW,EAAK,UAAU;EAC3B;AACD,QAAO;EACL,KAAK,EAAK,IAAI;EACd,MAAM,EAAS,YAAY,EAAS,eAAe,EAAS,UAAU,EAAS;EAC/E,QAAQ,EAAK,OAAO;EACpB,SAAS,EAAK,QAAQ;EACtB;EACD;;AAIH,SAAgB,EAAW,GAA0C;AACnE,QAAO,KAAS,OAAO,MAAM,OAAO,EAAM;;AAQ5C,SAAgB,EACd,GACe;CACf,IAAM,IAAO,EAAM,QAAQ,MAAM,EAAE,WAAW,YAAY;AAC1D,KAAI,EAAK,WAAW,EAAG,QAAO;CAC9B,IAAM,IAAS,EAAK,QAAQ,GAAK,MAAM,KAAO,EAAE,eAAe,IAAI,EAAE;AACrE,KAAI,IAAS,GAAG;EACd,IAAM,IAAa,EAChB,QAAQ,MAAM,EAAE,WAAW,OAAO,CAClC,QAAQ,GAAK,MAAM,KAAO,EAAE,eAAe,IAAI,EAAE;AACpD,SAAO,KAAK,MAAO,IAAa,IAAU,IAAI;;AAEhD,QAAO,KAAK,MAAO,EAAK,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC,SAAS,EAAK,SAAU,IAAI"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useEntityId.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/hooks/useEntityId.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUlE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useEntityId.js","names":[],"sources":["../../../src/planmagnet/hooks/useEntityId.ts"],"sourcesContent":["import { useParams } from 'react-router';\n\n/**\n * Resolves the record id a detail or edit page should load.\n *\n * Two conventions exist in this MFE and both are supported so no page is left behind:\n * - a \":id\" route segment (products/project detail pages)\n * - a query parameter (tasks use ?taskId=, goals use ?objectiveId=)\n *\n * Returns null when no id is present. Callers MUST treat null as \"no record selected\"\n * and skip their query — several pages previously fell back to\n * `planmagnetXs(pagination: { first: 1 })`, which silently rendered whichever record\n * happened to be first instead of the one the user opened.\n */\nexport function useEntityId(queryParamName?: string): string | null {\n const params = useParams<{ id?: string }>();\n if (params.id) return params.id;\n\n if (queryParamName && typeof window !== 'undefined') {\n const fromQuery = new URLSearchParams(window.location.search).get(queryParamName);\n if (fromQuery) return fromQuery;\n }\n\n return null;\n}\n"],"mappings":";;AAcA,SAAgB,EAAY,GAAwC;CAClE,IAAM,IAAS,GAA4B;AAC3C,KAAI,EAAO,GAAI,QAAO,EAAO;AAE7B,KAAI,KAAkB,OAAO,SAAW,KAAa;EACnD,IAAM,IAAY,IAAI,gBAAgB,OAAO,SAAS,OAAO,CAAC,IAAI,EAAe;AACjF,MAAI,EAAW,QAAO;;AAGxB,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useLiveRefresh.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/hooks/useLiveRefresh.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC5E,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;oFACgF;IAChF,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;CACZ;AAqED,MAAM,WAAW,qBAAqB;IACpC,6GAA6G;IAC7G,IAAI,EAAE,eAAe,CAAC;IACtB;;+EAE2E;IAC3E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;kHAC8G;IAC9G,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;2FACuF;IACvF,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;8DAC0D;IAC1D,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;yEAEqE;IACrE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;mHAE+G;IAC/G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4GAA4G;IAC5G,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6FAA6F;IAC7F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;iCAG6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;kGAM8F;IAC9F,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC;;;;;;mCAM+B;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC;8GAC0G;IAC1G,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;CAC9B;AAED;;;;sBAIsB;AACtB,wBAAgB,uBAAuB,CACrC,GAAG,KAAK,EAAE,aAAa,CAAC,eAAe,GAAG,IAAI,CAAC,GAC9C,eAAe,GAAG,IAAI,CAMxB;AA+DD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,UAAU,EACV,SAAS,EACT,OAAO,EACP,UAAgB,EAChB,aAAa,EACb,gBAAuB,EACvB,cAAsB,EACtB,OAAc,EACd,OAAO,EACP,MAAc,GACf,EAAE,qBAAqB,GAAG,oBAAoB,CA4K9C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useLiveRefresh.js","names":[],"sources":["../../../src/planmagnet/hooks/useLiveRefresh.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient, useSubscription } from '@apollo/client/react';\nimport { clearGraphqlFetchResponseCache } from '@burdenoff/fe-libs/shared/graphql';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\n/**\n * Live updates (PDM-05/11/21, ANR-23): a page subscribes to a thin, workspace-scoped event stream over the\n * gateway SSE path and re-reads its own named queries when something relevant changed — it never applies the\n * event payload as data (the payload carries identifiers and `changedFields` only, by server design, so a\n * subscriber re-reads under its own permissions instead of trusting something that bypassed RBAC and row-level\n * scoping). See `useDataSinkSubscription.ts` (microfe-bigconsole) for the sibling pattern this generalizes:\n * `skip` when the ids a subscription needs haven't loaded yet, and treat a transport/backend error as expected\n * degradation, not a page-breaking failure.\n *\n * Every event stream requires `workspaceId` server-side — a subscription whose `workspaceId` is not the\n * caller's own workspace is refused by the gateway, so this hook always reads it from `usePlanMagnet()` rather\n * than accepting it as a prop a caller could get wrong.\n *\n * Connection lifecycle. SSE has no connect acknowledgement: a refused subscription (bad variables, another\n * workspace, no auth) comes back at once as an error, while an accepted one simply stays open with nothing to\n * say until something changes. So a stream still open and error-free after `connectTimeoutMs` is treated as\n * live, and the first event proves it earlier. The server closes a stream after 60 s without events\n * (`REALTIME_SUBSCRIPTION_IDLE_TIMEOUT_MS` in the svc), which Apollo reports as completion — that is routine,\n * so the hook resubscribes rather than going quiet. A stream that keeps completing within seconds of opening is\n * not healthy and degrades to polling.\n *\n * Graceful fallback (this is the point of the hook, not an edge case): if the subscription errors, or keeps\n * closing as soon as it opens, `mode` becomes `'polling'` and a 30-second interval takes over, paused while the\n * tab is hidden (`document.visibilityState`). There is no reconnect-to-live attempt within one mount — once\n * degraded, a page stays on polling until it remounts. `standalone` dev/Storybook builds (no SSE link\n * configured — see `PlanMagnetProvider`) always take this path; that is expected, not a defect, and is why a\n * subscription error here is never surfaced as a page error.\n */\n\nexport type LiveRefreshKind = 'workItem' | 'project' | 'sprint' | 'roadmap';\nexport type LiveRefreshMode = 'connecting' | 'live' | 'polling';\n\nexport interface LiveEvent {\n kind: string;\n id: string;\n workspaceId: string;\n projectId?: string | null;\n /** `roadmap`-kind events only (`PlanmagnetRoadmapEvent`) — the roadmap this change belongs to. Equal to `id`\n * when the change is to the roadmap itself (as opposed to one of its items). */\n roadmapId?: string | null;\n changedFields: string[];\n actorId: string;\n at: string;\n}\n\nconst ON_PROJECT_UPDATED = gql`\n subscription PlanmagnetLiveProjectUpdated($workspaceId: ID!, $projectId: ID) {\n planmagnetOnProjectUpdated(workspaceId: $workspaceId, projectId: $projectId) {\n kind\n id\n workspaceId\n changedFields\n actorId\n at\n }\n }\n`;\n\nconst ON_SPRINT_UPDATED = gql`\n subscription PlanmagnetLiveSprintUpdated($workspaceId: ID!, $sprintId: ID, $projectId: ID) {\n planmagnetOnSprintUpdated(\n workspaceId: $workspaceId\n sprintId: $sprintId\n projectId: $projectId\n ) {\n kind\n id\n projectId\n workspaceId\n changedFields\n actorId\n at\n }\n }\n`;\n\n// PRM-11: roadmap collaboration — every committed create/update/delete of the roadmap itself, and every\n// create/update/move/delete of one of its items, publishes here. `id` names whatever changed (the roadmap's own\n// id, or one of its items') — compare against `roadmapId` to tell a roadmap-level change from an item-level one,\n// same discipline `DocsDocDetailPagePage`'s `ON_DOC_UPDATED` uses for a single-entity stream.\nconst ON_ROADMAP_UPDATED = gql`\n subscription PlanmagnetLiveRoadmapUpdated($workspaceId: ID!, $roadmapId: ID!) {\n planmagnetOnRoadmapUpdated(workspaceId: $workspaceId, roadmapId: $roadmapId) {\n kind\n id\n roadmapId\n workspaceId\n changedFields\n actorId\n at\n }\n }\n`;\n\nconst ON_WORK_ITEM_UPDATED = gql`\n subscription PlanmagnetLiveWorkItemUpdated($workspaceId: ID!, $projectId: ID, $workItemId: ID) {\n planmagnetOnWorkItemUpdated(\n workspaceId: $workspaceId\n projectId: $projectId\n workItemId: $workItemId\n ) {\n kind\n id\n projectId\n workspaceId\n changedFields\n actorId\n at\n }\n }\n`;\n\nexport interface UseLiveRefreshOptions {\n /** Which event stream to subscribe to — see `PlanmagnetOn{Project,Sprint,WorkItem}Updated` in the schema. */\n kind: LiveRefreshKind;\n /** Narrows the stream server-side. Omitted on `workItem`/`project` this is a workspace-wide stream (the\n * Dashboard and role dashboards want every project's events); `sprint` needs `sprintId` to mean anything on a\n * single sprint's page, so the hook skips subscribing until it has one. */\n projectId?: string | null;\n /** For `kind: 'sprint'`, at least one of `sprintId`/`projectId` is required — one sprint's own events, or\n * every sprint in one project's. Neither means \"skip\" (every sprint workspace-wide has no current caller). */\n sprintId?: string | null;\n /** Narrows a `workItem`-kind stream to one item. Unused by every current caller (the board/dashboards want\n * every item's events for their scope) but supported for a future single-item page. */\n workItemId?: string | null;\n /** Required for `kind: 'roadmap'` — `planmagnetOnRoadmapUpdated` is always scoped to exactly one roadmap\n * (PRM-11), there is no workspace-wide roadmap stream. */\n roadmapId?: string | null;\n /** Apollo operation names this page's queries were declared with — refetched by name\n * (`client.refetchQueries({ include })`) on a (debounced, optionally throttled) event. Never the literal\n * query document, and never the event's own payload used as data. */\n queries: readonly string[];\n /** Coalesces a burst of events (e.g. a bulk update moving 20 cards) into one refetch. Default 500. */\n debounceMs?: number;\n /** A floor between refetches once debounced, for a page whose queries are expensive to re-run on every\n * change (ANR-23: the Dashboard and role dashboards, at most once per 15s). Unset: only the debounce window\n * applies. A pulse arriving inside the floor is never dropped — it runs at the floor's far edge (trailing). */\n minIntervalMs?: number;\n /** How long an open, error-free subscription stays \"Connecting…\" before it counts as live. Default 8000. */\n connectTimeoutMs?: number;\n /** Polling cadence once on the fallback path. Default 30000 (ANR-23/PDM-05: \"every 30s\"). */\n pollIntervalMs?: number;\n /** An extra gate beyond the kind's own required id(s) — e.g. a sprint page's `workItem`-kind stream (no id of\n * its own is required) should still wait for the sprint's `projectId` to resolve, and skip entirely for a\n * team-scoped sprint (no `projectId` at all) rather than falling back to a workspace-wide stream. Default\n * `true` (no extra gate). */\n enabled?: boolean;\n /** Called with the raw event whenever one arrives — ALONGSIDE, never instead of, the debounced `refetch` this\n * hook already schedules. For a page that needs to react to the event itself, not just \"something changed,\n * re-read\" — e.g. the roadmap detail page (PRM-11) telling a DELETED event on the roadmap itself\n * (`event.id === event.roadmapId`) apart from one on an item, to show \"This roadmap was deleted\" instead of\n * racing a refetch against a record that is already gone. This never hands the caller anything to render\n * directly from: `event` is still the same thin notification `useLiveRefresh` never applies as data itself —\n * only `kind`/`id`/`roadmapId` are meaningful, the record always still comes from a query. */\n onEvent?: (event: LiveEvent) => void;\n /** Holds back a pending refetch while `true` — for a page with its own uninterruptible local gesture in\n * progress that a refetch-driven re-render would break (PRM-11: the Now/Next/Later board, for exactly as long\n * as one of its cards is mid-drag, so a live-triggered refetch never replaces the list — and the native HTML5\n * drag source with it — out from under an in-flight drag). An event arriving while paused is never dropped:\n * it still runs through the normal debounce/floor; only the moment the resulting refetch is allowed to\n * actually fire is held, and it fires once, immediately (not re-debounced), the moment this goes back to\n * `false`. Default `false`. */\n paused?: boolean;\n}\n\nexport interface UseLiveRefreshResult {\n /** `null` while a required id (e.g. a sprint page before `sprintId` resolves) hasn't loaded — there is\n * nothing to subscribe to yet, so `LiveStatus` renders nothing rather than a misleading \"Connecting…\". */\n mode: LiveRefreshMode | null;\n}\n\n/** Rolls up more than one `useLiveRefresh` result into the single indicator a page shows (e.g. the sprint\n * detail page subscribes to both sprint events and the sprint's project's work item events). Reports the least\n * favorable non-null mode present — `'polling'` beats `'connecting'` beats `'live'` — so the page never claims\n * \"Live\" while one of its own streams is actually degraded. `null` (nothing subscribed yet) only when every\n * input is `null`. */\nexport function combineLiveRefreshModes(\n ...modes: ReadonlyArray<LiveRefreshMode | null>\n): LiveRefreshMode | null {\n const present = modes.filter((mode): mode is LiveRefreshMode => mode !== null);\n if (present.length === 0) return null;\n if (present.includes('polling')) return 'polling';\n if (present.includes('connecting')) return 'connecting';\n return 'live';\n}\n\nconst RAPID_CLOSE_MS = 5000;\nconst RAPID_CLOSE_LIMIT = 3;\n\nfunction subscriptionDocumentFor(kind: LiveRefreshKind) {\n if (kind === 'project') return ON_PROJECT_UPDATED;\n if (kind === 'sprint') return ON_SPRINT_UPDATED;\n if (kind === 'roadmap') return ON_ROADMAP_UPDATED;\n return ON_WORK_ITEM_UPDATED;\n}\n\n/** A debounced, optionally-throttled trigger: bursts inside `debounceMs` coalesce into one call; once debounced,\n * a call inside `minIntervalMs` of the last one is never dropped — it runs at the floor's far edge instead.\n * `run` is expected to be a `useCallback`-stable function (the hook below's `refetch` is, since it only depends\n * on `client` and `queries`) — accepted as a normal dependency rather than stashed in a ref, so it is never\n * read or written outside an effect/callback. */\nfunction useCoalescedTrigger(\n run: () => void,\n debounceMs: number,\n minIntervalMs: number | undefined\n) {\n const debounceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const floorTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const lastRunAt = useRef(0);\n const floorPending = useRef(false);\n\n const runNow = useCallback(() => {\n floorPending.current = false;\n lastRunAt.current = Date.now();\n run();\n }, [run]);\n\n const trigger = useCallback(() => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n debounceTimer.current = setTimeout(() => {\n debounceTimer.current = null;\n if (!minIntervalMs) {\n runNow();\n return;\n }\n const elapsed = Date.now() - lastRunAt.current;\n if (elapsed >= minIntervalMs) {\n runNow();\n return;\n }\n if (floorPending.current) return; // a trailing run is already scheduled for this window\n floorPending.current = true;\n floorTimer.current = setTimeout(runNow, minIntervalMs - elapsed);\n }, debounceMs);\n }, [debounceMs, minIntervalMs, runNow]);\n\n useEffect(\n () => () => {\n if (debounceTimer.current) clearTimeout(debounceTimer.current);\n if (floorTimer.current) clearTimeout(floorTimer.current);\n },\n []\n );\n\n return trigger;\n}\n\nexport function useLiveRefresh({\n kind,\n projectId,\n sprintId,\n workItemId,\n roadmapId,\n queries,\n debounceMs = 500,\n minIntervalMs,\n connectTimeoutMs = 8000,\n pollIntervalMs = 30000,\n enabled = true,\n onEvent,\n paused = false,\n}: UseLiveRefreshOptions): UseLiveRefreshResult {\n const { workspaceId } = usePlanMagnet();\n const client = useApolloClient();\n\n // 'sprint' means something scoped to either one sprint (a sprint's own page) or every sprint in one project (a\n // project-scoped dashboard) — it needs at least one of the two ids, never neither (that would be every sprint\n // in the whole workspace, which no current caller wants). 'project' and 'roadmap' always need their one id —\n // there is no workspace-wide stream for either.\n const requiredIdMissing =\n (kind === 'sprint' && !sprintId && !projectId) ||\n (kind === 'project' && !projectId) ||\n (kind === 'roadmap' && !roadmapId);\n const skip = !workspaceId || requiredIdMissing || !enabled;\n\n // Identifies what we'd subscribe to right now — `null` when there's nothing to. `queries` is deliberately not\n // part of this: which QUERIES a page refetches changing (it never does, in practice — every caller passes a\n // module-level const array) shouldn't reset a live connection, only what STREAM we're on should.\n const subscriptionKey = skip\n ? null\n : `${kind}:${workspaceId}:${projectId ?? ''}:${sprintId ?? ''}:${workItemId ?? ''}:${roadmapId ?? ''}`;\n\n // fe-libs replays an identical query from its 15 s fetch-layer cache (shared/graphql/fetch.ts), and Apollo's\n // refetchQueries goes through it — so an event arriving within 15 s of the page's last read would re-read the\n // stale copy and the change would not show. Measured in prod: a card created ~12 s after the board loaded never\n // appeared. The cache is dropped first, exactly as a successful mutation does.\n const refetch = useCallback(() => {\n clearGraphqlFetchResponseCache();\n void client.refetchQueries({ include: [...queries] });\n }, [client, queries]);\n\n // PRM-11: `paused` (the Now/Next/Later board, mid-drag) holds back the refetch a debounced trigger would\n // otherwise run — read from a ref since the debounce timer's own callback fires well after the render that set\n // `paused`. Nothing is lost: a trigger that lands while paused just marks `pendingWhilePausedRef` instead of\n // calling `refetch`, and the effect below runs the deferred refetch once, immediately, the moment `paused`\n // clears — never a second debounce wait on top of whatever already elapsed before the pause was lifted.\n const pausedRef = useRef(paused);\n useEffect(() => {\n pausedRef.current = paused;\n }, [paused]);\n const pendingWhilePausedRef = useRef(false);\n\n const guardedRefetch = useCallback(() => {\n if (pausedRef.current) {\n pendingWhilePausedRef.current = true;\n return;\n }\n refetch();\n }, [refetch]);\n\n useEffect(() => {\n if (!paused && pendingWhilePausedRef.current) {\n pendingWhilePausedRef.current = false;\n refetch();\n }\n }, [paused, refetch]);\n\n const trigger = useCoalescedTrigger(guardedRefetch, debounceMs, minIntervalMs);\n\n const [mode, setMode] = useState<LiveRefreshMode | null>(subscriptionKey ? 'connecting' : null);\n const [modeKey, setModeKey] = useState<string | null>(subscriptionKey);\n\n // Reset to \"connecting\" (or \"nothing to do\") the moment what we'd subscribe to changes — switching project,\n // sprint or page. This is the React-documented \"adjust state when a value changes\" pattern: a direct setState\n // call guarded by comparing against the last-seen key, during render, rather than in an effect — it lands in\n // the very render that changed, with no stale \"still connecting to the OLD target\" frame first.\n if (subscriptionKey !== modeKey) {\n setModeKey(subscriptionKey);\n setMode(subscriptionKey ? 'connecting' : null);\n }\n\n // The connect window needs a real timer; its only setState call lives inside the timeout's own callback (an\n // update \"when external state changes\"), never synchronously in the effect body. A refused subscription has\n // already errored into 'polling' by now (errors arrive at once), so a still-\"connecting\" one is open and\n // accepted — see the lifecycle note above.\n useEffect(() => {\n if (!subscriptionKey) return;\n const timer = setTimeout(() => {\n setMode((current) => (current === 'connecting' ? 'live' : current));\n }, connectTimeoutMs);\n return () => clearTimeout(timer);\n }, [subscriptionKey, connectTimeoutMs]);\n\n // Rapid-completion guard for the resubscribe below: when each stream closes within RAPID_CLOSE_MS of opening,\n // RAPID_CLOSE_LIMIT times in a row, the transport is not holding the stream open and polling takes over.\n const openedAt = useRef(0);\n const rapidCloses = useRef(0);\n const resubscribeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n openedAt.current = Date.now();\n rapidCloses.current = 0;\n return () => {\n if (resubscribeTimer.current) clearTimeout(resubscribeTimer.current);\n resubscribeTimer.current = null;\n };\n }, [subscriptionKey]);\n\n // The server's idle close (60 s without events), or the ALB ending a long-lived response: routine, so open a\n // fresh stream. Deferred a tick so Apollo finishes tearing down the completed one first. `restart` comes back\n // from `useSubscription` below, so it is reached through a ref kept current by an effect.\n const restartRef = useRef<(() => void) | null>(null);\n const handleComplete = useCallback(() => {\n const lived = Date.now() - openedAt.current;\n rapidCloses.current = lived < RAPID_CLOSE_MS ? rapidCloses.current + 1 : 0;\n if (rapidCloses.current >= RAPID_CLOSE_LIMIT) {\n setMode('polling');\n return;\n }\n resubscribeTimer.current = setTimeout(() => {\n resubscribeTimer.current = null;\n openedAt.current = Date.now();\n restartRef.current?.();\n }, 0);\n }, []);\n\n const { restart } = useSubscription<{\n planmagnetOnProjectUpdated?: LiveEvent;\n planmagnetOnSprintUpdated?: LiveEvent;\n planmagnetOnWorkItemUpdated?: LiveEvent;\n planmagnetOnRoadmapUpdated?: LiveEvent;\n }>(subscriptionDocumentFor(kind), {\n variables: {\n workspaceId,\n projectId: projectId ?? undefined,\n sprintId: sprintId ?? undefined,\n workItemId: workItemId ?? undefined,\n roadmapId: roadmapId ?? undefined,\n },\n skip,\n onData: ({ data: result }) => {\n // Proof the subscription is live: the connect-timeout above only flips a still-\"connecting\" mode, so this\n // is a no-op once already 'live', and never resurrects a mode that errored into 'polling'.\n setMode((current) => (current === 'connecting' ? 'live' : current));\n const event =\n result.data?.planmagnetOnProjectUpdated ??\n result.data?.planmagnetOnSprintUpdated ??\n result.data?.planmagnetOnWorkItemUpdated ??\n result.data?.planmagnetOnRoadmapUpdated;\n if (event) onEvent?.(event);\n trigger();\n },\n onError: (error) => {\n // Covers both a real backend/network failure and the expected \"no SSE transport configured\" case in a\n // standalone/Storybook build (see PlanMagnetProvider) — either way the correct behavior is the same:\n // degrade to polling rather than break the page. Logged at debug level only; this is not a user-facing\n // error state.\n console.debug('[useLiveRefresh] subscription unavailable, falling back to polling:', {\n kind,\n message: error instanceof Error ? error.message : String(error),\n });\n setMode('polling');\n },\n onComplete: handleComplete,\n });\n\n useEffect(() => {\n restartRef.current = restart;\n }, [restart]);\n\n // Polling fallback: the same queries, every `pollIntervalMs`, paused while the tab is hidden. No separate\n // throttle window here — the interval itself is the pacing (30s default, already above any ANR-23 floor).\n // Goes through `guardedRefetch`, not `refetch` directly: the `paused` gate above protects a local gesture from\n // a refetch-driven re-render regardless of which path (live event or poll tick) would have caused it.\n useEffect(() => {\n if (skip || mode !== 'polling') return;\n const id = setInterval(() => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return;\n guardedRefetch();\n }, pollIntervalMs);\n return () => clearInterval(id);\n }, [skip, mode, pollIntervalMs, guardedRefetch]);\n\n return { mode: skip ? null : mode };\n}\n"],"mappings":";;;;;;AAmDA,IAAM,IAAqB,CAAG;;;;;;;;;;;GAaxB,IAAoB,CAAG;;;;;;;;;;;;;;;;GAsBvB,IAAqB,CAAG;;;;;;;;;;;;GAcxB,IAAuB,CAAG;;;;;;;;;;;;;;;;;AAkFhC,SAAgB,EACd,GAAG,GACqB;CACxB,IAAM,IAAU,EAAM,QAAQ,MAAkC,MAAS,KAAK;AAI9E,QAHI,EAAQ,WAAW,IAAU,OAC7B,EAAQ,SAAS,UAAU,GAAS,YACpC,EAAQ,SAAS,aAAa,GAAS,eACpC;;AAGT,IAAM,IAAiB,KACjB,IAAoB;AAE1B,SAAS,EAAwB,GAAuB;AAItD,QAHI,MAAS,YAAkB,IAC3B,MAAS,WAAiB,IAC1B,MAAS,YAAkB,IACxB;;AAQT,SAAS,EACP,GACA,GACA,GACA;CACA,IAAM,IAAgB,EAA6C,KAAK,EAClE,IAAa,EAA6C,KAAK,EAC/D,IAAY,EAAO,EAAE,EACrB,IAAe,EAAO,GAAM,EAE5B,IAAS,QAAkB;AAG/B,EAFA,EAAa,UAAU,IACvB,EAAU,UAAU,KAAK,KAAK,EAC9B,GAAK;IACJ,CAAC,EAAI,CAAC,EAEH,IAAU,QAAkB;AAEhC,EADI,EAAc,WAAS,aAAa,EAAc,QAAQ,EAC9D,EAAc,UAAU,iBAAiB;AAEvC,OADA,EAAc,UAAU,MACpB,CAAC,GAAe;AAClB,OAAQ;AACR;;GAEF,IAAM,IAAU,KAAK,KAAK,GAAG,EAAU;AACvC,OAAI,KAAW,GAAe;AAC5B,OAAQ;AACR;;AAEE,KAAa,YACjB,EAAa,UAAU,IACvB,EAAW,UAAU,WAAW,GAAQ,IAAgB,EAAQ;KAC/D,EAAW;IACb;EAAC;EAAY;EAAe;EAAO,CAAC;AAUvC,QARA,cACc;AAEV,EADI,EAAc,WAAS,aAAa,EAAc,QAAQ,EAC1D,EAAW,WAAS,aAAa,EAAW,QAAQ;IAE1D,EAAE,CACH,EAEM;;AAGT,SAAgB,EAAe,EAC7B,SACA,cACA,aACA,eACA,cACA,YACA,gBAAa,KACb,kBACA,sBAAmB,KACnB,oBAAiB,KACjB,aAAU,IACV,YACA,YAAS,MACqC;CAC9C,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAS,GAAiB,EAU1B,IAAO,CAAC,KAHX,MAAS,YAAY,CAAC,KAAY,CAAC,KACnC,MAAS,aAAa,CAAC,KACvB,MAAS,aAAa,CAAC,KACwB,CAAC,GAK7C,IAAkB,IACpB,OACA,GAAG,EAAK,GAAG,EAAY,GAAG,KAAa,GAAG,GAAG,KAAY,GAAG,GAAG,KAAc,GAAG,GAAG,KAAa,MAM9F,IAAU,QAAkB;AAE3B,EADL,GAAgC,EAC3B,EAAO,eAAe,EAAE,SAAS,CAAC,GAAG,EAAQ,EAAE,CAAC;IACpD,CAAC,GAAQ,EAAQ,CAAC,EAOf,IAAY,EAAO,EAAO;AAChC,SAAgB;AACd,IAAU,UAAU;IACnB,CAAC,EAAO,CAAC;CACZ,IAAM,IAAwB,EAAO,GAAM,EAErC,IAAiB,QAAkB;AACvC,MAAI,EAAU,SAAS;AACrB,KAAsB,UAAU;AAChC;;AAEF,KAAS;IACR,CAAC,EAAQ,CAAC;AAEb,SAAgB;AACd,EAAI,CAAC,KAAU,EAAsB,YACnC,EAAsB,UAAU,IAChC,GAAS;IAEV,CAAC,GAAQ,EAAQ,CAAC;CAErB,IAAM,IAAU,EAAoB,GAAgB,GAAY,EAAc,EAExE,CAAC,GAAM,KAAW,EAAiC,IAAkB,eAAe,KAAK,EACzF,CAAC,GAAS,KAAc,EAAwB,EAAgB;AAetE,CATI,MAAoB,MACtB,EAAW,EAAgB,EAC3B,EAAQ,IAAkB,eAAe,KAAK,GAOhD,QAAgB;AACd,MAAI,CAAC,EAAiB;EACtB,IAAM,IAAQ,iBAAiB;AAC7B,MAAS,MAAa,MAAY,eAAe,SAAS,EAAS;KAClE,EAAiB;AACpB,eAAa,aAAa,EAAM;IAC/B,CAAC,GAAiB,EAAiB,CAAC;CAIvC,IAAM,IAAW,EAAO,EAAE,EACpB,IAAc,EAAO,EAAE,EACvB,IAAmB,EAA6C,KAAK;AAC3E,UACE,EAAS,UAAU,KAAK,KAAK,EAC7B,EAAY,UAAU,SACT;AAEX,EADI,EAAiB,WAAS,aAAa,EAAiB,QAAQ,EACpE,EAAiB,UAAU;KAE5B,CAAC,EAAgB,CAAC;CAKrB,IAAM,IAAa,EAA4B,KAAK,EAC9C,IAAiB,QAAkB;AAGvC,MADA,EAAY,UADE,KAAK,KAAK,GAAG,EAAS,UACN,IAAiB,EAAY,UAAU,IAAI,GACrE,EAAY,WAAW,GAAmB;AAC5C,KAAQ,UAAU;AAClB;;AAEF,IAAiB,UAAU,iBAAiB;AAG1C,GAFA,EAAiB,UAAU,MAC3B,EAAS,UAAU,KAAK,KAAK,EAC7B,EAAW,WAAW;KACrB,EAAE;IACJ,EAAE,CAAC,EAEA,EAAE,eAAY,EAKjB,EAAwB,EAAK,EAAE;EAChC,WAAW;GACT;GACA,WAAW,KAAa,KAAA;GACxB,UAAU,KAAY,KAAA;GACtB,YAAY,KAAc,KAAA;GAC1B,WAAW,KAAa,KAAA;GACzB;EACD;EACA,SAAS,EAAE,MAAM,QAAa;AAG5B,MAAS,MAAa,MAAY,eAAe,SAAS,EAAS;GACnE,IAAM,IACJ,EAAO,MAAM,8BACb,EAAO,MAAM,6BACb,EAAO,MAAM,+BACb,EAAO,MAAM;AAEf,GADI,KAAO,IAAU,EAAM,EAC3B,GAAS;;EAEX,UAAU,MAAU;AASlB,GAJA,QAAQ,MAAM,uEAAuE;IACnF;IACA,SAAS,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM;IAChE,CAAC,EACF,EAAQ,UAAU;;EAEpB,YAAY;EACb,CAAC;AAmBF,QAjBA,QAAgB;AACd,IAAW,UAAU;IACpB,CAAC,EAAQ,CAAC,EAMb,QAAgB;AACd,MAAI,KAAQ,MAAS,UAAW;EAChC,IAAM,IAAK,kBAAkB;AACvB,UAAO,WAAa,OAAe,SAAS,oBAAoB,YACpE,GAAgB;KACf,EAAe;AAClB,eAAa,cAAc,EAAG;IAC7B;EAAC;EAAM;EAAM;EAAgB;EAAe,CAAC,EAEzC,EAAE,MAAM,IAAO,OAAO,GAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePresence.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/hooks/usePresence.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,MAAM,4BAA4B,GAAG,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,wGAAwG;IACxG,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,wGAAwG;IACxG,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,4GAA4G;IAC5G,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AA2DD,wBAAgB,WAAW,CACzB,UAAU,EAAE,4BAA4B,EACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,iBAAiB,CAwGnB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePresence.js","names":[],"sources":["../../../src/planmagnet/hooks/usePresence.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient, useQuery, useSubscription } from '@apollo/client/react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\n/**\n * Live presence + typing on one target (CWF-24): who else is here, and who of them is typing right now.\n *\n * Heartbeat every 15 s while the tab is visible (paused while hidden — no point telling the server \"still here\"\n * from a backgrounded tab, and it would only cost quota for nothing anyone can see), an explicit\n * `planmagnetPresenceLeave` on unmount or when the target itself changes (closing this view, not merely going\n * idle — same distinction the mutation's own doc comment draws), and a typing heartbeat `notifyTyping()` callers\n * fire on every keystroke, throttled here to at most one per 5 s so a whole paragraph does not turn into a burst\n * of writes (the server also rate-limits to one heartbeat per 5s per actor+target, so this throttle is a client-\n * side courtesy, not the actual gate). There is no explicit \"stopped typing\" call — `PlanmagnetPresenceEntry.typing`\n * already goes stale 8 s after the last `typing: true` heartbeat (see that field's own schema doc comment), so a\n * caller that stops typing simply stops calling `notifyTyping()` and the flag lapses on its own.\n *\n * The live list comes from `planmagnetPresence`, kept fresh by `planmagnetOnPresenceChanged` — a THIN event (kind\n * + actorId only, CWF-24's own house rule against ever trusting a real-time payload as data) that triggers a\n * re-read under the caller's own permissions, same discipline `useLiveRefresh` uses elsewhere in this MFE. If the\n * subscription errors (including the expected \"no SSE transport\" case in a standalone/Storybook build — see\n * `useLiveRefresh`'s note on `PlanMagnetProvider`), this degrades to a 30 s poll rather than going silent.\n *\n * Heartbeat/leave/typing calls are fire-and-forget: presence is a nice-to-have, never something a refusal here\n * should surface as a page error, so failures are swallowed rather than thrown (mirroring how `useLiveRefresh`\n * treats a degraded subscription as expected, not exceptional).\n */\n\nexport type PlanmagnetPresenceTargetType = 'WORK_ITEM' | 'DOC' | 'ROADMAP' | 'PROJECT';\n\nexport interface PresenceOther {\n actorId: string;\n lastSeenAt: string;\n typing: boolean;\n}\n\nexport interface UsePresenceResult {\n /** Other actors present on this target within the last 30 s — the caller (self) is already excluded. */\n others: PresenceOther[];\n /** Ids of OTHER actors currently typing (fresh within the last 8 s, per the server) — self excluded. */\n typingActorIds: string[];\n /** Call on every keystroke in a composer for this target; throttled internally to one heartbeat per 5 s. */\n notifyTyping: () => void;\n}\n\nconst PRESENCE_QUERY = gql`\n query PlanmagnetPresenceList($targetId: ID!, $targetType: PlanmagnetPresenceTargetType!) {\n planmagnetPresence(targetId: $targetId, targetType: $targetType) {\n actorId\n lastSeenAt\n typing\n }\n }\n`;\n\nconst ON_PRESENCE_CHANGED = gql`\n subscription PlanmagnetOnPresenceChangedFeed(\n $workspaceId: ID!\n $targetId: ID!\n $targetType: PlanmagnetPresenceTargetType!\n ) {\n planmagnetOnPresenceChanged(\n workspaceId: $workspaceId\n targetId: $targetId\n targetType: $targetType\n ) {\n actorId\n at\n kind\n targetId\n targetType\n }\n }\n`;\n\nconst HEARTBEAT = gql`\n mutation PlanmagnetPresenceHeartbeatSend(\n $targetId: ID!\n $targetType: PlanmagnetPresenceTargetType!\n $typing: Boolean\n ) {\n planmagnetPresenceHeartbeat(targetId: $targetId, targetType: $targetType, typing: $typing)\n }\n`;\n\nconst LEAVE = gql`\n mutation PlanmagnetPresenceLeaveSend($targetId: ID!, $targetType: PlanmagnetPresenceTargetType!) {\n planmagnetPresenceLeave(targetId: $targetId, targetType: $targetType)\n }\n`;\n\nconst HEARTBEAT_INTERVAL_MS = 15_000;\nconst TYPING_MIN_INTERVAL_MS = 5_000;\nconst POLL_INTERVAL_MS = 30_000;\n// Matches `PlanmagnetPresenceEntry.typing`'s own freshness window (graphql/wspace.graphql): the server derives\n// `typing` from whichever heartbeat landed MOST RECENTLY, not from which one said `typing: true` most recently —\n// so the plain \"still here\" heartbeat below must keep echoing `true` for as long as a typing heartbeat would still\n// read as fresh server-side, or it clobbers the flag out from under an actor who never stopped typing.\nconst TYPING_FRESH_MS = 8_000;\n\nconst hidden = () => typeof document !== 'undefined' && document.visibilityState === 'hidden';\n\nexport function usePresence(\n targetType: PlanmagnetPresenceTargetType,\n targetId: string | null | undefined\n): UsePresenceResult {\n const { workspaceId, currentUser } = usePlanMagnet();\n const client = useApolloClient();\n const ready = Boolean(workspaceId) && Boolean(targetId);\n\n const { data, refetch } = useQuery<{ planmagnetPresence: PresenceOther[] }>(PRESENCE_QUERY, {\n variables: { targetId: targetId ?? '', targetType },\n skip: !ready,\n fetchPolicy: 'cache-and-network',\n });\n\n // Degrades to polling (below) the moment the subscription errors — including the \"no SSE transport configured\"\n // standalone/Storybook case `useLiveRefresh` documents; either way presence must keep working, just less live.\n // A target change starts optimistic again: the previous target's subscription failure says nothing about\n // whether this one will, so `degraded` resets the moment `targetKey` changes. Direct setState DURING RENDER,\n // guarded by comparing against the last-seen key, is the React-documented way to adjust state in response to a\n // prop change — the same pattern `useLiveRefresh.ts` uses for its own `modeKey`/`subscriptionKey` reset,\n // deliberately not a `useEffect` (which would cascade an extra render for the same outcome).\n const targetKey = `${targetType}:${targetId ?? ''}`;\n const [degraded, setDegraded] = useState(false);\n const [degradedKey, setDegradedKey] = useState(targetKey);\n if (targetKey !== degradedKey) {\n setDegradedKey(targetKey);\n setDegraded(false);\n }\n\n useSubscription(ON_PRESENCE_CHANGED, {\n variables: { workspaceId: workspaceId ?? '', targetId: targetId ?? '', targetType },\n skip: !ready,\n onData: () => {\n void refetch().catch(() => undefined);\n },\n onError: (error) => {\n console.debug('[usePresence] subscription unavailable, falling back to polling:', {\n targetType,\n message: error instanceof Error ? error.message : String(error),\n });\n setDegraded(true);\n },\n });\n\n useEffect(() => {\n if (!ready || !degraded) return;\n const id = setInterval(() => {\n if (hidden()) return;\n void refetch().catch(() => undefined);\n }, POLL_INTERVAL_MS);\n return () => clearInterval(id);\n }, [ready, degraded, refetch]);\n\n // Last time a typing heartbeat actually went out (shared with `notifyTyping` below) — declared here, ahead of\n // the plain heartbeat effect, so that effect can read it too.\n const lastTypingAt = useRef(0);\n\n // Heartbeat while visible: once immediately, then every 15 s — paused (not merely skipped) while the tab is\n // hidden, restarting clean the moment it becomes visible again. `typing` echoes whether a typing heartbeat is\n // still fresh rather than hardcoding `false`: this heartbeat and `notifyTyping`'s run on independent timers (15 s\n // vs ≤5 s), so over any typing session longer than 15 s this one WILL eventually land after a typing heartbeat —\n // sending a bare `false` there would make it \"the most recent heartbeat\" server-side and flip the typing flag\n // off (publishing a spurious STOPPED_TYPING to every other viewer) while the actor is still actively typing.\n useEffect(() => {\n if (!ready || !targetId) return;\n const beat = () => {\n if (hidden()) return;\n const typing = Date.now() - lastTypingAt.current < TYPING_FRESH_MS;\n void client\n .mutate({ mutation: HEARTBEAT, variables: { targetId, targetType, typing } })\n .catch(() => undefined);\n };\n beat();\n const id = setInterval(beat, HEARTBEAT_INTERVAL_MS);\n return () => clearInterval(id);\n }, [ready, targetId, targetType, client]);\n\n // Leave on unmount OR when the target itself changes (route/tab change) — a dedicated effect so this fires\n // exactly once per (targetId, targetType) teardown, never on an ordinary heartbeat tick.\n useEffect(() => {\n if (!ready || !targetId) return;\n return () => {\n void client\n .mutate({ mutation: LEAVE, variables: { targetId, targetType } })\n .catch(() => undefined);\n };\n }, [ready, targetId, targetType, client]);\n\n const notifyTyping = useCallback(() => {\n if (!ready || !targetId) return;\n const now = Date.now();\n if (now - lastTypingAt.current < TYPING_MIN_INTERVAL_MS) return;\n lastTypingAt.current = now;\n void client\n .mutate({ mutation: HEARTBEAT, variables: { targetId, targetType, typing: true } })\n .catch(() => undefined);\n }, [ready, targetId, targetType, client]);\n\n const selfId = currentUser?.id;\n const entries = useMemo(() => data?.planmagnetPresence ?? [], [data]);\n const others = useMemo(() => entries.filter((e) => e.actorId !== selfId), [entries, selfId]);\n const typingActorIds = useMemo(\n () => others.filter((e) => e.typing).map((e) => e.actorId),\n [others]\n );\n\n return { others, typingActorIds, notifyTyping };\n}\n"],"mappings":";;;;;AA8CA,IAAM,IAAiB,CAAG;;;;;;;;GAUpB,IAAsB,CAAG;;;;;;;;;;;;;;;;;;GAoBzB,IAAY,CAAG;;;;;;;;GAUf,IAAQ,CAAG;;;;GAMX,IAAwB,MACxB,IAAyB,KACzB,IAAmB,KAKnB,IAAkB,KAElB,UAAe,OAAO,WAAa,OAAe,SAAS,oBAAoB;AAErF,SAAgB,EACd,GACA,GACmB;CACnB,IAAM,EAAE,gBAAa,mBAAgB,GAAe,EAC9C,IAAS,GAAiB,EAC1B,IAAQ,EAAQ,KAAgB,EAAQ,GAExC,EAAE,SAAM,eAAY,EAAkD,GAAgB;EAC1F,WAAW;GAAE,UAAU,KAAY;GAAI;GAAY;EACnD,MAAM,CAAC;EACP,aAAa;EACd,CAAC,EASI,IAAY,GAAG,EAAW,GAAG,KAAY,MACzC,CAAC,GAAU,KAAe,EAAS,GAAM,EACzC,CAAC,GAAa,KAAkB,EAAS,EAAU;AAqBzD,CApBI,MAAc,MAChB,EAAe,EAAU,EACzB,EAAY,GAAM,GAGpB,EAAgB,GAAqB;EACnC,WAAW;GAAE,aAAa,KAAe;GAAI,UAAU,KAAY;GAAI;GAAY;EACnF,MAAM,CAAC;EACP,cAAc;AACP,MAAS,CAAC,YAAY,KAAA,EAAU;;EAEvC,UAAU,MAAU;AAKlB,GAJA,QAAQ,MAAM,oEAAoE;IAChF;IACA,SAAS,aAAiB,QAAQ,EAAM,UAAU,OAAO,EAAM;IAChE,CAAC,EACF,EAAY,GAAK;;EAEpB,CAAC,EAEF,QAAgB;AACd,MAAI,CAAC,KAAS,CAAC,EAAU;EACzB,IAAM,IAAK,kBAAkB;AACvB,MAAQ,IACP,GAAS,CAAC,YAAY,KAAA,EAAU;KACpC,EAAiB;AACpB,eAAa,cAAc,EAAG;IAC7B;EAAC;EAAO;EAAU;EAAQ,CAAC;CAI9B,IAAM,IAAe,EAAO,EAAE;AAwB9B,CAhBA,QAAgB;AACd,MAAI,CAAC,KAAS,CAAC,EAAU;EACzB,IAAM,UAAa;AACjB,OAAI,GAAQ,CAAE;GACd,IAAM,IAAS,KAAK,KAAK,GAAG,EAAa,UAAU;AAC9C,KACF,OAAO;IAAE,UAAU;IAAW,WAAW;KAAE;KAAU;KAAY;KAAQ;IAAE,CAAC,CAC5E,YAAY,KAAA,EAAU;;AAE3B,KAAM;EACN,IAAM,IAAK,YAAY,GAAM,EAAsB;AACnD,eAAa,cAAc,EAAG;IAC7B;EAAC;EAAO;EAAU;EAAY;EAAO,CAAC,EAIzC,QAAgB;AACV,SAAC,KAAS,CAAC,GACf,cAAa;AACN,KACF,OAAO;IAAE,UAAU;IAAO,WAAW;KAAE;KAAU;KAAY;IAAE,CAAC,CAChE,YAAY,KAAA,EAAU;;IAE1B;EAAC;EAAO;EAAU;EAAY;EAAO,CAAC;CAEzC,IAAM,IAAe,QAAkB;AACrC,MAAI,CAAC,KAAS,CAAC,EAAU;EACzB,IAAM,IAAM,KAAK,KAAK;AAClB,MAAM,EAAa,UAAU,MACjC,EAAa,UAAU,GAClB,EACF,OAAO;GAAE,UAAU;GAAW,WAAW;IAAE;IAAU;IAAY,QAAQ;IAAM;GAAE,CAAC,CAClF,YAAY,KAAA,EAAU;IACxB;EAAC;EAAO;EAAU;EAAY;EAAO,CAAC,EAEnC,IAAS,GAAa,IACtB,IAAU,QAAc,GAAM,sBAAsB,EAAE,EAAE,CAAC,EAAK,CAAC,EAC/D,IAAS,QAAc,EAAQ,QAAQ,MAAM,EAAE,YAAY,EAAO,EAAE,CAAC,GAAS,EAAO,CAAC;AAM5F,QAAO;EAAE;EAAQ,gBALM,QACf,EAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,EAAE,QAAQ,EAC1D,CAAC,EAAO,CACT;EAEgC;EAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useProjectWorkflow.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/hooks/useProjectWorkflow.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,gCAiB5B,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjF,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,GAAG,IAAI,CAM/F;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,6GAA6G;AAC7G,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,eAAe,GAAG,IAAI,EAChC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,SAAS,MAAM,EAAE,GACrB,MAAM,EAAE,CAYV"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useProjectWorkflow.js","names":[],"sources":["../../../src/planmagnet/hooks/useProjectWorkflow.ts"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\n\n/**\n * A project's workflow (BOFF-8043): the project's name for each of the seven statuses, which are hidden from new\n * selection, and — when transitions are enforced — which moves are allowed. The server enforces the rules on every\n * path; this hook only lets pickers offer what will be accepted and show the project's names.\n */\n\nexport const PROJECT_WORKFLOW = gql`\n query ProjectWorkflow($projectId: ID!) {\n planmagnetProjectWorkflow(projectId: $projectId) {\n projectId\n enforceTransitions\n statuses {\n status\n label\n hidden\n category\n }\n transitions {\n from\n to\n }\n }\n }\n`;\n\nexport interface ProjectWorkflow {\n projectId: string;\n enforceTransitions: boolean;\n statuses: { status: string; label: string; hidden: boolean; category: string }[];\n transitions: { from: string; to: string }[];\n}\n\nexport function useProjectWorkflow(projectId: string | null | undefined): ProjectWorkflow | null {\n const { data } = useQuery<{ planmagnetProjectWorkflow: ProjectWorkflow }>(PROJECT_WORKFLOW, {\n variables: { projectId: projectId ?? '' },\n skip: !projectId,\n });\n return data?.planmagnetProjectWorkflow ?? null;\n}\n\n/** \"In progress\" for IN_PROGRESS — what a status is called when no project names it. */\nexport function canonicalLabel(status: string): string {\n const words = status.toLowerCase().replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/** The project's name for a status (the canonical name while the workflow loads or for an unknown value). */\nexport function workflowLabel(workflow: ProjectWorkflow | null, status: string): string {\n return workflow?.statuses.find((s) => s.status === status)?.label ?? canonicalLabel(status);\n}\n\n/**\n * Statuses an item in `from` can be moved to, in canonical order, `from` first when it is not in the list (a hidden\n * status an item already has stays shown so it is never silently replaced). Mirrors the server's rule: hidden\n * statuses are never offered; with transitions enforced only listed moves are.\n */\nexport function allowedTargets(\n workflow: ProjectWorkflow | null,\n from: string,\n all: readonly string[]\n): string[] {\n if (!workflow) return all.includes(from) ? [...all] : [from, ...all];\n const allowed = workflow.statuses\n .filter((s) => s.status === from || !s.hidden)\n .filter(\n (s) =>\n s.status === from ||\n !workflow.enforceTransitions ||\n workflow.transitions.some((t) => t.from === from && t.to === s.status)\n )\n .map((s) => s.status);\n return allowed.includes(from) ? allowed : [from, ...allowed];\n}\n"],"mappings":";;;AASA,IAAa,IAAmB,CAAG;;;;;;;;;;;;;;;;;;AA0BnC,SAAgB,EAAmB,GAA8D;CAC/F,IAAM,EAAE,YAAS,EAAyD,GAAkB;EAC1F,WAAW,EAAE,WAAW,KAAa,IAAI;EACzC,MAAM,CAAC;EACR,CAAC;AACF,QAAO,GAAM,6BAA6B;;AAI5C,SAAgB,EAAe,GAAwB;CACrD,IAAM,IAAQ,EAAO,aAAa,CAAC,QAAQ,MAAM,IAAI;AACrD,QAAO,EAAM,OAAO,EAAE,CAAC,aAAa,GAAG,EAAM,MAAM,EAAE;;AAIvD,SAAgB,EAAc,GAAkC,GAAwB;AACtF,QAAO,GAAU,SAAS,MAAM,MAAM,EAAE,WAAW,EAAO,EAAE,SAAS,EAAe,EAAO;;AAQ7F,SAAgB,EACd,GACA,GACA,GACU;AACV,KAAI,CAAC,EAAU,QAAO,EAAI,SAAS,EAAK,GAAG,CAAC,GAAG,EAAI,GAAG,CAAC,GAAM,GAAG,EAAI;CACpE,IAAM,IAAU,EAAS,SACtB,QAAQ,MAAM,EAAE,WAAW,KAAQ,CAAC,EAAE,OAAO,CAC7C,QACE,MACC,EAAE,WAAW,KACb,CAAC,EAAS,sBACV,EAAS,YAAY,MAAM,MAAM,EAAE,SAAS,KAAQ,EAAE,OAAO,EAAE,OAAO,CACzE,CACA,KAAK,MAAM,EAAE,OAAO;AACvB,QAAO,EAAQ,SAAS,EAAK,GAAG,IAAU,CAAC,GAAM,GAAG,EAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exportColumns.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/import/exportColumns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,CAAC;AAE1C,sHAAsH;AACtH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;AAEhE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAK9D;AA2CD,sEAAsE;AACtE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,GACnB;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAY3C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"exportColumns.js","names":[],"sources":["../../../src/planmagnet/import/exportColumns.ts"],"sourcesContent":["/**\n * The columns of a Linear export, read in the browser so the import page can offer a column picker before anything\n * is sent. Only the header matters here — the service parses the rows.\n */\n\nexport type ExportFormat = 'CSV' | 'JSON';\n\n/** Our fields, in the order the picker shows them. `required` fields must resolve to a column for a row to import. */\nexport const IMPORT_FIELDS = [\n { key: 'externalId', label: 'Issue ID', required: true },\n { key: 'title', label: 'Title', required: true },\n { key: 'description', label: 'Description', required: false },\n { key: 'status', label: 'State', required: false },\n { key: 'priority', label: 'Priority', required: false },\n { key: 'labels', label: 'Labels', required: false },\n { key: 'assigneeEmail', label: 'Assignee', required: false },\n { key: 'dueDate', label: 'Due date', required: false },\n { key: 'externalUrl', label: 'Link to the issue', required: false },\n] as const;\n\nexport type ImportField = (typeof IMPORT_FIELDS)[number]['key'];\n\nexport function formatOf(fileName: string): ExportFormat | null {\n const lower = fileName.toLowerCase();\n if (lower.endsWith('.csv')) return 'CSV';\n if (lower.endsWith('.json')) return 'JSON';\n return null;\n}\n\n/** The first CSV record (RFC 4180: quoted fields may hold commas, escaped quotes and line breaks). */\nfunction csvHeader(text: string): string[] {\n const out: string[] = [];\n let field = '';\n let quoted = false;\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quoted) {\n if (c === '\"' && text[i + 1] === '\"') {\n field += '\"';\n i++;\n } else if (c === '\"') quoted = false;\n else field += c;\n } else if (c === '\"') quoted = true;\n else if (c === ',') {\n out.push(field.trim());\n field = '';\n } else if (c === '\\n' || c === '\\r') break;\n else field += c;\n }\n out.push(field.trim());\n return out.filter((h) => h !== '');\n}\n\n/** Keys of the issues in a JSON export (a list, `{ issues }`, or the Linear API's `{ data: { issues: { nodes } } }`). */\nfunction jsonKeys(text: string): string[] {\n const parsed: unknown = JSON.parse(text);\n const list: unknown[] = Array.isArray(parsed)\n ? parsed\n : ((parsed as { issues?: unknown[] })?.issues ??\n (parsed as { data?: { issues?: { nodes?: unknown[] } } })?.data?.issues?.nodes ??\n []);\n const keys = new Set<string>();\n for (const item of list.slice(0, 50)) {\n if (item && typeof item === 'object' && !Array.isArray(item)) {\n for (const k of Object.keys(item)) keys.add(k);\n }\n }\n return [...keys];\n}\n\n/** Columns of the export, or an error message a person can act on. */\nexport function exportColumns(\n text: string,\n format: ExportFormat\n): { columns: string[] } | { error: string } {\n try {\n const columns = format === 'CSV' ? csvHeader(text) : jsonKeys(text);\n if (columns.length === 0) {\n return {\n error: format === 'CSV' ? 'The file has no header row.' : 'The file holds no issues.',\n };\n }\n return { columns };\n } catch {\n return { error: 'The file is not valid JSON.' };\n }\n}\n"],"mappings":";AAQA,IAAa,IAAgB;CAC3B;EAAE,KAAK;EAAc,OAAO;EAAY,UAAU;EAAM;CACxD;EAAE,KAAK;EAAS,OAAO;EAAS,UAAU;EAAM;CAChD;EAAE,KAAK;EAAe,OAAO;EAAe,UAAU;EAAO;CAC7D;EAAE,KAAK;EAAU,OAAO;EAAS,UAAU;EAAO;CAClD;EAAE,KAAK;EAAY,OAAO;EAAY,UAAU;EAAO;CACvD;EAAE,KAAK;EAAU,OAAO;EAAU,UAAU;EAAO;CACnD;EAAE,KAAK;EAAiB,OAAO;EAAY,UAAU;EAAO;CAC5D;EAAE,KAAK;EAAW,OAAO;EAAY,UAAU;EAAO;CACtD;EAAE,KAAK;EAAe,OAAO;EAAqB,UAAU;EAAO;CACpE;AAID,SAAgB,EAAS,GAAuC;CAC9D,IAAM,IAAQ,EAAS,aAAa;AAGpC,QAFI,EAAM,SAAS,OAAO,GAAS,QAC/B,EAAM,SAAS,QAAQ,GAAS,SAC7B;;AAIT,SAAS,EAAU,GAAwB;CACzC,IAAM,IAAgB,EAAE,EACpB,IAAQ,IACR,IAAS;AACb,MAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAAK;EACpC,IAAM,IAAI,EAAK;AACf,MAAI,EACF,CAAI,MAAM,QAAO,EAAK,IAAI,OAAO,QAC/B,KAAS,MACT,OACS,MAAM,OAAK,IAAS,KAC1B,KAAS;WACL,MAAM,KAAK,KAAS;WACtB,MAAM,IAEb,CADA,EAAI,KAAK,EAAM,MAAM,CAAC,EACtB,IAAQ;WACC,MAAM,QAAQ,MAAM,KAAM;MAChC,MAAS;;AAGhB,QADA,EAAI,KAAK,EAAM,MAAM,CAAC,EACf,EAAI,QAAQ,MAAM,MAAM,GAAG;;AAIpC,SAAS,EAAS,GAAwB;CACxC,IAAM,IAAkB,KAAK,MAAM,EAAK,EAClC,IAAkB,MAAM,QAAQ,EAAO,GACzC,IACE,GAAmC,UACpC,GAA0D,MAAM,QAAQ,SACzE,EAAE,EACA,oBAAO,IAAI,KAAa;AAC9B,MAAK,IAAM,KAAQ,EAAK,MAAM,GAAG,GAAG,CAClC,KAAI,KAAQ,OAAO,KAAS,YAAY,CAAC,MAAM,QAAQ,EAAK,CAC1D,MAAK,IAAM,KAAK,OAAO,KAAK,EAAK,CAAE,GAAK,IAAI,EAAE;AAGlD,QAAO,CAAC,GAAG,EAAK;;AAIlB,SAAgB,EACd,GACA,GAC2C;AAC3C,KAAI;EACF,IAAM,IAAU,MAAW,QAAQ,EAAU,EAAK,GAAG,EAAS,EAAK;AAMnE,SALI,EAAQ,WAAW,IACd,EACL,OAAO,MAAW,QAAQ,gCAAgC,6BAC3D,GAEI,EAAE,YAAS;SACZ;AACN,SAAO,EAAE,OAAO,+BAA+B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/planmagnet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EACL,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/integrations/routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AACjE,eAAO,MAAM,0BAA0B,+BAA+B,CAAC;AACvE,eAAO,MAAM,6BAA6B,kCAAkC,CAAC;AAE7E,sGAAsG;AACtG,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIhF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","names":[],"sources":["../../../src/planmagnet/integrations/routes.ts"],"sourcesContent":["/**\n * Integrations (sync) route targets (AUT-08/40/09/06/10/24), exported so the host shell (`planmagnet-app`, where\n * the \"Integrations\" sidebar entry itself lives) can build a `NavItem` against real, routed paths instead of a\n * hand-typed string that can drift from `PlanMagnetRoutes.tsx`. Relative, no leading slash — the same form\n * `PlanMagnetRoot.tsx` passes through `joinPath(basePath, ...)` for every other nav entry in this package, and\n * the same form `path=\"…\"` carries in `PlanMagnetRoutes.tsx`.\n */\nexport const INTEGRATIONS_SYNCS_PATH = 'integrations/syncs-page';\nexport const INTEGRATIONS_NEW_SYNC_PATH = 'integrations/new-sync-page';\nexport const INTEGRATIONS_SYNC_DETAIL_PATH = 'integrations/sync-detail-page';\n\n/** `integrations/sync-detail-page/<id>` for a specific sync, or the bare list path with no id yet. */\nexport function integrationsSyncDetailPath(id: string | null | undefined): string {\n return id\n ? `${INTEGRATIONS_SYNC_DETAIL_PATH}/${encodeURIComponent(id)}`\n : INTEGRATIONS_SYNCS_PATH;\n}\n"],"mappings":";AAOA,IAAa,IAA0B,2BAC1B,IAA6B,8BAC7B,IAAgC;AAG7C,SAAgB,EAA2B,GAAuC;AAChF,QAAO,IACH,GAAG,EAA8B,GAAG,mBAAmB,EAAG,KAC1D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"syncTypes.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/integrations/syncTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"syncTypes.js","names":[],"sources":["../../../src/planmagnet/integrations/syncTypes.ts"],"sourcesContent":["/**\n * Shared shapes and constants for External Sync (AUT-06/08/09/10/20/22/23/24/40) — GraphQL Hive doc comments and\n * `wspace-planmagnet-svc#63` are the source of truth for all of this, not guesswork:\n *\n * - GITHUB is the one provider with a real, live connector today (`github-connector.ts`); every other\n * `PlanmagnetSyncProvider` is accepted by `planmagnetCreateExternalSync` (a customer can configure it ahead of\n * time) but has no live connector, which `planmagnetSupportedSyncProviders` reports honestly (every capability\n * flag false except `supportsFileImport`, which is the unrelated `planmagnetImportExternalIssues` CSV/JSON\n * upload path, not an `ExternalSync` live run). The wizard reads that capability list rather than hard-coding\n * \"GitHub only\" — if a second connector ships, this UI lights up for it automatically.\n * - `ExternalSync.connectionConfig` for GITHUB is `{ token, owner, repo }` and is REDACTED server-side on every\n * read (`token` -> `[REDACTED]`; `owner`/`repo` are not secret and pass through). It must never be displayed as\n * if it still held the token, and never round-tripped back to the server as if `[REDACTED]` were a real value.\n * - `ExternalSync.fieldMapping` for GITHUB is exactly two optional label-prefix strings —\n * `{ priority?: string; dueDate?: string }` (default `\"priority:\"` / `\"due:\"`) — because GitHub Issues have no\n * native priority or due-date column; the connector encodes/decodes them as a label of the form\n * `{prefix}{value}` (e.g. `priority:HIGH`, `due:2026-10-01`). This is the only field-mapping shape the live\n * connector reads; it is NOT the (unrelated) CSV/JSON import's column-name mapping.\n * - `PlanmagnetUpdateExternalSyncInput.connectionConfig` REPLACES the whole stored config — it does not merge —\n * so an edit that changes only the token must resend `owner`/`repo` too (read back from the redacted\n * `connectionConfig`, which is safe since only `token` is masked), and an edit that changes owner/repo without a\n * new token cannot be sent at all (the real token can never be read back to resend it). See\n * `controls/SyncControls.tsx`'s `EditSyncConnectionDialog`.\n */\n\nexport const SYNC_PROVIDERS = [\n 'JIRA',\n 'GITHUB',\n 'GITLAB',\n 'AZURE_DEVOPS',\n 'ASANA',\n 'TRELLO',\n 'LINEAR',\n 'SHORTCUT',\n 'CLICKUP',\n 'CUSTOM',\n] as const;\nexport type SyncProvider = (typeof SYNC_PROVIDERS)[number];\n\nexport const SYNC_DIRECTIONS = ['INBOUND', 'OUTBOUND', 'BIDIRECTIONAL'] as const;\nexport type SyncDirection = (typeof SYNC_DIRECTIONS)[number];\n\nexport const SYNC_STATUSES = [\n 'IDLE',\n 'SYNCING',\n 'SUCCESS',\n 'FAILED',\n 'PAUSED',\n 'DISABLED',\n] as const;\nexport type SyncStatus = (typeof SYNC_STATUSES)[number];\n\n// AUT-24: MERGE added alongside the two whole-side picks and the manual flag — PlanmagnetSyncConflictResolution's\n// own doc comment (graphql/wspace.graphql) has the exact field-level policy: each sync leg keeps whichever\n// side's title/description it is NOT overwriting, while status/priority/dueDate/labels still follow that leg's\n// normal direction.\nexport const CONFLICT_RESOLUTIONS = ['SOURCE_WINS', 'TARGET_WINS', 'MERGE', 'MANUAL'] as const;\nexport type ConflictResolution = (typeof CONFLICT_RESOLUTIONS)[number];\n\nexport const CONFLICT_STATUSES = ['OPEN', 'RESOLVED'] as const;\nexport type ConflictStatus = (typeof CONFLICT_STATUSES)[number];\n\nexport const SYNC_RUN_STATUSES = ['SUCCEEDED', 'FAILED', 'PARTIAL'] as const;\nexport type SyncRunStatus = (typeof SYNC_RUN_STATUSES)[number];\n\n/** The two GitHub label-prefix keys `ExternalSync.fieldMapping` actually understands (github-connector.ts). */\nexport const GITHUB_FIELD_MAPPING_KEYS = ['priority', 'dueDate'] as const;\nexport type GithubFieldMappingKey = (typeof GITHUB_FIELD_MAPPING_KEYS)[number];\n/** The connector's own built-in defaults, used only as placeholder copy — never assumed server-side. */\nexport const GITHUB_FIELD_MAPPING_DEFAULTS: Record<GithubFieldMappingKey, string> = {\n priority: 'priority:',\n dueDate: 'due:',\n};\n\nexport interface ProjectRef {\n id: string;\n name: string;\n}\n\nexport interface RunHealth {\n lastRunAt: string | null;\n lastStatus: SyncRunStatus | null;\n consecutiveFailures: number;\n runsLast7Days: number;\n}\n\nexport interface ExternalSyncRow {\n id: string;\n provider: SyncProvider;\n direction: SyncDirection;\n status: SyncStatus;\n projectId: string;\n project: ProjectRef | null;\n externalProjectId: string;\n externalProjectUrl: string | null;\n conflictStrategy: ConflictResolution;\n fieldMapping: unknown;\n /** Stored but not yet read by any run (sync.service.ts) — surfaced honestly in the edit form, not hidden. */\n syncFilters: unknown;\n lastSyncedAt: string | null;\n lastSyncError: string | null;\n totalItemsSynced: number;\n createdAt: string;\n updatedAt: string;\n runHealth: RunHealth;\n}\n\nexport interface SyncProviderCapability {\n provider: SyncProvider;\n supportsImport: boolean;\n supportsExport: boolean;\n supportsBidirectional: boolean;\n supportsFileImport: boolean;\n supportsConnectionTest: boolean;\n}\n\nexport interface SyncRunRow {\n id: string;\n direction: SyncDirection;\n status: SyncRunStatus;\n startedAt: string;\n finishedAt: string;\n itemsCreated: number;\n itemsUpdated: number;\n itemsSkipped: number;\n errorCount: number;\n conflictCount: number;\n errorMessage: string | null;\n triggeredBy: string;\n}\n\nexport interface ExternalMappingRef {\n id: string;\n internalId: string;\n internalType: string;\n externalId: string;\n externalType: string;\n externalUrl: string | null;\n}\n\nexport interface SyncConflictRow {\n id: string;\n createdAt: string;\n fields: string[];\n localUpdatedAt: string;\n remoteUpdatedAt: string;\n resolution: ConflictResolution | null;\n resolvedAt: string | null;\n resolvedBy: string | null;\n status: ConflictStatus;\n mapping: ExternalMappingRef | null;\n mappingId: string;\n}\n\n/** `PlanmagnetSyncResult` — what `planmagnetStartSync` returns. */\nexport interface SyncRunResult {\n syncId: string;\n success: boolean;\n itemsCreated: number;\n itemsUpdated: number;\n itemsSkipped: number;\n errorCount: number;\n errors: string[] | null;\n conflictCount: number;\n durationMs: number | null;\n syncedAt: string;\n}\n\n/** `PlanmagnetSyncConnectionTestResult` — what `planmagnetTestExternalSync` returns. */\nexport interface SyncConnectionTestResult {\n ok: boolean;\n message: string;\n rateLimitRemaining: number | null;\n}\n\nconst PROVIDER_LABELS: Record<SyncProvider, string> = {\n JIRA: 'Jira',\n GITHUB: 'GitHub',\n GITLAB: 'GitLab',\n AZURE_DEVOPS: 'Azure DevOps',\n ASANA: 'Asana',\n TRELLO: 'Trello',\n LINEAR: 'Linear',\n SHORTCUT: 'Shortcut',\n CLICKUP: 'ClickUp',\n CUSTOM: 'Custom',\n};\n\nexport function providerLabel(provider: string): string {\n return PROVIDER_LABELS[provider as SyncProvider] ?? provider;\n}\n\nconst DIRECTION_LABELS: Record<SyncDirection, string> = {\n INBOUND: 'Inbound (provider → PlanMagnet)',\n OUTBOUND: 'Outbound (PlanMagnet → provider)',\n BIDIRECTIONAL: 'Bidirectional (both ways)',\n};\n\nexport function directionLabel(direction: string): string {\n return DIRECTION_LABELS[direction as SyncDirection] ?? direction;\n}\n\n/** Short labels for `ExternalSync.conflictStrategy` / `SyncConflict.resolution` — friendlier than `enumLabel`'s\n * literal \"Source wins\"/\"Target wins\" (this is the one place PlanMagnet calls itself \"PlanMagnet\", not \"source\",\n * to the person choosing the strategy). Covers all four `PlanmagnetSyncConflictResolution` values, including\n * `MERGE` (AUT-24) — a prior version of this UI fell through to \"Manual\" for it in two places that read the raw\n * enum with a 3-way ternary instead of this map. */\nconst CONFLICT_STRATEGY_LABELS: Record<ConflictResolution, string> = {\n SOURCE_WINS: 'PlanMagnet wins',\n TARGET_WINS: 'Provider wins',\n MERGE: 'Merge',\n MANUAL: 'Manual',\n};\n\nexport function conflictStrategyLabel(value: string): string {\n return CONFLICT_STRATEGY_LABELS[value as ConflictResolution] ?? value;\n}\n\n/** Whether a capability supports a given direction at all — the single gate the wizard and the edit form both use. */\nexport function directionSupported(\n capability: Pick<\n SyncProviderCapability,\n 'supportsImport' | 'supportsExport' | 'supportsBidirectional'\n >,\n direction: SyncDirection\n): boolean {\n if (direction === 'INBOUND') return capability.supportsImport;\n if (direction === 'OUTBOUND') return capability.supportsExport;\n return capability.supportsBidirectional;\n}\n\n/** True once a provider can run at least one live direction — the gate for selecting it in the wizard at all. */\nexport function providerIsLive(\n capability: Pick<\n SyncProviderCapability,\n 'supportsImport' | 'supportsExport' | 'supportsBidirectional'\n >\n): boolean {\n return capability.supportsImport || capability.supportsExport || capability.supportsBidirectional;\n}\n\n/**\n * `ExternalSync.fieldMapping` -> the two GitHub label prefixes, as blank strings when unset (meaning \"the\n * connector's built-in default applies\"), never pre-filled with that default text — so an untouched form saves\n * nothing and a save always reflects a real, deliberate choice.\n */\n/** GitHub org/user name rules: 1-39 chars, alphanumeric or single hyphens, no leading/trailing hyphen. */\nconst GITHUB_OWNER_RE = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?$/;\n/** GitHub repo name rules: 1-100 chars of letters, digits, `.`, `-`, `_`. */\nconst GITHUB_REPO_RE = /^[A-Za-z0-9._-]{1,100}$/;\n\nexport function isValidGithubOwner(value: string): boolean {\n return GITHUB_OWNER_RE.test(value.trim());\n}\nexport function isValidGithubRepo(value: string): boolean {\n return GITHUB_REPO_RE.test(value.trim());\n}\n\nexport function parseGithubFieldMapping(value: unknown): Record<GithubFieldMappingKey, string> {\n const out: Record<GithubFieldMappingKey, string> = { priority: '', dueDate: '' };\n if (!value || typeof value !== 'object' || Array.isArray(value)) return out;\n for (const key of GITHUB_FIELD_MAPPING_KEYS) {\n const raw = (value as Record<string, unknown>)[key];\n if (typeof raw === 'string' && raw.trim()) out[key] = raw.trim();\n }\n return out;\n}\n"],"mappings":";AAuCA,IAAa,IAAkB;CAAC;CAAW;CAAY;CAAgB,EAG1D,IAAgB;CAC3B;CACA;CACA;CACA;CACA;CACA;CACD,EAOY,IAAuB;CAAC;CAAe;CAAe;CAAS;CAAS,EAUxE,IAA4B,CAAC,YAAY,UAAU,EAGnD,IAAuE;CAClF,UAAU;CACV,SAAS;CACV,EAuGK,IAAgD;CACpD,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,cAAc;CACd,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,SAAS;CACT,QAAQ;CACT;AAED,SAAgB,EAAc,GAA0B;AACtD,QAAO,EAAgB,MAA6B;;AAGtD,IAAM,IAAkD;CACtD,SAAS;CACT,UAAU;CACV,eAAe;CAChB;AAED,SAAgB,EAAe,GAA2B;AACxD,QAAO,EAAiB,MAA+B;;AAQzD,IAAM,IAA+D;CACnE,aAAa;CACb,aAAa;CACb,OAAO;CACP,QAAQ;CACT;AAED,SAAgB,EAAsB,GAAuB;AAC3D,QAAO,EAAyB,MAAgC;;AAIlE,SAAgB,EACd,GAIA,GACS;AAGT,QAFI,MAAc,YAAkB,EAAW,iBAC3C,MAAc,aAAmB,EAAW,iBACzC,EAAW;;AAIpB,SAAgB,EACd,GAIS;AACT,QAAO,EAAW,kBAAkB,EAAW,kBAAkB,EAAW;;AAS9E,IAAM,IAAkB,mDAElB,IAAiB;AAEvB,SAAgB,EAAmB,GAAwB;AACzD,QAAO,EAAgB,KAAK,EAAM,MAAM,CAAC;;AAE3C,SAAgB,EAAkB,GAAwB;AACxD,QAAO,EAAe,KAAK,EAAM,MAAM,CAAC;;AAG1C,SAAgB,EAAwB,GAAuD;CAC7F,IAAM,IAA6C;EAAE,UAAU;EAAI,SAAS;EAAI;AAChF,KAAI,CAAC,KAAS,OAAO,KAAU,YAAY,MAAM,QAAQ,EAAM,CAAE,QAAO;AACxE,MAAK,IAAM,KAAO,GAA2B;EAC3C,IAAM,IAAO,EAAkC;AAC/C,EAAI,OAAO,KAAQ,YAAY,EAAI,MAAM,KAAE,EAAI,KAAO,EAAI,MAAM;;AAElE,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSyncProviderCapabilities.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/integrations/useSyncProviderCapabilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAqB1D,wBAAgB,2BAA2B;;;;EAW1C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSyncProviderCapabilities.js","names":[],"sources":["../../../src/planmagnet/integrations/useSyncProviderCapabilities.ts"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport type { SyncProviderCapability } from './syncTypes';\n\n/**\n * AUT-23/20 — `planmagnetSupportedSyncProviders`: one provider's real capabilities, derived server-side from the\n * connector code itself (`SYNC_PROVIDER_CAPABILITIES` in sync.service.ts), never a hard-coded wish list here.\n * Drives which providers the setup wizard can select, which directions each one offers, and whether \"Test\n * connection\" has anything real to call.\n */\nconst SUPPORTED_SYNC_PROVIDERS = gql`\n query SupportedSyncProviders {\n planmagnetSupportedSyncProviders {\n provider\n supportsImport\n supportsExport\n supportsBidirectional\n supportsFileImport\n supportsConnectionTest\n }\n }\n`;\n\nexport function useSyncProviderCapabilities() {\n const { data, loading, error } = useQuery<{\n planmagnetSupportedSyncProviders: SyncProviderCapability[];\n }>(SUPPORTED_SYNC_PROVIDERS);\n\n return {\n capabilities: data?.planmagnetSupportedSyncProviders ?? [],\n // Only before the first load: a refetch must not read as \"nothing is supported\".\n loading: loading && !data,\n error,\n };\n}\n"],"mappings":";;;AAUA,IAAM,IAA2B,CAAG;;;;;;;;;;;;AAapC,SAAgB,IAA8B;CAC5C,IAAM,EAAE,SAAM,YAAS,aAAU,EAE9B,EAAyB;AAE5B,QAAO;EACL,cAAc,GAAM,oCAAoC,EAAE;EAE1D,SAAS,KAAW,CAAC;EACrB;EACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CodeLinksPanel.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/links/CodeLinksPanel.tsx"],"names":[],"mappings":"AAGA;;;;GAIG;AAEH,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AACjE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEhF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AA8DD,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAAE,2CAyBvF"}
|