@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":"FeatureTriage.js","names":[],"sources":["../../../src/planmagnet/controls/FeatureTriage.tsx"],"sourcesContent":["import { useDeferredValue, useState, type ReactNode } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Button,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { AlarmClock, Check, GitMerge, Sun, X } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { throwOnError } from '../utils/mutationResult';\nimport { ErrorLine } from './ConfirmButton';\nimport { ProjectSelect } from './Pickers';\n\n/**\n * Triage for incoming feature requests (BUILD_PLAN P1.3): accept, decline with a reason, snooze, merge into the\n * original. Linear's triage is these four plus commenting. The feedback UI had none of them — a request could only\n * have its status flipped, so a decline carried no reason and a duplicate kept its votes away from the original.\n */\n\n/** Every query that shows a feature request or feature counts. */\nconst TRIAGE_REFETCH = [\n 'GetFeatureRequest',\n 'ListFeatureRequests',\n 'CountsFeatures',\n 'ListFeatureRequestsForProduct',\n 'ListFeatureRequestsForProducts',\n 'ListAllFeaturesAnalytics',\n 'ReleaseCustomerRequests',\n];\nconst options = { refetchQueries: TRIAGE_REFETCH, awaitRefetchQueries: true };\n\nconst ACCEPT = gql`\n mutation FeatureTriageAccept($id: ID!, $input: PlanmagnetAcceptFeatureRequestInput) {\n planmagnetAcceptFeatureRequest(id: $id, input: $input) {\n id\n status\n }\n }\n`;\nconst DECLINE = gql`\n mutation FeatureTriageDecline($id: ID!, $reason: String!) {\n planmagnetDeclineFeatureRequest(id: $id, reason: $reason) {\n id\n status\n declineReason\n }\n }\n`;\nconst SNOOZE = gql`\n mutation FeatureTriageSnooze($id: ID!, $until: DateTime) {\n planmagnetSnoozeFeatureRequest(id: $id, until: $until) {\n id\n snoozedUntil\n }\n }\n`;\nconst MERGE = gql`\n mutation FeatureTriageMerge($id: ID!, $intoId: ID!) {\n planmagnetMergeFeatureRequest(id: $id, intoId: $intoId) {\n id\n voteCount\n }\n }\n`;\nconst MERGE_CANDIDATES = gql`\n query FeatureTriageMergeCandidates($workspaceId: ID!, $filter: PlanmagnetFeatureRequestFilter) {\n planmagnetFeatureRequests(\n workspaceId: $workspaceId\n filter: $filter\n pagination: { first: 20 }\n ) {\n items {\n id\n title\n status\n voteCount\n }\n totalCount\n }\n }\n`;\n\nexport const DECLINE_REASON_MAX = 2000;\nconst OPEN = ['SUBMITTED', 'UNDER_REVIEW'];\n\nexport interface TriageFeature {\n id: string;\n title: string;\n status: string;\n projectId?: string | null;\n snoozedUntil?: string | null;\n}\n\n/** True while the request waits for a decision (accept, decline and merge apply). */\nexport const isOpenRequest = (status: string) => OPEN.includes(status);\n/** A snooze that has not passed yet. */\nexport const isSnoozed = (snoozedUntil: string | null | undefined, now: number) =>\n !!snoozedUntil && new Date(snoozedUntil).getTime() > now;\n\nconst errorText = (e: unknown, fallback: string) => (e instanceof Error ? e.message : fallback);\n\n/** A dialog with one action; the trigger never propagates to a clickable row it sits in. */\nfunction ActionDialog({\n trigger,\n testId,\n title,\n description,\n children,\n confirmLabel,\n canConfirm,\n busy,\n onConfirm,\n error,\n onOpenChange,\n open,\n}: {\n trigger: ReactNode;\n testId: string;\n title: string;\n description: string;\n children: ReactNode;\n confirmLabel: string;\n canConfirm: boolean;\n busy: boolean;\n onConfirm: () => void;\n error: string | null;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}) {\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogTrigger asChild>\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n {trigger}\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>{title}</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>{description}</ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n {children}\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={onConfirm} disabled={!canConfirm || busy}>\n {busy ? 'Saving…' : confirmLabel}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\nfunction AcceptDialog({ feature }: { feature: TriageFeature }) {\n const [open, setOpen] = useState(false);\n const [status, setStatus] = useState<'PLANNED' | 'UNDER_REVIEW'>('PLANNED');\n const [projectId, setProjectId] = useState(feature.projectId ?? '');\n const [error, setError] = useState<string | null>(null);\n const [accept, state] = useMutation(ACCEPT, options);\n const submit = async () => {\n setError(null);\n try {\n await throwOnError(\n accept({\n variables: {\n id: feature.id,\n input: { status, ...(projectId && projectId !== feature.projectId && { projectId }) },\n },\n })\n );\n setOpen(false);\n } catch (e) {\n setError(errorText(e, 'The request could not be accepted.'));\n }\n };\n return (\n <ActionDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) setError(null);\n }}\n testId=\"triage-accept\"\n trigger={\n <>\n <Check className=\"mr-1 h-4 w-4\" />\n Accept\n </>\n }\n title={`Accept \"${feature.title}\"`}\n description=\"Accepting takes it out of triage. Planned means it will be built; Under review means a closer look first.\"\n confirmLabel=\"Accept\"\n canConfirm\n busy={state.loading}\n onConfirm={() => void submit()}\n error={error}\n >\n <div>\n <label htmlFor={`triage-accept-status-${feature.id}`} className=\"text-sm font-medium\">\n Accept as\n </label>\n <select\n id={`triage-accept-status-${feature.id}`}\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={status}\n onChange={(e) => setStatus(e.target.value as 'PLANNED' | 'UNDER_REVIEW')}\n >\n <option value=\"PLANNED\">Planned</option>\n {feature.status !== 'UNDER_REVIEW' && <option value=\"UNDER_REVIEW\">Under review</option>}\n </select>\n </div>\n <div>\n <label htmlFor={`triage-accept-project-${feature.id}`} className=\"text-sm font-medium\">\n Project that will deliver it\n </label>\n <div className=\"mt-1\">\n <ProjectSelect\n id={`triage-accept-project-${feature.id}`}\n value={projectId}\n noneLabel=\"No project yet\"\n onChange={setProjectId}\n />\n </div>\n </div>\n </ActionDialog>\n );\n}\n\nfunction DeclineDialog({ feature }: { feature: TriageFeature }) {\n const [open, setOpen] = useState(false);\n const [reason, setReason] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [decline, state] = useMutation(DECLINE, options);\n const trimmed = reason.trim();\n const tooLong = trimmed.length > DECLINE_REASON_MAX;\n const submit = async () => {\n setError(null);\n try {\n await throwOnError(decline({ variables: { id: feature.id, reason: trimmed } }));\n setOpen(false);\n setReason('');\n } catch (e) {\n setError(errorText(e, 'The request could not be declined.'));\n }\n };\n return (\n <ActionDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) setError(null);\n }}\n testId=\"triage-decline\"\n trigger={\n <>\n <X className=\"mr-1 h-4 w-4\" />\n Decline\n </>\n }\n title={`Decline \"${feature.title}\"`}\n description=\"The reason is kept on the request, so anyone who asks later can see why.\"\n confirmLabel=\"Decline\"\n canConfirm={trimmed !== '' && !tooLong}\n busy={state.loading}\n onConfirm={() => void submit()}\n error={\n error ??\n (tooLong ? `A decline reason can be at most ${DECLINE_REASON_MAX} characters.` : null)\n }\n >\n <div>\n <label htmlFor={`triage-decline-reason-${feature.id}`} className=\"text-sm font-medium\">\n Reason\n </label>\n <textarea\n id={`triage-decline-reason-${feature.id}`}\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[88px]\"\n value={reason}\n aria-invalid={tooLong}\n onChange={(e) => setReason(e.target.value)}\n />\n </div>\n </ActionDialog>\n );\n}\n\n/** Snooze presets are computed when the dialog opens, never during render. */\nfunction snoozePresets(from: number) {\n const day = 86_400_000;\n const morning = (days: number) => {\n const d = new Date(from + days * day);\n d.setHours(9, 0, 0, 0);\n return d;\n };\n return [\n { label: 'Tomorrow', until: morning(1) },\n { label: 'In 3 days', until: morning(3) },\n { label: 'Next week', until: morning(7) },\n { label: 'In a month', until: morning(30) },\n ];\n}\n\nfunction SnoozeDialog({ feature }: { feature: TriageFeature }) {\n const [open, setOpen] = useState(false);\n const [presets, setPresets] = useState<{ label: string; until: Date }[]>([]);\n const [choice, setChoice] = useState(0);\n const [error, setError] = useState<string | null>(null);\n const [snooze, state] = useMutation(SNOOZE, options);\n const submit = async () => {\n setError(null);\n const preset = presets[choice];\n if (!preset) return;\n try {\n await throwOnError(\n snooze({ variables: { id: feature.id, until: preset.until.toISOString() } })\n );\n setOpen(false);\n } catch (e) {\n setError(errorText(e, 'The request could not be snoozed.'));\n }\n };\n return (\n <ActionDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) {\n setPresets(snoozePresets(Date.now()));\n setChoice(0);\n } else setError(null);\n }}\n testId=\"triage-snooze\"\n trigger={\n <>\n <AlarmClock className=\"mr-1 h-4 w-4\" />\n Snooze\n </>\n }\n title={`Snooze \"${feature.title}\"`}\n description=\"It leaves the triage queue and comes back on its own. It stays undecided meanwhile.\"\n confirmLabel=\"Snooze\"\n canConfirm={presets.length > 0}\n busy={state.loading}\n onConfirm={() => void submit()}\n error={error}\n >\n <fieldset className=\"space-y-2\">\n <legend className=\"text-sm font-medium\">Bring it back</legend>\n {presets.map((p, i) => (\n <label key={p.label} className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"radio\"\n name={`triage-snooze-${feature.id}`}\n checked={choice === i}\n onChange={() => setChoice(i)}\n />\n {p.label}\n <span className=\"text-muted-foreground\">\n (\n {p.until.toLocaleDateString(undefined, {\n weekday: 'short',\n day: 'numeric',\n month: 'short',\n })}\n )\n </span>\n </label>\n ))}\n </fieldset>\n </ActionDialog>\n );\n}\n\nfunction MergeDialog({ feature }: { feature: TriageFeature }) {\n const { workspaceId } = usePlanMagnet();\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [intoId, setIntoId] = useState('');\n const [error, setError] = useState<string | null>(null);\n const deferred = useDeferredValue(search.trim());\n const [merge, state] = useMutation(MERGE, options);\n const { data, loading } = useQuery<{\n planmagnetFeatureRequests: {\n items: { id: string; title: string; status: string; voteCount: number }[];\n totalCount: number;\n };\n }>(MERGE_CANDIDATES, {\n variables: { workspaceId: workspaceId ?? '', filter: deferred ? { search: deferred } : {} },\n skip: !workspaceId || !open,\n });\n // A request cannot merge into itself, and a duplicate is not an original.\n const candidates = (data?.planmagnetFeatureRequests.items ?? []).filter(\n (f) => f.id !== feature.id && f.status !== 'DUPLICATE'\n );\n const submit = async () => {\n setError(null);\n try {\n await throwOnError(merge({ variables: { id: feature.id, intoId } }));\n setOpen(false);\n } catch (e) {\n setError(errorText(e, 'The requests could not be merged.'));\n }\n };\n return (\n <ActionDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) {\n setSearch('');\n setIntoId('');\n } else setError(null);\n }}\n testId=\"triage-merge\"\n trigger={\n <>\n <GitMerge className=\"mr-1 h-4 w-4\" />\n Merge\n </>\n }\n title={`Merge \"${feature.title}\" into its original`}\n description=\"It becomes a duplicate of the original and its votes move there (someone who voted on both keeps one vote).\"\n confirmLabel=\"Merge\"\n canConfirm={intoId !== ''}\n busy={state.loading}\n onConfirm={() => void submit()}\n error={error}\n >\n <div className=\"space-y-1\">\n <label htmlFor={`triage-merge-into-${feature.id}`} className=\"text-sm font-medium\">\n Original request\n </label>\n <Input\n aria-label=\"Search feature requests\"\n placeholder=\"Search by title\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <select\n id={`triage-merge-into-${feature.id}`}\n className=\"w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={intoId}\n onChange={(e) => setIntoId(e.target.value)}\n >\n <option value=\"\">\n {loading && !data\n ? 'Searching…'\n : candidates.length\n ? 'Choose the original'\n : 'No match'}\n </option>\n {candidates.map((f) => (\n <option key={f.id} value={f.id}>\n {f.title} ({f.voteCount} vote{f.voteCount === 1 ? '' : 's'})\n </option>\n ))}\n </select>\n </div>\n </ActionDialog>\n );\n}\n\nfunction WakeButton({ feature }: { feature: TriageFeature }) {\n const [snooze, state] = useMutation(SNOOZE, options);\n const [error, setError] = useState<string | null>(null);\n const wake = async () => {\n setError(null);\n try {\n await throwOnError(snooze({ variables: { id: feature.id, until: null } }));\n } catch (e) {\n setError(errorText(e, 'The request could not be woken.'));\n }\n };\n return (\n <>\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"triage-wake\"\n disabled={state.loading}\n onClick={(e) => {\n e.stopPropagation();\n void wake();\n }}\n >\n <Sun className=\"mr-1 h-4 w-4\" />\n Back to triage\n </Button>\n {error && <ErrorLine message={error} />}\n </>\n );\n}\n\n/**\n * The four triage actions for an undecided request. Snooze applies only while it waits for triage (SUBMITTED);\n * a snoozed request offers \"Back to triage\" instead.\n */\nexport function FeatureTriageActions({ feature, now }: { feature: TriageFeature; now: number }) {\n if (!isOpenRequest(feature.status)) return null;\n const snoozed = isSnoozed(feature.snoozedUntil, now);\n // React events bubble through portals: without this, a click or Enter inside a dialog reached the clickable\n // list row around these actions and opened the request instead.\n const contain = (e: { stopPropagation: () => void }) => e.stopPropagation();\n return (\n <div\n className=\"flex flex-wrap items-center gap-2\"\n data-testid=\"triage-actions\"\n onClick={contain}\n onKeyDown={contain}\n >\n <AcceptDialog feature={feature} />\n <DeclineDialog feature={feature} />\n {feature.status === 'SUBMITTED' &&\n (snoozed ? <WakeButton feature={feature} /> : <SnoozeDialog feature={feature} />)}\n <MergeDialog feature={feature} />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/FeedbackControls.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH;;0GAE0G;AAC1G,eAAO,MAAM,6BAA6B,mEAMhC,CAAC;AAEX,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,mBAAmB,EAAE,kBAAiD,CAAC;AAIpF;kEACkE;AAClE,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAgB,GACjB,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,2CA8DA;AAED;iGACiG;AACjG,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,2CAmB9E;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,QAAgB,GACjB,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,2CAwBA;AAED;kGACkG;AAClG,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,kDAOlF;AAED;;2BAE2B;AAC3B,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,QAAgB,GACjB,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,2CAiBA;AAED;;;oEAGoE;AACpE,wBAAgB,2BAA2B,CAAC,EAC1C,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,QAAgB,EAChB,KAA4B,EAC5B,IAAwE,GACzE,EAAE;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,2CAgBA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackControls.js","names":[],"sources":["../../../src/planmagnet/controls/FeedbackControls.tsx"],"sourcesContent":["import { useRef } from 'react';\nimport { Badge, Checkbox, Input } from '@burdenoff/fe-libs/ui';\nimport { Star } from 'lucide-react';\n\n/**\n * CWF-15 structured feedback: a 1-5 rating and a freeform category on a feature request, an opt-in \"submit\n * anonymously\" on the request itself and (independently) on a vote. Shared by the feature request create/edit\n * form (FeatureControls.tsx / ProductsNewFeaturePagePage.tsx), the feature detail and list pages, and the vote\n * button, so the same controls and the same \"what does this literal value mean\" rendering are used everywhere.\n *\n * `rating`/`category` mirror `PrioritizationScoreFields`' shape convention elsewhere in this file family: '' on\n * the form means \"not set\", converted to `null`/omitted at the mutation call site, never sent as an empty string\n * (the schema's `category`/`rating` are `String`/`Int`, not \"\" is a value).\n */\n\n/** `FeatureRequest.category` has no fixed vocabulary server-side (any non-empty string is accepted) — these are\n * just the suggestions offered in the field's `<datalist>`, taken from the schema's own doc comment example\n * (\"bug\", \"ui\", \"performance\") plus two more common ones. Free text is always allowed alongside them. */\nexport const FEEDBACK_CATEGORY_SUGGESTIONS = [\n 'bug',\n 'ui',\n 'performance',\n 'feature',\n 'documentation',\n] as const;\n\nexport interface FeedbackFormValues {\n /** '' = not set, else a whole number 1-5 as text. */\n rating: string;\n /** '' = not set. */\n category: string;\n}\n\nexport const EMPTY_FEEDBACK_FORM: FeedbackFormValues = { rating: '', category: '' };\n\nconst RATING_VALUES = [1, 2, 3, 4, 5] as const;\n\n/** An editable 1-5 star picker. Clicking the already-selected star clears the rating (CWF-15's `rating` is\n * nullable) rather than requiring a separate \"clear\" control. */\nexport function RatingStars({\n idPrefix,\n value,\n onChange,\n disabled = false,\n}: {\n idPrefix: string;\n /** '' = not set, else '1'..'5'. */\n value: string;\n onChange: (next: string) => void;\n disabled?: boolean;\n}) {\n const selected = value === '' ? 0 : Number(value);\n // ARIA radiogroup keyboard pattern (matches the native `<input type=\"radio\">` groups elsewhere in this MFE,\n // e.g. SyncControls/SprintControls): one tab stop for the whole group (roving tabindex on the checked star,\n // or the first star when none is set), Left/Up and Right/Down both move focus AND select, same as a native\n // radio group's arrow-key behavior.\n const buttonRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const focusIndex = selected === 0 ? 0 : selected - 1;\n const moveFocus = (fromIndex: number, delta: number) => {\n const nextIndex = Math.min(RATING_VALUES.length - 1, Math.max(0, fromIndex + delta));\n onChange(String(RATING_VALUES[nextIndex]));\n buttonRefs.current[nextIndex]?.focus();\n };\n return (\n <div>\n <span className=\"text-sm font-medium\" id={`${idPrefix}-rating-label`}>\n Rating\n </span>\n <div\n role=\"radiogroup\"\n aria-labelledby={`${idPrefix}-rating-label`}\n className=\"mt-1 flex items-center gap-1\"\n data-testid=\"feedback-rating-stars\"\n >\n {RATING_VALUES.map((star, index) => (\n <button\n key={star}\n ref={(el) => {\n buttonRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected === star}\n aria-label={`${star} star${star === 1 ? '' : 's'}`}\n disabled={disabled}\n tabIndex={index === focusIndex ? 0 : -1}\n data-testid={`feedback-rating-star-${star}`}\n onClick={() => onChange(selected === star ? '' : String(star))}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n e.preventDefault();\n moveFocus(index, 1);\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n e.preventDefault();\n moveFocus(index, -1);\n }\n }}\n className=\"rounded p-0.5 disabled:opacity-60\"\n >\n <Star\n className={`h-5 w-5 ${star <= selected ? 'fill-current text-primary' : 'text-muted-foreground'}`}\n aria-hidden=\"true\"\n />\n </button>\n ))}\n <span className=\"ml-1 text-xs text-muted-foreground\">\n {selected === 0 ? 'Not set' : `${selected}/5`}\n </span>\n </div>\n </div>\n );\n}\n\n/** Read-only 1-5 stars for the detail/list pages — `rating == null` renders \"Not rated\" text, never a row of\n * empty stars (which would look identical to an explicit 0, a value this field never holds). */\nexport function RatingDisplay({ rating }: { rating: number | null | undefined }) {\n if (rating == null) {\n return <span className=\"text-sm text-muted-foreground\">Not rated</span>;\n }\n return (\n <span\n className=\"inline-flex items-center gap-0.5\"\n data-testid=\"feedback-rating-display\"\n aria-label={`${rating} out of 5 stars`}\n >\n {RATING_VALUES.map((star) => (\n <Star\n key={star}\n className={`h-3.5 w-3.5 ${star <= rating ? 'fill-current text-primary' : 'text-muted-foreground'}`}\n aria-hidden=\"true\"\n />\n ))}\n </span>\n );\n}\n\n/** The freeform category input, with a `<datalist>` of suggestions. */\nexport function CategoryField({\n idPrefix,\n value,\n onChange,\n disabled = false,\n}: {\n idPrefix: string;\n value: string;\n onChange: (next: string) => void;\n disabled?: boolean;\n}) {\n const listId = `${idPrefix}-category-suggestions`;\n return (\n <div>\n <label htmlFor={`${idPrefix}-category`} className=\"text-sm font-medium\">\n Category\n </label>\n <Input\n id={`${idPrefix}-category`}\n data-testid=\"feedback-category\"\n list={listId}\n className=\"mt-1\"\n placeholder=\"e.g. bug, ui, performance\"\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n />\n <datalist id={listId}>\n {FEEDBACK_CATEGORY_SUGGESTIONS.map((c) => (\n <option key={c} value={c} />\n ))}\n </datalist>\n </div>\n );\n}\n\n/** A category badge for the detail/list pages — renders nothing when unset, same convention\n * `QuadrantBadge`'s `hideWhenUnscored` uses for an unset score elsewhere in this file family. */\nexport function CategoryBadge({ category }: { category: string | null | undefined }) {\n if (!category) return null;\n return (\n <Badge variant=\"outline\" className=\"text-xs\" data-testid=\"feedback-category-badge\">\n {category}\n </Badge>\n );\n}\n\n/** Rating + category together — the two CWF-15 fields the create/edit form and the detail page both show. Kept\n * separate from the \"submit anonymously\" checkbox below: a vote uses the checkbox alone, with no rating or\n * category of its own. */\nexport function FeedbackFields({\n idPrefix,\n values,\n onChange,\n disabled = false,\n}: {\n idPrefix: string;\n values: FeedbackFormValues;\n onChange: (next: FeedbackFormValues) => void;\n disabled?: boolean;\n}) {\n return (\n <div className=\"space-y-3\" data-testid=\"feedback-fields\">\n <RatingStars\n idPrefix={idPrefix}\n value={values.rating}\n onChange={(rating) => onChange({ ...values, rating })}\n disabled={disabled}\n />\n <CategoryField\n idPrefix={idPrefix}\n value={values.category}\n onChange={(category) => onChange({ ...values, category })}\n disabled={disabled}\n />\n </div>\n );\n}\n\n/** The \"submit/vote anonymously\" checkbox (CWF-15's `isAnonymous`), reused for both a feature request's own\n * `isAnonymous` (create/edit) and a vote's independent `isAnonymous` (cast where the vote is cast) — the two\n * flags are unrelated server-side (a named request can still receive an anonymous vote, and vice versa), so\n * each call site holds its own boolean rather than sharing one. */\nexport function AnonymousSubmissionCheckbox({\n idPrefix,\n checked,\n onChange,\n disabled = false,\n label = 'Submit anonymously',\n hint = 'Hides your name from everyone except moderators handling abuse.',\n}: {\n idPrefix: string;\n checked: boolean;\n onChange: (next: boolean) => void;\n disabled?: boolean;\n label?: string;\n /** `null` renders no hint line at all (e.g. the vote button, which is too compact for one). */\n hint?: string | null;\n}) {\n return (\n <div className=\"space-y-0.5\">\n <label htmlFor={`${idPrefix}-anonymous`} className=\"flex items-center gap-2 text-sm\">\n <Checkbox\n id={`${idPrefix}-anonymous`}\n data-testid=\"feedback-anonymous-checkbox\"\n checked={checked}\n onCheckedChange={(next) => onChange(next === true)}\n disabled={disabled}\n />\n {label}\n </label>\n {hint && <p className=\"pl-6 text-xs text-muted-foreground\">{hint}</p>}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LiveStatus.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/LiveStatus.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AA4B/D,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,SAAc,GACf,EAAE;IACD,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,kDAaA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LiveStatus.js","names":[],"sources":["../../../src/planmagnet/controls/LiveStatus.tsx"],"sourcesContent":["import type { LiveRefreshMode } from '../hooks/useLiveRefresh';\n\n/**\n * The small, unobtrusive indicator a page using `useLiveRefresh` shows next to its heading: \"Live\" while the\n * subscription is confirmed working, \"Updating every 30 s\" once it has fallen back to polling, and a brief\n * \"Connecting…\" in between. `aria-live=\"polite\"` so a mode change (most commonly the one-time drop to polling)\n * is announced without interrupting whatever the screen reader is doing. Renders nothing while `mode` is\n * `null` — nothing to report yet (a required id, e.g. a sprint's, hasn't loaded).\n */\n\nconst LABEL: Record<LiveRefreshMode, string> = {\n connecting: 'Connecting…',\n live: 'Live',\n polling: 'Updating every 30 s',\n};\n\nconst DOT_CLASS: Record<LiveRefreshMode, string> = {\n connecting: 'bg-muted-foreground animate-pulse',\n live: 'bg-status-success',\n polling: 'bg-muted-foreground',\n};\n\nconst TEXT_CLASS: Record<LiveRefreshMode, string> = {\n connecting: 'text-muted-foreground',\n live: 'text-status-success-text',\n polling: 'text-muted-foreground',\n};\n\nexport function LiveStatus({\n mode,\n className = '',\n}: {\n mode: LiveRefreshMode | null;\n className?: string;\n}) {\n if (!mode) return null;\n return (\n <span\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"live-status\"\n className={`inline-flex items-center gap-1.5 text-xs ${TEXT_CLASS[mode]} ${className}`}\n >\n <span aria-hidden=\"true\" className={`h-1.5 w-1.5 shrink-0 rounded-full ${DOT_CLASS[mode]}`} />\n {LABEL[mode]}\n </span>\n );\n}\n"],"mappings":";;AAUA,IAAM,IAAyC;CAC7C,YAAY;CACZ,MAAM;CACN,SAAS;CACV,EAEK,IAA6C;CACjD,YAAY;CACZ,MAAM;CACN,SAAS;CACV,EAEK,IAA8C;CAClD,YAAY;CACZ,MAAM;CACN,SAAS;CACV;AAED,SAAgB,EAAW,EACzB,SACA,eAAY,MAIX;AAED,QADK,IAEH,kBAAC,QAAD;EACE,MAAK;EACL,aAAU;EACV,eAAY;EACZ,WAAW,4CAA4C,EAAW,GAAM,GAAG;YAJ7E,CAME,kBAAC,QAAD;GAAM,eAAY;GAAO,WAAW,qCAAqC,EAAU;GAAW,CAAA,EAC7F,EAAM,GACF;MAVS"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MilestoneControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/MilestoneControls.tsx"],"names":[],"mappings":"AAqBA;;;;GAIG;AAEH,eAAO,MAAM,kBAAkB,yEAMrB,CAAC;AA2BX,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,mGAAmG;IACnG,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,eAAe,CAAA;CAAE,2CAqFnF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MilestoneControls.js","names":[],"sources":["../../../src/planmagnet/controls/MilestoneControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Button,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\nimport { ScheduleMeetingDialog } from '../meetings/ScheduleMeetingDialog';\n\n/**\n * Milestone controls (BOFF-7953/7963). A milestone was created Pending and could never move: no status control,\n * no edit, no delete — so the In progress / Completed / Missed / Cancelled tabs could only be empty, and the\n * \"Completed\" date stayed \"—\". Completing now also records the date (service, 2026-09-27).\n */\n\nexport const MILESTONE_STATUSES = [\n 'PENDING',\n 'IN_PROGRESS',\n 'COMPLETED',\n 'MISSED',\n 'CANCELLED',\n] as const;\n\nconst MILESTONE_QUERIES = [\n 'GetMilestonesForDetail',\n 'GetMilestones',\n 'GetDashboardData',\n 'GetAnalyticsData',\n];\n\nconst UPDATE = gql`\n mutation MilestoneControlsUpdate($id: ID!, $input: PlanmagnetUpdateMilestoneInput!) {\n planmagnetUpdateMilestone(id: $id, input: $input) {\n id\n name\n description\n status\n dueDate\n completedAt\n }\n }\n`;\nconst DELETE = gql`\n mutation MilestoneControlsDelete($id: ID!) {\n planmagnetDeleteMilestone(id: $id)\n }\n`;\n\nexport interface MilestoneValues {\n id: string;\n name: string;\n description: string | null;\n status: string;\n dueDate: string | null;\n /** Needed to schedule a celebration/demo meeting against this milestone's own project (GAP-06). */\n projectId: string;\n}\n\nexport function MilestoneHeaderActions({ milestone }: { milestone: MilestoneValues }) {\n const navigate = usePlanMagnetNavigate();\n const [update, updateState] = useMutation(UPDATE, {\n refetchQueries: MILESTONE_QUERIES,\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: MILESTONE_QUERIES.filter((q) => q !== 'GetMilestonesForDetail'),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = updateState.loading || removeState.loading;\n const statuses = (MILESTONE_STATUSES as readonly string[]).includes(milestone.status)\n ? MILESTONE_STATUSES\n : [milestone.status, ...MILESTONE_STATUSES];\n\n const onStatus = async (status: string) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: milestone.id, input: { status } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The status could not be changed.');\n }\n };\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: milestone.id } }));\n navigate('/projects/milestones-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The milestone could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <select\n aria-label=\"Status\"\n data-testid=\"milestone-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={milestone.status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== milestone.status) void onStatus(e.target.value);\n }}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n <ScheduleMeetingDialog\n projectId={milestone.projectId}\n milestoneId={milestone.id}\n defaultKind=\"MILESTONE_CELEBRATION\"\n lockKind\n defaultTitle={`${milestone.name} celebration`}\n triggerLabel=\"Schedule celebration\"\n />\n <ScheduleMeetingDialog\n projectId={milestone.projectId}\n milestoneId={milestone.id}\n defaultKind=\"DEMO\"\n lockKind\n defaultTitle={`${milestone.name} demo`}\n triggerLabel=\"Schedule demo\"\n />\n <MilestoneEditDialog milestone={milestone} />\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete ${milestone.name}?`}\n description=\"The milestone is deleted. This cannot be undone here.\"\n confirmLabel=\"Delete milestone\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\nconst day = (iso: string | null) => (iso ? iso.slice(0, 10) : '');\n\n/** Name, description and due date. Only changed fields are sent; an emptied field is cleared. */\nfunction MilestoneEditDialog({ milestone }: { milestone: MilestoneValues }) {\n const initial = {\n name: milestone.name,\n description: milestone.description ?? '',\n dueDate: day(milestone.dueDate),\n };\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n const [update, state] = useMutation(UPDATE, {\n refetchQueries: MILESTONE_QUERIES,\n awaitRefetchQueries: true,\n });\n\n const save = async () => {\n setError(null);\n const input: Record<string, unknown> = {};\n if (form.name.trim() !== initial.name) input.name = form.name.trim();\n if (form.description.trim() !== initial.description.trim())\n input.description = form.description.trim() || null;\n if (form.dueDate !== initial.dueDate) input.dueDate = form.dueDate || null;\n if (Object.keys(input).length === 0) {\n setOpen(false);\n return;\n }\n try {\n await throwOnError(update({ variables: { id: milestone.id, input } }));\n setOpen(false);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The milestone could not be saved.');\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) setForm(initial);\n else setError(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"milestone-edit\">\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit milestone</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Change the name, description or due date.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"milestone-edit-name\" className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id=\"milestone-edit-name\"\n className=\"mt-1\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"milestone-edit-due\" className=\"text-sm font-medium\">\n Due date\n </label>\n <Input\n id=\"milestone-edit-due\"\n type=\"date\"\n className=\"mt-1\"\n value={form.dueDate}\n onChange={(e) => setForm({ ...form, dueDate: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"milestone-edit-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <textarea\n id=\"milestone-edit-description\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[72px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button onClick={() => void save()} disabled={form.name.trim() === '' || state.loading}>\n {state.loading ? 'Saving…' : 'Save'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectiveControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/ObjectiveControls.tsx"],"names":[],"mappings":"AAqBA;;;;GAIG;AAEH,eAAO,MAAM,kBAAkB,wDAAyD,CAAC;AAgCzF,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,EAAE,eAAe,CAAA;CAAE,2CAsCpF;AAgJD,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAAC,EACjC,WAAW,EACX,cAAc,EACd,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtE,2CA6EA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectiveControls.js","names":[],"sources":["../../../src/planmagnet/controls/ObjectiveControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport {\n Button,\n Input,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n ResponsiveDialogTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport { Link2, Pencil, X } from 'lucide-react';\nimport { throwOnError } from '../utils/mutationResult';\nimport { endBeforeStart } from '../utils/formValidation';\nimport { ErrorLine } from './ConfirmButton';\nimport { WorkItemSearchSelect } from './Pickers';\nimport { enumLabel } from './WorkItemControls';\n\n/**\n * Objective controls (BOFF-7956/7963). Objectives were created ACTIVE and could never be completed, cancelled or\n * edited, so the Draft/Completed/Cancelled tabs could only be empty; and key results could not be linked to work\n * items, so the linked-work-item rollup never appeared.\n */\n\nexport const OBJECTIVE_STATUSES = ['DRAFT', 'ACTIVE', 'COMPLETED', 'CANCELLED'] as const;\n\nconst OBJECTIVE_QUERIES = ['GetObjectiveDetail', 'GetObjectives'];\n\nconst UPDATE = gql`\n mutation ObjectiveControlsUpdate($id: ID!, $input: PlanmagnetUpdateObjectiveInput!) {\n planmagnetUpdateObjective(id: $id, input: $input) {\n id\n title\n description\n periodLabel\n startDate\n endDate\n status\n }\n }\n`;\nconst LINK = gql`\n mutation ObjectiveControlsLinkWorkItem($keyResultId: ID!, $workItemId: ID!) {\n planmagnetLinkKeyResultToWorkItem(keyResultId: $keyResultId, workItemId: $workItemId) {\n id\n }\n }\n`;\nconst UNLINK = gql`\n mutation ObjectiveControlsUnlinkWorkItem($keyResultId: ID!, $workItemId: ID!) {\n planmagnetUnlinkKeyResultFromWorkItem(keyResultId: $keyResultId, workItemId: $workItemId)\n }\n`;\n\nconst refetch = { refetchQueries: OBJECTIVE_QUERIES, awaitRefetchQueries: true };\n\nexport interface ObjectiveValues {\n id: string;\n title: string;\n description: string | null;\n periodLabel: string;\n startDate: string | null;\n endDate: string | null;\n status: string;\n}\n\n/** Status select and Edit for the objective header. */\nexport function ObjectiveHeaderControls({ objective }: { objective: ObjectiveValues }) {\n const [update, state] = useMutation(UPDATE, refetch);\n const [error, setError] = useState<string | null>(null);\n const statuses = (OBJECTIVE_STATUSES as readonly string[]).includes(objective.status)\n ? OBJECTIVE_STATUSES\n : [objective.status, ...OBJECTIVE_STATUSES];\n const onStatus = async (status: string) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: objective.id, input: { status } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The status could not be changed.');\n }\n };\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <div className=\"flex items-center gap-2\">\n <select\n aria-label=\"Objective status\"\n data-testid=\"objective-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={objective.status}\n disabled={state.loading}\n onChange={(e) => {\n if (e.target.value !== objective.status) void onStatus(e.target.value);\n }}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n <ObjectiveEditDialog objective={objective} />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\nconst day = (iso: string | null) => (iso ? iso.slice(0, 10) : '');\n\nfunction ObjectiveEditDialog({ objective }: { objective: ObjectiveValues }) {\n const initial = {\n title: objective.title,\n description: objective.description ?? '',\n periodLabel: objective.periodLabel,\n startDate: day(objective.startDate),\n endDate: day(objective.endDate),\n };\n const [open, setOpen] = useState(false);\n const [form, setForm] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n const [update, state] = useMutation(UPDATE, refetch);\n const invalidDates = endBeforeStart(form.startDate, form.endDate);\n const canSave =\n form.title.trim() !== '' && form.periodLabel.trim() !== '' && !invalidDates && !state.loading;\n\n const save = async () => {\n setError(null);\n const input: Record<string, unknown> = {};\n if (form.title.trim() !== initial.title) input.title = form.title.trim();\n if (form.periodLabel.trim() !== initial.periodLabel)\n input.periodLabel = form.periodLabel.trim();\n if (form.description.trim() !== initial.description.trim())\n input.description = form.description.trim() || null;\n if (form.startDate !== initial.startDate) input.startDate = form.startDate || null;\n if (form.endDate !== initial.endDate) input.endDate = form.endDate || null;\n if (Object.keys(input).length === 0) {\n setOpen(false);\n return;\n }\n try {\n await throwOnError(update({ variables: { id: objective.id, input } }));\n setOpen(false);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The objective could not be saved.');\n }\n };\n\n const label = 'text-sm font-medium';\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) setForm(initial);\n else setError(null);\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"objective-edit\">\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit objective</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Change the title, period or description.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"objective-edit-title\" className={label}>\n Title\n </label>\n <Input\n id=\"objective-edit-title\"\n className=\"mt-1\"\n value={form.title}\n onChange={(e) => setForm({ ...form, title: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"objective-edit-period\" className={label}>\n Period\n </label>\n <Input\n id=\"objective-edit-period\"\n className=\"mt-1\"\n placeholder=\"e.g. Q4 2026\"\n value={form.periodLabel}\n onChange={(e) => setForm({ ...form, periodLabel: e.target.value })}\n />\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor=\"objective-edit-start\" className={label}>\n Start date\n </label>\n <Input\n id=\"objective-edit-start\"\n type=\"date\"\n className=\"mt-1\"\n value={form.startDate}\n max={form.endDate || undefined}\n onChange={(e) => setForm({ ...form, startDate: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"objective-edit-end\" className={label}>\n End date\n </label>\n <Input\n id=\"objective-edit-end\"\n type=\"date\"\n className=\"mt-1\"\n value={form.endDate}\n min={form.startDate || undefined}\n onChange={(e) => setForm({ ...form, endDate: e.target.value })}\n />\n </div>\n </div>\n {invalidDates && <ErrorLine message=\"The end date is before the start date.\" />}\n <div>\n <label htmlFor=\"objective-edit-description\" className={label}>\n Description\n </label>\n <textarea\n id=\"objective-edit-description\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[72px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button onClick={() => void save()} disabled={!canSave}>\n {state.loading ? 'Saving…' : 'Save'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n/** The work items a key result is linked to, with unlink, and a picker to link another. */\nexport function KeyResultWorkItems({\n keyResultId,\n keyResultTitle,\n linked,\n}: {\n keyResultId: string;\n keyResultTitle: string;\n linked: { id: string; key: string; title: string; status: string }[];\n}) {\n const [link, linkState] = useMutation(LINK, refetch);\n const [unlink, unlinkState] = useMutation(UNLINK, refetch);\n const [adding, setAdding] = useState(false);\n const [choice, setChoice] = useState('');\n const [error, setError] = useState<string | null>(null);\n const busy = linkState.loading || unlinkState.loading;\n\n const run = async (mutate: typeof link, workItemId: string, after?: () => void) => {\n setError(null);\n try {\n await throwOnError(mutate({ variables: { keyResultId, workItemId } }));\n after?.();\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The link could not be changed.');\n }\n };\n\n return (\n <div className=\"space-y-2\" data-testid=\"kr-work-items\">\n {linked.length > 0 && (\n <ul className=\"space-y-1\">\n {linked.map((w) => (\n <li key={w.id} className=\"flex items-center justify-between gap-2 text-xs\">\n <span className=\"truncate\">\n <span className=\"font-medium\">{w.key}</span> {w.title}{' '}\n <span className=\"text-muted-foreground\">({enumLabel(w.status)})</span>\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-6 px-2\"\n aria-label={`Unlink ${w.key} from ${keyResultTitle}`}\n disabled={busy}\n onClick={() => void run(unlink, w.id)}\n >\n <X className=\"h-3 w-3\" />\n </Button>\n </li>\n ))}\n </ul>\n )}\n {adding ? (\n <div className=\"space-y-2 rounded-md border border-input p-2\">\n <WorkItemSearchSelect\n id={`kr-link-${keyResultId}`}\n value={choice}\n onChange={setChoice}\n exclude={linked.map((w) => w.id)}\n />\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n disabled={!choice || busy}\n onClick={() =>\n void run(link, choice, () => {\n setChoice('');\n setAdding(false);\n })\n }\n >\n Link\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAdding(false)}>\n Cancel\n </Button>\n </div>\n </div>\n ) : (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAdding(true)}>\n <Link2 className=\"mr-1 h-4 w-4\" />\n Link work item\n </Button>\n )}\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Pickers.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/Pickers.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Pickers.js","names":[],"sources":["../../../src/planmagnet/controls/Pickers.tsx"],"sourcesContent":["import { useDeferredValue, useEffect, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Input } from '@burdenoff/fe-libs/ui';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\n/**\n * Record pickers shared by forms and dialogs: a project select, and search-then-pick selects for work items and\n * docs. Values are record ids. Search runs on the server (never \"the first page, filtered in the browser\"), so a\n * record past the first page can still be found.\n */\n\nconst selectClass =\n 'w-full rounded-md border border-input bg-background px-3 py-2 text-sm disabled:opacity-60';\n\nconst PICKER_PROJECTS = gql`\n query PickerProjects($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n totalCount\n }\n }\n`;\n\n/** Projects are read page by page up to this many, so the picker never silently stops at the first 100. */\nconst MAX_PROJECT_OPTIONS = 500;\n\n/** A project select. '' means \"no project\" when `noneLabel` is given. `exclude` hides ids already spoken for. */\nexport function ProjectSelect({\n id,\n value,\n onChange,\n noneLabel,\n exclude = [],\n disabled = false,\n}: {\n id?: string;\n value: string;\n onChange: (projectId: string) => void;\n noneLabel?: string;\n exclude?: string[];\n disabled?: boolean;\n}) {\n const { workspaceId } = usePlanMagnet();\n const { data, loading, error, fetchMore } = useQuery<{\n planmagnetProjects: {\n items: { id: string; name: string }[];\n pageInfo: { hasNextPage: boolean; endCursor: string | null };\n totalCount: number;\n };\n }>(PICKER_PROJECTS, {\n variables: { workspaceId: workspaceId ?? '', pagination: { first: 100 } },\n skip: !workspaceId,\n });\n const loaded = data?.planmagnetProjects.items ?? [];\n const hasNextPage = data?.planmagnetProjects.pageInfo.hasNextPage ?? false;\n const endCursor = data?.planmagnetProjects.pageInfo.endCursor ?? null;\n useEffect(() => {\n if (!hasNextPage || !endCursor || loaded.length >= MAX_PROJECT_OPTIONS) return;\n fetchMore({\n variables: { pagination: { first: 100, after: endCursor } },\n updateQuery: (prev, { fetchMoreResult }) => ({\n planmagnetProjects: {\n ...fetchMoreResult.planmagnetProjects,\n items: [...prev.planmagnetProjects.items, ...fetchMoreResult.planmagnetProjects.items],\n },\n }),\n }).catch(() => {\n // A failed extra page leaves the projects already loaded usable.\n });\n }, [hasNextPage, endCursor, loaded.length, fetchMore]);\n const projects = loaded.filter((p) => !exclude.includes(p.id));\n return (\n <select\n id={id}\n className={selectClass}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n {noneLabel !== undefined && <option value=\"\">{noneLabel}</option>}\n {projects.length === 0 && noneLabel === undefined && (\n <option value=\"\">\n {loading && !data\n ? 'Loading projects…'\n : error\n ? 'Projects could not be loaded'\n : 'No projects yet'}\n </option>\n )}\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n {/* Never a silent cut-off: say so when the workspace has more projects than the picker lists. */}\n {hasNextPage && loaded.length >= MAX_PROJECT_OPTIONS && (\n <option value=\"\" disabled>\n {`Only the first ${MAX_PROJECT_OPTIONS} projects are listed`}\n </option>\n )}\n </select>\n );\n}\n\nconst PICKER_TEAMS = gql`\n query PickerTeams($workspaceId: ID!) {\n planmagnetTeams(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`;\n\n/**\n * A team select (BOFF-8044). '' means \"no team\" when `noneLabel` is given. `exclude` hides teams already spoken for\n * (PRM-01: the teams already linked to a product).\n */\nexport function TeamSelect({\n id,\n value,\n onChange,\n noneLabel,\n exclude = [],\n disabled = false,\n}: {\n id?: string;\n value: string;\n onChange: (teamId: string) => void;\n noneLabel?: string;\n exclude?: string[];\n disabled?: boolean;\n}) {\n const { workspaceId } = usePlanMagnet();\n const { data, loading, error } = useQuery<{\n planmagnetTeams: { items: { id: string; name: string }[]; totalCount: number };\n }>(PICKER_TEAMS, { variables: { workspaceId: workspaceId ?? '' }, skip: !workspaceId });\n const teams = (data?.planmagnetTeams.items ?? []).filter((t) => !exclude.includes(t.id));\n return (\n <select\n id={id}\n aria-label={id ? undefined : 'Team'}\n className={selectClass}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n {noneLabel !== undefined && (\n <option value=\"\">\n {/* Only when something was excluded: '' keeps its caller's meaning (\"All teams\") otherwise. */}\n {exclude.length > 0 && data && teams.length === 0 ? 'No other team to choose' : noneLabel}\n </option>\n )}\n {teams.length === 0 && noneLabel === undefined && (\n <option value=\"\">\n {loading && !data\n ? 'Loading teams…'\n : error\n ? 'Teams could not be loaded'\n : 'No teams yet'}\n </option>\n )}\n {teams.map((t) => (\n <option key={t.id} value={t.id}>\n {t.name}\n </option>\n ))}\n </select>\n );\n}\n\nconst PICKER_SPRINTS = gql`\n query PickerSprints($workspaceId: ID!, $filter: PlanmagnetSprintFilter) {\n planmagnetSprints(workspaceId: $workspaceId, filter: $filter, pagination: { first: 100 }) {\n items {\n id\n name\n status\n }\n totalCount\n }\n }\n`;\n\n/** A sprint select, optionally scoped to one project (report-builder widgets: BURNDOWN reads one sprint). '' means\n * \"no sprint\" when `noneLabel` is given. */\nexport function SprintSelect({\n id,\n value,\n onChange,\n projectId,\n noneLabel,\n disabled = false,\n}: {\n id?: string;\n value: string;\n onChange: (sprintId: string) => void;\n projectId?: string;\n noneLabel?: string;\n disabled?: boolean;\n}) {\n const { workspaceId } = usePlanMagnet();\n const { data, loading, error } = useQuery<{\n planmagnetSprints: {\n items: { id: string; name: string; status: string }[];\n totalCount: number;\n };\n }>(PICKER_SPRINTS, {\n variables: { workspaceId: workspaceId ?? '', filter: projectId ? { projectId } : undefined },\n skip: !workspaceId,\n });\n const sprints = data?.planmagnetSprints.items ?? [];\n return (\n <select\n id={id}\n aria-label={id ? undefined : 'Sprint'}\n className={selectClass}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n {noneLabel !== undefined && <option value=\"\">{noneLabel}</option>}\n {sprints.length === 0 && noneLabel === undefined && (\n <option value=\"\">\n {loading && !data\n ? 'Loading sprints…'\n : error\n ? 'Sprints could not be loaded'\n : 'No sprints yet'}\n </option>\n )}\n {sprints.map((s) => (\n <option key={s.id} value={s.id}>\n {s.name} ({s.status.toLowerCase()})\n </option>\n ))}\n </select>\n );\n}\n\nconst PICKER_WORK_ITEMS = gql`\n query PickerWorkItems($workspaceId: ID!, $filter: PlanmagnetWorkItemFilter) {\n planmagnetWorkItems(workspaceId: $workspaceId, filter: $filter, pagination: { first: 20 }) {\n items {\n id\n key\n title\n }\n totalCount\n }\n }\n`;\n\n/**\n * Search, then pick one work item. The server matches the key, title and description. `exclude` hides items that are\n * already linked (the result says how many more exist, so an empty list never claims \"nothing left\" falsely).\n */\nexport function WorkItemSearchSelect({\n id,\n projectId,\n value,\n onChange,\n exclude = [],\n}: {\n id: string;\n projectId?: string;\n value: string;\n onChange: (workItemId: string) => void;\n exclude?: string[];\n}) {\n const { workspaceId } = usePlanMagnet();\n const [search, setSearch] = useState('');\n const deferred = useDeferredValue(search.trim());\n const { data, loading } = useQuery<{\n planmagnetWorkItems: {\n items: { id: string; key: string; title: string }[];\n totalCount: number;\n };\n }>(PICKER_WORK_ITEMS, {\n variables: {\n workspaceId: workspaceId ?? '',\n filter: { ...(deferred && { search: deferred }), ...(projectId && { projectId }) },\n },\n skip: !workspaceId,\n });\n const found = data?.planmagnetWorkItems.items ?? [];\n const items = found.filter((w) => !exclude.includes(w.id));\n const total = data?.planmagnetWorkItems.totalCount ?? 0;\n return (\n <div className=\"space-y-1\">\n <Input\n aria-label=\"Search work items\"\n placeholder=\"Search by key or title\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <select\n id={id}\n className={selectClass}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">\n {loading && !data ? 'Searching…' : items.length ? 'Choose a work item' : 'No match'}\n </option>\n {/* The current value stays selectable (and visible) when it is not in this page of results. */}\n {value && !items.some((w) => w.id === value) && (\n <option value={value}>Currently linked work item</option>\n )}\n {items.map((w) => (\n <option key={w.id} value={w.id}>\n {w.key} — {w.title}\n </option>\n ))}\n </select>\n {total > found.length && (\n <p className=\"text-xs text-muted-foreground\">\n Showing {found.length} of {total} — type to narrow the list.\n </p>\n )}\n </div>\n );\n}\n\nconst PICKER_DOCS = gql`\n query PickerDocs($workspaceId: String, $filter: PlanmagnetDocFilter) {\n planmagnetDocs(workspaceId: $workspaceId, filter: $filter, pagination: { first: 20 }) {\n items {\n id\n title\n }\n totalCount\n }\n }\n`;\n\n/** Search, then pick one doc. */\nexport function DocSearchSelect({\n id,\n value,\n onChange,\n exclude = [],\n}: {\n id: string;\n value: string;\n onChange: (docId: string) => void;\n exclude?: string[];\n}) {\n const { workspaceId } = usePlanMagnet();\n const [search, setSearch] = useState('');\n const deferred = useDeferredValue(search.trim());\n const { data, loading } = useQuery<{\n planmagnetDocs: { items: { id: string; title: string }[]; totalCount: number };\n }>(PICKER_DOCS, {\n variables: {\n workspaceId: workspaceId ?? '',\n filter: deferred ? { search: deferred } : undefined,\n },\n skip: !workspaceId,\n });\n const found = data?.planmagnetDocs.items ?? [];\n const docs = found.filter((d) => !exclude.includes(d.id));\n const total = data?.planmagnetDocs.totalCount ?? 0;\n return (\n <div className=\"space-y-1\">\n <Input\n aria-label=\"Search docs\"\n placeholder=\"Search docs by title\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <select\n id={id}\n className={selectClass}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">\n {loading && !data ? 'Searching…' : docs.length ? 'Choose a doc' : 'No match'}\n </option>\n {docs.map((d) => (\n <option key={d.id} value={d.id}>\n {d.title}\n </option>\n ))}\n </select>\n {total > found.length && (\n <p className=\"text-xs text-muted-foreground\">\n Showing {found.length} of {total} — type to narrow the list.\n </p>\n )}\n </div>\n );\n}\n\nconst PICKER_PROGRAMS = gql`\n query PickerPrograms($workspaceId: ID!) {\n planmagnetPrograms(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`;\n\n/** A program select. '' means \"no program\" when `noneLabel` is given. */\nexport function ProgramSelect({\n id,\n value,\n onChange,\n noneLabel,\n}: {\n id?: string;\n value: string;\n onChange: (programId: string) => void;\n noneLabel?: string;\n}) {\n const { workspaceId } = usePlanMagnet();\n const { data, loading, error } = useQuery<{\n planmagnetPrograms: { items: { id: string; name: string }[]; totalCount: number };\n }>(PICKER_PROGRAMS, { variables: { workspaceId: workspaceId ?? '' }, skip: !workspaceId });\n const programs = data?.planmagnetPrograms.items ?? [];\n return (\n <select\n id={id}\n className={selectClass}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n {noneLabel !== undefined && <option value=\"\">{noneLabel}</option>}\n {programs.length === 0 && noneLabel === undefined && (\n <option value=\"\">\n {loading && !data\n ? 'Loading programs…'\n : error\n ? 'Programs could not be loaded'\n : 'No programs yet'}\n </option>\n )}\n {programs.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n );\n}\n\nconst PICKER_PORTFOLIOS = gql`\n query PickerPortfolios($workspaceId: ID!) {\n planmagnetPortfolios(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`;\n\n/** A portfolio select (BOFF-8047). '' means \"no portfolio\" when `noneLabel` is given. */\nexport function PortfolioSelect({\n id,\n value,\n onChange,\n noneLabel,\n}: {\n id?: string;\n value: string;\n onChange: (portfolioId: string) => void;\n noneLabel?: string;\n}) {\n const { workspaceId } = usePlanMagnet();\n const { data, loading, error } = useQuery<{\n planmagnetPortfolios: { items: { id: string; name: string }[]; totalCount: number };\n }>(PICKER_PORTFOLIOS, { variables: { workspaceId: workspaceId ?? '' }, skip: !workspaceId });\n const portfolios = data?.planmagnetPortfolios.items ?? [];\n return (\n <select\n id={id}\n className={selectClass}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n {noneLabel !== undefined && <option value=\"\">{noneLabel}</option>}\n {portfolios.length === 0 && noneLabel === undefined && (\n <option value=\"\">\n {loading && !data\n ? 'Loading portfolios…'\n : error\n ? 'Portfolios could not be loaded'\n : 'No portfolios yet'}\n </option>\n )}\n {portfolios.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n );\n}\n\nconst PICKER_COMPETITORS = gql`\n query PickerCompetitors($workspaceId: ID!, $filter: PlanmagnetCompetitorFilter) {\n planmagnetCompetitors(workspaceId: $workspaceId, filter: $filter, pagination: { first: 20 }) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`;\n\n/** Search, then pick one competitor. `exclude` hides competitors already linked. */\nexport function CompetitorSearchSelect({\n id,\n value,\n onChange,\n exclude = [],\n}: {\n id: string;\n value: string;\n onChange: (competitorId: string) => void;\n exclude?: string[];\n}) {\n const { workspaceId } = usePlanMagnet();\n const [search, setSearch] = useState('');\n const deferred = useDeferredValue(search.trim());\n const { data, loading } = useQuery<{\n planmagnetCompetitors: { items: { id: string; name: string }[]; totalCount: number };\n }>(PICKER_COMPETITORS, {\n variables: {\n workspaceId: workspaceId ?? '',\n filter: deferred ? { search: deferred } : undefined,\n },\n skip: !workspaceId,\n });\n const found = data?.planmagnetCompetitors.items ?? [];\n const competitors = found.filter((c) => !exclude.includes(c.id));\n const total = data?.planmagnetCompetitors.totalCount ?? 0;\n return (\n <div className=\"space-y-1\">\n <Input\n aria-label=\"Search competitors\"\n placeholder=\"Search competitors by name\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n <select\n id={id}\n className={selectClass}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">\n {loading && !data\n ? 'Searching…'\n : competitors.length\n ? 'Choose a competitor'\n : 'No match'}\n </option>\n {competitors.map((c) => (\n <option key={c.id} value={c.id}>\n {c.name}\n </option>\n ))}\n </select>\n {total > found.length && (\n <p className=\"text-xs text-muted-foreground\">\n Showing {found.length} of {total} — type to narrow the list.\n </p>\n )}\n </div>\n );\n}\n\nconst PICKER_PRODUCTS = gql`\n query PickerProducts($workspaceId: ID!) {\n planmagnetProducts(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`;\n\n/** A product select (PRM-27). '' means \"every product\" when `noneLabel` is given. */\nexport function ProductSelect({\n id,\n value,\n onChange,\n noneLabel,\n}: {\n id?: string;\n value: string;\n onChange: (productId: string) => void;\n noneLabel?: string;\n}) {\n const { workspaceId } = usePlanMagnet();\n const { data, loading, error } = useQuery<{\n planmagnetProducts: { items: { id: string; name: string }[]; totalCount: number };\n }>(PICKER_PRODUCTS, { variables: { workspaceId: workspaceId ?? '' }, skip: !workspaceId });\n const products = data?.planmagnetProducts.items ?? [];\n return (\n <select\n id={id}\n className={selectClass}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n {noneLabel !== undefined && <option value=\"\">{noneLabel}</option>}\n {products.length === 0 && noneLabel === undefined && (\n <option value=\"\">\n {loading && !data\n ? 'Loading products…'\n : error\n ? 'Products could not be loaded'\n : 'No products yet'}\n </option>\n )}\n {products.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n );\n}\n\nconst PICKER_ROADMAPS = gql`\n query PickerRoadmaps($workspaceId: ID!, $filter: PlanmagnetRoadmapFilter) {\n planmagnetRoadmaps(workspaceId: $workspaceId, filter: $filter, pagination: { first: 100 }) {\n items {\n id\n name\n }\n totalCount\n }\n }\n`;\n\n/**\n * A roadmap select (PRM-27). '' means \"every roadmap\" when `noneLabel` is given. `productId` narrows the list\n * to that product's roadmaps, same filter FeatureInitiativeCard uses for its own roadmap picker.\n */\nexport function RoadmapSelect({\n id,\n value,\n onChange,\n noneLabel,\n productId,\n}: {\n id?: string;\n value: string;\n onChange: (roadmapId: string) => void;\n noneLabel?: string;\n productId?: string;\n}) {\n const { workspaceId } = usePlanMagnet();\n const { data, loading, error } = useQuery<{\n planmagnetRoadmaps: { items: { id: string; name: string }[]; totalCount: number };\n }>(PICKER_ROADMAPS, {\n variables: { workspaceId: workspaceId ?? '', filter: productId ? { productId } : undefined },\n skip: !workspaceId,\n });\n const roadmaps = data?.planmagnetRoadmaps.items ?? [];\n return (\n <select\n id={id}\n className={selectClass}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n >\n {noneLabel !== undefined && <option value=\"\">{noneLabel}</option>}\n {roadmaps.length === 0 && noneLabel === undefined && (\n <option value=\"\">\n {loading && !data\n ? 'Loading roadmaps…'\n : error\n ? 'Roadmaps could not be loaded'\n : 'No roadmaps yet'}\n </option>\n )}\n {roadmaps.map((r) => (\n <option key={r.id} value={r.id}>\n {r.name}\n </option>\n ))}\n </select>\n );\n}\n\nconst PICKER_CREW_EMPLOYEES = gql`\n query PickerCrewEmployees($pagination: PaginationInput) {\n crewEmployees(pagination: $pagination) {\n id\n firstName\n lastName\n email\n }\n }\n`;\n\n/** CrewFoundry's roster is normally a few hundred people at most; past this the search box narrows what the\n * select shows rather than ever paging further. */\nconst MAX_CREW_EMPLOYEE_OPTIONS = 200;\n\n/**\n * Search (client-side — `CrewEmployeeFilterInput` has no text-search field of its own), then pick one\n * CrewFoundry employee (CWF-30). Unlike every other picker in this file this one never takes a `workspaceId`\n * variable: `crewEmployees` resolves the roster from the caller's own `x-workspace-id` header, same as the rest\n * of the CrewFoundry subgraph. An unreachable CrewFoundry, or an empty roster, surfaces as an empty list here\n * rather than a page crash. (`planmagnetSprintCapacity` tells the two apart on the read side: its\n * `crewfoundryUnavailable` means only that the roster could not be read; an empty roster is not unavailable.)\n */\nexport function CrewEmployeeSelect({\n id,\n value,\n onChange,\n noneLabel,\n disabled = false,\n}: {\n id?: string;\n value: string;\n onChange: (crewEmployeeId: string) => void;\n noneLabel?: string;\n disabled?: boolean;\n}) {\n const [search, setSearch] = useState('');\n const deferred = useDeferredValue(search.trim().toLowerCase());\n const { data, loading, error } = useQuery<{\n crewEmployees: { id: string; firstName: string; lastName: string; email: string }[];\n }>(PICKER_CREW_EMPLOYEES, {\n variables: { pagination: { limit: MAX_CREW_EMPLOYEE_OPTIONS } },\n });\n const loaded = error ? [] : (data?.crewEmployees ?? []);\n const employees = deferred\n ? loaded.filter(\n (e) =>\n `${e.firstName} ${e.lastName}`.toLowerCase().includes(deferred) ||\n e.email.toLowerCase().includes(deferred)\n )\n : loaded;\n return (\n <div className=\"space-y-1\">\n <Input\n aria-label=\"Search CrewFoundry employees\"\n placeholder=\"Search by name or e-mail\"\n value={search}\n disabled={disabled}\n onChange={(e) => setSearch(e.target.value)}\n />\n <select\n id={id}\n className={selectClass}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n {noneLabel !== undefined && <option value=\"\">{noneLabel}</option>}\n {employees.length === 0 && noneLabel === undefined && (\n <option value=\"\">\n {loading && !data ? 'Loading…' : error ? 'CrewFoundry roster unavailable' : 'No match'}\n </option>\n )}\n {employees.map((e) => (\n <option key={e.id} value={e.id}>\n {e.firstName} {e.lastName} — {e.email}\n </option>\n ))}\n </select>\n {!deferred && loaded.length >= MAX_CREW_EMPLOYEE_OPTIONS && (\n <p className=\"text-xs text-muted-foreground\">\n Showing the first {MAX_CREW_EMPLOYEE_OPTIONS} employees — type to narrow the list.\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PortfolioControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/PortfolioControls.tsx"],"names":[],"mappings":"AAWA;;;GAGG;AAEH,eAAO,MAAM,kBAAkB,sDAAuD,CAAC;AAEvF,iHAAiH;AACjH,eAAO,MAAM,oBAAoB,+KAUvB,CAAC;AAuBX,wBAAgB,sBAAsB,CAAC,EACrC,WAAW,EACX,IAAI,EACJ,MAAM,GACP,EAAE;IACD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,2CA+EA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PortfolioControls.js","names":[],"sources":["../../../src/planmagnet/controls/PortfolioControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\n\n/**\n * Portfolio controls (BOFF-8047). Portfolios were `api-only` — full CRUD and the overview roll-up existed in\n * the service (BOFF-7704, BOFF-7934) but had zero routes anywhere in the UI.\n */\n\nexport const PORTFOLIO_STATUSES = ['ACTIVE', 'ON_HOLD', 'CLOSED', 'ARCHIVED'] as const;\n\n/** Every StrategicAlignment value. CUSTOM requires `alignmentLabel` — the service refuses CUSTOM without one. */\nexport const STRATEGIC_ALIGNMENTS = [\n 'REVENUE_GROWTH',\n 'COST_REDUCTION',\n 'CUSTOMER_SATISFACTION',\n 'INNOVATION',\n 'COMPLIANCE',\n 'OPERATIONAL_EXCELLENCE',\n 'MARKET_EXPANSION',\n 'RISK_MITIGATION',\n 'CUSTOM',\n] as const;\n\nconst PORTFOLIO_QUERIES = [\n 'ListPortfolios',\n 'GetPortfolio',\n 'GetPortfolioForEdit',\n 'GetPortfolioOverview',\n];\n\nconst UPDATE_STATUS = gql`\n mutation PortfolioControlsStatus($id: ID!, $input: PlanmagnetUpdatePortfolioInput!) {\n planmagnetUpdatePortfolio(id: $id, input: $input) {\n id\n status\n }\n }\n`;\nconst DELETE = gql`\n mutation PortfolioControlsDelete($id: ID!) {\n planmagnetDeletePortfolio(id: $id)\n }\n`;\n\nexport function PortfolioHeaderActions({\n portfolioId,\n name,\n status,\n}: {\n portfolioId: string;\n name: string;\n status: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [updateStatus, statusState] = useMutation(UPDATE_STATUS, {\n refetchQueries: PORTFOLIO_QUERIES,\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: PORTFOLIO_QUERIES.filter(\n (q) => q !== 'GetPortfolio' && q !== 'GetPortfolioOverview'\n ),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = statusState.loading || removeState.loading;\n const statuses = (PORTFOLIO_STATUSES as readonly string[]).includes(status)\n ? PORTFOLIO_STATUSES\n : [status, ...PORTFOLIO_STATUSES];\n\n const onStatus = async (next: string) => {\n setError(null);\n try {\n await throwOnError(updateStatus({ variables: { id: portfolioId, input: { status: next } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The status could not be changed.');\n }\n };\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: portfolioId } }));\n navigate('/products/portfolios-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The portfolio could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <select\n aria-label=\"Portfolio status\"\n data-testid=\"portfolio-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== status) void onStatus(e.target.value);\n }}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"portfolio-edit\"\n onClick={() => navigate(detailPath('/products/edit-portfolio-page', portfolioId))}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete portfolio ${name}?`}\n description=\"The portfolio is deleted. Programs and projects it groups are not deleted. This cannot be undone here.\"\n confirmLabel=\"Delete portfolio\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAgBA,IAAa,IAAqB;CAAC;CAAU;CAAW;CAAU;CAAW,EAGhE,IAAuB;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAAoB;CACxB;CACA;CACA;CACA;CACD,EAEK,IAAgB,CAAG;;;;;;;GAQnB,IAAS,CAAG;;;;;AAMlB,SAAgB,EAAuB,EACrC,gBACA,SACA,aAKC;CACD,IAAM,IAAW,GAAuB,EAClC,CAAC,GAAc,KAAe,EAAY,GAAe;EAC7D,gBAAgB;EAChB,qBAAqB;EACtB,CAAC,EACI,CAAC,GAAQ,KAAe,EAAY,GAAQ;EAChD,gBAAgB,EAAkB,QAC/B,MAAM,MAAM,kBAAkB,MAAM,uBACtC;EACD,SAAS;EACV,CAAC,EACI,CAAC,GAAO,KAAY,EAAwB,KAAK,EACjD,IAAO,EAAY,WAAW,EAAY,SAC1C,IAAY,EAAyC,SAAS,EAAO,GACvE,IACA,CAAC,GAAQ,GAAG,EAAmB,EAE7B,IAAW,OAAO,MAAiB;AACvC,IAAS,KAAK;AACd,MAAI;AACF,SAAM,EAAa,EAAa,EAAE,WAAW;IAAE,IAAI;IAAa,OAAO,EAAE,QAAQ,GAAM;IAAE,EAAE,CAAC,CAAC;WACtF,GAAG;AACV,KAAS,aAAa,QAAQ,EAAE,UAAU,mCAAmC;;IAG3E,IAAW,YAAY;AAC3B,IAAS,KAAK;AACd,MAAI;AAEF,GADA,MAAM,EAAa,EAAO,EAAE,WAAW,EAAE,IAAI,GAAa,EAAE,CAAC,CAAC,EAC9D,EAAS,4BAA4B;WAC9B,GAAG;AACV,KAAS,aAAa,QAAQ,EAAE,UAAU,sCAAsC;;;AAIpF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,UAAD;KACE,cAAW;KACX,eAAY;KACZ,WAAU;KACV,OAAO;KACP,UAAU;KACV,WAAW,MAAM;AACf,MAAI,EAAE,OAAO,UAAU,KAAa,EAAS,EAAE,OAAO,MAAM;;eAG7D,EAAS,KAAK,MACb,kBAAC,UAAD;MAAgB,OAAO;gBACpB,EAAU,EAAE;MACN,EAFI,EAEJ,CACT;KACK,CAAA;IACT,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,eAAY;KACZ,eAAe,EAAS,EAAW,iCAAiC,EAAY,CAAC;eAJnF,CAME,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,OAE5B;;IACT,kBAAC,GAAD;KACE,OAAM;KACN,SAAQ;KACR,MAAM,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA;KACzC,OAAO,oBAAoB,EAAK;KAChC,aAAY;KACZ,cAAa;KACb,aAAA;KACA,UAAU;KACV,iBAAiB,KAAK,GAAU;KAChC,CAAA;IACE;MACL,KAAS,kBAAC,GAAD,EAAW,SAAS,GAAS,CAAA,CACnC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrioritizationControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/PrioritizationControls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PrioritizationControls.js","names":[],"sources":["../../../src/planmagnet/controls/PrioritizationControls.tsx"],"sourcesContent":["import { Badge, Input } from '@burdenoff/fe-libs/ui';\nimport { parseIntField } from '../utils/formValidation';\nimport { ErrorLine } from './ConfirmButton';\n\n/**\n * Prioritization (PRM-27): MoSCoW, Kano and Value-vs-Effort scoring shared by the feature request create/edit\n * form, the feature detail page, and the roadmap initiative (RoadmapItem) edit dialog — one presentational form\n * fragment plus the badge that shows the server-computed Value-vs-Effort quadrant, so the three surfaces (and the\n * prioritization page's own item cards) render it identically instead of three near-copies drifting apart.\n *\n * The quadrant itself is never computed client-side — `FeatureRequest.valueEffortQuadrant` /\n * `RoadmapItem.valueEffortQuadrant` are server-derived (and not stored), so `QuadrantBadge` only ever renders a\n * value that came back from a query or a mutation response.\n */\n\nexport const MOSCOW_VALUES = ['MUST', 'SHOULD', 'COULD', 'WONT'] as const;\nexport type MoscowValue = (typeof MOSCOW_VALUES)[number];\n\nexport const KANO_VALUES = ['BASIC', 'PERFORMANCE', 'DELIGHTER', 'INDIFFERENT', 'REVERSE'] as const;\nexport type KanoValue = (typeof KANO_VALUES)[number];\n\nexport const QUADRANT_VALUES = ['QUICK_WIN', 'MAJOR_PROJECT', 'FILL_IN', 'TIME_SINK'] as const;\nexport type QuadrantValue = (typeof QUADRANT_VALUES)[number];\n\ntype BadgeVariant =\n | 'default'\n | 'success'\n | 'warning'\n | 'info'\n | 'secondary'\n | 'destructive'\n | 'outline';\n\nexport const MOSCOW_META: Record<\n MoscowValue,\n { label: string; hint: string; variant: BadgeVariant }\n> = {\n MUST: {\n label: 'Must',\n hint: 'Non-negotiable — the release does not ship without it.',\n variant: 'default',\n },\n SHOULD: {\n label: 'Should',\n hint: 'Important, but the release can still ship without it.',\n variant: 'info',\n },\n COULD: { label: 'Could', hint: 'Nice to have if there is time.', variant: 'secondary' },\n WONT: { label: \"Won't\", hint: 'Explicitly out of scope this time around.', variant: 'outline' },\n};\n\nexport const KANO_META: Record<KanoValue, { label: string; hint: string; variant: BadgeVariant }> =\n {\n BASIC: {\n label: 'Basic',\n hint: 'Expected — its absence causes dissatisfaction, its presence goes unnoticed.',\n variant: 'secondary',\n },\n PERFORMANCE: {\n label: 'Performance',\n hint: 'Satisfaction scales with how well it is delivered.',\n variant: 'info',\n },\n DELIGHTER: {\n label: 'Delighter',\n hint: 'Unexpected — its absence is not missed, its presence delights.',\n variant: 'success',\n },\n INDIFFERENT: {\n label: 'Indifferent',\n hint: 'Users do not care either way.',\n variant: 'outline',\n },\n REVERSE: {\n label: 'Reverse',\n hint: 'Some users prefer this NOT be there.',\n variant: 'destructive',\n },\n };\n\nexport const QUADRANT_META: Record<\n QuadrantValue,\n { label: string; hint: string; variant: BadgeVariant }\n> = {\n QUICK_WIN: {\n label: 'Quick win',\n hint: 'High value, low effort (value ≥ 6, effort ≤ 5) — do these first.',\n variant: 'success',\n },\n MAJOR_PROJECT: {\n label: 'Major project',\n hint: 'High value, high effort (value ≥ 6, effort ≥ 6) — plan and staff deliberately.',\n variant: 'info',\n },\n FILL_IN: {\n label: 'Fill-in',\n hint: 'Low value, low effort (value ≤ 5, effort ≤ 5) — fine as filler work.',\n variant: 'secondary',\n },\n TIME_SINK: {\n label: 'Time sink',\n hint: 'Low value, high effort (value ≤ 5, effort ≥ 6) — avoid or deprioritize.',\n variant: 'destructive',\n },\n};\n\nexport const moscowLabel = (value: string | null | undefined): string =>\n value && value in MOSCOW_META ? MOSCOW_META[value as MoscowValue].label : 'Not set';\nexport const kanoLabel = (value: string | null | undefined): string =>\n value && value in KANO_META ? KANO_META[value as KanoValue].label : 'Not set';\nexport const quadrantLabel = (value: string | null | undefined): string =>\n value && value in QUADRANT_META ? QUADRANT_META[value as QuadrantValue].label : 'Unscored';\n\n/**\n * The Value-vs-Effort quadrant, read back from the server (`FeatureRequest.valueEffortQuadrant` /\n * `RoadmapItem.valueEffortQuadrant` / a `PlanmagnetPrioritizationBucket.bucket`) — never computed here. Renders\n * an \"Unscored\" badge when null (one or both of valueScore/effortScore is not set yet) unless `hideWhenUnscored`.\n */\nexport function QuadrantBadge({\n quadrant,\n hideWhenUnscored = false,\n className,\n}: {\n quadrant: string | null | undefined;\n hideWhenUnscored?: boolean;\n className?: string;\n}) {\n if (!quadrant) {\n if (hideWhenUnscored) return null;\n return (\n <Badge variant=\"outline\" className={className} data-testid=\"prio-quadrant-badge\">\n Unscored\n </Badge>\n );\n }\n const meta = quadrant in QUADRANT_META ? QUADRANT_META[quadrant as QuadrantValue] : null;\n return (\n <Badge\n variant={meta?.variant ?? 'outline'}\n className={className}\n data-testid=\"prio-quadrant-badge\"\n >\n {meta?.label ?? quadrant}\n </Badge>\n );\n}\n\nexport interface PrioritizationFormValues {\n /** '' = not set */\n moscow: string;\n /** '' = not set */\n kano: string;\n /** '' = not set, else a whole number 1-10 as text */\n valueScore: string;\n /** '' = not set, else a whole number 1-10 as text */\n effortScore: string;\n}\n\nexport const EMPTY_PRIORITIZATION_FORM: PrioritizationFormValues = {\n moscow: '',\n kano: '',\n valueScore: '',\n effortScore: '',\n};\n\nconst selectClass =\n 'mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm disabled:opacity-60';\n\n/**\n * The four prioritization inputs (PRM-27): MoSCoW and Kano selects (each with a short explanation of the\n * selected value), and 1-10 value/effort number inputs. Fully controlled; clearing a select or number input back\n * to empty is how a caller sends `null` (cleared) rather than omitting the field. Shared by the feature request\n * create/edit form, the feature detail page, and the roadmap initiative edit dialog.\n */\nexport function PrioritizationScoreFields({\n idPrefix,\n values,\n onChange,\n disabled = false,\n}: {\n idPrefix: string;\n values: PrioritizationFormValues;\n onChange: (next: PrioritizationFormValues) => void;\n disabled?: boolean;\n}) {\n const value = parseIntField(values.valueScore, { min: 1, max: 10 });\n const effort = parseIntField(values.effortScore, { min: 1, max: 10 });\n\n return (\n <div className=\"space-y-3\" data-testid=\"prio-fields\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor={`${idPrefix}-moscow`} className=\"text-sm font-medium\">\n MoSCoW\n </label>\n <select\n id={`${idPrefix}-moscow`}\n data-testid=\"prio-field-moscow\"\n className={selectClass}\n value={values.moscow}\n disabled={disabled}\n onChange={(e) => onChange({ ...values, moscow: e.target.value })}\n >\n <option value=\"\">Not set</option>\n {MOSCOW_VALUES.map((v) => (\n <option key={v} value={v}>\n {MOSCOW_META[v].label}\n </option>\n ))}\n </select>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {values.moscow && values.moscow in MOSCOW_META\n ? MOSCOW_META[values.moscow as MoscowValue].hint\n : \"Must/Should/Could/Won't for this release.\"}\n </p>\n </div>\n <div>\n <label htmlFor={`${idPrefix}-kano`} className=\"text-sm font-medium\">\n Kano\n </label>\n <select\n id={`${idPrefix}-kano`}\n data-testid=\"prio-field-kano\"\n className={selectClass}\n value={values.kano}\n disabled={disabled}\n onChange={(e) => onChange({ ...values, kano: e.target.value })}\n >\n <option value=\"\">Not set</option>\n {KANO_VALUES.map((v) => (\n <option key={v} value={v}>\n {KANO_META[v].label}\n </option>\n ))}\n </select>\n <p className=\"mt-1 text-xs text-muted-foreground\">\n {values.kano && values.kano in KANO_META\n ? KANO_META[values.kano as KanoValue].hint\n : 'How this shapes customer satisfaction.'}\n </p>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label htmlFor={`${idPrefix}-value-score`} className=\"text-sm font-medium\">\n Value score (1-10)\n </label>\n <Input\n id={`${idPrefix}-value-score`}\n data-testid=\"prio-field-value-score\"\n type=\"number\"\n min={1}\n max={10}\n className=\"mt-1\"\n placeholder=\"Not set\"\n value={values.valueScore}\n aria-invalid={value.invalid}\n disabled={disabled}\n onChange={(e) => onChange({ ...values, valueScore: e.target.value })}\n />\n {value.invalid && <ErrorLine message=\"Value score is a whole number from 1 to 10.\" />}\n </div>\n <div>\n <label htmlFor={`${idPrefix}-effort-score`} className=\"text-sm font-medium\">\n Effort score (1-10)\n </label>\n <Input\n id={`${idPrefix}-effort-score`}\n data-testid=\"prio-field-effort-score\"\n type=\"number\"\n min={1}\n max={10}\n className=\"mt-1\"\n placeholder=\"Not set\"\n value={values.effortScore}\n aria-invalid={effort.invalid}\n disabled={disabled}\n onChange={(e) => onChange({ ...values, effortScore: e.target.value })}\n />\n {effort.invalid && <ErrorLine message=\"Effort score is a whole number from 1 to 10.\" />}\n </div>\n </div>\n </div>\n );\n}\n\n/** True when neither of the two score fields holds an out-of-range value (empty is always valid — it means \"clear\"). */\nexport function prioritizationScoresValid(values: PrioritizationFormValues): boolean {\n return (\n !parseIntField(values.valueScore, { min: 1, max: 10 }).invalid &&\n !parseIntField(values.effortScore, { min: 1, max: 10 }).invalid\n );\n}\n\n// ─── RICE (PRM-26) ──────────────────────────────────────────────────────────\n// Deliberately NOT folded into PrioritizationFormValues/PrioritizationScoreFields above: those two are shared\n// with RoadmapControls.tsx's RoadmapItem editor, and RICE (reach/impact/confidence/riceScore) exists only on\n// FeatureRequest — a RoadmapItem mutation has no such fields to send. Kept as its own form fragment, used only\n// where a FeatureRequest is actually being edited.\n//\n// `riceScore = (reach * impact * confidence) / effortScore` is computed server-side only\n// (utils/prioritization.ts#computeRiceScore) — same \"never a live client-side guess\" rule\n// `valueEffortQuadrant` already follows here. This file has no client-side RICE calculator to match: every\n// `riceScore` reader below (FeatureControls.tsx) reads the value last read back from the server.\n\nexport interface RiceFormValues {\n /** '' = not set, else a whole number 1-10 as text */\n reach: string;\n /** '' = not set, else a whole number 1-10 as text */\n impact: string;\n /** '' = not set, else a whole number 1-10 as text */\n confidence: string;\n}\n\nexport const EMPTY_RICE_FORM: RiceFormValues = { reach: '', impact: '', confidence: '' };\n\n/** True when none of the three inputs holds an out-of-range value (empty is always valid — it means \"clear\"). */\nexport function riceInputsValid(values: RiceFormValues): boolean {\n return (\n !parseIntField(values.reach, { min: 1, max: 10 }).invalid &&\n !parseIntField(values.impact, { min: 1, max: 10 }).invalid &&\n !parseIntField(values.confidence, { min: 1, max: 10 }).invalid\n );\n}\n\n/**\n * Why `FeatureRequest.riceScore` reads null, for a feature that has one (reach/impact/confidence/effortScore\n * read straight off the record, never from in-progress form state) — null otherwise, there is nothing missing\n * to explain. Shared by the feature detail card and anywhere else riceScore is listed, so the reason is worded\n * identically everywhere it appears.\n */\nexport function riceScoreMissingHint(feature: {\n reach?: number | null;\n impact?: number | null;\n confidence?: number | null;\n effortScore?: number | null;\n}): string | null {\n const missing: string[] = [];\n if (feature.reach == null) missing.push('reach');\n if (feature.impact == null) missing.push('impact');\n if (feature.confidence == null) missing.push('confidence');\n if (feature.effortScore == null) missing.push('effort score');\n return missing.length === 0 ? null : `Missing ${missing.join(', ')}.`;\n}\n\n/**\n * Reach/impact/confidence 1-10 inputs (PRM-26), rendered next to FeatureRequest's existing effort/value scores\n * — never on its own: RICE reuses `effortScore` as its divisor, so `effortScoreMissing` tells the admin why a\n * live preview below these three inputs may still read \"—\" even once all three are filled in.\n */\nexport function RiceScoreFields({\n idPrefix,\n values,\n onChange,\n effortScoreMissing,\n disabled = false,\n}: {\n idPrefix: string;\n values: RiceFormValues;\n onChange: (next: RiceFormValues) => void;\n /** True when FeatureRequest.effortScore (PRM-27) is not set — riceScore has no divisor yet. */\n effortScoreMissing: boolean;\n disabled?: boolean;\n}) {\n const reach = parseIntField(values.reach, { min: 1, max: 10 });\n const impact = parseIntField(values.impact, { min: 1, max: 10 });\n const confidence = parseIntField(values.confidence, { min: 1, max: 10 });\n return (\n <div className=\"space-y-3\" data-testid=\"rice-fields\">\n <div className=\"grid grid-cols-3 gap-3\">\n <div>\n <label htmlFor={`${idPrefix}-rice-reach`} className=\"text-sm font-medium\">\n Reach (1-10)\n </label>\n <Input\n id={`${idPrefix}-rice-reach`}\n data-testid=\"rice-field-reach\"\n type=\"number\"\n min={1}\n max={10}\n className=\"mt-1\"\n placeholder=\"Not set\"\n value={values.reach}\n aria-invalid={reach.invalid}\n disabled={disabled}\n onChange={(e) => onChange({ ...values, reach: e.target.value })}\n />\n {reach.invalid && <ErrorLine message=\"Reach is a whole number from 1 to 10.\" />}\n </div>\n <div>\n <label htmlFor={`${idPrefix}-rice-impact`} className=\"text-sm font-medium\">\n Impact (1-10)\n </label>\n <Input\n id={`${idPrefix}-rice-impact`}\n data-testid=\"rice-field-impact\"\n type=\"number\"\n min={1}\n max={10}\n className=\"mt-1\"\n placeholder=\"Not set\"\n value={values.impact}\n aria-invalid={impact.invalid}\n disabled={disabled}\n onChange={(e) => onChange({ ...values, impact: e.target.value })}\n />\n {impact.invalid && <ErrorLine message=\"Impact is a whole number from 1 to 10.\" />}\n </div>\n <div>\n <label htmlFor={`${idPrefix}-rice-confidence`} className=\"text-sm font-medium\">\n Confidence (1-10)\n </label>\n <Input\n id={`${idPrefix}-rice-confidence`}\n data-testid=\"rice-field-confidence\"\n type=\"number\"\n min={1}\n max={10}\n className=\"mt-1\"\n placeholder=\"Not set\"\n value={values.confidence}\n aria-invalid={confidence.invalid}\n disabled={disabled}\n onChange={(e) => onChange({ ...values, confidence: e.target.value })}\n />\n {confidence.invalid && <ErrorLine message=\"Confidence is a whole number from 1 to 10.\" />}\n </div>\n </div>\n {effortScoreMissing && (values.reach || values.impact || values.confidence) && (\n <p className=\"text-xs text-muted-foreground\">\n RICE score needs an effort score too (above) — it is the denominator.\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProgramControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/ProgramControls.tsx"],"names":[],"mappings":"AAaA;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,kFAAmB,CAAC;AAkBjD,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,IAAI,EACJ,MAAM,GACP,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,2CA6EA;AAWD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,SAAS,EACT,QAAQ,GACT,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC1D,2CA+EA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProgramControls.js","names":[],"sources":["../../../src/planmagnet/controls/ProgramControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2, X } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\nimport { PROJECT_STATUSES } from './ProjectControls';\nimport { ProjectSelect } from './Pickers';\n\n/**\n * Program controls (BOFF-8047). Programs were `api-only` — full CRUD and project attachment existed in the\n * service (BOFF-7704) but had zero routes anywhere in the UI. `Program.status` reuses `PlanmagnetProjectStatus`\n * (the SDL declares it that way), so the status list is the same as a project's.\n */\nexport const PROGRAM_STATUSES = PROJECT_STATUSES;\n\nconst PROGRAM_QUERIES = ['ListPrograms', 'GetProgram', 'GetProgramForEdit'];\n\nconst UPDATE_STATUS = gql`\n mutation ProgramControlsStatus($id: ID!, $input: PlanmagnetUpdateProgramInput!) {\n planmagnetUpdateProgram(id: $id, input: $input) {\n id\n status\n }\n }\n`;\nconst DELETE = gql`\n mutation ProgramControlsDelete($id: ID!) {\n planmagnetDeleteProgram(id: $id)\n }\n`;\n\nexport function ProgramHeaderActions({\n programId,\n name,\n status,\n}: {\n programId: string;\n name: string;\n status: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [updateStatus, statusState] = useMutation(UPDATE_STATUS, {\n refetchQueries: PROGRAM_QUERIES,\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: PROGRAM_QUERIES.filter((q) => q !== 'GetProgram'),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = statusState.loading || removeState.loading;\n const statuses = (PROGRAM_STATUSES as readonly string[]).includes(status)\n ? PROGRAM_STATUSES\n : [status, ...PROGRAM_STATUSES];\n\n const onStatus = async (next: string) => {\n setError(null);\n try {\n await throwOnError(updateStatus({ variables: { id: programId, input: { status: next } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The status could not be changed.');\n }\n };\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: programId } }));\n navigate('/products/programs-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The program could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <select\n aria-label=\"Program status\"\n data-testid=\"program-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== status) void onStatus(e.target.value);\n }}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"program-edit\"\n onClick={() => navigate(detailPath('/products/edit-program-page', programId))}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete program ${name}?`}\n description=\"The program is deleted. Its projects are not deleted; they are simply no longer grouped under it. This cannot be undone here.\"\n confirmLabel=\"Delete program\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\nconst ATTACH_PROJECT = gql`\n mutation ProgramControlsAttachProject($id: ID!, $input: PlanmagnetUpdateProjectInput!) {\n planmagnetUpdateProject(id: $id, input: $input) {\n id\n programId\n }\n }\n`;\n\n/**\n * Add / remove projects on a program. `Program.projects` reads `Project.programId` (BOFF-7704); the only\n * mutation that writes it is `planmagnetUpdateProject`, so attaching happens from the project side even\n * though this card lives on the program.\n */\nexport function ProgramProjectsCard({\n programId,\n projects,\n}: {\n programId: string;\n projects: { id: string; name: string; status: string }[];\n}) {\n const navigate = usePlanMagnetNavigate();\n const [addProjectId, setAddProjectId] = useState('');\n const [setProgram, setProgramState] = useMutation(ATTACH_PROJECT, {\n refetchQueries: [...PROGRAM_QUERIES, 'GetProjectDetail'],\n awaitRefetchQueries: true,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = setProgramState.loading;\n\n const onAttach = async () => {\n if (!addProjectId) return;\n setError(null);\n try {\n await throwOnError(setProgram({ variables: { id: addProjectId, input: { programId } } }));\n setAddProjectId('');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The project could not be attached.');\n }\n };\n const onDetach = async (projectId: string) => {\n setError(null);\n try {\n await throwOnError(setProgram({ variables: { id: projectId, input: { programId: null } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The project could not be removed.');\n }\n };\n\n return (\n <div className=\"space-y-3\">\n {projects.length === 0 && (\n <p className=\"text-sm text-muted-foreground\">\n No projects are attached to this program yet.\n </p>\n )}\n {projects.map((project) => (\n <div\n key={project.id}\n className=\"flex items-center justify-between gap-2 rounded-md border p-3\"\n >\n <button\n type=\"button\"\n className=\"flex-1 text-left text-sm font-medium hover:underline underline-offset-2\"\n onClick={() => navigate(detailPath('/projects/project-detail-page', project.id))}\n >\n {project.name}\n </button>\n <span className=\"text-xs text-muted-foreground capitalize\">\n {enumLabel(project.status)}\n </span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n aria-label={`Remove ${project.name} from this program`}\n disabled={busy}\n onClick={() => void onDetach(project.id)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <div className=\"flex items-center gap-2 pt-2 border-t\">\n <div className=\"flex-1\">\n <ProjectSelect\n id=\"program-add-project\"\n value={addProjectId}\n onChange={setAddProjectId}\n noneLabel=\"Choose a project to attach\"\n exclude={projects.map((p) => p.id)}\n />\n </div>\n <Button size=\"sm\" disabled={!addProjectId || busy} onClick={() => void onAttach()}>\n Attach\n </Button>\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/ProjectControls.tsx"],"names":[],"mappings":"AAWA;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,kFAOnB,CAAC;AAyBX,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,IAAI,EACJ,MAAM,GACP,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,2CA6GA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectControls.js","names":[],"sources":["../../../src/planmagnet/controls/ProjectControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { History, ListPlus, Pencil, Trash2, Workflow } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\n\n/**\n * Project controls (BOFF-7940). A new project starts in PLANNING and, until 2026-09-27, nothing in the UI could\n * move it: no status control, and the Edit Project page (which had no Status field) was linked from nowhere. So\n * Projects > Active, the Dashboard's project status card and the admin Bulk Archive never showed a project created\n * in the UI.\n */\n\nexport const PROJECT_STATUSES = [\n 'PLANNING',\n 'ACTIVE',\n 'ON_HOLD',\n 'COMPLETED',\n 'CANCELLED',\n 'ARCHIVED',\n] as const;\n\nconst UPDATE_PROJECT_STATUS = gql`\n mutation ProjectControlsStatus($id: ID!, $input: PlanmagnetUpdateProjectInput!) {\n planmagnetUpdateProject(id: $id, input: $input) {\n id\n status\n }\n }\n`;\nconst DELETE_PROJECT = gql`\n mutation ProjectControlsDelete($id: ID!) {\n planmagnetDeleteProject(id: $id)\n }\n`;\n\n/** Every query that lists projects or shows a project's status. */\nconst PROJECT_LIST_QUERIES = [\n 'GetProjects',\n 'GetActiveProjects',\n 'GetBoardProjects',\n 'GetDashboardData',\n 'AdminPlanmagnetProjects',\n];\n\nexport function ProjectHeaderActions({\n projectId,\n name,\n status,\n}: {\n projectId: string;\n name: string;\n status: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [updateStatus, statusState] = useMutation(UPDATE_PROJECT_STATUS, {\n refetchQueries: ['GetProjectDetail', ...PROJECT_LIST_QUERIES],\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE_PROJECT, {\n refetchQueries: PROJECT_LIST_QUERIES,\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = statusState.loading || removeState.loading;\n const statuses = (PROJECT_STATUSES as readonly string[]).includes(status)\n ? PROJECT_STATUSES\n : [status, ...PROJECT_STATUSES];\n\n const onStatus = async (next: string) => {\n setError(null);\n try {\n await throwOnError(updateStatus({ variables: { id: projectId, input: { status: next } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The status could not be changed.');\n }\n };\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: projectId } }));\n navigate('/projects/projects-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The project could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <select\n aria-label=\"Project status\"\n data-testid=\"project-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== status) void onStatus(e.target.value);\n }}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"project-edit\"\n onClick={() => navigate(detailPath('/projects/edit-project-page', projectId))}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n {/* BOFF-8043: status names, hidden statuses and allowed moves for this project. */}\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"project-workflow\"\n onClick={() => navigate(detailPath('/projects/project-workflow-page', projectId))}\n >\n <Workflow className=\"mr-1 h-4 w-4\" />\n Workflow\n </Button>\n {/* BOFF-8047: per-project custom field definitions — create/edit/delete, and the types work items can carry. */}\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"project-custom-fields\"\n onClick={() => navigate(detailPath('/projects/project-custom-fields-page', projectId))}\n >\n <ListPlus className=\"mr-1 h-4 w-4\" />\n Custom Fields\n </Button>\n {/* CWF-09: the workspace Activity page, filtered to this project. */}\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"project-activity-link\"\n onClick={() =>\n navigate(`/activity/activity-page?projectId=${encodeURIComponent(projectId)}`)\n }\n >\n <History className=\"mr-1 h-4 w-4\" />\n Activity\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete ${name}?`}\n description=\"The project is deleted. Its tasks, sprints, boards, milestones and budgets disappear from every list, and so do releases that belong to no other project. This cannot be undone here.\"\n confirmLabel=\"Delete project\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,IAAa,IAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAAwB,CAAG;;;;;;;GAQ3B,IAAiB,CAAG;;;;GAOpB,IAAuB;CAC3B;CACA;CACA;CACA;CACA;CACD;AAED,SAAgB,EAAqB,EACnC,cACA,SACA,aAKC;CACD,IAAM,IAAW,GAAuB,EAClC,CAAC,GAAc,KAAe,EAAY,GAAuB;EACrE,gBAAgB,CAAC,oBAAoB,GAAG,EAAqB;EAC7D,qBAAqB;EACtB,CAAC,EACI,CAAC,GAAQ,KAAe,EAAY,GAAgB;EACxD,gBAAgB;EAChB,SAAS;EACV,CAAC,EACI,CAAC,GAAO,KAAY,EAAwB,KAAK,EACjD,IAAO,EAAY,WAAW,EAAY,SAC1C,IAAY,EAAuC,SAAS,EAAO,GACrE,IACA,CAAC,GAAQ,GAAG,EAAiB,EAE3B,IAAW,OAAO,MAAiB;AACvC,IAAS,KAAK;AACd,MAAI;AACF,SAAM,EAAa,EAAa,EAAE,WAAW;IAAE,IAAI;IAAW,OAAO,EAAE,QAAQ,GAAM;IAAE,EAAE,CAAC,CAAC;WACpF,GAAG;AACV,KAAS,aAAa,QAAQ,EAAE,UAAU,mCAAmC;;IAG3E,IAAW,YAAY;AAC3B,IAAS,KAAK;AACd,MAAI;AAEF,GADA,MAAM,EAAa,EAAO,EAAE,WAAW,EAAE,IAAI,GAAW,EAAE,CAAC,CAAC,EAC5D,EAAS,0BAA0B;WAC5B,GAAG;AACV,KAAS,aAAa,QAAQ,EAAE,UAAU,oCAAoC;;;AAIlF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,UAAD;KACE,cAAW;KACX,eAAY;KACZ,WAAU;KACV,OAAO;KACP,UAAU;KACV,WAAW,MAAM;AACf,MAAI,EAAE,OAAO,UAAU,KAAa,EAAS,EAAE,OAAO,MAAM;;eAG7D,EAAS,KAAK,MACb,kBAAC,UAAD;MAAgB,OAAO;gBACpB,EAAU,EAAE;MACN,EAFI,EAEJ,CACT;KACK,CAAA;IACT,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,eAAY;KACZ,eAAe,EAAS,EAAW,+BAA+B,EAAU,CAAC;eAJ/E,CAME,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,OAE5B;;IAET,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,eAAY;KACZ,eAAe,EAAS,EAAW,mCAAmC,EAAU,CAAC;eAJnF,CAME,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EAAA,WAE9B;;IAET,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,eAAY;KACZ,eAAe,EAAS,EAAW,wCAAwC,EAAU,CAAC;eAJxF,CAME,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EAAA,gBAE9B;;IAET,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,eAAY;KACZ,eACE,EAAS,qCAAqC,mBAAmB,EAAU,GAAG;eALlF,CAQE,kBAAC,GAAD,EAAS,WAAU,gBAAiB,CAAA,EAAA,WAE7B;;IACT,kBAAC,GAAD;KACE,OAAM;KACN,SAAQ;KACR,MAAM,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA;KACzC,OAAO,UAAU,EAAK;KACtB,aAAY;KACZ,cAAa;KACb,aAAA;KACA,UAAU;KACV,iBAAiB,KAAK,GAAU;KAChC,CAAA;IACE;MACL,KAAS,kBAAC,GAAD,EAAW,SAAS,GAAS,CAAA,CACnC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QualityGateControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/QualityGateControls.tsx"],"names":[],"mappings":"AAqBA,OAAO,EACL,KAAK,YAAY,EAIlB,MAAM,8BAA8B,CAAC;AAEtC;;;;;GAKG;AAEH,eAAO,MAAM,oBAAoB,UAAuB,CAAC;AAIzD,eAAO,MAAM,qBAAqB,iEAMxB,CAAC;AACX,wGAAwG;AACxG,eAAO,MAAM,mBAAmB,sDAAuD,CAAC;AAaxF,wBAAgB,sBAAsB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,2CAMpE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;CAClB,2CAsDA;AA8BD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uEAAuE;IACvE,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,2CA0J9E;AAED,wBAAgB,uBAAuB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,2CAgCzF;AAED,kHAAkH;AAClH,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,qBAAqB,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD,2CA0GA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"QualityGateControls.js","names":[],"sources":["../../../src/planmagnet/controls/QualityGateControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\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 { Pencil, Plus, ShieldCheck, X } from 'lucide-react';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\nimport { throwOnError } from '../utils/mutationResult';\nimport { useReleaseOptions } from '../releases/useReleaseOptions';\nimport {\n type CriteriaItem,\n criteriaItemsToJson,\n newCriteriaId,\n parseCriteriaItems,\n} from '../utils/qualityGateCriteria';\n\n/**\n * Quality gate row controls (GAP-02): edit, delete and review, plus the criteria rows editor shared with the\n * \"New quality gate\" dialog (`../create/CreateDialogs.tsx`). Backend (`planmagnetCreateQualityGate` /\n * Update / Delete / Review) is real and prod-verified — `ReleaseGatesCard.tsx` already writes gates scoped to\n * one release — but there was no workspace-wide place to browse, edit or review a gate on its own.\n */\n\nexport const QUALITY_GATE_QUERIES = ['QualityGatesList'];\n\nconst FIELD = 'mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm';\n\nexport const QUALITY_GATE_STATUSES = [\n 'PENDING',\n 'IN_REVIEW',\n 'PASSED',\n 'FAILED',\n 'WAIVED',\n] as const;\n/** The statuses a review can set. PENDING is the un-reviewed starting state, never a review outcome. */\nexport const REVIEWABLE_STATUSES = ['PASSED', 'FAILED', 'WAIVED', 'IN_REVIEW'] as const;\n\nconst STATUS_BADGE_VARIANT: Record<\n string,\n 'default' | 'success' | 'warning' | 'info' | 'secondary' | 'destructive' | 'outline'\n> = {\n PENDING: 'outline',\n IN_REVIEW: 'warning',\n PASSED: 'success',\n FAILED: 'destructive',\n WAIVED: 'secondary',\n};\n\nexport function QualityGateStatusBadge({ status }: { status: string }) {\n return (\n <Badge variant={STATUS_BADGE_VARIANT[status] ?? 'outline'} className=\"text-xs\">\n {enumLabel(status)}\n </Badge>\n );\n}\n\n/**\n * Criteria as add/remove text rows, shared by the create dialog and the edit dialog. What each row is converted\n * to on submit is defined by `criteriaItemsToJson` (`utils/qualityGateCriteria.ts`) — which always writes a\n * boolean `done`, so the \"done\" checkbox here is the only way this UI lets that flag ever become `true`; without\n * it every row saved through this editor would be permanently stuck at `done: false` and the list's \"X of Y\n * criteria met\" summary (`summarizeCriteria`) could never show anything but zero progress.\n */\nexport function CriteriaRowsEditor({\n items,\n onChange,\n idPrefix,\n}: {\n items: CriteriaItem[];\n onChange: (items: CriteriaItem[]) => void;\n idPrefix: string;\n}) {\n return (\n <div className=\"space-y-2\">\n {items.map((item, index) => (\n <div key={item.id} className=\"flex items-center gap-2\">\n <Checkbox\n id={`${idPrefix}-criteria-done-${item.id}`}\n aria-label={`Criterion ${index + 1} done`}\n data-testid={`${idPrefix}-criteria-done`}\n checked={item.done === true}\n onCheckedChange={(checked) => {\n const next = [...items];\n next[index] = { ...item, done: checked === true };\n onChange(next);\n }}\n />\n <Input\n aria-label={`Criterion ${index + 1}`}\n placeholder=\"e.g. Unit test coverage at least 80%\"\n value={item.description}\n data-testid={`${idPrefix}-criteria-row`}\n onChange={(e) => {\n const next = [...items];\n next[index] = { ...item, description: e.target.value };\n onChange(next);\n }}\n />\n <Button\n type=\"button\"\n size=\"icon\"\n variant=\"ghost\"\n aria-label={`Remove criterion ${index + 1}`}\n onClick={() => onChange(items.filter((_, i) => i !== index))}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n data-testid={`${idPrefix}-criteria-add`}\n onClick={() => onChange([...items, { id: newCriteriaId(), description: '' }])}\n >\n <Plus className=\"mr-1 h-4 w-4\" /> Add criterion\n </Button>\n {items.length === 0 && (\n <p className=\"text-xs text-muted-foreground\">\n No criteria yet — add one, or leave this empty and fill it in later.\n </p>\n )}\n </div>\n );\n}\n\nconst UPDATE = gql`\n mutation QualityGateControlsUpdate($id: ID!, $input: PlanmagnetUpdateQualityGateInput!) {\n planmagnetUpdateQualityGate(id: $id, input: $input) {\n id\n name\n description\n criteria\n phase\n }\n }\n`;\nconst DELETE = gql`\n mutation QualityGateControlsDelete($id: ID!) {\n planmagnetDeleteQualityGate(id: $id)\n }\n`;\nconst REVIEW = gql`\n mutation QualityGateControlsReview($id: ID!, $input: PlanmagnetReviewQualityGateInput!) {\n planmagnetReviewQualityGate(id: $id, input: $input) {\n id\n status\n reviewerId\n reviewedAt\n reviewNotes\n }\n }\n`;\n\nexport interface QualityGateEditValues {\n id: string;\n name: string;\n description: string | null;\n criteria: unknown;\n phase: string | null;\n /** The gate's project: its releases are the ones the gate can hold. */\n projectId: string;\n releaseId: string | null;\n}\n\n/**\n * Name, description, criteria and phase. Only fields actually changed are sent.\n *\n * `initial` (the save-time dirty-check baseline) is captured exactly once per open — not recomputed on every\n * render — because `parseCriteriaItems` mints a fresh non-deterministic id for any criterion that doesn't\n * already carry a persisted string id (true for most pre-existing gates, e.g. `{ minCoverage: 80 }`). Deriving\n * it fresh on every render meant the ids in `form.criteria` (frozen at open time) and `initialCriteriaJson`\n * (re-derived on the next render, however triggered) never matched, so the criteria comparison was spuriously\n * \"changed\" and `input.criteria` was sent even on a save that only touched Name. Capturing it once per open —\n * and re-deriving it fresh from `gate` each time the dialog is (re)opened, so a later open still reflects\n * whatever this same gate's criteria became meanwhile — keeps ids stable for the life of one open dialog while\n * only genuine content edits are detected as changed.\n */\nexport function EditQualityGateDialog({ gate }: { gate: QualityGateEditValues }) {\n const makeInitial = () => ({\n name: gate.name,\n description: gate.description ?? '',\n phase: gate.phase ?? '',\n releaseId: gate.releaseId ?? '',\n criteria: parseCriteriaItems(gate.criteria),\n });\n const [open, setOpen] = useState(false);\n const [initial, setInitial] = useState(makeInitial);\n const [form, setForm] = useState(initial);\n const [error, setError] = useState<string | null>(null);\n const initialCriteriaJson = JSON.stringify(criteriaItemsToJson(initial.criteria));\n // A gate can be moved to another release of its project, or released from one it was linked to by mistake.\n const releaseOptions = useReleaseOptions(open, gate.projectId);\n const [update, state] = useMutation(UPDATE, {\n refetchQueries: QUALITY_GATE_QUERIES,\n awaitRefetchQueries: true,\n });\n\n const save = async () => {\n setError(null);\n const input: Record<string, unknown> = {};\n if (form.name.trim() !== initial.name) input.name = form.name.trim();\n if (form.description.trim() !== initial.description.trim())\n input.description = form.description.trim() || null;\n if (form.phase.trim() !== initial.phase.trim()) input.phase = form.phase.trim() || null;\n if (form.releaseId !== initial.releaseId) input.releaseId = form.releaseId || null;\n const nextCriteriaJson = criteriaItemsToJson(form.criteria);\n if (JSON.stringify(nextCriteriaJson) !== initialCriteriaJson) input.criteria = nextCriteriaJson;\n if (Object.keys(input).length === 0) {\n setOpen(false);\n return;\n }\n try {\n await throwOnError(update({ variables: { id: gate.id, input } }));\n setOpen(false);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The gate could not be saved.');\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) {\n const fresh = makeInitial();\n setInitial(fresh);\n setForm(fresh);\n } else {\n setError(null);\n }\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" variant=\"outline\" data-testid=\"quality-gate-edit\">\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-lg max-h-[85vh] overflow-y-auto\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit quality gate</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>Only changed fields are saved.</ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"quality-gate-edit-name\" className=\"text-sm font-medium\">\n Name\n </label>\n <Input\n id=\"quality-gate-edit-name\"\n className=\"mt-1\"\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"quality-gate-edit-description\" className=\"text-sm font-medium\">\n Description\n </label>\n <Input\n id=\"quality-gate-edit-description\"\n className=\"mt-1\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"quality-gate-edit-phase\" className=\"text-sm font-medium\">\n Phase\n </label>\n <Input\n id=\"quality-gate-edit-phase\"\n className=\"mt-1\"\n placeholder=\"e.g. design, build, launch\"\n value={form.phase}\n onChange={(e) => setForm({ ...form, phase: e.target.value })}\n />\n </div>\n <div>\n <label htmlFor=\"quality-gate-edit-release\" className=\"text-sm font-medium\">\n Holds release\n </label>\n <select\n id=\"quality-gate-edit-release\"\n data-testid=\"quality-gate-edit-release\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.releaseId}\n onChange={(e) => setForm({ ...form, releaseId: e.target.value })}\n >\n <option value=\"\">No release</option>\n {/* The current release stays choosable even before the list has loaded it. */}\n {form.releaseId && !releaseOptions.releases.some((r) => r.id === form.releaseId) && (\n <option value={form.releaseId}>\n {releaseOptions.loading ? 'Loading…' : 'Current release'}\n </option>\n )}\n {releaseOptions.releases.map((r) => (\n <option key={r.id} value={r.id}>\n {r.name} ({r.version})\n </option>\n ))}\n </select>\n </div>\n <div>\n <span className=\"text-sm font-medium\">Criteria</span>\n <div className=\"mt-1\">\n <CriteriaRowsEditor\n idPrefix=\"quality-gate-edit\"\n items={form.criteria}\n onChange={(criteria) => setForm({ ...form, criteria })}\n />\n </div>\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n Cancel\n </Button>\n <Button\n onClick={() => void save()}\n disabled={form.name.trim() === '' || state.loading}\n data-testid=\"quality-gate-edit-submit\"\n >\n {state.loading ? 'Saving…' : 'Save'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\nexport function QualityGateDeleteButton({ gateId, name }: { gateId: string; name: string }) {\n const [remove, { loading }] = useMutation(DELETE, {\n refetchQueries: QUALITY_GATE_QUERIES,\n awaitRefetchQueries: true,\n });\n const [error, setError] = useState<string | null>(null);\n\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: gateId } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The gate could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-1\" data-testid=\"quality-gate-delete\">\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<X className=\"mr-1 h-4 w-4\" />}\n title={`Delete \"${name}\"?`}\n description=\"A release this gate holds will no longer count it. This cannot be undone here.\"\n confirmLabel=\"Delete gate\"\n destructive\n disabled={loading}\n onConfirm={() => void onDelete()}\n />\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/** PASSED / FAILED / WAIVED / IN_REVIEW, with notes. The server's refusal (e.g. an unknown gate) shows inline. */\nexport function ReviewQualityGateDialog({\n gate,\n}: {\n gate: QualityGateEditValues & { status: string };\n}) {\n const [open, setOpen] = useState(false);\n const [status, setStatus] = useState<(typeof REVIEWABLE_STATUSES)[number]>(\n (REVIEWABLE_STATUSES as readonly string[]).includes(gate.status)\n ? (gate.status as (typeof REVIEWABLE_STATUSES)[number])\n : 'PASSED'\n );\n const [notes, setNotes] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [review, state] = useMutation(REVIEW, {\n refetchQueries: QUALITY_GATE_QUERIES,\n awaitRefetchQueries: true,\n });\n\n const submit = async () => {\n setError(null);\n try {\n // `null`, not `undefined`: the review always carries exactly what is in the box, so leaving it\n // blank clears a previous review's notes rather than silently leaving them in place.\n await throwOnError(\n review({\n variables: { id: gate.id, input: { status, reviewNotes: notes.trim() || null } },\n })\n );\n setOpen(false);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The gate could not be reviewed.');\n }\n };\n\n return (\n <ResponsiveDialog\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (next) {\n setStatus(\n (REVIEWABLE_STATUSES as readonly string[]).includes(gate.status)\n ? (gate.status as (typeof REVIEWABLE_STATUSES)[number])\n : 'PASSED'\n );\n setNotes('');\n } else {\n setError(null);\n }\n }}\n >\n <ResponsiveDialogTrigger asChild>\n <Button size=\"sm\" data-testid=\"quality-gate-review-trigger\">\n <ShieldCheck className=\"mr-1 h-4 w-4\" />\n Review\n </Button>\n </ResponsiveDialogTrigger>\n <ResponsiveDialogContent className=\"max-w-md\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Review "{gate.name}"</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Records who reviewed this gate and when. A release this gate holds cannot ship until it\n is Passed or Waived.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <div className=\"space-y-3\">\n <div>\n <label htmlFor=\"quality-gate-review-status\" className=\"text-sm font-medium\">\n Outcome\n </label>\n <select\n id=\"quality-gate-review-status\"\n data-testid=\"quality-gate-review-status\"\n className={FIELD}\n value={status}\n onChange={(e) => setStatus(e.target.value as (typeof REVIEWABLE_STATUSES)[number])}\n >\n {REVIEWABLE_STATUSES.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label htmlFor=\"quality-gate-review-notes\" className=\"text-sm font-medium\">\n Review notes\n </label>\n <textarea\n id=\"quality-gate-review-notes\"\n data-testid=\"quality-gate-review-notes\"\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[72px]\"\n value={notes}\n onChange={(e) => setNotes(e.target.value)}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n <ResponsiveDialogFooter>\n <Button\n onClick={() => void submit()}\n disabled={state.loading}\n data-testid=\"quality-gate-review-submit\"\n >\n {state.loading ? 'Saving…' : 'Save review'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReleaseControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/ReleaseControls.tsx"],"names":[],"mappings":"AAWA;;;;;GAKG;AAEH,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,2GASnB,CAAC;AA0BX,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,OAAO,EACP,MAAM,GACP,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,2CA6EA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReleaseControls.js","names":[],"sources":["../../../src/planmagnet/controls/ReleaseControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { detailPath } from '../utils/rowNavigation';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\nimport { enumLabel } from './WorkItemControls';\n\n/**\n * Release controls (BOFF-7952). A release started in Planning and could never be released: status showed only as\n * badges, the Edit Release page was linked from nowhere, and nothing deleted a release. The Quality Gates card even\n * said the release \"cannot be released until the gates pass\" — with nothing to click once they had. The service\n * refuses RELEASED while a gate is open; that reason is shown here.\n */\n\n/** Every ReleaseStatus value (the Edit page's list omitted STAGING — BOFF-7985). */\nexport const RELEASE_STATUSES = [\n 'DRAFT',\n 'PLANNING',\n 'IN_PROGRESS',\n 'READY',\n 'STAGING',\n 'RELEASED',\n 'ROLLED_BACK',\n 'CANCELLED',\n] as const;\n\nconst RELEASE_QUERIES = [\n 'GetRelease',\n 'ListReleases',\n 'ListReleasesForProduct',\n 'ListReleasesForProducts',\n 'ReleaseReadiness',\n 'GetReleaseForEdit',\n];\n\nconst UPDATE = gql`\n mutation ReleaseControlsStatus($id: ID!, $input: PlanmagnetUpdateReleaseInput!) {\n planmagnetUpdateRelease(id: $id, input: $input) {\n id\n status\n releasedAt\n }\n }\n`;\nconst DELETE = gql`\n mutation ReleaseControlsDelete($id: ID!) {\n planmagnetDeleteRelease(id: $id)\n }\n`;\n\nexport function ReleaseHeaderActions({\n releaseId,\n version,\n status,\n}: {\n releaseId: string;\n version: string;\n status: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [update, updateState] = useMutation(UPDATE, {\n refetchQueries: RELEASE_QUERIES,\n awaitRefetchQueries: true,\n });\n const [remove, removeState] = useMutation(DELETE, {\n refetchQueries: RELEASE_QUERIES.filter((q) => q !== 'GetRelease' && q !== 'ReleaseReadiness'),\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n const busy = updateState.loading || removeState.loading;\n const statuses = (RELEASE_STATUSES as readonly string[]).includes(status)\n ? RELEASE_STATUSES\n : [status, ...RELEASE_STATUSES];\n\n const onStatus = async (next: string) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: releaseId, input: { status: next } } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The status could not be changed.');\n }\n };\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: releaseId } }));\n navigate('/products/releases-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The release could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <select\n aria-label=\"Release status\"\n data-testid=\"release-status\"\n className=\"rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60\"\n value={status}\n disabled={busy}\n onChange={(e) => {\n if (e.target.value !== status) void onStatus(e.target.value);\n }}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {enumLabel(s)}\n </option>\n ))}\n </select>\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"release-edit\"\n onClick={() => navigate(detailPath('/products/edit-release-page', releaseId))}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete release ${version}?`}\n description=\"The release is deleted; its work items stay. This cannot be undone here.\"\n confirmLabel=\"Delete release\"\n destructive\n disabled={busy}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAmBA,IAAa,IAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACD,EAEK,IAAS,CAAG;;;;;;;;GASZ,IAAS,CAAG;;;;;AAMlB,SAAgB,EAAqB,EACnC,cACA,YACA,aAKC;CACD,IAAM,IAAW,GAAuB,EAClC,CAAC,GAAQ,KAAe,EAAY,GAAQ;EAChD,gBAAgB;EAChB,qBAAqB;EACtB,CAAC,EACI,CAAC,GAAQ,KAAe,EAAY,GAAQ;EAChD,gBAAgB,EAAgB,QAAQ,MAAM,MAAM,gBAAgB,MAAM,mBAAmB;EAC7F,SAAS;EACV,CAAC,EACI,CAAC,GAAO,KAAY,EAAwB,KAAK,EACjD,IAAO,EAAY,WAAW,EAAY,SAC1C,IAAY,EAAuC,SAAS,EAAO,GACrE,IACA,CAAC,GAAQ,GAAG,EAAiB,EAE3B,IAAW,OAAO,MAAiB;AACvC,IAAS,KAAK;AACd,MAAI;AACF,SAAM,EAAa,EAAO,EAAE,WAAW;IAAE,IAAI;IAAW,OAAO,EAAE,QAAQ,GAAM;IAAE,EAAE,CAAC,CAAC;WAC9E,GAAG;AACV,KAAS,aAAa,QAAQ,EAAE,UAAU,mCAAmC;;IAG3E,IAAW,YAAY;AAC3B,IAAS,KAAK;AACd,MAAI;AAEF,GADA,MAAM,EAAa,EAAO,EAAE,WAAW,EAAE,IAAI,GAAW,EAAE,CAAC,CAAC,EAC5D,EAAS,0BAA0B;WAC5B,GAAG;AACV,KAAS,aAAa,QAAQ,EAAE,UAAU,oCAAoC;;;AAIlF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf;IACE,kBAAC,UAAD;KACE,cAAW;KACX,eAAY;KACZ,WAAU;KACV,OAAO;KACP,UAAU;KACV,WAAW,MAAM;AACf,MAAI,EAAE,OAAO,UAAU,KAAa,EAAS,EAAE,OAAO,MAAM;;eAG7D,EAAS,KAAK,MACb,kBAAC,UAAD;MAAgB,OAAO;gBACpB,EAAU,EAAE;MACN,EAFI,EAEJ,CACT;KACK,CAAA;IACT,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,eAAY;KACZ,eAAe,EAAS,EAAW,+BAA+B,EAAU,CAAC;eAJ/E,CAME,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,OAE5B;;IACT,kBAAC,GAAD;KACE,OAAM;KACN,SAAQ;KACR,MAAM,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA;KACzC,OAAO,kBAAkB,EAAQ;KACjC,aAAY;KACZ,cAAa;KACb,aAAA;KACA,UAAU;KACV,iBAAiB,KAAK,GAAU;KAChC,CAAA;IACE;MACL,KAAS,kBAAC,GAAD,EAAW,SAAS,GAAS,CAAA,CACnC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RiskControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/RiskControls.tsx"],"names":[],"mappings":"AAoBA;;;;;;GAMG;AAEH,eAAO,MAAM,aAAa,sFAOhB,CAAC;AAEX,eAAO,MAAM,eAAe,8DAA+D,CAAC;AA8B5F,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAID,wBAAgB,iBAAiB,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,2CAgF/D"}
|