diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ce51e69aa..0fef998ab 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -27,8 +27,10 @@ jobs: image: speckle/pre-commit-runner:latest env: IMAGE_VERSION_TAG: ${{ inputs.IMAGE_VERSION_TAG }} - DOCKER_REG_USER: ${{ inputs.DOCKERHUB_USERNAME }} - DOCKER_REG_PASS: ${{ secrets.DOCKERHUB_TOKEN }} + REGISTRY_USERNAME: ${{ inputs.DOCKERHUB_USERNAME }} + REGISTRY_PASSWORD: ${{ secrets.DOCKERHUB_TOKEN }} + HELM_REGISTRY_DOMAIN: registry-1.docker.io + HELM_REPOSITORY_PATH: speckle steps: - uses: actions/checkout@v4.2.2 with: diff --git a/.github/workflows/scripts/publish_helm_chart_oci.sh b/.github/workflows/scripts/publish_helm_chart_oci.sh index 7533c5ddb..c5084acfe 100755 --- a/.github/workflows/scripts/publish_helm_chart_oci.sh +++ b/.github/workflows/scripts/publish_helm_chart_oci.sh @@ -6,14 +6,26 @@ if [[ -z "${IMAGE_VERSION_TAG}" ]]; then echo "IMAGE_VERSION_TAG is not set" exit 1 fi -if [[ -z "${DOCKER_REG_USER}" ]]; then - echo "DOCKER_REG_USER is not set" +if [[ -z "${REGISTRY_USERNAME}" ]]; then + echo "REGISTRY_USERNAME is not set" exit 1 fi -if [[ -z "${DOCKER_REG_PASS}" ]]; then - echo "DOCKER_REG_PASS is not set" +if [[ -z "${REGISTRY_PASSWORD}" ]]; then + echo "REGISTRY_PASSWORD is not set" exit 1 fi +if [[ -z "${HELM_REGISTRY_DOMAIN}" ]]; then + echo "HELM_REGISTRY_DOMAIN is not set" + exit 1 +fi +if [[ -z "${HELM_REPOSITORY_PATH}" ]]; then + echo "HELM_REPOSITORY_PATH is not set" + exit 1 +fi + +RELEASE_VERSION="${IMAGE_VERSION_TAG}" +HELM_STABLE_BRANCH="${HELM_STABLE_BRANCH:-"main"}" +CHART_NAME="${CHART_NAME:-"speckle-server-chart"}" echo "🏷️ Preparing envs" @@ -22,16 +34,11 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) # shellcheck disable=SC1090,SC1091 source "${SCRIPT_DIR}/common.sh" -RELEASE_VERSION="${IMAGE_VERSION_TAG}-chart" -HELM_STABLE_BRANCH="${HELM_STABLE_BRANCH:-"main"}" -DOCKER_HELM_REG_URL="${DOCKER_HELM_REG_URL:-"registry-1.docker.io"}" -DOCKER_HELM_REG_ORG="${DOCKER_HELM_REG_ORG:-"speckle"}" -CHART_NAME="${CHART_NAME:-"speckle-server"}" - -echo "📌 Releasing Helm Chart version ${RELEASE_VERSION} for application version ${IMAGE_VERSION_TAG}" +echo "📌 Releasing Helm Chart for application version ${IMAGE_VERSION_TAG} to 'oci://${HELM_REGISTRY_DOMAIN}/${HELM_REPOSITORY_PATH}/${CHART_NAME}:${RELEASE_VERSION}'" yq e -i ".docker_image_tag = \"${IMAGE_VERSION_TAG}\"" "${GIT_REPO}/utils/helm/speckle-server/values.yaml" +yq e -i ".name = \"${CHART_NAME}\"" "${GIT_REPO}/utils/helm/speckle-server/Chart.yaml" -echo "${DOCKER_REG_PASS}" | helm registry login "${DOCKER_HELM_REG_URL}" --username "${DOCKER_REG_USER}" --password-stdin +echo "${REGISTRY_PASSWORD}" | helm registry login "${HELM_REGISTRY_DOMAIN}" --username "${REGISTRY_USERNAME}" --password-stdin helm package "${GIT_REPO}/utils/helm/speckle-server" --version "${RELEASE_VERSION}" --app-version "${IMAGE_VERSION_TAG}" --destination "/tmp" -helm push "/tmp/${CHART_NAME}-${RELEASE_VERSION}.tgz" "oci://${DOCKER_HELM_REG_URL}/${DOCKER_HELM_REG_ORG}" +helm push "/tmp/${CHART_NAME}-${RELEASE_VERSION}.tgz" "oci://${HELM_REGISTRY_DOMAIN}/${HELM_REPOSITORY_PATH}" diff --git a/packages/frontend-2/components/automate/viewer/panel/FunctionRunRowObjectResult.vue b/packages/frontend-2/components/automate/viewer/panel/FunctionRunRowObjectResult.vue index f7871f179..15eb6a491 100644 --- a/packages/frontend-2/components/automate/viewer/panel/FunctionRunRowObjectResult.vue +++ b/packages/frontend-2/components/automate/viewer/panel/FunctionRunRowObjectResult.vue @@ -37,8 +37,8 @@ import { ExclamationTriangleIcon } from '@heroicons/vue/24/outline' import { useInjectedViewerState } from '~~/lib/viewer/composables/setup' -import { useSelectionUtilities } from '~~/lib/viewer/composables/ui' import { useFilterUtilities } from '~/lib/viewer/composables/filtering/filtering' +import { useFilterColoringHelpers } from '~/lib/viewer/composables/filtering/coloringHelpers' import type { NumericPropertyInfo } from '@speckle/viewer' import { containsAll } from '~~/lib/common/helpers/utils' import type { Automate } from '@speckle/shared' @@ -55,29 +55,32 @@ const props = defineProps<{ const { viewer: { - metadata: { filteringState, filteringDataStore } + metadata: { filteringDataStore } } } = useInjectedViewerState() -const { isolateObjects, resetFilters, addActiveFilter, toggleFilterApplied, filters } = +const { isolateObjects, resetFilters, resetIsolations, addActiveFilter, filters } = useFilterUtilities() -const { setSelectionFromObjectIds, clearSelection } = useSelectionUtilities() +const { setColorFilter, removeColorFilter } = useFilterColoringHelpers() +const logger = useLogger() const hasMetadataGradient = computed(() => { if (props.result.metadata?.gradient) return true return false }) -const isolatedObjects = computed(() => filteringState.value?.isolatedObjects) const isIsolated = computed(() => { - if (!isolatedObjects.value?.length) return false - if ( - props.functionId && - filteringState.value?.activePropFilterKey === props.functionId - ) - return false + // Gradient results show active via metadataGradientIsSet + if (hasMetadataGradient.value) { + return metadataGradientIsSet.value + } + + // Non-gradient results show active if their objects are isolated + const isolatedIds = filters.isolatedObjectIds.value const ids = resultObjectIds.value - return containsAll(ids, isolatedObjects.value) + + if (!isolatedIds?.length) return false + return containsAll(ids, isolatedIds) }) const resultObjectIds = computed(() => { @@ -90,20 +93,36 @@ const handleClick = () => { setOrUnsetGradient() return } - isolateOrUnisolateObjects() } const isolateOrUnisolateObjects = () => { const ids = resultObjectIds.value - const isCurrentlyIsolated = isIsolated.value + const wasIsolated = containsAll(ids, filters.isolatedObjectIds.value || []) - resetFilters() - if (isCurrentlyIsolated) { - clearSelection() - } else { + logger.debug('Isolation toggle:', { + resultCategory: props.result.category, + objectCount: ids.length, + wasIsolated, + currentIsolatedCount: filters.isolatedObjectIds.value?.length || 0 + }) + + // Always clear existing isolation (radio button behavior) + resetIsolations() + logger.debug( + 'After reset, isolated count:', + filters.isolatedObjectIds.value?.length || 0 + ) + + // If wasn't isolated before, isolate now (toggle behavior) + if (!wasIsolated) { isolateObjects(ids) - setSelectionFromObjectIds(ids) + logger.debug( + 'After isolate, isolated count:', + filters.isolatedObjectIds.value?.length || 0 + ) + } else { + logger.debug('Result was isolated, now deactivated') } } @@ -154,11 +173,20 @@ const computedFilterData = computed((): NumericFilterData | undefined => { }) const setOrUnsetGradient = () => { + logger.debug('Gradient toggle:', { + resultCategory: props.result.category, + isCurrentlySet: metadataGradientIsSet.value + }) + if (metadataGradientIsSet.value) { + logger.debug('Removing gradient filter') resetFilters() + removeColorFilter() metadataGradientIsSet.value = false return } + + logger.debug('Setting gradient filter') resetFilters() if (!props.result.metadata) return if (!computedPropInfo.value) return @@ -169,7 +197,8 @@ const setOrUnsetGradient = () => { metadataGradientIsSet.value = true const filterId = addActiveFilter(computedPropInfo.value) - toggleFilterApplied(filterId) + + setColorFilter(filterId) } const iconAndColor = computed(() => { diff --git a/packages/frontend-2/components/presentation/PageWrapper.vue b/packages/frontend-2/components/presentation/PageWrapper.vue new file mode 100644 index 000000000..38a2393c3 --- /dev/null +++ b/packages/frontend-2/components/presentation/PageWrapper.vue @@ -0,0 +1,171 @@ + + + diff --git a/packages/frontend-2/components/presentation/state/Setup.vue b/packages/frontend-2/components/presentation/state/Setup.vue new file mode 100644 index 000000000..398beb253 --- /dev/null +++ b/packages/frontend-2/components/presentation/state/Setup.vue @@ -0,0 +1,51 @@ + + diff --git a/packages/frontend-2/components/presentation/viewer/Setup.vue b/packages/frontend-2/components/presentation/viewer/Setup.vue new file mode 100644 index 000000000..282bb1800 --- /dev/null +++ b/packages/frontend-2/components/presentation/viewer/Setup.vue @@ -0,0 +1,6 @@ + + diff --git a/packages/frontend-2/components/presentation/viewer/Wrapper.vue b/packages/frontend-2/components/presentation/viewer/Wrapper.vue new file mode 100644 index 000000000..8cb824276 --- /dev/null +++ b/packages/frontend-2/components/presentation/viewer/Wrapper.vue @@ -0,0 +1,80 @@ + + diff --git a/packages/frontend-2/components/viewer/Base.vue b/packages/frontend-2/components/viewer/Base.vue index f9a2b7ccf..c58997d38 100644 --- a/packages/frontend-2/components/viewer/Base.vue +++ b/packages/frontend-2/components/viewer/Base.vue @@ -7,7 +7,7 @@ diff --git a/packages/frontend-2/components/viewer/CoreSetup.vue b/packages/frontend-2/components/viewer/CoreSetup.vue new file mode 100644 index 000000000..ecfcb1596 --- /dev/null +++ b/packages/frontend-2/components/viewer/CoreSetup.vue @@ -0,0 +1,26 @@ + + diff --git a/packages/frontend-2/components/viewer/LoadingBar.vue b/packages/frontend-2/components/viewer/LoadingBar.vue index 6600cccd2..b5d256040 100644 --- a/packages/frontend-2/components/viewer/LoadingBar.vue +++ b/packages/frontend-2/components/viewer/LoadingBar.vue @@ -1,11 +1,6 @@ diff --git a/packages/frontend-2/components/viewer/PreSetupWrapper.vue b/packages/frontend-2/components/viewer/PageSetup.vue similarity index 60% rename from packages/frontend-2/components/viewer/PreSetupWrapper.vue rename to packages/frontend-2/components/viewer/PageSetup.vue index 31a677478..dec8ef78e 100644 --- a/packages/frontend-2/components/viewer/PreSetupWrapper.vue +++ b/packages/frontend-2/components/viewer/PageSetup.vue @@ -1,108 +1,98 @@