@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":"SatisfactionSummaryCard.js","names":[],"sources":["../../../src/planmagnet/satisfaction/SatisfactionSummaryCard.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport { Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { ArrowRight, Loader2, Smile } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { isForbidden } from '../utils/graphqlErrors';\nimport { CompactSatisfactionFigures } from './SatisfactionFigures';\nimport {\n DEFAULT_WINDOW_PRESET,\n satisfactionPageLink,\n type SatisfactionScope,\n type SatisfactionWindowInput,\n} from './satisfaction';\nimport {\n CUSTOMER_SATISFACTION_SUMMARY,\n type CustomerSatisfactionSummaryData,\n} from './satisfactionOperations';\n\n/**\n * CSAT and NPS for one scope, as a card on another page — the product page (responses about the product, and about\n * its releases that name no product of their own) and the release page (responses about that release). Its own query:\n * a role that cannot read customer satisfaction, or any failure here, leaves the rest of the page alone.\n */\n\nconst DEFAULT_WINDOW: SatisfactionWindowInput = { preset: DEFAULT_WINDOW_PRESET };\n\nexport function SatisfactionSummaryCard({ scope }: { scope: SatisfactionScope }) {\n const tr = useTr();\n const description = scope.releaseId\n ? tr('planmagnet.satisfaction.card.releaseScope', 'Responses about this release.')\n : scope.productId\n ? tr(\n 'planmagnet.satisfaction.card.productScope',\n 'Responses about this product, and about its releases that name no product of their own.'\n )\n : tr('planmagnet.satisfaction.card.projectScope', 'Responses about this project.');\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const { data, loading, error } = useQuery<CustomerSatisfactionSummaryData>(\n CUSTOMER_SATISFACTION_SUMMARY,\n {\n variables: { workspaceId: workspaceId ?? '', filter: { ...scope, window: DEFAULT_WINDOW } },\n skip: !workspaceId,\n }\n );\n const summary = data?.planmagnetCustomerSatisfaction;\n\n return (\n <Card data-testid=\"satisfaction-summary-card\">\n <CardHeader className=\"flex flex-row items-start justify-between gap-2 space-y-0\">\n <div>\n <CardTitle className=\"flex items-center gap-2\">\n <Smile className=\"h-4 w-4\" aria-hidden={true} />\n {tr('planmagnet.satisfaction.card.title', 'Customer satisfaction')}\n </CardTitle>\n <p className=\"mt-1 text-xs text-muted-foreground\">{description}</p>\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => navigate(satisfactionPageLink(scope))}\n data-testid=\"satisfaction-summary-open\"\n >\n {tr('planmagnet.satisfaction.card.open', 'Responses')}\n <ArrowRight className=\"ml-1 h-4 w-4\" />\n </Button>\n </CardHeader>\n <CardContent>\n {loading && !summary ? (\n <p className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n {tr('planmagnet.satisfaction.loading', 'Loading…')}\n </p>\n ) : error && !summary ? (\n <p className=\"text-sm text-status-error-text\">\n {isForbidden(error)\n ? tr(\n 'planmagnet.satisfaction.errors.readForbidden',\n 'Your role cannot see customer satisfaction in this workspace.'\n )\n : tr(\n 'planmagnet.satisfaction.errors.load',\n 'Customer satisfaction could not be loaded: {{message}}',\n { message: error.message }\n )}\n </p>\n ) : summary ? (\n <CompactSatisfactionFigures summary={summary} />\n ) : null}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;;AAwBA,IAAM,IAA0C,EAAE,QAAQ,GAAuB;AAEjF,SAAgB,EAAwB,EAAE,YAAuC;CAC/E,IAAM,IAAK,GAAO,EACZ,IAAc,EAAM,YACtB,EAAG,6CAA6C,gCAAgC,GAChF,EAAM,YACJ,EACE,6CACA,0FACD,GACD,EAAG,6CAA6C,gCAAgC,EAChF,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAClC,EAAE,SAAM,YAAS,aAAU,EAC/B,GACA;EACE,WAAW;GAAE,aAAa,KAAe;GAAI,QAAQ;IAAE,GAAG;IAAO,QAAQ;IAAgB;GAAE;EAC3F,MAAM,CAAC;EACR,CACF,EACK,IAAU,GAAM;AAEtB,QACE,kBAAC,GAAD;EAAM,eAAY;YAAlB,CACE,kBAAC,GAAD;GAAY,WAAU;aAAtB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,GAAD;IAAW,WAAU;cAArB,CACE,kBAAC,GAAD;KAAO,WAAU;KAAU,eAAa;KAAQ,CAAA,EAC/C,EAAG,sCAAsC,wBAAwB,CACxD;OACZ,kBAAC,KAAD;IAAG,WAAU;cAAsC;IAAgB,CAAA,CAC/D,EAAA,CAAA,EACN,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,eAAe,EAAS,EAAqB,EAAM,CAAC;IACpD,eAAY;cAJd,CAMG,EAAG,qCAAqC,YAAY,EACrD,kBAAC,GAAD,EAAY,WAAU,gBAAiB,CAAA,CAChC;MACE;MACb,kBAAC,GAAD,EAAA,UACG,KAAW,CAAC,IACX,kBAAC,KAAD;GAAG,WAAU;aAAb,CACE,kBAAC,GAAD,EAAS,WAAU,wBAAyB,CAAA,EAC3C,EAAG,mCAAmC,WAAW,CAChD;OACF,KAAS,CAAC,IACZ,kBAAC,KAAD;GAAG,WAAU;aACV,EAAY,EAAM,GACf,EACE,gDACA,gEACD,GACD,EACE,uCACA,0DACA,EAAE,SAAS,EAAM,SAAS,CAC3B;GACH,CAAA,GACF,IACF,kBAAC,GAAD,EAAqC,YAAW,CAAA,GAC9C,MACQ,CAAA,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionWindowPicker.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/SatisfactionWindowPicker.tsx"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,YAAY,EAElB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAgC,GACjC,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,0EAA0E;IAC1E,OAAO,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,2CAyFA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionWindowPicker.js","names":[],"sources":["../../../src/planmagnet/satisfaction/SatisfactionWindowPicker.tsx"],"sourcesContent":["import { Input } from '@burdenoff/fe-libs/ui';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { windowPresetLabel } from './SatisfactionFigures';\nimport {\n WINDOW_PRESETS,\n isCalendarDay,\n presetDays,\n utcDay,\n type WindowChoice,\n type WindowPreset,\n} from './satisfaction';\nimport type { SatisfactionWindowEcho } from './satisfactionOperations';\n\n/**\n * The window a satisfaction figure covers: the trailing 30 / 90 / 180 / 365 days (90 by default), or custom days.\n * Custom days are whole UTC days, both included — the same days the service counts. Switching to custom starts from\n * the days the figures currently cover, so nothing jumps.\n */\nexport function SatisfactionWindowPicker({\n value,\n onChange,\n current,\n idPrefix = 'satisfaction-window',\n}: {\n value: WindowChoice;\n onChange: (next: WindowChoice) => void;\n /** The window the figures on screen cover, as the service resolved it. */\n current: SatisfactionWindowEcho | null;\n idPrefix?: string;\n}) {\n const tr = useTr();\n const custom = value.preset === 'CUSTOM';\n const incomplete = custom && (!isCalendarDay(value.from) || !isCalendarDay(value.to));\n const reversed = custom && !incomplete && value.from > value.to;\n\n const choose = (preset: WindowPreset) => {\n if (preset !== 'CUSTOM') {\n onChange({ preset, from: value.from, to: value.to });\n return;\n }\n if (value.preset === 'CUSTOM') return;\n const from = current ? utcDay(current.from) : null;\n const to = current ? utcDay(current.to) : null;\n const seed = from && to ? { from, to } : presetDays('LAST_90_DAYS', new Date());\n onChange({ preset: 'CUSTOM', ...seed });\n };\n\n return (\n <div className=\"flex flex-wrap items-center gap-2\" data-testid=\"satisfaction-window\">\n <div\n className=\"flex flex-wrap items-center gap-1 rounded-md border p-0.5\"\n role=\"group\"\n aria-label={tr('planmagnet.satisfaction.window.label', 'Time window')}\n >\n {WINDOW_PRESETS.map((preset) => (\n <button\n key={preset}\n type=\"button\"\n aria-pressed={value.preset === preset}\n onClick={() => choose(preset)}\n data-testid={`satisfaction-window-${preset}`}\n className={`rounded px-2.5 py-1 text-xs ${\n value.preset === preset\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted'\n }`}\n >\n {windowPresetLabel(tr, preset)}\n </button>\n ))}\n </div>\n {custom && (\n <div className=\"flex items-center gap-1.5\">\n <label htmlFor={`${idPrefix}-from`} className=\"sr-only\">\n {tr('planmagnet.satisfaction.window.from', 'From')}\n </label>\n <Input\n id={`${idPrefix}-from`}\n type=\"date\"\n className=\"h-8 w-40\"\n value={value.from}\n max={value.to || undefined}\n onChange={(e) => onChange({ ...value, from: e.target.value })}\n data-testid=\"satisfaction-window-from\"\n />\n <span className=\"text-sm text-muted-foreground\">–</span>\n <label htmlFor={`${idPrefix}-to`} className=\"sr-only\">\n {tr('planmagnet.satisfaction.window.to', 'To')}\n </label>\n <Input\n id={`${idPrefix}-to`}\n type=\"date\"\n className=\"h-8 w-40\"\n value={value.to}\n min={value.from || undefined}\n onChange={(e) => onChange({ ...value, to: e.target.value })}\n data-testid=\"satisfaction-window-to\"\n />\n <span className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.satisfaction.window.utcNote', 'UTC days')}\n </span>\n </div>\n )}\n {(reversed || incomplete) && (\n <p role=\"alert\" className=\"text-xs text-status-error-text\">\n {reversed\n ? tr(\n 'planmagnet.satisfaction.window.reversed',\n '“From” must be on or before “To”. The figures still show the last valid window.'\n )\n : tr(\n 'planmagnet.satisfaction.window.incomplete',\n 'Pick both days. The figures still show the last valid window.'\n )}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;AAkBA,SAAgB,EAAyB,EACvC,UACA,aACA,YACA,cAAW,yBAOV;CACD,IAAM,IAAK,GAAO,EACZ,IAAS,EAAM,WAAW,UAC1B,IAAa,MAAW,CAAC,EAAc,EAAM,KAAK,IAAI,CAAC,EAAc,EAAM,GAAG,GAC9E,IAAW,KAAU,CAAC,KAAc,EAAM,OAAO,EAAM,IAEvD,KAAU,MAAyB;AACvC,MAAI,MAAW,UAAU;AACvB,KAAS;IAAE;IAAQ,MAAM,EAAM;IAAM,IAAI,EAAM;IAAI,CAAC;AACpD;;AAEF,MAAI,EAAM,WAAW,SAAU;EAC/B,IAAM,IAAO,IAAU,EAAO,EAAQ,KAAK,GAAG,MACxC,IAAK,IAAU,EAAO,EAAQ,GAAG,GAAG;AAE1C,IAAS;GAAE,QAAQ;GAAU,GADhB,KAAQ,IAAK;IAAE;IAAM;IAAI,GAAG,EAAW,gCAAgB,IAAI,MAAM,CAAC;GACzC,CAAC;;AAGzC,QACE,kBAAC,OAAD;EAAK,WAAU;EAAoC,eAAY;YAA/D;GACE,kBAAC,OAAD;IACE,WAAU;IACV,MAAK;IACL,cAAY,EAAG,wCAAwC,cAAc;cAEpE,EAAe,KAAK,MACnB,kBAAC,UAAD;KAEE,MAAK;KACL,gBAAc,EAAM,WAAW;KAC/B,eAAe,EAAO,EAAO;KAC7B,eAAa,uBAAuB;KACpC,WAAW,+BACT,EAAM,WAAW,IACb,uCACA;eAGL,EAAkB,GAAI,EAAO;KACvB,EAZF,EAYE,CACT;IACE,CAAA;GACL,KACC,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,SAAD;MAAO,SAAS,GAAG,EAAS;MAAQ,WAAU;gBAC3C,EAAG,uCAAuC,OAAO;MAC5C,CAAA;KACR,kBAAC,GAAD;MACE,IAAI,GAAG,EAAS;MAChB,MAAK;MACL,WAAU;MACV,OAAO,EAAM;MACb,KAAK,EAAM,MAAM,KAAA;MACjB,WAAW,MAAM,EAAS;OAAE,GAAG;OAAO,MAAM,EAAE,OAAO;OAAO,CAAC;MAC7D,eAAY;MACZ,CAAA;KACF,kBAAC,QAAD;MAAM,WAAU;gBAAgC;MAAQ,CAAA;KACxD,kBAAC,SAAD;MAAO,SAAS,GAAG,EAAS;MAAM,WAAU;gBACzC,EAAG,qCAAqC,KAAK;MACxC,CAAA;KACR,kBAAC,GAAD;MACE,IAAI,GAAG,EAAS;MAChB,MAAK;MACL,WAAU;MACV,OAAO,EAAM;MACb,KAAK,EAAM,QAAQ,KAAA;MACnB,WAAW,MAAM,EAAS;OAAE,GAAG;OAAO,IAAI,EAAE,OAAO;OAAO,CAAC;MAC3D,eAAY;MACZ,CAAA;KACF,kBAAC,QAAD;MAAM,WAAU;gBACb,EAAG,0CAA0C,WAAW;MACpD,CAAA;KACH;;IAEN,KAAY,MACZ,kBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;cACvB,IACG,EACE,2CACA,kFACD,GACD,EACE,6CACA,gEACD;IACH,CAAA;GAEF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"satisfaction.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/satisfaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"satisfaction.js","names":[],"sources":["../../../src/planmagnet/satisfaction/satisfaction.ts"],"sourcesContent":["import { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';\nimport { CUSTOMER_SATISFACTION_PATH } from '../product/routes';\n\n/**\n * ANR-21 customer satisfaction — the pure rules and formatting behind the Customer satisfaction page, its CSV import\n * and the CSAT/NPS cards. No React here, so every rule is unit-tested (tests/satisfaction.test.ts).\n *\n * The service is the gate for every rule below (wspace-planmagnet-svc satisfaction-input.ts and\n * satisfaction-scoring.ts, main fdb868c). These copies only let a form or the import preview say what is wrong before\n * anything is sent, so each one is at most as strict as the service — never stricter.\n *\n * Owner decisions (2026-10-02): CSAT is the share of 4s and 5s on a 1-5 scale; NPS is % promoters (9-10) minus %\n * detractors (0-6) on 0-10; below 5 responses a metric reads \"Not enough responses\", never 0 or a made-up score; every\n * figure shows its response count and its window; the default window is the trailing 90 days. A feature request's\n * rating is not customer satisfaction and is never shown as one.\n */\n\n// ─── Metrics and scales ─────────────────────────────────────────────────────\n\nexport type SatisfactionMetricType = 'CSAT' | 'NPS';\n\nexport const METRIC_TYPES: readonly SatisfactionMetricType[] = ['CSAT', 'NPS'];\n\n/** The inclusive answer scale of each metric type. */\nexport const SCORE_SCALE: Readonly<Record<SatisfactionMetricType, { min: number; max: number }>> = {\n CSAT: { min: 1, max: 5 },\n NPS: { min: 0, max: 10 },\n};\n\nexport function isMetricType(value: unknown): value is SatisfactionMetricType {\n return value === 'CSAT' || value === 'NPS';\n}\n\n/** Every answer on a metric's scale, lowest first. */\nexport function scaleValues(metricType: SatisfactionMetricType): number[] {\n const { min, max } = SCORE_SCALE[metricType];\n return Array.from({ length: max - min + 1 }, (_, i) => min + i);\n}\n\n/** True when `score` is a whole number on the metric's own scale (CSAT 1-5, NPS 0-10). */\nexport function isOnScale(metricType: SatisfactionMetricType, score: number): boolean {\n const { min, max } = SCORE_SCALE[metricType];\n return Number.isInteger(score) && score >= min && score <= max;\n}\n\nexport type ScoreCategory = 'satisfied' | 'notSatisfied' | 'promoter' | 'passive' | 'detractor';\n\n/** How one answer counts: a CSAT 4-5 is satisfied; an NPS 9-10 promotes, 7-8 is passive, 0-6 detracts. */\nexport function scoreCategory(metricType: SatisfactionMetricType, score: number): ScoreCategory {\n if (metricType === 'CSAT') return score >= 4 ? 'satisfied' : 'notSatisfied';\n if (score >= 9) return 'promoter';\n return score >= 7 ? 'passive' : 'detractor';\n}\n\n// ─── Field limits (the service's) ───────────────────────────────────────────\n\nexport const COMMENT_MAX = 5000;\nexport const RESPONDENT_NAME_MAX = 200;\n/** RFC 5321's longest deliverable address. */\nexport const RESPONDENT_EMAIL_MAX = 254;\nexport const EXTERNAL_ID_MAX = 200;\n/** One import call takes 1 to this many rows. */\nexport const MAX_IMPORT_ROWS = 500;\n/** The earliest respondedAt the service accepts (it catches the epoch from an empty cell, a two-digit year…). */\nexport const RESPONDED_AT_EARLIEST = '2000-01-01';\n\n/**\n * The service's email typo gate (satisfaction-input.ts `looksLikeEmail`), copied exactly: one `@` with something on\n * both sides, a dot inside the domain, no whitespace. Not deliverability.\n */\nexport function looksLikeEmail(email: string): boolean {\n const at = email.indexOf('@');\n if (at <= 0 || at !== email.lastIndexOf('@') || /\\s/.test(email)) return false;\n const domain = email.slice(at + 1);\n const dot = domain.indexOf('.');\n return dot > 0 && !domain.endsWith('.');\n}\n\n// ─── Dates ──────────────────────────────────────────────────────────────────\n\nconst CALENDAR_DATE = /^\\d{4}-\\d{2}-\\d{2}$/;\n// The DateTime scalar's date-time shape: a fixed prefix plus an explicit zone. A bare local time is refused there,\n// since the server would read it in its own zone.\nconst ISO_DATE_TIME_PREFIX = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/;\nconst ISO_ZONE_SUFFIX = /(?:Z|[+-]\\d{2}:\\d{2})$/;\nconst HOUR_MS = 60 * 60 * 1000;\nconst DAY_MS = 24 * HOUR_MS;\n/**\n * The service accepts a respondedAt up to 14 hours past its own clock — a date picked as \"today\" anywhere on Earth\n * (UTC+14) is that day's UTC midnight. One more hour here absorbs a browser clock running behind the server's, so a\n * preview never refuses a date the service would accept; anything the service still refuses comes back by row.\n */\nconst FUTURE_TOLERANCE_MS = 15 * HOUR_MS;\n\n/** True for a real calendar day written YYYY-MM-DD (2026-02-30 is not one). */\nexport function isCalendarDay(text: string): boolean {\n if (!CALENDAR_DATE.test(text)) return false;\n const date = new Date(`${text}T00:00:00.000Z`);\n return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === text;\n}\n\n/**\n * The instant a respondedAt text stands for, read the way the DateTime scalar reads it: a calendar day (YYYY-MM-DD) is\n * that day's UTC midnight; a date-time must carry its zone (Z or ±hh:mm). Null for anything the scalar refuses.\n */\nexport function parseRespondedAt(text: string): Date | null {\n const value = text.trim();\n if (isCalendarDay(value)) return new Date(`${value}T00:00:00.000Z`);\n if (ISO_DATE_TIME_PREFIX.test(value) && ISO_ZONE_SUFFIX.test(value)) {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nexport type RespondedAtProblem = 'required' | 'format' | 'future' | 'tooOld';\n\n/** Why the service would refuse this respondedAt, or null when it would take it. */\nexport function respondedAtProblem(text: string, now: Date): RespondedAtProblem | null {\n if (text.trim() === '') return 'required';\n const date = parseRespondedAt(text);\n if (!date) return 'format';\n if (date.getTime() > now.getTime() + FUTURE_TOLERANCE_MS) return 'future';\n if (date.getTime() < Date.parse(`${RESPONDED_AT_EARLIEST}T00:00:00.000Z`)) return 'tooOld';\n return null;\n}\n\n/** The UTC calendar day (YYYY-MM-DD) of an ISO instant — the day every window counts it under. */\nexport function utcDay(iso: string): string | null {\n const date = new Date(iso);\n return Number.isNaN(date.getTime()) ? null : date.toISOString().slice(0, 10);\n}\n\n/** Today in the viewer's own calendar (YYYY-MM-DD) — what a date input means by \"today\". */\nexport function localDay(now: Date = new Date()): string {\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${now.getFullYear()}-${month}-${day}`;\n}\n\n/**\n * An instant shown as its UTC calendar day (\"2 Oct 2026\" in the viewer's locale). respondedAt and the window bounds\n * are counted by UTC day — a date entered as 2026-10-02 is stored as that day's UTC midnight — so the day shown is the\n * day the figures count it under. Formatting in the viewer's zone would show a UTC-midnight date as the day before\n * anywhere west of Greenwich.\n */\nexport function formatUtcDay(iso: string, locale?: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) return '—';\n return date.toLocaleDateString(locale, {\n timeZone: 'UTC',\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n });\n}\n\n// ─── Links ──────────────────────────────────────────────────────────────────\n\n/**\n * The releases a response about `productId` may name: that product's own and the ones with no product — the service\n * refuses a release of another product. Every release when no product is chosen.\n */\nexport function releasesForProduct<T extends { productId: string | null }>(\n releases: readonly T[],\n productId: string\n): T[] {\n if (!productId) return [...releases];\n return releases.filter((r) => !r.productId || r.productId === productId);\n}\n\n/** \"2.4.0 — Spring launch\", or just the version when the name repeats it. */\nexport function releaseLabel(release: { name: string; version: string }): string {\n return release.name && release.name !== release.version\n ? `${release.version} — ${release.name}`\n : release.version;\n}\n\n// ─── Windows ────────────────────────────────────────────────────────────────\n\nexport type WindowPreset =\n | 'LAST_30_DAYS'\n | 'LAST_90_DAYS'\n | 'LAST_180_DAYS'\n | 'LAST_365_DAYS'\n | 'CUSTOM';\n\nexport const WINDOW_PRESETS: readonly WindowPreset[] = [\n 'LAST_30_DAYS',\n 'LAST_90_DAYS',\n 'LAST_180_DAYS',\n 'LAST_365_DAYS',\n 'CUSTOM',\n];\n\n/** Owner decision 2026-10-02: a figure covers the trailing 90 days unless someone picks another window. */\nexport const DEFAULT_WINDOW_PRESET: WindowPreset = 'LAST_90_DAYS';\n\nexport const PRESET_DAYS: Readonly<Record<Exclude<WindowPreset, 'CUSTOM'>, number>> = {\n LAST_30_DAYS: 30,\n LAST_90_DAYS: 90,\n LAST_180_DAYS: 180,\n LAST_365_DAYS: 365,\n};\n\nexport function isWindowPreset(value: unknown): value is WindowPreset {\n return typeof value === 'string' && (WINDOW_PRESETS as readonly string[]).includes(value);\n}\n\n/** The window a page asks for: a preset, or CUSTOM with its own two days (YYYY-MM-DD, both included). */\nexport interface WindowChoice {\n preset: WindowPreset;\n from: string;\n to: string;\n}\n\n/** The `window` input of a satisfaction filter. */\nexport interface SatisfactionWindowInput {\n preset: WindowPreset;\n from?: string;\n to?: string;\n}\n\n/**\n * The `window` input for a choice. A preset sends only its name (the service refuses from/to with any preset but\n * CUSTOM). CUSTOM sends its two days as calendar dates: the DateTime scalar reads a date as that day's UTC midnight and\n * the service counts whole UTC days, so the figure covers exactly the days picked. Null while a custom pair is\n * incomplete or reversed — the caller keeps its last valid window rather than send one the service refuses.\n */\nexport function windowInput(choice: WindowChoice): SatisfactionWindowInput | null {\n if (choice.preset !== 'CUSTOM') return { preset: choice.preset };\n if (!isCalendarDay(choice.from) || !isCalendarDay(choice.to) || choice.from > choice.to) {\n return null;\n }\n return { preset: 'CUSTOM', from: choice.from, to: choice.to };\n}\n\n/**\n * The UTC days a preset covers today — the N days ending today, today included, exactly as the service resolves it.\n * Used to seed the custom date inputs when someone switches from a preset to CUSTOM.\n */\nexport function presetDays(\n preset: Exclude<WindowPreset, 'CUSTOM'>,\n now: Date\n): { from: string; to: string } {\n const to = now.toISOString().slice(0, 10);\n const from = new Date(now.getTime() - (PRESET_DAYS[preset] - 1) * DAY_MS)\n .toISOString()\n .slice(0, 10);\n return { from, to };\n}\n\n// ─── Page links ─────────────────────────────────────────────────────────────\n\n/** What a satisfaction figure or list is about: the workspace (all empty), or one product / release / project. */\nexport interface SatisfactionScope {\n productId?: string;\n releaseId?: string;\n projectId?: string;\n}\n\n/** The Customer satisfaction page's state, as its URL carries it. */\nexport interface SatisfactionPageState {\n window: WindowChoice;\n productId: string;\n releaseId: string;\n projectId: string;\n /** '' = both metrics (the responses list only; the figures always show both). */\n metricType: SatisfactionMetricType | '';\n}\n\n/** The Customer satisfaction page for a scope (and a window other than the default), as a navigate() path. */\nexport function satisfactionPageLink(scope: SatisfactionScope, window?: WindowChoice): string {\n const params = new URLSearchParams();\n if (window && window.preset !== DEFAULT_WINDOW_PRESET) {\n params.set('window', window.preset);\n if (window.preset === 'CUSTOM') {\n params.set('from', window.from);\n params.set('to', window.to);\n }\n }\n if (scope.productId) params.set('product', scope.productId);\n if (scope.releaseId) params.set('release', scope.releaseId);\n if (scope.projectId) params.set('project', scope.projectId);\n const query = params.toString();\n return `/${CUSTOMER_SATISFACTION_PATH}${query ? `?${query}` : ''}`;\n}\n\n/**\n * The page state a URL query asks for (`?window=&from=&to=&product=&release=&project=&metric=`). Anything unreadable\n * falls back to the default — the trailing 90 days, every product, release and project, both metrics.\n */\nexport function pageStateFromSearch(search: string, now: Date): SatisfactionPageState {\n const params = new URLSearchParams(search);\n const preset = params.get('window');\n const from = params.get('from') ?? '';\n const to = params.get('to') ?? '';\n let window: WindowChoice;\n if (preset === 'CUSTOM' && windowInput({ preset: 'CUSTOM', from, to })) {\n window = { preset: 'CUSTOM', from, to };\n } else {\n const chosen: Exclude<WindowPreset, 'CUSTOM'> =\n isWindowPreset(preset) && preset !== 'CUSTOM' ? preset : 'LAST_90_DAYS';\n window = { preset: chosen, ...presetDays(chosen, now) };\n }\n const metric = params.get('metric');\n return {\n window,\n productId: params.get('product') ?? '',\n releaseId: params.get('release') ?? '',\n projectId: params.get('project') ?? '',\n metricType: isMetricType(metric) ? metric : '',\n };\n}\n\n// ─── Figures ────────────────────────────────────────────────────────────────\n\n/** CSAT as a whole percentage (\"82%\"). Null stays null: the caller says \"Not enough responses\", never \"0%\". */\nexport function formatCsat(score: number | null, locale?: string): string | null {\n if (score === null || !Number.isFinite(score)) return null;\n return new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: 0 }).format(\n score / 100\n );\n}\n\n/** NPS as a signed whole number (\"+34\", \"-12\", \"0\"). Null stays null. */\nexport function formatNps(score: number | null, locale?: string): string | null {\n if (score === null || !Number.isFinite(score)) return null;\n const rounded = Math.round(score);\n // Math.round(-0.4) is -0, which would print as \"-0\".\n return new Intl.NumberFormat(locale, {\n signDisplay: 'exceptZero',\n maximumFractionDigits: 0,\n }).format(rounded === 0 ? 0 : rounded);\n}\n\n/** `count` as a whole percentage of `total` — 0 when there is nothing to divide by. */\nexport function shareOf(count: number, total: number): number {\n return total > 0 ? Math.round((count * 100) / total) : 0;\n}\n\n// ─── Refusals ───────────────────────────────────────────────────────────────\n\ninterface ErrorLike {\n message?: unknown;\n extensions?: unknown;\n}\n\n/** The GraphQL errors of a failed operation, from either shape Apollo surfaces them in. */\nfunction graphqlErrorsOf(error: unknown): ErrorLike[] {\n if (CombinedGraphQLErrors.is(error)) return [...error.errors];\n if (ServerError.is(error)) {\n // A refusal sent with a non-2xx status reaches Apollo as a ServerError carrying the JSON body (a batched request\n // answers with an array of results).\n try {\n const body: unknown = JSON.parse(error.bodyText);\n const results = Array.isArray(body) ? body : [body];\n return results.flatMap((result) => {\n const errors = (result as { errors?: unknown } | null)?.errors;\n return Array.isArray(errors) ? (errors as ErrorLike[]) : [];\n });\n } catch {\n return [];\n }\n }\n return [];\n}\n\nfunction extensionsOf(error: ErrorLike): Record<string, unknown> {\n return error.extensions && typeof error.extensions === 'object'\n ? (error.extensions as Record<string, unknown>)\n : {};\n}\n\n/** `extensions.code` of the first error that has one (BAD_USER_INPUT, NOT_FOUND, CONFLICT, FORBIDDEN…). */\nexport function errorCode(error: unknown): string | null {\n for (const e of graphqlErrorsOf(error)) {\n const code = extensionsOf(e).code;\n if (typeof code === 'string' && code) return code;\n }\n return null;\n}\n\n/** The input the service named in `extensions.field` (score, respondedAt, productId…), if any. */\nexport function errorField(error: unknown): string | null {\n for (const e of graphqlErrorsOf(error)) {\n const field = extensionsOf(e).field;\n if (typeof field === 'string' && field) return field;\n }\n return null;\n}\n\n/** One refused import row, as the service reports it in `extensions.rowErrors`. `row` is 1-based, in the order sent. */\nexport interface ImportRowError {\n row: number;\n field: string | null;\n code: string;\n /** The service's own sentence, already in the caller's language. */\n message: string;\n}\n\n/**\n * The refused rows of a failed import, sorted by row — or null when the refusal was not about rows (a role refusal,\n * an empty or oversized batch, a network fault), in which case the caller shows the error's own message.\n */\nexport function readImportRowErrors(error: unknown): ImportRowError[] | null {\n for (const e of graphqlErrorsOf(error)) {\n const list = extensionsOf(e).rowErrors;\n if (!Array.isArray(list)) continue;\n const rows: ImportRowError[] = [];\n for (const entry of list) {\n if (!entry || typeof entry !== 'object') continue;\n const { row, field, code, message } = entry as Record<string, unknown>;\n if (typeof row !== 'number' || !Number.isInteger(row) || row < 1) continue;\n if (typeof message !== 'string' || !message) continue;\n rows.push({\n row,\n field: typeof field === 'string' && field ? field : null,\n code: typeof code === 'string' ? code : '',\n message,\n });\n }\n if (rows.length > 0) return rows.sort((a, b) => a.row - b.row);\n }\n return null;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"satisfactionCsv.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/satisfactionCsv.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"satisfactionCsv.js","names":[],"sources":["../../../src/planmagnet/satisfaction/satisfactionCsv.ts"],"sourcesContent":["import {\n COMMENT_MAX,\n EXTERNAL_ID_MAX,\n MAX_IMPORT_ROWS,\n RESPONDED_AT_EARLIEST,\n RESPONDENT_EMAIL_MAX,\n RESPONDENT_NAME_MAX,\n SCORE_SCALE,\n isOnScale,\n looksLikeEmail,\n respondedAtProblem,\n type SatisfactionMetricType,\n} from './satisfaction';\n\n/**\n * ANR-21 CSV import, read in the browser: parse the file, map its header, and turn each row into exactly the\n * `PlanmagnetCustomerSatisfactionImportRow` the service takes — with every problem the service would refuse it for,\n * so the preview can show them by row before anything is sent. The service re-checks every row (and whether each\n * linked product, release and project exists) and is the only gate; the import is all or nothing there.\n *\n * Rows are numbered from 1 in the order they are sent, which is the order of the data rows in the file (blank lines\n * dropped) — the same numbering the service uses in `extensions.rowErrors`. No React here: tests/satisfactionCsv.test.ts.\n */\n\n/** The columns of an import file, in template order. */\nexport const IMPORT_COLUMNS = [\n 'externalId',\n 'metricType',\n 'score',\n 'respondedAt',\n 'productId',\n 'releaseId',\n 'projectId',\n 'isAnonymous',\n 'respondentName',\n 'respondentEmail',\n 'comment',\n] as const;\n\nexport type ImportColumn = (typeof IMPORT_COLUMNS)[number];\n\nexport const REQUIRED_COLUMNS: readonly ImportColumn[] = [\n 'externalId',\n 'metricType',\n 'score',\n 'respondedAt',\n];\n\n/** A file larger than this is refused before it is read: 500 rows of 5000-character comments still fit. */\nexport const MAX_FILE_BYTES = 5 * 1024 * 1024;\n\nconst UTF8_BOM = String.fromCharCode(0xfeff);\n\n// ─── CSV ────────────────────────────────────────────────────────────────────\n\n/**\n * The delimiter of a file: the one of comma, semicolon (spreadsheets in many locales) or tab that occurs most often in\n * its first line outside quotes. Comma when there is none.\n */\nexport function detectDelimiter(text: string): string {\n const counts: Record<string, number> = { ',': 0, ';': 0, '\\t': 0 };\n let quoted = false;\n for (const c of text) {\n if (c === '\"') quoted = !quoted;\n else if (!quoted && (c === '\\n' || c === '\\r')) break;\n else if (!quoted && c in counts) counts[c] += 1;\n }\n let best = ',';\n for (const candidate of [';', '\\t']) if (counts[candidate] > counts[best]) best = candidate;\n return best;\n}\n\n/**\n * RFC 4180 records: quoted fields may hold the delimiter, line breaks and doubled quotes; CRLF, LF and CR all end a\n * record. A leading byte-order mark is dropped. Lines with nothing but delimiters and spaces are dropped. `unterminated`\n * is true when the file ends inside a quoted field — the file is malformed and nothing in it can be trusted.\n */\nexport function parseCsv(input: string): { records: string[][]; unterminated: boolean } {\n const text = input.startsWith(UTF8_BOM) ? input.slice(1) : input;\n const delimiter = detectDelimiter(text);\n const records: string[][] = [];\n let record: string[] = [];\n let field = '';\n let quoted = false;\n let fieldStarted = false;\n\n const endField = () => {\n record.push(field);\n field = '';\n fieldStarted = false;\n };\n const endRecord = () => {\n endField();\n if (record.some((cell) => cell.trim() !== '')) records.push(record);\n record = [];\n };\n\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quoted) {\n if (c === '\"') {\n if (text[i + 1] === '\"') {\n field += '\"';\n i++;\n } else {\n quoted = false;\n }\n } else {\n field += c;\n }\n continue;\n }\n if (c === '\"' && !fieldStarted) {\n quoted = true;\n fieldStarted = true;\n } else if (c === delimiter) {\n endField();\n } else if (c === '\\r' || c === '\\n') {\n if (c === '\\r' && text[i + 1] === '\\n') i++;\n endRecord();\n } else {\n // A quote inside an unquoted field is kept as written.\n field += c;\n fieldStarted = true;\n }\n }\n if (quoted) return { records, unterminated: true };\n if (field !== '' || record.length > 0) endRecord();\n return { records, unterminated: false };\n}\n\n/** A header cell compared without case, spaces, dashes or underscores: \"External ID\" and \"external_id\" both match. */\nfunction headerKey(cell: string): string {\n return cell\n .trim()\n .toLowerCase()\n .replace(/[\\s_-]+/g, '');\n}\n\nconst COLUMN_BY_KEY = new Map<string, ImportColumn>(IMPORT_COLUMNS.map((c) => [headerKey(c), c]));\n\nexport type FileProblem =\n | { code: 'unterminatedQuote' }\n | { code: 'empty' }\n | { code: 'missingColumns'; columns: ImportColumn[] }\n | { code: 'duplicateColumn'; column: ImportColumn }\n | { code: 'noRows' }\n | { code: 'tooManyRows'; count: number; max: number };\n\nexport interface ParsedImportFile {\n /** The position of each column the header names. */\n columns: Partial<Record<ImportColumn, number>>;\n /** Header cells that name no column: ignored, and listed so a misspelt header is visible. */\n ignoredColumns: string[];\n /** The data records, header excluded, in file order. */\n records: string[][];\n /** Why nothing in the file can be imported, or null. */\n problem: FileProblem | null;\n}\n\n/** Parse a whole import file and check its shape: a header with the required columns, then 1-500 rows. */\nexport function parseImportFile(text: string): ParsedImportFile {\n const { records, unterminated } = parseCsv(text);\n const empty: ParsedImportFile = { columns: {}, ignoredColumns: [], records: [], problem: null };\n if (unterminated) return { ...empty, problem: { code: 'unterminatedQuote' } };\n const [header, ...rows] = records;\n if (!header) return { ...empty, problem: { code: 'empty' } };\n\n const columns: Partial<Record<ImportColumn, number>> = {};\n const ignoredColumns: string[] = [];\n let problem: FileProblem | null = null;\n header.forEach((cell, index) => {\n const column = COLUMN_BY_KEY.get(headerKey(cell));\n if (!column) {\n if (cell.trim()) ignoredColumns.push(cell.trim());\n return;\n }\n if (columns[column] !== undefined) problem ??= { code: 'duplicateColumn', column };\n else columns[column] = index;\n });\n const missing = REQUIRED_COLUMNS.filter((column) => columns[column] === undefined);\n if (missing.length > 0) problem ??= { code: 'missingColumns', columns: missing };\n if (rows.length === 0) problem ??= { code: 'noRows' };\n if (rows.length > MAX_IMPORT_ROWS) {\n problem ??= { code: 'tooManyRows', count: rows.length, max: MAX_IMPORT_ROWS };\n }\n return { columns, ignoredColumns, records: rows, problem };\n}\n\n// ─── Rows ───────────────────────────────────────────────────────────────────\n\n/** Exactly the fields of `PlanmagnetCustomerSatisfactionImportRow` — nothing else may ride in the variables. */\nexport interface ImportRowInput {\n externalId: string;\n metricType: SatisfactionMetricType;\n score: number;\n respondedAt: string;\n productId?: string;\n releaseId?: string;\n projectId?: string;\n isAnonymous: boolean;\n respondentName?: string;\n respondentEmail?: string;\n comment?: string;\n}\n\nexport type RowProblemCode =\n | 'externalIdRequired'\n | 'externalIdTooLong'\n | 'externalIdDuplicate'\n | 'metricTypeRequired'\n | 'metricTypeInvalid'\n | 'scoreRequired'\n | 'scoreNotWholeNumber'\n | 'scoreOutOfRange'\n | 'respondedAtRequired'\n | 'respondedAtFormat'\n | 'respondedAtInFuture'\n | 'respondedAtTooOld'\n | 'anonymousInvalid'\n | 'anonymousWithIdentity'\n | 'respondentNameTooLong'\n | 'respondentEmailInvalid'\n | 'commentTooLong'\n | 'linkRequired';\n\nexport interface RowProblem {\n code: RowProblemCode;\n /** Values for the message ({{max}}, {{row}}, {{metric}}, {{min}}). */\n params?: Record<string, string | number>;\n}\n\n/** The links a row without any of its own gets ('' = none). Set in the import dialog, never inferred. */\nexport interface DefaultLinks {\n productId: string;\n releaseId: string;\n projectId: string;\n}\n\nexport interface PreviewRow {\n /** 1-based, in sending order — the number the service reports a refused row by. */\n row: number;\n /** Each column's text, trimmed ('' when the file has no such column). */\n cells: Record<ImportColumn, string>;\n /** True when the row names no product, release or project and takes the dialog's default links. */\n usesDefaultLinks: boolean;\n /** What would be sent for this row; null while it has a problem. */\n input: ImportRowInput | null;\n problems: RowProblem[];\n}\n\nconst TRUE_WORDS = new Set(['true', 'yes', 'y', '1']);\nconst FALSE_WORDS = new Set(['false', 'no', 'n', '0', '']);\n\n/** True when an isAnonymous cell says yes (true / yes / y / 1, any case). */\nexport function cellIsTrue(text: string): boolean {\n return TRUE_WORDS.has(text.trim().toLowerCase());\n}\nconst WHOLE_NUMBER = /^[+-]?\\d+(?:\\.0+)?$/;\n\nfunction cellsOf(file: ParsedImportFile, record: string[]): Record<ImportColumn, string> {\n const cells = {} as Record<ImportColumn, string>;\n for (const column of IMPORT_COLUMNS) {\n const index = file.columns[column];\n cells[column] = index === undefined ? '' : (record[index] ?? '').trim();\n }\n return cells;\n}\n\n/**\n * Every data row as it would be sent, with the problems the service would refuse it for. `defaults` fill the links of\n * a row that names no product, release or project at all — a row with any link of its own keeps exactly its own, so a\n * default product can never contradict a release the file names.\n */\nexport function previewRows(\n file: ParsedImportFile,\n defaults: DefaultLinks,\n now: Date\n): PreviewRow[] {\n const firstRowOf = new Map<string, number>();\n const hasDefaults = !!(defaults.productId || defaults.releaseId || defaults.projectId);\n\n return file.records.map((record, index) => {\n const row = index + 1;\n const cells = cellsOf(file, record);\n const problems: RowProblem[] = [];\n\n const externalId = cells.externalId;\n if (!externalId) problems.push({ code: 'externalIdRequired' });\n else if (externalId.length > EXTERNAL_ID_MAX) {\n problems.push({ code: 'externalIdTooLong', params: { max: EXTERNAL_ID_MAX } });\n } else {\n const first = firstRowOf.get(externalId);\n if (first !== undefined)\n problems.push({ code: 'externalIdDuplicate', params: { row: first } });\n else firstRowOf.set(externalId, row);\n }\n\n const metricText = cells.metricType.toUpperCase();\n const metricType: SatisfactionMetricType | null =\n metricText === 'CSAT' || metricText === 'NPS' ? metricText : null;\n if (!cells.metricType) problems.push({ code: 'metricTypeRequired' });\n else if (!metricType) problems.push({ code: 'metricTypeInvalid' });\n\n let score: number | null = null;\n if (!cells.score) problems.push({ code: 'scoreRequired' });\n else if (!WHOLE_NUMBER.test(cells.score)) problems.push({ code: 'scoreNotWholeNumber' });\n else {\n score = Number(cells.score);\n if (metricType && !isOnScale(metricType, score)) {\n const { min, max } = SCORE_SCALE[metricType];\n problems.push({ code: 'scoreOutOfRange', params: { metric: metricType, min, max } });\n }\n }\n\n const dateProblem = respondedAtProblem(cells.respondedAt, now);\n if (dateProblem === 'required') problems.push({ code: 'respondedAtRequired' });\n else if (dateProblem === 'format') problems.push({ code: 'respondedAtFormat' });\n else if (dateProblem === 'future') problems.push({ code: 'respondedAtInFuture' });\n else if (dateProblem === 'tooOld') {\n problems.push({ code: 'respondedAtTooOld', params: { min: RESPONDED_AT_EARLIEST } });\n }\n\n const isAnonymous = cellIsTrue(cells.isAnonymous);\n if (!isAnonymous && !FALSE_WORDS.has(cells.isAnonymous.toLowerCase())) {\n problems.push({ code: 'anonymousInvalid' });\n }\n\n const name = cells.respondentName;\n const email = cells.respondentEmail;\n if (name.length > RESPONDENT_NAME_MAX) {\n problems.push({ code: 'respondentNameTooLong', params: { max: RESPONDENT_NAME_MAX } });\n }\n if (email && (email.length > RESPONDENT_EMAIL_MAX || !looksLikeEmail(email))) {\n problems.push({ code: 'respondentEmailInvalid', params: { max: RESPONDENT_EMAIL_MAX } });\n }\n if (isAnonymous && (name || email)) problems.push({ code: 'anonymousWithIdentity' });\n\n const comment = cells.comment;\n if (comment.length > COMMENT_MAX) {\n problems.push({ code: 'commentTooLong', params: { max: COMMENT_MAX } });\n }\n\n const ownLinks = !!(cells.productId || cells.releaseId || cells.projectId);\n const usesDefaultLinks = !ownLinks && hasDefaults;\n const links = ownLinks\n ? { productId: cells.productId, releaseId: cells.releaseId, projectId: cells.projectId }\n : defaults;\n if (!links.productId && !links.releaseId && !links.projectId) {\n problems.push({ code: 'linkRequired' });\n }\n\n const input: ImportRowInput | null =\n problems.length === 0 && metricType && score !== null\n ? {\n externalId,\n metricType,\n score,\n respondedAt: cells.respondedAt,\n ...(links.productId ? { productId: links.productId } : {}),\n ...(links.releaseId ? { releaseId: links.releaseId } : {}),\n ...(links.projectId ? { projectId: links.projectId } : {}),\n isAnonymous,\n ...(name ? { respondentName: name } : {}),\n ...(email ? { respondentEmail: email } : {}),\n ...(comment ? { comment } : {}),\n }\n : null;\n\n return { row, cells, usesDefaultLinks, input, problems };\n });\n}\n\n/** The template: the header row only — an example row imported by mistake would count as a real answer. */\nexport function templateCsv(): string {\n return `${UTF8_BOM}${IMPORT_COLUMNS.join(',')}\\r\\n`;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"satisfactionForm.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/satisfactionForm.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,sBAAsB,EAC5B,MAAM,gBAAgB,CAAC;AAExB;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,sBAAsB,CAAC;IACnC,2GAA2G;IAC3G,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,qGAAqG;IACrG,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wFAAwF;AACxF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wHAAwH;AACxH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,kBAAkB,CAYjF;AAED,4GAA4G;AAC5G,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,kBAAkB,CAczE;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,sBAAsB,GACjC,kBAAkB,CAGpB;AAED,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,aAAa,GACb,OAAO,GACP,gBAAgB,GAChB,iBAAiB,GACjB,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,iBAAiB,GACjB,qBAAqB,GACrB,mBAAmB,GACnB,qBAAqB,GACrB,mBAAmB,GACnB,cAAc,GACd,uBAAuB,GACvB,wBAAwB,GACxB,gBAAgB,GAChB,mBAAmB,CAAC;AASxB,6FAA6F;AAC7F,wBAAgB,YAAY,CAC1B,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,IAAI,EACT,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAmBzC;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,6GAA6G;AAC7G,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAOD,+GAA+G;AAC/G,wBAAgB,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,mBAAmB,CAkB/F;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,kBAAkB,EAC3B,IAAI,EAAE,kBAAkB,GACvB,mBAAmB,CAsBrB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"satisfactionForm.js","names":[],"sources":["../../../src/planmagnet/satisfaction/satisfactionForm.ts"],"sourcesContent":["import {\n COMMENT_MAX,\n EXTERNAL_ID_MAX,\n RESPONDENT_EMAIL_MAX,\n RESPONDENT_NAME_MAX,\n isOnScale,\n looksLikeEmail,\n respondedAtProblem,\n utcDay,\n type SatisfactionMetricType,\n} from './satisfaction';\n\n/**\n * ANR-21 add / edit form, framework-free: the form's values, what the service would refuse them for, and exactly the\n * create or update input they become (tests/satisfaction.test.ts). Inputs carry only fields of the SDL input types —\n * an extra field in the variables fails every save, and the document-level drift gates cannot see it.\n */\n\nexport interface ResponseFormValues {\n metricType: SatisfactionMetricType;\n /** Null until a score is picked (and again when the metric changes to a scale the old score is not on). */\n score: number | null;\n /** YYYY-MM-DD — the day the customer answered, sent as a calendar date (that day's UTC midnight). */\n respondedAt: string;\n productId: string;\n releaseId: string;\n projectId: string;\n isAnonymous: boolean;\n respondentName: string;\n respondentEmail: string;\n comment: string;\n /** Create only: source and externalId never change after that. */\n externalId: string;\n}\n\n/** The stored response a form edits — the fields of `SatisfactionResponse` it needs. */\nexport interface StoredResponse {\n metricType: SatisfactionMetricType;\n score: number;\n respondedAt: string;\n productId: string | null;\n releaseId: string | null;\n projectId: string | null;\n isAnonymous: boolean;\n respondentName: string | null;\n respondentEmail: string | null;\n comment: string | null;\n externalId: string | null;\n}\n\nexport interface FormLinks {\n productId: string;\n releaseId: string;\n projectId: string;\n}\n\n/** A new response's starting values: CSAT, no score yet, answered today, linked to whatever the page is filtered to. */\nexport function newFormValues(today: string, links: FormLinks): ResponseFormValues {\n return {\n metricType: 'CSAT',\n score: null,\n respondedAt: today,\n ...links,\n isAnonymous: false,\n respondentName: '',\n respondentEmail: '',\n comment: '',\n externalId: '',\n };\n}\n\n/** A stored response as form values. Its answer day is its UTC day — the day the figures count it under. */\nexport function formValuesOf(response: StoredResponse): ResponseFormValues {\n return {\n metricType: response.metricType,\n score: response.score,\n respondedAt: utcDay(response.respondedAt) ?? '',\n productId: response.productId ?? '',\n releaseId: response.releaseId ?? '',\n projectId: response.projectId ?? '',\n isAnonymous: response.isAnonymous,\n respondentName: response.respondentName ?? '',\n respondentEmail: response.respondentEmail ?? '',\n comment: response.comment ?? '',\n externalId: response.externalId ?? '',\n };\n}\n\n/** A new metric keeps the score only when it is on the new scale. */\nexport function withMetricType(\n values: ResponseFormValues,\n metricType: SatisfactionMetricType\n): ResponseFormValues {\n const score = values.score !== null && isOnScale(metricType, values.score) ? values.score : null;\n return { ...values, metricType, score };\n}\n\nexport type FormField =\n | 'score'\n | 'respondedAt'\n | 'links'\n | 'respondentName'\n | 'respondentEmail'\n | 'comment'\n | 'externalId';\n\nexport type FormProblem =\n | 'scoreRequired'\n | 'scoreOutOfRange'\n | 'respondedAtRequired'\n | 'respondedAtFormat'\n | 'respondedAtInFuture'\n | 'respondedAtTooOld'\n | 'linkRequired'\n | 'respondentNameTooLong'\n | 'respondentEmailInvalid'\n | 'commentTooLong'\n | 'externalIdTooLong';\n\nconst RESPONDED_AT_PROBLEM = {\n required: 'respondedAtRequired',\n format: 'respondedAtFormat',\n future: 'respondedAtInFuture',\n tooOld: 'respondedAtTooOld',\n} as const;\n\n/** What the service would refuse these values for, by field. Empty when they can be sent. */\nexport function formProblems(\n values: ResponseFormValues,\n now: Date,\n isNew: boolean\n): Partial<Record<FormField, FormProblem>> {\n const out: Partial<Record<FormField, FormProblem>> = {};\n if (values.score === null) out.score = 'scoreRequired';\n else if (!isOnScale(values.metricType, values.score)) out.score = 'scoreOutOfRange';\n const dateProblem = respondedAtProblem(values.respondedAt, now);\n if (dateProblem) out.respondedAt = RESPONDED_AT_PROBLEM[dateProblem];\n if (!values.productId && !values.releaseId && !values.projectId) out.links = 'linkRequired';\n if (!values.isAnonymous) {\n const name = values.respondentName.trim();\n const email = values.respondentEmail.trim();\n if (name.length > RESPONDENT_NAME_MAX) out.respondentName = 'respondentNameTooLong';\n if (email && (email.length > RESPONDENT_EMAIL_MAX || !looksLikeEmail(email))) {\n out.respondentEmail = 'respondentEmailInvalid';\n }\n }\n if (values.comment.trim().length > COMMENT_MAX) out.comment = 'commentTooLong';\n if (isNew && values.externalId.trim().length > EXTERNAL_ID_MAX)\n out.externalId = 'externalIdTooLong';\n return out;\n}\n\n/** `PlanmagnetCreateCustomerSatisfactionResponseInput`, field for field. */\nexport interface CreateResponseInput {\n metricType: SatisfactionMetricType;\n score: number;\n respondedAt: string;\n productId?: string;\n releaseId?: string;\n projectId?: string;\n isAnonymous: boolean;\n respondentName?: string;\n respondentEmail?: string;\n comment?: string;\n externalId?: string;\n}\n\n/** `PlanmagnetUpdateCustomerSatisfactionResponseInput`: an omitted field keeps its value, null clears it. */\nexport interface UpdateResponseInput {\n metricType?: SatisfactionMetricType;\n score?: number;\n respondedAt?: string;\n productId?: string | null;\n releaseId?: string | null;\n projectId?: string | null;\n isAnonymous?: boolean;\n respondentName?: string | null;\n respondentEmail?: string | null;\n comment?: string | null;\n}\n\nconst text = (value: string): string | null => {\n const trimmed = value.trim();\n return trimmed === '' ? null : trimmed;\n};\n\n/** The create input for valid values (formProblems is empty). An anonymous response sends no name or email. */\nexport function createInput(values: ResponseFormValues & { score: number }): CreateResponseInput {\n const name = values.isAnonymous ? null : text(values.respondentName);\n const email = values.isAnonymous ? null : text(values.respondentEmail);\n const comment = text(values.comment);\n const externalId = text(values.externalId);\n return {\n metricType: values.metricType,\n score: values.score,\n respondedAt: values.respondedAt,\n ...(values.productId ? { productId: values.productId } : {}),\n ...(values.releaseId ? { releaseId: values.releaseId } : {}),\n ...(values.projectId ? { projectId: values.projectId } : {}),\n isAnonymous: values.isAnonymous,\n ...(name ? { respondentName: name } : {}),\n ...(email ? { respondentEmail: email } : {}),\n ...(comment ? { comment } : {}),\n ...(externalId ? { externalId } : {}),\n };\n}\n\n/**\n * Only what changed, so a save never rewrites a field someone else edited meanwhile. A cleared link or text is sent as\n * null (clears it). Making a response anonymous sends `isAnonymous: true` alone — the service then clears the stored\n * name and email itself; a name or email sent with it would be refused.\n */\nexport function updateInput(\n initial: ResponseFormValues,\n next: ResponseFormValues\n): UpdateResponseInput {\n const out: UpdateResponseInput = {};\n if (next.metricType !== initial.metricType) out.metricType = next.metricType;\n if (next.score !== null && next.score !== initial.score) out.score = next.score;\n if (next.respondedAt !== initial.respondedAt) out.respondedAt = next.respondedAt;\n if (next.productId !== initial.productId) out.productId = next.productId || null;\n if (next.releaseId !== initial.releaseId) out.releaseId = next.releaseId || null;\n if (next.projectId !== initial.projectId) out.projectId = next.projectId || null;\n if (next.isAnonymous !== initial.isAnonymous) out.isAnonymous = next.isAnonymous;\n if (!next.isAnonymous) {\n // Leaving anonymity, the stored identity is empty: whatever was typed is new.\n const before = initial.isAnonymous ? { name: null, email: null } : null;\n const name = text(next.respondentName);\n const email = text(next.respondentEmail);\n if (name !== (before ? before.name : text(initial.respondentName))) out.respondentName = name;\n if (email !== (before ? before.email : text(initial.respondentEmail))) {\n out.respondentEmail = email;\n }\n }\n const comment = text(next.comment);\n if (comment !== text(initial.comment)) out.comment = comment;\n return out;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"satisfactionOperations.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/satisfactionOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"satisfactionOperations.js","names":[],"sources":["../../../src/planmagnet/satisfaction/satisfactionOperations.ts"],"sourcesContent":["import { gql } from '@apollo/client';\nimport type { SatisfactionMetricType, WindowPreset } from './satisfaction';\n\n/**\n * ANR-21 GraphQL documents: customer-satisfaction figures (CSAT and NPS), the responses behind them, and their writes.\n * Every document here has a twin in src/operations/wspace/planmagnet/{fragments,queries,mutations}/customerSatisfaction.graphql,\n * which `bun run codegen` validates against the planmagnet schema and CI's live-supergraph drift job validates against\n * what production serves; tests/satisfactionOperations.test.ts fails when the two copies differ.\n *\n * Every read is a query of its own (the PRM-01 rule): a section that cannot be read — a role without\n * `planmagnet-product:read`, or a gateway that does not serve a field yet — fails that card only, never the page or\n * the card it sits on (the delivery KPIs card keeps its on-time and scope figures if satisfaction fails).\n */\n\nconst SUMMARY_FIELDS = `\n productId\n releaseId\n projectId\n window {\n preset\n from\n to\n }\n csat {\n score\n responseCount\n satisfiedCount\n minimumResponses\n notEnoughResponses\n }\n nps {\n score\n responseCount\n promoterCount\n passiveCount\n detractorCount\n minimumResponses\n notEnoughResponses\n }\n`;\n\nconst RESPONSE_FIELDS = `\n id\n metricType\n score\n respondedAt\n comment\n isAnonymous\n respondentName\n respondentEmail\n source\n externalId\n productId\n releaseId\n projectId\n product {\n id\n name\n }\n release {\n id\n name\n version\n }\n project {\n id\n name\n }\n createdAt\n updatedAt\n`;\n\n// ─── Queries ────────────────────────────────────────────────────────────────\n\n/** CSAT and NPS for the workspace, or one product / release / project, over a window (default: trailing 90 days). */\nexport const CUSTOMER_SATISFACTION_SUMMARY = gql`\n query CustomerSatisfactionSummary(\n $workspaceId: ID!\n $filter: PlanmagnetCustomerSatisfactionFilter\n ) {\n planmagnetCustomerSatisfaction(workspaceId: $workspaceId, filter: $filter) {\n ${SUMMARY_FIELDS}\n }\n }\n`;\n\n/** One page of responses, newest answer first. */\nexport const CUSTOMER_SATISFACTION_RESPONSES = gql`\n query CustomerSatisfactionResponses(\n $workspaceId: ID!\n $filter: PlanmagnetCustomerSatisfactionResponseFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetCustomerSatisfactionResponses(\n workspaceId: $workspaceId\n filter: $filter\n pagination: $pagination\n ) {\n items {\n ${RESPONSE_FIELDS}\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n totalCount\n }\n }\n`;\n\n/**\n * Releases for the release pickers, with their product: a response's release must belong to the product named with\n * it (or to no product), so the pickers offer only those. Paged — see useSatisfactionReleaseOptions.\n */\nexport const CUSTOMER_SATISFACTION_RELEASE_OPTIONS = gql`\n query CustomerSatisfactionReleaseOptions(\n $workspaceId: ID!\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetReleases(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n version\n productId\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n`;\n\n// ─── Mutations ──────────────────────────────────────────────────────────────\n\nexport const CREATE_CUSTOMER_SATISFACTION_RESPONSE = gql`\n mutation CreateCustomerSatisfactionResponse(\n $input: PlanmagnetCreateCustomerSatisfactionResponseInput!\n ) {\n planmagnetCreateCustomerSatisfactionResponse(input: $input) {\n ${RESPONSE_FIELDS}\n }\n }\n`;\n\nexport const UPDATE_CUSTOMER_SATISFACTION_RESPONSE = gql`\n mutation UpdateCustomerSatisfactionResponse(\n $id: ID!\n $input: PlanmagnetUpdateCustomerSatisfactionResponseInput!\n ) {\n planmagnetUpdateCustomerSatisfactionResponse(id: $id, input: $input) {\n ${RESPONSE_FIELDS}\n }\n }\n`;\n\nexport const DELETE_CUSTOMER_SATISFACTION_RESPONSE = gql`\n mutation DeleteCustomerSatisfactionResponse($id: ID!) {\n planmagnetDeleteCustomerSatisfactionResponse(id: $id)\n }\n`;\n\nexport const IMPORT_CUSTOMER_SATISFACTION_RESPONSES = gql`\n mutation ImportCustomerSatisfactionResponses(\n $input: PlanmagnetImportCustomerSatisfactionResponsesInput!\n ) {\n planmagnetImportCustomerSatisfactionResponses(input: $input) {\n createdCount\n skippedCount\n skippedExternalIds\n }\n }\n`;\n\n// ─── Refetch group ──────────────────────────────────────────────────────────\n\n/** Every query that shows a satisfaction figure or a response — refetched after any satisfaction write. */\nexport const SATISFACTION_QUERIES = [\n 'CustomerSatisfactionSummary',\n 'CustomerSatisfactionResponses',\n];\n\n// ─── Result shapes ──────────────────────────────────────────────────────────\n\nexport interface CsatFigure {\n /** satisfiedCount * 100 / responseCount, exact. Null below minimumResponses — never 0. */\n score: number | null;\n responseCount: number;\n satisfiedCount: number;\n minimumResponses: number;\n notEnoughResponses: boolean;\n}\n\nexport interface NpsFigure {\n /** (promoters - detractors) * 100 / responseCount, exact, -100..100. Null below minimumResponses. */\n score: number | null;\n responseCount: number;\n promoterCount: number;\n passiveCount: number;\n detractorCount: number;\n minimumResponses: number;\n notEnoughResponses: boolean;\n}\n\nexport interface SatisfactionWindowEcho {\n preset: WindowPreset;\n /** The start of the first UTC day counted. */\n from: string;\n /** The end of the last UTC day counted. */\n to: string;\n}\n\nexport interface CustomerSatisfactionSummary {\n productId: string | null;\n releaseId: string | null;\n projectId: string | null;\n window: SatisfactionWindowEcho;\n csat: CsatFigure;\n nps: NpsFigure;\n}\n\nexport interface CustomerSatisfactionSummaryData {\n planmagnetCustomerSatisfaction: CustomerSatisfactionSummary;\n}\n\nexport interface SatisfactionResponse {\n id: string;\n metricType: SatisfactionMetricType;\n score: number;\n respondedAt: string;\n comment: string | null;\n isAnonymous: boolean;\n respondentName: string | null;\n respondentEmail: string | null;\n /** MANUAL | IMPORT — kept a string so a value added later still renders. */\n source: string;\n externalId: string | null;\n productId: string | null;\n releaseId: string | null;\n projectId: string | null;\n /** Null when there is no product link, or the product was deleted since. */\n product: { id: string; name: string } | null;\n release: { id: string; name: string; version: string } | null;\n project: { id: string; name: string } | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface CustomerSatisfactionResponsesData {\n planmagnetCustomerSatisfactionResponses: {\n items: SatisfactionResponse[];\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n totalCount: number;\n };\n}\n\nexport interface SatisfactionReleaseOption {\n id: string;\n name: string;\n version: string;\n productId: string | null;\n}\n\nexport interface CustomerSatisfactionReleaseOptionsData {\n planmagnetReleases: {\n items: SatisfactionReleaseOption[];\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n };\n}\n\nexport interface ImportCustomerSatisfactionResult {\n createdCount: number;\n skippedCount: number;\n skippedExternalIds: string[];\n}\n"],"mappings":";;AAcA,IAAM,IAAiB,8VA2BjB,IAAkB,mUAkCX,IAAgC,CAAG;;;;;;QAMxC,EAAe;;;GAMV,IAAkC,CAAG;;;;;;;;;;;;UAYxC,EAAgB;;;;;;;;;GAeb,IAAwC,CAAG;;;;;;;;;;;;;;;;;;GAsB3C,IAAwC,CAAG;;;;;QAKhD,EAAgB;;;GAKX,IAAwC,CAAG;;;;;;QAMhD,EAAgB;;;GAKX,IAAwC,CAAG;;;;GAM3C,IAAyC,CAAG;;;;;;;;;;GAe5C,IAAuB,CAClC,+BACA,gCACD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSatisfactionAccess.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/useSatisfactionAccess.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,yFAAyF;IACzF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAeD,wBAAgB,qBAAqB,IAAI,kBAAkB,CAe1D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSatisfactionAccess.js","names":[],"sources":["../../../src/planmagnet/satisfaction/useSatisfactionAccess.ts"],"sourcesContent":["import { useSafePermissions } from '@burdenoff/fe-libs/shared/providers/shell/PermissionProvider';\n\n/**\n * What the viewer may do with customer-satisfaction responses. Every satisfaction operation sits on the\n * `planmagnet-product` RBAC resource: read for viewers (Quality Lead, Contributor, Stakeholder), create / update /\n * delete for the product managers (PM, Delivery Owner, Portfolio Lead). Viewers get a read-only page: the write\n * controls are not rendered for a permission the role does not hold.\n *\n * This only decides what is SHOWN — the gateway enforces every write, and a refusal is still shown verbatim. Where the\n * permission set cannot be read (a host that mounts no PermissionProvider, or the RBAC read failed) the controls stay,\n * as on the other product pages: the gateway decides, and the refusal says why. While it is still loading they are\n * hidden, so a viewer never sees a control flash in and out.\n */\nexport interface SatisfactionAccess {\n canCreate: boolean;\n canUpdate: boolean;\n canDelete: boolean;\n /** True only when the viewer's permission set is known and allows none of the writes. */\n readOnly: boolean;\n}\n\nconst EVERYTHING: SatisfactionAccess = {\n canCreate: true,\n canUpdate: true,\n canDelete: true,\n readOnly: false,\n};\nconst NOTHING: SatisfactionAccess = {\n canCreate: false,\n canUpdate: false,\n canDelete: false,\n readOnly: false,\n};\n\nexport function useSatisfactionAccess(): SatisfactionAccess {\n const permissions = useSafePermissions();\n // No provider (a standalone mount): the gateway decides.\n if (!permissions) return EVERYTHING;\n // A permission set is at hand (a super admin's bypass has none, and every check passes).\n if (permissions.isSuperAdmin || permissions.permissions) {\n const canCreate = permissions.hasPermission('planmagnet-product:create');\n const canUpdate = permissions.hasPermission('planmagnet-product:update');\n const canDelete = permissions.hasPermission('planmagnet-product:delete');\n return { canCreate, canUpdate, canDelete, readOnly: !canCreate && !canUpdate && !canDelete };\n }\n // The RBAC read failed: the gateway decides, and a refusal says why.\n if (permissions.error) return EVERYTHING;\n // Still loading.\n return NOTHING;\n}\n"],"mappings":";;AAqBA,IAAM,IAAiC;CACrC,WAAW;CACX,WAAW;CACX,WAAW;CACX,UAAU;CACX,EACK,IAA8B;CAClC,WAAW;CACX,WAAW;CACX,WAAW;CACX,UAAU;CACX;AAED,SAAgB,IAA4C;CAC1D,IAAM,IAAc,GAAoB;AAExC,KAAI,CAAC,EAAa,QAAO;AAEzB,KAAI,EAAY,gBAAgB,EAAY,aAAa;EACvD,IAAM,IAAY,EAAY,cAAc,4BAA4B,EAClE,IAAY,EAAY,cAAc,4BAA4B,EAClE,IAAY,EAAY,cAAc,4BAA4B;AACxE,SAAO;GAAE;GAAW;GAAW;GAAW,UAAU,CAAC,KAAa,CAAC,KAAa,CAAC;GAAW;;AAK9F,QAFI,EAAY,QAAc,IAEvB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RequiredSkillsEditor.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/skills/RequiredSkillsEditor.tsx"],"names":[],"mappings":"AAYA;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,EAAE,EACF,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,WAAkB,EAClB,IAAI,GACL,EAAE;IACD,+DAA+D;IAC/D,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0GAA0G;IAC1G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,2CA4GA;AA6BD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,WAAkB,EAClB,OAAe,EACf,SAAgB,GACjB,EAAE;IACD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,2CA6BA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RequiredSkillsEditor.js","names":[],"sources":["../../../src/planmagnet/skills/RequiredSkillsEditor.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Badge, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Plus, X } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport {\n MAX_REQUIRED_SKILLS,\n addSkillTags,\n removeSkillAt,\n skillKey,\n type SkillTagProblem,\n} from './skillTags';\n\n/**\n * The required-skills tag editor (ANR-07, ANR-28) on the task create and edit pages and the board's bulk edit. It is\n * controlled: the page owns the list and sends it with its own save. Enter, a comma or leaving the box adds what was\n * typed (a pasted comma- or line-separated list adds several); the × on a chip removes it. The service's write rules\n * are applied as the user types (see skillTags.ts), and a refusal the service still returns — BAD_USER_INPUT tagged\n * `requiredSkills` — is passed back in as `serverError` and shown on the field.\n */\nexport function RequiredSkillsEditor({\n id,\n value,\n onChange,\n disabled = false,\n serverError = null,\n hint,\n}: {\n /** The text box's id, for the page's own `<label htmlFor>`. */\n id: string;\n value: readonly string[];\n onChange: (next: string[]) => void;\n disabled?: boolean;\n /** The service's reason for refusing this field on the last save, shown inline until the list changes. */\n serverError?: string | null;\n /** Replaces the standard hint under the box. */\n hint?: string;\n}) {\n const tr = useTr();\n const [text, setText] = useState('');\n const [problem, setProblem] = useState<SkillTagProblem | null>(null);\n const full = value.length >= MAX_REQUIRED_SKILLS;\n\n const commit = () => {\n if (!text.trim()) {\n if (text) setText('');\n return;\n }\n const result = addSkillTags(value, text);\n if (result.skills.length !== value.length) onChange(result.skills);\n setText(result.rest);\n setProblem(result.problem);\n };\n\n const remove = (index: number) => {\n setProblem(null);\n onChange(removeSkillAt(value, index));\n };\n\n const problemText = problem ? describeProblem(problem, tr) : null;\n const error = problemText ?? serverError;\n const errorId = `${id}-error`;\n const hintId = `${id}-hint`;\n const counter = tr('planmagnet.skills.editor.count', '{{count}} of {{max}}', {\n count: value.length,\n max: MAX_REQUIRED_SKILLS,\n });\n\n return (\n <div className=\"mt-1 space-y-2\" data-testid=\"required-skills-editor\">\n {value.length > 0 && (\n <ul\n className=\"flex flex-wrap gap-1\"\n aria-label={tr('planmagnet.skills.editor.listLabel', 'Required skills')}\n >\n {value.map((skill, index) => (\n <li key={`${skillKey(skill)}-${index}`}>\n <Badge variant=\"secondary\" className=\"gap-1 pr-1 font-normal\">\n <span>{skill}</span>\n <button\n type=\"button\"\n className=\"rounded-full p-0.5 hover:bg-muted disabled:opacity-50\"\n onClick={() => remove(index)}\n disabled={disabled}\n aria-label={tr('planmagnet.skills.editor.remove', 'Remove {{skill}}', { skill })}\n >\n <X className=\"h-3 w-3\" aria-hidden={true} />\n </button>\n </Badge>\n </li>\n ))}\n </ul>\n )}\n <div className=\"flex gap-2\">\n <Input\n id={id}\n value={text}\n disabled={disabled || full}\n placeholder={\n full\n ? tr('planmagnet.skills.editor.fullPlaceholder', 'Remove a skill to add another')\n : tr('planmagnet.skills.editor.placeholder', 'e.g. React, PostgreSQL')\n }\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : hintId}\n onChange={(e) => {\n setText(e.target.value);\n setProblem(null);\n }}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) return;\n if (e.key === 'Enter' || e.key === ',') {\n e.preventDefault();\n commit();\n }\n }}\n onBlur={commit}\n />\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={commit}\n disabled={disabled || full || !text.trim()}\n >\n <Plus className=\"mr-1 h-4 w-4\" aria-hidden={true} />\n {tr('planmagnet.skills.editor.add', 'Add')}\n </Button>\n </div>\n {error ? (\n <p id={errorId} role=\"alert\" className=\"text-xs text-destructive\">\n {error}\n </p>\n ) : (\n <p id={hintId} className=\"text-xs text-muted-foreground\">\n {counter} ·{' '}\n {hint ??\n tr(\n 'planmagnet.skills.editor.hint',\n 'Press Enter or type a comma to add a skill. Matched against people’s skills in CrewFoundry, ignoring case.'\n )}\n </p>\n )}\n </div>\n );\n}\n\nfunction describeProblem(\n problem: SkillTagProblem,\n tr: (key: string, fallback: string, params?: Record<string, string | number>) => string\n): string {\n switch (problem.kind) {\n case 'duplicate':\n return tr('planmagnet.skills.editor.duplicate', '“{{skill}}” is already on the list.', {\n skill: problem.skill,\n });\n case 'tooLong':\n return tr(\n 'planmagnet.skills.editor.tooLong',\n 'A skill can be at most {{max}} characters long.',\n { max: problem.max }\n );\n case 'tooMany':\n return tr('planmagnet.skills.editor.tooMany', 'A task can require at most {{max}} skills.', {\n max: problem.max,\n });\n case 'invalid':\n return tr(\n 'planmagnet.skills.editor.invalid',\n 'A skill can only contain printable characters.'\n );\n }\n}\n\n/**\n * The labelled \"Required skills\" field of a task form: the editor, or — on the edit page, while the saved list is\n * loading or when it could not be loaded — a line saying so with the editor disabled, so a list the user never saw\n * is never edited (or sent) blind.\n */\nexport function RequiredSkillsField({\n id,\n value,\n onChange,\n disabled = false,\n serverError = null,\n loading = false,\n loadError = null,\n}: {\n id: string;\n value: readonly string[];\n onChange: (next: string[]) => void;\n disabled?: boolean;\n serverError?: string | null;\n /** The saved list is still loading (edit page). */\n loading?: boolean;\n /** The saved list could not be loaded (edit page). */\n loadError?: string | null;\n}) {\n const tr = useTr();\n return (\n <div data-testid=\"required-skills-field\">\n <label htmlFor={id} className=\"text-sm font-medium\">\n {tr('planmagnet.skills.editor.label', 'Required skills')}\n </label>\n {loadError ? (\n <p role=\"alert\" className=\"mt-1 text-xs text-destructive\">\n {tr(\n 'planmagnet.skills.editor.loadError',\n 'Required skills could not be loaded, so they can’t be changed here right now: {{message}}',\n { message: loadError }\n )}\n </p>\n ) : (\n <RequiredSkillsEditor\n id={id}\n value={value}\n onChange={onChange}\n disabled={disabled || loading}\n serverError={serverError}\n hint={\n loading ? tr('planmagnet.skills.editor.loading', 'Loading required skills…') : undefined\n }\n />\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillChips.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/skills/SkillChips.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAWvC,kHAAkH;AAClH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,KAAK,EACL,MAAM,GACP,EAAE;IACD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,kDAaA;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,SAAS,GACV,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAuBA;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,UAAU,EACV,YAAY,GACb,EAAE;IACD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,2CAiBA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillChips.js","names":[],"sources":["../../../src/planmagnet/skills/SkillChips.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Badge } from '@burdenoff/fe-libs/ui';\nimport { ExternalLink } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { crewFoundryEmployeeUrl, skillKey } from './skillTags';\n\n/** The page's host name, for links into CrewFoundry in the same environment. */\nfunction currentHostname(): string {\n return typeof window === 'undefined' ? '' : window.location.hostname;\n}\n\n/** Read-only skill chips. Renders nothing for an empty list: the caller says what \"none\" means in its context. */\nexport function SkillChipList({\n skills,\n label,\n testId,\n}: {\n skills: readonly string[];\n /** Accessible name of the list, e.g. \"Required skills\". */\n label: string;\n testId?: string;\n}) {\n if (skills.length === 0) return null;\n return (\n <ul className=\"flex flex-wrap gap-1\" aria-label={label} data-testid={testId}>\n {skills.map((skill, index) => (\n <li key={`${skillKey(skill)}-${index}`}>\n <Badge variant=\"secondary\" className=\"font-normal\">\n {skill}\n </Badge>\n </li>\n ))}\n </ul>\n );\n}\n\n/**\n * A link to a person's CrewFoundry profile, where their skills are edited. CrewFoundry owns people's skills\n * (owner decision 2026-10-02): PlanMagnet shows them read-only and never offers to change them itself.\n */\nexport function CrewFoundryProfileLink({\n employeeId,\n name,\n children,\n className,\n}: {\n employeeId: string;\n name: string;\n children?: ReactNode;\n className?: string;\n}) {\n const tr = useTr();\n const title = tr(\n 'planmagnet.skills.crewfoundry.openProfile',\n 'Open {{name}} in CrewFoundry, where skills are edited',\n { name }\n );\n return (\n <a\n href={crewFoundryEmployeeUrl(employeeId, currentHostname())}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title={title}\n aria-label={children ? undefined : title}\n className={\n className ??\n 'inline-flex items-center gap-1 text-xs text-primary underline-offset-2 hover:underline'\n }\n >\n {children}\n <ExternalLink className=\"h-3 w-3 shrink-0\" aria-hidden={true} />\n </a>\n );\n}\n\n/**\n * One person's CrewFoundry skills (read-only chips) with a link to edit them in CrewFoundry — the sprint capacity\n * views (ANR-07). An empty list says so rather than showing nothing, since \"no skills recorded\" is worth knowing\n * when planning who can take what.\n */\nexport function MemberSkills({\n skills,\n employeeId,\n employeeName,\n}: {\n skills: readonly string[];\n employeeId: string;\n employeeName: string;\n}) {\n const tr = useTr();\n return (\n <div className=\"mt-1 flex flex-wrap items-center gap-1\" data-testid=\"member-skills\">\n {skills.length > 0 ? (\n <SkillChipList\n skills={skills}\n label={tr('planmagnet.skills.member.label', '{{name}}’s skills', { name: employeeName })}\n />\n ) : (\n <span className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.skills.member.none', 'No skills in CrewFoundry')}\n </span>\n )}\n <CrewFoundryProfileLink employeeId={employeeId} name={employeeName} />\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAS,IAA0B;AACjC,QAAO,OAAO,SAAW,MAAc,KAAK,OAAO,SAAS;;AAI9D,SAAgB,EAAc,EAC5B,WACA,UACA,aAMC;AAED,QADI,EAAO,WAAW,IAAU,OAE9B,kBAAC,MAAD;EAAI,WAAU;EAAuB,cAAY;EAAO,eAAa;YAClE,EAAO,KAAK,GAAO,MAClB,kBAAC,MAAD,EAAA,UACE,kBAAC,GAAD;GAAO,SAAQ;GAAY,WAAU;aAClC;GACK,CAAA,EACL,EAJI,GAAG,EAAS,EAAM,CAAC,GAAG,IAI1B,CACL;EACC,CAAA;;AAQT,SAAgB,EAAuB,EACrC,eACA,SACA,aACA,gBAMC;CAED,IAAM,IADK,GAAO,CAEhB,6CACA,yDACA,EAAE,SAAM,CACT;AACD,QACE,kBAAC,KAAD;EACE,MAAM,EAAuB,GAAY,GAAiB,CAAC;EAC3D,QAAO;EACP,KAAI;EACG;EACP,cAAY,IAAW,KAAA,IAAY;EACnC,WACE,KACA;YARJ,CAWG,GACD,kBAAC,GAAD;GAAc,WAAU;GAAmB,eAAa;GAAQ,CAAA,CAC9D;;;AASR,SAAgB,EAAa,EAC3B,WACA,eACA,mBAKC;CACD,IAAM,IAAK,GAAO;AAClB,QACE,kBAAC,OAAD;EAAK,WAAU;EAAyC,eAAY;YAApE,CACG,EAAO,SAAS,IACf,kBAAC,GAAD;GACU;GACR,OAAO,EAAG,kCAAkC,qBAAqB,EAAE,MAAM,GAAc,CAAC;GACxF,CAAA,GAEF,kBAAC,QAAD;GAAM,WAAU;aACb,EAAG,iCAAiC,2BAA2B;GAC3D,CAAA,EAET,kBAAC,GAAD;GAAoC;GAAY,MAAM;GAAgB,CAAA,CAClE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillCoverageCard.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/skills/SkillCoverageCard.tsx"],"names":[],"mappings":"AA0BA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,MAAM,EACN,QAAQ,EACR,eAAe,GAChB,EAAE;IACD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uDAAuD;IACvD,eAAe,EAAE,MAAM,CAAC;CACzB,2CA2LA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SkillCoverageCard.js","names":[],"sources":["../../../src/planmagnet/skills/SkillCoverageCard.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport { useQuery } from '@apollo/client/react';\nimport { Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { ExternalLink, GraduationCap } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { DashboardCard } from '../dashboards/DashboardUI';\nimport { CrewFoundryProfileLink } from './SkillChips';\nimport {\n SKILL_COVERAGE,\n type SkillCoverageData,\n type SkillCoverageRow,\n type SkillDemand,\n} from './skillOperations';\nimport {\n coverageBadgeVariant,\n coverageCounts,\n coverageFilter,\n crewFoundryEmployeesUrl,\n orderCoverage,\n} from './skillTags';\n\n/** Qualified people shown per skill before \"Show all\". */\nconst MEMBERS_SHOWN = 5;\n\ntype Tr = (key: string, fallback: string, params?: Record<string, string | number>) => string;\n\n/**\n * Skills coverage (ANR-07 skill view on the project manager dashboard, ANR-28 skill utilization on the team\n * dashboard): per skill, the open work items that require it (`WorkItem.requiredSkills`), how much of that work is\n * assigned, and which members are qualified by their CrewFoundry skills. UNCOVERED rows come first.\n *\n * Honest by construction: when CrewFoundry or the workspace member list cannot be read, the service reports every\n * skill with demand as UNKNOWN (never UNCOVERED) and this card says why above the list; a truncated scan says the\n * demand figures are partial; an empty result says what \"nothing\" means here. Nothing renders as an \"all good\".\n * Utilization is counts and story points only — hours-based skill utilization waits for a per-person capacity\n * baseline in CrewFoundry (CWF-28), and the card says so. People's skills are read-only here (CrewFoundry owns\n * them); each name links to the person's CrewFoundry profile.\n *\n * Reads are gated like the dashboards' other cards: the gateway enforces `planmagnet-project:read` and a refusal\n * shows as \"You do not have access\" (DashboardCard).\n */\nexport function SkillCoverageCard({\n workspaceId,\n projectId,\n teamId,\n sprintId,\n notReadyMessage,\n}: {\n workspaceId?: string | null;\n projectId?: string | null;\n teamId?: string | null;\n sprintId?: string | null;\n /** Shown until the page's project / team is picked. */\n notReadyMessage: string;\n}) {\n const tr = useTr();\n const filter = coverageFilter({ projectId, teamId, sprintId });\n const ready = Object.keys(filter).length > 0;\n const { data, loading, error } = useQuery<SkillCoverageData>(SKILL_COVERAGE, {\n variables: { workspaceId: workspaceId ?? '', filter },\n skip: !workspaceId || !ready,\n });\n const [showNoDemand, setShowNoDemand] = useState(false);\n\n const result = data?.planmagnetSkillCoverage ?? null;\n const rows = orderCoverage(result?.skills ?? []);\n const withDemand = rows.filter((row) => row.status !== 'NO_DEMAND');\n const noDemand = rows.filter((row) => row.status === 'NO_DEMAND');\n const counts = coverageCounts(rows);\n const peopleUnreadable = !!result && (result.crewfoundryUnavailable || result.membersUnavailable);\n const shownRows = showNoDemand ? [...withDemand, ...noDemand] : withDemand;\n const title = tr('planmagnet.skills.coverage.title', 'Skills coverage');\n\n return (\n <DashboardCard\n icon={<GraduationCap className=\"h-4 w-4\" />}\n title={title}\n definition={tr(\n 'planmagnet.skills.coverage.definition',\n 'Open work items that require each skill, and the people whose CrewFoundry skills match it by name (ignoring case; no proficiency levels).'\n )}\n loading={loading && !data}\n error={error}\n empty={!ready}\n emptyMessage={notReadyMessage}\n >\n {result ? (\n <div className=\"space-y-3\" data-testid=\"skill-coverage\">\n {result.crewfoundryUnavailable && (\n <Notice testId=\"skill-coverage-crewfoundry-unavailable\">\n {tr(\n 'planmagnet.skills.coverage.crewfoundryUnavailable',\n 'CrewFoundry is temporarily unavailable, so people’s skills can’t be read right now. Skills that open work requires show as Unknown until it is back — try again shortly.'\n )}\n </Notice>\n )}\n {result.membersUnavailable && (\n <Notice testId=\"skill-coverage-members-unavailable\">\n {tr(\n 'planmagnet.skills.coverage.membersUnavailable',\n 'The workspace member list could not be read in full, so qualified people can’t be counted right now. Skills that open work requires show as Unknown.'\n )}\n </Notice>\n )}\n {result.truncated && (\n <Notice testId=\"skill-coverage-truncated\">\n {tr(\n 'planmagnet.skills.coverage.truncated',\n 'More than 5,000 open work items here require a skill: the demand figures cover the oldest 5,000 only.'\n )}\n </Notice>\n )}\n\n {rows.length === 0 ? (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"skill-coverage-empty\">\n {peopleUnreadable\n ? tr(\n 'planmagnet.skills.coverage.emptyPeopleUnreadable',\n 'No open work here requires a skill. People’s skills could not be read, so none are listed.'\n )\n : tr(\n 'planmagnet.skills.coverage.empty',\n 'No open work here requires a skill, and no one in scope lists a skill in CrewFoundry. Add required skills on a task’s edit page to see coverage.'\n )}\n </p>\n ) : (\n <>\n <p className=\"text-xs text-muted-foreground\" data-testid=\"skill-coverage-summary\">\n {tr(\n 'planmagnet.skills.coverage.summary',\n '{{uncovered}} uncovered · {{unknown}} unknown · {{covered}} covered · {{noDemand}} with no open work',\n {\n uncovered: counts.UNCOVERED,\n unknown: counts.UNKNOWN,\n covered: counts.COVERED,\n noDemand: counts.NO_DEMAND,\n }\n )}\n </p>\n {withDemand.length === 0 && (\n <p className=\"text-sm text-muted-foreground\" data-testid=\"skill-coverage-no-demand\">\n {tr(\n 'planmagnet.skills.coverage.noDemand',\n 'No open work here requires a skill yet. Add required skills on a task’s edit page to see coverage.'\n )}\n </p>\n )}\n {shownRows.length > 0 && (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\" data-testid=\"skill-coverage-table\">\n <thead>\n <tr className=\"text-left text-xs text-muted-foreground\">\n <th className=\"py-1 pr-2 font-normal\">\n {tr('planmagnet.skills.coverage.col.skill', 'Skill')}\n </th>\n <th className=\"py-1 pr-2 font-normal\">\n {tr('planmagnet.skills.coverage.col.status', 'Status')}\n </th>\n <th className=\"py-1 pr-2 text-right font-normal\">\n {tr('planmagnet.skills.coverage.col.open', 'Open work')}\n </th>\n <th className=\"py-1 pr-2 text-right font-normal\">\n {tr('planmagnet.skills.coverage.col.assigned', 'Assigned')}\n </th>\n <th className=\"py-1 font-normal\">\n {tr('planmagnet.skills.coverage.col.people', 'Qualified people')}\n </th>\n </tr>\n </thead>\n <tbody>\n {shownRows.map((row) => (\n <CoverageRow key={row.skill} row={row} tr={tr} />\n ))}\n </tbody>\n </table>\n </div>\n )}\n {noDemand.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-expanded={showNoDemand}\n onClick={() => setShowNoDemand((v) => !v)}\n data-testid=\"skill-coverage-toggle-no-demand\"\n >\n {showNoDemand\n ? tr(\n 'planmagnet.skills.coverage.hideNoDemand',\n 'Hide skills no open work requires'\n )\n : noDemand.length === 1\n ? tr(\n 'planmagnet.skills.coverage.showNoDemand.one',\n 'Show 1 skill people have that no open work requires'\n )\n : tr(\n 'planmagnet.skills.coverage.showNoDemand.other',\n 'Show {{count}} skills people have that no open work requires',\n { count: noDemand.length }\n )}\n </Button>\n )}\n </>\n )}\n\n <div className=\"space-y-1 border-t pt-2 text-xs text-muted-foreground\">\n <p data-testid=\"skill-coverage-utilization-note\">\n {tr(\n 'planmagnet.skills.coverage.utilizationNote',\n 'Counts and story points only (an item with no estimate counts as 0 points). Hours-based skill utilization is not available yet: it needs per-person capacity in CrewFoundry.'\n )}\n </p>\n <p>\n {tr(\n 'planmagnet.skills.coverage.coveredNote',\n 'Covered means at least one qualified person exists, not that they have time for the work.'\n )}\n </p>\n <p className=\"flex flex-wrap items-center gap-1\">\n {tr(\n 'planmagnet.skills.coverage.crewfoundryNote',\n 'People’s skills come from CrewFoundry and are read-only here.'\n )}\n <a\n href={crewFoundryEmployeesUrl(\n typeof window === 'undefined' ? '' : window.location.hostname\n )}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-primary underline-offset-2 hover:underline\"\n >\n {tr('planmagnet.skills.coverage.openCrewfoundry', 'Edit them in CrewFoundry')}\n <ExternalLink className=\"h-3 w-3\" aria-hidden={true} />\n </a>\n </p>\n </div>\n </div>\n ) : null}\n </DashboardCard>\n );\n}\n\nfunction Notice({ testId, children }: { testId: string; children: ReactNode }) {\n return (\n <p\n role=\"status\"\n data-testid={testId}\n className=\"rounded-md border border-status-warning-border bg-status-warning-subtle p-2 text-xs text-status-warning-text\"\n >\n {children}\n </p>\n );\n}\n\nfunction statusLabel(status: string, tr: Tr): string {\n switch (status) {\n case 'UNCOVERED':\n return tr('planmagnet.skills.coverage.status.uncovered', 'Uncovered');\n case 'UNKNOWN':\n return tr('planmagnet.skills.coverage.status.unknown', 'Unknown');\n case 'COVERED':\n return tr('planmagnet.skills.coverage.status.covered', 'Covered');\n case 'NO_DEMAND':\n return tr('planmagnet.skills.coverage.status.noDemand', 'No open work');\n default:\n return status;\n }\n}\n\nfunction statusHelp(status: string, tr: Tr): string | undefined {\n switch (status) {\n case 'UNCOVERED':\n return tr(\n 'planmagnet.skills.coverage.statusHelp.uncovered',\n 'Open work requires this skill and no qualified person has it.'\n );\n case 'UNKNOWN':\n return tr(\n 'planmagnet.skills.coverage.statusHelp.unknown',\n 'Open work requires this skill, but qualified people can’t be counted right now.'\n );\n case 'COVERED':\n return tr(\n 'planmagnet.skills.coverage.statusHelp.covered',\n 'Open work requires this skill and at least one qualified person has it.'\n );\n case 'NO_DEMAND':\n return tr(\n 'planmagnet.skills.coverage.statusHelp.noDemand',\n 'A qualified person has this skill; no open work here requires it.'\n );\n default:\n return undefined;\n }\n}\n\nfunction itemsText(count: number, tr: Tr): string {\n return count === 1\n ? tr('planmagnet.skills.coverage.items.one', '1 item')\n : tr('planmagnet.skills.coverage.items.other', '{{count}} items', { count });\n}\n\nfunction demandText(demand: SkillDemand, tr: Tr): string {\n return tr('planmagnet.skills.coverage.demand', '{{items}} · {{points}} pts', {\n items: itemsText(demand.workItemCount, tr),\n points: demand.storyPoints,\n });\n}\n\nfunction CoverageRow({ row, tr }: { row: SkillCoverageRow; tr: Tr }) {\n const noDemand = row.status === 'NO_DEMAND';\n return (\n <tr className=\"border-t align-top\" data-testid=\"skill-coverage-row\" data-status={row.status}>\n <td className=\"py-1.5 pr-2 font-medium\">{row.skill}</td>\n <td className=\"py-1.5 pr-2\">\n <Badge variant={coverageBadgeVariant(row.status)} title={statusHelp(row.status, tr)}>\n {statusLabel(row.status, tr)}\n </Badge>\n </td>\n <td className=\"whitespace-nowrap py-1.5 pr-2 text-right tabular-nums\">\n {noDemand ? '—' : demandText(row.openDemand, tr)}\n </td>\n <td className=\"whitespace-nowrap py-1.5 pr-2 text-right tabular-nums\">\n {noDemand ? '—' : demandText(row.assignedDemand, tr)}\n </td>\n <td className=\"py-1.5\">\n <QualifiedPeople row={row} tr={tr} />\n </td>\n </tr>\n );\n}\n\nfunction QualifiedPeople({ row, tr }: { row: SkillCoverageRow; tr: Tr }) {\n const [showAll, setShowAll] = useState(false);\n if (row.status === 'UNKNOWN') {\n return (\n <span className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.skills.coverage.peopleUnknown', 'Can’t be counted right now')}\n </span>\n );\n }\n if (row.qualifiedMembers.length === 0) {\n return (\n <span className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.skills.coverage.peopleNone', 'No one qualified')}\n </span>\n );\n }\n const members = showAll ? row.qualifiedMembers : row.qualifiedMembers.slice(0, MEMBERS_SHOWN);\n const hidden = row.qualifiedMembers.length - members.length;\n return (\n <div className=\"space-y-1\">\n <ul className=\"flex flex-wrap gap-x-3 gap-y-1\">\n {members.map((member) => (\n <li key={member.employeeId} className=\"text-xs\">\n <CrewFoundryProfileLink employeeId={member.employeeId} name={member.employeeName}>\n {member.employeeName}\n </CrewFoundryProfileLink>\n {row.status !== 'NO_DEMAND' && (\n <span className=\"ml-1 text-muted-foreground\">\n {tr('planmagnet.skills.coverage.memberAssigned', '({{count}} assigned)', {\n count: member.assignedDemandCount,\n })}\n </span>\n )}\n </li>\n ))}\n {hidden > 0 && (\n <li>\n <button\n type=\"button\"\n className=\"text-xs text-primary underline-offset-2 hover:underline\"\n onClick={() => setShowAll(true)}\n >\n {tr('planmagnet.skills.coverage.showAllPeople', 'Show all {{count}}', {\n count: row.qualifiedMembers.length,\n })}\n </button>\n </li>\n )}\n </ul>\n {row.status !== 'NO_DEMAND' && row.unassignedQualifiedCount > 0 && (\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.skills.coverage.unassignedQualified',\n '{{count}} of {{total}} not assigned any of this work',\n { count: row.unassignedQualifiedCount, total: row.qualifiedMemberCount }\n )}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkItemRequiredSkills.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/skills/WorkItemRequiredSkills.tsx"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,kDAoF5E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WorkItemRequiredSkills.js","names":[],"sources":["../../../src/planmagnet/skills/WorkItemRequiredSkills.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { useQuery } from '@apollo/client/react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { SkillChipList } from './SkillChips';\nimport { WORK_ITEM_REQUIRED_SKILLS, type WorkItemRequiredSkillsData } from './skillOperations';\n\n/**\n * Required skills on a work item's page (ANR-07, ANR-28): read-only chips — they are edited on the task's edit page.\n * An EPIC also shows its aggregated skills: its own plus those of its live child items, computed by the service on\n * every read (`aggregatedRequiredSkills`), so they are never edited here. Its own query: a failure says so in this\n * block and never blanks the task page.\n */\nexport function WorkItemRequiredSkills({ workItemId }: { workItemId: string }) {\n const tr = useTr();\n const { data, loading, error } = useQuery<WorkItemRequiredSkillsData>(WORK_ITEM_REQUIRED_SKILLS, {\n variables: { id: workItemId },\n skip: !workItemId,\n });\n const item = data?.planmagnetWorkItem ?? null;\n\n let body: ReactNode;\n if (error && !item) {\n body = (\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.skills.detail.loadError',\n 'Required skills could not be loaded: {{message}}',\n {\n message: error.message,\n }\n )}\n </p>\n );\n } else if (loading && !data) {\n body = (\n <p className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.skills.detail.loading', 'Loading…')}\n </p>\n );\n } else if (item) {\n const isEpic = item.type === 'EPIC';\n body = (\n <>\n {item.requiredSkills.length > 0 ? (\n <SkillChipList\n skills={item.requiredSkills}\n label={tr('planmagnet.skills.detail.label', 'Required skills')}\n testId=\"work-item-required-skills-own\"\n />\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {isEpic\n ? tr('planmagnet.skills.detail.noneOnEpic', 'None on the epic itself.')\n : tr('planmagnet.skills.detail.none', 'None.')}\n </p>\n )}\n {isEpic && (\n <div className=\"space-y-1 pt-1\" data-testid=\"work-item-required-skills-aggregated\">\n <span className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.skills.detail.aggregatedLabel', 'Across the epic')}\n </span>\n {item.aggregatedRequiredSkills.length > 0 ? (\n <SkillChipList\n skills={item.aggregatedRequiredSkills}\n label={tr('planmagnet.skills.detail.aggregatedLabel', 'Across the epic')}\n />\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.skills.detail.aggregatedNone',\n 'Neither the epic nor its child items require a skill.'\n )}\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.skills.detail.aggregatedNote',\n 'The epic’s own skills plus those of its child items. Read-only: change them on each item.'\n )}\n </p>\n </div>\n )}\n </>\n );\n } else {\n return null;\n }\n\n return (\n <div data-testid=\"work-item-required-skills\">\n <span className=\"text-muted-foreground text-xs\">\n {tr('planmagnet.skills.detail.label', 'Required skills')}\n </span>\n <div className=\"mt-1 space-y-1\">{body}</div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAYA,SAAgB,EAAuB,EAAE,iBAAsC;CAC7E,IAAM,IAAK,GAAO,EACZ,EAAE,SAAM,YAAS,aAAU,EAAqC,GAA2B;EAC/F,WAAW,EAAE,IAAI,GAAY;EAC7B,MAAM,CAAC;EACR,CAAC,EACI,IAAO,GAAM,sBAAsB,MAErC;AACJ,KAAI,KAAS,CAAC,EACZ,KACE,kBAAC,KAAD;EAAG,WAAU;YACV,EACC,sCACA,oDACA,EACE,SAAS,EAAM,SAChB,CACF;EACC,CAAA;UAEG,KAAW,CAAC,EACrB,KACE,kBAAC,KAAD;EAAG,WAAU;YACV,EAAG,oCAAoC,WAAW;EACjD,CAAA;UAEG,GAAM;EACf,IAAM,IAAS,EAAK,SAAS;AAC7B,MACE,kBAAA,GAAA,EAAA,UAAA,CACG,EAAK,eAAe,SAAS,IAC5B,kBAAC,GAAD;GACE,QAAQ,EAAK;GACb,OAAO,EAAG,kCAAkC,kBAAkB;GAC9D,QAAO;GACP,CAAA,GAEF,kBAAC,KAAD;GAAG,WAAU;aACV,IACG,EAAG,uCAAuC,2BAA2B,GACrE,EAAG,iCAAiC,QAAQ;GAC9C,CAAA,EAEL,KACC,kBAAC,OAAD;GAAK,WAAU;GAAiB,eAAY;aAA5C;IACE,kBAAC,QAAD;KAAM,WAAU;eACb,EAAG,4CAA4C,kBAAkB;KAC7D,CAAA;IACN,EAAK,yBAAyB,SAAS,IACtC,kBAAC,GAAD;KACE,QAAQ,EAAK;KACb,OAAO,EAAG,4CAA4C,kBAAkB;KACxE,CAAA,GAEF,kBAAC,KAAD;KAAG,WAAU;eACV,EACC,2CACA,wDACD;KACC,CAAA;IAEN,kBAAC,KAAD;KAAG,WAAU;eACV,EACC,2CACA,4FACD;KACC,CAAA;IACA;KAEP,EAAA,CAAA;OAGL,QAAO;AAGT,QACE,kBAAC,OAAD;EAAK,eAAY;YAAjB,CACE,kBAAC,QAAD;GAAM,WAAU;aACb,EAAG,kCAAkC,kBAAkB;GACnD,CAAA,EACP,kBAAC,OAAD;GAAK,WAAU;aAAkB;GAAW,CAAA,CACxC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillOperations.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/skills/skillOperations.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,yGAAyG;AACzG,eAAO,MAAM,yBAAyB,gCASrC,CAAC;AAEF,gHAAgH;AAChH,eAAO,MAAM,cAAc,gCA4B1B,CAAC;AAEF,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,EAAE;QAClB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,wBAAwB,EAAE,MAAM,EAAE,CAAC;KACpC,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,WAAW,CAAC;IACxB,cAAc,EAAE,WAAW,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,uBAAuB,EAAE;QACvB,sBAAsB,EAAE,OAAO,CAAC;QAChC,kBAAkB,EAAE,OAAO,CAAC;QAC5B,SAAS,EAAE,OAAO,CAAC;QACnB,MAAM,EAAE,gBAAgB,EAAE,CAAC;KAC5B,CAAC;CACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillOperations.js","names":[],"sources":["../../../src/planmagnet/skills/skillOperations.ts"],"sourcesContent":["import { gql } from '@apollo/client';\n\n/**\n * ANR-07 / ANR-28 GraphQL documents: a work item's required skills, and skill coverage. Every document here has a\n * twin in src/operations/wspace/planmagnet/queries/skills.graphql, which `bun run codegen` validates against the\n * planmagnet schema and CI's live-supergraph drift job validates against what production serves;\n * tests/skillOperations.test.ts fails when the two copies differ.\n *\n * Each section that reads a skill field has a query of its own rather than a field added to an existing page query\n * (the PRM-01 rule): a field the gateway does not serve fails the WHOLE query, so a shared query would blank the\n * task page instead of one block. The writes need no document of their own — `requiredSkills` rides in the input\n * of the create / update / bulk-update mutations the forms already send.\n */\n\n/** A work item's own required skills, and for an EPIC the union with its live children's (read-only). */\nexport const WORK_ITEM_REQUIRED_SKILLS = gql`\n query WorkItemRequiredSkills($id: ID!) {\n planmagnetWorkItem(id: $id) {\n id\n type\n requiredSkills\n aggregatedRequiredSkills\n }\n }\n`;\n\n/** Per skill: open demand, how much of it is assigned, and who is qualified (CrewFoundry skills, read-only). */\nexport const SKILL_COVERAGE = gql`\n query SkillCoverage($workspaceId: ID!, $filter: PlanmagnetSkillCoverageFilter) {\n planmagnetSkillCoverage(workspaceId: $workspaceId, filter: $filter) {\n crewfoundryUnavailable\n membersUnavailable\n truncated\n skills {\n skill\n status\n openDemand {\n workItemCount\n storyPoints\n }\n assignedDemand {\n workItemCount\n storyPoints\n }\n qualifiedMemberCount\n unassignedQualifiedCount\n qualifiedMembers {\n actorId\n employeeId\n employeeName\n assignedDemandCount\n }\n }\n }\n }\n`;\n\nexport interface WorkItemRequiredSkillsData {\n planmagnetWorkItem: {\n id: string;\n type: string;\n requiredSkills: string[];\n aggregatedRequiredSkills: string[];\n } | null;\n}\n\nexport interface SkillDemand {\n workItemCount: number;\n storyPoints: number;\n}\n\nexport interface SkillQualifiedMember {\n actorId: string;\n employeeId: string;\n employeeName: string;\n assignedDemandCount: number;\n}\n\nexport interface SkillCoverageRow {\n skill: string;\n /** UNCOVERED | UNKNOWN | COVERED | NO_DEMAND — kept a string so a value added later still renders. */\n status: string;\n openDemand: SkillDemand;\n assignedDemand: SkillDemand;\n qualifiedMemberCount: number;\n unassignedQualifiedCount: number;\n qualifiedMembers: SkillQualifiedMember[];\n}\n\nexport interface SkillCoverageData {\n planmagnetSkillCoverage: {\n crewfoundryUnavailable: boolean;\n membersUnavailable: boolean;\n truncated: boolean;\n skills: SkillCoverageRow[];\n };\n}\n"],"mappings":";;AAeA,IAAa,IAA4B,CAAG;;;;;;;;;GAY/B,IAAiB,CAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillTags.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/skills/skillTags.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skillTags.js","names":[],"sources":["../../../src/planmagnet/skills/skillTags.ts"],"sourcesContent":["import { CombinedGraphQLErrors } from '@apollo/client/errors';\n\n/**\n * Skill tags (ANR-07 skill view, ANR-28 skill utilization). PlanMagnet owns the skills a WORK ITEM requires\n * (`WorkItem.requiredSkills`); CrewFoundry owns PEOPLE's skills, which PlanMagnet only reads (owner decision\n * 2026-10-02). The two meet by exact tag matching on a key: the tag trimmed, whitespace runs collapsed, lower-cased.\n * No proficiency levels, no synonyms.\n *\n * The service is the authority on the write rules (wspace-planmagnet-svc `src/utils/required-skills.ts`: tidy,\n * case-insensitive duplicates dropped keeping the first spelling, at most 20 tags of at most 64 characters, an empty\n * or control-character tag refused). The editor applies the same rules as the user types, so the common mistakes\n * are explained before anything is sent; a refusal that still comes back is shown on the field\n * (`requiredSkillsRefusal`).\n */\n\n/** The most skills one work item may require (the service's MAX_REQUIRED_SKILLS). */\nexport const MAX_REQUIRED_SKILLS = 20;\n\n/** The longest one skill may be, in characters (Unicode code points) after tidying (the service's MAX_SKILL_LENGTH). */\nexport const MAX_SKILL_LENGTH = 64;\n\n/** Trim and collapse every run of whitespace to one space: the stored and displayed form of a tag. */\nexport function tidySkill(value: string): string {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\n/** The matching key of a tag. Two tags are the same skill exactly when their keys are equal. */\nexport function skillKey(value: string): string {\n return tidySkill(value).toLowerCase();\n}\n\n/** C0/C1 control characters (and DEL) that survive tidying. The service refuses them; checked by code point. */\nfunction hasControlCharacter(value: string): boolean {\n for (const char of value) {\n const code = char.codePointAt(0) ?? 0;\n if (code < 0x20 || (code >= 0x7f && code <= 0x9f)) return true;\n }\n return false;\n}\n\n/** Why something the user typed was not added to the list. */\nexport type SkillTagProblem =\n | { kind: 'duplicate'; skill: string }\n | { kind: 'tooLong'; max: number }\n | { kind: 'tooMany'; max: number }\n | { kind: 'invalid' };\n\nexport interface AddSkillTagsResult {\n /** The list with every acceptable new tag appended, in the order typed. */\n skills: string[];\n /** What could not be added, to leave in the input: a refusal never silently drops what was typed. */\n rest: string;\n /** The first reason something was not added, or null when everything typed was added. */\n problem: SkillTagProblem | null;\n}\n\n/** A pasted list (\"React, Postgres\" or one per line) adds several tags at once. */\nconst SEPARATORS = /[,\\n]/;\n\n/**\n * Add what the user typed — one skill, or several separated by commas or line breaks — to `current`. Each tag is\n * tidied; blank parts are ignored; a tag already on the list (ignoring case) is not added twice, and the list keeps\n * its first spelling, as the service does. A tag that is too long, has a control character, or would go past\n * MAX_REQUIRED_SKILLS stays in `rest` with the reason in `problem`.\n */\nexport function addSkillTags(current: readonly string[], typed: string): AddSkillTagsResult {\n const skills = [...current];\n const keys = new Set(current.map(skillKey));\n const kept: string[] = [];\n let problem: SkillTagProblem | null = null;\n for (const part of typed.split(SEPARATORS)) {\n const tag = tidySkill(part);\n if (!tag) continue;\n if (hasControlCharacter(tag)) {\n if (!problem) problem = { kind: 'invalid' };\n kept.push(tag);\n continue;\n }\n if ([...tag].length > MAX_SKILL_LENGTH) {\n if (!problem) problem = { kind: 'tooLong', max: MAX_SKILL_LENGTH };\n kept.push(tag);\n continue;\n }\n const key = tag.toLowerCase();\n if (keys.has(key)) {\n if (!problem) {\n problem = { kind: 'duplicate', skill: skills.find((s) => skillKey(s) === key) ?? tag };\n }\n continue;\n }\n if (skills.length >= MAX_REQUIRED_SKILLS) {\n if (!problem) problem = { kind: 'tooMany', max: MAX_REQUIRED_SKILLS };\n kept.push(tag);\n continue;\n }\n keys.add(key);\n skills.push(tag);\n }\n return { skills, rest: kept.join(', '), problem };\n}\n\n/** `current` without the tag at `index`. */\nexport function removeSkillAt(current: readonly string[], index: number): string[] {\n return current.filter((_, i) => i !== index);\n}\n\n/** Same tags in the same order and spelling: what \"unchanged\" means for a save that sends only changed fields. */\nexport function sameSkillList(a: readonly string[], b: readonly string[]): boolean {\n return a.length === b.length && a.every((skill, i) => skill === b[i]);\n}\n\n/**\n * The service's own reason when a write was refused because of `requiredSkills` (BAD_USER_INPUT tagged\n * `extensions.field: requiredSkills`, e.g. \"A work item can require at most 20 skills\"), or null for any other\n * failure — which the caller shows the way it shows every other refusal.\n */\nexport function requiredSkillsRefusal(error: unknown): string | null {\n if (!CombinedGraphQLErrors.is(error)) return null;\n const refusal = error.errors.find((e) => e.extensions?.field === 'requiredSkills');\n return refusal?.message || null;\n}\n\n// ─── Coverage (planmagnetSkillCoverage) ──────────────────────────────────────\n\nexport type SkillCoverageStatus = 'UNCOVERED' | 'UNKNOWN' | 'COVERED' | 'NO_DEMAND';\n\n/** UNCOVERED first, then UNKNOWN, COVERED and NO_DEMAND — the order the service documents. */\nconst STATUS_ORDER: Record<SkillCoverageStatus, number> = {\n UNCOVERED: 0,\n UNKNOWN: 1,\n COVERED: 2,\n NO_DEMAND: 3,\n};\n\nfunction statusRank(status: string): number {\n return (STATUS_ORDER as Record<string, number>)[status] ?? Object.keys(STATUS_ORDER).length;\n}\n\n/**\n * Rows in status order (UNCOVERED first), keeping the service's order within a status (most open work first, then\n * by skill). The service already sends them this way; sorting here keeps \"uncovered first\" true on screen even if\n * that changes. A status this client does not know yet goes last rather than disappearing.\n */\nexport function orderCoverage<T extends { status: string }>(rows: readonly T[]): T[] {\n return rows\n .map((row, index) => ({ row, index }))\n .sort((a, b) => statusRank(a.row.status) - statusRank(b.row.status) || a.index - b.index)\n .map(({ row }) => row);\n}\n\n/** How many rows have each status. */\nexport function coverageCounts(\n rows: readonly { status: string }[]\n): Record<SkillCoverageStatus, number> {\n const counts: Record<SkillCoverageStatus, number> = {\n UNCOVERED: 0,\n UNKNOWN: 0,\n COVERED: 0,\n NO_DEMAND: 0,\n };\n for (const row of rows) {\n if (row.status in counts) counts[row.status as SkillCoverageStatus] += 1;\n }\n return counts;\n}\n\nexport type CoverageBadgeVariant = 'destructive' | 'warning' | 'success' | 'secondary' | 'outline';\n\n/**\n * Severity, not identity: uncovered demand is the problem, unknown needs a look, covered is fine, no demand is\n * neutral.\n */\nexport function coverageBadgeVariant(status: string): CoverageBadgeVariant {\n switch (status) {\n case 'UNCOVERED':\n return 'destructive';\n case 'UNKNOWN':\n return 'warning';\n case 'COVERED':\n return 'success';\n case 'NO_DEMAND':\n return 'secondary';\n default:\n return 'outline';\n }\n}\n\n/**\n * The filter for planmagnetSkillCoverage with only the ids actually chosen: an empty id is left out (the service\n * answers NOT_FOUND for an id that is not a live project / team / sprint of the workspace).\n */\nexport function coverageFilter(filter: {\n projectId?: string | null;\n teamId?: string | null;\n sprintId?: string | null;\n}): { projectId?: string; teamId?: string; sprintId?: string } {\n const out: { projectId?: string; teamId?: string; sprintId?: string } = {};\n if (filter.projectId) out.projectId = filter.projectId;\n if (filter.teamId) out.teamId = filter.teamId;\n if (filter.sprintId) out.sprintId = filter.sprintId;\n return out;\n}\n\n// ─── CrewFoundry links ───────────────────────────────────────────────────────\n\n/**\n * CrewFoundry's app in the same environment as this page: alpha shells (`alphaapp.*`) link to alpha, the local dev\n * proxy (`*.local.burdenoff.com`, localhost) to the local CrewFoundry shell, everything else to production.\n */\nexport function crewFoundryOrigin(hostname: string): string {\n const host = hostname.toLowerCase();\n if (host.startsWith('alphaapp.') || host.startsWith('alpha.')) {\n return 'https://alphaapp.crewfoundry.com';\n }\n if (\n host === 'localhost' ||\n host === '127.0.0.1' ||\n host.endsWith('.localhost') ||\n host.endsWith('.local.burdenoff.com')\n ) {\n return 'https://crewfoundry.local.burdenoff.com';\n }\n return 'https://app.crewfoundry.com';\n}\n\n/**\n * A CrewFoundry employee's profile, where their skills are edited (CrewFoundry mounts its pages under\n * /crewfoundry).\n */\nexport function crewFoundryEmployeeUrl(employeeId: string, hostname: string): string {\n return `${crewFoundryOrigin(hostname)}/crewfoundry/hr/employee-profile-page?id=${encodeURIComponent(employeeId)}`;\n}\n\n/** CrewFoundry's employee list. */\nexport function crewFoundryEmployeesUrl(hostname: string): string {\n return `${crewFoundryOrigin(hostname)}/crewfoundry/hr/employees-page`;\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRequiredSkillsDraft.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/skills/useRequiredSkillsDraft.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACnC,oFAAoF;IACpF,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,YAAY,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACnC,yFAAyF;IACzF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACjD,kGAAkG;IAClG,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,UAAQ,GAAG,mBAAmB,CA2B5F"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useRequiredSkillsDraft.js","names":[],"sources":["../../../src/planmagnet/skills/useRequiredSkillsDraft.ts"],"sourcesContent":["import { useState } from 'react';\nimport { useQuery } from '@apollo/client/react';\nimport { WORK_ITEM_REQUIRED_SKILLS, type WorkItemRequiredSkillsData } from './skillOperations';\nimport { sameSkillList } from './skillTags';\n\nexport interface RequiredSkillsDraft {\n /** What the editor shows: the user's edits, else the saved list. */\n value: string[];\n setValue: (next: string[]) => void;\n /** The saved list, or null until it has loaded (or when it could not be loaded). */\n saved: string[] | null;\n loading: boolean;\n /** Why the saved list could not be loaded, or null. */\n loadError: string | null;\n /**\n * The list to send as `requiredSkills`, or undefined when it is unchanged — or not loaded: a list the user never\n * saw is never sent, so a failed read can't clear the item's skills.\n */\n changedValue: string[] | undefined;\n /** The service's refusal of the last save, shown on the field until the list changes. */\n serverError: string | null;\n setServerError: (message: string | null) => void;\n /** Drop the user's edits so the editor follows the saved list again (after a successful save). */\n reset: () => void;\n}\n\n/**\n * The edit page's required-skills state (ANR-07, ANR-28): the saved list comes from the block's own query\n * (`WorkItemRequiredSkills`, the PRM-01 rule — a field the gateway does not serve must not blank the whole edit\n * page), and the user's edits are kept apart from it, so the save sends `requiredSkills` only when it changed.\n * Add 'WorkItemRequiredSkills' to the save's refetchQueries so `saved` is fresh before `reset()`.\n */\nexport function useRequiredSkillsDraft(workItemId: string, skip = false): RequiredSkillsDraft {\n const { data, loading, error } = useQuery<WorkItemRequiredSkillsData>(WORK_ITEM_REQUIRED_SKILLS, {\n variables: { id: workItemId },\n skip: skip || !workItemId,\n });\n const saved = data?.planmagnetWorkItem?.requiredSkills ?? null;\n const [draft, setDraft] = useState<string[] | null>(null);\n const [serverError, setServerError] = useState<string | null>(null);\n\n return {\n value: draft ?? saved ?? [],\n setValue: (next) => {\n setDraft(next);\n setServerError(null);\n },\n saved,\n loading: loading && !data,\n loadError: saved === null && error ? error.message : null,\n changedValue:\n saved !== null && draft !== null && !sameSkillList(draft, saved) ? draft : undefined,\n serverError,\n setServerError,\n reset: () => {\n setDraft(null);\n setServerError(null);\n },\n };\n}\n"],"mappings":";;;;;AAgCA,SAAgB,EAAuB,GAAoB,IAAO,IAA4B;CAC5F,IAAM,EAAE,SAAM,YAAS,aAAU,EAAqC,GAA2B;EAC/F,WAAW,EAAE,IAAI,GAAY;EAC7B,MAAM,KAAQ,CAAC;EAChB,CAAC,EACI,IAAQ,GAAM,oBAAoB,kBAAkB,MACpD,CAAC,GAAO,KAAY,EAA0B,KAAK,EACnD,CAAC,GAAa,KAAkB,EAAwB,KAAK;AAEnE,QAAO;EACL,OAAO,KAAS,KAAS,EAAE;EAC3B,WAAW,MAAS;AAElB,GADA,EAAS,EAAK,EACd,EAAe,KAAK;;EAEtB;EACA,SAAS,KAAW,CAAC;EACrB,WAAW,MAAU,QAAQ,IAAQ,EAAM,UAAU;EACrD,cACE,MAAU,QAAQ,MAAU,QAAQ,CAAC,EAAc,GAAO,EAAM,GAAG,IAAQ,KAAA;EAC7E;EACA;EACA,aAAa;AAEX,GADA,EAAS,KAAK,EACd,EAAe,KAAK;;EAEvB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SprintControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/sprints/SprintControls.tsx"],"names":[],"mappings":"AAsBA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AACxF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAQ3D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAI/D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAExD;AAoMD,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,UAAU,EACV,MAAM,GACP,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,kDA2DA;AAmCD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AASD,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,MAAM,EACN,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,2CAuFA;AA0PD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;AAE7C,wBAAgB,eAAe,CAAC,EAC9B,SAAS,EACT,YAAY,EACZ,aAAa,GACd,EAAE;IACD,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,8FAA8F;IAC9F,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,2CAqPA"}
|