@burdenoff/microfe-planmagnet 2026.1008.2 → 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 +0 -2
- 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.js +0 -2
- 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":"WorkItemActivity.js","names":[],"sources":["../../../src/planmagnet/comments/WorkItemActivity.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { PersonName } from '../people/People';\nimport { ActivityEventSentence } from '../activity/activityDescribe';\nimport { isForbidden } from '../utils/graphqlErrors';\n\n/**\n * A work item's recorded history (P1.4). This card used to synthesise three\n * entries client-side, including \"Status changed to X\" attributed to whoever\n * was assigned, at the item's updatedAt. That was fabricated history. It now\n * shows only what the server has recorded: creation, status changes and\n * comments.\n *\n * CWF-09 added a fourth kind, FIELD_CHANGED (assignment and the other tracked fields —\n * `field`/`fromValue`/`toValue`), rendered through the same sentence builder the workspace Activity page uses\n * (`activity/activityDescribe.tsx`) so the two surfaces never disagree on wording.\n */\n\nconst ACTIVITY = gql`\n query WorkItemActivity($workItemId: ID!) {\n planmagnetWorkItemActivity(workItemId: $workItemId, first: 50) {\n totalCount\n truncated\n items {\n id\n kind\n actorId\n at\n fromStatus\n toStatus\n excerpt\n field\n fromValue\n toValue\n }\n }\n }\n`;\n\ninterface ActivityEvent {\n id: string;\n kind: string;\n actorId: string | null;\n at: string;\n fromStatus: string | null;\n toStatus: string | null;\n excerpt: string | null;\n field: string | null;\n fromValue: string | null;\n toValue: string | null;\n}\n\nexport function WorkItemActivity({ workItemId }: { workItemId: string }) {\n const { data, loading, error } = useQuery<{\n planmagnetWorkItemActivity: { totalCount: number; truncated: boolean; items: ActivityEvent[] };\n }>(ACTIVITY, { variables: { workItemId }, skip: !workItemId });\n const activity = data?.planmagnetWorkItemActivity;\n const events = activity?.items ?? [];\n\n return (\n <Card data-testid=\"work-item-activity\">\n <CardHeader>\n <CardTitle>Activity</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {loading && !data && <p className=\"text-sm text-muted-foreground\">Loading activity…</p>}\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {isForbidden(error)\n ? 'You do not have access to this item’s activity.'\n : `Activity could not be loaded: ${error.message}`}\n </p>\n )}\n <ol className=\"space-y-3\">\n {events.map((event, i) => (\n <li key={event.id} className=\"flex gap-3\" data-testid=\"activity-event\">\n <div className=\"flex flex-col items-center\">\n <div className=\"h-2.5 w-2.5 rounded-full bg-primary mt-1.5\" />\n {i < events.length - 1 && <div className=\"w-px flex-1 bg-border\" />}\n </div>\n <div className=\"pb-1 min-w-0\">\n <p className=\"text-sm break-words\">\n <ActivityEventSentence event={event} />\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {event.actorId ? <PersonName id={event.actorId} /> : 'Unknown'} ·{' '}\n {new Date(event.at).toLocaleString()}\n </p>\n </div>\n </li>\n ))}\n </ol>\n {activity?.truncated && (\n <p className=\"text-xs text-muted-foreground\">\n Showing the latest {events.length} of {activity.totalCount} events.\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\">\n Creation, status changes, field edits and comments are recorded.\n </p>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;AAmBA,IAAM,IAAW,CAAG;;;;;;;;;;;;;;;;;;;;AAkCpB,SAAgB,EAAiB,EAAE,iBAAsC;CACvE,IAAM,EAAE,SAAM,YAAS,aAAU,EAE9B,GAAU;EAAE,WAAW,EAAE,eAAY;EAAE,MAAM,CAAC;EAAY,CAAC,EACxD,IAAW,GAAM,4BACjB,IAAS,GAAU,SAAS,EAAE;AAEpC,QACE,kBAAC,GAAD;EAAM,eAAY;YAAlB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,YAAoB,CAAA,EACpB,CAAA,EACb,kBAAC,GAAD;GAAa,WAAU;aAAvB;IACG,KAAW,CAAC,KAAQ,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAAqB,CAAA;IACtF,KACC,kBAAC,KAAD;KAAG,MAAK;KAAQ,WAAU;eACvB,EAAY,EAAM,GACf,oDACA,iCAAiC,EAAM;KACzC,CAAA;IAEN,kBAAC,MAAD;KAAI,WAAU;eACX,EAAO,KAAK,GAAO,MAClB,kBAAC,MAAD;MAAmB,WAAU;MAAa,eAAY;gBAAtD,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD,EAAK,WAAU,8CAA+C,CAAA,EAC7D,IAAI,EAAO,SAAS,KAAK,kBAAC,OAAD,EAAK,WAAU,yBAA0B,CAAA,CAC/D;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,KAAD;QAAG,WAAU;kBACX,kBAAC,GAAD,EAA8B,UAAS,CAAA;QACrC,CAAA,EACJ,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAM,UAAU,kBAAC,GAAD,EAAY,IAAI,EAAM,SAAW,CAAA,GAAG;SAAU;SAAG;SACjE,IAAI,KAAK,EAAM,GAAG,CAAC,gBAAgB;SAClC;UACA;SACH;QAdI,EAAM,GAcV,CACL;KACC,CAAA;IACJ,GAAU,aACT,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA6C;MACvB,EAAO;MAAO;MAAK,EAAS;MAAW;MACzD;;IAEN,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA;IACQ;KACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkItemComments.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/WorkItemComments.tsx"],"names":[],"mappings":"AA+FA,MAAM,WAAW,wBAAwB;IACvC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,QAAQ,GACT,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,oGAAoG;IACpG,QAAQ,CAAC,EAAE,wBAAwB,CAAC;CACrC,2CA2CA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkItemComments.js","names":[],"sources":["../../../src/planmagnet/comments/WorkItemComments.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { MessageSquare } from 'lucide-react';\nimport { CommentThread } from './CommentThread';\n\n/**\n * Discussion on a work item (CWF-02 threading, CWF-14 resolution, CWF-13 mentions). Anyone who can read the item\n * sees the thread; posting/replying/resolving need the item's write tier; only a comment's author can edit or\n * delete it. The engine (list, threading, resolve, mention composer) lives in `CommentThread.tsx`, shared with\n * the project and doc panels (`TargetComments.tsx`) — this file only wires the work-item-specific GraphQL\n * operations and keeps the Card chrome/title this page already had.\n */\n\nconst WORK_ITEM_COMMENTS = gql`\n query WorkItemComments($workItemId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetWorkItemComments(workItemId: $workItemId, pagination: $pagination) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n id\n authorId\n body\n createdAt\n editedAt\n parentId\n status\n resolvedBy\n resolvedAt\n mentions\n attachments {\n id\n fileId\n name\n mimeType\n size\n }\n replies {\n id\n authorId\n body\n createdAt\n editedAt\n parentId\n status\n resolvedBy\n resolvedAt\n mentions\n attachments {\n id\n fileId\n name\n mimeType\n size\n }\n }\n }\n }\n }\n`;\nconst ADD_WORK_ITEM_COMMENT = gql`\n mutation WorkItemCommentAdd($input: PlanmagnetAddWorkItemCommentInput!) {\n planmagnetAddWorkItemComment(input: $input) {\n id\n }\n }\n`;\nconst EDIT_WORK_ITEM_COMMENT = gql`\n mutation WorkItemCommentEdit($id: ID!, $body: String!) {\n planmagnetEditWorkItemComment(id: $id, body: $body) {\n id\n body\n editedAt\n }\n }\n`;\nconst DELETE_WORK_ITEM_COMMENT = gql`\n mutation WorkItemCommentDelete($id: ID!) {\n planmagnetDeleteWorkItemComment(id: $id)\n }\n`;\nconst RESOLVE_WORK_ITEM_COMMENT = gql`\n mutation WorkItemCommentResolve($id: ID!, $resolved: Boolean!) {\n planmagnetResolveWorkItemComment(id: $id, resolved: $resolved) {\n id\n status\n resolvedBy\n resolvedAt\n }\n }\n`;\n\nexport interface WorkItemCommentsPresence {\n typingActorIds: readonly string[];\n notifyTyping: () => void;\n}\n\nexport function WorkItemComments({\n workItemId,\n presence,\n}: {\n workItemId: string;\n /** CWF-24: typing presence from the page's own `usePresence(targetType: 'WORK_ITEM', ...)` call. */\n presence?: WorkItemCommentsPresence;\n}) {\n const [totalCount, setTotalCount] = useState<number | null>(null);\n return (\n <Card data-testid=\"work-item-comments\">\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MessageSquare className=\"h-4 w-4\" />\n Discussion{totalCount !== null ? ` (${totalCount})` : ''}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <CommentThread\n key={workItemId}\n target={{ type: 'WORK_ITEM', id: workItemId }}\n targetNoun=\"task\"\n idPrefix={`work-item-comment-${workItemId}`}\n query={{\n document: WORK_ITEM_COMMENTS,\n dataKey: 'planmagnetWorkItemComments',\n variables: { workItemId },\n skip: !workItemId,\n }}\n add={{\n document: ADD_WORK_ITEM_COMMENT,\n buildVariables: (body, parentId, attachmentFileIds) => ({\n input: {\n workItemId,\n body,\n parentId,\n ...(attachmentFileIds.length > 0 ? { attachmentFileIds } : {}),\n },\n }),\n }}\n edit={EDIT_WORK_ITEM_COMMENT}\n remove={DELETE_WORK_ITEM_COMMENT}\n resolve={RESOLVE_WORK_ITEM_COMMENT}\n refetchQueries={['WorkItemComments', 'WorkItemActivity']}\n onTotalCount={setTotalCount}\n presence={presence}\n />\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;AAcA,IAAM,IAAqB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDxB,IAAwB,CAAG;;;;;;GAO3B,IAAyB,CAAG;;;;;;;;GAS5B,IAA2B,CAAG;;;;GAK9B,IAA4B,CAAG;;;;;;;;;;AAgBrC,SAAgB,EAAiB,EAC/B,eACA,eAKC;CACD,IAAM,CAAC,GAAY,KAAiB,EAAwB,KAAK;AACjE,QACE,kBAAC,GAAD;EAAM,eAAY;YAAlB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB;IACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;;IAC1B,MAAe,OAA4B,KAArB,KAAK,EAAW;IACvC;MACD,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAEE,QAAQ;IAAE,MAAM;IAAa,IAAI;IAAY;GAC7C,YAAW;GACX,UAAU,qBAAqB;GAC/B,OAAO;IACL,UAAU;IACV,SAAS;IACT,WAAW,EAAE,eAAY;IACzB,MAAM,CAAC;IACR;GACD,KAAK;IACH,UAAU;IACV,iBAAiB,GAAM,GAAU,OAAuB,EACtD,OAAO;KACL;KACA;KACA;KACA,GAAI,EAAkB,SAAS,IAAI,EAAE,sBAAmB,GAAG,EAAE;KAC9D,EACF;IACF;GACD,MAAM;GACN,QAAQ;GACR,SAAS;GACT,gBAAgB,CAAC,oBAAoB,mBAAmB;GACxD,cAAc;GACJ;GACV,EA3BK,EA2BL,EACU,CAAA,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commentAttachmentUploadClient.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/commentAttachmentUploadClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commentAttachmentUploadClient.js","names":[],"sources":["../../../src/planmagnet/comments/commentAttachmentUploadClient.ts"],"sourcesContent":["import { gql, type ApolloClient } from '@apollo/client';\n\n/** The Files service switches from a direct PUT to S3 multipart strictly above 5 MiB. */\nexport const DIRECT_UPLOAD_LIMIT_BYTES = 5 * 1024 * 1024;\nexport const MAX_COMMENT_ATTACHMENT_BYTES = 100 * 1024 * 1024;\nconst MAX_COMPLETION_ATTEMPTS = 3;\nconst FILES_QUOTA_ERROR_CODES = new Set([\n 'QUOTA_EXCEEDED',\n 'QUOTA_EXHAUSTED',\n 'QUOTA_NOT_PROVISIONED',\n]);\n\nconst INITIATE_UPLOAD = gql`\n mutation PlanmagnetCommentInitiateUpload($input: InitiateUploadInput!) {\n initiateUpload(input: $input) {\n session {\n id\n startedById\n status\n uploadType\n partSize\n totalParts\n }\n uploadUrl\n }\n }\n`;\n\nconst PART_UPLOAD_URLS = gql`\n query PlanmagnetCommentPartUploadUrls($sessionId: ID!, $partNumbers: [Int!]!) {\n getBatchPartUploadUrls(sessionId: $sessionId, partNumbers: $partNumbers) {\n partNumber\n url\n }\n }\n`;\n\nconst REGISTER_PART = gql`\n mutation PlanmagnetCommentRegisterUploadedPart($input: UploadPartInput!) {\n registerUploadedPart(input: $input) {\n session {\n id\n status\n uploadedParts\n }\n }\n }\n`;\n\nconst COMPLETE_UPLOAD = gql`\n mutation PlanmagnetCommentCompleteUpload($input: CompleteUploadInput!) {\n completeUpload(input: $input) {\n session {\n status\n }\n file {\n id\n folderId\n visibility\n uploadedById\n }\n }\n }\n`;\n\nconst ABORT_UPLOAD = gql`\n mutation PlanmagnetCommentAbortUpload($sessionId: ID!) {\n abortUpload(sessionId: $sessionId)\n }\n`;\n\nexport interface UploadSession {\n id: string;\n startedById: string;\n status: string;\n uploadType: string;\n partSize: number;\n totalParts: number;\n}\n\ninterface UploadInitiation {\n session: UploadSession | null;\n uploadUrl: string | null;\n}\n\ninterface PresignedPartUrl {\n partNumber: number;\n url: string;\n}\n\ninterface RegisteredPart {\n session: { id: string; status: string; uploadedParts: number } | null;\n}\n\ninterface CompletedUpload {\n session: { status: string } | null;\n file: { id: string; folderId: string | null; visibility: string; uploadedById: string } | null;\n}\n\ninterface PutResult {\n status: number;\n etag: string | null;\n}\n\n/** Injectable, non-React Files protocol; its unit tests run without an Apollo provider or DOM. */\nexport interface CommentAttachmentUploadTransport {\n initiate(\n input: {\n fileName: string;\n fileSize: string;\n mimeType: string;\n extension: string;\n visibility: 'PRIVATE';\n },\n signal: AbortSignal\n ): Promise<UploadInitiation | null>;\n partUrls(\n sessionId: string,\n partNumbers: number[],\n signal: AbortSignal\n ): Promise<PresignedPartUrl[] | null>;\n put(url: string, bytes: Blob, mimeType: string, signal: AbortSignal): Promise<PutResult>;\n registerPart(\n input: { sessionId: string; partNumber: number; etag: string },\n signal: AbortSignal\n ): Promise<RegisteredPart | null>;\n complete(\n input: { sessionId: string; fileSize: string },\n signal: AbortSignal\n ): Promise<CompletedUpload | null>;\n /** Deliberately does not use the canceled PUT's signal: cleanup still needs to reach Files. */\n abort(sessionId: string): Promise<boolean>;\n /** Injectable delay keeps retry tests deterministic. */\n wait?(ms: number, signal: AbortSignal): Promise<void>;\n}\n\n/** Keep only server IDs, not presigned URLs, for a safe retry after an ambiguous completion. */\nexport interface CompletionSession {\n sessionId: string;\n startedById: string;\n fileSize: number;\n}\n\nexport class UploadCompletionUncertainError extends Error {\n constructor(\n readonly session: CompletionSession,\n readonly quotaLimited = false\n ) {\n super(\n quotaLimited\n ? 'Your Files plan limit currently prevents finalizing this attachment. It may already have uploaded; retry after freeing Files capacity or changing your plan, or remove it.'\n : 'The file may have uploaded. Retry finalizing this attachment, or remove it.'\n );\n this.name = 'UploadCompletionUncertainError';\n }\n}\n\nexport class UploadCanceledError extends Error {\n constructor() {\n super('Upload canceled');\n this.name = 'UploadCanceledError';\n }\n}\n\nclass MissingCompletionResponseError extends Error {\n constructor() {\n super('Files did not return a completed attachment');\n this.name = 'MissingCompletionResponseError';\n }\n}\n\nfunction assertNotCanceled(signal: AbortSignal): void {\n if (signal.aborted) throw new UploadCanceledError();\n}\n\n/** Never reflect an object-store or Apollo exception that might contain a signed URL to the UI. */\nexport function commentUploadErrorMessage(error: unknown): string {\n if (error instanceof UploadCompletionUncertainError) return error.message;\n if (error instanceof UploadCanceledError) return error.message;\n const codes = getErrorCodes(error);\n if (codes.some((code) => FILES_QUOTA_ERROR_CODES.has(code))) {\n return 'Your Files plan limit does not allow this upload. Remove it or change your plan before retrying.';\n }\n return 'The attachment could not be uploaded. Retry or remove it.';\n}\n\nfunction getErrorCodes(error: unknown): string[] {\n if (!error || typeof error !== 'object') return [];\n // Apollo v4 exposes `.errors`, v3 uses `.graphQLErrors`; this structural view reads\n // only optional code fields instead of assuming either runtime class is installed.\n const value = error as {\n extensions?: { code?: unknown };\n errors?: ReadonlyArray<{ extensions?: { code?: unknown } }>;\n graphQLErrors?: ReadonlyArray<{ extensions?: { code?: unknown } }>;\n };\n return [\n value.extensions?.code,\n ...(value.errors ?? []).map((entry) => entry.extensions?.code),\n ...(value.graphQLErrors ?? []).map((entry) => entry.extensions?.code),\n ].filter((code): code is string => typeof code === 'string');\n}\n\n/** Retrying only ambiguous gateway/storage failures avoids repeating a definitive quota or auth denial. */\nfunction completionRetryDelay(error: unknown, attempt: number): number | null {\n const codes = getErrorCodes(error);\n if (\n codes.some(\n (code) =>\n FILES_QUOTA_ERROR_CODES.has(code) ||\n [\n 'FORBIDDEN',\n 'UNAUTHENTICATED',\n 'UNAUTHORIZED',\n 'BAD_USER_INPUT',\n 'GRAPHQL_VALIDATION_FAILED',\n 'NOT_FOUND',\n 'CONFLICT',\n ].includes(code)\n )\n )\n return null;\n\n const timeout = codes.some((code) =>\n ['OPERATION_TIMEOUT', 'GATEWAY_TIMEOUT', 'REQUEST_TIMEOUT', 'TIMEOUT'].includes(code)\n );\n\n // Apollo network errors carry HTTP status on different envelopes; inspect the\n // minimal optional shape rather than depending on a particular link implementation.\n const detail =\n error && typeof error === 'object'\n ? (error as {\n statusCode?: number;\n status?: number;\n networkError?: unknown;\n message?: unknown;\n })\n : null;\n const status = detail?.statusCode ?? detail?.status;\n if (status && status >= 400 && status < 500 && status !== 408) return null;\n if (timeout || (status && [408, 504, 524].includes(status)))\n return [10_000, 20_000][attempt - 1] ?? null;\n if (\n error instanceof MissingCompletionResponseError ||\n codes.includes('INTERNAL_SERVER_ERROR') ||\n (status && status >= 500) ||\n detail?.networkError ||\n error instanceof TypeError\n ) {\n return [400, 800][attempt - 1] ?? null;\n }\n if (typeof detail?.message === 'string' && /\\boperation\\s+timed?\\s?out\\b/i.test(detail.message)) {\n return [10_000, 20_000][attempt - 1] ?? null;\n }\n return null;\n}\n\nfunction waitForRetry(ms: number, signal: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal.aborted) {\n reject(new UploadCanceledError());\n return;\n }\n const done = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', canceled);\n resolve();\n };\n const canceled = () => {\n clearTimeout(timer);\n signal.removeEventListener('abort', canceled);\n reject(new UploadCanceledError());\n };\n const timer = setTimeout(done, ms);\n signal.addEventListener('abort', canceled, { once: true });\n });\n}\n\n/** A pure byte-range calculation. Parts are 1-indexed and the final part may be shorter. */\nexport function attachmentPartRange(\n fileSize: number,\n partSize: number,\n partNumber: number\n): { start: number; end: number } {\n if (\n !Number.isSafeInteger(fileSize) ||\n fileSize <= 0 ||\n !Number.isSafeInteger(partSize) ||\n partSize <= 0 ||\n !Number.isSafeInteger(partNumber) ||\n partNumber < 1 ||\n partNumber > Math.ceil(fileSize / partSize)\n ) {\n throw new Error('Invalid attachment part range');\n }\n const start = (partNumber - 1) * partSize;\n return { start, end: Math.min(start + partSize, fileSize) };\n}\n\nfunction isAbsoluteUploadUrl(url: unknown): url is string {\n if (typeof url !== 'string' || !url.trim()) return false;\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'https:' || parsed.protocol === 'http:';\n } catch {\n return false;\n }\n}\n\nfunction validateInitiation(initiation: UploadInitiation | null, size: number): UploadSession {\n const session = initiation?.session;\n if (!session?.id || !session.startedById || session.status !== 'IN_PROGRESS') {\n throw new Error('Files did not start an upload session');\n }\n const expectedType = size <= DIRECT_UPLOAD_LIMIT_BYTES ? 'DIRECT' : 'MULTIPART';\n if (session.uploadType !== expectedType)\n throw new Error('Files returned an unsupported upload type');\n if (expectedType === 'DIRECT' && !isAbsoluteUploadUrl(initiation?.uploadUrl)) {\n throw new Error('Files did not return a direct upload URL');\n }\n if (\n expectedType === 'MULTIPART' &&\n (!Number.isSafeInteger(session.partSize) ||\n session.partSize < DIRECT_UPLOAD_LIMIT_BYTES ||\n !Number.isSafeInteger(session.totalParts) ||\n session.totalParts !== Math.ceil(size / session.partSize))\n ) {\n throw new Error('Files returned an invalid multipart layout');\n }\n return session;\n}\n\nfunction validatePut(result: PutResult, partNumber: number): string;\nfunction validatePut(result: PutResult): string | null;\nfunction validatePut(result: PutResult, partNumber?: number): string | null {\n if (!Number.isInteger(result.status) || result.status < 200 || result.status >= 300) {\n throw new Error(\n partNumber ? `Attachment part ${partNumber} failed to upload` : 'Attachment failed to upload'\n );\n }\n if (partNumber !== undefined && !result.etag?.trim()) {\n throw new Error(`Attachment part ${partNumber} did not return an ETag`);\n }\n // An S3 ETag includes literal double quotes. Do not strip, normalize, or re-hash it.\n return result.etag;\n}\n\n/** Completes only the original session: completeUpload is idempotent server-side. */\nexport async function retryCommentAttachmentCompletion(\n session: CompletionSession,\n transport: CommentAttachmentUploadTransport,\n signal: AbortSignal\n): Promise<string> {\n if (\n !session.sessionId ||\n !session.startedById ||\n !Number.isSafeInteger(session.fileSize) ||\n session.fileSize > MAX_COMMENT_ATTACHMENT_BYTES ||\n session.fileSize < 0\n ) {\n throw new Error('Invalid attachment upload session');\n }\n for (let attempt = 1; attempt <= MAX_COMPLETION_ATTEMPTS; attempt += 1) {\n // A cancellation after completion was attempted cannot safely abort the server\n // session: the first request may already have finalized it.\n if (signal.aborted) throw new UploadCompletionUncertainError(session);\n try {\n const result = await transport.complete(\n { sessionId: session.sessionId, fileSize: String(session.fileSize) },\n signal\n );\n if (!result?.session || !result.file?.id) {\n // A response lost after the service finalized is indistinguishable from an\n // unfinalized session. The server supports repeating this exact mutation.\n throw new MissingCompletionResponseError();\n }\n if (\n result.session.status !== 'FINALIZED' ||\n result.file.folderId !== null ||\n result.file.visibility !== 'PRIVATE' ||\n result.file.uploadedById !== session.startedById\n ) {\n throw new Error('Files did not return the completed private attachment');\n }\n return result.file.id;\n } catch (error) {\n const quotaLimited = getErrorCodes(error).some((code) => FILES_QUOTA_ERROR_CODES.has(code));\n if (signal.aborted || attempt >= MAX_COMPLETION_ATTEMPTS) {\n throw new UploadCompletionUncertainError(session, quotaLimited);\n }\n const delay = completionRetryDelay(error, attempt);\n if (delay === null) throw new UploadCompletionUncertainError(session, quotaLimited);\n try {\n await (transport.wait ?? waitForRetry)(delay, signal);\n } catch {\n throw new UploadCompletionUncertainError(session);\n }\n }\n }\n throw new UploadCompletionUncertainError(session);\n}\n\n/**\n * Private-root uploads only: no shared path, no folderId, and no broad workspace visibility.\n * Once completion has been sent its outcome may be ambiguous; NEVER abort that session (the\n * backend's abortUpload can mark even an already-FINALIZED session ABORTED). Retry completion\n * on the same session instead. Prior failures and canceled PUTs are aborted best-effort.\n */\nexport async function uploadCommentAttachment(\n file: File,\n transport: CommentAttachmentUploadTransport,\n signal: AbortSignal,\n onCompleting?: () => void\n): Promise<string> {\n if (file.size > MAX_COMMENT_ATTACHMENT_BYTES) throw new Error('Attachment exceeds 100 MiB');\n const mimeType = file.type || 'application/octet-stream';\n const extension = file.name.includes('.') ? file.name.slice(file.name.lastIndexOf('.') + 1) : '';\n let sessionId: string | null = null;\n let abortableSession = false;\n let completionStarted = false;\n try {\n assertNotCanceled(signal);\n const initiation = await transport.initiate(\n {\n fileName: file.name,\n fileSize: String(file.size),\n mimeType,\n extension,\n visibility: 'PRIVATE',\n },\n signal\n );\n sessionId = initiation?.session?.id || null;\n // abortUpload is unsafe on an already-FINALIZED session. Only a newly initiated\n // IN_PROGRESS session may be cleaned up after a failed upload.\n abortableSession = initiation?.session?.status === 'IN_PROGRESS';\n assertNotCanceled(signal);\n const session = validateInitiation(initiation, file.size);\n\n if (session.uploadType === 'DIRECT') {\n const url = initiation?.uploadUrl;\n if (!isAbsoluteUploadUrl(url)) throw new Error('Files did not return a direct upload URL');\n validatePut(await transport.put(url, file, mimeType, signal));\n } else {\n for (let partNumber = 1; partNumber <= session.totalParts; partNumber += 1) {\n assertNotCanceled(signal);\n // URLs are fetched just-in-time and matched by partNumber, never by array order.\n const urls = await transport.partUrls(session.id, [partNumber], signal);\n if (\n urls?.length !== 1 ||\n urls[0]?.partNumber !== partNumber ||\n !isAbsoluteUploadUrl(urls[0].url)\n ) {\n throw new Error(`Files did not return the URL for attachment part ${partNumber}`);\n }\n const { start, end } = attachmentPartRange(file.size, session.partSize, partNumber);\n const etag = validatePut(\n await transport.put(urls[0].url, file.slice(start, end), mimeType, signal),\n partNumber\n );\n assertNotCanceled(signal);\n const registered = await transport.registerPart(\n { sessionId: session.id, partNumber, etag },\n signal\n );\n const expectedStatus = partNumber === session.totalParts ? 'COMPLETED' : 'IN_PROGRESS';\n if (\n registered?.session?.id !== session.id ||\n registered.session.status !== expectedStatus ||\n registered.session.uploadedParts !== partNumber\n ) {\n throw new Error(`Files did not register attachment part ${partNumber}`);\n }\n }\n }\n\n assertNotCanceled(signal);\n onCompleting?.();\n completionStarted = true;\n return await retryCommentAttachmentCompletion(\n { sessionId: session.id, startedById: session.startedById, fileSize: file.size },\n transport,\n signal\n );\n } catch (error) {\n if (sessionId && abortableSession && !completionStarted) {\n // The aborted signal is intentionally NOT used here. A failed multipart upload can\n // hold paid storage parts until its session expires if cleanup is skipped.\n try {\n await transport.abort(sessionId);\n } catch {\n /* Expiry cleanup is the fallback. */\n }\n }\n if (signal.aborted && !completionStarted) throw new UploadCanceledError();\n throw error;\n }\n}\n\n/** The host shell owns the Apollo provider (and its workspace/auth headers). */\nexport function createCommentAttachmentUploadTransport(\n client: ApolloClient\n): CommentAttachmentUploadTransport {\n return {\n async initiate(input, signal) {\n const result = await client.mutate<{ initiateUpload: UploadInitiation | null }>({\n mutation: INITIATE_UPLOAD,\n variables: { input },\n context: { fetchOptions: { signal } },\n errorPolicy: 'all',\n });\n if (result.error) throw result.error;\n return result.data?.initiateUpload ?? null;\n },\n async partUrls(sessionId, partNumbers, signal) {\n const result = await client.query<{ getBatchPartUploadUrls: PresignedPartUrl[] | null }>({\n query: PART_UPLOAD_URLS,\n variables: { sessionId, partNumbers },\n context: { fetchOptions: { signal } },\n fetchPolicy: 'no-cache',\n errorPolicy: 'all',\n });\n if (result.error) throw result.error;\n return result.data?.getBatchPartUploadUrls ?? null;\n },\n async put(url, bytes, mimeType, signal) {\n try {\n const result = await fetch(url, {\n method: 'PUT',\n headers: { 'Content-Type': mimeType },\n body: bytes,\n signal,\n credentials: 'omit',\n redirect: 'error',\n });\n return { status: result.status, etag: result.headers.get('ETag') };\n } catch {\n // fetch errors can contain the full signed URL; never display or log one.\n if (signal.aborted) throw new UploadCanceledError();\n throw new Error('Storage PUT failed');\n }\n },\n async registerPart(input, signal) {\n const result = await client.mutate<{ registerUploadedPart: RegisteredPart | null }>({\n mutation: REGISTER_PART,\n variables: { input },\n context: { fetchOptions: { signal } },\n errorPolicy: 'all',\n });\n if (result.error) throw result.error;\n return result.data?.registerUploadedPart ?? null;\n },\n async complete(input, signal) {\n const result = await client.mutate<{ completeUpload: CompletedUpload | null }>({\n mutation: COMPLETE_UPLOAD,\n variables: { input },\n context: { fetchOptions: { signal } },\n errorPolicy: 'all',\n });\n if (result.error) throw result.error;\n return result.data?.completeUpload ?? null;\n },\n async abort(sessionId) {\n const result = await client.mutate<{ abortUpload: boolean }>({\n mutation: ABORT_UPLOAD,\n variables: { sessionId },\n errorPolicy: 'all',\n });\n if (result.error) throw result.error;\n return result.data?.abortUpload === true;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commentImageTokens.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/commentImageTokens.ts"],"names":[],"mappings":"AAEA,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASvF;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGrE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commentImageTokens.js","names":[],"sources":["../../../src/planmagnet/comments/commentImageTokens.ts"],"sourcesContent":["const FILE_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/** Append an image token only for a successfully uploaded Files ID; the server accepts flat alt text. */\nexport function appendImageEmbed(body: string, fileId: string, filename: string): string {\n if (!FILE_ID_PATTERN.test(fileId) || body.includes(`(fileId:${fileId})`)) return body;\n const alt =\n filename\n .replace(/[[\\]\\r\\n]/g, ' ')\n .trim()\n .slice(0, 200) || 'Image';\n const spacer = body && !/\\s$/.test(body) ? '\\n' : '';\n return `${body}${spacer}`;\n}\n\n/** Removing an attached file must also remove any inline references to that same file. */\nexport function removeImageEmbed(body: string, fileId: string): string {\n if (!FILE_ID_PATTERN.test(fileId)) return body;\n return body.replace(new RegExp(`!\\\\[[^\\\\]\\\\n]*\\\\]\\\\(fileId:${fileId}\\\\)`, 'gi'), '');\n}\n"],"mappings":";AAAA,IAAM,IAAkB;AAGxB,SAAgB,EAAiB,GAAc,GAAgB,GAA0B;AACvF,KAAI,CAAC,EAAgB,KAAK,EAAO,IAAI,EAAK,SAAS,WAAW,EAAO,GAAG,CAAE,QAAO;CACjF,IAAM,IACJ,EACG,QAAQ,cAAc,IAAI,CAC1B,MAAM,CACN,MAAM,GAAG,IAAI,IAAI;AAEtB,QAAO,GAAG,IADK,KAAQ,CAAC,MAAM,KAAK,EAAK,GAAG,OAAO,GAC1B,IAAI,EAAI,WAAW,EAAO;;AAIpD,SAAgB,EAAiB,GAAc,GAAwB;AAErE,QADK,EAAgB,KAAK,EAAO,GAC1B,EAAK,QAAY,OAAO,8BAA8B,EAAO,MAAM,KAAK,EAAE,GAAG,GAD1C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commentTokens.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/commentTokens.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AA6EtC,yGAAyG;AACzG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAsGhE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commentTokens.js","names":[],"sources":["../../../src/planmagnet/comments/commentTokens.ts"],"sourcesContent":["export type CommentToken =\n | { kind: 'text'; value: string }\n | { kind: 'mention'; name: string; actorId: string }\n | { kind: 'image'; alt: string; fileId: string }\n | { kind: 'link'; text: string; url: string }\n | { kind: 'inline-code'; value: string }\n | { kind: 'code-block'; value: string }\n | { kind: 'bold'; value: string }\n | { kind: 'italic'; value: string };\n\nconst IMAGE_TARGET_RE = /^fileId:([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;\nconst HTTPS_URL_RE = /^https:\\/\\/[^\\s<>\"'`]+$/i;\nconst FENCED_CODE_RE = /```([\\s\\S]{0,4000}?)```/y;\nconst INLINE_CODE_RE = /`([^`\\n]{1,500})`/y;\nconst BOLD_RE = /\\*\\*([^\\n]{1,1000}?)\\*\\*/y;\nconst ITALIC_STAR_RE = /\\*([^\\n*]{1,1000}?)\\*/y;\nconst ITALIC_UNDERSCORE_RE = /_([^\\n_]{1,1000}?)_/y;\n\ninterface ClosingPairs {\n brackets: Int32Array;\n parens: Int32Array;\n}\n\n// The server uses balanced bracket/paren matching rather than stopping at the first ')' in a URL.\n// Pair every delimiter once so malformed or deeply nested text remains linear on every read, not\n// quadratic in the number of '[' characters (comments are read far more often than they are saved).\nfunction closingPairs(text: string): ClosingPairs {\n const brackets = new Int32Array(text.length).fill(-1);\n const parens = new Int32Array(text.length).fill(-1);\n const bracketStack: number[] = [];\n const parenStack: number[] = [];\n\n for (let index = 0; index < text.length; index += 1) {\n const char = text[index];\n if (char === '\\n') {\n bracketStack.length = 0;\n parenStack.length = 0;\n } else if (char === '[') {\n bracketStack.push(index);\n } else if (char === ']') {\n const open = bracketStack.pop();\n if (open !== undefined) brackets[open] = index;\n } else if (char === '(') {\n parenStack.push(index);\n } else if (char === ')') {\n const open = parenStack.pop();\n if (open !== undefined) parens[open] = index;\n }\n }\n\n return { brackets, parens };\n}\n\ninterface BracketParenSpan {\n label: string;\n url: string;\n end: number;\n flat: boolean;\n}\n\nfunction bracketParenSpan(\n text: string,\n open: number,\n pairs: ClosingPairs\n): BracketParenSpan | null {\n const labelClose = pairs.brackets[open];\n if (labelClose < 0 || text[labelClose + 1] !== '(') return null;\n const parenOpen = labelClose + 1;\n const parenClose = pairs.parens[parenOpen];\n if (parenClose < 0) return null;\n const label = text.slice(open + 1, labelClose);\n const url = text.slice(parenOpen + 1, parenClose);\n return {\n label,\n url,\n end: parenClose + 1,\n flat: !/[[\\]]/.test(label) && !/[[\\]]/.test(url),\n };\n}\n\nfunction execAt(re: RegExp, text: string, index: number): RegExpExecArray | null {\n re.lastIndex = index;\n return re.exec(text);\n}\n\n/** Parse only the server's six safe token shapes. Rejected or malformed candidates remain plain text. */\nexport function tokenizeCommentBody(text: string): CommentToken[] {\n const tokens: CommentToken[] = [];\n const pairs = closingPairs(text);\n let index = 0;\n let textStart = 0;\n\n const flush = (end: number) => {\n if (end > textStart) tokens.push({ kind: 'text', value: text.slice(textStart, end) });\n };\n const accept = (token: CommentToken, end: number) => {\n flush(index);\n tokens.push(token);\n index = end;\n textStart = end;\n };\n\n while (index < text.length) {\n const char = text[index];\n\n if (char === '@' && text[index + 1] === '[') {\n const span = bracketParenSpan(text, index + 1, pairs);\n if (span) {\n if (span.flat && span.label && span.url.trim()) {\n accept({ kind: 'mention', name: span.label, actorId: span.url.trim() }, span.end);\n } else {\n index = span.end;\n }\n continue;\n }\n }\n\n if (char === '!' && text[index + 1] === '[') {\n const span = bracketParenSpan(text, index + 1, pairs);\n if (span) {\n const fileId = span.flat ? IMAGE_TARGET_RE.exec(span.url.trim())?.[1] : undefined;\n if (fileId) {\n accept({ kind: 'image', alt: span.label, fileId }, span.end);\n } else {\n index = span.end;\n }\n continue;\n }\n }\n\n if (char === '[') {\n const span = bracketParenSpan(text, index, pairs);\n if (span) {\n const url = span.url.trim();\n if (span.flat && HTTPS_URL_RE.test(url)) {\n accept({ kind: 'link', text: span.label || url, url }, span.end);\n } else {\n index = span.end;\n }\n continue;\n }\n }\n\n if (char === '`' && text.startsWith('```', index)) {\n const match = execAt(FENCED_CODE_RE, text, index);\n if (match) {\n accept({ kind: 'code-block', value: match[1] }, index + match[0].length);\n continue;\n }\n }\n\n if (char === '`') {\n const match = execAt(INLINE_CODE_RE, text, index);\n if (match) {\n accept({ kind: 'inline-code', value: match[1] }, index + match[0].length);\n continue;\n }\n }\n\n if (char === '*' && text[index + 1] === '*') {\n const match = execAt(BOLD_RE, text, index);\n if (match) {\n accept({ kind: 'bold', value: match[1] }, index + match[0].length);\n continue;\n }\n }\n\n if (char === '*') {\n const match = execAt(ITALIC_STAR_RE, text, index);\n if (match) {\n accept({ kind: 'italic', value: match[1] }, index + match[0].length);\n continue;\n }\n }\n\n if (char === '_') {\n const match = execAt(ITALIC_UNDERSCORE_RE, text, index);\n if (match) {\n accept({ kind: 'italic', value: match[1] }, index + match[0].length);\n continue;\n }\n }\n\n index += 1;\n }\n\n flush(text.length);\n return tokens;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fileDisplay.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/fileDisplay.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C;;;;;;;;;;;GAWG;AAEH;oFACoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED;;qBAEqB;AACrB,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,SAAS,SAA+C,GACvD,YAAY,CAgBd"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fileDisplay.js","names":[],"sources":["../../../src/planmagnet/comments/fileDisplay.tsx"],"sourcesContent":["import {\n FileArchive,\n FileAudio,\n FileCode2,\n FileSpreadsheet,\n FileText,\n FileVideo,\n File as FileGenericIcon,\n Image as ImageIcon,\n} from 'lucide-react';\nimport type { ReactElement } from 'react';\n\n/**\n * Shared display helpers for CWF-12 comment attachments (and the pending attachments still uploading in the\n * composer) — byte-count formatting and a mime-type → icon mapping, used by `CommentAttachments.tsx` (posted\n * attachments) and `CommentAttachmentUpload.tsx` (files queued/uploading before the comment is posted).\n *\n * `mimeTypeIcon` returns the icon ELEMENT directly (never a component reference picked by a lookup and then\n * rendered as a JSX tag, e.g. `const Icon = ...; <Icon/>`) — `react-hooks/static-components` (this repo's\n * eslint config enables the full React Compiler rule set) rejects that shape outright, on the reasoning that a\n * JSX tag resolved from a value computed during render cannot be proven stable across renders. Returning the\n * element from a plain call (`{mimeTypeIcon(type)}`) sidesteps the rule entirely — it's never a JSX tag, just an\n * ordinary value embedded in the tree, same as any other expression child.\n */\n\n/** `1536` -> `\"1.5 KB\"`. Binary (1024) units, one decimal place under 10 of a unit, whole otherwise — matches the\n * precision wspace-files-svc's own file browser shows elsewhere in the platform. */\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes <= 0) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const exp = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n if (exp === 0) return `${bytes} B`;\n const value = bytes / 1024 ** exp;\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[exp]}`;\n}\n\n/** A representative icon for a comment attachment's snapshotted `mimeType` — purely decorative (chips always\n * also show the real file name), so an unrecognized type falls back to a generic file glyph rather than\n * guessing wrong. */\nexport function mimeTypeIcon(\n mimeType: string,\n className = 'h-3.5 w-3.5 shrink-0 text-muted-foreground'\n): ReactElement {\n const type = mimeType.toLowerCase();\n if (type.startsWith('image/')) return <ImageIcon className={className} aria-hidden=\"true\" />;\n if (type.startsWith('video/')) return <FileVideo className={className} aria-hidden=\"true\" />;\n if (type.startsWith('audio/')) return <FileAudio className={className} aria-hidden=\"true\" />;\n if (type === 'application/pdf') return <FileText className={className} aria-hidden=\"true\" />;\n if (type.includes('spreadsheet') || type.includes('csv') || type.includes('excel')) {\n return <FileSpreadsheet className={className} aria-hidden=\"true\" />;\n }\n if (type.includes('zip') || type.includes('compressed') || type.includes('tar')) {\n return <FileArchive className={className} aria-hidden=\"true\" />;\n }\n if (type.startsWith('text/') || type.includes('json') || type.includes('xml')) {\n return <FileCode2 className={className} aria-hidden=\"true\" />;\n }\n return <FileGenericIcon className={className} aria-hidden=\"true\" />;\n}\n"],"mappings":";;;AA2BA,SAAgB,EAAY,GAAuB;AACjD,KAAI,CAAC,OAAO,SAAS,EAAM,IAAI,KAAS,EAAG,QAAO;CAClD,IAAM,IAAQ;EAAC;EAAK;EAAM;EAAM;EAAM;EAAK,EACrC,IAAM,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,EAAM,GAAG,KAAK,IAAI,KAAK,CAAC,EAAE,EAAM,SAAS,EAAE;AACpF,KAAI,MAAQ,EAAG,QAAO,GAAG,EAAM;CAC/B,IAAM,IAAQ,IAAQ,QAAQ;AAC9B,QAAO,GAAG,IAAQ,KAAK,EAAM,QAAQ,EAAE,GAAG,KAAK,MAAM,EAAM,CAAC,GAAG,EAAM;;AAMvE,SAAgB,EACd,GACA,IAAY,8CACE;CACd,IAAM,IAAO,EAAS,aAAa;AAcnC,QAbI,EAAK,WAAW,SAAS,GAAS,kBAAC,GAAD;EAAsB;EAAW,eAAY;EAAS,CAAA,GACxF,EAAK,WAAW,SAAS,GAAS,kBAAC,GAAD;EAAsB;EAAW,eAAY;EAAS,CAAA,GACxF,EAAK,WAAW,SAAS,GAAS,kBAAC,GAAD;EAAsB;EAAW,eAAY;EAAS,CAAA,GACxF,MAAS,oBAA0B,kBAAC,GAAD;EAAqB;EAAW,eAAY;EAAS,CAAA,GACxF,EAAK,SAAS,cAAc,IAAI,EAAK,SAAS,MAAM,IAAI,EAAK,SAAS,QAAQ,GACzE,kBAAC,GAAD;EAA4B;EAAW,eAAY;EAAS,CAAA,GAEjE,EAAK,SAAS,MAAM,IAAI,EAAK,SAAS,aAAa,IAAI,EAAK,SAAS,MAAM,GACtE,kBAAC,GAAD;EAAwB;EAAW,eAAY;EAAS,CAAA,GAE7D,EAAK,WAAW,QAAQ,IAAI,EAAK,SAAS,OAAO,IAAI,EAAK,SAAS,MAAM,GACpE,kBAAC,GAAD;EAAsB;EAAW,eAAY;EAAS,CAAA,GAExD,kBAAC,GAAD;EAA4B;EAAW,eAAY;EAAS,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCommentFileUrl.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/comments/useCommentFileUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAqB,MAAM,gBAAgB,CAAC;AAI3E,gGAAgG;AAChG,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAwBhC;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAgB,iBAAiB,aAGpB,iBAAiB,gBAAgB,MAAM,qBAInD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCommentFileUrl.js","names":[],"sources":["../../../src/planmagnet/comments/useCommentFileUrl.ts"],"sourcesContent":["import { gql, type ApolloClient, type DocumentNode } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { useCallback } from 'react';\n\n/** The target is explicit: project, doc and work-item readers have different RBAC resources. */\nexport type CommentFileTarget =\n | { type: 'WORK_ITEM'; id: string }\n | { type: 'PROJECT'; id: string }\n | { type: 'DOC'; id: string };\n\nconst WORK_ITEM_URL = gql`\n mutation PlanmagnetWorkItemCommentAttachmentUrl($targetId: ID!, $attachmentId: ID!) {\n planmagnetWorkItemCommentAttachmentUrl(workItemId: $targetId, attachmentId: $attachmentId)\n }\n`;\nconst PROJECT_URL = gql`\n mutation PlanmagnetProjectCommentAttachmentUrl($targetId: ID!, $attachmentId: ID!) {\n planmagnetProjectCommentAttachmentUrl(projectId: $targetId, attachmentId: $attachmentId)\n }\n`;\nconst DOC_URL = gql`\n mutation PlanmagnetDocCommentAttachmentUrl($targetId: ID!, $attachmentId: ID!) {\n planmagnetDocCommentAttachmentUrl(docId: $targetId, attachmentId: $attachmentId)\n }\n`;\n\nconst QUERIES: Record<CommentFileTarget['type'], { document: DocumentNode; field: string }> = {\n WORK_ITEM: { document: WORK_ITEM_URL, field: 'planmagnetWorkItemCommentAttachmentUrl' },\n PROJECT: { document: PROJECT_URL, field: 'planmagnetProjectCommentAttachmentUrl' },\n DOC: { document: DOC_URL, field: 'planmagnetDocCommentAttachmentUrl' },\n};\n\n/**\n * A Files URL is a short-lived bearer credential. Never resolve one while rendering a list, and never let\n * Apollo or the gateway cache an expired URL. These operations are Mutations precisely so the gateway's\n * optional query-response cache cannot replay a URL without rerunning the reader check. The product resolver\n * validates the attachment row and current reader before issuing a fresh Files delegation.\n */\nexport async function requestCommentFileUrl(\n client: ApolloClient,\n target: CommentFileTarget,\n attachmentId: string\n): Promise<string> {\n const operation = QUERIES[target.type];\n const result = await client.mutate<Record<string, string>>({\n mutation: operation.document,\n variables: { targetId: target.id, attachmentId },\n fetchPolicy: 'no-cache',\n errorPolicy: 'none',\n });\n const value = result.data?.[operation.field];\n if (typeof value !== 'string' || !value) throw new Error('The attachment is unavailable.');\n try {\n if (new URL(value).protocol === 'https:') return value;\n } catch {\n // Fail closed on a malformed URL; never put it in a link or image source.\n }\n throw new Error('The attachment URL is unavailable.');\n}\n\nexport function useCommentFileUrl() {\n const client = useApolloClient();\n return useCallback(\n (target: CommentFileTarget, attachmentId: string) =>\n requestCommentFileUrl(client, target, attachmentId),\n [client]\n );\n}\n"],"mappings":";;;;AAUA,IAAM,IAAgB,CAAG;;;;GAKnB,IAAc,CAAG;;;;GAKjB,IAAU,CAAG;;;;GAMb,IAAwF;CAC5F,WAAW;EAAE,UAAU;EAAe,OAAO;EAA0C;CACvF,SAAS;EAAE,UAAU;EAAa,OAAO;EAAyC;CAClF,KAAK;EAAE,UAAU;EAAS,OAAO;EAAqC;CACvE;AAQD,eAAsB,EACpB,GACA,GACA,GACiB;CACjB,IAAM,IAAY,EAAQ,EAAO,OAO3B,KANS,MAAM,EAAO,OAA+B;EACzD,UAAU,EAAU;EACpB,WAAW;GAAE,UAAU,EAAO;GAAI;GAAc;EAChD,aAAa;EACb,aAAa;EACd,CAAC,EACmB,OAAO,EAAU;AACtC,KAAI,OAAO,KAAU,YAAY,CAAC,EAAO,OAAU,MAAM,iCAAiC;AAC1F,KAAI;AACF,MAAI,IAAI,IAAI,EAAM,CAAC,aAAa,SAAU,QAAO;SAC3C;AAGR,OAAU,MAAM,qCAAqC;;AAGvD,SAAgB,IAAoB;CAClC,IAAM,IAAS,GAAiB;AAChC,QAAO,GACJ,GAA2B,MAC1B,EAAsB,GAAQ,GAAQ,EAAa,EACrD,CAAC,EAAO,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AutomationRuleControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/AutomationRuleControls.tsx"],"names":[],"mappings":"AAuBA;;;;GAIG;AAEH,eAAO,MAAM,uBAAuB,UAA+C,CAAC;AA0BpF;6FAC6F;AAC7F,wBAAgB,0BAA0B,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,2CAyChG;AAED,wBAAgB,0BAA0B,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,2CAsC5F;AAcD;8GAC8G;AAC9G,wBAAgB,uBAAuB,CAAC,EACtC,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CA4GA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AutomationRuleControls.js","names":[],"sources":["../../../src/planmagnet/controls/AutomationRuleControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Badge,\n Button,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n Switch,\n} from '@burdenoff/fe-libs/ui';\nimport { Play, Trash2 } from 'lucide-react';\nimport { WorkItemSearchSelect } from './Pickers';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { isForbidden, mutationErrorMessage } from '../utils/graphqlErrors';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { splitExecutionErrors } from '../automation/automationRuleTypes';\n\n/**\n * Automation rule controls (BOFF-8047): enable/disable, delete and \"run now\". Every automation rule row and its\n * detail page carry these — before this, `planmagnetToggleAutomationRule`, `planmagnetDeleteAutomationRule` and\n * `planmagnetExecuteAutomationRule` were real, prod-verified mutations with no UI trigger anywhere.\n */\n\nexport const AUTOMATION_RULE_QUERIES = ['AutomationRulesList', 'GetAutomationRule'];\n\nconst TOGGLE = gql`\n mutation AutomationRuleControlsToggle($id: ID!, $status: PlanmagnetAutomationStatus!) {\n planmagnetToggleAutomationRule(id: $id, status: $status) {\n id\n status\n }\n }\n`;\nconst DELETE = gql`\n mutation AutomationRuleControlsDelete($id: ID!) {\n planmagnetDeleteAutomationRule(id: $id)\n }\n`;\nconst EXECUTE = gql`\n mutation AutomationRuleControlsExecute($id: ID!, $triggerData: JSON) {\n planmagnetExecuteAutomationRule(id: $id, triggerData: $triggerData) {\n id\n status\n errorMessage\n result\n }\n }\n`;\n\n/** ACTIVE <-> PAUSED. A rule stuck in DISABLED or ERROR is re-activated by turning this on; the raw status is\n * shown alongside so a paused-by-error rule is never confused with a manually paused one. */\nexport function AutomationRuleStatusSwitch({ ruleId, status }: { ruleId: string; status: string }) {\n const [toggle, { loading }] = useMutation(TOGGLE, {\n refetchQueries: AUTOMATION_RULE_QUERIES,\n });\n const [error, setError] = useState<string | null>(null);\n const active = status === 'ACTIVE';\n\n const onChange = async (checked: boolean) => {\n setError(null);\n try {\n await throwOnError(\n toggle({ variables: { id: ruleId, status: checked ? 'ACTIVE' : 'PAUSED' } })\n );\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'Your role can view automation rules but not change them.'\n : mutationErrorMessage(e, 'The rule could not be changed.')\n );\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <div className=\"flex items-center gap-2\">\n {status !== 'ACTIVE' && status !== 'PAUSED' && (\n <Badge variant={status === 'ERROR' ? 'destructive' : 'secondary'}>\n {status.toLowerCase()}\n </Badge>\n )}\n <Switch\n aria-label={active ? 'Active — turn off to pause' : 'Paused — turn on to activate'}\n data-testid=\"automation-rule-toggle\"\n checked={active}\n disabled={loading}\n onCheckedChange={(checked) => void onChange(checked)}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\nexport function AutomationRuleDeleteButton({ ruleId, name }: { ruleId: string; name: string }) {\n const navigate = usePlanMagnetNavigate();\n const [remove, { loading }] = useMutation(DELETE, {\n refetchQueries: AUTOMATION_RULE_QUERIES.filter((q) => q !== 'GetAutomationRule'),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: ruleId } }));\n navigate('/automation/automation-rules-page');\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'Your role can view automation rules but not delete them.'\n : mutationErrorMessage(e, 'The rule could not be deleted.')\n );\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete \"${name}\"?`}\n description=\"The rule stops running and its history stays as a record. This cannot be undone here.\"\n confirmLabel=\"Delete rule\"\n destructive\n disabled={loading}\n onConfirm={() => void onDelete()}\n />\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\ninterface ExecuteResult {\n status: string;\n errorMessage: string | null;\n}\n\nconst OUTCOME_VARIANT: Record<string, 'success' | 'warning' | 'destructive' | 'secondary'> = {\n SUCCESS: 'success',\n PARTIAL_FAILURE: 'warning',\n FAILURE: 'destructive',\n SKIPPED: 'secondary',\n};\n\n/** Runs a rule against one chosen work item — works for a rule of ANY trigger type, including the ones that\n * cannot fire on their own (see automationRuleTypes.ts). Always records an outcome, including a non-match. */\nexport function RunAutomationRuleDialog({\n ruleId,\n projectId,\n}: {\n ruleId: string;\n projectId?: string;\n}) {\n const [open, setOpen] = useState(false);\n const [workItemId, setWorkItemId] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [outcome, setOutcome] = useState<ExecuteResult | null>(null);\n const [execute, { loading }] = useMutation<{ planmagnetExecuteAutomationRule: ExecuteResult }>(\n EXECUTE,\n {\n refetchQueries: ['AutomationExecutionsForRule', ...AUTOMATION_RULE_QUERIES],\n awaitRefetchQueries: true,\n }\n );\n\n const run = async () => {\n if (!workItemId) return;\n setError(null);\n setOutcome(null);\n try {\n const result = await throwOnError(\n execute({ variables: { id: ruleId, triggerData: { workItemId } } })\n );\n const execution = result.data?.planmagnetExecuteAutomationRule ?? null;\n setOutcome(execution);\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'Your role can view automation rules but not run them.'\n : mutationErrorMessage(e, 'The rule could not be run.')\n );\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) {\n setWorkItemId('');\n setError(null);\n setOutcome(null);\n }\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"automation-run-now\">\n <Play className=\"mr-1 h-4 w-4\" />\n Run now\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Run this rule now</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Evaluates the rule's conditions against one work item and, if they match,\n dispatches its actions for real. The outcome is recorded below and in Recent executions\n either way.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"automation-run-work-item\" className=\"text-sm font-medium\">\n Work item\n </label>\n <div className=\"mt-1\">\n <WorkItemSearchSelect\n id=\"automation-run-work-item\"\n projectId={projectId}\n value={workItemId}\n onChange={setWorkItemId}\n />\n </div>\n </div>\n {error && <ErrorLine message={error} />}\n {outcome && (\n <div role=\"status\" className=\"rounded-md border p-3 text-sm space-y-1\">\n <Badge variant={OUTCOME_VARIANT[outcome.status] ?? 'secondary'}>\n {outcome.status.toLowerCase().replace('_', ' ')}\n </Badge>\n {outcome.errorMessage && (\n <ul className=\"space-y-0.5\">\n {splitExecutionErrors(outcome.errorMessage).map((line, i) => (\n <li\n key={i}\n className={\n outcome.status === 'SUCCESS' ? 'text-muted-foreground' : 'text-destructive'\n }\n >\n {line}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n </div>\n <ResponsiveDialogFooter>\n <Button\n onClick={() => void run()}\n disabled={!workItemId || loading}\n data-testid=\"automation-run-submit\"\n >\n {loading ? 'Running…' : 'Run'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CompetitorControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/CompetitorControls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CompetitorControls.js","names":[],"sources":["../../../src/planmagnet/controls/CompetitorControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2, X, Plus } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { CompetitorSearchSelect } from './Pickers';\n\n/**\n * Competitor controls (BOFF-8047). Competitors were `api-only` — full CRUD plus link/unlink onto a feature\n * request existed in the service, bundled with `planmagnet-feature` RBAC (CORRECTIONS.md B), but had zero\n * routes and no write UI: the feature request detail page could only ever display what was already linked.\n */\n\nconst COMPETITOR_QUERIES = ['ListCompetitors', 'GetCompetitor', 'GetCompetitorForEdit'];\n\nconst DELETE = gql`\n mutation CompetitorControlsDelete($id: ID!) {\n planmagnetDeleteCompetitor(id: $id)\n }\n`;\n\nexport function CompetitorHeaderActions({\n competitorId,\n name,\n}: {\n competitorId: string;\n name: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: COMPETITOR_QUERIES.filter((q) => q !== 'GetCompetitor'),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: competitorId } }));\n navigate('/products/competitors-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The competitor could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"competitor-edit\"\n onClick={() => navigate(detailPath('/products/edit-competitor-page', competitorId))}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete ${name}?`}\n description=\"The competitor is deleted and unlinked from every feature request that referenced it. This cannot be undone here.\"\n confirmLabel=\"Delete competitor\"\n destructive\n disabled={removeState.loading}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\nconst LINK = gql`\n mutation CompetitorLinkCardLink($input: PlanmagnetLinkCompetitorInput!) {\n planmagnetLinkCompetitorToFeature(input: $input) {\n id\n competitors {\n id\n name\n description\n website\n }\n }\n }\n`;\nconst UNLINK = gql`\n mutation CompetitorLinkCardUnlink($input: PlanmagnetLinkCompetitorInput!) {\n planmagnetUnlinkCompetitorFromFeature(input: $input) {\n id\n competitors {\n id\n name\n description\n website\n }\n }\n }\n`;\n\ninterface CompetitorNode {\n id: string;\n name: string;\n description: string | null;\n website: string | null;\n}\n\n/**\n * The feature request detail page's competitor section: list what is linked, remove any of them, and add\n * another from the workspace's competitor directory (or create a new one there).\n */\nexport function CompetitorLinkCard({\n featureRequestId,\n competitors,\n}: {\n featureRequestId: string;\n competitors: CompetitorNode[];\n}) {\n const navigate = usePlanMagnetNavigate();\n const [addCompetitorId, setAddCompetitorId] = useState('');\n const [link, linkState] = useMutation(LINK);\n const [unlink, unlinkState] = useMutation(UNLINK);\n const [error, setError] = useState<string | null>(null);\n const busy = linkState.loading || unlinkState.loading;\n\n const onAdd = async () => {\n if (!addCompetitorId) return;\n setError(null);\n try {\n await throwOnError(\n link({\n variables: { input: { featureRequestId, competitorId: addCompetitorId } },\n })\n );\n setAddCompetitorId('');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The competitor could not be linked.');\n }\n };\n const onRemove = async (competitorId: string) => {\n setError(null);\n try {\n await throwOnError(unlink({ variables: { input: { featureRequestId, competitorId } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The competitor could not be removed.');\n }\n };\n\n return (\n <div className=\"space-y-3\">\n {competitors.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No competitors linked yet.</p>\n )}\n {competitors.map((comp) => (\n <div key={comp.id} className=\"flex items-start justify-between gap-2 rounded-md border p-3\">\n <button\n type=\"button\"\n className=\"flex-1 text-left\"\n onClick={() => navigate(detailPath('/products/competitor-detail-page', comp.id))}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium hover:underline underline-offset-2\">\n {comp.name}\n </span>\n {comp.website && <span className=\"text-xs text-primary\">{comp.website}</span>}\n </div>\n {comp.description && (\n <p className=\"text-xs text-muted-foreground mt-1\">{comp.description}</p>\n )}\n </button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove ${comp.name} from this feature`}\n disabled={busy}\n onClick={() => void onRemove(comp.id)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <div className=\"flex items-start gap-2 pt-2 border-t\">\n <div className=\"flex-1\">\n <CompetitorSearchSelect\n id=\"feature-add-competitor\"\n value={addCompetitorId}\n onChange={setAddCompetitorId}\n exclude={competitors.map((c) => c.id)}\n />\n </div>\n <Button size=\"sm\" disabled={!addCompetitorId || busy} onClick={() => void onAdd()}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Add\n </Button>\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => navigate('/products/create-competitor-page')}\n >\n <Plus className=\"mr-1 h-4 w-4\" />\n New competitor\n </Button>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n// ─── Strengths / weaknesses / pricing / features (PRM-31) ─────────────────────\n\n/**\n * Mirrors feature.service.ts#assertCompetitorStringList / #assertCompetitorJsonField — the service's own\n * caps for Competitor.strengths/weaknesses (20 items, 200 characters each) and .pricing/.features (20 KB of\n * UTF-8 bytes each). Enforced here too so a refusal is rare, but the service is still the real gate: whatever\n * message it sends back on a refusal is surfaced verbatim (see `mutationErrorMessage`), never replaced by a\n * generic one.\n */\nexport const COMPETITOR_LIST_MAX_ITEMS = 20;\nexport const COMPETITOR_LIST_ITEM_MAX_LENGTH = 200;\nexport const COMPETITOR_JSON_FIELD_MAX_BYTES = 20_000;\n\n/** Actual UTF-8 byte count, not `.length` (UTF-16 code units) — the same distinction\n * feature.service.ts#assertCompetitorJsonField draws (see its own \"UTF-8 byte cap\" fix). */\nexport function utf8ByteLength(value: string): number {\n return new TextEncoder().encode(value).length;\n}\n\nexport function competitorListValid(values: string[]): boolean {\n return (\n values.length <= COMPETITOR_LIST_MAX_ITEMS &&\n values.every((v) => v.length <= COMPETITOR_LIST_ITEM_MAX_LENGTH)\n );\n}\n\n/** Blank rows are an editing affordance, never a meaningful entry — dropped before the value is sent. */\nexport function cleanStringList(values: string[]): string[] {\n return values.map((v) => v.trim()).filter(Boolean);\n}\n\n/**\n * Add/remove editor for one of Competitor.strengths/weaknesses. A row over the per-entry character cap is\n * flagged inline; the count against the item cap is always visible, not only once it is hit.\n */\nexport function StringListEditor({\n label,\n values,\n onChange,\n disabled = false,\n placeholder,\n testId,\n}: {\n label: string;\n values: string[];\n onChange: (next: string[]) => void;\n disabled?: boolean;\n placeholder?: string;\n testId?: string;\n}) {\n const atMax = values.length >= COMPETITOR_LIST_MAX_ITEMS;\n return (\n <div className=\"space-y-2\" data-testid={testId}>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-medium\">{label}</label>\n <span className=\"text-xs text-muted-foreground\">\n {values.length}/{COMPETITOR_LIST_MAX_ITEMS}\n </span>\n </div>\n {values.length === 0 && <p className=\"text-xs text-muted-foreground\">None added yet.</p>}\n <ul className=\"space-y-1.5\">\n {values.map((value, index) => {\n const tooLong = value.length > COMPETITOR_LIST_ITEM_MAX_LENGTH;\n return (\n <li key={index} className=\"flex items-start gap-2\">\n <div className=\"flex-1\">\n <Input\n value={value}\n placeholder={placeholder}\n disabled={disabled}\n aria-invalid={tooLong}\n data-testid={testId ? `${testId}-input-${index}` : undefined}\n onChange={(e) => {\n const next = [...values];\n next[index] = e.target.value;\n onChange(next);\n }}\n />\n {tooLong && (\n <p className=\"mt-0.5 text-xs text-destructive\">\n {value.length} / {COMPETITOR_LIST_ITEM_MAX_LENGTH} characters — too long.\n </p>\n )}\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove ${label} row ${index + 1}`}\n disabled={disabled}\n onClick={() => onChange(values.filter((_, i) => i !== index))}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </li>\n );\n })}\n </ul>\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={disabled || atMax}\n data-testid={testId ? `${testId}-add` : undefined}\n onClick={() => onChange([...values, ''])}\n >\n <Plus className=\"mr-1 h-4 w-4\" />\n Add {label.toLowerCase()}\n </Button>\n {atMax && (\n <p className=\"text-xs text-muted-foreground\">Up to {COMPETITOR_LIST_MAX_ITEMS} entries.</p>\n )}\n </div>\n );\n}\n\nexport type JsonRowType = 'string' | 'number' | 'boolean' | 'json';\n\nexport interface JsonKeyValueRow {\n key: string;\n type: JsonRowType;\n /** Raw text either way — parsed per `type` only at the point a row list is turned back into JSON.\n * Ignored for `type: 'json'` rows: they write back `raw` instead (see jsonRowsToObject), never a\n * re-parse of this displayed text. */\n value: string;\n /** Only present on a `type: 'json'` row: the original nested object/array/null value, exactly as\n * loaded. This editor can only ever WRITE flat string/number/boolean values (see JsonKeyValueEditor),\n * so a value shaped like this is carried through untouched rather than folded into a flattened string\n * the moment any OTHER row in the same editor changes. */\n raw?: unknown;\n}\n\n/** A `Competitor.pricing`/`.features` value (already-saved JSON) back into editable rows. Any array/object-\n * shaped value (not produced by this editor, since it only ever writes flat string/number/boolean values) is\n * carried through as a `type: 'json'` row — rendered read-only (see JsonKeyValueEditor) and written back\n * verbatim via `raw` (see jsonRowsToObject) — so the editor never discards data it cannot represent, and\n * never silently flattens it into a string either; it only refuses to let a NEW row be shaped that way. */\nexport function jsonToRows(json: unknown): JsonKeyValueRow[] {\n if (!json || typeof json !== 'object' || Array.isArray(json)) return [];\n return Object.entries(json as Record<string, unknown>).map(([key, value]) => {\n if (typeof value === 'number') return { key, type: 'number', value: String(value) };\n if (typeof value === 'boolean') return { key, type: 'boolean', value: String(value) };\n if (typeof value === 'string') return { key, type: 'string', value };\n // Object/array/null — not a shape this editor's own rows can produce.\n return { key, type: 'json', value: JSON.stringify(value, null, 2), raw: value };\n });\n}\n\n/** A `type: 'number'` row with a real key but no usable number — blank, or non-numeric text pasted in.\n * Used to BLOCK save (see jsonRowsValid) and to flag the row inline; never silently coerced to 0. */\nexport function jsonRowHasInvalidNumber(row: JsonKeyValueRow): boolean {\n if (row.type !== 'number' || !row.key.trim()) return false;\n const trimmed = row.value.trim();\n return trimmed === '' || Number.isNaN(Number(trimmed));\n}\n\n/** Trimmed keys repeated across rows — Object.fromEntries silently keeps only the last one (see\n * jsonRowsToObject). Flagged inline in the editor so that trade-off is never invisible to whoever is\n * editing; not a save-blocking condition. */\nexport function jsonDuplicateKeys(rows: JsonKeyValueRow[]): Set<string> {\n const counts = new Map<string, number>();\n for (const row of rows) {\n const key = row.key.trim();\n if (!key) continue;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n const duplicates = new Set<string>();\n for (const [key, count] of counts) if (count > 1) duplicates.add(key);\n return duplicates;\n}\n\nexport function jsonRowsToObject(rows: JsonKeyValueRow[]): Record<string, unknown> | null {\n const entries: [string, unknown][] = [];\n for (const row of rows) {\n const key = row.key.trim();\n if (!key) continue;\n if (row.type === 'json') {\n // Read-only passthrough (see jsonToRows) — never re-derived from `row.value`'s displayed JSON text,\n // so this row can't be corrupted by edits to any other row in the same editor.\n entries.push([key, row.raw]);\n } else if (row.type === 'number') {\n if (jsonRowHasInvalidNumber(row)) continue; // invalid — jsonRowsValid already blocks save on this\n entries.push([key, Number(row.value.trim())]);\n } else if (row.type === 'boolean') {\n entries.push([key, row.value === 'true']);\n } else {\n entries.push([key, row.value]);\n }\n }\n // Later rows win on a repeated key (Object.fromEntries' own semantics) — the same \"last one wins\" rule a\n // hand-written JSON object would follow. jsonDuplicateKeys() flags this inline so it's never silent.\n return entries.length === 0 ? null : Object.fromEntries(entries);\n}\n\nexport function jsonRowsByteLength(rows: JsonKeyValueRow[]): number {\n const obj = jsonRowsToObject(rows);\n return obj ? utf8ByteLength(JSON.stringify(obj)) : 0;\n}\n\nexport function jsonRowsValid(rows: JsonKeyValueRow[]): boolean {\n return (\n jsonRowsByteLength(rows) <= COMPETITOR_JSON_FIELD_MAX_BYTES &&\n !rows.some(jsonRowHasInvalidNumber)\n );\n}\n\n/**\n * Key/value row editor for one of Competitor.pricing/.features — never free-form JSON text (no `eval`, no\n * raw-text JSON box a typo could silently turn into a parse error at save time). Each row's value is typed\n * (text / number / yes-no) so the object sent to the server is built from real strings/numbers/booleans, the\n * only value shapes `PlanmagnetCreateCompetitorInput.pricing`/`.features` are documented to need.\n */\nexport function JsonKeyValueEditor({\n label,\n rows,\n onChange,\n disabled = false,\n testId,\n}: {\n label: string;\n rows: JsonKeyValueRow[];\n onChange: (next: JsonKeyValueRow[]) => void;\n disabled?: boolean;\n testId?: string;\n}) {\n const byteLength = jsonRowsByteLength(rows);\n const overCap = byteLength > COMPETITOR_JSON_FIELD_MAX_BYTES;\n const maxKb = COMPETITOR_JSON_FIELD_MAX_BYTES / 1000;\n const duplicateKeys = jsonDuplicateKeys(rows);\n return (\n <div className=\"space-y-2\" data-testid={testId}>\n <div className=\"flex items-center justify-between\">\n <label className=\"text-sm font-medium\">{label}</label>\n <span className={`text-xs ${overCap ? 'text-destructive' : 'text-muted-foreground'}`}>\n {(byteLength / 1000).toFixed(1)} / {maxKb} KB\n </span>\n </div>\n {rows.length === 0 && <p className=\"text-xs text-muted-foreground\">No rows added yet.</p>}\n <ul className=\"space-y-1.5\">\n {rows.map((row, index) => {\n const trimmedKey = row.key.trim();\n const isDuplicate = trimmedKey !== '' && duplicateKeys.has(trimmedKey);\n\n // Nested object/array value this editor cannot represent as a typed row — rendered read-only\n // (key, shape and value are all locked) so touching it can only ever remove it, never flatten\n // it into a string (see jsonToRows / jsonRowsToObject).\n if (row.type === 'json') {\n return (\n <li key={index} className=\"flex items-start gap-2\">\n <Input\n className=\"flex-1\"\n value={row.key}\n readOnly\n disabled\n aria-label={`${label} key ${index + 1} (nested value, view only)`}\n />\n <div className=\"flex-[2] space-y-1\">\n <p className=\"text-xs text-muted-foreground\">\n Nested value — view only, not editable here.\n </p>\n <textarea\n className=\"w-full rounded-md border border-input bg-muted px-2 py-1.5 font-mono text-xs\"\n value={row.value}\n readOnly\n rows={Math.min(8, row.value.split('\\n').length)}\n aria-label={`${label} value ${index + 1} (nested, view only)`}\n />\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove ${label} row ${index + 1}`}\n disabled={disabled}\n onClick={() => onChange(rows.filter((_, i) => i !== index))}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </li>\n );\n }\n\n const invalidNumber = jsonRowHasInvalidNumber(row);\n return (\n <li key={index} className=\"flex items-start gap-2\">\n <div className=\"flex-1\">\n <Input\n placeholder=\"Key\"\n aria-label={`${label} key ${index + 1}`}\n aria-invalid={isDuplicate}\n value={row.key}\n disabled={disabled}\n onChange={(e) => {\n const next = [...rows];\n next[index] = { ...row, key: e.target.value };\n onChange(next);\n }}\n />\n {isDuplicate && (\n <p className=\"mt-0.5 text-xs text-status-warning-text\">\n Repeated key — only the last “{trimmedKey}” row is saved.\n </p>\n )}\n </div>\n <select\n aria-label={`${label} value type ${index + 1}`}\n className=\"rounded-md border border-input bg-background px-2 py-2 text-sm disabled:opacity-60\"\n value={row.type}\n disabled={disabled}\n onChange={(e) => {\n const next = [...rows];\n next[index] = { ...row, type: e.target.value as JsonRowType };\n onChange(next);\n }}\n >\n <option value=\"string\">Text</option>\n <option value=\"number\">Number</option>\n <option value=\"boolean\">Yes/No</option>\n </select>\n <div className=\"flex-1\">\n {row.type === 'boolean' ? (\n <select\n aria-label={`${label} value ${index + 1}`}\n className=\"w-full rounded-md border border-input bg-background px-2 py-2 text-sm disabled:opacity-60\"\n value={row.value === 'true' ? 'true' : 'false'}\n disabled={disabled}\n onChange={(e) => {\n const next = [...rows];\n next[index] = { ...row, value: e.target.value };\n onChange(next);\n }}\n >\n <option value=\"true\">Yes</option>\n <option value=\"false\">No</option>\n </select>\n ) : (\n <Input\n type={row.type === 'number' ? 'number' : 'text'}\n placeholder=\"Value\"\n aria-label={`${label} value ${index + 1}`}\n aria-invalid={invalidNumber}\n value={row.value}\n disabled={disabled}\n onChange={(e) => {\n const next = [...rows];\n next[index] = { ...row, value: e.target.value };\n onChange(next);\n }}\n />\n )}\n {invalidNumber && (\n <p className=\"mt-0.5 text-xs text-destructive\">Enter a number.</p>\n )}\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove ${label} row ${index + 1}`}\n disabled={disabled}\n onClick={() => onChange(rows.filter((_, i) => i !== index))}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </li>\n );\n })}\n </ul>\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={disabled}\n data-testid={testId ? `${testId}-add` : undefined}\n onClick={() => onChange([...rows, { key: '', type: 'string', value: '' }])}\n >\n <Plus className=\"mr-1 h-4 w-4\" />\n Add row\n </Button>\n {overCap && (\n <ErrorLine message={`${label} is larger than ${maxKb} KB. Trim it and try again.`} />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmButton.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/ConfirmButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAcvC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,IAAI,EACJ,KAAK,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,WAAmB,EACnB,OAAmB,EACnB,WAAuB,EACvB,SAAS,EACT,MAAM,GACP,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,2CAoCA;AAED,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,2CAMzD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmButton.js","names":[],"sources":["../../../src/planmagnet/controls/ConfirmButton.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n Button,\n} from '@burdenoff/fe-libs/ui';\n\n/**\n * A button that asks before it acts. Used for anything that cannot be undone from the UI (complete or cancel a\n * sprint, delete a task, a project or a roadmap).\n */\nexport function ConfirmButton({\n label,\n icon,\n title,\n description,\n confirmLabel,\n onConfirm,\n disabled,\n destructive = false,\n variant = 'default',\n cancelLabel = 'Keep it',\n ariaLabel,\n testId,\n}: {\n label: string;\n icon: ReactNode;\n title: string;\n description: string;\n confirmLabel: string;\n onConfirm: () => void;\n disabled: boolean;\n destructive?: boolean;\n variant?: 'default' | 'outline';\n cancelLabel?: string;\n /** Required when `label` is empty (an icon-only button): icons are aria-hidden. */\n ariaLabel?: string;\n /** `data-testid` on the trigger button, for callers that need one addressable from a test. */\n testId?: string;\n}) {\n return (\n <AlertDialog>\n <AlertDialogTrigger asChild>\n <Button\n size=\"sm\"\n variant={variant}\n disabled={disabled}\n aria-label={ariaLabel}\n data-testid={testId}\n >\n {icon}\n {label}\n </Button>\n </AlertDialogTrigger>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{description}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>{cancelLabel}</AlertDialogCancel>\n <AlertDialogAction\n onClick={onConfirm}\n className={\n destructive\n ? 'bg-destructive text-destructive-foreground hover:bg-destructive/90'\n : ''\n }\n >\n {confirmLabel}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n\n/** An inline refusal reason, announced to screen readers. */\nexport function ErrorLine({ message }: { message: string }) {\n return (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {message}\n </p>\n );\n}\n"],"mappings":";;;AAkBA,SAAgB,EAAc,EAC5B,UACA,SACA,UACA,gBACA,iBACA,cACA,aACA,iBAAc,IACd,aAAU,WACV,iBAAc,WACd,cACA,aAgBC;AACD,QACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;EAAoB,SAAA;YAClB,kBAAC,GAAD;GACE,MAAK;GACI;GACC;GACV,cAAY;GACZ,eAAa;aALf,CAOG,GACA,EACM;;EACU,CAAA,EACrB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAmB,GAAyB,CAAA,EAC5C,kBAAC,GAAD,EAAA,UAAyB,GAAqC,CAAA,CAC5C,EAAA,CAAA,EACpB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAoB,GAAgC,CAAA,EACpD,kBAAC,GAAD;EACE,SAAS;EACT,WACE,IACI,uEACA;YAGL;EACiB,CAAA,CACF,EAAA,CAAA,CACD,EAAA,CAAA,CACT,EAAA,CAAA;;AAKlB,SAAgB,EAAU,EAAE,cAAgC;AAC1D,QACE,kBAAC,KAAD;EAAG,MAAK;EAAQ,WAAU;YACvB;EACC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFieldControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/CustomFieldControls.tsx"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH,eAAO,MAAM,kBAAkB,mHAYrB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,MAAyB,CAAC;AAE9E,4DAA4D;AAC5D,eAAO,MAAM,YAAY,aAAsC,CAAC;AAEhE,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,UAAyD,CAAC;AAE3F,eAAO,MAAM,gCAAgC,gCAoB5C,CAAC;AAEF,eAAO,MAAM,8BAA8B,gCAM1C,CAAC;AAEF,eAAO,MAAM,8BAA8B,gCAS1C,CAAC;AAEF,eAAO,MAAM,8BAA8B,gCAI1C,CAAC;AAEF,eAAO,MAAM,sBAAsB,gCAQlC,CAAC;AAEF,eAAO,MAAM,yBAAyB,gCAIrC,CAAC;AAEF;4EAC4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAWxD;AAED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CASvD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFieldControls.js","names":[],"sources":["../../../src/planmagnet/controls/CustomFieldControls.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { enumLabel } from './WorkItemControls';\n\n/**\n * Custom fields (BOFF-8047, BUILD_PLAN capability register `api-only` → UI). Definitions describe extra,\n * project-specific data on a work item; values are what a task actually holds for each definition. The register\n * warns value writes skip type validation server-side — this UI still asks for the right shaped input per type\n * (a number field, a date picker, the definition's own options, …), it just cannot rely on the server to refuse a\n * malformed one, so a raw JSON editor is offered only for the JSON type, where \"whatever the admin entered\" is the\n * point.\n */\n\nexport const CUSTOM_FIELD_TYPES = [\n 'TEXT',\n 'NUMBER',\n 'DATE',\n 'BOOLEAN',\n 'SELECT',\n 'MULTI_SELECT',\n 'URL',\n 'EMAIL',\n 'USER',\n 'LABEL',\n 'JSON',\n] as const;\nexport type CustomFieldType = (typeof CUSTOM_FIELD_TYPES)[number];\n\nexport const customFieldTypeLabel = (type: string): string => enumLabel(type);\n\n/** Types whose definition needs a fixed list of choices. */\nexport const OPTION_TYPES = new Set(['SELECT', 'MULTI_SELECT']);\n\nexport interface CustomFieldDefinitionSummary {\n id: string;\n projectId: string;\n name: string;\n description: string | null;\n fieldType: string;\n isRequired: boolean;\n options: unknown;\n sortOrder: number;\n}\n\nexport interface CustomFieldValueSummary {\n id: string;\n definitionId: string;\n value: unknown;\n}\n\n/** Every query that lists a project's custom field definitions, or a work item's values. */\nexport const CUSTOM_FIELD_QUERIES = ['ProjectCustomFieldDefinitions', 'GetWorkItemDetail'];\n\nexport const PROJECT_CUSTOM_FIELD_DEFINITIONS = gql`\n query ProjectCustomFieldDefinitions($workspaceId: ID!, $projectId: String) {\n planmagnetCustomFieldDefinitions(\n workspaceId: $workspaceId\n filter: { projectId: $projectId }\n pagination: { first: 100 }\n ) {\n items {\n id\n projectId\n name\n description\n fieldType\n isRequired\n options\n sortOrder\n }\n totalCount\n }\n }\n`;\n\nexport const CREATE_CUSTOM_FIELD_DEFINITION = gql`\n mutation CustomFieldDefinitionCreate($input: PlanmagnetCreateCustomFieldDefinitionInput!) {\n planmagnetCreateCustomFieldDefinition(input: $input) {\n id\n }\n }\n`;\n\nexport const UPDATE_CUSTOM_FIELD_DEFINITION = gql`\n mutation CustomFieldDefinitionUpdate(\n $id: ID!\n $input: PlanmagnetUpdateCustomFieldDefinitionInput!\n ) {\n planmagnetUpdateCustomFieldDefinition(id: $id, input: $input) {\n id\n }\n }\n`;\n\nexport const DELETE_CUSTOM_FIELD_DEFINITION = gql`\n mutation CustomFieldDefinitionDelete($id: ID!) {\n planmagnetDeleteCustomFieldDefinition(id: $id)\n }\n`;\n\nexport const SET_CUSTOM_FIELD_VALUE = gql`\n mutation CustomFieldValueSet($input: PlanmagnetSetCustomFieldValueInput!) {\n planmagnetSetCustomFieldValue(input: $input) {\n id\n definitionId\n value\n }\n }\n`;\n\nexport const REMOVE_CUSTOM_FIELD_VALUE = gql`\n mutation CustomFieldValueRemove($definitionId: ID!, $workItemId: ID!) {\n planmagnetRemoveCustomFieldValue(definitionId: $definitionId, workItemId: $workItemId)\n }\n`;\n\n/** `options` is stored as free-form JSON; this UI always writes a plain string array, but reads defensively in\n * case something else ever wrote a list of {label,value}-shaped objects. */\nexport function optionStrings(options: unknown): string[] {\n if (!Array.isArray(options)) return [];\n return options.map((o) => {\n if (typeof o === 'string') return o;\n if (o && typeof o === 'object') {\n const rec = o as Record<string, unknown>;\n const candidate = rec.label ?? rec.value ?? rec.name ?? rec.id;\n if (typeof candidate === 'string') return candidate;\n }\n return String(o);\n });\n}\n\n/** Parses the \"one per line\" textarea used to edit a SELECT/MULTI_SELECT definition's options. */\nexport function parseOptionLines(text: string): string[] {\n return [\n ...new Set(\n text\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n ),\n ];\n}\n"],"mappings":";;;AAYA,IAAa,IAAqB;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EAGY,KAAwB,MAAyB,EAAU,EAAK,EAGhE,IAAe,IAAI,IAAI,CAAC,UAAU,eAAe,CAAC,EAoBlD,IAAuB,CAAC,iCAAiC,oBAAoB,EAE7E,IAAmC,CAAG;;;;;;;;;;;;;;;;;;;;GAsBtC,IAAiC,CAAG;;;;;;GAQpC,IAAiC,CAAG;;;;;;;;;GAWpC,IAAiC,CAAG;;;;GAMpC,IAAyB,CAAG;;;;;;;;GAU5B,IAA4B,CAAG;;;;;AAQ5C,SAAgB,EAAc,GAA4B;AAExD,QADK,MAAM,QAAQ,EAAQ,GACpB,EAAQ,KAAK,MAAM;AACxB,MAAI,OAAO,KAAM,SAAU,QAAO;AAClC,MAAI,KAAK,OAAO,KAAM,UAAU;GAC9B,IAAM,IAAM,GACN,IAAY,EAAI,SAAS,EAAI,SAAS,EAAI,QAAQ,EAAI;AAC5D,OAAI,OAAO,KAAc,SAAU,QAAO;;AAE5C,SAAO,OAAO,EAAE;GAChB,GATkC,EAAE;;AAaxC,SAAgB,EAAiB,GAAwB;AACvD,QAAO,CACL,GAAG,IAAI,IACL,EACG,MAAM,KAAK,CACX,KAAK,MAAS,EAAK,MAAM,CAAC,CAC1B,OAAO,QAAQ,CACnB,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFieldValuesPanel.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/CustomFieldValuesPanel.tsx"],"names":[],"mappings":"AAUA,OAAO,EAOL,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAyZ/B,wBAAgB,iBAAiB,CAAC,EAChC,UAAU,EACV,SAAS,EACT,MAAM,GACP,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,uBAAuB,EAAE,CAAC;CACnC,2CA+CA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFieldValuesPanel.js","names":[],"sources":["../../../src/planmagnet/controls/CustomFieldValuesPanel.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { Button, Card, CardContent, CardHeader, CardTitle, Input } from '@burdenoff/fe-libs/ui';\nimport { ListPlus } from 'lucide-react';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { throwOnError } from '../utils/mutationResult';\nimport { ErrorLine } from './ConfirmButton';\nimport { useAssigneeOptions } from './WorkItemControls';\nimport { PersonName } from '../people/People';\nimport {\n CUSTOM_FIELD_QUERIES,\n PROJECT_CUSTOM_FIELD_DEFINITIONS,\n REMOVE_CUSTOM_FIELD_VALUE,\n SET_CUSTOM_FIELD_VALUE,\n optionStrings,\n type CustomFieldDefinitionSummary,\n type CustomFieldValueSummary,\n} from './CustomFieldControls';\n\n/**\n * A task's custom field values (BOFF-8047, capability register: Custom fields, `api-only`). The definitions come\n * from the task's own project; a value is only ever shown/edited for a definition the project still has. Every\n * write goes through `planmagnetSetCustomFieldValue` / `planmagnetRemoveCustomFieldValue` — the same fields\n * `WorkItem.customFieldValues` reads back (BOFF-7704/7839 follow-up) — and a refusal is shown, never swallowed\n * (fe-libs `errorPolicy: 'all'` resolves a failed mutation instead of rejecting it).\n */\n\nconst mutationOptions = {\n refetchQueries: CUSTOM_FIELD_QUERIES,\n awaitRefetchQueries: true,\n} as const;\n\nfunction useValueMutations(workItemId: string) {\n const [set, setState] = useMutation(SET_CUSTOM_FIELD_VALUE, mutationOptions);\n const [remove, removeState] = useMutation(REMOVE_CUSTOM_FIELD_VALUE, mutationOptions);\n const [error, setError] = useState<string | null>(null);\n\n // Returns whether the write actually landed: fe-libs `errorPolicy: 'all'` resolves a refused mutation\n // instead of rejecting it, so callers that need to know \"did this really save\" (not just \"did we ask\n // the server\") must read this return value rather than assume the awaited promise settling means success.\n const save = async (definitionId: string, value: unknown): Promise<boolean> => {\n setError(null);\n try {\n await throwOnError(set({ variables: { input: { definitionId, workItemId, value } } }));\n return true;\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The value could not be saved.');\n return false;\n }\n };\n const clear = async (definitionId: string): Promise<boolean> => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { definitionId, workItemId } }));\n return true;\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The value could not be cleared.');\n return false;\n }\n };\n return { save, clear, saving: setState.loading || removeState.loading, error };\n}\n\nconst fieldClass =\n 'w-full rounded-md border border-input bg-background px-3 py-2 text-sm disabled:opacity-60';\n\n/** A single definition's row: its current value (if any) and the control to change it. */\nfunction CustomFieldRow({\n workItemId,\n definition,\n value,\n}: {\n workItemId: string;\n definition: CustomFieldDefinitionSummary;\n value: CustomFieldValueSummary | undefined;\n}) {\n const { save, clear, saving, error } = useValueMutations(workItemId);\n const isSet = value !== undefined;\n const testId = `custom-field-value-${definition.id}`;\n\n return (\n <div className=\"space-y-1.5 border-b pb-3 last:border-0 last:pb-0\" data-testid={testId}>\n <div className=\"flex items-center justify-between gap-2\">\n <label htmlFor={testId} className=\"text-sm font-medium\">\n {definition.name}\n {definition.isRequired && <span className=\"text-destructive\"> *</span>}\n </label>\n {isSet && (\n <button\n type=\"button\"\n className=\"text-xs text-muted-foreground hover:underline disabled:opacity-60\"\n disabled={saving}\n onClick={() => void clear(definition.id)}\n >\n Clear\n </button>\n )}\n </div>\n {definition.description && (\n <p className=\"text-xs text-muted-foreground\">{definition.description}</p>\n )}\n <CustomFieldControl\n id={testId}\n definition={definition}\n value={value?.value}\n saving={saving}\n onSave={(next) => {\n // `PlanmagnetSetCustomFieldValueInput.value` is `JSON!` (non-null) in production — a control\n // clearing itself back to empty (the DATE input's native × button with no Save gate, or Save on\n // an emptied text/number/JSON field) must route through the REMOVE mutation instead, exactly\n // like the \"Clear\" link above. Nothing to remove when the row was never set — a no-op, not a\n // delete-not-found, and there was nothing to fail, so it reports success.\n if (next === null || next === undefined) {\n return isSet ? clear(definition.id) : Promise.resolve(true);\n }\n return save(definition.id, next);\n }}\n />\n {!isSet && <p className=\"text-xs text-muted-foreground\">Not set.</p>}\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/** The input for one field, shaped by `fieldType`. Selects/booleans/users save on change; free text needs a\n * Save button so a keystroke never fires a request. */\nfunction CustomFieldControl({\n id,\n definition,\n value,\n saving,\n onSave,\n}: {\n id: string;\n definition: CustomFieldDefinitionSummary;\n value: unknown;\n saving: boolean;\n onSave: (value: unknown) => Promise<boolean>;\n}) {\n const type = definition.fieldType;\n\n if (type === 'BOOLEAN') {\n const checked = value === true;\n return (\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n id={id}\n type=\"checkbox\"\n checked={checked}\n disabled={saving}\n onChange={(e) => void onSave(e.target.checked)}\n />\n {checked ? 'Yes' : 'No'}\n </label>\n );\n }\n\n if (type === 'SELECT') {\n const options = optionStrings(definition.options);\n const current = typeof value === 'string' ? value : '';\n const all = current && !options.includes(current) ? [current, ...options] : options;\n return (\n <select\n id={id}\n className={fieldClass}\n value={current}\n disabled={saving}\n onChange={(e) => {\n if (e.target.value) void onSave(e.target.value);\n }}\n >\n <option value=\"\">Choose…</option>\n {all.map((o) => (\n <option key={o} value={o}>\n {o}\n </option>\n ))}\n </select>\n );\n }\n\n if (type === 'MULTI_SELECT') {\n const options = optionStrings(definition.options);\n const current = Array.isArray(value)\n ? value.filter((v): v is string => typeof v === 'string')\n : [];\n const all = [...new Set([...options, ...current])];\n const toggle = (option: string) => {\n const next = current.includes(option)\n ? current.filter((o) => o !== option)\n : [...current, option];\n void onSave(next);\n };\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1\">\n {all.map((o) => (\n <label key={o} className=\"flex items-center gap-1.5 text-sm\">\n <input\n type=\"checkbox\"\n checked={current.includes(o)}\n disabled={saving}\n onChange={() => toggle(o)}\n />\n {o}\n </label>\n ))}\n {all.length === 0 && (\n <span className=\"text-sm text-muted-foreground\">No options configured.</span>\n )}\n </div>\n );\n }\n\n if (type === 'USER') {\n const current = typeof value === 'string' ? value : '';\n return <UserFieldControl id={id} value={current} disabled={saving} onSave={onSave} />;\n }\n\n if (type === 'DATE') {\n // Value is stored raw (the register: value writes skip type validation) — this UI always writes an\n // ISO date-only string, the shape every other date field in this app sends.\n const current = typeof value === 'string' ? value.slice(0, 10) : '';\n return (\n <Input\n id={id}\n type=\"date\"\n disabled={saving}\n value={current}\n onChange={(e) => void onSave(e.target.value || null)}\n />\n );\n }\n\n if (type === 'NUMBER') {\n return (\n <FreeTextControl\n id={id}\n inputType=\"number\"\n initial={typeof value === 'number' ? String(value) : ''}\n saving={saving}\n onSave={(text) => {\n const trimmed = text.trim();\n if (trimmed === '') return onSave(null);\n const n = Number(trimmed);\n return Number.isFinite(n) ? onSave(n) : Promise.resolve(false);\n }}\n invalid={(text) => text.trim() !== '' && !Number.isFinite(Number(text.trim()))}\n invalidMessage=\"Enter a number.\"\n />\n );\n }\n\n if (type === 'JSON') {\n return (\n <FreeTextControl\n id={id}\n multiline\n initial={value === undefined ? '' : JSON.stringify(value, null, 2)}\n saving={saving}\n onSave={(text) => {\n const trimmed = text.trim();\n if (trimmed === '') return onSave(null);\n try {\n return onSave(JSON.parse(trimmed));\n } catch {\n return Promise.resolve(false);\n }\n }}\n invalid={(text) => {\n const trimmed = text.trim();\n if (trimmed === '') return false;\n try {\n JSON.parse(trimmed);\n return false;\n } catch {\n return true;\n }\n }}\n invalidMessage=\"That is not valid JSON.\"\n />\n );\n }\n\n // TEXT, URL, EMAIL, LABEL and anything future: a plain line of text.\n return (\n <FreeTextControl\n id={id}\n inputType={type === 'URL' ? 'url' : type === 'EMAIL' ? 'email' : 'text'}\n initial={typeof value === 'string' ? value : ''}\n saving={saving}\n onSave={(text) => onSave(text.trim() === '' ? null : text.trim())}\n invalid={() => false}\n invalidMessage=\"\"\n />\n );\n}\n\n/** A user-id value: the workspace directory picker used elsewhere (BOFF-7946), '' clears the value. */\nfunction UserFieldControl({\n id,\n value,\n disabled,\n onSave,\n}: {\n id: string;\n value: string;\n disabled: boolean;\n onSave: (value: unknown) => Promise<boolean>;\n}) {\n const { options, loading } = useAssigneeOptions(value || null);\n return (\n <div className=\"flex flex-col gap-1\">\n <select\n id={id}\n className={fieldClass}\n value={value}\n disabled={disabled}\n onChange={(e) => {\n if (e.target.value) void onSave(e.target.value);\n }}\n >\n <option value=\"\">Choose a member…</option>\n {options.map((o) => (\n <option key={o.id} value={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n {value && (\n <p className=\"text-xs text-muted-foreground\">\n Currently <PersonName id={value} />\n </p>\n )}\n {loading && options.length === 0 && (\n <span className=\"text-xs text-muted-foreground\">Loading members…</span>\n )}\n </div>\n );\n}\n\n/** Text/number/JSON entry: local draft state so typing never fires a request, an explicit Save button so\n * one does fire exactly once. */\nfunction FreeTextControl({\n id,\n initial,\n saving,\n onSave,\n invalid,\n invalidMessage,\n multiline = false,\n inputType = 'text',\n}: {\n id: string;\n initial: string;\n saving: boolean;\n onSave: (text: string) => Promise<boolean>;\n invalid: (text: string) => boolean;\n invalidMessage: string;\n multiline?: boolean;\n inputType?: string;\n}) {\n const [draft, setDraft] = useState(initial);\n const [lastSaved, setLastSaved] = useState(initial);\n // Tracks the in-flight commit separately from the parent's `saving` (the mutation's own loading state):\n // it covers the gap between clicking Save and that loading flag actually flipping true, so a second click\n // can never fire a duplicate request.\n const [committing, setCommitting] = useState(false);\n // The definition's own value changed under us (a save completed, or another editor's did): pick it up,\n // but only while this control has no unsaved edit of its own.\n if (initial !== lastSaved && draft === lastSaved) {\n setDraft(initial);\n setLastSaved(initial);\n }\n const dirty = draft !== lastSaved;\n const bad = invalid(draft);\n\n const commit = async () => {\n if (!dirty || bad || committing) return;\n setCommitting(true);\n try {\n // Only a CONFIRMED success may mark the draft as saved. fe-libs resolves a refused mutation instead\n // of rejecting it (errorPolicy: 'all'), so `await onSave(draft)` alone settling is not success — the\n // Save button must stay enabled (and the draft stay in the box) until `onSave` reports `true`, or a\n // refusal would look saved while the write never landed.\n const ok = await onSave(draft);\n if (ok) setLastSaved(draft);\n } finally {\n setCommitting(false);\n }\n };\n\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex gap-2\">\n {multiline ? (\n <textarea\n id={id}\n className={`${fieldClass} min-h-[96px] font-mono text-xs`}\n value={draft}\n disabled={saving}\n onChange={(e) => setDraft(e.target.value)}\n />\n ) : (\n <Input\n id={id}\n type={inputType}\n className=\"flex-1\"\n value={draft}\n disabled={saving}\n onChange={(e) => setDraft(e.target.value)}\n />\n )}\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={!dirty || bad || saving || committing}\n onClick={() => void commit()}\n >\n {saving || committing ? 'Saving…' : 'Save'}\n </Button>\n </div>\n {bad && <ErrorLine message={invalidMessage} />}\n </div>\n );\n}\n\nexport function CustomFieldsPanel({\n workItemId,\n projectId,\n values,\n}: {\n workItemId: string;\n projectId: string;\n values: CustomFieldValueSummary[];\n}) {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const { data, loading, error } = useQuery<{\n planmagnetCustomFieldDefinitions: { items: CustomFieldDefinitionSummary[] };\n }>(PROJECT_CUSTOM_FIELD_DEFINITIONS, {\n variables: { workspaceId: workspaceId ?? '', projectId },\n skip: !workspaceId || !projectId,\n });\n const definitions = [...(data?.planmagnetCustomFieldDefinitions.items ?? [])].sort(\n (a, b) => a.sortOrder - b.sortOrder || a.name.localeCompare(b.name)\n );\n const byDefinition = new Map(values.map((v) => [v.definitionId, v]));\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0\">\n <CardTitle>Custom Fields</CardTitle>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => navigate(detailPath('/projects/project-custom-fields-page', projectId))}\n >\n <ListPlus className=\"mr-1 h-4 w-4\" />\n Manage fields\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {/* Only before the first load: a refetch (any value save) must not blank every other field's state. */}\n {loading && !data && <p className=\"text-sm text-muted-foreground\">Loading…</p>}\n {error && <ErrorLine message={error.message} />}\n {data && definitions.length === 0 && (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"custom-fields-panel-empty\">\n This project has no custom fields yet.\n </p>\n )}\n {definitions.map((def) => (\n <CustomFieldRow\n key={def.id}\n workItemId={workItemId}\n definition={def}\n value={byDefinition.get(def.id)}\n />\n ))}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/FeatureControls.tsx"],"names":[],"mappings":"AA6CA;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,wGAQnB,CAAC;AAEX,6EAA6E;AAC7E,eAAO,MAAM,eAAe,UAQ3B,CAAC;AAkDF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,2CAmD5F;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,mGAAmG;IACnG,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gGAAgG;IAChG,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,2CA4E3E;AA+SD,wBAAgB,yBAAyB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,2CAiKhF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureControls.js","names":[],"sources":["../../../src/planmagnet/controls/FeatureControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { BarChart3, Pencil, ThumbsUp, Trash2 } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { mutationErrorMessage } from '../utils/graphqlErrors';\nimport { parseIntField } from '../utils/formValidation';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { ProjectSelect, WorkItemSearchSelect } from './Pickers';\nimport { enumLabel } from './WorkItemControls';\nimport {\n PrioritizationScoreFields,\n QuadrantBadge,\n RiceScoreFields,\n kanoLabel,\n moscowLabel,\n prioritizationScoresValid,\n riceInputsValid,\n riceScoreMissingHint,\n type PrioritizationFormValues,\n type RiceFormValues,\n} from './PrioritizationControls';\nimport {\n AnonymousSubmissionCheckbox,\n FeedbackFields,\n type FeedbackFormValues,\n} from './FeedbackControls';\n\n/**\n * Feature request controls (BOFF-7951/7963). Feature requests were read-only: no vote, no status change after\n * creation, no edit or delete — so every UI-created request stayed at 0 votes and its creation status, and the\n * Declined/Duplicate tabs could only ever be empty.\n */\n\nexport const FEATURE_STATUSES = [\n 'SUBMITTED',\n 'UNDER_REVIEW',\n 'PLANNED',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'DECLINED',\n 'DUPLICATE',\n] as const;\n\n/** Every query that shows a feature request, its votes or feature counts. */\nexport const FEATURE_QUERIES = [\n 'GetFeatureRequest',\n 'ListFeatureRequests',\n 'ListFeatureRequestsForProduct',\n 'ListFeatureRequestsForProducts',\n 'ListAllFeaturesAnalytics',\n 'GetFeatureRequestAnalytics',\n 'ReleaseCustomerRequests',\n];\n\nconst VOTE = gql`\n mutation FeatureControlsVote($id: ID!, $input: PlanmagnetVoteOnFeatureInput) {\n planmagnetVoteOnFeature(featureRequestId: $id, input: $input) {\n id\n isAnonymous\n }\n }\n`;\nconst UNVOTE = gql`\n mutation FeatureControlsUnvote($id: ID!) {\n planmagnetRemoveFeatureVote(featureRequestId: $id)\n }\n`;\nconst UPDATE = gql`\n mutation FeatureControlsUpdate($id: ID!, $input: PlanmagnetUpdateFeatureRequestInput!) {\n planmagnetUpdateFeatureRequest(id: $id, input: $input) {\n id\n title\n description\n status\n businessValue\n effortEstimate\n projectId\n workItemId\n moscow\n kano\n valueScore\n effortScore\n valueEffortQuadrant\n reach\n impact\n confidence\n riceScore\n rating\n category\n isAnonymous\n submittedBy\n }\n }\n`;\nconst DELETE = gql`\n mutation FeatureControlsDelete($id: ID!) {\n planmagnetDeleteFeatureRequest(id: $id)\n }\n`;\n\nconst options = { refetchQueries: FEATURE_QUERIES, awaitRefetchQueries: true };\n\n/**\n * Vote for a request, or take your vote back. CWF-15: an unvoted caller can choose \"Vote anonymously\" (its own\n * `FeatureVote.isAnonymous`, independent of the parent request's own anonymity) before casting — the checkbox\n * only makes sense while deciding how to vote, so it disappears once a vote exists (unvoting needs no choice).\n *\n * `voted` (from the parent's `votes.some(v => v.voterId === currentUser.id)`) is unreliable right after an\n * anonymous vote: the schema redacts `FeatureVote.voterId` to `\"anonymous\"` for a non-moderator caller's own\n * anonymous vote (no self carve-out), so once `FEATURE_QUERIES` refetches, that comparison flips back to\n * false even though the vote exists. Track this session's own vote/unvote outcome locally and prefer it over\n * the (possibly-redacted) server-derived value, so the button and the anonymous checkbox stay correct. The\n * caller remounts this component on feature change (`key={feature.id}`) rather than this resetting the\n * override itself in an effect, matching React's own \"adjust state when a prop changes\" guidance — no\n * cascading-render setState-in-effect, and no one-render-behind reset.\n */\nexport function FeatureVoteButton({ featureId, voted }: { featureId: string; voted: boolean }) {\n const [vote, voteState] = useMutation(VOTE, options);\n const [unvote, unvoteState] = useMutation(UNVOTE, options);\n const [error, setError] = useState<string | null>(null);\n const [anonymous, setAnonymous] = useState(false);\n const [localVoted, setLocalVoted] = useState<boolean | null>(null);\n const effectiveVoted = localVoted ?? voted;\n const busy = voteState.loading || unvoteState.loading;\n const toggle = async () => {\n setError(null);\n try {\n if (effectiveVoted) {\n await throwOnError(unvote({ variables: { id: featureId } }));\n setLocalVoted(false);\n } else {\n await throwOnError(\n vote({ variables: { id: featureId, input: { isAnonymous: anonymous } } })\n );\n setLocalVoted(true);\n setAnonymous(false);\n }\n } catch (e) {\n setError(mutationErrorMessage(e, 'Your vote could not be saved.'));\n }\n };\n return (\n <div className=\"flex flex-col items-end gap-1\">\n {!effectiveVoted && (\n <AnonymousSubmissionCheckbox\n idPrefix=\"feature-vote\"\n checked={anonymous}\n onChange={setAnonymous}\n disabled={busy}\n label=\"Vote anonymously\"\n hint={null}\n />\n )}\n <Button\n size=\"sm\"\n variant={effectiveVoted ? 'default' : 'outline'}\n data-testid=\"feature-vote\"\n aria-pressed={effectiveVoted}\n disabled={busy}\n onClick={() => void toggle()}\n >\n <ThumbsUp className=\"mr-1 h-4 w-4\" />\n {effectiveVoted ? 'Voted' : 'Vote'}\n </Button>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\nexport interface FeatureValues {\n id: string;\n title: string;\n description: string | null;\n status: string;\n businessValue: number | null;\n effortEstimate: string | null;\n projectId: string | null;\n workItemId: string | null;\n /** PRM-27 — optional so existing callers (detail header actions predate PRM-27) need no change. */\n moscow?: string | null;\n kano?: string | null;\n valueScore?: number | null;\n effortScore?: number | null;\n valueEffortQuadrant?: string | null;\n /** PRM-26 — optional for the same reason as the PRM-27 fields above. */\n reach?: number | null;\n impact?: number | null;\n confidence?: number | null;\n riceScore?: number | null;\n /** CWF-15 — optional for the same \"predates this pass\" reason as the PRM-26/27 fields above. */\n rating?: number | null;\n category?: string | null;\n isAnonymous?: boolean;\n}\n\n/** Status select, Edit and Delete for the feature detail header. */\nexport function FeatureHeaderActions({ feature }: { feature: FeatureValues }) {\n const navigate = usePlanMagnetNavigate();\n const [update, updateState] = useMutation(UPDATE, options);\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: FEATURE_QUERIES.filter((q) => q !== 'GetFeatureRequest'),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = updateState.loading || removeState.loading;\n const statuses = (FEATURE_STATUSES as readonly string[]).includes(feature.status)\n ? FEATURE_STATUSES\n : [feature.status, ...FEATURE_STATUSES];\n\n const onStatus = async (status: string) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: feature.id, input: { status } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The status could not be changed.');\n }\n };\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: feature.id } }));\n navigate('/products/features-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The request could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <select\n aria-label=\"Status\"\n data-testid=\"feature-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={feature.status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== feature.status) void onStatus(e.target.value);\n }}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n <FeatureEditDialog feature={feature} />\n {/* BOFF-7983: the analytics page existed with no way in. */}\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"feature-analytics\"\n onClick={() => navigate(detailPath('/products/feature-analytics-page', feature.id))}\n >\n <BarChart3 className=\"mr-1 h-4 w-4\" />\n Analytics\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete \"${feature.title}\"?`}\n description=\"The request and its votes are deleted. This cannot be undone here.\"\n confirmLabel=\"Delete request\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/**\n * Edit a request's fields, including the project and the work item it rides on (the release readiness card needs\n * that link, and no UI could set it — BOFF-7966). Only changed fields are sent; an emptied field is cleared.\n */\nfunction FeatureEditDialog({ feature }: { feature: FeatureValues }) {\n const initial = {\n title: feature.title,\n description: feature.description ?? '',\n businessValue: feature.businessValue == null ? '' : String(feature.businessValue),\n effortEstimate: feature.effortEstimate ?? '',\n projectId: feature.projectId ?? '',\n workItemId: feature.workItemId ?? '',\n };\n const initialPrioritization: PrioritizationFormValues = {\n moscow: feature.moscow ?? '',\n kano: feature.kano ?? '',\n valueScore: feature.valueScore == null ? '' : String(feature.valueScore),\n effortScore: feature.effortScore == null ? '' : String(feature.effortScore),\n };\n const initialRice: RiceFormValues = {\n reach: feature.reach == null ? '' : String(feature.reach),\n impact: feature.impact == null ? '' : String(feature.impact),\n confidence: feature.confidence == null ? '' : String(feature.confidence),\n };\n // CWF-15.\n const initialFeedback: FeedbackFormValues = {\n rating: feature.rating == null ? '' : String(feature.rating),\n category: feature.category ?? '',\n };\n const initialAnonymous = feature.isAnonymous ?? false;\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(initial);\n const [prioritization, setPrioritization] =\n useState<PrioritizationFormValues>(initialPrioritization);\n const [rice, setRice] = useState<RiceFormValues>(initialRice);\n const [feedback, setFeedback] = useState<FeedbackFormValues>(initialFeedback);\n const [anonymous, setAnonymous] = useState(initialAnonymous);\n const [error, setError] = useState<string | null>(null);\n const [update, state] = useMutation(UPDATE, options);\n const businessValue = parseIntField(form.businessValue, { min: 0, max: 100 });\n const rating = parseIntField(feedback.rating, { min: 1, max: 5 });\n const canSave =\n form.title.trim() !== '' &&\n !businessValue.invalid &&\n !rating.invalid &&\n prioritizationScoresValid(prioritization) &&\n riceInputsValid(rice) &&\n !state.loading;\n\n const save = async () => {\n setError(null);\n const text = (v: string) => (v.trim() ? v.trim() : null);\n const value = parseIntField(prioritization.valueScore, { min: 1, max: 10 });\n const effort = parseIntField(prioritization.effortScore, { min: 1, max: 10 });\n const reach = parseIntField(rice.reach, { min: 1, max: 10 });\n const impact = parseIntField(rice.impact, { min: 1, max: 10 });\n const confidence = parseIntField(rice.confidence, { min: 1, max: 10 });\n const next = {\n title: form.title.trim(),\n description: text(form.description),\n businessValue: businessValue.value ?? null,\n effortEstimate: text(form.effortEstimate),\n projectId: form.projectId || null,\n workItemId: form.workItemId || null,\n moscow: prioritization.moscow || null,\n kano: prioritization.kano || null,\n valueScore: value.value ?? null,\n effortScore: effort.value ?? null,\n reach: reach.value ?? null,\n impact: impact.value ?? null,\n confidence: confidence.value ?? null,\n rating: rating.value ?? null,\n category: text(feedback.category),\n isAnonymous: anonymous,\n };\n const before = {\n title: initial.title,\n description: text(initial.description),\n businessValue: initial.businessValue === '' ? null : Number(initial.businessValue),\n effortEstimate: text(initial.effortEstimate),\n projectId: initial.projectId || null,\n workItemId: initial.workItemId || null,\n moscow: initialPrioritization.moscow || null,\n kano: initialPrioritization.kano || null,\n valueScore:\n initialPrioritization.valueScore === '' ? null : Number(initialPrioritization.valueScore),\n rating: initialFeedback.rating === '' ? null : Number(initialFeedback.rating),\n category: text(initialFeedback.category),\n isAnonymous: initialAnonymous,\n effortScore:\n initialPrioritization.effortScore === '' ? null : Number(initialPrioritization.effortScore),\n reach: initialRice.reach === '' ? null : Number(initialRice.reach),\n impact: initialRice.impact === '' ? null : Number(initialRice.impact),\n confidence: initialRice.confidence === '' ? null : Number(initialRice.confidence),\n };\n const input = Object.fromEntries(\n Object.entries(next).filter(([k, v]) => v !== before[k as keyof typeof before])\n );\n if (Object.keys(input).length === 0) {\n setOpen(false);\n return;\n }\n try {\n await throwOnError(update({ variables: { id: feature.id, input } }));\n setOpen(false);\n } catch (e) {\n setError(mutationErrorMessage(e, 'The request could not be saved.'));\n }\n };\n\n const label = 'text-sm font-medium';\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) {\n setForm(initial);\n setPrioritization(initialPrioritization);\n setRice(initialRice);\n setFeedback(initialFeedback);\n setAnonymous(initialAnonymous);\n } else {\n setError(null);\n }\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"feature-edit\">\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit feature request</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Link the request to the work item that delivers it so releases can show who is waiting\n on it.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"feature-edit-title\" className={label}>\n Title\n </label>\n <Input\n id=\"feature-edit-title\"\n className=\"mt-1\"\n value={form.title}\n onChange={(e) => setForm({ ...form, title: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"feature-edit-description\" className={label}>\n Description\n </label>\n <textarea\n id=\"feature-edit-description\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[72px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"feature-edit-value\" className={label}>\n Business value (0–100)\n </label>\n <Input\n id=\"feature-edit-value\"\n type=\"number\"\n min={0}\n max={100}\n className=\"mt-1\"\n value={form.businessValue}\n aria-invalid={businessValue.invalid}\n onChange={(e) => setForm({ ...form, businessValue: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"feature-edit-effort\" className={label}>\n Effort\n </label>\n <Input\n id=\"feature-edit-effort\"\n className=\"mt-1\"\n placeholder=\"e.g. M\"\n value={form.effortEstimate}\n onChange={(e) => setForm({ ...form, effortEstimate: e.target.value })}\n />\n </div>\n </div>\n {businessValue.invalid && (\n <ErrorLine message=\"Business value is a whole number from 0 to 100.\" />\n )}\n <div>\n <label htmlFor=\"feature-edit-project\" className={label}>\n Project\n </label>\n <div className=\"mt-1\">\n <ProjectSelect\n id=\"feature-edit-project\"\n value={form.projectId}\n noneLabel=\"No project\"\n onChange={(projectId) => setForm({ ...form, projectId, workItemId: '' })}\n />\n </div>\n </div>\n <div>\n <label htmlFor=\"feature-edit-workitem\" className={label}>\n Delivered by work item\n </label>\n <div className=\"mt-1\">\n <WorkItemSearchSelect\n id=\"feature-edit-workitem\"\n projectId={form.projectId || undefined}\n value={form.workItemId}\n onChange={(workItemId) => setForm({ ...form, workItemId })}\n />\n </div>\n </div>\n {/* PRM-27: MoSCoW, Kano and Value-vs-Effort scoring. The quadrant itself is server-computed — this\n dialog shows the value last read back from the server, not a live client-side guess; the feature\n detail page's own Prioritization card refreshes with the saved value once this dialog closes\n (GetFeatureRequest is in FEATURE_QUERIES, awaited before the dialog closes). */}\n <div className=\"border-t pt-3\">\n <p className={label}>Prioritization</p>\n <div className=\"mt-1 flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Current quadrant:</span>\n <QuadrantBadge quadrant={feature.valueEffortQuadrant ?? null} />\n </div>\n <div className=\"mt-2\">\n <PrioritizationScoreFields\n idPrefix=\"feature-edit\"\n values={prioritization}\n onChange={setPrioritization}\n />\n </div>\n {/* PRM-26: RICE, next to the value/effort scores above. */}\n <div className=\"mt-3 border-t pt-3\">\n <p className={label}>RICE</p>\n <div className=\"mt-1 flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Current RICE score:</span>\n <span className=\"text-sm font-medium\" data-testid=\"feature-edit-rice-score\">\n {feature.riceScore == null ? '—' : feature.riceScore.toFixed(1)}\n </span>\n </div>\n <div className=\"mt-2\">\n <RiceScoreFields\n idPrefix=\"feature-edit\"\n values={rice}\n onChange={setRice}\n effortScoreMissing={\n parseIntField(prioritization.effortScore, { min: 1, max: 10 }).value == null\n }\n />\n </div>\n </div>\n </div>\n {/* CWF-15: structured feedback — rating, category and the \"submit anonymously\" flag. */}\n <div className=\"border-t pt-3\">\n <p className={label}>Feedback</p>\n <div className=\"mt-2\">\n <FeedbackFields idPrefix=\"feature-edit\" values={feedback} onChange={setFeedback} />\n {rating.invalid && <ErrorLine message=\"Rating is a whole number from 1 to 5.\" />}\n </div>\n <div className=\"mt-3\">\n <AnonymousSubmissionCheckbox\n idPrefix=\"feature-edit\"\n checked={anonymous}\n onChange={setAnonymous}\n />\n </div>\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button onClick={() => void save()} disabled={!canSave}>\n {state.loading ? 'Saving…' : 'Save'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n/**\n * The feature detail page's own Prioritization card (PRM-27): shows the current MoSCoW/Kano/scores and the\n * server-computed quadrant, with an inline \"Edit\" toggle for the four inputs. Everything shown outside the\n * editing form — including the quadrant badge — is read straight from the `feature` prop rather than mirrored\n * into local state, so it stays correct whichever of this card's own save or the sibling `FeatureEditDialog`'s\n * save last refreshed `GetFeatureRequest` (both awaited their refetch before returning/closing).\n */\ninterface UpdateFeaturePrioritizationResult {\n planmagnetUpdateFeatureRequest: { valueEffortQuadrant: string | null } | null;\n}\n\nexport function FeaturePrioritizationCard({ feature }: { feature: FeatureValues }) {\n const initial: PrioritizationFormValues = {\n moscow: feature.moscow ?? '',\n kano: feature.kano ?? '',\n valueScore: feature.valueScore == null ? '' : String(feature.valueScore),\n effortScore: feature.effortScore == null ? '' : String(feature.effortScore),\n };\n const initialRice: RiceFormValues = {\n reach: feature.reach == null ? '' : String(feature.reach),\n impact: feature.impact == null ? '' : String(feature.impact),\n confidence: feature.confidence == null ? '' : String(feature.confidence),\n };\n const [editing, setEditing] = useState(false);\n const [form, setForm] = useState<PrioritizationFormValues>(initial);\n const [rice, setRice] = useState<RiceFormValues>(initialRice);\n const [error, setError] = useState<string | null>(null);\n const [update, state] = useMutation<UpdateFeaturePrioritizationResult>(UPDATE, options);\n\n const startEdit = () => {\n setForm(initial);\n setRice(initialRice);\n setError(null);\n setEditing(true);\n };\n\n const save = async () => {\n setError(null);\n const value = parseIntField(form.valueScore, { min: 1, max: 10 });\n const effort = parseIntField(form.effortScore, { min: 1, max: 10 });\n const reach = parseIntField(rice.reach, { min: 1, max: 10 });\n const impact = parseIntField(rice.impact, { min: 1, max: 10 });\n const confidence = parseIntField(rice.confidence, { min: 1, max: 10 });\n const input = {\n moscow: form.moscow || null,\n kano: form.kano || null,\n valueScore: value.value ?? null,\n effortScore: effort.value ?? null,\n reach: reach.value ?? null,\n impact: impact.value ?? null,\n confidence: confidence.value ?? null,\n };\n try {\n // This mutation's own `options` also carries `awaitRefetchQueries: true` over `GetFeatureRequest`, so by\n // the time this resolves the `feature` prop has already refreshed with the new quadrant — read it straight\n // from there (below) rather than mirroring the response into local state, which a sibling editor's own save\n // (FeatureEditDialog, same refetch) would then leave stale.\n await throwOnError(update({ variables: { id: feature.id, input } }));\n setEditing(false);\n } catch (e) {\n setError(mutationErrorMessage(e, 'The prioritization could not be saved.'));\n }\n };\n\n return (\n <Card data-testid=\"feature-prioritization-card\">\n <CardHeader className=\"flex flex-row items-center justify-between gap-2\">\n <CardTitle>Prioritization</CardTitle>\n {!editing && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"feature-prioritization-edit\"\n onClick={startEdit}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n )}\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {!editing ? (\n <>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Quadrant:</span>\n <QuadrantBadge quadrant={feature.valueEffortQuadrant ?? null} />\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">MoSCoW</span>\n <span className=\"font-medium\">{moscowLabel(feature.moscow)}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Kano</span>\n <span className=\"font-medium\">{kanoLabel(feature.kano)}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Value score</span>\n <span className=\"font-medium\">{feature.valueScore ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Effort score</span>\n <span className=\"font-medium\">{feature.effortScore ?? 'Not set'}</span>\n </div>\n </div>\n {/* PRM-26: RICE, next to the value/effort scores above. */}\n <div className=\"border-t pt-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs text-muted-foreground\">RICE score</span>\n <span className=\"font-medium\" data-testid=\"feature-rice-score\">\n {feature.riceScore == null ? '—' : feature.riceScore.toFixed(1)}\n </span>\n </div>\n {feature.riceScore == null && (\n <p\n className=\"text-xs text-muted-foreground mt-0.5\"\n data-testid=\"feature-rice-missing-hint\"\n >\n {riceScoreMissingHint(feature)}\n </p>\n )}\n <div className=\"grid grid-cols-3 gap-2 text-sm mt-2\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Reach</span>\n <span className=\"font-medium\">{feature.reach ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Impact</span>\n <span className=\"font-medium\">{feature.impact ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Confidence</span>\n <span className=\"font-medium\">{feature.confidence ?? 'Not set'}</span>\n </div>\n </div>\n </div>\n </>\n ) : (\n <>\n <PrioritizationScoreFields idPrefix=\"feature-prio\" values={form} onChange={setForm} />\n <div className=\"border-t pt-3\">\n <p className=\"text-sm font-medium mb-1\">RICE</p>\n <RiceScoreFields\n idPrefix=\"feature-prio\"\n values={rice}\n onChange={setRice}\n effortScoreMissing={\n parseIntField(form.effortScore, { min: 1, max: 10 }).value == null\n }\n />\n </div>\n {error && <ErrorLine message={error} />}\n <div className=\"flex justify-end gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={() => setEditing(false)}>\n Cancel\n </Button>\n <Button\n size=\"sm\"\n data-testid=\"feature-prioritization-save\"\n disabled={\n state.loading || !prioritizationScoresValid(form) || !riceInputsValid(rice)\n }\n onClick={() => void save()}\n >\n {state.loading ? 'Saving…' : 'Save'}\n </Button>\n </div>\n </>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeatureTriage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/FeatureTriage.tsx"],"names":[],"mappings":"AAyFA,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAGvC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,qFAAqF;AACrF,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,YAA0B,CAAC;AACvE,wCAAwC;AACxC,eAAO,MAAM,SAAS,GAAI,cAAc,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,MAAM,YACpB,CAAC;AAuZ3D;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,kDAoB7F"}
|