287 lines
32 KiB
Plaintext
287 lines
32 KiB
Plaintext
import { useMutationLoading } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
|
|
import { graphql } from "/_nuxt/lib/common/generated/gql/index.ts";
|
|
import {
|
|
ViewPositionInputType
|
|
} from "/_nuxt/lib/common/generated/gql/graphql.ts";
|
|
import { ensureError, safeParse } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import { has, isObjectLike } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
|
|
import { useUpdateSavedView } from "/_nuxt/lib/viewer/composables/savedViews/management.ts";
|
|
import { isUngroupedGroup } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/saved-views/index.js";
|
|
|
|
import { useState } from "/_nuxt/node_modules/nuxt/dist/app/composables/state.js?v=e4f18c29";
|
|
import { ref, computed, unref, watch } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
import { useGlobalToast } from "/_nuxt/composables/globals.ts";
|
|
import { ToastNotificationType, getFirstGqlErrorMessage } from "/_nuxt/utils/globals.ts";
|
|
const isDraggableView = (view) => isObjectLike(view) && has(view, "id") && has(view, "permissions.canUpdate");
|
|
const useDraggingViewId = () => useState("dragging-view-id", () => null);
|
|
graphql(`
|
|
fragment UseDraggableView_SavedView on SavedView {
|
|
id
|
|
projectId
|
|
name
|
|
position
|
|
group {
|
|
id
|
|
}
|
|
permissions {
|
|
canMove {
|
|
...FullPermissionCheckResult
|
|
}
|
|
}
|
|
...UseUpdateSavedView_SavedView
|
|
}
|
|
`);
|
|
export const useDraggableView = (params) => {
|
|
const isDragging = ref(false);
|
|
const isLoading = useMutationLoading();
|
|
const draggingViewId = useDraggingViewId();
|
|
const classes = computed(() => {
|
|
const classParts = ["draggable-view"];
|
|
if (isDragging.value) {
|
|
classParts.push("opacity-50 scale-95");
|
|
}
|
|
return classParts.join(" ");
|
|
});
|
|
const vOn = {
|
|
dragstart: (event) => {
|
|
if (!event.dataTransfer) return;
|
|
if (!params.view.value.permissions.canMove.authorized || isLoading.value) {
|
|
event.preventDefault();
|
|
return;
|
|
}
|
|
isDragging.value = true;
|
|
draggingViewId.value = params.view.value.id;
|
|
event.dataTransfer.setData("application/json", JSON.stringify(params.view.value));
|
|
event.dataTransfer.effectAllowed = "move";
|
|
const imageTarget = event.target.closest(".draggable-view") || event.target;
|
|
event.dataTransfer.setDragImage(imageTarget, 0, 0);
|
|
},
|
|
dragend: () => {
|
|
isDragging.value = false;
|
|
draggingViewId.value = null;
|
|
}
|
|
};
|
|
return {
|
|
classes,
|
|
on: vOn
|
|
};
|
|
};
|
|
graphql(`
|
|
fragment UseDraggableViewTargetView_SavedView on SavedView {
|
|
id
|
|
name
|
|
position
|
|
group {
|
|
id
|
|
}
|
|
}
|
|
`);
|
|
export const useDraggableViewTargetView = (params) => {
|
|
const isDragOver = ref(false);
|
|
const dragCounter = ref(0);
|
|
const dropPosition = ref(null);
|
|
const { triggerNotification } = useGlobalToast();
|
|
const updateView = useUpdateSavedView();
|
|
const draggingViewId = useDraggingViewId();
|
|
const vOn = {
|
|
dragover: (event) => {
|
|
if (!event.dataTransfer) return;
|
|
event.preventDefault();
|
|
event.dataTransfer.dropEffect = "move";
|
|
if (draggingViewId.value === params.view.value.id) {
|
|
dropPosition.value = null;
|
|
return;
|
|
}
|
|
const targetRect = event.currentTarget.getBoundingClientRect();
|
|
const yPosition = event.clientY - targetRect.top;
|
|
const isTopHalf = yPosition < targetRect.height / 2;
|
|
dropPosition.value = isTopHalf ? "top" : "bottom";
|
|
},
|
|
drop: async (event) => {
|
|
if (!event.dataTransfer) return;
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
isDragOver.value = false;
|
|
dragCounter.value = 0;
|
|
dropPosition.value = null;
|
|
try {
|
|
const data = event.dataTransfer.getData("application/json");
|
|
const view = safeParse(data, isDraggableView);
|
|
if (!view) return;
|
|
if (view.id === params.view.value.id) {
|
|
return;
|
|
}
|
|
const targetRect = event.currentTarget.getBoundingClientRect();
|
|
const dropYPosition = event.clientY - targetRect.top;
|
|
const dropInTopHalf = dropYPosition < targetRect.height / 2;
|
|
await updateView(
|
|
{
|
|
view,
|
|
input: {
|
|
id: view.id,
|
|
projectId: view.projectId,
|
|
groupId: params.view.value.group.id,
|
|
position: {
|
|
type: ViewPositionInputType.Between,
|
|
...dropInTopHalf ? { beforeViewId: params.view.value.id } : { afterViewId: params.view.value.id }
|
|
}
|
|
}
|
|
},
|
|
{
|
|
skipToast: true,
|
|
onFullResult: (res, success) => {
|
|
if (success) {
|
|
params.onMoved?.();
|
|
} else {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to move view",
|
|
description: getFirstGqlErrorMessage(res?.errors)
|
|
});
|
|
}
|
|
}
|
|
}
|
|
);
|
|
} catch (e) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to move view",
|
|
description: ensureError(e).message
|
|
});
|
|
}
|
|
},
|
|
dragenter: (event) => {
|
|
event.preventDefault();
|
|
dragCounter.value++;
|
|
isDragOver.value = true;
|
|
},
|
|
dragleave: () => {
|
|
dragCounter.value--;
|
|
if (dragCounter.value === 0) {
|
|
isDragOver.value = false;
|
|
dropPosition.value = null;
|
|
}
|
|
}
|
|
};
|
|
const classes = computed(() => {
|
|
const classParts = ["draggable-view-target"];
|
|
if (isDragOver.value && dropPosition.value === "top") {
|
|
classParts.push(
|
|
"before:absolute before:left-0 before:right-0 before:top-0 before:h-[2px] before:bg-primary before:rounded-full before:z-10 before:-translate-y-1/2"
|
|
);
|
|
} else if (isDragOver.value && dropPosition.value === "bottom") {
|
|
classParts.push(
|
|
"after:absolute after:left-0 after:right-0 after:bottom-0 after:h-[2px] after:bg-primary after:rounded-full after:z-10 after:translate-y-1/2"
|
|
);
|
|
}
|
|
return classParts.join(" ");
|
|
});
|
|
return {
|
|
on: vOn,
|
|
classes
|
|
};
|
|
};
|
|
graphql(`
|
|
fragment UseDraggableViewTargetGroup_SavedViewGroup on SavedViewGroup {
|
|
id
|
|
title
|
|
}
|
|
`);
|
|
export const useDraggableViewTargetGroup = (params) => {
|
|
const enabled = computed(() => unref(params.enabled) ?? true);
|
|
const isDragOver = ref(false);
|
|
const { triggerNotification } = useGlobalToast();
|
|
const updateView = useUpdateSavedView();
|
|
const isGroupOpen = computed(() => unref(params.isGroupOpen) ?? false);
|
|
const viewCount = computed(() => unref(params.viewCount) ?? 0);
|
|
const vOn = {
|
|
dragover: (event) => {
|
|
if (!event.dataTransfer || !enabled.value) return;
|
|
event.preventDefault();
|
|
event.dataTransfer.dropEffect = "move";
|
|
const target = event.target;
|
|
const isOverGroupHeader = target.closest('button[class*="group/disclosure"]');
|
|
if (isOverGroupHeader) {
|
|
isDragOver.value = true;
|
|
} else if (isGroupOpen.value && viewCount.value === 0) {
|
|
const isOverView = target.closest(".draggable-view");
|
|
isDragOver.value = !isOverView;
|
|
} else {
|
|
isDragOver.value = false;
|
|
}
|
|
},
|
|
drop: async (event) => {
|
|
if (!event.dataTransfer || !enabled.value) return;
|
|
event.preventDefault();
|
|
isDragOver.value = false;
|
|
try {
|
|
const data = event.dataTransfer.getData("application/json");
|
|
const view = safeParse(data, isDraggableView);
|
|
if (!view) return;
|
|
const sameGroupId = view.group.id === params.group.value.id;
|
|
const bothUngrouped = isUngroupedGroup(view.group.id) && isUngroupedGroup(params.group.value.id);
|
|
if (sameGroupId || bothUngrouped) {
|
|
return;
|
|
}
|
|
await updateView(
|
|
{
|
|
view,
|
|
input: {
|
|
id: view.id,
|
|
projectId: view.projectId,
|
|
groupId: params.group.value.id
|
|
}
|
|
},
|
|
{
|
|
skipToast: true,
|
|
onFullResult: (res, success) => {
|
|
if (success) {
|
|
params.onMoved?.();
|
|
} else {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to move view",
|
|
description: getFirstGqlErrorMessage(res?.errors)
|
|
});
|
|
}
|
|
}
|
|
}
|
|
);
|
|
} catch (e) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to move view",
|
|
description: ensureError(e).message
|
|
});
|
|
}
|
|
},
|
|
dragenter: (event) => {
|
|
event.preventDefault();
|
|
},
|
|
dragleave: (event) => {
|
|
const relatedTarget = event.relatedTarget;
|
|
const currentTarget = event.currentTarget;
|
|
if (!relatedTarget || !currentTarget.contains(relatedTarget)) {
|
|
isDragOver.value = false;
|
|
}
|
|
}
|
|
};
|
|
const classes = computed(() => {
|
|
const classParts = ["draggable-view-target"];
|
|
if (isDragOver.value) {
|
|
classParts.push("rounded-md ring-2 ring-primary ring-opacity-50 bg-primary/5");
|
|
}
|
|
return classParts.join(" ");
|
|
});
|
|
watch(enabled, (newVal, oldVal) => {
|
|
if (newVal && !oldVal) {
|
|
isDragOver.value = false;
|
|
}
|
|
});
|
|
return {
|
|
on: vOn,
|
|
classes
|
|
};
|
|
};
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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IHsgdXNlTXV0YXRpb25Mb2FkaW5nIH0gZnJvbSAnQHZ1ZS9hcG9sbG8tY29tcG9zYWJsZSdcclxuaW1wb3J0IHsgZ3JhcGhxbCB9IGZyb20gJ34vbGliL2NvbW1vbi9nZW5lcmF0ZWQvZ3FsJ1xyXG5pbXBvcnQge1xyXG4gIFZpZXdQb3NpdGlvbklucHV0VHlwZSxcclxuICB0eXBlIFVzZURyYWdnYWJsZVZpZXdfU2F2ZWRWaWV3RnJhZ21lbnQsXHJcbiAgdHlwZSBVc2VEcmFnZ2FibGVWaWV3VGFyZ2V0R3JvdXBfU2F2ZWRWaWV3R3JvdXBGcmFnbWVudCxcclxuICB0eXBlIFVzZURyYWdnYWJsZVZpZXdUYXJnZXRWaWV3X1NhdmVkVmlld0ZyYWdtZW50XHJcbn0gZnJvbSAnfi9saWIvY29tbW9uL2dlbmVyYXRlZC9ncWwvZ3JhcGhxbCdcclxuaW1wb3J0IHsgZW5zdXJlRXJyb3IsIHNhZmVQYXJzZSB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgaGFzLCBpc09iamVjdExpa2UgfSBmcm9tICdsb2Rhc2gtZXMnXHJcbmltcG9ydCB7IHVzZVVwZGF0ZVNhdmVkVmlldyB9IGZyb20gJ34vbGliL3ZpZXdlci9jb21wb3NhYmxlcy9zYXZlZFZpZXdzL21hbmFnZW1lbnQnXHJcbmltcG9ydCB7IGlzVW5ncm91cGVkR3JvdXAgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQvZGlzdC9lc20vc2F2ZWQtdmlld3MvaW5kZXguanMnXHJcblxyXG5jb25zdCBpc0RyYWdnYWJsZVZpZXcgPSAodmlldzogdW5rbm93bik6IHZpZXcgaXMgVXNlRHJhZ2dhYmxlVmlld19TYXZlZFZpZXdGcmFnbWVudCA9PlxyXG4gIGlzT2JqZWN0TGlrZSh2aWV3KSAmJiBoYXModmlldywgJ2lkJykgJiYgaGFzKHZpZXcsICdwZXJtaXNzaW9ucy5jYW5VcGRhdGUnKVxyXG5cclxuLy8gVHJhY2sgZHJhZ2dlZCB2aWV3IElEIHRvIGhpZGUgZHJvcCBpbmRpY2F0b3Igd2hlbiBob3ZlcmluZyBvdmVyIGl0c2VsZlxyXG4vLyAobmVlZGVkIGR1cmluZyBkcmFnb3ZlciBmb3IgcmVhbC10aW1lIHZpc3VhbCBmZWVkYmFjayAtIGdldERhdGEoKSBvbmx5IHdvcmtzIGR1cmluZyBkcm9wKVxyXG5jb25zdCB1c2VEcmFnZ2luZ1ZpZXdJZCA9ICgpID0+IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KCdkcmFnZ2luZy12aWV3LWlkJywgKCkgPT4gbnVsbClcclxuXHJcbmdyYXBocWwoYFxyXG4gIGZyYWdtZW50IFVzZURyYWdnYWJsZVZpZXdfU2F2ZWRWaWV3IG9uIFNhdmVkVmlldyB7XHJcbiAgICBpZFxyXG4gICAgcHJvamVjdElkXHJcbiAgICBuYW1lXHJcbiAgICBwb3NpdGlvblxyXG4gICAgZ3JvdXAge1xyXG4gICAgICBpZFxyXG4gICAgfVxyXG4gICAgcGVybWlzc2lvbnMge1xyXG4gICAgICBjYW5Nb3ZlIHtcclxuICAgICAgICAuLi5GdWxsUGVybWlzc2lvbkNoZWNrUmVzdWx0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC4uLlVzZVVwZGF0ZVNhdmVkVmlld19TYXZlZFZpZXdcclxuICB9XHJcbmApXHJcblxyXG5leHBvcnQgY29uc3QgdXNlRHJhZ2dhYmxlVmlldyA9IChwYXJhbXM6IHtcclxuICB2aWV3OiBSZWY8VXNlRHJhZ2dhYmxlVmlld19TYXZlZFZpZXdGcmFnbWVudD5cclxufSkgPT4ge1xyXG4gIGNvbnN0IGlzRHJhZ2dpbmcgPSByZWYoZmFsc2UpXHJcbiAgY29uc3QgaXNMb2FkaW5nID0gdXNlTXV0YXRpb25Mb2FkaW5nKClcclxuICBjb25zdCBkcmFnZ2luZ1ZpZXdJZCA9IHVzZURyYWdnaW5nVmlld0lkKClcclxuXHJcbiAgY29uc3QgY2xhc3NlcyA9IGNvbXB1dGVkKCgpID0+IHtcclxuICAgIGNvbnN0IGNsYXNzUGFydHM6IHN0cmluZ1tdID0gWydkcmFnZ2FibGUtdmlldyddXHJcblxyXG4gICAgaWYgKGlzRHJhZ2dpbmcudmFsdWUpIHtcclxuICAgICAgY2xhc3NQYXJ0cy5wdXNoKCdvcGFjaXR5LTUwIHNjYWxlLTk1JylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxuICB9KVxyXG5cclxuICBjb25zdCB2T24gPSB7XHJcbiAgICBkcmFnc3RhcnQ6IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XHJcbiAgICAgIGlmICghZXZlbnQuZGF0YVRyYW5zZmVyKSByZXR1cm5cclxuICAgICAgaWYgKCFwYXJhbXMudmlldy52YWx1ZS5wZXJtaXNzaW9ucy5jYW5Nb3ZlLmF1dGhvcml6ZWQgfHwgaXNMb2FkaW5nLnZhbHVlKSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpc0RyYWdnaW5nLnZhbHVlID0gdHJ1ZVxyXG4gICAgICBkcmFnZ2luZ1ZpZXdJZC52YWx1ZSA9IHBhcmFtcy52aWV3LnZhbHVlLmlkXHJcbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREYXRhKCdhcHBsaWNhdGlvbi9qc29uJywgSlNPTi5zdHJpbmdpZnkocGFyYW1zLnZpZXcudmFsdWUpKVxyXG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJ1xyXG5cclxuICAgICAgY29uc3QgaW1hZ2VUYXJnZXQgPVxyXG4gICAgICAgIChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoJy5kcmFnZ2FibGUtdmlldycpIHx8XHJcbiAgICAgICAgKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudClcclxuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShpbWFnZVRhcmdldCwgMCwgMClcclxuICAgIH0sXHJcbiAgICBkcmFnZW5kOiAoKSA9PiB7XHJcbiAgICAgIGlzRHJhZ2dpbmcudmFsdWUgPSBmYWxzZVxyXG4gICAgICBkcmFnZ2luZ1ZpZXdJZC52YWx1ZSA9IG51bGxcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBjbGFzc2VzLFxyXG4gICAgb246IHZPblxyXG4gIH1cclxufVxyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgVXNlRHJhZ2dhYmxlVmlld1RhcmdldFZpZXdfU2F2ZWRWaWV3IG9uIFNhdmVkVmlldyB7XHJcbiAgICBpZFxyXG4gICAgbmFtZVxyXG4gICAgcG9zaXRpb25cclxuICAgIGdyb3VwIHtcclxuICAgICAgaWRcclxuICAgIH1cclxuICB9XHJcbmApXHJcblxyXG5leHBvcnQgY29uc3QgdXNlRHJhZ2dhYmxlVmlld1RhcmdldFZpZXcgPSAocGFyYW1zOiB7XHJcbiAgdmlldzogUmVmPFVzZURyYWdnYWJsZVZpZXdUYXJnZXRWaWV3X1NhdmVkVmlld0ZyYWdtZW50PlxyXG4gIG9uTW92ZWQ/OiAoKSA9PiB2b2lkXHJcbn0pID0+IHtcclxuICBjb25zdCBpc0RyYWdPdmVyID0gcmVmKGZhbHNlKVxyXG4gIGNvbnN0IGRyYWdDb3VudGVyID0gcmVmKDApXHJcbiAgY29uc3QgZHJvcFBvc2l0aW9uID0gcmVmPCd0b3AnIHwgJ2JvdHRvbScgfCBudWxsPihudWxsKVxyXG4gIGNvbnN0IHsgdHJpZ2dlck5vdGlmaWNhdGlvbiB9ID0gdXNlR2xvYmFsVG9hc3QoKVxyXG4gIGNvbnN0IHVwZGF0ZVZpZXcgPSB1c2VVcGRhdGVTYXZlZFZpZXcoKVxyXG4gIGNvbnN0IGRyYWdnaW5nVmlld0lkID0gdXNlRHJhZ2dpbmdWaWV3SWQoKVxyXG5cclxuICBjb25zdCB2T24gPSB7XHJcbiAgICBkcmFnb3ZlcjogKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcclxuICAgICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIpIHJldHVyblxyXG5cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJ1xyXG5cclxuICAgICAgLy8gRG9uJ3Qgc2hvdyBkcm9wIGluZGljYXRvciBpZiBkcmFnZ2luZyBvdmVyIGl0c2VsZlxyXG4gICAgICBpZiAoZHJhZ2dpbmdWaWV3SWQudmFsdWUgPT09IHBhcmFtcy52aWV3LnZhbHVlLmlkKSB7XHJcbiAgICAgICAgZHJvcFBvc2l0aW9uLnZhbHVlID0gbnVsbFxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUcmFjayBkcm9wIHBvc2l0aW9uIGZvciB2aXN1YWwgZmVlZGJhY2tcclxuICAgICAgY29uc3QgdGFyZ2V0UmVjdCA9IChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG4gICAgICBjb25zdCB5UG9zaXRpb24gPSBldmVudC5jbGllbnRZIC0gdGFyZ2V0UmVjdC50b3BcclxuICAgICAgY29uc3QgaXNUb3BIYWxmID0geVBvc2l0aW9uIDwgdGFyZ2V0UmVjdC5oZWlnaHQgLyAyXHJcbiAgICAgIGRyb3BQb3NpdGlvbi52YWx1ZSA9IGlzVG9wSGFsZiA/ICd0b3AnIDogJ2JvdHRvbSdcclxuICAgIH0sXHJcbiAgICBkcm9wOiBhc3luYyAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xyXG4gICAgICBpZiAoIWV2ZW50LmRhdGFUcmFuc2ZlcikgcmV0dXJuXHJcblxyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIC8vIFN0b3AgZXZlbnQgZnJvbSBidWJibGluZyB0byBncm91cCBkcm9wIGhhbmRsZXJcclxuICAgICAgaXNEcmFnT3Zlci52YWx1ZSA9IGZhbHNlXHJcbiAgICAgIGRyYWdDb3VudGVyLnZhbHVlID0gMFxyXG4gICAgICBkcm9wUG9zaXRpb24udmFsdWUgPSBudWxsXHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgnYXBwbGljYXRpb24vanNvbicpXHJcbiAgICAgICAgY29uc3QgdmlldyA9IHNhZmVQYXJzZShkYXRhLCBpc0RyYWdnYWJsZVZpZXcpXHJcbiAgICAgICAgaWYgKCF2aWV3KSByZXR1cm5cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaWYgc2FtZSB2aWV3XHJcbiAgICAgICAgaWYgKHZpZXcuaWQgPT09IHBhcmFtcy52aWV3LnZhbHVlLmlkKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNlZSB3aGV0aGVyIHZpZXcgd2FzIGRyb3BwZWQgY2xvc2VyIHRvIHRvcCBvciBib3R0b20gdG8gZmlndXJlIG91dFxyXG4gICAgICAgIC8vIHdoZXRoZXIgdG8gcHV0IGl0IGJlZm9yZSBvciBhZnRlciB0aGUgdGFyZ2V0IHZpZXdcclxuICAgICAgICAvLyBVc2UgY3VycmVudFRhcmdldCB0byBtYXRjaCB0aGUgZHJhZ292ZXIgY2FsY3VsYXRpb25cclxuICAgICAgICBjb25zdCB0YXJnZXRSZWN0ID0gKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXHJcbiAgICAgICAgY29uc3QgZHJvcFlQb3NpdGlvbiA9IGV2ZW50LmNsaWVudFkgLSB0YXJnZXRSZWN0LnRvcFxyXG4gICAgICAgIGNvbnN0IGRyb3BJblRvcEhhbGYgPSBkcm9wWVBvc2l0aW9uIDwgdGFyZ2V0UmVjdC5oZWlnaHQgLyAyXHJcblxyXG4gICAgICAgIGF3YWl0IHVwZGF0ZVZpZXcoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHZpZXcsXHJcbiAgICAgICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICAgICAgaWQ6IHZpZXcuaWQsXHJcbiAgICAgICAgICAgICAgcHJvamVjdElkOiB2aWV3LnByb2plY3RJZCxcclxuICAgICAgICAgICAgICBncm91cElkOiBwYXJhbXMudmlldy52YWx1ZS5ncm91cC5pZCxcclxuICAgICAgICAgICAgICBwb3NpdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogVmlld1Bvc2l0aW9uSW5wdXRUeXBlLkJldHdlZW4sXHJcbiAgICAgICAgICAgICAgICAuLi4oZHJvcEluVG9wSGFsZlxyXG4gICAgICAgICAgICAgICAgICA/IHsgYmVmb3JlVmlld0lkOiBwYXJhbXMudmlldy52YWx1ZS5pZCB9XHJcbiAgICAgICAgICAgICAgICAgIDogeyBhZnRlclZpZXdJZDogcGFyYW1zLnZpZXcudmFsdWUuaWQgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHNraXBUb2FzdDogdHJ1ZSxcclxuICAgICAgICAgICAgb25GdWxsUmVzdWx0OiAocmVzLCBzdWNjZXNzKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vIG5vdGlmaWNhdGlvbiBoZXJlLCB0aGlzIGNhbiBnZXQgbm9pc3lcclxuICAgICAgICAgICAgICAgIHBhcmFtcy5vbk1vdmVkPy4oKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0cmlnZ2VyTm90aWZpY2F0aW9uKHtcclxuICAgICAgICAgICAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlcixcclxuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdGYWlsZWQgdG8gbW92ZSB2aWV3JyxcclxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGdldEZpcnN0R3FsRXJyb3JNZXNzYWdlKHJlcz8uZXJyb3JzKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICApXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0cmlnZ2VyTm90aWZpY2F0aW9uKHtcclxuICAgICAgICAgIHR5cGU6IFRvYXN0Tm90aWZpY2F0aW9uVHlwZS5EYW5nZXIsXHJcbiAgICAgICAgICB0aXRsZTogJ0ZhaWxlZCB0byBtb3ZlIHZpZXcnLFxyXG4gICAgICAgICAgZGVzY3JpcHRpb246IGVuc3VyZUVycm9yKGUpLm1lc3NhZ2VcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZHJhZ2VudGVyOiAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgIGRyYWdDb3VudGVyLnZhbHVlKytcclxuICAgICAgaXNEcmFnT3Zlci52YWx1ZSA9IHRydWVcclxuICAgIH0sXHJcbiAgICBkcmFnbGVhdmU6ICgpID0+IHtcclxuICAgICAgZHJhZ0NvdW50ZXIudmFsdWUtLVxyXG4gICAgICBpZiAoZHJhZ0NvdW50ZXIudmFsdWUgPT09IDApIHtcclxuICAgICAgICBpc0RyYWdPdmVyLnZhbHVlID0gZmFsc2VcclxuICAgICAgICBkcm9wUG9zaXRpb24udmFsdWUgPSBudWxsXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IGNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsnZHJhZ2dhYmxlLXZpZXctdGFyZ2V0J11cclxuXHJcbiAgICBpZiAoaXNEcmFnT3Zlci52YWx1ZSAmJiBkcm9wUG9zaXRpb24udmFsdWUgPT09ICd0b3AnKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgICAnYmVmb3JlOmFic29sdXRlIGJlZm9yZTpsZWZ0LTAgYmVmb3JlOnJpZ2h0LTAgYmVmb3JlOnRvcC0wIGJlZm9yZTpoLVsycHhdIGJlZm9yZTpiZy1wcmltYXJ5IGJlZm9yZTpyb3VuZGVkLWZ1bGwgYmVmb3JlOnotMTAgYmVmb3JlOi10cmFuc2xhdGUteS0xLzInXHJcbiAgICAgIClcclxuICAgIH0gZWxzZSBpZiAoaXNEcmFnT3Zlci52YWx1ZSAmJiBkcm9wUG9zaXRpb24udmFsdWUgPT09ICdib3R0b20nKSB7XHJcbiAgICAgIGNsYXNzUGFydHMucHVzaChcclxuICAgICAgICAnYWZ0ZXI6YWJzb2x1dGUgYWZ0ZXI6bGVmdC0wIGFmdGVyOnJpZ2h0LTAgYWZ0ZXI6Ym90dG9tLTAgYWZ0ZXI6aC1bMnB4XSBhZnRlcjpiZy1wcmltYXJ5IGFmdGVyOnJvdW5kZWQtZnVsbCBhZnRlcjp6LTEwIGFmdGVyOnRyYW5zbGF0ZS15LTEvMidcclxuICAgICAgKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbGFzc1BhcnRzLmpvaW4oJyAnKVxyXG4gIH0pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBvbjogdk9uLFxyXG4gICAgY2xhc3Nlc1xyXG4gIH1cclxufVxyXG5cclxuZ3JhcGhxbChgXHJcbiAgZnJhZ21lbnQgVXNlRHJhZ2dhYmxlVmlld1RhcmdldEdyb3VwX1NhdmVkVmlld0dyb3VwIG9uIFNhdmVkVmlld0dyb3VwIHtcclxuICAgIGlkXHJcbiAgICB0aXRsZVxyXG4gIH1cclxuYClcclxuXHJcbmV4cG9ydCBjb25zdCB1c2VEcmFnZ2FibGVWaWV3VGFyZ2V0R3JvdXAgPSAocGFyYW1zOiB7XHJcbiAgZ3JvdXA6IFJlZjxVc2VEcmFnZ2FibGVWaWV3VGFyZ2V0R3JvdXBfU2F2ZWRWaWV3R3JvdXBGcmFnbWVudD5cclxuICBvbk1vdmVkPzogKCkgPT4gdm9pZFxyXG4gIGVuYWJsZWQ/OiBSZWY8Ym9vbGVhbj5cclxuICBpc0dyb3VwT3Blbj86IFJlZjxib29sZWFuPlxyXG4gIHZpZXdDb3VudD86IFJlZjxudW1iZXI+XHJcbn0pID0+IHtcclxuICBjb25zdCBlbmFibGVkID0gY29tcHV0ZWQoKCkgPT4gdW5yZWYocGFyYW1zLmVuYWJsZWQpID8/IHRydWUpXHJcbiAgY29uc3QgaXNEcmFnT3ZlciA9IHJlZihmYWxzZSlcclxuICBjb25zdCB7IHRyaWdnZXJOb3RpZmljYXRpb24gfSA9IHVzZUdsb2JhbFRvYXN0KClcclxuICBjb25zdCB1cGRhdGVWaWV3ID0gdXNlVXBkYXRlU2F2ZWRWaWV3KClcclxuICBjb25zdCBpc0dyb3VwT3BlbiA9IGNvbXB1dGVkKCgpID0+IHVucmVmKHBhcmFtcy5pc0dyb3VwT3BlbikgPz8gZmFsc2UpXHJcbiAgY29uc3Qgdmlld0NvdW50ID0gY29tcHV0ZWQoKCkgPT4gdW5yZWYocGFyYW1zLnZpZXdDb3VudCkgPz8gMClcclxuXHJcbiAgY29uc3Qgdk9uID0ge1xyXG4gICAgZHJhZ292ZXI6IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XHJcbiAgICAgIGlmICghZXZlbnQuZGF0YVRyYW5zZmVyIHx8ICFlbmFibGVkLnZhbHVlKSByZXR1cm5cclxuXHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSdcclxuXHJcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIG92ZXIgdGhlIGdyb3VwIGhlYWRlclxyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcclxuICAgICAgY29uc3QgaXNPdmVyR3JvdXBIZWFkZXIgPSB0YXJnZXQuY2xvc2VzdCgnYnV0dG9uW2NsYXNzKj1cImdyb3VwL2Rpc2Nsb3N1cmVcIl0nKVxyXG5cclxuICAgICAgLy8gSWYgZ3JvdXAgaXMgb3BlbiBhbmQgZW1wdHksIGFsbG93IGRyb3AgYW55d2hlcmUgaW4gdGhlIGdyb3VwXHJcbiAgICAgIC8vIE90aGVyd2lzZSwgb25seSBhbGxvdyBkcm9wIG9uIGdyb3VwIGhlYWRlclxyXG4gICAgICBpZiAoaXNPdmVyR3JvdXBIZWFkZXIpIHtcclxuICAgICAgICBpc0RyYWdPdmVyLnZhbHVlID0gdHJ1ZVxyXG4gICAgICB9IGVsc2UgaWYgKGlzR3JvdXBPcGVuLnZhbHVlICYmIHZpZXdDb3VudC52YWx1ZSA9PT0gMCkge1xyXG4gICAgICAgIC8vIE9wZW4gZW1wdHkgZ3JvdXAgLSBhbGxvdyBkcm9wIGFueXdoZXJlIChub3Qgb3ZlciBhIHZpZXcpXHJcbiAgICAgICAgY29uc3QgaXNPdmVyVmlldyA9IHRhcmdldC5jbG9zZXN0KCcuZHJhZ2dhYmxlLXZpZXcnKVxyXG4gICAgICAgIGlzRHJhZ092ZXIudmFsdWUgPSAhaXNPdmVyVmlld1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlzRHJhZ092ZXIudmFsdWUgPSBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9LFxyXG4gICAgZHJvcDogYXN5bmMgKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcclxuICAgICAgaWYgKCFldmVudC5kYXRhVHJhbnNmZXIgfHwgIWVuYWJsZWQudmFsdWUpIHJldHVyblxyXG5cclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxyXG4gICAgICBpc0RyYWdPdmVyLnZhbHVlID0gZmFsc2VcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGF0YSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKCdhcHBsaWNhdGlvbi9qc29uJylcclxuICAgICAgICBjb25zdCB2aWV3ID0gc2FmZVBhcnNlKGRhdGEsIGlzRHJhZ2dhYmxlVmlldylcclxuICAgICAgICBpZiAoIXZpZXcpIHJldHVyblxyXG5cclxuICAgICAgICBjb25zdCBzYW1lR3JvdXBJZCA9IHZpZXcuZ3JvdXAuaWQgPT09IHBhcmFtcy5ncm91cC52YWx1ZS5pZFxyXG4gICAgICAgIGNvbnN0IGJvdGhVbmdyb3VwZWQgPVxyXG4gICAgICAgICAgaXNVbmdyb3VwZWRHcm91cCh2aWV3Lmdyb3VwLmlkKSAmJiBpc1VuZ3JvdXBlZEdyb3VwKHBhcmFtcy5ncm91cC52YWx1ZS5pZClcclxuXHJcbiAgICAgICAgLy8gXCJTYW1lXCIgdW5ncm91cGVkIGdyb3VwIGNhbiBleGlzdCBhcyBkaWZmZXJlbnQgY2FjaGUgZW50cmllcy9JRHMsIGR1ZSB0byByZXNvdXJjZUlkcyBiZWluZyBjaGFuZ2VkP1xyXG4gICAgICAgIGlmIChzYW1lR3JvdXBJZCB8fCBib3RoVW5ncm91cGVkKSB7XHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHVwZGF0ZVZpZXcoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHZpZXcsXHJcbiAgICAgICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICAgICAgaWQ6IHZpZXcuaWQsXHJcbiAgICAgICAgICAgICAgcHJvamVjdElkOiB2aWV3LnByb2plY3RJZCxcclxuICAgICAgICAgICAgICBncm91cElkOiBwYXJhbXMuZ3JvdXAudmFsdWUuaWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgc2tpcFRvYXN0OiB0cnVlLFxyXG4gICAgICAgICAgICBvbkZ1bGxSZXN1bHQ6IChyZXMsIHN1Y2Nlc3MpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zLm9uTW92ZWQ/LigpXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICAgICAgICAgICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ0ZhaWxlZCB0byBtb3ZlIHZpZXcnLFxyXG4gICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZ2V0Rmlyc3RHcWxFcnJvck1lc3NhZ2UocmVzPy5lcnJvcnMpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlcixcclxuICAgICAgICAgIHRpdGxlOiAnRmFpbGVkIHRvIG1vdmUgdmlldycsXHJcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZW5zdXJlRXJyb3IoZSkubWVzc2FnZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBkcmFnZW50ZXI6IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcclxuICAgIH0sXHJcbiAgICBkcmFnbGVhdmU6IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XHJcbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IGxlYXZpbmcgdGhlIGdyb3VwIGVsZW1lbnQgZW50aXJlbHlcclxuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsXHJcbiAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50XHJcblxyXG4gICAgICAvLyBJZiBsZWF2aW5nIHRvIHNvbWV0aGluZyBvdXRzaWRlIHRoaXMgZ3JvdXAgKG9yIGxlYXZpbmcgdGhlIHdpbmRvdyksIGNsZWFyIHRoZSBkcmFnIG92ZXIgc3RhdGVcclxuICAgICAgaWYgKCFyZWxhdGVkVGFyZ2V0IHx8ICFjdXJyZW50VGFyZ2V0LmNvbnRhaW5zKHJlbGF0ZWRUYXJnZXQpKSB7XHJcbiAgICAgICAgaXNEcmFnT3Zlci52YWx1ZSA9IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IGNsYXNzZXMgPSBjb21wdXRlZCgoKSA9PiB7XHJcbiAgICBjb25zdCBjbGFzc1BhcnRzOiBzdHJpbmdbXSA9IFsnZHJhZ2dhYmxlLXZpZXctdGFyZ2V0J11cclxuXHJcbiAgICBpZiAoaXNEcmFnT3Zlci52YWx1ZSkge1xyXG4gICAgICBjbGFzc1BhcnRzLnB1c2goJ3JvdW5kZWQtbWQgcmluZy0yIHJpbmctcHJpbWFyeSByaW5nLW9wYWNpdHktNTAgYmctcHJpbWFyeS81JylcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xhc3NQYXJ0cy5qb2luKCcgJylcclxuICB9KVxyXG5cclxuICB3YXRjaChlbmFibGVkLCAobmV3VmFsLCBvbGRWYWwpID0+IHtcclxuICAgIGlmIChuZXdWYWwgJiYgIW9sZFZhbCkge1xyXG4gICAgICBpc0RyYWdPdmVyLnZhbHVlID0gZmFsc2VcclxuICAgIH1cclxuICB9KVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgb246IHZPbixcclxuICAgIGNsYXNzZXNcclxuICB9XHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi92aWV3ZXIvY29tcG9zYWJsZXMvc2F2ZWRWaWV3cy91aS50cyJ9 |