From ff584a3b2e91b96594c3b1a48992c54089e6257a Mon Sep 17 00:00:00 2001 From: Marlen Brunner Date: Fri, 17 Apr 2026 12:22:06 -0700 Subject: [PATCH 01/25] :bug: Fix editor bridge shutdown to kill entire process group Use negative PID to kill entire process group instead of just parent process. Ensures bridge can be properly shut down when spawned with pgroup: true. --- bin/open-in-editor-bridge.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 bin/open-in-editor-bridge.rb diff --git a/bin/open-in-editor-bridge.rb b/bin/open-in-editor-bridge.rb old mode 100644 new mode 100755 index 503200bc..b9ad63e3 --- a/bin/open-in-editor-bridge.rb +++ b/bin/open-in-editor-bridge.rb @@ -81,7 +81,7 @@ def shutdown return unless pid - Process.kill("TERM", pid) + Process.kill("TERM", -pid) delete_pid_file puts "Stopped editor bridge." From cc1b9d575c1457e31084bbff21def01f67f92262 Mon Sep 17 00:00:00 2001 From: Caleb Burke Date: Tue, 2 Jun 2026 12:39:18 -0700 Subject: [PATCH 02/25] `access_level_department_restriction` key in template `api/src/templates/information-sharing-agreements/confidentiality-acknowledgement-template.docx` was not being populated by `api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts` --- .../create-serializer.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts b/api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts index fe6b5752..013951d4 100644 --- a/api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts +++ b/api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts @@ -36,6 +36,7 @@ export type InformationSharingAgreementAsConfidentialityAcknowledgement = { "access_level.is_internal": boolean "access_level.is_protected_and_limited": boolean "access_level.is_confidential_and_restricted": boolean + access_level_department_restriction: string department_branch_unit_hierarchy: string has_additional_access_restrictions: boolean additional_access_restrictions: string @@ -128,6 +129,7 @@ export class CreateSerializer extends BaseSerializer Date: Tue, 2 Jun 2026 14:21:18 -0700 Subject: [PATCH 03/25] make string empty --- .../create-serializer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts b/api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts index 013951d4..022efad5 100644 --- a/api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts +++ b/api/src/serializers/information-sharing-agreements/generate-confidentiality-acknowledgement/create-serializer.ts @@ -129,7 +129,7 @@ export class CreateSerializer extends BaseSerializer Date: Thu, 4 Jun 2026 15:30:58 -0700 Subject: [PATCH 04/25] external user edit form --- .../components/users/UserExternalEditForm.vue | 216 ++++++++++++++++++ .../users/UsersEditDataTableServer.vue | 15 +- web/src/pages/users/UserExternalEditPage.vue | 35 +++ web/src/routes.ts | 6 + 4 files changed, 269 insertions(+), 3 deletions(-) create mode 100644 web/src/components/users/UserExternalEditForm.vue create mode 100644 web/src/pages/users/UserExternalEditPage.vue diff --git a/web/src/components/users/UserExternalEditForm.vue b/web/src/components/users/UserExternalEditForm.vue new file mode 100644 index 00000000..34b25d7e --- /dev/null +++ b/web/src/components/users/UserExternalEditForm.vue @@ -0,0 +1,216 @@ + + + diff --git a/web/src/components/users/UsersEditDataTableServer.vue b/web/src/components/users/UsersEditDataTableServer.vue index a670651c..d47a9431 100644 --- a/web/src/components/users/UsersEditDataTableServer.vue +++ b/web/src/components/users/UsersEditDataTableServer.vue @@ -7,7 +7,7 @@ :items="users" :items-length="totalCount" :loading="isLoading" - @click:row="(_event: unknown, { item }: UserTableRow) => goToUserEditPage(item.id)" + @click:row="(_event: unknown, { item }: UserTableRow) => goToUserEditPage(item)" > + + diff --git a/web/src/routes.ts b/web/src/routes.ts index ac9ff946..89995cc3 100644 --- a/web/src/routes.ts +++ b/web/src/routes.ts @@ -288,6 +288,12 @@ const routes: RouteRecordRaw[] = [ component: () => import("@/pages/users/UserEditPage.vue"), props: true, }, + { + path: "external-users/:userId/edit", + name: "users/UserExternalEditPage", + component: () => import("@/pages/users/UserExternalEditPage.vue"), + props: true, + }, ], }, { From 45395f47eed613bea3a2f13da8f8981454f46b1d Mon Sep 17 00:00:00 2001 From: Caleb Burke Date: Thu, 4 Jun 2026 18:28:58 -0700 Subject: [PATCH 05/25] updating route names --- ...mationSharingAgreementAccessGrantEditDataTableServer.vue | 2 +- .../InformationSharingAgreementAccessGrantsDataIterator.vue | 2 +- .../user-groups/UserGroupsAsUsersEditDataTableServer.vue | 2 +- web/src/components/users/UserChip.vue | 2 +- .../users/{UserEditForm.vue => UserInternalEditForm.vue} | 0 web/src/components/users/UsersEditDataTableServer.vue | 2 +- web/src/pages/ProfilePage.vue | 4 ++-- .../users/{UserEditPage.vue => UserInternalEditPage.vue} | 4 ++-- web/src/routes.ts | 6 +++--- 9 files changed, 12 insertions(+), 12 deletions(-) rename web/src/components/users/{UserEditForm.vue => UserInternalEditForm.vue} (100%) rename web/src/pages/users/{UserEditPage.vue => UserInternalEditPage.vue} (86%) diff --git a/web/src/components/information-sharing-agreement-access-grants/InformationSharingAgreementAccessGrantEditDataTableServer.vue b/web/src/components/information-sharing-agreement-access-grants/InformationSharingAgreementAccessGrantEditDataTableServer.vue index bb03391e..9355d29b 100644 --- a/web/src/components/information-sharing-agreement-access-grants/InformationSharingAgreementAccessGrantEditDataTableServer.vue +++ b/web/src/components/information-sharing-agreement-access-grants/InformationSharingAgreementAccessGrantEditDataTableServer.vue @@ -142,7 +142,7 @@ const router = useRouter() function goToUserPage(userId: number) { // TODO: standardize this route to redirect to user read page (once a read page exists) return router.push({ - name: "users/UserEditPage", + name: "users/UserInternalEditPage", params: { userId, }, diff --git a/web/src/components/information-sharing-agreement-access-grants/InformationSharingAgreementAccessGrantsDataIterator.vue b/web/src/components/information-sharing-agreement-access-grants/InformationSharingAgreementAccessGrantsDataIterator.vue index b5dedf90..4e8c42f1 100644 --- a/web/src/components/information-sharing-agreement-access-grants/InformationSharingAgreementAccessGrantsDataIterator.vue +++ b/web/src/components/information-sharing-agreement-access-grants/InformationSharingAgreementAccessGrantsDataIterator.vue @@ -87,7 +87,7 @@ const router = useRouter() function goToUserPage(userId: number) { // TODO: standardize this route to redirect to user read page return router.push({ - name: "users/UserEditPage", + name: "users/UserInternalEditPage", params: { userId, }, diff --git a/web/src/components/user-groups/UserGroupsAsUsersEditDataTableServer.vue b/web/src/components/user-groups/UserGroupsAsUsersEditDataTableServer.vue index 7256a7c8..000931b2 100644 --- a/web/src/components/user-groups/UserGroupsAsUsersEditDataTableServer.vue +++ b/web/src/components/user-groups/UserGroupsAsUsersEditDataTableServer.vue @@ -129,7 +129,7 @@ const router = useRouter() function goToUserPage(userId: number) { // TODO: standardize this route to redirect to user read page return router.push({ - name: "users/UserEditPage", + name: "users/UserInternalEditPage", params: { userId, }, diff --git a/web/src/components/users/UserChip.vue b/web/src/components/users/UserChip.vue index a0a268b7..1c3adfb1 100644 --- a/web/src/components/users/UserChip.vue +++ b/web/src/components/users/UserChip.vue @@ -160,7 +160,7 @@ const userProfileLink = computed(() => { if (isSystemAdmin.value) { return { - name: "users/UserEditPage", + name: "users/UserInternalEditPage", params: { userId: userId.value, }, diff --git a/web/src/components/users/UserEditForm.vue b/web/src/components/users/UserInternalEditForm.vue similarity index 100% rename from web/src/components/users/UserEditForm.vue rename to web/src/components/users/UserInternalEditForm.vue diff --git a/web/src/components/users/UsersEditDataTableServer.vue b/web/src/components/users/UsersEditDataTableServer.vue index d47a9431..e97ace81 100644 --- a/web/src/components/users/UsersEditDataTableServer.vue +++ b/web/src/components/users/UsersEditDataTableServer.vue @@ -190,7 +190,7 @@ function goToUserEditPage(user: UserAsIndex) { } return router.push({ - name: "users/UserEditPage", + name: "users/UserInternalEditPage", params: { userId: user.id, }, diff --git a/web/src/pages/ProfilePage.vue b/web/src/pages/ProfilePage.vue index 25a93ad5..6d211ca4 100644 --- a/web/src/pages/ProfilePage.vue +++ b/web/src/pages/ProfilePage.vue @@ -16,7 +16,7 @@ - () diff --git a/web/src/pages/users/UserEditPage.vue b/web/src/pages/users/UserInternalEditPage.vue similarity index 86% rename from web/src/pages/users/UserEditPage.vue rename to web/src/pages/users/UserInternalEditPage.vue index 88d920e6..54f04a9a 100644 --- a/web/src/pages/users/UserEditPage.vue +++ b/web/src/pages/users/UserInternalEditPage.vue @@ -1,7 +1,7 @@ diff --git a/web/src/components/information-sharing-agreements/signed/InformationSharingAgreementSignedActionsMenu.vue b/web/src/components/information-sharing-agreements/signed/InformationSharingAgreementSignedActionsMenu.vue index d6e6e0e4..9c097b2f 100644 --- a/web/src/components/information-sharing-agreements/signed/InformationSharingAgreementSignedActionsMenu.vue +++ b/web/src/components/information-sharing-agreements/signed/InformationSharingAgreementSignedActionsMenu.vue @@ -3,6 +3,15 @@ v-bind="primaryButtonAttributes" :loading="isLoading" > + import { computed, toRefs } from "vue" +import { useRouter } from "vue-router" +import { useRouteQuery } from "@vueuse/router" import { isNil } from "lodash" +import { booleanTransformer } from "@/utils/use-route-query-transformers" + import Api from "@/api" import useAuthenticatedDownload from "@/use/utils/use-authenticated-download" import useInformationSharingAgreement from "@/use/use-information-sharing-agreement" import useInformationSharingAgreementArchiveItems from "@/use/use-information-sharing-agreement-archive-items" import BaseActionsMenuBtnGroup from "@/components/common/BaseActionsMenuBtnGroup.vue" +import InformationSharingAgreementArchiveItemCreateDialog from "@/components/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemCreateDialog.vue" import InformationSharingAgreementRevertToDraftDialog from "@/components/information-sharing-agreements/InformationSharingAgreementRevertToDraftDialog.vue" const props = defineProps<{ @@ -83,6 +97,8 @@ const emit = defineEmits<{ updated: [informationSharingAgreementId: number] }>() +const router = useRouter() + const { informationSharingAgreementId } = toRefs(props) const { informationSharingAgreement, isLoading } = useInformationSharingAgreement( informationSharingAgreementId @@ -109,6 +125,10 @@ const { informationSharingAgreementArchiveItems } = useInformationSharingAgreeme const archiveItemId = computed( () => informationSharingAgreementArchiveItems.value?.at(0)?.archiveItemId ) +const showCreateArchiveItemDialog = useRouteQuery("showCreateArchiveItemDialog", "false", { + transform: booleanTransformer, +}) + const primaryButtonAttributes = computed(() => { if (!isNil(archiveItemId.value)) { return { @@ -123,12 +143,7 @@ const primaryButtonAttributes = computed(() => { } else { return { primaryButtonText: "Create Knowledge Item", - primaryButtonTo: { - name: "information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemNewPage", - params: { - informationSharingAgreementId: props.informationSharingAgreementId, - }, - }, + primaryButtonProps: { onClick: () => (showCreateArchiveItemDialog.value = true) }, } } }) @@ -152,6 +167,10 @@ const { submit: downloadSignedConfidentialityReceipt, isLoading: isDownloadingSignedConfidentialityReceipt, } = useAuthenticatedDownload(generateSignedConfidentialityReceiptUrl) + +async function goToInformationSharingAgreementsPage() { + await router.push({ name: "InformationSharingAgreementsPage" }) +} diff --git a/web/src/pages/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemNewPage.vue b/web/src/pages/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemNewPage.vue deleted file mode 100644 index 0487a1ee..00000000 --- a/web/src/pages/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemNewPage.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - diff --git a/web/src/routes.ts b/web/src/routes.ts index 739cc53f..8b07dc19 100644 --- a/web/src/routes.ts +++ b/web/src/routes.ts @@ -108,13 +108,6 @@ const routes: RouteRecordRaw[] = [ }, ], }, - { - path: "information-sharing-agreements/:informationSharingAgreementId/archive-items/new", - name: "information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemNewPage", - component: () => - import("@/pages/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemNewPage.vue"), - props: true, - }, { path: "administration", children: [ From 70ba7ffdb27b2ed702980f610622860768caa7fb Mon Sep 17 00:00:00 2001 From: Caleb Burke Date: Mon, 29 Jun 2026 11:48:21 -0700 Subject: [PATCH 18/25] code simplification --- .../InformationSharingAgreementArchiveItemCreateDialog.vue | 7 ------- 1 file changed, 7 deletions(-) diff --git a/web/src/components/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemCreateDialog.vue b/web/src/components/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemCreateDialog.vue index e735c4a6..b2fcb904 100644 --- a/web/src/components/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemCreateDialog.vue +++ b/web/src/components/information-sharing-agreements/archive-items/InformationSharingAgreementArchiveItemCreateDialog.vue @@ -104,14 +104,7 @@ const showDialog = useRouteQuery("showCreateArchiveItemDialog", "false", { }) const archiveItemAttributes = ref>({ - title: "", securityLevel: SecurityLevel.LOW, - description: null, - sharingPurpose: null, - confidentialityReceipt: undefined, - yukonFirstNations: [], - tags: [], - archiveItemCategoriesAttributes: [], }) const ACCESS_LEVEL_TO_SECURITY_LEVEL = { From 3fa45a8829103f1101da79d1363482d82b6a0ef3 Mon Sep 17 00:00:00 2001 From: Caleb Burke Date: Mon, 29 Jun 2026 11:53:30 -0700 Subject: [PATCH 19/25] Removing share button --- ...veItemInformationSharingAgreementsPage.vue | 40 ++----------------- 1 file changed, 4 insertions(+), 36 deletions(-) diff --git a/web/src/pages/archive-items/ArchiveItemInformationSharingAgreementsPage.vue b/web/src/pages/archive-items/ArchiveItemInformationSharingAgreementsPage.vue index c4804d2a..7e0c2ea6 100644 --- a/web/src/pages/archive-items/ArchiveItemInformationSharingAgreementsPage.vue +++ b/web/src/pages/archive-items/ArchiveItemInformationSharingAgreementsPage.vue @@ -1,16 +1,6 @@