@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":"RoadmapPresentation.js","names":[],"sources":["../../../src/planmagnet/roadmaps/RoadmapPresentation.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Button,\n ResponsiveDialog,\n ResponsiveDialogClose,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, Presentation as PresentationIcon, X } from 'lucide-react';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { ConfidenceBadge, RiskIndicator } from './RoadmapNowNextLater';\n\n/**\n * Roadmap presentation mode (PRM-11): a full-screen, read-only walk-through of a roadmap, opened from its detail\n * page. Deliberately takes the SAME items the detail page already loaded (`ProductsRoadmapDetailPagePage`'s\n * `GET_ROADMAP` query) rather than firing one of its own — those items already carry `horizon`/`confidence`/\n * `riskLevel`/`riskNote`/dates, and `RoadmapNowNextLater`'s own move mutation refetches that same query, so it\n * never goes stale relative to the Now/Next/Later board.\n *\n * Grouping follows the detail page's OWN view toggle, not a fixed choice: Now/Next/Later when that view is\n * active, one slide per calendar quarter (by `startDate`, falling back to `endDate`) when the Timeline view is\n * active — matching \"one slide per horizon … or per timeline quarter\" from the ticket. An item that fits neither\n * bucket (no horizon in nnl mode, no date in timeline mode) still gets its own slide rather than being silently\n * left out.\n *\n * Built on `ResponsiveDialog*` (centred full-screen dialog on desktop, a bottom sheet below `md` — the design\n * system's own convention, `no-restricted-imports` refuses the plain `Dialog*` primitives). Focus trap, initial\n * focus, Escape-to-close and focus restored to the \"Present\" button on exit are Radix Dialog's own default\n * behaviour either way — nothing here re-implements them. Only the left/right slide navigation is this\n * component's own.\n */\n\nexport interface RoadmapPresentationItem {\n id: string;\n title: string;\n status: string;\n startDate: string | null;\n endDate: string | null;\n horizon: 'NOW' | 'NEXT' | 'LATER' | null;\n confidence: number | null;\n riskLevel: 'LOW' | 'MEDIUM' | 'HIGH' | null;\n riskNote: string | null;\n}\n\ninterface Slide {\n key: string;\n label: string;\n items: RoadmapPresentationItem[];\n}\n\nconst HORIZONS: { key: 'NOW' | 'NEXT' | 'LATER'; label: string }[] = [\n { key: 'NOW', label: 'Now' },\n { key: 'NEXT', label: 'Next' },\n { key: 'LATER', label: 'Later' },\n];\n\nfunction buildHorizonSlides(items: RoadmapPresentationItem[]): Slide[] {\n const slides: Slide[] = HORIZONS.map((h) => ({\n key: h.key,\n label: h.label,\n items: items.filter((item) => item.horizon === h.key),\n }));\n const unplaced = items.filter((item) => item.horizon === null);\n // Never silently drop items the board hasn't placed yet — they get their own slide instead.\n if (unplaced.length > 0)\n slides.push({ key: 'UNPLACED', label: 'Not yet placed', items: unplaced });\n return slides;\n}\n\nfunction quarterOf(dateIso: string): { year: number; quarter: number } | null {\n const date = new Date(dateIso);\n if (Number.isNaN(date.getTime())) return null;\n return { year: date.getUTCFullYear(), quarter: Math.floor(date.getUTCMonth() / 3) + 1 };\n}\n\nfunction buildQuarterSlides(items: RoadmapPresentationItem[]): Slide[] {\n const groups = new Map<\n string,\n { year: number; quarter: number; items: RoadmapPresentationItem[] }\n >();\n const undated: RoadmapPresentationItem[] = [];\n for (const item of items) {\n const q = quarterOf(item.startDate ?? item.endDate ?? '');\n if (!q) {\n undated.push(item);\n continue;\n }\n const key = `${q.year}-Q${q.quarter}`;\n const group = groups.get(key);\n if (group) group.items.push(item);\n else groups.set(key, { ...q, items: [item] });\n }\n const slides: Slide[] = [...groups.entries()]\n .sort(([, a], [, b]) => a.year - b.year || a.quarter - b.quarter)\n .map(([key, g]) => ({ key, label: `Q${g.quarter} ${g.year}`, items: g.items }));\n if (undated.length > 0) slides.push({ key: 'UNSCHEDULED', label: 'Unscheduled', items: undated });\n return slides;\n}\n\nfunction ItemCard({ item }: { item: RoadmapPresentationItem }) {\n return (\n <li className=\"rounded-md border p-3\" data-testid=\"roadmap-presentation-item\">\n <p className=\"font-medium leading-tight\">{item.title}</p>\n <div className=\"mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground\">\n <span>{enumLabel(item.status)}</span>\n <ConfidenceBadge confidence={item.confidence} />\n <RiskIndicator level={item.riskLevel} note={item.riskNote} />\n </div>\n </li>\n );\n}\n\nfunction ItemsSlide({ slide }: { slide: Slide }) {\n return (\n <div className=\"w-full max-w-2xl space-y-4\">\n <h2 className=\"text-center text-2xl font-semibold\">{slide.label}</h2>\n {slide.items.length === 0 ? (\n <p className=\"text-center text-sm text-muted-foreground\">No items in this slide.</p>\n ) : (\n <ul className=\"space-y-2\">\n {slide.items.map((item) => (\n <ItemCard key={item.id} item={item} />\n ))}\n </ul>\n )}\n </div>\n );\n}\n\nexport function RoadmapPresentation({\n roadmapName,\n roadmapDescription,\n view,\n items,\n}: {\n roadmapName: string;\n roadmapDescription: string | null;\n view: 'timeline' | 'nnl';\n items: RoadmapPresentationItem[];\n}) {\n const [open, setOpen] = useState(false);\n const [index, setIndex] = useState(0);\n\n const slides = useMemo(\n () => (view === 'nnl' ? buildHorizonSlides(items) : buildQuarterSlides(items)),\n [view, items]\n );\n // Slide 0 is always the title/description overview; one slide per group follows.\n const slideCount = slides.length + 1;\n\n // Reset to the first slide in the SAME handler that opens the dialog (not a `useEffect` keyed on `open`) — an\n // effect that calls setState on mount/update is a cascading-render smell (react-hooks/set-state-in-effect) and\n // is also one render behind: it would still show the previous close's last slide for one frame.\n const onOpenChange = (next: boolean) => {\n setOpen(next);\n if (next) setIndex(0);\n };\n\n const goNext = () => setIndex((i) => Math.min(i + 1, slideCount - 1));\n const goPrev = () => setIndex((i) => Math.max(i - 1, 0));\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"roadmap-present\">\n <PresentationIcon className=\"mr-1 h-4 w-4\" aria-hidden=\"true\" />\n Present\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent\n data-testid=\"roadmap-presentation\"\n showCloseButton={false}\n showHandle={false}\n // `inset-0` (not `top-0 left-0`) plus `max-h-none`: on desktop this still fully overrides\n // DialogContent's centred `top-[50%] left-[50%]` positioning (twMerge treats `inset` as\n // conflicting with the more specific `top`/`left`). On mobile, ResponsiveDialogContent forwards\n // this className unmodified to BottomSheetContent, whose own base className sets\n // `inset-x-0 bottom-0 max-h-[90vh]` — those are in DIFFERENT twMerge groups than `top`/`left` and\n // `h-*`, so a `top-0 left-0` + `h-screen` override used to survive class merging *alongside*\n // `bottom-0` + `max-h-[90vh]` rather than replacing them. With top, bottom and height (clamped to\n // 90vh) all explicitly set on a fixed box, CSS resolves the over-constraint by dropping `bottom`\n // (CSS2.1 10.6.4) and using top+height instead — pinning the sheet to the top of the screen with a\n // ~10vh gap at the bottom. `inset-0` fully replaces `inset-x-0`/`bottom-0` (same conflict group in\n // twMerge) and `max-h-none` fully replaces `max-h-[90vh]`, so nothing is left to over-constrain.\n className=\"inset-0 flex h-screen w-screen max-w-none max-h-none translate-x-0 translate-y-0 flex-col gap-0 rounded-none border-0 p-0 sm:max-w-none\"\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') {\n e.preventDefault();\n goNext();\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n goPrev();\n }\n // Escape is handled by Radix's own onEscapeKeyDown (closes the dialog) — not duplicated here.\n }}\n >\n <ResponsiveDialogTitle className=\"sr-only\">\n {roadmapName} — presentation\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription className=\"sr-only\">\n Read-only, full-screen view of the {roadmapName} roadmap. Use the left and right arrow\n keys to move between slides, and Escape to exit.\n </ResponsiveDialogDescription>\n\n <div className=\"flex items-center justify-between border-b px-6 py-3\">\n <p className=\"text-sm text-muted-foreground\" data-testid=\"roadmap-presentation-counter\">\n Slide {index + 1} of {slideCount}\n </p>\n <ResponsiveDialogClose asChild>\n <Button variant=\"ghost\" size=\"sm\" aria-label=\"Exit presentation\">\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </ResponsiveDialogClose>\n </div>\n\n <div className=\"flex flex-1 flex-col items-center justify-center overflow-y-auto px-8 py-6\">\n {index === 0 ? (\n <div className=\"max-w-2xl space-y-4 text-center\">\n <h2 className=\"text-3xl font-semibold\">{roadmapName}</h2>\n <p className=\"text-muted-foreground\">{roadmapDescription ?? 'No description'}</p>\n </div>\n ) : (\n <ItemsSlide slide={slides[index - 1]} />\n )}\n </div>\n\n <div className=\"flex items-center justify-center gap-3 border-t px-6 py-3\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={goPrev}\n disabled={index === 0}\n aria-label=\"Previous slide\"\n data-testid=\"roadmap-presentation-prev\"\n >\n <ChevronLeft className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={goNext}\n disabled={index === slideCount - 1}\n aria-label=\"Next slide\"\n data-testid=\"roadmap-presentation-next\"\n >\n <ChevronRight className=\"h-4 w-4\" aria-hidden=\"true\" />\n </Button>\n </div>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RoadmapReviewPanel.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/roadmaps/RoadmapReviewPanel.tsx"],"names":[],"mappings":"AAubA,wBAAgB,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2CAgDtE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RoadmapReviewPanel.js","names":[],"sources":["../../../src/planmagnet/roadmaps/RoadmapReviewPanel.tsx"],"sourcesContent":["import { useDeferredValue, useEffect, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Checkbox,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { useWorkspaceDirectory } from '@burdenoff/fe-libs/sharing';\nimport { ClipboardCheck, Plus } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { PersonName } from '../people/People';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { ErrorLine } from '../controls/ConfirmButton';\nimport { throwOnError } from '../utils/mutationResult';\nimport { isForbidden, mutationErrorMessage } from '../utils/graphqlErrors';\n\n/**\n * Stakeholder review on a roadmap (PRM-11): request, decide, withdraw, and a history of past rounds. At most one\n * review is ever OPEN per roadmap — `planmagnetRoadmapReviews` is newest-first, so the open one (if any) is\n * simply the first entry whose status is OPEN; that keeps this panel to a single query rather than also reading\n * `Roadmap.currentReview` and having two sources of the same fact to keep in sync after a mutation.\n *\n * `planmagnetDecideRoadmapReview` is gated at the READ tier by design (its own schema doc explains why: a\n * review's reviewers are often stakeholders who are not workspace Admins) — the real gate is \"are you a listed\n * reviewer\", enforced here client-side only to decide what to SHOW; the server enforces it for real.\n */\n\nconst REVIEW_QUERY_NAME = 'RoadmapReviewsPanel';\nconst REVIEW_REFETCH = { refetchQueries: [REVIEW_QUERY_NAME], awaitRefetchQueries: true };\n\nconst ROADMAP_REVIEWS = gql`\n query RoadmapReviewsPanel($roadmapId: ID!) {\n planmagnetRoadmapReviews(roadmapId: $roadmapId) {\n id\n status\n note\n requestedBy\n reviewerIds\n createdAt\n decidedAt\n updatedAt\n decisions {\n id\n reviewerId\n decision\n note\n decidedAt\n }\n }\n }\n`;\nconst REQUEST_REVIEW = gql`\n mutation RoadmapReviewRequest($roadmapId: ID!, $input: PlanmagnetRequestRoadmapReviewInput!) {\n planmagnetRequestRoadmapReview(roadmapId: $roadmapId, input: $input) {\n id\n }\n }\n`;\nconst DECIDE_REVIEW = gql`\n mutation RoadmapReviewDecide($reviewId: ID!, $input: PlanmagnetDecideRoadmapReviewInput!) {\n planmagnetDecideRoadmapReview(reviewId: $reviewId, input: $input) {\n id\n }\n }\n`;\nconst WITHDRAW_REVIEW = gql`\n mutation RoadmapReviewWithdraw($reviewId: ID!) {\n planmagnetWithdrawRoadmapReview(reviewId: $reviewId) {\n id\n }\n }\n`;\n\ntype ReviewStatus = 'OPEN' | 'APPROVED' | 'CHANGES_REQUESTED' | 'WITHDRAWN';\ntype DecisionKind = 'APPROVED' | 'CHANGES_REQUESTED';\n\ninterface ReviewDecision {\n id: string;\n reviewerId: string;\n decision: DecisionKind;\n note: string | null;\n decidedAt: string;\n}\ninterface RoadmapReview {\n id: string;\n status: ReviewStatus;\n note: string | null;\n requestedBy: string;\n reviewerIds: string[];\n createdAt: string;\n decidedAt: string | null;\n updatedAt: string;\n decisions: ReviewDecision[];\n}\n\nconst STATUS_VARIANT: Record<\n ReviewStatus,\n 'default' | 'success' | 'warning' | 'info' | 'secondary' | 'destructive' | 'outline'\n> = {\n OPEN: 'warning',\n APPROVED: 'success',\n CHANGES_REQUESTED: 'destructive',\n WITHDRAWN: 'secondary',\n};\n\nconst when = (iso: string) => new Date(iso).toLocaleString();\n\n/** Pick reviewers from the workspace directory + an optional note — the same checkbox-list-over-search picker\n * `team/TeamControls.tsx`'s `AddTeamMembersDialog` uses for adding team members, generalized here (no\n * \"already a member\" exclusion: any workspace actor who can read the roadmap is a valid reviewer). */\nfunction RequestReviewDialog({ roadmapId }: { roadmapId: string }) {\n const { workspaceId, authToken, apiGatewayUrl } = usePlanMagnet();\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const deferredSearch = useDeferredValue(search.trim());\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [note, setNote] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const directory = useWorkspaceDirectory({\n workspaceId: workspaceId ?? '',\n authToken: authToken ?? undefined,\n apiGatewayUrl: apiGatewayUrl ?? undefined,\n });\n const { search: setDirectoryFilter } = directory;\n useEffect(() => {\n setDirectoryFilter(deferredSearch);\n }, [deferredSearch, setDirectoryFilter]);\n\n const [request, requestState] = useMutation(REQUEST_REVIEW, REVIEW_REFETCH);\n\n const toggle = (id: string, checked: boolean) =>\n setSelected((prev) => {\n const next = new Set(prev);\n if (checked) next.add(id);\n else next.delete(id);\n return next;\n });\n\n const reset = () => {\n setSelected(new Set());\n setNote('');\n setSearch('');\n setError(null);\n };\n\n const submit = async () => {\n setError(null);\n try {\n await throwOnError(\n request({\n variables: {\n roadmapId,\n input: { reviewerIds: [...selected], note: note.trim() || null },\n },\n })\n );\n reset();\n setOpen(false);\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'Your role cannot request a review on this roadmap.'\n : mutationErrorMessage(e, 'The review could not be requested.')\n );\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) reset();\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" data-testid=\"roadmap-review-request\">\n <Plus className=\"mr-1 h-4 w-4\" aria-hidden=\"true\" />\n Request review\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Request review</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Only one review can be open on this roadmap at a time. Pick everyone who should weigh\n in.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Search workspace members\"\n aria-label=\"Search workspace members\"\n />\n <div className=\"max-h-64 overflow-y-auto space-y-1\">\n {directory.loading && directory.members.length === 0 && (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">Loading…</p>\n )}\n {!directory.loading && directory.members.length === 0 && (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">No matching members.</p>\n )}\n {directory.members.map((member) => {\n const inputId = `review-reviewer-${member.id}`;\n return (\n <label\n key={member.id}\n htmlFor={inputId}\n className=\"flex items-center gap-3 border rounded-md p-2 text-sm cursor-pointer hover:bg-muted\"\n >\n <Checkbox\n id={inputId}\n checked={selected.has(member.id)}\n onCheckedChange={(checked) => toggle(member.id, checked === true)}\n />\n <span className=\"min-w-0 flex-1 truncate\">\n {member.name}\n {member.email && (\n <span className=\"text-muted-foreground\"> · {member.email}</span>\n )}\n </span>\n </label>\n );\n })}\n {directory.hasMore && (\n <button\n type=\"button\"\n className=\"w-full py-1 text-xs text-primary hover:underline\"\n onClick={directory.fetchMore}\n >\n Show more members\n </button>\n )}\n </div>\n <div>\n <label htmlFor=\"review-request-note\" className=\"text-sm font-medium\">\n Note (optional)\n </label>\n <textarea\n id=\"review-request-note\"\n className=\"mt-1 w-full min-h-[60px] rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n </div>\n {error && <ErrorLine message={error} />}\n <ResponsiveDialogFooter>\n <Button\n onClick={() => void submit()}\n disabled={selected.size === 0 || requestState.loading}\n >\n {requestState.loading ? 'Requesting…' : `Request review (${selected.size})`}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\nfunction ReviewerRow({\n reviewerId,\n decision,\n}: {\n reviewerId: string;\n decision: ReviewDecision | undefined;\n}) {\n return (\n <li className=\"space-y-0.5 text-sm\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">\n <PersonName id={reviewerId} />\n </span>\n {decision ? (\n <span className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Badge\n variant={decision.decision === 'APPROVED' ? 'success' : 'destructive'}\n className=\"text-[11px]\"\n >\n {enumLabel(decision.decision)}\n </Badge>\n {when(decision.decidedAt)}\n </span>\n ) : (\n <span className=\"text-xs text-muted-foreground\">Pending</span>\n )}\n </div>\n {decision?.note && <p className=\"text-xs text-muted-foreground\">{decision.note}</p>}\n </li>\n );\n}\n\n/** The OPEN review: status, requester, every reviewer's decision so far, and — for the signed-in actor — the\n * controls the server would actually allow: Approve/Request changes when listed and undecided, Withdraw when\n * they are the requester. Both are shown or hidden from `reviewerIds`/`decisions`/`requestedBy` alone; the\n * server is still the real gate (see the module doc comment). */\nfunction CurrentReviewCard({ review }: { review: RoadmapReview }) {\n const { currentUser } = usePlanMagnet();\n const [note, setNote] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [decide, decideState] = useMutation(DECIDE_REVIEW, REVIEW_REFETCH);\n const [withdraw, withdrawState] = useMutation(WITHDRAW_REVIEW, REVIEW_REFETCH);\n\n const myId = currentUser?.id;\n const myDecision = review.decisions.find((d) => d.reviewerId === myId);\n const iAmReviewer = !!myId && review.reviewerIds.includes(myId);\n const canDecide = iAmReviewer && !myDecision;\n const iAmRequester = !!myId && review.requestedBy === myId;\n\n const submitDecision = async (decision: DecisionKind) => {\n setError(null);\n try {\n await throwOnError(\n decide({\n variables: { reviewId: review.id, input: { decision, note: note.trim() || null } },\n })\n );\n setNote('');\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'You are not a reviewer on this request.'\n : mutationErrorMessage(e, 'The decision could not be recorded.')\n );\n }\n };\n\n const doWithdraw = async () => {\n setError(null);\n try {\n await throwOnError(withdraw({ variables: { reviewId: review.id } }));\n } catch (e) {\n setError(mutationErrorMessage(e, 'The review could not be withdrawn.'));\n }\n };\n\n return (\n <div className=\"space-y-3 rounded-md border p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <Badge variant={STATUS_VARIANT[review.status]} data-testid=\"roadmap-review-status\">\n {enumLabel(review.status)}\n </Badge>\n <span className=\"text-xs text-muted-foreground\">Requested {when(review.createdAt)}</span>\n </div>\n <p className=\"text-sm\">\n Requested by <PersonName id={review.requestedBy} />\n </p>\n {review.note && <p className=\"text-sm text-muted-foreground\">{review.note}</p>}\n <ul className=\"space-y-2\">\n {review.reviewerIds.map((id) => (\n <ReviewerRow\n key={id}\n reviewerId={id}\n decision={review.decisions.find((d) => d.reviewerId === id)}\n />\n ))}\n </ul>\n {error && <ErrorLine message={error} />}\n {canDecide && (\n <div className=\"space-y-2 border-t pt-3\">\n <label htmlFor=\"review-decision-note\" className=\"text-sm font-medium\">\n Note (optional)\n </label>\n <textarea\n id=\"review-decision-note\"\n className=\"w-full min-h-[56px] rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n <div className=\"flex justify-end gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"roadmap-review-changes\"\n disabled={decideState.loading}\n onClick={() => void submitDecision('CHANGES_REQUESTED')}\n >\n Request changes\n </Button>\n <Button\n size=\"sm\"\n data-testid=\"roadmap-review-approve\"\n disabled={decideState.loading}\n onClick={() => void submitDecision('APPROVED')}\n >\n Approve\n </Button>\n </div>\n </div>\n )}\n {iAmRequester && (\n <div className=\"flex justify-end border-t pt-3\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"roadmap-review-withdraw\"\n disabled={withdrawState.loading}\n onClick={() => void doWithdraw()}\n >\n {withdrawState.loading ? 'Withdrawing…' : 'Withdraw'}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction ReviewHistoryRow({ review }: { review: RoadmapReview }) {\n return (\n <li className=\"space-y-1 rounded-md border p-2 text-sm\">\n <div className=\"flex items-center justify-between gap-2\">\n <Badge variant={STATUS_VARIANT[review.status]} className=\"text-[11px]\">\n {enumLabel(review.status)}\n </Badge>\n <span className=\"text-xs text-muted-foreground\">\n {review.decidedAt ? when(review.decidedAt) : when(review.createdAt)}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n Requested by <PersonName id={review.requestedBy} /> · {review.decisions.length} of{' '}\n {review.reviewerIds.length} decided\n </p>\n </li>\n );\n}\n\nexport function RoadmapReviewPanel({ roadmapId }: { roadmapId: string }) {\n const { data, loading, error } = useQuery<{ planmagnetRoadmapReviews: RoadmapReview[] }>(\n ROADMAP_REVIEWS,\n { variables: { roadmapId }, skip: !roadmapId }\n );\n const reviews = data?.planmagnetRoadmapReviews ?? [];\n const current = reviews.find((r) => r.status === 'OPEN') ?? null;\n const history = reviews.filter((r) => r.id !== current?.id);\n\n return (\n <Card data-testid=\"roadmap-review-panel\">\n <CardHeader className=\"flex flex-row items-center justify-between gap-2\">\n <CardTitle className=\"flex items-center gap-2\">\n <ClipboardCheck className=\"h-4 w-4\" aria-hidden=\"true\" />\n Review\n </CardTitle>\n {!current && <RequestReviewDialog roadmapId={roadmapId} />}\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {loading && !data && (\n <p className=\"text-sm text-muted-foreground\">Loading review status…</p>\n )}\n {error && (\n <ErrorLine\n message={\n isForbidden(error)\n ? 'Your role cannot see this roadmap’s reviews.'\n : `Reviews could not be loaded: ${error.message}`\n }\n />\n )}\n {current && <CurrentReviewCard review={current} />}\n {!current && !loading && (\n <p className=\"text-sm text-muted-foreground\">No review in progress.</p>\n )}\n {history.length > 0 && (\n <div className=\"space-y-2 border-t pt-3\">\n <p className=\"text-xs font-medium text-muted-foreground\">Past reviews</p>\n <ul className=\"space-y-2\">\n {history.map((r) => (\n <ReviewHistoryRow key={r.id} review={r} />\n ))}\n </ul>\n </div>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RoadmapVersionsPanel.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/roadmaps/RoadmapVersionsPanel.tsx"],"names":[],"mappings":"AAyaA,wBAAgB,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2CA0ExE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RoadmapVersionsPanel.js","names":[],"sources":["../../../src/planmagnet/roadmaps/RoadmapVersionsPanel.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useLazyQuery, useMutation, useQuery } from '@apollo/client/react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { GitCompare, History, Plus } from 'lucide-react';\nimport { PersonName } from '../people/People';\nimport { ErrorLine } from '../controls/ConfirmButton';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { throwOnError } from '../utils/mutationResult';\nimport { isForbidden, mutationErrorMessage } from '../utils/graphqlErrors';\n\n/**\n * Saved roadmap snapshots + server-computed diffs (PRM-11). There is no restore mutation in this release —\n * `PlanmagnetRoadmapVersion`'s own schema doc says so explicitly (\"only listing, reading and diffing\") — so this\n * panel never offers one: faking \"restore\" client-side would mean replaying every add/update/move/delete the\n * diff implies against the live roadmap, which is not what was shipped on the backend.\n */\n\nconst VERSIONS_QUERY_NAME = 'RoadmapVersionsPanel';\nconst PAGE = 20;\n\nconst ROADMAP_VERSIONS = gql`\n query RoadmapVersionsPanel($roadmapId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetRoadmapVersions(roadmapId: $roadmapId, pagination: $pagination) {\n totalCount\n pageInfo {\n hasNextPage\n endCursor\n }\n items {\n id\n name\n note\n createdAt\n createdBy\n }\n }\n }\n`;\nconst SAVE_VERSION = gql`\n mutation RoadmapVersionSave($roadmapId: ID!, $input: PlanmagnetSaveRoadmapVersionInput!) {\n planmagnetSaveRoadmapVersion(roadmapId: $roadmapId, input: $input) {\n id\n }\n }\n`;\nconst VERSION_DIFF = gql`\n query RoadmapVersionDiffPanel($fromVersionId: ID!, $toVersionId: ID) {\n planmagnetRoadmapVersionDiff(fromVersionId: $fromVersionId, toVersionId: $toVersionId) {\n fromVersionId\n toVersionId\n added {\n itemId\n title\n }\n removed {\n itemId\n title\n }\n changed {\n itemId\n title\n changedFields\n from\n to\n }\n }\n }\n`;\n\ninterface VersionSummary {\n id: string;\n name: string;\n note: string | null;\n createdAt: string;\n createdBy: string;\n}\ninterface VersionsData {\n planmagnetRoadmapVersions: {\n totalCount: number;\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n items: VersionSummary[];\n };\n}\ninterface DiffItem {\n itemId: string;\n title: string;\n}\ninterface DiffChange {\n itemId: string;\n title: string;\n changedFields: string[];\n from: Record<string, unknown>;\n to: Record<string, unknown>;\n}\ninterface VersionDiff {\n fromVersionId: string;\n toVersionId: string | null;\n added: DiffItem[];\n removed: DiffItem[];\n changed: DiffChange[];\n}\n\nconst when = (iso: string) => new Date(iso).toLocaleString();\n\n/** A camelCase API field name as a readable label: \"riskLevel\" -> \"Risk level\". */\nfunction fieldLabel(field: string): string {\n const spaced = field.replace(/([A-Z])/g, ' $1').toLowerCase();\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nconst DATE_FIELDS = new Set(['startDate', 'endDate']);\n/** Rendered through `enumLabel` — the same label convention `RoadmapControls.tsx`'s horizon/risk-level selects\n * and `RoadmapNowNextLater.tsx`'s status chip already use, so a diffed value never disagrees with how the same\n * value reads everywhere else on this page. */\nconst ENUM_FIELDS = new Set(['status', 'horizon', 'riskLevel']);\n\n/** `from`/`to` are JSON scalars — whatever the server put there (a string, a number, or null) — rendered in the\n * same terms the rest of this MFE already uses rather than as a raw JSON dump. */\nfunction formatDiffValue(field: string, value: unknown): string {\n if (value === null || value === undefined || value === '') return '—';\n if (DATE_FIELDS.has(field) && typeof value === 'string') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? value : d.toLocaleDateString();\n }\n if (ENUM_FIELDS.has(field) && typeof value === 'string') return enumLabel(value);\n if (field === 'confidence' && typeof value === 'number') return `${value}%`;\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n}\n\nfunction SaveVersionDialog({ roadmapId }: { roadmapId: string }) {\n const [open, setOpen] = useState(false);\n const [name, setName] = useState('');\n const [note, setNote] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [save, saveState] = useMutation(SAVE_VERSION, {\n refetchQueries: [VERSIONS_QUERY_NAME],\n awaitRefetchQueries: true,\n });\n\n const trimmedName = name.trim();\n const tooLong = trimmedName.length > 120;\n\n const reset = () => {\n setName('');\n setNote('');\n setError(null);\n };\n\n const submit = async () => {\n setError(null);\n try {\n await throwOnError(\n save({ variables: { roadmapId, input: { name: trimmedName, note: note.trim() || null } } })\n );\n reset();\n setOpen(false);\n } catch (e) {\n setError(\n isForbidden(e)\n ? 'Your role cannot save a version of this roadmap.'\n : mutationErrorMessage(e, 'The version could not be saved.')\n );\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) reset();\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" data-testid=\"roadmap-version-save\">\n <Plus className=\"mr-1 h-4 w-4\" aria-hidden=\"true\" />\n Save version\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-md\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Save version</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n A snapshot of the roadmap and its items, as they are right now.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"version-name\" className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id=\"version-name\"\n className=\"mt-1\"\n maxLength={120}\n value={name}\n onChange={(e) => setName(e.target.value)}\n />\n {tooLong && <ErrorLine message=\"A version name can be at most 120 characters.\" />}\n </div>\n <div>\n <label htmlFor=\"version-note\" className=\"text-sm font-medium\">\n Note (optional)\n </label>\n <textarea\n id=\"version-note\"\n className=\"mt-1 w-full min-h-[60px] rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button\n onClick={() => void submit()}\n disabled={!trimmedName || tooLong || saveState.loading}\n >\n {saveState.loading ? 'Saving…' : 'Save version'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\nfunction VersionRow({ version }: { version: VersionSummary }) {\n return (\n <li className=\"rounded-md border p-2 text-sm\" data-testid=\"roadmap-version\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium\">{version.name}</span>\n <span className=\"text-xs text-muted-foreground\">{when(version.createdAt)}</span>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n Saved by <PersonName id={version.createdBy} />\n </p>\n {version.note && <p className=\"text-xs text-muted-foreground mt-1\">{version.note}</p>}\n </li>\n );\n}\n\nfunction DiffItemsSection({\n title,\n items,\n testId,\n}: {\n title: string;\n items: DiffItem[];\n testId: string;\n}) {\n if (items.length === 0) return null;\n return (\n <div data-testid={testId}>\n <p className=\"text-xs font-medium text-muted-foreground\">\n {title} ({items.length})\n </p>\n <ul className=\"mt-1 space-y-1\">\n {items.map((item) => (\n <li key={item.itemId} className=\"text-sm\">\n {item.title}\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\nfunction DiffChangedSection({ items }: { items: DiffChange[] }) {\n if (items.length === 0) return null;\n return (\n <div data-testid=\"roadmap-version-diff-changed\">\n <p className=\"text-xs font-medium text-muted-foreground\">Changed ({items.length})</p>\n <ul className=\"mt-1 space-y-2\">\n {items.map((item) => (\n <li key={item.itemId} className=\"rounded-md border p-2 text-sm\">\n <p className=\"font-medium\">{item.title}</p>\n <ul className=\"mt-1 space-y-0.5\">\n {item.changedFields.map((field) => (\n <li key={field} className=\"text-xs text-muted-foreground\">\n {fieldLabel(field)}: {formatDiffValue(field, item.from[field])} →{' '}\n {formatDiffValue(field, item.to[field])}\n </li>\n ))}\n </ul>\n </li>\n ))}\n </ul>\n </div>\n );\n}\n\n/** \"From\" a saved version, \"to\" another saved version OR (when left as \"Current\") the roadmap's live items —\n * matching `planmagnetRoadmapVersionDiff`'s own \"omit toVersionId = against current\" contract. Reads from the\n * SAME page of versions the list above already loaded, rather than firing a second, unpaged query for the\n * dropdowns: with the 20-per-page default this covers every roadmap that hasn't outgrown one \"Show more\" click. */\nfunction CompareSection({ versions }: { versions: VersionSummary[] }) {\n const [fromId, setFromId] = useState('');\n const [toId, setToId] = useState('');\n const [runDiff, diffState] = useLazyQuery<{ planmagnetRoadmapVersionDiff: VersionDiff }>(\n VERSION_DIFF\n );\n\n const compare = () => {\n if (!fromId) return;\n void runDiff({ variables: { fromVersionId: fromId, toVersionId: toId || undefined } });\n };\n\n const diff = diffState.data?.planmagnetRoadmapVersionDiff ?? null;\n const hasAny =\n !!diff && (diff.added.length > 0 || diff.removed.length > 0 || diff.changed.length > 0);\n\n return (\n <div className=\"space-y-3 border-t pt-3\" data-testid=\"roadmap-version-compare\">\n <p className=\"flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n <GitCompare className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n Compare\n </p>\n {versions.length === 0 ? (\n <p className=\"text-xs text-muted-foreground\">Save a version to compare against.</p>\n ) : (\n <>\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label htmlFor=\"diff-from\" className=\"text-xs font-medium\">\n From\n </label>\n <select\n id=\"diff-from\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm\"\n value={fromId}\n onChange={(e) => {\n const next = e.target.value;\n setFromId(next);\n // The \"To\" list excludes whatever is picked as \"From\" (see its filter below), so if the\n // version just chosen as \"From\" is the one already selected as \"To\", that option vanishes\n // from the \"To\" dropdown — it *visually* falls back to \"Current\" but `toId` state itself\n // would stay the stale id, silently diffing a version against itself. Reset it here so the\n // visible \"Current\" always matches what gets sent.\n setToId((prevTo) => (prevTo === next ? '' : prevTo));\n }}\n >\n <option value=\"\">Select a version</option>\n {versions.map((v) => (\n <option key={v.id} value={v.id}>\n {v.name}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label htmlFor=\"diff-to\" className=\"text-xs font-medium\">\n To\n </label>\n <select\n id=\"diff-to\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-2 py-1.5 text-sm\"\n value={toId}\n onChange={(e) => setToId(e.target.value)}\n >\n <option value=\"\">Current</option>\n {versions\n .filter((v) => v.id !== fromId)\n .map((v) => (\n <option key={v.id} value={v.id}>\n {v.name}\n </option>\n ))}\n </select>\n </div>\n </div>\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={compare}\n disabled={!fromId || diffState.loading}\n >\n {diffState.loading ? 'Comparing…' : 'Compare'}\n </Button>\n {diffState.error && (\n <ErrorLine\n message={\n isForbidden(diffState.error)\n ? 'Your role cannot compare versions of this roadmap.'\n : `The comparison could not be loaded: ${diffState.error.message}`\n }\n />\n )}\n {diff && (\n <div className=\"space-y-3 rounded-md border p-2\" data-testid=\"roadmap-version-diff\">\n {!hasAny && <p className=\"text-sm text-muted-foreground\">No differences.</p>}\n <DiffItemsSection\n title=\"Added\"\n items={diff.added}\n testId=\"roadmap-version-diff-added\"\n />\n <DiffItemsSection\n title=\"Removed\"\n items={diff.removed}\n testId=\"roadmap-version-diff-removed\"\n />\n <DiffChangedSection items={diff.changed} />\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport function RoadmapVersionsPanel({ roadmapId }: { roadmapId: string }) {\n const { data, loading, error, fetchMore } = useQuery<VersionsData>(ROADMAP_VERSIONS, {\n variables: { roadmapId, pagination: { first: PAGE } },\n skip: !roadmapId,\n });\n const [loadingMore, setLoadingMore] = useState(false);\n\n const list = data?.planmagnetRoadmapVersions;\n const versions = list?.items ?? [];\n\n const loadMore = async () => {\n const after = list?.pageInfo.endCursor;\n if (!after) return;\n setLoadingMore(true);\n try {\n await fetchMore({\n variables: { pagination: { first: PAGE, after } },\n updateQuery: (prev, { fetchMoreResult }) => ({\n planmagnetRoadmapVersions: {\n ...fetchMoreResult.planmagnetRoadmapVersions,\n items: [\n ...prev.planmagnetRoadmapVersions.items,\n ...fetchMoreResult.planmagnetRoadmapVersions.items,\n ],\n },\n }),\n });\n } finally {\n setLoadingMore(false);\n }\n };\n\n return (\n <Card data-testid=\"roadmap-versions\">\n <CardHeader className=\"flex flex-row items-center justify-between gap-2\">\n <CardTitle className=\"flex items-center gap-2\">\n <History className=\"h-4 w-4\" aria-hidden=\"true\" />\n Versions\n </CardTitle>\n <SaveVersionDialog roadmapId={roadmapId} />\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {loading && !data && <p className=\"text-sm text-muted-foreground\">Loading versions…</p>}\n {error && (\n <ErrorLine\n message={\n isForbidden(error)\n ? 'Your role cannot see this roadmap’s versions.'\n : `Versions could not be loaded: ${error.message}`\n }\n />\n )}\n {list && versions.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">No versions saved yet.</p>\n )}\n <ul className=\"space-y-2\">\n {versions.map((v) => (\n <VersionRow key={v.id} version={v} />\n ))}\n </ul>\n {list?.pageInfo.hasNextPage && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void loadMore()}\n disabled={loadingMore}\n >\n {loadingMore ? 'Loading…' : `Show more (${versions.length} of ${list.totalCount})`}\n </Button>\n )}\n <CompareSection versions={versions} />\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planningFocus.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/roadmaps/planningFocus.tsx"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,CAAC;AAE7E,eAAO,MAAM,gBAAgB,EAAE,SAAS,aAAa,EAKpD,CAAC;AASF,mFAAmF;AACnF,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE3E;AAED,0CAA0C;AAC1C,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,2CAoBjF;AAED,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,EACR,EAAqB,GACtB,EAAE;IACD,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,2CAwBA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planningFocus.js","names":[],"sources":["../../../src/planmagnet/roadmaps/planningFocus.tsx"],"sourcesContent":["import { Boxes, Cpu, Layers, Lightbulb, type LucideIcon } from 'lucide-react';\n\n/**\n * What a roadmap is organised around (BOFF-7934). Separate from how it is\n * displayed: the roadmap page has ONE layout today (items grouped by lane with\n * their dates), so the service accepts only the TIMELINE display and these\n * pages no longer offer Gantt / Swimlane / Custom — a stored label is not a\n * view. Legacy roadmaps were never classified, so a missing focus is shown as\n * \"not set\", never guessed.\n */\nexport type PlanningFocus = 'THEME' | 'FEATURE' | 'TECHNOLOGY' | 'PORTFOLIO';\n\nexport const PLANNING_FOCUSES: readonly PlanningFocus[] = [\n 'THEME',\n 'FEATURE',\n 'TECHNOLOGY',\n 'PORTFOLIO',\n];\n\nconst FOCUS: Record<PlanningFocus, { label: string; icon: LucideIcon }> = {\n THEME: { label: 'Theme', icon: Lightbulb },\n FEATURE: { label: 'Feature', icon: Layers },\n TECHNOLOGY: { label: 'Technology', icon: Cpu },\n PORTFOLIO: { label: 'Portfolio', icon: Boxes },\n};\n\n/** The only display the roadmap page has; the create/update inputs require one. */\nexport const ROADMAP_DISPLAY = 'TIMELINE';\n\nexport function planningFocusLabel(focus: string | null | undefined): string {\n return focus && focus in FOCUS ? FOCUS[focus as PlanningFocus].label : 'Focus not set';\n}\n\n/** Icon AND label, never colour alone. */\nexport function PlanningFocusBadge({ focus }: { focus: string | null | undefined }) {\n if (!focus || !(focus in FOCUS)) {\n return (\n <span\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\"\n data-testid=\"planning-focus\"\n >\n Focus not set\n </span>\n );\n }\n const { label, icon: Icon } = FOCUS[focus as PlanningFocus];\n return (\n <span\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs text-foreground\"\n data-testid=\"planning-focus\"\n >\n <Icon className=\"h-3 w-3\" /> {label}\n </span>\n );\n}\n\nexport function PlanningFocusSelect({\n value,\n onChange,\n id = 'planning-focus',\n}: {\n value: PlanningFocus | null;\n onChange: (value: PlanningFocus | null) => void;\n id?: string;\n}) {\n return (\n <div>\n <label htmlFor={id} className=\"text-sm font-medium\">\n Planning focus\n </label>\n <select\n id={id}\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value ? (e.target.value as PlanningFocus) : null)}\n >\n <option value=\"\">Not set</option>\n {PLANNING_FOCUSES.map((f) => (\n <option key={f} value={f}>\n {FOCUS[f].label}\n </option>\n ))}\n </select>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n What the roadmap is organised around. Roadmaps are shown in one layout for now.\n </p>\n </div>\n );\n}\n"],"mappings":";;;AAYA,IAAa,IAA6C;CACxD;CACA;CACA;CACA;CACD,EAEK,IAAoE;CACxE,OAAO;EAAE,OAAO;EAAS,MAAM;EAAW;CAC1C,SAAS;EAAE,OAAO;EAAW,MAAM;EAAQ;CAC3C,YAAY;EAAE,OAAO;EAAc,MAAM;EAAK;CAC9C,WAAW;EAAE,OAAO;EAAa,MAAM;EAAO;CAC/C,EAGY,IAAkB;AAE/B,SAAgB,EAAmB,GAA0C;AAC3E,QAAO,KAAS,KAAS,IAAQ,EAAM,GAAwB,QAAQ;;AAIzE,SAAgB,EAAmB,EAAE,YAA+C;AAClF,KAAI,CAAC,KAAS,EAAE,KAAS,GACvB,QACE,kBAAC,QAAD;EACE,WAAU;EACV,eAAY;YACb;EAEM,CAAA;CAGX,IAAM,EAAE,UAAO,MAAM,MAAS,EAAM;AACpC,QACE,kBAAC,QAAD;EACE,WAAU;EACV,eAAY;YAFd;GAIE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;;GAAE;GACzB;;;AAIX,SAAgB,EAAoB,EAClC,UACA,aACA,QAAK,oBAKJ;AACD,QACE,kBAAC,OAAD,EAAA,UAAA;EACE,kBAAC,SAAD;GAAO,SAAS;GAAI,WAAU;aAAsB;GAE5C,CAAA;EACR,kBAAC,UAAD;GACM;GACJ,WAAU;GACV,OAAO,KAAS;GAChB,WAAW,MAAM,EAAS,EAAE,OAAO,QAAS,EAAE,OAAO,QAA0B,KAAK;aAJtF,CAME,kBAAC,UAAD;IAAQ,OAAM;cAAG;IAAgB,CAAA,EAChC,EAAiB,KAAK,MACrB,kBAAC,UAAD;IAAgB,OAAO;cACpB,EAAM,GAAG;IACH,EAFI,EAEJ,CACT,CACK;;EACT,kBAAC,KAAD;GAAG,WAAU;aAAqC;GAE9C,CAAA;EACA,EAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeliverySatisfactionSection.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/DeliverySatisfactionSection.tsx"],"names":[],"mappings":"AAaA;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,WAAW,EACX,SAAS,EACT,SAAS,EACT,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,2CAiEA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeliverySatisfactionSection.js","names":[],"sources":["../../../src/planmagnet/satisfaction/DeliverySatisfactionSection.tsx"],"sourcesContent":["import { useQuery } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { ArrowRight } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { isForbidden } from '../utils/graphqlErrors';\nimport { CompactSatisfactionFigures } from './SatisfactionFigures';\nimport { satisfactionPageLink, utcDay } from './satisfaction';\nimport {\n CUSTOMER_SATISFACTION_SUMMARY,\n type CustomerSatisfactionSummaryData,\n} from './satisfactionOperations';\n\n/**\n * ANR-21 on the delivery KPIs card: CSAT — the default delivery KPI — and NPS next to the on-time rate and scope\n * adherence, for the same scope (the workspace, or responses linked to the selected project) and the same UTC days as\n * the rest of the card.\n *\n * It reads `planmagnetCustomerSatisfaction` with the card's own range as a CUSTOM window rather than selecting\n * `planmagnetDeliveryKpis.customerSatisfaction` on the card's query. The figures are the same — the service resolves\n * both from one summary over the same UTC days when dates are given — but a query of its own means a satisfaction\n * failure (or a role that cannot read `planmagnet-product`) leaves the on-time and scope figures standing: a non-null\n * field that fails nulls the whole `planmagnetDeliveryKpis`. A second `planmagnetDeliveryKpis` query just for this\n * field would recompute every other KPI on the server.\n */\nexport function DeliverySatisfactionSection({\n workspaceId,\n projectId,\n startDate,\n endDate,\n}: {\n workspaceId: string;\n projectId?: string;\n /** ISO instants: the start of the range's first UTC day and the end of its last. */\n startDate: string;\n endDate: string;\n}) {\n const tr = useTr();\n const navigate = usePlanMagnetNavigate();\n const { data, loading, error } = useQuery<CustomerSatisfactionSummaryData>(\n CUSTOMER_SATISFACTION_SUMMARY,\n {\n variables: {\n workspaceId,\n filter: {\n ...(projectId ? { projectId } : {}),\n window: { preset: 'CUSTOM', from: startDate, to: endDate },\n },\n },\n }\n );\n const summary = data?.planmagnetCustomerSatisfaction;\n const from = utcDay(startDate);\n const to = utcDay(endDate);\n\n return (\n <div data-testid=\"delivery-satisfaction\">\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n <h3 className=\"text-sm font-medium\">\n {tr('planmagnet.analytics.delivery.satisfaction', 'Customer satisfaction')}\n </h3>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 px-2 text-xs\"\n onClick={() =>\n navigate(\n satisfactionPageLink(\n { projectId },\n from && to ? { preset: 'CUSTOM', from, to } : undefined\n )\n )\n }\n data-testid=\"delivery-satisfaction-open\"\n >\n {tr('planmagnet.analytics.delivery.satisfactionOpen', 'Responses')}\n <ArrowRight className=\"ml-1 h-3.5 w-3.5\" />\n </Button>\n </div>\n {loading && !summary ? (\n <p className=\"py-2 text-sm text-muted-foreground\">\n {tr('planmagnet.satisfaction.loading', 'Loading…')}\n </p>\n ) : error && !summary ? (\n <p className=\"py-2 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 </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAyBA,SAAgB,EAA4B,EAC1C,gBACA,cACA,cACA,cAOC;CACD,IAAM,IAAK,GAAO,EACZ,IAAW,GAAuB,EAClC,EAAE,SAAM,YAAS,aAAU,EAC/B,GACA,EACE,WAAW;EACT;EACA,QAAQ;GACN,GAAI,IAAY,EAAE,cAAW,GAAG,EAAE;GAClC,QAAQ;IAAE,QAAQ;IAAU,MAAM;IAAW,IAAI;IAAS;GAC3D;EACF,EACF,CACF,EACK,IAAU,GAAM,gCAChB,IAAO,EAAO,EAAU,EACxB,IAAK,EAAO,EAAQ;AAE1B,QACE,kBAAC,OAAD;EAAK,eAAY;YAAjB,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,MAAD;IAAI,WAAU;cACX,EAAG,8CAA8C,wBAAwB;IACvE,CAAA,EACL,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,WAAU;IACV,eACE,EACE,EACE,EAAE,cAAW,EACb,KAAQ,IAAK;KAAE,QAAQ;KAAU;KAAM;KAAI,GAAG,KAAA,EAC/C,CACF;IAEH,eAAY;cAZd,CAcG,EAAG,kDAAkD,YAAY,EAClE,kBAAC,GAAD,EAAY,WAAU,oBAAqB,CAAA,CACpC;MACL;MACL,KAAW,CAAC,IACX,kBAAC,KAAD;GAAG,WAAU;aACV,EAAG,mCAAmC,WAAW;GAChD,CAAA,GACF,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,KACA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionFigures.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/SatisfactionFigures.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEjD,OAAO,EAAgD,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,KAAK,EAEV,2BAA2B,EAE3B,sBAAsB,EACvB,MAAM,0BAA0B,CAAC;AAElC;;;;GAIG;AAEH,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC;AAEnC,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAUzE;AAED,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAa1F;AAUD;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAOxD,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAarE;AA8JD,iDAAiD;AACjD,wBAAgB,uBAAuB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,2BAA2B,CAAA;CAAE,2CAO5F;AA+BD,+GAA+G;AAC/G,wBAAgB,0BAA0B,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,2BAA2B,CAAA;CAAE,2CAuC/F"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionFigures.js","names":[],"sources":["../../../src/planmagnet/satisfaction/SatisfactionFigures.tsx"],"sourcesContent":["import { Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { Gauge, Smile } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { cn } from '../utils/cn';\nimport { formatCsat, formatNps, formatUtcDay, shareOf, type ScoreCategory } from './satisfaction';\nimport type {\n CsatFigure,\n CustomerSatisfactionSummary,\n NpsFigure,\n SatisfactionWindowEcho,\n} from './satisfactionOperations';\n\n/**\n * ANR-21 figures. Every figure carries its response count and the window it covers (owner decision 2026-10-02), and\n * a metric below its minimum responses reads \"Not enough responses\" — never 0 and never a score computed from too few\n * answers. CSAT and NPS are counted separately: twelve NPS answers never lend a score to four CSAT answers.\n */\n\ntype Tr = ReturnType<typeof useTr>;\n\nexport function responseCountText(tr: Tr, count: number): string {\n if (count === 0) return tr('planmagnet.satisfaction.responses.none', 'No responses');\n return count === 1\n ? tr('planmagnet.satisfaction.responses.one', '1 response')\n : tr('planmagnet.satisfaction.responses.many', '{{count}} responses', { count });\n}\n\nexport function windowText(tr: Tr, window: SatisfactionWindowEcho): string {\n const span = tr('planmagnet.satisfaction.window.span', '{{from}} – {{to}}', {\n from: formatUtcDay(window.from),\n to: formatUtcDay(window.to),\n });\n if (window.preset === 'CUSTOM') return span;\n return tr('planmagnet.satisfaction.window.presetWithSpan', '{{preset}} ({{span}})', {\n preset: windowPresetLabel(tr, window.preset),\n span,\n });\n}\n\nexport function windowPresetLabel(tr: Tr, preset: SatisfactionWindowEcho['preset']): string {\n switch (preset) {\n case 'LAST_30_DAYS':\n return tr('planmagnet.satisfaction.window.last30', 'Last 30 days');\n case 'LAST_90_DAYS':\n return tr('planmagnet.satisfaction.window.last90', 'Last 90 days');\n case 'LAST_180_DAYS':\n return tr('planmagnet.satisfaction.window.last180', 'Last 180 days');\n case 'LAST_365_DAYS':\n return tr('planmagnet.satisfaction.window.last365', 'Last 365 days');\n default:\n return tr('planmagnet.satisfaction.window.custom', 'Custom');\n }\n}\n\nfunction notEnoughText(tr: Tr, figure: { responseCount: number; minimumResponses: number }) {\n return tr(\n 'planmagnet.satisfaction.notEnoughDetail',\n '{{count}} so far — a score needs at least {{minimum}} responses.',\n { count: figure.responseCount, minimum: figure.minimumResponses }\n );\n}\n\n/**\n * Badge colours for one answer's category — semantic status tokens only, and only those the host shells' Tailwind\n * theme maps (planmagnet-app styles.css @theme): `bg-status-*-bg`, `bg-status-*-bg-subtle`, `text-status-success-text`,\n * `text-status-error-text`. A token missing there generates no CSS at all.\n */\nexport const CATEGORY_CLASS: Record<ScoreCategory, string> = {\n satisfied: 'bg-status-success-bg-subtle text-status-success-text',\n promoter: 'bg-status-success-bg-subtle text-status-success-text',\n // The shells' Tailwind theme maps no warning TEXT colour (only its backgrounds), so a passive reads in the body colour.\n passive: 'bg-status-warning-bg-subtle text-foreground',\n notSatisfied: 'bg-status-error-bg-subtle text-status-error-text',\n detractor: 'bg-status-error-bg-subtle text-status-error-text',\n};\n\nexport function categoryLabel(tr: Tr, category: ScoreCategory): string {\n switch (category) {\n case 'satisfied':\n return tr('planmagnet.satisfaction.category.satisfied', 'Satisfied');\n case 'notSatisfied':\n return tr('planmagnet.satisfaction.category.notSatisfied', 'Not satisfied');\n case 'promoter':\n return tr('planmagnet.satisfaction.category.promoter', 'Promoter');\n case 'passive':\n return tr('planmagnet.satisfaction.category.passive', 'Passive');\n default:\n return tr('planmagnet.satisfaction.category.detractor', 'Detractor');\n }\n}\n\n/** Promoters / passives / detractors as a bar (only once there is a score) and as counts (always). */\nfunction NpsSplit({ nps }: { nps: NpsFigure }) {\n const tr = useTr();\n const parts = [\n {\n key: 'promoters',\n label: tr('planmagnet.satisfaction.nps.promoters', 'Promoters (9–10)'),\n count: nps.promoterCount,\n bar: 'bg-status-success-bg',\n },\n {\n key: 'passives',\n label: tr('planmagnet.satisfaction.nps.passives', 'Passives (7–8)'),\n count: nps.passiveCount,\n bar: 'bg-status-warning-bg',\n },\n {\n key: 'detractors',\n label: tr('planmagnet.satisfaction.nps.detractors', 'Detractors (0–6)'),\n count: nps.detractorCount,\n bar: 'bg-status-error-bg',\n },\n ];\n const showShares = !nps.notEnoughResponses && nps.responseCount > 0;\n return (\n <div className=\"space-y-2\" data-testid=\"satisfaction-nps-split\">\n {showShares && (\n <div className=\"flex h-2 w-full overflow-hidden rounded-full bg-muted\" aria-hidden={true}>\n {parts.map((part) => (\n <div\n key={part.key}\n className={part.bar}\n style={{ width: `${(part.count * 100) / nps.responseCount}%` }}\n />\n ))}\n </div>\n )}\n <dl className=\"grid grid-cols-3 gap-2 text-xs\">\n {parts.map((part) => (\n <div key={part.key} className=\"min-w-0\">\n <dt className=\"flex items-center gap-1.5 text-muted-foreground\">\n <span className={cn('h-2 w-2 shrink-0 rounded-full', part.bar)} aria-hidden={true} />\n <span className=\"truncate\">{part.label}</span>\n </dt>\n <dd className=\"mt-0.5 font-medium tabular-nums\">\n {showShares\n ? tr('planmagnet.satisfaction.nps.countWithShare', '{{count}} ({{share}}%)', {\n count: part.count,\n share: shareOf(part.count, nps.responseCount),\n })\n : part.count}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n );\n}\n\nfunction FigureValue({\n value,\n notEnough,\n testId,\n}: {\n value: string | null;\n notEnough: boolean;\n testId: string;\n}) {\n const tr = useTr();\n if (notEnough || value === null) {\n return (\n <p className=\"text-lg font-semibold text-muted-foreground\" data-testid={testId}>\n {tr('planmagnet.satisfaction.notEnough', 'Not enough responses')}\n </p>\n );\n }\n return (\n <p className=\"text-3xl font-semibold tabular-nums\" data-testid={testId}>\n {value}\n </p>\n );\n}\n\nfunction CsatCard({ csat, window }: { csat: CsatFigure; window: SatisfactionWindowEcho }) {\n const tr = useTr();\n return (\n <Card data-testid=\"satisfaction-csat-card\">\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Smile className=\"h-4 w-4\" aria-hidden={true} />\n {tr('planmagnet.satisfaction.csat.title', 'CSAT')}\n </CardTitle>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.satisfaction.csat.subtitle',\n 'Customer satisfaction: the share of answers that were a 4 or a 5 on a 1–5 scale. The default delivery KPI.'\n )}\n </p>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <FigureValue\n value={formatCsat(csat.score)}\n notEnough={csat.notEnoughResponses}\n testId=\"satisfaction-csat-value\"\n />\n <p className=\"text-sm text-muted-foreground\">\n {csat.notEnoughResponses\n ? notEnoughText(tr, csat)\n : tr(\n 'planmagnet.satisfaction.csat.satisfied',\n '{{satisfied}} of {{count}} answers were a 4 or a 5.',\n { satisfied: csat.satisfiedCount, count: csat.responseCount }\n )}\n </p>\n <p className=\"text-xs text-muted-foreground\" data-testid=\"satisfaction-csat-basis\">\n {responseCountText(tr, csat.responseCount)} · {windowText(tr, window)}\n </p>\n </CardContent>\n </Card>\n );\n}\n\nfunction NpsCard({ nps, window }: { nps: NpsFigure; window: SatisfactionWindowEcho }) {\n const tr = useTr();\n return (\n <Card data-testid=\"satisfaction-nps-card\">\n <CardHeader className=\"pb-2\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Gauge className=\"h-4 w-4\" aria-hidden={true} />\n {tr('planmagnet.satisfaction.nps.title', 'NPS')}\n </CardTitle>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.satisfaction.nps.subtitle',\n 'Net Promoter Score: % promoters (9–10) minus % detractors (0–6) on a 0–10 scale, from −100 to +100.'\n )}\n </p>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <FigureValue\n value={formatNps(nps.score)}\n notEnough={nps.notEnoughResponses}\n testId=\"satisfaction-nps-value\"\n />\n {nps.notEnoughResponses && (\n <p className=\"text-sm text-muted-foreground\">{notEnoughText(tr, nps)}</p>\n )}\n <NpsSplit nps={nps} />\n <p className=\"text-xs text-muted-foreground\" data-testid=\"satisfaction-nps-basis\">\n {responseCountText(tr, nps.responseCount)} · {windowText(tr, window)}\n </p>\n </CardContent>\n </Card>\n );\n}\n\n/** The page's two figure cards, side by side. */\nexport function SatisfactionFigureCards({ summary }: { summary: CustomerSatisfactionSummary }) {\n return (\n <div className=\"grid gap-4 md:grid-cols-2\" data-testid=\"satisfaction-figures\">\n <CsatCard csat={summary.csat} window={summary.window} />\n <NpsCard nps={summary.nps} window={summary.window} />\n </div>\n );\n}\n\nfunction CompactTile({\n label,\n value,\n notEnough,\n responseCount,\n testId,\n}: {\n label: string;\n value: string | null;\n notEnough: boolean;\n responseCount: number;\n testId: string;\n}) {\n const tr = useTr();\n return (\n <div className=\"rounded-md border p-3\" data-testid={testId}>\n <p className=\"text-xs text-muted-foreground\">{label}</p>\n {notEnough || value === null ? (\n <p className=\"mt-1 text-sm font-semibold text-muted-foreground\">\n {tr('planmagnet.satisfaction.notEnough', 'Not enough responses')}\n </p>\n ) : (\n <p className=\"mt-1 text-2xl font-semibold tabular-nums\">{value}</p>\n )}\n <p className=\"mt-0.5 text-xs text-muted-foreground\">{responseCountText(tr, responseCount)}</p>\n </div>\n );\n}\n\n/** CSAT and NPS as two small tiles with their counts, and the window under them — for cards on other pages. */\nexport function CompactSatisfactionFigures({ summary }: { summary: CustomerSatisfactionSummary }) {\n const tr = useTr();\n const { csat, nps } = summary;\n return (\n <div className=\"space-y-2\">\n <div className=\"grid grid-cols-2 gap-3\">\n <CompactTile\n label={tr('planmagnet.satisfaction.csat.compactLabel', 'CSAT (% of answers 4–5)')}\n value={formatCsat(csat.score)}\n notEnough={csat.notEnoughResponses}\n responseCount={csat.responseCount}\n testId=\"satisfaction-compact-csat\"\n />\n <CompactTile\n label={tr('planmagnet.satisfaction.nps.compactLabel', 'NPS')}\n value={formatNps(nps.score)}\n notEnough={nps.notEnoughResponses}\n responseCount={nps.responseCount}\n testId=\"satisfaction-compact-nps\"\n />\n </div>\n {!nps.notEnoughResponses && (\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.satisfaction.nps.compactSplit',\n 'NPS: {{promoters}} promoters · {{passives}} passives · {{detractors}} detractors',\n {\n promoters: nps.promoterCount,\n passives: nps.passiveCount,\n detractors: nps.detractorCount,\n }\n )}\n </p>\n )}\n <p className=\"text-xs text-muted-foreground\" data-testid=\"satisfaction-compact-window\">\n {windowText(tr, summary.window)}\n </p>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionImportDialog.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/SatisfactionImportDialog.tsx"],"names":[],"mappings":"AA+BA,OAAO,EAQL,KAAK,YAAY,EAOlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,gCAAgC,EACtC,MAAM,0BAA0B,CAAC;AAkPlC,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,UAAU,GACX,EAAE;IACD,+FAA+F;IAC/F,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,CAAC,MAAM,EAAE,gCAAgC,KAAK,IAAI,CAAC;CAChE,2CA8aA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionImportDialog.js","names":[],"sources":["../../../src/planmagnet/satisfaction/SatisfactionImportDialog.tsx"],"sourcesContent":["import { useMemo, useState, type ChangeEvent } from 'react';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Badge,\n Button,\n Checkbox,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { AlertTriangle, CheckCircle2, Download, FileUp } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { ErrorLine } from '../controls/ConfirmButton';\nimport { downloadCsv } from '../export/workItemsCsv';\nimport { refusalMessage } from '../product/refusal';\nimport { throwOnError } from '../utils/mutationResult';\nimport { SatisfactionLinkFields } from './SatisfactionLinkFields';\nimport {\n COMMENT_MAX,\n EXTERNAL_ID_MAX,\n MAX_IMPORT_ROWS,\n RESPONDENT_EMAIL_MAX,\n RESPONDENT_NAME_MAX,\n readImportRowErrors,\n type ImportRowError,\n} from './satisfaction';\nimport {\n IMPORT_COLUMNS,\n MAX_FILE_BYTES,\n cellIsTrue,\n REQUIRED_COLUMNS,\n parseImportFile,\n previewRows,\n templateCsv,\n type DefaultLinks,\n type FileProblem,\n type ImportColumn,\n type ImportRowInput,\n type ParsedImportFile,\n type PreviewRow,\n type RowProblem,\n} from './satisfactionCsv';\nimport {\n IMPORT_CUSTOMER_SATISFACTION_RESPONSES,\n SATISFACTION_QUERIES,\n type ImportCustomerSatisfactionResult,\n} from './satisfactionOperations';\n\n/**\n * Import customer answers from a CSV file (source IMPORT). The file is read in the browser: its rows are previewed with\n * every problem the service would refuse them for, and nothing is sent until every row is ready. The service then checks\n * every row again (and that each linked product, release and project exists) and imports all of them or none — a\n * refusal names each refused row by its number, shown on that row here. Re-importing a file is safe: a row whose\n * external id was imported before is skipped, never updated or duplicated, and the result says which.\n */\n\ntype Tr = ReturnType<typeof useTr>;\n\ninterface ImportData {\n planmagnetImportCustomerSatisfactionResponses: ImportCustomerSatisfactionResult;\n}\n\nconst EMPTY_LINKS: DefaultLinks = { productId: '', releaseId: '', projectId: '' };\n/** How many skipped external ids the result lists before \"and N more\". */\nconst SKIPPED_LISTED = 20;\n\nfunction fileProblemText(tr: Tr, problem: FileProblem): string {\n switch (problem.code) {\n case 'unterminatedQuote':\n return tr(\n 'planmagnet.satisfaction.import.file.unterminatedQuote',\n 'The file ends inside a quoted value — a closing \" is missing. Check the file and choose it again.'\n );\n case 'empty':\n return tr('planmagnet.satisfaction.import.file.empty', 'The file is empty.');\n case 'missingColumns':\n return tr(\n 'planmagnet.satisfaction.import.file.missingColumns',\n 'The header row is missing required columns: {{columns}}. Start from the template.',\n { columns: problem.columns.join(', ') }\n );\n case 'duplicateColumn':\n return tr(\n 'planmagnet.satisfaction.import.file.duplicateColumn',\n 'The header names the column “{{column}}” twice.',\n { column: problem.column }\n );\n case 'noRows':\n return tr(\n 'planmagnet.satisfaction.import.file.noRows',\n 'The file has a header but no rows to import.'\n );\n default:\n return tr(\n 'planmagnet.satisfaction.import.file.tooManyRows',\n 'The file has {{count}} rows; one import takes at most {{max}}. Split the file and import each part.',\n { count: problem.count, max: problem.max }\n );\n }\n}\n\nfunction rowProblemText(tr: Tr, problem: RowProblem): string {\n const p = problem.params;\n switch (problem.code) {\n case 'externalIdRequired':\n return tr(\n 'planmagnet.satisfaction.import.row.externalIdRequired',\n 'externalId is required — it is what makes importing the same file again add nothing new.'\n );\n case 'externalIdTooLong':\n return tr(\n 'planmagnet.satisfaction.import.row.externalIdTooLong',\n 'externalId can be at most {{max}} characters.',\n p\n );\n case 'externalIdDuplicate':\n return tr(\n 'planmagnet.satisfaction.import.row.externalIdDuplicate',\n 'externalId is already used by row {{row}} of this file.',\n p\n );\n case 'metricTypeRequired':\n return tr(\n 'planmagnet.satisfaction.import.row.metricTypeRequired',\n 'metricType is required: CSAT or NPS.'\n );\n case 'metricTypeInvalid':\n return tr(\n 'planmagnet.satisfaction.import.row.metricTypeInvalid',\n 'metricType must be CSAT or NPS.'\n );\n case 'scoreRequired':\n return tr('planmagnet.satisfaction.import.row.scoreRequired', 'score is required.');\n case 'scoreNotWholeNumber':\n return tr(\n 'planmagnet.satisfaction.import.row.scoreNotWholeNumber',\n 'score must be a whole number.'\n );\n case 'scoreOutOfRange':\n return tr(\n 'planmagnet.satisfaction.import.row.scoreOutOfRange',\n 'A {{metric}} score must be from {{min}} to {{max}}.',\n p\n );\n case 'respondedAtRequired':\n return tr(\n 'planmagnet.satisfaction.import.row.respondedAtRequired',\n 'respondedAt is required.'\n );\n case 'respondedAtFormat':\n return tr(\n 'planmagnet.satisfaction.import.row.respondedAtFormat',\n 'respondedAt must be a date (2026-09-20) or a date-time with its time zone (2026-09-20T14:30:00Z).'\n );\n case 'respondedAtInFuture':\n return tr(\n 'planmagnet.satisfaction.import.row.respondedAtInFuture',\n 'respondedAt cannot be in the future.'\n );\n case 'respondedAtTooOld':\n return tr(\n 'planmagnet.satisfaction.import.row.respondedAtTooOld',\n 'respondedAt cannot be earlier than {{min}}.',\n p\n );\n case 'anonymousInvalid':\n return tr(\n 'planmagnet.satisfaction.import.row.anonymousInvalid',\n 'isAnonymous must be true or false (or yes / no, 1 / 0, or empty).'\n );\n case 'anonymousWithIdentity':\n return tr(\n 'planmagnet.satisfaction.import.row.anonymousWithIdentity',\n 'An anonymous row cannot have a respondentName or respondentEmail.'\n );\n case 'respondentNameTooLong':\n return tr(\n 'planmagnet.satisfaction.import.row.respondentNameTooLong',\n 'respondentName can be at most {{max}} characters.',\n p\n );\n case 'respondentEmailInvalid':\n return tr(\n 'planmagnet.satisfaction.import.row.respondentEmailInvalid',\n 'respondentEmail must be a valid email address of at most {{max}} characters.',\n p\n );\n case 'commentTooLong':\n return tr(\n 'planmagnet.satisfaction.import.row.commentTooLong',\n 'comment can be at most {{max}} characters.',\n p\n );\n default:\n return tr(\n 'planmagnet.satisfaction.import.row.linkRequired',\n 'The row names no productId, releaseId or projectId — fill one in, or choose links for such rows above.'\n );\n }\n}\n\n/** One line of the column guide. */\nfunction columnHelp(tr: Tr, column: ImportColumn): string {\n switch (column) {\n case 'externalId':\n return tr(\n 'planmagnet.satisfaction.import.columns.externalId',\n 'The answer’s id in your survey tool, unique in the file (at most {{max}} characters). Rows imported before are skipped.',\n { max: EXTERNAL_ID_MAX }\n );\n case 'metricType':\n return tr('planmagnet.satisfaction.import.columns.metricType', 'CSAT or NPS.');\n case 'score':\n return tr(\n 'planmagnet.satisfaction.import.columns.score',\n 'A whole number: CSAT 1–5, NPS 0–10.'\n );\n case 'respondedAt':\n return tr(\n 'planmagnet.satisfaction.import.columns.respondedAt',\n 'When the customer answered: 2026-09-20, or 2026-09-20T14:30:00Z with a time zone. Not in the future.'\n );\n case 'productId':\n case 'releaseId':\n case 'projectId':\n return tr(\n 'planmagnet.satisfaction.import.columns.links',\n 'Optional, but each row needs at least one of productId, releaseId, projectId (or the links chosen below). An id is the last part of that page’s address.'\n );\n case 'isAnonymous':\n return tr(\n 'planmagnet.satisfaction.import.columns.isAnonymous',\n 'true or false (empty = false). An anonymous row stores no name or email.'\n );\n case 'respondentName':\n return tr(\n 'planmagnet.satisfaction.import.columns.respondentName',\n 'Optional, at most {{max}} characters.',\n {\n max: RESPONDENT_NAME_MAX,\n }\n );\n case 'respondentEmail':\n return tr(\n 'planmagnet.satisfaction.import.columns.respondentEmail',\n 'Optional, at most {{max}} characters.',\n {\n max: RESPONDENT_EMAIL_MAX,\n }\n );\n default:\n return tr(\n 'planmagnet.satisfaction.import.columns.comment',\n 'Optional, at most {{max}} characters.',\n {\n max: COMMENT_MAX,\n }\n );\n }\n}\n\nfunction RowLinks({ row }: { row: PreviewRow }) {\n const tr = useTr();\n if (row.usesDefaultLinks) {\n return (\n <Badge variant=\"outline\" className=\"text-xs\">\n {tr('planmagnet.satisfaction.import.preview.defaultLinks', 'Links chosen above')}\n </Badge>\n );\n }\n const parts: [string, string][] = [\n [tr('planmagnet.satisfaction.import.preview.product', 'Product'), row.cells.productId],\n [tr('planmagnet.satisfaction.import.preview.release', 'Release'), row.cells.releaseId],\n [tr('planmagnet.satisfaction.import.preview.project', 'Project'), row.cells.projectId],\n ];\n return (\n <div className=\"space-y-0.5 text-xs\">\n {parts\n .filter(([, id]) => id)\n .map(([label, id]) => (\n <p key={label} className=\"max-w-48 truncate\" title={id}>\n {label}: <span className=\"font-mono\">{id}</span>\n </p>\n ))}\n </div>\n );\n}\n\nexport function SatisfactionImportDialog({\n links,\n onImported,\n}: {\n /** Starting links for rows that name none — the page's product / release / project filters. */\n links: DefaultLinks;\n onImported: (result: ImportCustomerSatisfactionResult) => void;\n}) {\n const tr = useTr();\n const [open, setOpen] = useState(false);\n const [inputKey, setInputKey] = useState(0);\n const [fileName, setFileName] = useState<string | null>(null);\n const [parsed, setParsed] = useState<ParsedImportFile | null>(null);\n const [readError, setReadError] = useState<string | null>(null);\n const [defaults, setDefaults] = useState<DefaultLinks>(EMPTY_LINKS);\n const [serverRows, setServerRows] = useState<ImportRowError[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [result, setResult] = useState<ImportCustomerSatisfactionResult | null>(null);\n const [onlyProblems, setOnlyProblems] = useState(true);\n const [importRows, importState] = useMutation<ImportData>(\n IMPORT_CUSTOMER_SATISFACTION_RESPONSES,\n {\n refetchQueries: SATISFACTION_QUERIES,\n awaitRefetchQueries: true,\n }\n );\n\n const rows = useMemo(\n () => (parsed && !parsed.problem ? previewRows(parsed, defaults, new Date()) : []),\n [parsed, defaults]\n );\n const ready = rows.filter((r) => r.input !== null);\n const withProblems = rows.length - ready.length;\n const serverByRow = useMemo(() => {\n const map = new Map<number, ImportRowError[]>();\n for (const e of serverRows ?? []) map.set(e.row, [...(map.get(e.row) ?? []), e]);\n return map;\n }, [serverRows]);\n const canImport =\n rows.length > 0 && withProblems === 0 && !importState.loading && result === null;\n const isOk = (row: PreviewRow) => row.problems.length === 0 && !serverByRow.has(row.row);\n const failing = rows.filter((row) => !isOk(row)).length;\n // With problems on screen, the table starts with just the rows that have them — 3 refusals among 500 rows.\n const shownRows = failing > 0 && onlyProblems ? rows.filter((row) => !isOk(row)) : rows;\n\n const reset = () => {\n setOnlyProblems(true);\n setFileName(null);\n setParsed(null);\n setReadError(null);\n setServerRows(null);\n setError(null);\n setResult(null);\n setInputKey((k) => k + 1);\n };\n\n const onFile = async (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n setServerRows(null);\n setError(null);\n setResult(null);\n setParsed(null);\n setReadError(null);\n setOnlyProblems(true);\n setFileName(file?.name ?? null);\n if (!file) return;\n if (file.size > MAX_FILE_BYTES) {\n setReadError(\n tr(\n 'planmagnet.satisfaction.import.file.tooLarge',\n 'The file is larger than {{max}} MB. Split it and import each part.',\n { max: MAX_FILE_BYTES / (1024 * 1024) }\n )\n );\n return;\n }\n try {\n setParsed(parseImportFile(await file.text()));\n } catch {\n setReadError(\n tr(\n 'planmagnet.satisfaction.import.file.unreadable',\n 'The file could not be read. Save it as CSV (UTF-8) and try again.'\n )\n );\n }\n };\n\n const onImport = async () => {\n const input: ImportRowInput[] = ready.flatMap((r) => (r.input ? [r.input] : []));\n if (input.length !== rows.length) return;\n setError(null);\n setServerRows(null);\n try {\n const { data } = await throwOnError(importRows({ variables: { input: { rows: input } } }));\n const outcome = data?.planmagnetImportCustomerSatisfactionResponses;\n if (outcome) {\n setResult(outcome);\n onImported(outcome);\n }\n } catch (e) {\n setServerRows(readImportRowErrors(e));\n setError(\n refusalMessage(\n e,\n tr(\n 'planmagnet.satisfaction.import.errors.failed',\n 'The file could not be imported. Nothing was saved.'\n ),\n tr(\n 'planmagnet.satisfaction.errors.forbidden',\n 'Your role cannot change customer satisfaction responses in this workspace.'\n )\n )\n );\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) {\n reset();\n setDefaults(links);\n }\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"satisfaction-import-open\">\n <FileUp className=\"mr-1 h-4 w-4\" />\n {tr('planmagnet.satisfaction.actions.import', 'Import CSV')}\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-5xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {tr('planmagnet.satisfaction.import.title', 'Import customer responses')}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {tr(\n 'planmagnet.satisfaction.import.description',\n 'One row per answer, up to {{max}} rows. All or nothing: if any row is refused, nothing is saved. A row whose externalId was imported before is skipped, so importing the same file again adds nothing.',\n { max: MAX_IMPORT_ROWS }\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"min-w-0 space-y-4\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => downloadCsv('customer-satisfaction-template.csv', templateCsv())}\n data-testid=\"satisfaction-import-template\"\n >\n <Download className=\"mr-1 h-4 w-4\" />\n {tr('planmagnet.satisfaction.import.template', 'Download template')}\n </Button>\n <div className=\"min-w-64 flex-1\">\n <label htmlFor=\"satisfaction-import-file\" className=\"sr-only\">\n {tr('planmagnet.satisfaction.import.chooseFile', 'CSV file')}\n </label>\n <Input\n key={inputKey}\n id=\"satisfaction-import-file\"\n type=\"file\"\n accept=\".csv,text/csv\"\n onChange={(e) => void onFile(e)}\n data-testid=\"satisfaction-import-file\"\n />\n </div>\n </div>\n\n <details className=\"rounded-md border p-3 text-sm\">\n <summary className=\"cursor-pointer font-medium\">\n {tr('planmagnet.satisfaction.import.columns.title', 'Columns')}\n </summary>\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.satisfaction.import.columns.intro',\n 'The first row names the columns (any order; case, spaces and underscores do not matter). Comma, semicolon or tab separated, UTF-8. Required: {{required}}.',\n { required: REQUIRED_COLUMNS.join(', ') }\n )}\n </p>\n <dl className=\"mt-2 grid gap-x-4 gap-y-1 text-xs sm:grid-cols-[max-content_1fr]\">\n {IMPORT_COLUMNS.map((column) => (\n <div key={column} className=\"contents\">\n <dt className=\"font-mono\">{column}</dt>\n <dd className=\"text-muted-foreground\">{columnHelp(tr, column)}</dd>\n </div>\n ))}\n </dl>\n </details>\n\n <fieldset className=\"space-y-2 rounded-md border p-3\">\n <legend className=\"px-1 text-sm font-medium\">\n {tr('planmagnet.satisfaction.import.defaults.title', 'Links for rows that name none')}\n </legend>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.satisfaction.import.defaults.hint',\n 'A row with no productId, releaseId or projectId of its own is linked to what you choose here. A row with any link of its own keeps exactly its own.'\n )}\n </p>\n <SatisfactionLinkFields\n idPrefix=\"satisfaction-import\"\n columns\n value={defaults}\n onChange={(next) => {\n setDefaults(next);\n setServerRows(null);\n setError(null);\n }}\n />\n </fieldset>\n\n {readError && <ErrorLine message={readError} />}\n {parsed?.problem && <ErrorLine message={fileProblemText(tr, parsed.problem)} />}\n {parsed && parsed.ignoredColumns.length > 0 && (\n <p\n className=\"flex items-center gap-1.5 rounded-md bg-status-warning-bg-subtle px-2 py-1 text-xs text-foreground\"\n data-testid=\"satisfaction-import-ignored\"\n >\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" aria-hidden={true} />\n {tr(\n 'planmagnet.satisfaction.import.file.ignoredColumns',\n 'These columns are not imported: {{columns}}.',\n { columns: parsed.ignoredColumns.join(', ') }\n )}\n </p>\n )}\n\n {error && (\n <div\n role=\"alert\"\n className=\"rounded-md bg-status-error-bg-subtle p-3 text-sm text-status-error-text\"\n data-testid=\"satisfaction-import-error\"\n >\n {error}\n </div>\n )}\n\n {result && (\n <div\n role=\"status\"\n className=\"space-y-1 rounded-md bg-status-success-bg-subtle p-3 text-sm text-status-success-text\"\n data-testid=\"satisfaction-import-result\"\n >\n <p className=\"flex items-center gap-1.5 font-medium\">\n <CheckCircle2 className=\"h-4 w-4\" aria-hidden={true} />\n {result.createdCount === 1\n ? tr(\n 'planmagnet.satisfaction.import.result.createdOne',\n 'Imported 1 new response.'\n )\n : tr(\n 'planmagnet.satisfaction.import.result.created',\n 'Imported {{count}} new responses.',\n {\n count: result.createdCount,\n }\n )}\n </p>\n {result.skippedCount > 0 && (\n <p>\n {tr(\n 'planmagnet.satisfaction.import.result.skipped',\n 'Skipped {{count}} already imported (same externalId — never updated or duplicated): {{ids}}',\n {\n count: result.skippedCount,\n ids:\n result.skippedExternalIds.slice(0, SKIPPED_LISTED).join(', ') +\n (result.skippedExternalIds.length > SKIPPED_LISTED\n ? tr(\n 'planmagnet.satisfaction.import.result.more',\n ' and {{count}} more',\n {\n count: result.skippedExternalIds.length - SKIPPED_LISTED,\n }\n )\n : ''),\n }\n )}\n </p>\n )}\n </div>\n )}\n\n {rows.length > 0 && (\n <div className=\"space-y-2\">\n {failing > 0 && (\n <label className=\"flex items-center gap-2 text-xs\">\n <Checkbox\n checked={onlyProblems}\n onCheckedChange={(checked) => setOnlyProblems(checked === true)}\n data-testid=\"satisfaction-import-only-problems\"\n />\n {tr(\n 'planmagnet.satisfaction.import.preview.onlyProblems',\n 'Show only rows with problems ({{count}})',\n { count: failing }\n )}\n </label>\n )}\n <p className=\"text-sm\" data-testid=\"satisfaction-import-summary\">\n {tr(\n 'planmagnet.satisfaction.import.preview.summary',\n '{{file}} — rows: {{count}}; ready: {{ready}}; with problems: {{problems}}.',\n {\n file: fileName ?? '',\n count: rows.length,\n // A row the service refused is not ready, even though it passed the checks here.\n ready: rows.length - failing,\n problems: failing,\n }\n )}{' '}\n <span className=\"text-muted-foreground\">\n {tr(\n 'planmagnet.satisfaction.import.preview.numbering',\n 'Row 1 is the first row under the header.'\n )}\n </span>\n </p>\n <div className=\"max-h-96 overflow-auto rounded-md border\">\n <table className=\"w-full text-left text-xs\">\n <thead className=\"sticky top-0 bg-muted\">\n <tr>\n <th className=\"px-2 py-1.5 font-medium\">\n {tr('planmagnet.satisfaction.import.preview.row', 'Row')}\n </th>\n <th className=\"px-2 py-1.5 font-medium\">externalId</th>\n <th className=\"px-2 py-1.5 font-medium\">\n {tr('planmagnet.satisfaction.list.score', 'Score')}\n </th>\n <th className=\"px-2 py-1.5 font-medium\">\n {tr('planmagnet.satisfaction.list.answered', 'Answered')}\n </th>\n <th className=\"px-2 py-1.5 font-medium\">\n {tr('planmagnet.satisfaction.list.about', 'About')}\n </th>\n <th className=\"px-2 py-1.5 font-medium\">\n {tr('planmagnet.satisfaction.list.respondent', 'Respondent')}\n </th>\n <th className=\"px-2 py-1.5 font-medium\">\n {tr('planmagnet.satisfaction.import.preview.check', 'Check')}\n </th>\n </tr>\n </thead>\n <tbody>\n {shownRows.map((row) => {\n const server = serverByRow.get(row.row) ?? [];\n const ok = isOk(row);\n return (\n <tr\n key={row.row}\n className={ok ? 'border-t' : 'border-t bg-status-error-bg-subtle/40'}\n data-testid=\"satisfaction-import-row\"\n >\n <td className=\"px-2 py-1.5 align-top tabular-nums\">{row.row}</td>\n <td\n className=\"max-w-40 truncate px-2 py-1.5 align-top font-mono\"\n title={row.cells.externalId}\n >\n {row.cells.externalId}\n </td>\n <td className=\"whitespace-nowrap px-2 py-1.5 align-top\">\n {row.cells.metricType} {row.cells.score}\n </td>\n <td className=\"whitespace-nowrap px-2 py-1.5 align-top\">\n {row.cells.respondedAt}\n </td>\n <td className=\"px-2 py-1.5 align-top\">\n <RowLinks row={row} />\n </td>\n <td className=\"max-w-40 truncate px-2 py-1.5 align-top\">\n {cellIsTrue(row.cells.isAnonymous)\n ? tr('planmagnet.satisfaction.list.anonymous', 'Anonymous')\n : row.cells.respondentName || row.cells.respondentEmail}\n </td>\n <td className=\"px-2 py-1.5 align-top\">\n {ok ? (\n <span className=\"text-status-success-text\">\n {tr('planmagnet.satisfaction.import.preview.ready', 'Ready')}\n </span>\n ) : (\n <ul\n className=\"space-y-0.5 text-status-error-text\"\n data-testid=\"satisfaction-import-row-problems\"\n >\n {row.problems.map((problem, i) => (\n <li key={`c${i}`}>{rowProblemText(tr, problem)}</li>\n ))}\n {server.map((e, i) => (\n <li key={`s${i}`}>\n {e.field ? `${e.field}: ` : ''}\n {e.message}\n </li>\n ))}\n </ul>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n )}\n </div>\n\n <ResponsiveDialogFooter>\n {result ? (\n <Button onClick={() => setOpen(false)} data-testid=\"satisfaction-import-done\">\n {tr('planmagnet.satisfaction.import.done', 'Done')}\n </Button>\n ) : (\n <Button\n onClick={() => void onImport()}\n disabled={!canImport}\n data-testid=\"satisfaction-import-submit\"\n >\n {importState.loading\n ? tr('planmagnet.satisfaction.import.importing', 'Importing…')\n : rows.length === 1\n ? tr('planmagnet.satisfaction.import.submitOne', 'Import 1 row')\n : tr('planmagnet.satisfaction.import.submit', 'Import {{count}} rows', {\n count: rows.length,\n })}\n </Button>\n )}\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;AAmEA,IAAM,IAA4B;CAAE,WAAW;CAAI,WAAW;CAAI,WAAW;CAAI,EAE3E,IAAiB;AAEvB,SAAS,EAAgB,GAAQ,GAA8B;AAC7D,SAAQ,EAAQ,MAAhB;EACE,KAAK,oBACH,QAAO,EACL,yDACA,qGACD;EACH,KAAK,QACH,QAAO,EAAG,6CAA6C,qBAAqB;EAC9E,KAAK,iBACH,QAAO,EACL,sDACA,qFACA,EAAE,SAAS,EAAQ,QAAQ,KAAK,KAAK,EAAE,CACxC;EACH,KAAK,kBACH,QAAO,EACL,uDACA,mDACA,EAAE,QAAQ,EAAQ,QAAQ,CAC3B;EACH,KAAK,SACH,QAAO,EACL,8CACA,+CACD;EACH,QACE,QAAO,EACL,mDACA,uGACA;GAAE,OAAO,EAAQ;GAAO,KAAK,EAAQ;GAAK,CAC3C;;;AAIP,SAAS,EAAe,GAAQ,GAA6B;CAC3D,IAAM,IAAI,EAAQ;AAClB,SAAQ,EAAQ,MAAhB;EACE,KAAK,qBACH,QAAO,EACL,yDACA,2FACD;EACH,KAAK,oBACH,QAAO,EACL,wDACA,iDACA,EACD;EACH,KAAK,sBACH,QAAO,EACL,0DACA,2DACA,EACD;EACH,KAAK,qBACH,QAAO,EACL,yDACA,uCACD;EACH,KAAK,oBACH,QAAO,EACL,wDACA,kCACD;EACH,KAAK,gBACH,QAAO,EAAG,oDAAoD,qBAAqB;EACrF,KAAK,sBACH,QAAO,EACL,0DACA,gCACD;EACH,KAAK,kBACH,QAAO,EACL,sDACA,uDACA,EACD;EACH,KAAK,sBACH,QAAO,EACL,0DACA,2BACD;EACH,KAAK,oBACH,QAAO,EACL,wDACA,oGACD;EACH,KAAK,sBACH,QAAO,EACL,0DACA,uCACD;EACH,KAAK,oBACH,QAAO,EACL,wDACA,+CACA,EACD;EACH,KAAK,mBACH,QAAO,EACL,uDACA,oEACD;EACH,KAAK,wBACH,QAAO,EACL,4DACA,oEACD;EACH,KAAK,wBACH,QAAO,EACL,4DACA,qDACA,EACD;EACH,KAAK,yBACH,QAAO,EACL,6DACA,gFACA,EACD;EACH,KAAK,iBACH,QAAO,EACL,qDACA,8CACA,EACD;EACH,QACE,QAAO,EACL,mDACA,yGACD;;;AAKP,SAAS,EAAW,GAAQ,GAA8B;AACxD,SAAQ,GAAR;EACE,KAAK,aACH,QAAO,EACL,qDACA,2HACA,EAAE,KAAA,KAAsB,CACzB;EACH,KAAK,aACH,QAAO,EAAG,qDAAqD,eAAe;EAChF,KAAK,QACH,QAAO,EACL,gDACA,sCACD;EACH,KAAK,cACH,QAAO,EACL,sDACA,uGACD;EACH,KAAK;EACL,KAAK;EACL,KAAK,YACH,QAAO,EACL,gDACA,2JACD;EACH,KAAK,cACH,QAAO,EACL,sDACA,2EACD;EACH,KAAK,iBACH,QAAO,EACL,yDACA,yCACA,EACE,KAAA,KACD,CACF;EACH,KAAK,kBACH,QAAO,EACL,0DACA,yCACA,EACE,KAAA,KACD,CACF;EACH,QACE,QAAO,EACL,kDACA,yCACA,EACE,KAAK,GACN,CACF;;;AAIP,SAAS,EAAS,EAAE,UAA4B;CAC9C,IAAM,IAAK,GAAO;AAalB,QAZI,EAAI,mBAEJ,kBAAC,GAAD;EAAO,SAAQ;EAAU,WAAU;YAChC,EAAG,uDAAuD,qBAAqB;EAC1E,CAAA,GASV,kBAAC,OAAD;EAAK,WAAU;YANiB;GAChC,CAAC,EAAG,kDAAkD,UAAU,EAAE,EAAI,MAAM,UAAU;GACtF,CAAC,EAAG,kDAAkD,UAAU,EAAE,EAAI,MAAM,UAAU;GACtF,CAAC,EAAG,kDAAkD,UAAU,EAAE,EAAI,MAAM,UAAU;GACvF,CAIM,QAAQ,GAAG,OAAQ,EAAG,CACtB,KAAK,CAAC,GAAO,OACZ,kBAAC,KAAD;GAAe,WAAU;GAAoB,OAAO;aAApD;IACG;IAAM;IAAE,kBAAC,QAAD;KAAM,WAAU;eAAa;KAAU,CAAA;IAC9C;KAFI,EAEJ,CACJ;EACA,CAAA;;AAIV,SAAgB,EAAyB,EACvC,UACA,iBAKC;CACD,IAAM,IAAK,GAAO,EACZ,CAAC,GAAM,KAAW,EAAS,GAAM,EACjC,CAAC,GAAU,KAAe,EAAS,EAAE,EACrC,CAAC,GAAU,KAAe,EAAwB,KAAK,EACvD,CAAC,GAAQ,KAAa,EAAkC,KAAK,EAC7D,CAAC,GAAW,KAAgB,EAAwB,KAAK,EACzD,CAAC,GAAU,KAAe,EAAuB,EAAY,EAC7D,CAAC,GAAY,KAAiB,EAAkC,KAAK,EACrE,CAAC,GAAO,KAAY,EAAwB,KAAK,EACjD,CAAC,GAAQ,KAAa,EAAkD,KAAK,EAC7E,CAAC,GAAc,KAAmB,EAAS,GAAK,EAChD,CAAC,IAAY,KAAe,GAChC,GACA;EACE,gBAAgB;EAChB,qBAAqB;EACtB,CACF,EAEK,IAAO,QACJ,KAAU,CAAC,EAAO,UAAU,EAAY,GAAQ,mBAAU,IAAI,MAAM,CAAC,GAAG,EAAE,EACjF,CAAC,GAAQ,EAAS,CACnB,EACK,IAAQ,EAAK,QAAQ,MAAM,EAAE,UAAU,KAAK,EAC5C,KAAe,EAAK,SAAS,EAAM,QACnC,IAAc,QAAc;EAChC,IAAM,oBAAM,IAAI,KAA+B;AAC/C,OAAK,IAAM,KAAK,KAAc,EAAE,CAAE,GAAI,IAAI,EAAE,KAAK,CAAC,GAAI,EAAI,IAAI,EAAE,IAAI,IAAI,EAAE,EAAG,EAAE,CAAC;AAChF,SAAO;IACN,CAAC,EAAW,CAAC,EACV,KACJ,EAAK,SAAS,KAAK,OAAiB,KAAK,CAAC,EAAY,WAAW,MAAW,MACxE,KAAQ,MAAoB,EAAI,SAAS,WAAW,KAAK,CAAC,EAAY,IAAI,EAAI,IAAI,EAClF,IAAU,EAAK,QAAQ,MAAQ,CAAC,EAAK,EAAI,CAAC,CAAC,QAE3C,KAAY,IAAU,KAAK,IAAe,EAAK,QAAQ,MAAQ,CAAC,EAAK,EAAI,CAAC,GAAG,GAE7E,WAAc;AAQlB,EAPA,EAAgB,GAAK,EACrB,EAAY,KAAK,EACjB,EAAU,KAAK,EACf,EAAa,KAAK,EAClB,EAAc,KAAK,EACnB,EAAS,KAAK,EACd,EAAU,KAAK,EACf,GAAa,MAAM,IAAI,EAAE;IAGrB,KAAS,OAAO,MAAyC;EAC7D,IAAM,IAAO,EAAM,OAAO,QAAQ;AAClC,QAAc,KAAK,EACnB,EAAS,KAAK,EACd,EAAU,KAAK,EACf,EAAU,KAAK,EACf,EAAa,KAAK,EAClB,EAAgB,GAAK,EACrB,EAAY,GAAM,QAAQ,KAAK,EAC1B,GACL;OAAI,EAAK,OAAA,SAAuB;AAC9B,MACE,EACE,gDACA,sEACA,EAAE,KAAK,KAAkB,OAAO,OAAO,CACxC,CACF;AACD;;AAEF,OAAI;AACF,MAAU,EAAgB,MAAM,EAAK,MAAM,CAAC,CAAC;WACvC;AACN,MACE,EACE,kDACA,oEACD,CACF;;;IAIC,KAAW,YAAY;EAC3B,IAAM,IAA0B,EAAM,SAAS,MAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,EAAE,CAAE;AAC5E,QAAM,WAAW,EAAK,QAE1B;GADA,EAAS,KAAK,EACd,EAAc,KAAK;AACnB,OAAI;IACF,IAAM,EAAE,YAAS,MAAM,EAAa,GAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAO,EAAE,EAAE,CAAC,CAAC,EACpF,IAAU,GAAM;AACtB,IAAI,MACF,EAAU,EAAQ,EAClB,EAAW,EAAQ;YAEd,GAAG;AAEV,IADA,EAAc,EAAoB,EAAE,CAAC,EACrC,EACE,GACE,GACA,EACE,gDACA,qDACD,EACD,EACE,4CACA,6EACD,CACF,CACF;;;;AAIL,QACE,kBAAC,IAAD;EACQ;EACN,eAAe,MAAS;AAEtB,GADA,EAAQ,EAAK,EACT,MACF,IAAO,EACP,EAAY,EAAM;;YANxB,CAUE,kBAAC,GAAD;GAAyB,SAAA;aACvB,kBAAC,GAAD;IAAQ,MAAK;IAAK,SAAQ;IAAU,eAAY;cAAhD,CACE,kBAAC,IAAD,EAAQ,WAAU,gBAAiB,CAAA,EAClC,EAAG,0CAA0C,aAAa,CACpD;;GACe,CAAA,EAC1B,kBAAC,IAAD;GAAyB,WAAU;aAAnC;IACE,kBAAC,IAAD,EAAA,UAAA,CACE,kBAAC,IAAD,EAAA,UACG,EAAG,wCAAwC,4BAA4B,EAClD,CAAA,EACxB,kBAAC,IAAD,EAAA,UACG,EACC,8CACA,0MACA,EAAE,KAAA,KAAsB,CACzB,EAC2B,CAAA,CACP,EAAA,CAAA;IAEzB,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,MAAK;QACL,SAAQ;QACR,eAAe,GAAY,sCAAsC,GAAa,CAAC;QAC/E,eAAY;kBAJd,CAME,kBAAC,IAAD,EAAU,WAAU,gBAAiB,CAAA,EACpC,EAAG,2CAA2C,oBAAoB,CAC5D;WACT,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,SAAD;SAAO,SAAQ;SAA2B,WAAU;mBACjD,EAAG,6CAA6C,WAAW;SACtD,CAAA,EACR,kBAAC,IAAD;SAEE,IAAG;SACH,MAAK;SACL,QAAO;SACP,WAAW,MAAM,KAAK,GAAO,EAAE;SAC/B,eAAY;SACZ,EANK,EAML,CACE;UACF;;MAEN,kBAAC,WAAD;OAAS,WAAU;iBAAnB;QACE,kBAAC,WAAD;SAAS,WAAU;mBAChB,EAAG,gDAAgD,UAAU;SACtD,CAAA;QACV,kBAAC,KAAD;SAAG,WAAU;mBACV,EACC,gDACA,8JACA,EAAE,UAAU,EAAiB,KAAK,KAAK,EAAE,CAC1C;SACC,CAAA;QACJ,kBAAC,MAAD;SAAI,WAAU;mBACX,EAAe,KAAK,MACnB,kBAAC,OAAD;UAAkB,WAAU;oBAA5B,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAa;WAAY,CAAA,EACvC,kBAAC,MAAD;WAAI,WAAU;qBAAyB,EAAW,GAAI,EAAO;WAAM,CAAA,CAC/D;YAHI,EAGJ,CACN;SACC,CAAA;QACG;;MAEV,kBAAC,YAAD;OAAU,WAAU;iBAApB;QACE,kBAAC,UAAD;SAAQ,WAAU;mBACf,EAAG,iDAAiD,gCAAgC;SAC9E,CAAA;QACT,kBAAC,KAAD;SAAG,WAAU;mBACV,EACC,gDACA,sJACD;SACC,CAAA;QACJ,kBAAC,IAAD;SACE,UAAS;SACT,SAAA;SACA,OAAO;SACP,WAAW,MAAS;AAGlB,UAFA,EAAY,EAAK,EACjB,EAAc,KAAK,EACnB,EAAS,KAAK;;SAEhB,CAAA;QACO;;MAEV,KAAa,kBAAC,GAAD,EAAW,SAAS,GAAa,CAAA;MAC9C,GAAQ,WAAW,kBAAC,GAAD,EAAW,SAAS,EAAgB,GAAI,EAAO,QAAQ,EAAI,CAAA;MAC9E,KAAU,EAAO,eAAe,SAAS,KACxC,kBAAC,KAAD;OACE,WAAU;OACV,eAAY;iBAFd,CAIE,kBAAC,GAAD;QAAe,WAAU;QAAuB,eAAa;QAAQ,CAAA,EACpE,EACC,sDACA,gDACA,EAAE,SAAS,EAAO,eAAe,KAAK,KAAK,EAAE,CAC9C,CACC;;MAGL,KACC,kBAAC,OAAD;OACE,MAAK;OACL,WAAU;OACV,eAAY;iBAEX;OACG,CAAA;MAGP,KACC,kBAAC,OAAD;OACE,MAAK;OACL,WAAU;OACV,eAAY;iBAHd,CAKE,kBAAC,KAAD;QAAG,WAAU;kBAAb,CACE,kBAAC,IAAD;SAAc,WAAU;SAAU,eAAa;SAAQ,CAAA,EACtD,EAAO,iBAAiB,IACrB,EACE,oDACA,2BACD,GACD,EACE,iDACA,qCACA,EACE,OAAO,EAAO,cACf,CACF,CACH;WACH,EAAO,eAAe,KACrB,kBAAC,KAAD,EAAA,UACG,EACC,iDACA,+FACA;QACE,OAAO,EAAO;QACd,KACE,EAAO,mBAAmB,MAAM,GAAG,EAAe,CAAC,KAAK,KAAK,IAC5D,EAAO,mBAAmB,SAAS,IAChC,EACE,8CACA,uBACA,EACE,OAAO,EAAO,mBAAmB,SAAS,GAC3C,CACF,GACD;QACP,CACF,EACC,CAAA,CAEF;;MAGP,EAAK,SAAS,KACb,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACG,IAAU,KACT,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,kBAAC,IAAD;UACE,SAAS;UACT,kBAAkB,MAAY,EAAgB,MAAY,GAAK;UAC/D,eAAY;UACZ,CAAA,EACD,EACC,uDACA,4CACA,EAAE,OAAO,GAAS,CACnB,CACK;;QAEV,kBAAC,KAAD;SAAG,WAAU;SAAU,eAAY;mBAAnC;UACG,EACC,kDACA,8EACA;WACE,MAAM,KAAY;WAClB,OAAO,EAAK;WAEZ,OAAO,EAAK,SAAS;WACrB,UAAU;WACX,CACF;UAAE;UACH,kBAAC,QAAD;WAAM,WAAU;qBACb,EACC,oDACA,2CACD;WACI,CAAA;UACL;;QACJ,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,SAAD;UAAO,WAAU;oBAAjB,CACE,kBAAC,SAAD;WAAO,WAAU;qBACf,kBAAC,MAAD,EAAA,UAAA;YACE,kBAAC,MAAD;aAAI,WAAU;uBACX,EAAG,8CAA8C,MAAM;aACrD,CAAA;YACL,kBAAC,MAAD;aAAI,WAAU;uBAA0B;aAAe,CAAA;YACvD,kBAAC,MAAD;aAAI,WAAU;uBACX,EAAG,sCAAsC,QAAQ;aAC/C,CAAA;YACL,kBAAC,MAAD;aAAI,WAAU;uBACX,EAAG,yCAAyC,WAAW;aACrD,CAAA;YACL,kBAAC,MAAD;aAAI,WAAU;uBACX,EAAG,sCAAsC,QAAQ;aAC/C,CAAA;YACL,kBAAC,MAAD;aAAI,WAAU;uBACX,EAAG,2CAA2C,aAAa;aACzD,CAAA;YACL,kBAAC,MAAD;aAAI,WAAU;uBACX,EAAG,gDAAgD,QAAQ;aACzD,CAAA;YACF,EAAA,CAAA;WACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,GAAU,KAAK,MAAQ;WACtB,IAAM,IAAS,EAAY,IAAI,EAAI,IAAI,IAAI,EAAE,EACvC,IAAK,EAAK,EAAI;AACpB,kBACE,kBAAC,MAAD;YAEE,WAAW,IAAK,aAAa;YAC7B,eAAY;sBAHd;aAKE,kBAAC,MAAD;cAAI,WAAU;wBAAsC,EAAI;cAAS,CAAA;aACjE,kBAAC,MAAD;cACE,WAAU;cACV,OAAO,EAAI,MAAM;wBAEhB,EAAI,MAAM;cACR,CAAA;aACL,kBAAC,MAAD;cAAI,WAAU;wBAAd;eACG,EAAI,MAAM;eAAW;eAAE,EAAI,MAAM;eAC/B;;aACL,kBAAC,MAAD;cAAI,WAAU;wBACX,EAAI,MAAM;cACR,CAAA;aACL,kBAAC,MAAD;cAAI,WAAU;wBACZ,kBAAC,GAAD,EAAe,QAAO,CAAA;cACnB,CAAA;aACL,kBAAC,MAAD;cAAI,WAAU;wBACX,EAAW,EAAI,MAAM,YAAY,GAC9B,EAAG,0CAA0C,YAAY,GACzD,EAAI,MAAM,kBAAkB,EAAI,MAAM;cACvC,CAAA;aACL,kBAAC,MAAD;cAAI,WAAU;wBACX,IACC,kBAAC,QAAD;eAAM,WAAU;yBACb,EAAG,gDAAgD,QAAQ;eACvD,CAAA,GAEP,kBAAC,MAAD;eACE,WAAU;eACV,eAAY;yBAFd,CAIG,EAAI,SAAS,KAAK,GAAS,MAC1B,kBAAC,MAAD,EAAA,UAAmB,EAAe,GAAI,EAAQ,EAAM,EAA3C,IAAI,IAAuC,CACpD,EACD,EAAO,KAAK,GAAG,MACd,kBAAC,MAAD,EAAA,UAAA,CACG,EAAE,QAAQ,GAAG,EAAE,MAAM,MAAM,IAC3B,EAAE,QACA,EAAA,EAHI,IAAI,IAGR,CACL,CACC;;cAEJ,CAAA;aACF;cA/CE,EAAI,IA+CN;YAEP,EACI,CAAA,CACF;;SACJ,CAAA;QACF;;MAEJ;;IAEN,kBAAC,IAAD,EAAA,UACG,IACC,kBAAC,GAAD;KAAQ,eAAe,EAAQ,GAAM;KAAE,eAAY;eAChD,EAAG,uCAAuC,OAAO;KAC3C,CAAA,GAET,kBAAC,GAAD;KACE,eAAe,KAAK,IAAU;KAC9B,UAAU,CAAC;KACX,eAAY;eAEX,EAAY,UACT,EAAG,4CAA4C,aAAa,GAC5D,EAAK,WAAW,IACd,EAAG,4CAA4C,eAAe,GAC9D,EAAG,yCAAyC,yBAAyB,EACnE,OAAO,EAAK,QACb,CAAC;KACD,CAAA,EAEY,CAAA;IACD;KACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionLinkFields.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/SatisfactionLinkFields.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,OAAe,EACf,KAAU,GACX,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;IACpC,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;CACzD,2CAuDA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionLinkFields.js","names":[],"sources":["../../../src/planmagnet/satisfaction/SatisfactionLinkFields.tsx"],"sourcesContent":["import { useTr } from '../../shared/hooks/useTr';\nimport { ProductSelect, ProjectSelect } from '../controls/Pickers';\nimport { cn } from '../utils/cn';\nimport {\n SatisfactionReleaseSelect,\n useSatisfactionReleaseOptions,\n} from './SatisfactionReleaseSelect';\nimport type { FormLinks } from './satisfactionForm';\n\n/**\n * What a response is about: a product, a release and/or a project. A release must belong to the product named with it\n * (or to no product) — the release list offers only those, and choosing another product drops a release of the old\n * one instead of leaving a pair the service refuses.\n */\nexport function SatisfactionLinkFields({\n idPrefix,\n value,\n onChange,\n columns = false,\n notes = {},\n}: {\n idPrefix: string;\n value: FormLinks;\n onChange: (next: FormLinks) => void;\n /** Side by side (the import dialog) rather than stacked (the response form). */\n columns?: boolean;\n /** A line under a field, e.g. that its linked record was deleted. */\n notes?: Partial<Record<keyof FormLinks, string | null>>;\n}) {\n const tr = useTr();\n const { releases } = useSatisfactionReleaseOptions();\n\n const onProduct = (productId: string) => {\n const release = releases.find((r) => r.id === value.releaseId);\n const keepRelease =\n !release || !release.productId || !productId || release.productId === productId;\n onChange({ ...value, productId, releaseId: keepRelease ? value.releaseId : '' });\n };\n\n const note = (key: keyof FormLinks) =>\n notes[key] ? <p className=\"text-xs text-muted-foreground\">{notes[key]}</p> : null;\n\n return (\n <div className={cn('gap-2', columns ? 'grid sm:grid-cols-3' : 'space-y-2')}>\n <div>\n <label htmlFor={`${idPrefix}-product`} className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.satisfaction.form.product', 'Product')}\n </label>\n <ProductSelect\n id={`${idPrefix}-product`}\n value={value.productId}\n noneLabel={tr('planmagnet.satisfaction.form.noProduct', 'No product')}\n onChange={onProduct}\n />\n {note('productId')}\n </div>\n <div>\n <label htmlFor={`${idPrefix}-release`} className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.satisfaction.form.release', 'Release')}\n </label>\n <SatisfactionReleaseSelect\n id={`${idPrefix}-release`}\n value={value.releaseId}\n productId={value.productId}\n noneLabel={tr('planmagnet.satisfaction.form.noRelease', 'No release')}\n onChange={(releaseId) => onChange({ ...value, releaseId })}\n />\n {note('releaseId')}\n </div>\n <div>\n <label htmlFor={`${idPrefix}-project`} className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.satisfaction.form.project', 'Project')}\n </label>\n <ProjectSelect\n id={`${idPrefix}-project`}\n value={value.projectId}\n noneLabel={tr('planmagnet.satisfaction.form.noProject', 'No project')}\n onChange={(projectId) => onChange({ ...value, projectId })}\n />\n {note('projectId')}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAcA,SAAgB,EAAuB,EACrC,aACA,UACA,aACA,aAAU,IACV,WAAQ,EAAE,IAST;CACD,IAAM,IAAK,GAAO,EACZ,EAAE,gBAAa,GAA+B,EAE9C,KAAa,MAAsB;EACvC,IAAM,IAAU,EAAS,MAAM,MAAM,EAAE,OAAO,EAAM,UAAU,EACxD,IACJ,CAAC,KAAW,CAAC,EAAQ,aAAa,CAAC,KAAa,EAAQ,cAAc;AACxE,IAAS;GAAE,GAAG;GAAO;GAAW,WAAW,IAAc,EAAM,YAAY;GAAI,CAAC;IAG5E,KAAQ,MACZ,EAAM,KAAO,kBAAC,KAAD;EAAG,WAAU;YAAiC,EAAM;EAAS,CAAA,GAAG;AAE/E,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,SAAS,IAAU,wBAAwB,YAAY;YAA1E;GACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,SAAD;KAAO,SAAS,GAAG,EAAS;KAAW,WAAU;eAC9C,EAAG,wCAAwC,UAAU;KAChD,CAAA;IACR,kBAAC,GAAD;KACE,IAAI,GAAG,EAAS;KAChB,OAAO,EAAM;KACb,WAAW,EAAG,0CAA0C,aAAa;KACrE,UAAU;KACV,CAAA;IACD,EAAK,YAAY;IACd,EAAA,CAAA;GACN,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,SAAD;KAAO,SAAS,GAAG,EAAS;KAAW,WAAU;eAC9C,EAAG,wCAAwC,UAAU;KAChD,CAAA;IACR,kBAAC,GAAD;KACE,IAAI,GAAG,EAAS;KAChB,OAAO,EAAM;KACb,WAAW,EAAM;KACjB,WAAW,EAAG,0CAA0C,aAAa;KACrE,WAAW,MAAc,EAAS;MAAE,GAAG;MAAO;MAAW,CAAC;KAC1D,CAAA;IACD,EAAK,YAAY;IACd,EAAA,CAAA;GACN,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,SAAD;KAAO,SAAS,GAAG,EAAS;KAAW,WAAU;eAC9C,EAAG,wCAAwC,UAAU;KAChD,CAAA;IACR,kBAAC,GAAD;KACE,IAAI,GAAG,EAAS;KAChB,OAAO,EAAM;KACb,WAAW,EAAG,0CAA0C,aAAa;KACrE,WAAW,MAAc,EAAS;MAAE,GAAG;MAAO;MAAW,CAAC;KAC1D,CAAA;IACD,EAAK,YAAY;IACd,EAAA,CAAA;GACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionReleaseSelect.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/SatisfactionReleaseSelect.tsx"],"names":[],"mappings":"AAgBA,wEAAwE;AACxE,wBAAgB,6BAA6B;;;;;EAwC5C;AAED,kGAAkG;AAClG,wBAAgB,yBAAyB,CAAC,EACxC,EAAE,EACF,KAAK,EACL,QAAQ,EACR,SAAS,EACT,SAAS,EACT,QAAgB,EAChB,OAAe,GAChB,EAAE;IACD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,2CA8CA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionReleaseSelect.js","names":[],"sources":["../../../src/planmagnet/satisfaction/SatisfactionReleaseSelect.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport { useQuery } from '@apollo/client/react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { releaseLabel, releasesForProduct } from './satisfaction';\nimport {\n CUSTOMER_SATISFACTION_RELEASE_OPTIONS,\n type CustomerSatisfactionReleaseOptionsData,\n} from './satisfactionOperations';\n\n/** Releases are read page by page up to this many, so the picker never silently stops at the first 100. */\nconst MAX_RELEASE_OPTIONS = 500;\n\nconst selectClass =\n 'w-full rounded-md border border-input bg-background px-3 py-2 text-sm disabled:opacity-60';\n\n/** Every release in the workspace (up to the cap), with its product. */\nexport function useSatisfactionReleaseOptions() {\n const { workspaceId } = usePlanMagnet();\n const { data, loading, error, fetchMore } = useQuery<CustomerSatisfactionReleaseOptionsData>(\n CUSTOMER_SATISFACTION_RELEASE_OPTIONS,\n {\n variables: { workspaceId: workspaceId ?? '', pagination: { first: 100 } },\n skip: !workspaceId,\n }\n );\n const loaded = data?.planmagnetReleases.items ?? [];\n const hasNextPage = data?.planmagnetReleases.pageInfo.hasNextPage ?? false;\n const endCursor = data?.planmagnetReleases.pageInfo.endCursor ?? null;\n useEffect(() => {\n if (!hasNextPage || !endCursor || loaded.length >= MAX_RELEASE_OPTIONS) return;\n fetchMore({\n variables: { pagination: { first: 100, after: endCursor } },\n // Several pickers share this query, and each one's effect asks for the next page: merging by id keeps a page\n // fetched twice from listing its releases twice.\n updateQuery: (prev, { fetchMoreResult }) => {\n const seen = new Set(prev.planmagnetReleases.items.map((r) => r.id));\n return {\n planmagnetReleases: {\n ...fetchMoreResult.planmagnetReleases,\n items: [\n ...prev.planmagnetReleases.items,\n ...fetchMoreResult.planmagnetReleases.items.filter((r) => !seen.has(r.id)),\n ],\n },\n };\n },\n }).catch(() => {\n // A failed extra page leaves the releases already loaded usable.\n });\n }, [hasNextPage, endCursor, loaded.length, fetchMore]);\n return {\n releases: loaded,\n loading: loading && !data,\n error,\n truncated: hasNextPage && loaded.length >= MAX_RELEASE_OPTIONS,\n };\n}\n\n/** A release select, narrowed to what `productId` allows. '' means \"no release\" (`noneLabel`). */\nexport function SatisfactionReleaseSelect({\n id,\n value,\n onChange,\n productId,\n noneLabel,\n disabled = false,\n invalid = false,\n}: {\n id?: string;\n value: string;\n onChange: (releaseId: string) => void;\n productId: string;\n noneLabel: string;\n disabled?: boolean;\n invalid?: boolean;\n}) {\n const tr = useTr();\n const { releases, loading, error, truncated } = useSatisfactionReleaseOptions();\n const options = releasesForProduct(releases, productId);\n // A chosen release the narrowed list no longer holds (the product changed) stays visible rather than blank.\n const current =\n value && !options.some((r) => r.id === value)\n ? releases.find((r) => r.id === value)\n : undefined;\n return (\n <select\n id={id}\n className={selectClass}\n value={value}\n disabled={disabled}\n aria-invalid={invalid || undefined}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">{noneLabel}</option>\n {current && <option value={current.id}>{releaseLabel(current)}</option>}\n {options.map((r) => (\n <option key={r.id} value={r.id}>\n {releaseLabel(r)}\n </option>\n ))}\n {loading && (\n <option value=\"\" disabled>\n {tr('planmagnet.satisfaction.releases.loading', 'Loading releases…')}\n </option>\n )}\n {error && !loading && releases.length === 0 && (\n <option value=\"\" disabled>\n {tr('planmagnet.satisfaction.releases.error', 'Releases could not be loaded')}\n </option>\n )}\n {truncated && (\n <option value=\"\" disabled>\n {tr(\n 'planmagnet.satisfaction.releases.truncated',\n 'Only the first {{max}} releases are listed',\n { max: MAX_RELEASE_OPTIONS }\n )}\n </option>\n )}\n </select>\n );\n}\n"],"mappings":";;;;;;;;AAWA,IAAM,IAAsB,KAEtB,IACJ;AAGF,SAAgB,IAAgC;CAC9C,IAAM,EAAE,mBAAgB,GAAe,EACjC,EAAE,SAAM,YAAS,UAAO,iBAAc,EAC1C,GACA;EACE,WAAW;GAAE,aAAa,KAAe;GAAI,YAAY,EAAE,OAAO,KAAK;GAAE;EACzE,MAAM,CAAC;EACR,CACF,EACK,IAAS,GAAM,mBAAmB,SAAS,EAAE,EAC7C,IAAc,GAAM,mBAAmB,SAAS,eAAe,IAC/D,IAAY,GAAM,mBAAmB,SAAS,aAAa;AAuBjE,QAtBA,QAAgB;AACV,GAAC,KAAe,CAAC,KAAa,EAAO,UAAU,KACnD,EAAU;GACR,WAAW,EAAE,YAAY;IAAE,OAAO;IAAK,OAAO;IAAW,EAAE;GAG3D,cAAc,GAAM,EAAE,yBAAsB;IAC1C,IAAM,IAAO,IAAI,IAAI,EAAK,mBAAmB,MAAM,KAAK,MAAM,EAAE,GAAG,CAAC;AACpE,WAAO,EACL,oBAAoB;KAClB,GAAG,EAAgB;KACnB,OAAO,CACL,GAAG,EAAK,mBAAmB,OAC3B,GAAG,EAAgB,mBAAmB,MAAM,QAAQ,MAAM,CAAC,EAAK,IAAI,EAAE,GAAG,CAAC,CAC3E;KACF,EACF;;GAEJ,CAAC,CAAC,YAAY,GAEb;IACD;EAAC;EAAa;EAAW,EAAO;EAAQ;EAAU,CAAC,EAC/C;EACL,UAAU;EACV,SAAS,KAAW,CAAC;EACrB;EACA,WAAW,KAAe,EAAO,UAAU;EAC5C;;AAIH,SAAgB,EAA0B,EACxC,OACA,UACA,aACA,cACA,cACA,cAAW,IACX,aAAU,MAST;CACD,IAAM,IAAK,GAAO,EACZ,EAAE,aAAU,YAAS,UAAO,iBAAc,GAA+B,EACzE,IAAU,EAAmB,GAAU,EAAU,EAEjD,IACJ,KAAS,CAAC,EAAQ,MAAM,MAAM,EAAE,OAAO,EAAM,GACzC,EAAS,MAAM,MAAM,EAAE,OAAO,EAAM,GACpC,KAAA;AACN,QACE,kBAAC,UAAD;EACM;EACJ,WAAW;EACJ;EACG;EACV,gBAAc,KAAW,KAAA;EACzB,WAAW,MAAM,EAAS,EAAE,OAAO,MAAM;YAN3C;GAQE,kBAAC,UAAD;IAAQ,OAAM;cAAI;IAAmB,CAAA;GACpC,KAAW,kBAAC,UAAD;IAAQ,OAAO,EAAQ;cAAK,EAAa,EAAQ;IAAU,CAAA;GACtE,EAAQ,KAAK,MACZ,kBAAC,UAAD;IAAmB,OAAO,EAAE;cACzB,EAAa,EAAE;IACT,EAFI,EAAE,GAEN,CACT;GACD,KACC,kBAAC,UAAD;IAAQ,OAAM;IAAG,UAAA;cACd,EAAG,4CAA4C,oBAAoB;IAC7D,CAAA;GAEV,KAAS,CAAC,KAAW,EAAS,WAAW,KACxC,kBAAC,UAAD;IAAQ,OAAM;IAAG,UAAA;cACd,EAAG,0CAA0C,+BAA+B;IACtE,CAAA;GAEV,KACC,kBAAC,UAAD;IAAQ,OAAM;IAAG,UAAA;cACd,EACC,8CACA,8CACA,EAAE,KAAK,GAAqB,CAC7B;IACM,CAAA;GAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionResponseDialog.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/SatisfactionResponseDialog.tsx"],"names":[],"mappings":"AAoCA,OAAO,EAQL,KAAK,SAAS,EAGf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAIL,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAkGlC,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,EACR,KAAK,EACL,OAAO,EACP,OAAO,GACR,EAAE;IACD,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,wFAAwF;IACxF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC;IAChD,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,2CA2YA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionResponseDialog.js","names":[],"sources":["../../../src/planmagnet/satisfaction/SatisfactionResponseDialog.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Button,\n Checkbox,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { AlertTriangle, Pencil, Plus } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { ErrorLine } from '../controls/ConfirmButton';\nimport { refusalMessage } from '../product/refusal';\nimport { throwOnError } from '../utils/mutationResult';\nimport { cn } from '../utils/cn';\nimport { SatisfactionLinkFields } from './SatisfactionLinkFields';\nimport {\n COMMENT_MAX,\n EXTERNAL_ID_MAX,\n METRIC_TYPES,\n RESPONDED_AT_EARLIEST,\n RESPONDENT_EMAIL_MAX,\n RESPONDENT_NAME_MAX,\n SCORE_SCALE,\n errorCode,\n errorField,\n formatUtcDay,\n localDay,\n scaleValues,\n} from './satisfaction';\nimport {\n createInput,\n formProblems,\n formValuesOf,\n newFormValues,\n updateInput,\n withMetricType,\n type FormField,\n type FormLinks,\n type FormProblem,\n type ResponseFormValues,\n} from './satisfactionForm';\nimport {\n CREATE_CUSTOMER_SATISFACTION_RESPONSE,\n SATISFACTION_QUERIES,\n UPDATE_CUSTOMER_SATISFACTION_RESPONSE,\n type SatisfactionResponse,\n} from './satisfactionOperations';\n\n/**\n * Add one customer's answer (source MANUAL), or edit one. Entered by a team member on the customer's behalf: the score\n * on its metric's own scale, the day they answered, what it is about (a product, a release and/or a project — at least\n * one), and who answered — or nobody, for an anonymous response, which stores no name or email at all.\n *\n * An edit sends only what changed. Every refusal is the service's own sentence, shown in the dialog; a field the service\n * names is marked. A response deleted meanwhile (NOT_FOUND) makes the page re-read its list.\n */\n\nconst writeOptions = { refetchQueries: SATISFACTION_QUERIES, awaitRefetchQueries: true };\n\n/** Service `extensions.field` → the form field it marks. */\nconst FIELD_OF: Record<string, FormField> = {\n score: 'score',\n metricType: 'score',\n respondedAt: 'respondedAt',\n productId: 'links',\n releaseId: 'links',\n projectId: 'links',\n respondentName: 'respondentName',\n respondentEmail: 'respondentEmail',\n isAnonymous: 'respondentName',\n comment: 'comment',\n externalId: 'externalId',\n};\n\nfunction problemText(\n tr: ReturnType<typeof useTr>,\n problem: FormProblem,\n values: ResponseFormValues\n) {\n switch (problem) {\n case 'scoreRequired':\n return tr(\n 'planmagnet.satisfaction.form.errors.scoreRequired',\n 'Pick the score the customer gave.'\n );\n case 'scoreOutOfRange':\n return tr(\n 'planmagnet.satisfaction.form.errors.scoreOutOfRange',\n 'A {{metric}} score is a whole number from {{min}} to {{max}}.',\n { metric: values.metricType, ...SCORE_SCALE[values.metricType] }\n );\n case 'respondedAtRequired':\n return tr(\n 'planmagnet.satisfaction.form.errors.respondedAtRequired',\n 'Enter the day the customer answered.'\n );\n case 'respondedAtFormat':\n return tr('planmagnet.satisfaction.form.errors.respondedAtFormat', 'Enter a valid date.');\n case 'respondedAtInFuture':\n return tr(\n 'planmagnet.satisfaction.form.errors.respondedAtInFuture',\n 'The response date cannot be in the future.'\n );\n case 'respondedAtTooOld':\n return tr(\n 'planmagnet.satisfaction.form.errors.respondedAtTooOld',\n 'The response date cannot be earlier than {{min}}.',\n { min: RESPONDED_AT_EARLIEST }\n );\n case 'linkRequired':\n return tr(\n 'planmagnet.satisfaction.form.errors.linkRequired',\n 'Link the response to a product, a release or a project.'\n );\n case 'respondentNameTooLong':\n return tr(\n 'planmagnet.satisfaction.form.errors.respondentNameTooLong',\n 'A respondent name can be at most {{max}} characters.',\n { max: RESPONDENT_NAME_MAX }\n );\n case 'respondentEmailInvalid':\n return tr(\n 'planmagnet.satisfaction.form.errors.respondentEmailInvalid',\n 'Enter a valid email address of at most {{max}} characters.',\n { max: RESPONDENT_EMAIL_MAX }\n );\n case 'commentTooLong':\n return tr(\n 'planmagnet.satisfaction.form.errors.commentTooLong',\n 'A comment can be at most {{max}} characters.',\n { max: COMMENT_MAX }\n );\n default:\n return tr(\n 'planmagnet.satisfaction.form.errors.externalIdTooLong',\n 'An external id can be at most {{max}} characters.',\n { max: EXTERNAL_ID_MAX }\n );\n }\n}\n\nconst fieldClass = (invalid: boolean) =>\n cn(invalid && 'rounded-md ring-1 ring-destructive ring-offset-2 ring-offset-background');\n\nexport function SatisfactionResponseDialog({\n response,\n links,\n onSaved,\n onStale,\n}: {\n /** Edit this response; omitted, the dialog adds a new one. */\n response?: SatisfactionResponse;\n /** A new response's starting links — the page's product / release / project filters. */\n links?: FormLinks;\n onSaved?: (kind: 'created' | 'updated') => void;\n /** The response no longer exists (deleted meanwhile): re-read what is on the page. */\n onStale?: () => void;\n}) {\n const tr = useTr();\n const isNew = !response;\n const initialValues = (): ResponseFormValues =>\n response\n ? formValuesOf(response)\n : newFormValues(localDay(), links ?? { productId: '', releaseId: '', projectId: '' });\n const [open, setOpen] = useState(false);\n const [values, setValues] = useState<ResponseFormValues>(initialValues);\n const [initial, setInitial] = useState<ResponseFormValues>(initialValues);\n const [attempted, setAttempted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [serverField, setServerField] = useState<FormField | null>(null);\n const [create, createState] = useMutation(CREATE_CUSTOMER_SATISFACTION_RESPONSE, writeOptions);\n const [update, updateState] = useMutation(UPDATE_CUSTOMER_SATISFACTION_RESPONSE, writeOptions);\n const saving = createState.loading || updateState.loading;\n const idPrefix = response ? `satisfaction-edit-${response.id}` : 'satisfaction-new';\n\n const problems = formProblems(values, new Date(), isNew);\n const shown = attempted ? problems : {};\n const invalid = (field: FormField) => !!shown[field] || serverField === field;\n const set = (patch: Partial<ResponseFormValues>) => {\n setValues((v) => ({ ...v, ...patch }));\n setServerField(null);\n };\n const forbidden = tr(\n 'planmagnet.satisfaction.errors.forbidden',\n 'Your role cannot change customer satisfaction responses in this workspace.'\n );\n\n const save = async () => {\n setAttempted(true);\n setError(null);\n setServerField(null);\n if (Object.keys(problems).length > 0 || values.score === null) return;\n try {\n if (response) {\n const input = updateInput(initial, values);\n if (Object.keys(input).length > 0) {\n await throwOnError(update({ variables: { id: response.id, input } }));\n onSaved?.('updated');\n }\n } else {\n await throwOnError(\n create({ variables: { input: createInput({ ...values, score: values.score }) } })\n );\n onSaved?.('created');\n }\n setOpen(false);\n } catch (e) {\n const field = errorField(e);\n setServerField(field ? (FIELD_OF[field] ?? null) : null);\n setError(\n refusalMessage(\n e,\n isNew\n ? tr('planmagnet.satisfaction.form.errors.create', 'The response could not be added.')\n : tr('planmagnet.satisfaction.form.errors.save', 'The response could not be saved.'),\n forbidden\n )\n );\n if (errorCode(e) === 'NOT_FOUND' && !isNew) onStale?.();\n }\n };\n\n const today = localDay();\n const metricHint =\n values.metricType === 'CSAT'\n ? tr(\n 'planmagnet.satisfaction.form.csatHint',\n '“How satisfied were you?” — 1 very dissatisfied … 5 very satisfied. 4 and 5 count as satisfied.'\n )\n : tr(\n 'planmagnet.satisfaction.form.npsHint',\n '“How likely are you to recommend us?” — 0 not at all … 10 extremely. 9–10 promote, 7–8 are passive, 0–6 detract.'\n );\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) {\n const start = initialValues();\n setValues(start);\n setInitial(start);\n setAttempted(false);\n }\n setError(null);\n setServerField(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n {response ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"satisfaction-response-edit\"\n aria-label={tr(\n 'planmagnet.satisfaction.actions.editNamed',\n 'Edit the response of {{date}}',\n {\n date: formatUtcDay(response.respondedAt),\n }\n )}\n >\n <Pencil className=\"h-4 w-4\" />\n </Button>\n ) : (\n <Button size=\"sm\" data-testid=\"satisfaction-response-new\">\n <Plus className=\"mr-1 h-4 w-4\" />\n {tr('planmagnet.satisfaction.actions.add', 'Add response')}\n </Button>\n )}\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>\n {isNew\n ? tr('planmagnet.satisfaction.form.newTitle', 'Add a customer response')\n : tr('planmagnet.satisfaction.form.editTitle', 'Edit customer response')}\n </ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n {tr(\n 'planmagnet.satisfaction.form.description',\n 'One customer’s answer, as they gave it. It counts in every CSAT or NPS figure for its product, release and project.'\n )}\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n\n <div className=\"min-w-0 space-y-4\">\n <fieldset>\n <legend className=\"text-sm font-medium\">\n {tr('planmagnet.satisfaction.form.metric', 'Metric')} *\n </legend>\n <div className=\"mt-1 flex gap-2\" role=\"group\">\n {METRIC_TYPES.map((metric) => (\n <Button\n key={metric}\n type=\"button\"\n size=\"sm\"\n variant={values.metricType === metric ? 'default' : 'outline'}\n aria-pressed={values.metricType === metric}\n onClick={() => {\n setValues((v) => withMetricType(v, metric));\n setServerField(null);\n }}\n data-testid={`satisfaction-form-metric-${metric}`}\n >\n {metric === 'CSAT'\n ? tr('planmagnet.satisfaction.form.metricCsat', 'CSAT (1–5)')\n : tr('planmagnet.satisfaction.form.metricNps', 'NPS (0–10)')}\n </Button>\n ))}\n </div>\n </fieldset>\n\n <fieldset className={fieldClass(invalid('score'))}>\n <legend className=\"text-sm font-medium\">\n {tr('planmagnet.satisfaction.form.score', 'Score')} *\n </legend>\n <p className=\"text-xs text-muted-foreground\">{metricHint}</p>\n <div className=\"mt-1 flex flex-wrap gap-1\" role=\"group\">\n {scaleValues(values.metricType).map((score) => (\n <Button\n key={score}\n type=\"button\"\n size=\"sm\"\n variant={values.score === score ? 'default' : 'outline'}\n aria-pressed={values.score === score}\n className=\"w-9 px-0 tabular-nums\"\n onClick={() => set({ score })}\n data-testid={`satisfaction-form-score-${score}`}\n >\n {score}\n </Button>\n ))}\n </div>\n {shown.score && <ErrorLine message={problemText(tr, shown.score, values)} />}\n </fieldset>\n\n <div>\n <label htmlFor={`${idPrefix}-responded`} className=\"text-sm font-medium\">\n {tr('planmagnet.satisfaction.form.respondedAt', 'Answered on')} *\n </label>\n <Input\n id={`${idPrefix}-responded`}\n type=\"date\"\n className=\"mt-1 w-48\"\n value={values.respondedAt}\n min={RESPONDED_AT_EARLIEST}\n max={today}\n aria-invalid={invalid('respondedAt') || undefined}\n onChange={(e) => set({ respondedAt: e.target.value })}\n data-testid=\"satisfaction-form-responded-at\"\n />\n {shown.respondedAt && (\n <ErrorLine message={problemText(tr, shown.respondedAt, values)} />\n )}\n </div>\n\n <fieldset className={cn('space-y-2', fieldClass(invalid('links')))}>\n <legend className=\"text-sm font-medium\">\n {tr('planmagnet.satisfaction.form.about', 'About')} *\n </legend>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.satisfaction.form.aboutHint',\n 'At least one. A release must belong to the product chosen with it, or to no product.'\n )}\n </p>\n <SatisfactionLinkFields\n idPrefix={idPrefix}\n value={{\n productId: values.productId,\n releaseId: values.releaseId,\n projectId: values.projectId,\n }}\n onChange={(next) => set(next)}\n notes={{\n productId:\n response?.productId &&\n !response.product &&\n values.productId === response.productId\n ? tr(\n 'planmagnet.satisfaction.form.productDeleted',\n 'The linked product was deleted.'\n )\n : null,\n releaseId:\n response?.releaseId &&\n !response.release &&\n values.releaseId === response.releaseId\n ? tr(\n 'planmagnet.satisfaction.form.releaseDeleted',\n 'The linked release was deleted.'\n )\n : null,\n projectId:\n response?.projectId &&\n !response.project &&\n values.projectId === response.projectId\n ? tr(\n 'planmagnet.satisfaction.form.projectDeleted',\n 'The linked project was deleted.'\n )\n : null,\n }}\n />\n {shown.links && <ErrorLine message={problemText(tr, shown.links, values)} />}\n </fieldset>\n\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium\">\n {tr('planmagnet.satisfaction.form.respondent', 'Respondent')}\n </legend>\n <div className=\"flex items-start gap-2\">\n <Checkbox\n id={`${idPrefix}-anonymous`}\n checked={values.isAnonymous}\n onCheckedChange={(checked) => set({ isAnonymous: checked === true })}\n data-testid=\"satisfaction-form-anonymous\"\n />\n <label htmlFor={`${idPrefix}-anonymous`} className=\"text-sm\">\n {tr(\n 'planmagnet.satisfaction.form.anonymous',\n 'Anonymous — no name or email is stored for this response.'\n )}\n </label>\n </div>\n {values.isAnonymous &&\n !initial.isAnonymous &&\n (initial.respondentName || initial.respondentEmail) && (\n <p className=\"flex items-center gap-1.5 rounded-md bg-status-warning-bg-subtle px-2 py-1 text-xs text-foreground\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" aria-hidden={true} />\n {tr(\n 'planmagnet.satisfaction.form.anonymousClears',\n 'Saving removes the name and email stored with this response.'\n )}\n </p>\n )}\n {!values.isAnonymous && (\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <div>\n <label htmlFor={`${idPrefix}-name`} className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.satisfaction.form.name', 'Name')}\n </label>\n <Input\n id={`${idPrefix}-name`}\n value={values.respondentName}\n maxLength={RESPONDENT_NAME_MAX}\n aria-invalid={invalid('respondentName') || undefined}\n onChange={(e) => set({ respondentName: e.target.value })}\n data-testid=\"satisfaction-form-name\"\n />\n </div>\n <div>\n <label htmlFor={`${idPrefix}-email`} className=\"text-xs text-muted-foreground\">\n {tr('planmagnet.satisfaction.form.email', 'Email')}\n </label>\n <Input\n id={`${idPrefix}-email`}\n type=\"email\"\n value={values.respondentEmail}\n maxLength={RESPONDENT_EMAIL_MAX}\n aria-invalid={invalid('respondentEmail') || undefined}\n onChange={(e) => set({ respondentEmail: e.target.value })}\n data-testid=\"satisfaction-form-email\"\n />\n </div>\n </div>\n )}\n {shown.respondentName && (\n <ErrorLine message={problemText(tr, shown.respondentName, values)} />\n )}\n {shown.respondentEmail && (\n <ErrorLine message={problemText(tr, shown.respondentEmail, values)} />\n )}\n </fieldset>\n\n <div>\n <label htmlFor={`${idPrefix}-comment`} className=\"text-sm font-medium\">\n {tr('planmagnet.satisfaction.form.comment', 'Comment')}\n </label>\n <Textarea\n id={`${idPrefix}-comment`}\n className=\"mt-1 min-h-[80px]\"\n value={values.comment}\n maxLength={COMMENT_MAX}\n aria-invalid={invalid('comment') || undefined}\n onChange={(e) => set({ comment: e.target.value })}\n data-testid=\"satisfaction-form-comment\"\n />\n <p className=\"text-right text-xs text-muted-foreground tabular-nums\">\n {values.comment.length} / {COMMENT_MAX}\n </p>\n {shown.comment && <ErrorLine message={problemText(tr, shown.comment, values)} />}\n </div>\n\n {isNew ? (\n <div>\n <label htmlFor={`${idPrefix}-external`} className=\"text-sm font-medium\">\n {tr('planmagnet.satisfaction.form.externalId', 'External id')}\n </label>\n <Input\n id={`${idPrefix}-external`}\n className=\"mt-1\"\n value={values.externalId}\n maxLength={EXTERNAL_ID_MAX}\n aria-invalid={invalid('externalId') || undefined}\n placeholder={tr('planmagnet.satisfaction.form.externalIdPlaceholder', 'Optional')}\n onChange={(e) => set({ externalId: e.target.value })}\n data-testid=\"satisfaction-form-external-id\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {tr(\n 'planmagnet.satisfaction.form.externalIdHint',\n 'The answer’s id in the survey tool it came from, if any. It cannot be changed later.'\n )}\n </p>\n {shown.externalId && (\n <ErrorLine message={problemText(tr, shown.externalId, values)} />\n )}\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\" data-testid=\"satisfaction-form-source\">\n {response?.source === 'IMPORT'\n ? tr('planmagnet.satisfaction.form.sourceImport', 'Imported from a file')\n : tr('planmagnet.satisfaction.form.sourceManual', 'Entered by a team member')}\n {response?.externalId\n ? ` · ${tr('planmagnet.satisfaction.form.externalIdShown', 'external id {{id}}', {\n id: response.externalId,\n })}`\n : ''}\n </p>\n )}\n </div>\n\n {error && <ErrorLine message={error} />}\n <ResponsiveDialogFooter>\n <Button\n onClick={() => void save()}\n disabled={saving}\n data-testid=\"satisfaction-form-save\"\n >\n {saving\n ? tr('planmagnet.satisfaction.actions.saving', 'Saving…')\n : isNew\n ? tr('planmagnet.satisfaction.actions.addConfirm', 'Add response')\n : tr('planmagnet.satisfaction.actions.save', 'Save')}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionResponsesTable.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/SatisfactionResponsesTable.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAML,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAWlE,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,MAAM,EAAE,uBAAuB,CAAC;CACjC;AA4KD,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,MAAM,EACN,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,OAAO,GACR,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,4DAA4D;IAC5D,KAAK,EAAE,SAAS,CAAC;IACjB,sGAAsG;IACtG,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC;IAC9D,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,2CA4OA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionResponsesTable.js","names":[],"sources":["../../../src/planmagnet/satisfaction/SatisfactionResponsesTable.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Badge,\n Button,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@burdenoff/fe-libs/ui';\nimport { ChevronLeft, ChevronRight, Loader2, Trash2 } from 'lucide-react';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { ConfirmButton, ErrorLine } from '../controls/ConfirmButton';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { refusalMessage } from '../product/refusal';\nimport { isForbidden } from '../utils/graphqlErrors';\nimport { throwOnError } from '../utils/mutationResult';\nimport { detailPath } from '../utils/rowNavigation';\nimport { CATEGORY_CLASS, categoryLabel } from './SatisfactionFigures';\nimport { SatisfactionResponseDialog } from './SatisfactionResponseDialog';\nimport {\n SCORE_SCALE,\n errorCode,\n formatUtcDay,\n releaseLabel,\n scoreCategory,\n type SatisfactionMetricType,\n type SatisfactionWindowInput,\n} from './satisfaction';\nimport type { FormLinks } from './satisfactionForm';\nimport {\n CUSTOMER_SATISFACTION_RESPONSES,\n DELETE_CUSTOMER_SATISFACTION_RESPONSE,\n SATISFACTION_QUERIES,\n type CustomerSatisfactionResponsesData,\n type SatisfactionResponse,\n} from './satisfactionOperations';\nimport type { SatisfactionAccess } from './useSatisfactionAccess';\n\n/**\n * The responses behind the figures, newest answer first, a page at a time — the same window and filters as the figures\n * above them, so the list and the numbers always agree. Product managers edit and delete from here; viewers read.\n */\n\nconst PAGE_SIZE = 25;\n/** Longer comments are cut here until \"Show more\". */\nconst COMMENT_PREVIEW = 180;\n\nexport interface ResponsesFilter {\n productId?: string;\n releaseId?: string;\n projectId?: string;\n metricType?: SatisfactionMetricType;\n window: SatisfactionWindowInput;\n}\n\nfunction Comment({ text }: { text: string }) {\n const tr = useTr();\n const [expanded, setExpanded] = useState(false);\n const long = text.length > COMMENT_PREVIEW;\n return (\n <div className=\"min-w-48 max-w-md\">\n <p className=\"whitespace-pre-wrap break-words text-sm\">\n {long && !expanded ? `${text.slice(0, COMMENT_PREVIEW).trimEnd()}…` : text}\n </p>\n {long && (\n <button\n type=\"button\"\n className=\"text-xs text-primary hover:underline\"\n aria-expanded={expanded}\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded\n ? tr('planmagnet.satisfaction.list.showLess', 'Show less')\n : tr('planmagnet.satisfaction.list.showMore', 'Show more')}\n </button>\n )}\n </div>\n );\n}\n\nfunction LinkButton({ label, onClick }: { label: string; onClick: () => void }) {\n return (\n <button\n type=\"button\"\n className=\"block max-w-56 truncate text-left text-sm text-primary hover:underline\"\n onClick={onClick}\n title={label}\n >\n {label}\n </button>\n );\n}\n\nfunction About({ response }: { response: SatisfactionResponse }) {\n const tr = useTr();\n const navigate = usePlanMagnetNavigate();\n const deleted = (text: string) => <p className=\"text-sm text-muted-foreground\">{text}</p>;\n return (\n <div className=\"space-y-0.5\">\n {response.product ? (\n <LinkButton\n label={response.product.name}\n onClick={() =>\n navigate(detailPath('/products/product-detail-page', response.product?.id))\n }\n />\n ) : (\n response.productId &&\n deleted(tr('planmagnet.satisfaction.list.productDeleted', 'Deleted product'))\n )}\n {response.release ? (\n <LinkButton\n label={releaseLabel(response.release)}\n onClick={() =>\n navigate(detailPath('/products/release-detail-page', response.release?.id))\n }\n />\n ) : (\n response.releaseId &&\n deleted(tr('planmagnet.satisfaction.list.releaseDeleted', 'Deleted release'))\n )}\n {response.project ? (\n <LinkButton\n label={response.project.name}\n onClick={() =>\n navigate(detailPath('/projects/project-detail-page', response.project?.id))\n }\n />\n ) : (\n response.projectId &&\n deleted(tr('planmagnet.satisfaction.list.projectDeleted', 'Deleted project'))\n )}\n </div>\n );\n}\n\nfunction Respondent({ response }: { response: SatisfactionResponse }) {\n const tr = useTr();\n if (response.isAnonymous) {\n return (\n <span className=\"text-sm italic text-muted-foreground\">\n {tr('planmagnet.satisfaction.list.anonymous', 'Anonymous')}\n </span>\n );\n }\n if (!response.respondentName && !response.respondentEmail) {\n return (\n <span className=\"text-sm text-muted-foreground\">\n {tr('planmagnet.satisfaction.list.notRecorded', 'Not recorded')}\n </span>\n );\n }\n return (\n <div className=\"max-w-56 text-sm\">\n {response.respondentName && <p className=\"truncate\">{response.respondentName}</p>}\n {response.respondentEmail && (\n <p className=\"truncate text-xs text-muted-foreground\">{response.respondentEmail}</p>\n )}\n </div>\n );\n}\n\nfunction DeleteResponse({\n response,\n onDeleted,\n onFailed,\n onStale,\n}: {\n response: SatisfactionResponse;\n onDeleted: () => void;\n onFailed: (message: string) => void;\n onStale: () => void;\n}) {\n const tr = useTr();\n const [remove, removeState] = useMutation(DELETE_CUSTOMER_SATISFACTION_RESPONSE, {\n refetchQueries: SATISFACTION_QUERIES,\n awaitRefetchQueries: true,\n });\n const onConfirm = async () => {\n try {\n await throwOnError(remove({ variables: { id: response.id } }));\n onDeleted();\n } catch (e) {\n onFailed(\n refusalMessage(\n e,\n tr('planmagnet.satisfaction.errors.delete', 'The response could not be deleted.'),\n tr(\n 'planmagnet.satisfaction.errors.forbidden',\n 'Your role cannot change customer satisfaction responses in this workspace.'\n )\n )\n );\n if (errorCode(e) === 'NOT_FOUND') onStale();\n }\n };\n const date = formatUtcDay(response.respondedAt);\n return (\n <ConfirmButton\n label=\"\"\n ariaLabel={tr(\n 'planmagnet.satisfaction.actions.deleteNamed',\n 'Delete the response of {{date}}',\n {\n date,\n }\n )}\n variant=\"outline\"\n icon={<Trash2 className=\"h-4 w-4\" />}\n testId=\"satisfaction-response-delete\"\n title={tr('planmagnet.satisfaction.confirmDelete.title', 'Delete this response?')}\n description={tr(\n 'planmagnet.satisfaction.confirmDelete.description',\n 'The {{metric}} answer of {{date}} stops counting in every customer satisfaction figure. This cannot be undone here.',\n { metric: response.metricType, date }\n )}\n confirmLabel={tr('planmagnet.satisfaction.confirmDelete.confirm', 'Delete response')}\n cancelLabel={tr('planmagnet.satisfaction.confirmDelete.cancel', 'Keep it')}\n destructive\n disabled={removeState.loading}\n onConfirm={() => void onConfirm()}\n />\n );\n}\n\nexport function SatisfactionResponsesTable({\n workspaceId,\n filter,\n access,\n links,\n filtered,\n onNotice,\n onStale,\n}: {\n workspaceId: string;\n filter: ResponsesFilter;\n access: SatisfactionAccess;\n /** A new response's starting links (the page's filters). */\n links: FormLinks;\n /** True when any product / release / project / metric filter is set — for the empty-state wording. */\n filtered: boolean;\n onNotice: (message: string, tone: 'status' | 'alert') => void;\n onStale: () => void;\n}) {\n const tr = useTr();\n // Cursors of the pages visited so far; the last one is the page on screen (null = the first page).\n const [cursors, setCursors] = useState<(string | null)[]>([null]);\n const after = cursors[cursors.length - 1];\n const { data, previousData, loading, error } = useQuery<CustomerSatisfactionResponsesData>(\n CUSTOMER_SATISFACTION_RESPONSES,\n {\n variables: {\n workspaceId,\n filter,\n pagination: { first: PAGE_SIZE, ...(after ? { after } : {}) },\n },\n }\n );\n // Paging keeps the current rows on screen until the next page arrives.\n const list = (data ?? previousData)?.planmagnetCustomerSatisfactionResponses;\n const items = list?.items ?? [];\n const total = list?.totalCount ?? 0;\n const firstIndex = (cursors.length - 1) * PAGE_SIZE;\n const writes = access.canUpdate || access.canDelete;\n\n if (loading && !list) {\n return (\n <div className=\"flex items-center gap-2 py-8 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n {tr('planmagnet.satisfaction.list.loading', 'Loading responses…')}\n </div>\n );\n }\n if (error && !list) {\n return (\n <ErrorLine\n message={\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.list.error',\n 'The responses could not be loaded: {{message}}',\n {\n message: error.message,\n }\n )\n }\n />\n );\n }\n\n return (\n <div className=\"space-y-3\" data-testid=\"satisfaction-responses\">\n {error && (\n <ErrorLine\n message={tr(\n 'planmagnet.satisfaction.list.refreshError',\n 'The list could not be refreshed: {{message}}',\n { message: error.message }\n )}\n />\n )}\n {items.length === 0 ? (\n <p\n className=\"py-8 text-center text-sm text-muted-foreground\"\n data-testid=\"satisfaction-responses-empty\"\n >\n {cursors.length > 1\n ? tr(\n 'planmagnet.satisfaction.list.emptyPage',\n 'This page has no responses left — go back to the previous page.'\n )\n : filtered\n ? tr(\n 'planmagnet.satisfaction.list.emptyFiltered',\n 'No response matches these filters in this window.'\n )\n : tr('planmagnet.satisfaction.list.empty', 'No responses in this window yet.')}\n </p>\n ) : (\n <div className=\"overflow-x-auto\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{tr('planmagnet.satisfaction.list.answered', 'Answered')}</TableHead>\n <TableHead>{tr('planmagnet.satisfaction.list.score', 'Score')}</TableHead>\n <TableHead>{tr('planmagnet.satisfaction.list.respondent', 'Respondent')}</TableHead>\n <TableHead>{tr('planmagnet.satisfaction.list.about', 'About')}</TableHead>\n <TableHead>{tr('planmagnet.satisfaction.list.comment', 'Comment')}</TableHead>\n <TableHead>{tr('planmagnet.satisfaction.list.source', 'Source')}</TableHead>\n {writes && (\n <TableHead className=\"text-right\">\n <span className=\"sr-only\">\n {tr('planmagnet.satisfaction.list.actions', 'Actions')}\n </span>\n </TableHead>\n )}\n </TableRow>\n </TableHeader>\n <TableBody>\n {items.map((response) => {\n const category = scoreCategory(response.metricType, response.score);\n return (\n <TableRow key={response.id} data-testid=\"satisfaction-response-row\">\n <TableCell className=\"whitespace-nowrap text-sm\">\n {formatUtcDay(response.respondedAt)}\n </TableCell>\n <TableCell className=\"whitespace-nowrap\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {response.metricType}\n </Badge>\n <span className=\"font-medium tabular-nums\">\n {tr('planmagnet.satisfaction.list.scoreOf', '{{score}} / {{max}}', {\n score: response.score,\n max: SCORE_SCALE[response.metricType].max,\n })}\n </span>\n <span\n className={`rounded px-1.5 py-0.5 text-xs ${CATEGORY_CLASS[category]}`}\n >\n {categoryLabel(tr, category)}\n </span>\n </div>\n </TableCell>\n <TableCell>\n <Respondent response={response} />\n </TableCell>\n <TableCell>\n <About response={response} />\n </TableCell>\n <TableCell>\n {response.comment ? (\n <Comment text={response.comment} />\n ) : (\n <span className=\"text-sm text-muted-foreground\">—</span>\n )}\n </TableCell>\n <TableCell className=\"text-xs text-muted-foreground\">\n <p>\n {response.source === 'IMPORT'\n ? tr('planmagnet.satisfaction.list.sourceImport', 'Imported')\n : tr('planmagnet.satisfaction.list.sourceManual', 'Entered')}\n </p>\n {response.externalId && (\n <p className=\"max-w-40 truncate font-mono\" title={response.externalId}>\n {response.externalId}\n </p>\n )}\n </TableCell>\n {writes && (\n <TableCell className=\"text-right\">\n <div className=\"flex justify-end gap-1\">\n {access.canUpdate && (\n <SatisfactionResponseDialog\n response={response}\n links={links}\n onSaved={() =>\n onNotice(\n tr(\n 'planmagnet.satisfaction.notice.updated',\n 'The response was saved.'\n ),\n 'status'\n )\n }\n onStale={onStale}\n />\n )}\n {access.canDelete && (\n <DeleteResponse\n response={response}\n onDeleted={() =>\n onNotice(\n tr(\n 'planmagnet.satisfaction.notice.deleted',\n 'The response was deleted. It no longer counts in any figure.'\n ),\n 'status'\n )\n }\n onFailed={(message) => onNotice(message, 'alert')}\n onStale={onStale}\n />\n )}\n </div>\n </TableCell>\n )}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n )}\n\n {(total > 0 || cursors.length > 1) && (\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <p className=\"text-xs text-muted-foreground\" data-testid=\"satisfaction-responses-range\">\n {items.length > 0\n ? tr('planmagnet.satisfaction.list.range', 'Showing {{from}}–{{to}} of {{total}}', {\n from: firstIndex + 1,\n to: firstIndex + items.length,\n total,\n })\n : ''}\n </p>\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={cursors.length === 1 || loading}\n onClick={() => setCursors((c) => c.slice(0, -1))}\n data-testid=\"satisfaction-responses-previous\"\n >\n <ChevronLeft className=\"mr-1 h-4 w-4\" />\n {tr('planmagnet.satisfaction.list.previous', 'Previous')}\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={!list?.pageInfo.hasNextPage || !list.pageInfo.endCursor || loading}\n onClick={() => {\n const next = list?.pageInfo.endCursor;\n if (next) setCursors((c) => [...c, next]);\n }}\n data-testid=\"satisfaction-responses-next\"\n >\n {tr('planmagnet.satisfaction.list.next', 'Next')}\n <ChevronRight className=\"ml-1 h-4 w-4\" />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SatisfactionSummaryCard.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/satisfaction/SatisfactionSummaryCard.tsx"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,iBAAiB,EAEvB,MAAM,gBAAgB,CAAC;AAcxB,wBAAgB,uBAAuB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,iBAAiB,CAAA;CAAE,2CAkE9E"}
|