import { createHotContext as __vite__createHotContext } from "/_nuxt/@vite/client";import.meta.hot = __vite__createHotContext("/components/viewer/limits/WorkspaceDialog.vue");import { default as __nuxt_component_0 } from "/_nuxt/components/workspace/plan/LimitReachedDialog.vue"; /* Injection by vite-plugin-vue-inspector Start */ import { createElementVNode as __createElementVNode,createBlock as __createBlock } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29" function _interopVNode(vnode) { if (vnode && vnode.props && 'data-v-inspector' in vnode.props) { const data = vnode.props['data-v-inspector'] delete vnode.props['data-v-inspector'] Object.defineProperty(vnode.props, '__v_inspector', { value: data, enumerable: false }) } return vnode } function _createElementVNode(...args) { return _interopVNode(__createElementVNode(...args)) } function _createBlock(...args) { return _interopVNode(__createBlock(...args)) } /* Injection by vite-plugin-vue-inspector End */ import { useModel as _useModel, mergeModels as _mergeModels, defineComponent as _defineComponent } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { Roles } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js"; import { settingsWorkspaceRoutes } from "/_nuxt/lib/common/helpers/route.ts"; import { useEmbed } from "/_nuxt/lib/viewer/composables/setup/embed.ts"; import { useWorkspaceLimits } from "/_nuxt/lib/workspaces/composables/limits.ts"; import { useMixpanel } from "/_nuxt/lib/core/composables/mp.ts"; import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts"; import { useLoadLatestVersion } from "/_nuxt/lib/viewer/composables/resources.ts"; import { computed } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; import { navigateTo } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29"; const _sfc_main = /* @__PURE__ */ _defineComponent({ __name: "ViewerLimitsWorkspaceDialog", props: /* @__PURE__ */ _mergeModels({ limitType: { type: null, required: true }, project: { type: Object, required: true }, resourceIdString: { type: String, required: true } }, { "open": { type: Boolean, ...{ required: true } }, "openModifiers": {} }), emits: ["update:open"], setup(__props, { expose: __expose }) { __expose(); graphql(` fragment ViewerLimitsWorkspaceDialog_Project on Project { id workspace { id role slug ...WorkspacePlanLimits_Workspace } ...UseLoadLatestVersion_Project } `); const props = __props; const dialogOpen = _useModel(__props, "open"); const mixpanel = useMixpanel(); const { isEnabled: isEmbedEnabled } = useEmbed(); const { versionLimitFormatted } = useWorkspaceLimits({ slug: computed(() => props.project.workspace?.slug), workspace: computed(() => props.project.workspace) }); const { createButton: loadLatestButton } = useLoadLatestVersion({ project: computed(() => props.project), resourceIdString: computed(() => props.resourceIdString) }); const title = computed(() => { switch (props.limitType) { case "version": return "Plan limit reached"; case "federated": return "The federated models couldn't be loaded"; case "comment": return "The comment could not be loaded"; default: return "Plan limit reached"; } }); const message = computed(() => { switch (props.limitType) { case "version": return `The version you're trying to load is older than the ${versionLimitFormatted.value} version history limit allowed by your workspace plan. Upgrade your workspace plan to gain access.`; case "federated": return `One of the models is older than the ${versionLimitFormatted.value} version history limit allowed by your workspace plan. Upgrade your workspace plan to gain access.`; case "comment": return `Unable to load the comment because one or more of the referenced models is older than the ${versionLimitFormatted.value} version history limit. Upgrade your workspace plan to gain access.`; default: return "You've reached the limit of your plan. Please upgrade to continue."; } }); const explorePlansButton = { text: "Explore plans", disabled: props.project.workspace?.role === Roles.Workspace.Guest, disabledMessage: "As a Guest you cannot access plans and billing", onClick: () => { const slug = props.project.workspace?.slug; if (!slug) return; mixpanel.track("Limit Reached Dialog Upgrade Button Clicked", { type: props.limitType === "version" ? "version" : "model", location: "viewer", // eslint-disable-next-line camelcase workspace_id: slug }); return navigateTo(settingsWorkspaceRoutes.billing.route(slug)); } }; const buttons = computed(() => { const buttons2 = { version: isEmbedEnabled.value ? [loadLatestButton(false)] : [loadLatestButton(false), explorePlansButton], federated: isEmbedEnabled.value ? [loadLatestButton(false)] : [loadLatestButton(false), explorePlansButton], comment: [loadLatestButton(true)] }; return buttons2[props.limitType]; }); const __returned__ = { props, dialogOpen, mixpanel, isEmbedEnabled, versionLimitFormatted, loadLatestButton, title, message, explorePlansButton, buttons }; Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true }); return __returned__; } }); import { toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, resolveComponent as _resolveComponent, withCtx as _withCtx, openBlock as _openBlock, } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29"; const _hoisted_1 = { class: "mb-2", "data-v-inspector": "components/viewer/limits/WorkspaceDialog.vue:9:5" }; const _hoisted_2 = { "data-v-inspector": "components/viewer/limits/WorkspaceDialog.vue:10:7" }; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_WorkspacePlanLimitReachedDialog = __nuxt_component_0; return _openBlock(), _createBlock(_component_WorkspacePlanLimitReachedDialog, { open: $setup.dialogOpen, "onUpdate:open": _cache[0] || (_cache[0] = ($event) => $setup.dialogOpen = $event), buttons: $setup.buttons, "prevent-close": "", condensed: $setup.isEmbedEnabled || void 0, "data-v-inspector": "components/viewer/limits/WorkspaceDialog.vue:2:3" }, { header: _withCtx(() => [ _createTextVNode( _toDisplayString($setup.title), 1 /* TEXT */ ) ]), default: _withCtx(() => [ _createElementVNode("div", _hoisted_1, [ _createElementVNode( "p", _hoisted_2, _toDisplayString($setup.message), 1 /* TEXT */ ) ]) ]), _: 1 /* STABLE */ }, 8, ["open", "buttons", "condensed"]); } _sfc_main.__hmrId = "8f4bf638"; typeof __VUE_HMR_RUNTIME__ !== "undefined" && __VUE_HMR_RUNTIME__.createRecord(_sfc_main.__hmrId, _sfc_main); import.meta.hot.on("file-changed", ({ file }) => { __VUE_HMR_RUNTIME__.CHANGED_FILE = file; }); import.meta.hot.accept((mod) => { if (!mod) return; const { default: updated, _rerender_only } = mod; if (_rerender_only) { __VUE_HMR_RUNTIME__.rerender(updated.__hmrId, updated.render); } else { __VUE_HMR_RUNTIME__.reload(updated.__hmrId, updated); } }); import _export_sfc from "/_nuxt/@id/__x00__plugin-vue:export-helper"; export default /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "D:/speckle-server/packages/frontend-2/components/viewer/limits/WorkspaceDialog.vue"]]); //# sourceMappingURL=data:application/json;base64,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QUNDLFdBQVcseUJBQWtCO0FBQUEsSUFBVyxvQkFBaUI7QUFBQTtJQUUvQyxRQUFNLFNBQUMsTUFBVztBQUFBO3lCQUFSLFlBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQTtzQkFDMUIsTUFFTTtBQUFBLE1BRk4sb0JBRU0sT0FGTixZQUVNO0FBQUEsUUFESjtBQUFBLFVBQXlGO0FBQUEsVUFBekY7QUFBQSxVQUF5RixpQkFBZCxjQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJuYW1lcyI6WyJidXR0b25zIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIldvcmtzcGFjZURpYWxvZy52dWUiXSwic291cmNlc0NvbnRlbnQiOlsiPHRlbXBsYXRlPlxyXG4gIDxXb3Jrc3BhY2VQbGFuTGltaXRSZWFjaGVkRGlhbG9nXHJcbiAgICB2LW1vZGVsOm9wZW49XCJkaWFsb2dPcGVuXCJcclxuICAgIDpidXR0b25zPVwiYnV0dG9uc1wiXHJcbiAgICBwcmV2ZW50LWNsb3NlXHJcbiAgICA6Y29uZGVuc2VkPVwiaXNFbWJlZEVuYWJsZWQgfHwgdW5kZWZpbmVkXCIgZGF0YS12LWluc3BlY3Rvcj1cImNvbXBvbmVudHMvdmlld2VyL2xpbWl0cy9Xb3Jrc3BhY2VEaWFsb2cudnVlOjI6M1wiXHJcbiAgPlxyXG4gICAgPHRlbXBsYXRlICNoZWFkZXI+e3sgdGl0bGUgfX08L3RlbXBsYXRlPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTJcIiBkYXRhLXYtaW5zcGVjdG9yPVwiY29tcG9uZW50cy92aWV3ZXIvbGltaXRzL1dvcmtzcGFjZURpYWxvZy52dWU6OTo1XCI+XHJcbiAgICAgIDxwIGRhdGEtdi1pbnNwZWN0b3I9XCJjb21wb25lbnRzL3ZpZXdlci9saW1pdHMvV29ya3NwYWNlRGlhbG9nLnZ1ZToxMDo3XCI+e3sgbWVzc2FnZSB9fTwvcD5cclxuICAgIDwvZGl2PlxyXG4gIDwvV29ya3NwYWNlUGxhbkxpbWl0UmVhY2hlZERpYWxvZz5cclxuPC90ZW1wbGF0ZT5cclxuPHNjcmlwdCBzZXR1cCBsYW5nPVwidHNcIj5cclxuaW1wb3J0IHsgUm9sZXMgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB0eXBlIHsgTGF5b3V0RGlhbG9nQnV0dG9uIH0gZnJvbSAnQHNwZWNrbGUvdWktY29tcG9uZW50cydcclxuaW1wb3J0IHsgc2V0dGluZ3NXb3Jrc3BhY2VSb3V0ZXMgfSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9yb3V0ZSdcclxuaW1wb3J0IHsgdXNlRW1iZWQgfSBmcm9tICd+L2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2V0dXAvZW1iZWQnXHJcbmltcG9ydCB7IHVzZVdvcmtzcGFjZUxpbWl0cyB9IGZyb20gJ34vbGliL3dvcmtzcGFjZXMvY29tcG9zYWJsZXMvbGltaXRzJ1xyXG5pbXBvcnQgeyB1c2VNaXhwYW5lbCB9IGZyb20gJ34vbGliL2NvcmUvY29tcG9zYWJsZXMvbXAnXHJcbmltcG9ydCB7IGdyYXBocWwgfSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbCdcclxuaW1wb3J0IHR5cGUgeyBWaWV3ZXJMaW1pdHNXb3Jrc3BhY2VEaWFsb2dfUHJvamVjdEZyYWdtZW50IH0gZnJvbSAnfi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHR5cGUgeyBWaWV3ZXJMaW1pdHNEaWFsb2dUeXBlIH0gZnJvbSAnfi9saWIvcHJvamVjdHMvaGVscGVycy9saW1pdHMnXHJcbmltcG9ydCB7IHVzZUxvYWRMYXRlc3RWZXJzaW9uIH0gZnJvbSAnfi9saWIvdmlld2VyL2NvbXBvc2FibGVzL3Jlc291cmNlcydcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFZpZXdlckxpbWl0c1dvcmtzcGFjZURpYWxvZ19Qcm9qZWN0IG9uIFByb2plY3Qge1xyXG4gICAgaWRcclxuICAgIHdvcmtzcGFjZSB7XHJcbiAgICAgIGlkXHJcbiAgICAgIHJvbGVcclxuICAgICAgc2x1Z1xyXG4gICAgICAuLi5Xb3Jrc3BhY2VQbGFuTGltaXRzX1dvcmtzcGFjZVxyXG4gICAgfVxyXG4gICAgLi4uVXNlTG9hZExhdGVzdFZlcnNpb25fUHJvamVjdFxyXG4gIH1cclxuYClcclxuXHJcbmNvbnN0IHByb3BzID0gZGVmaW5lUHJvcHM8e1xyXG4gIGxpbWl0VHlwZTogVmlld2VyTGltaXRzRGlhbG9nVHlwZVxyXG4gIHByb2plY3Q6IFZpZXdlckxpbWl0c1dvcmtzcGFjZURpYWxvZ19Qcm9qZWN0RnJhZ21lbnRcclxuICByZXNvdXJjZUlkU3RyaW5nOiBzdHJpbmdcclxufT4oKVxyXG5cclxuY29uc3QgZGlhbG9nT3BlbiA9IGRlZmluZU1vZGVsPGJvb2xlYW4+KCdvcGVuJywge1xyXG4gIHJlcXVpcmVkOiB0cnVlXHJcbn0pXHJcblxyXG5jb25zdCBtaXhwYW5lbCA9IHVzZU1peHBhbmVsKClcclxuY29uc3QgeyBpc0VuYWJsZWQ6IGlzRW1iZWRFbmFibGVkIH0gPSB1c2VFbWJlZCgpXHJcbmNvbnN0IHsgdmVyc2lvbkxpbWl0Rm9ybWF0dGVkIH0gPSB1c2VXb3Jrc3BhY2VMaW1pdHMoe1xyXG4gIHNsdWc6IGNvbXB1dGVkKCgpID0+IHByb3BzLnByb2plY3Qud29ya3NwYWNlPy5zbHVnKSxcclxuICB3b3Jrc3BhY2U6IGNvbXB1dGVkKCgpID0+IHByb3BzLnByb2plY3Qud29ya3NwYWNlKVxyXG59KVxyXG5cclxuY29uc3QgeyBjcmVhdGVCdXR0b246IGxvYWRMYXRlc3RCdXR0b24gfSA9IHVzZUxvYWRMYXRlc3RWZXJzaW9uKHtcclxuICBwcm9qZWN0OiBjb21wdXRlZCgoKSA9PiBwcm9wcy5wcm9qZWN0KSxcclxuICByZXNvdXJjZUlkU3RyaW5nOiBjb21wdXRlZCgoKSA9PiBwcm9wcy5yZXNvdXJjZUlkU3RyaW5nKVxyXG59KVxyXG5cclxuY29uc3QgdGl0bGUgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgc3dpdGNoIChwcm9wcy5saW1pdFR5cGUpIHtcclxuICAgIGNhc2UgJ3ZlcnNpb24nOlxyXG4gICAgICByZXR1cm4gJ1BsYW4gbGltaXQgcmVhY2hlZCdcclxuICAgIGNhc2UgJ2ZlZGVyYXRlZCc6XHJcbiAgICAgIHJldHVybiBcIlRoZSBmZWRlcmF0ZWQgbW9kZWxzIGNvdWxkbid0IGJlIGxvYWRlZFwiXHJcbiAgICBjYXNlICdjb21tZW50JzpcclxuICAgICAgcmV0dXJuICdUaGUgY29tbWVudCBjb3VsZCBub3QgYmUgbG9hZGVkJ1xyXG4gICAgZGVmYXVsdDpcclxuICAgICAgcmV0dXJuICdQbGFuIGxpbWl0IHJlYWNoZWQnXHJcbiAgfVxyXG59KVxyXG5cclxuY29uc3QgbWVzc2FnZSA9IGNvbXB1dGVkKCgpID0+IHtcclxuICBzd2l0Y2ggKHByb3BzLmxpbWl0VHlwZSkge1xyXG4gICAgY2FzZSAndmVyc2lvbic6XHJcbiAgICAgIHJldHVybiBgVGhlIHZlcnNpb24geW91J3JlIHRyeWluZyB0byBsb2FkIGlzIG9sZGVyIHRoYW4gdGhlICR7dmVyc2lvbkxpbWl0Rm9ybWF0dGVkLnZhbHVlfSB2ZXJzaW9uIGhpc3RvcnkgbGltaXQgYWxsb3dlZCBieSB5b3VyIHdvcmtzcGFjZSBwbGFuLiBVcGdyYWRlIHlvdXIgd29ya3NwYWNlIHBsYW4gdG8gZ2FpbiBhY2Nlc3MuYFxyXG4gICAgY2FzZSAnZmVkZXJhdGVkJzpcclxuICAgICAgcmV0dXJuIGBPbmUgb2YgdGhlIG1vZGVscyBpcyBvbGRlciB0aGFuIHRoZSAke3ZlcnNpb25MaW1pdEZvcm1hdHRlZC52YWx1ZX0gdmVyc2lvbiBoaXN0b3J5IGxpbWl0IGFsbG93ZWQgYnkgeW91ciB3b3Jrc3BhY2UgcGxhbi4gVXBncmFkZSB5b3VyIHdvcmtzcGFjZSBwbGFuIHRvIGdhaW4gYWNjZXNzLmBcclxuICAgIGNhc2UgJ2NvbW1lbnQnOlxyXG4gICAgICByZXR1cm4gYFVuYWJsZSB0byBsb2FkIHRoZSBjb21tZW50IGJlY2F1c2Ugb25lIG9yIG1vcmUgb2YgdGhlIHJlZmVyZW5jZWQgbW9kZWxzIGlzIG9sZGVyIHRoYW4gdGhlICR7dmVyc2lvbkxpbWl0Rm9ybWF0dGVkLnZhbHVlfSB2ZXJzaW9uIGhpc3RvcnkgbGltaXQuIFVwZ3JhZGUgeW91ciB3b3Jrc3BhY2UgcGxhbiB0byBnYWluIGFjY2Vzcy5gXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gXCJZb3UndmUgcmVhY2hlZCB0aGUgbGltaXQgb2YgeW91ciBwbGFuLiBQbGVhc2UgdXBncmFkZSB0byBjb250aW51ZS5cIlxyXG4gIH1cclxufSlcclxuXHJcbmNvbnN0IGV4cGxvcmVQbGFuc0J1dHRvbjogTGF5b3V0RGlhbG9nQnV0dG9uID0ge1xyXG4gIHRleHQ6ICdFeHBsb3JlIHBsYW5zJyxcclxuICBkaXNhYmxlZDogcHJvcHMucHJvamVjdC53b3Jrc3BhY2U/LnJvbGUgPT09IFJvbGVzLldvcmtzcGFjZS5HdWVzdCxcclxuICBkaXNhYmxlZE1lc3NhZ2U6ICdBcyBhIEd1ZXN0IHlvdSBjYW5ub3QgYWNjZXNzIHBsYW5zIGFuZCBiaWxsaW5nJyxcclxuICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICBjb25zdCBzbHVnID0gcHJvcHMucHJvamVjdC53b3Jrc3BhY2U/LnNsdWdcclxuICAgIGlmICghc2x1ZykgcmV0dXJuXHJcblxyXG4gICAgbWl4cGFuZWwudHJhY2soJ0xpbWl0IFJlYWNoZWQgRGlhbG9nIFVwZ3JhZGUgQnV0dG9uIENsaWNrZWQnLCB7XHJcbiAgICAgIHR5cGU6IHByb3BzLmxpbWl0VHlwZSA9PT0gJ3ZlcnNpb24nID8gJ3ZlcnNpb24nIDogJ21vZGVsJyxcclxuICAgICAgbG9jYXRpb246ICd2aWV3ZXInLFxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXHJcbiAgICAgIHdvcmtzcGFjZV9pZDogc2x1Z1xyXG4gICAgfSlcclxuICAgIHJldHVybiBuYXZpZ2F0ZVRvKHNldHRpbmdzV29ya3NwYWNlUm91dGVzLmJpbGxpbmcucm91dGUoc2x1ZykpXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBidXR0b25zID0gY29tcHV0ZWQoKCk6IExheW91dERpYWxvZ0J1dHRvbltdID0+IHtcclxuICBjb25zdCBidXR0b25zOiBSZWNvcmQ8Vmlld2VyTGltaXRzRGlhbG9nVHlwZSwgTGF5b3V0RGlhbG9nQnV0dG9uW10+ID0ge1xyXG4gICAgdmVyc2lvbjogaXNFbWJlZEVuYWJsZWQudmFsdWVcclxuICAgICAgPyBbbG9hZExhdGVzdEJ1dHRvbihmYWxzZSldXHJcbiAgICAgIDogW2xvYWRMYXRlc3RCdXR0b24oZmFsc2UpLCBleHBsb3JlUGxhbnNCdXR0b25dLFxyXG4gICAgZmVkZXJhdGVkOiBpc0VtYmVkRW5hYmxlZC52YWx1ZVxyXG4gICAgICA/IFtsb2FkTGF0ZXN0QnV0dG9uKGZhbHNlKV1cclxuICAgICAgOiBbbG9hZExhdGVzdEJ1dHRvbihmYWxzZSksIGV4cGxvcmVQbGFuc0J1dHRvbl0sXHJcbiAgICBjb21tZW50OiBbbG9hZExhdGVzdEJ1dHRvbih0cnVlKV1cclxuICB9XHJcblxyXG4gIHJldHVybiBidXR0b25zW3Byb3BzLmxpbWl0VHlwZV1cclxufSlcclxuPC9zY3JpcHQ+XHJcbiJdLCJmaWxlIjoiRDovc3BlY2tsZS1zZXJ2ZXIvcGFja2FnZXMvZnJvbnRlbmQtMi9jb21wb25lbnRzL3ZpZXdlci9saW1pdHMvV29ya3NwYWNlRGlhbG9nLnZ1ZSJ9