diff --git a/.circleci/config.yml b/.circleci/config.yml index 62e8c1921d6..0a88a521708 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -900,6 +900,7 @@ commands: export FEATURE_FLAG_ENABLE_ALASKA=false export FEATURE_FLAG_UNACCOMPANIED_BAGGAGE=false export FEATURE_FLAG_ENABLE_HAWAII=false + export FEATURE_FLAG_BULK_ASSIGNMENT=false # disable for speed, playwright tests can fail otherwise export DB_DEBUG=false @@ -943,6 +944,7 @@ commands: FEATURE_FLAG_QUEUE_MANAGEMENT: 'false' FEATURE_FLAG_UNACCOMPANIED_BAGGAGE: 'false' FEATURE_FLAG_ENABLE_ALASKA: 'false' + FEATURE_FLAG_BULK_ASSIGNMENT: 'false' command: | SHARD=$((${CIRCLE_NODE_INDEX}+1)) PLAYWRIGHT_JUNIT_OUTPUT_NAME=playwright-results.xml \ diff --git a/.envrc b/.envrc index 6460c298784..6e2aed70eb9 100644 --- a/.envrc +++ b/.envrc @@ -156,6 +156,9 @@ export FEATURE_FLAG_BOAT=true export FEATURE_FLAG_MOBILE_HOME=true export FEATURE_FLAG_UNACCOMPANIED_BAGGAGE=false +# Feature flag to allow Bulk Assigment options to be displayed +export FEATURE_FLAG_BULK_ASSIGNMENT=true + # Feature flag to allow AK to be entered as a state export FEATURE_FLAG_ENABLE_ALASKA=true diff --git a/config/env/demo.app-client-tls.env b/config/env/demo.app-client-tls.env index a546d0cc6b0..fb6bebb747e 100644 --- a/config/env/demo.app-client-tls.env +++ b/config/env/demo.app-client-tls.env @@ -49,4 +49,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/demo.app.env b/config/env/demo.app.env index ed92b849052..68e7b14daec 100644 --- a/config/env/demo.app.env +++ b/config/env/demo.app.env @@ -54,4 +54,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/exp.app-client-tls.env b/config/env/exp.app-client-tls.env index e4ba80d8b88..85f315e3173 100644 --- a/config/env/exp.app-client-tls.env +++ b/config/env/exp.app-client-tls.env @@ -49,4 +49,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/exp.app.env b/config/env/exp.app.env index bc953c7f9d0..43bb56f3c19 100644 --- a/config/env/exp.app.env +++ b/config/env/exp.app.env @@ -54,4 +54,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/loadtest.app-client-tls.env b/config/env/loadtest.app-client-tls.env index 02e9fca87ce..b26524393e3 100644 --- a/config/env/loadtest.app-client-tls.env +++ b/config/env/loadtest.app-client-tls.env @@ -47,4 +47,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/loadtest.app.env b/config/env/loadtest.app.env index 521864b95ce..51c4ccc7347 100644 --- a/config/env/loadtest.app.env +++ b/config/env/loadtest.app.env @@ -52,4 +52,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/prd.app-client-tls.env b/config/env/prd.app-client-tls.env index 17f6f8ce169..9b754221581 100644 --- a/config/env/prd.app-client-tls.env +++ b/config/env/prd.app-client-tls.env @@ -46,4 +46,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/prd.app.env b/config/env/prd.app.env index 60696b84814..be956f4a530 100644 --- a/config/env/prd.app.env +++ b/config/env/prd.app.env @@ -53,4 +53,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/stg.app-client-tls.env b/config/env/stg.app-client-tls.env index e71d4cdd3ca..7047aafebea 100644 --- a/config/env/stg.app-client-tls.env +++ b/config/env/stg.app-client-tls.env @@ -48,4 +48,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/env/stg.app.env b/config/env/stg.app.env index 7d38e89c4dc..33ba71851ed 100644 --- a/config/env/stg.app.env +++ b/config/env/stg.app.env @@ -54,4 +54,5 @@ FEATURE_FLAG_THIRD_ADDRESS_AVAILABLE=false FEATURE_FLAG_QUEUE_MANAGEMENT=false FEATURE_FLAG_DODID_UNIQUE=false FEATURE_FLAG_ENABLE_ALASKA=false -FEATURE_FLAG_ENABLE_HAWAII=false \ No newline at end of file +FEATURE_FLAG_ENABLE_HAWAII=false +FEATURE_FLAG_BULK_ASSIGNMENT=false \ No newline at end of file diff --git a/config/flipt/storage/development.features.yaml b/config/flipt/storage/development.features.yaml index 7ace7ab11d7..224f763e922 100644 --- a/config/flipt/storage/development.features.yaml +++ b/config/flipt/storage/development.features.yaml @@ -137,6 +137,14 @@ flags: - segment: key: mil-app value: true + - key: bulk_assignment + name: bulk assignment feature flag + type: BOOLEAN_FLAG_TYPE + enabled: true + rollouts: + - segment: + key: mil-app + value: true - key: dodid_unique name: DODID validation feature flag that ensures unique DODIDs type: BOOLEAN_FLAG_TYPE diff --git a/src/components/BulkAssignment/BulkAssignmentModal.jsx b/src/components/BulkAssignment/BulkAssignmentModal.jsx new file mode 100644 index 00000000000..ca58c6814a2 --- /dev/null +++ b/src/components/BulkAssignment/BulkAssignmentModal.jsx @@ -0,0 +1,50 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Button } from '@trussworks/react-uswds'; + +import Modal, { ModalTitle, ModalClose, ModalActions, connectModal } from 'components/Modal/Modal'; + +export const BulkAssignmentModal = ({ onClose, onSubmit, title, content, submitText, closeText }) => ( + + onClose()} /> + +

{title}

+
+

{content}

+ + + + +
+); + +BulkAssignmentModal.propTypes = { + onClose: PropTypes.func.isRequired, + onSubmit: PropTypes.func.isRequired, + + title: PropTypes.string, + content: PropTypes.string, + submitText: PropTypes.string, + closeText: PropTypes.string, +}; + +BulkAssignmentModal.defaultProps = { + title: 'Bulk Assignment', + content: 'Here we will display moves to be assigned in bulk.', + submitText: 'Save', + closeText: 'Cancel', +}; + +BulkAssignmentModal.displayName = 'BulkAssignmentModal'; + +export default connectModal(BulkAssignmentModal); diff --git a/src/components/BulkAssignment/BulkAssignmentModal.stories.jsx b/src/components/BulkAssignment/BulkAssignmentModal.stories.jsx new file mode 100644 index 00000000000..f7fa5b3630d --- /dev/null +++ b/src/components/BulkAssignment/BulkAssignmentModal.stories.jsx @@ -0,0 +1,18 @@ +import React from 'react'; + +import BulkAssignmentModal from './BulkAssignmentModal'; + +export default { + title: 'Components/BulkAssignmentModal', + component: BulkAssignmentModal, + argTypes: { + onClose: { action: 'close button clicked' }, + onSubmit: { action: 'submit button clicked' }, + }, +}; + +const ConnectedTemplate = (args) => ; +export const ConnectedModal = ConnectedTemplate.bind({}); +ConnectedModal.args = { + isOpen: true, +}; diff --git a/src/components/BulkAssignment/BulkAssignmentModal.test.jsx b/src/components/BulkAssignment/BulkAssignmentModal.test.jsx new file mode 100644 index 00000000000..4ffc69e7bd3 --- /dev/null +++ b/src/components/BulkAssignment/BulkAssignmentModal.test.jsx @@ -0,0 +1,50 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { BulkAssignmentModal } from 'components/BulkAssignment/BulkAssignmentModal'; + +let onClose; +let onSubmit; +beforeEach(() => { + onClose = jest.fn(); + onSubmit = jest.fn(); +}); + +describe('BulkAssignmentModal', () => { + it('renders the component', async () => { + render(); + + expect(await screen.findByRole('heading', { level: 3, name: 'Bulk Assignment' })).toBeInTheDocument(); + }); + + it('closes the modal when close icon is clicked', async () => { + render(); + + const closeButton = await screen.findByTestId('modalCloseButton'); + + await userEvent.click(closeButton); + + expect(onClose).toHaveBeenCalledTimes(1); + }); + + it('closes the modal when the Cancel button is clicked', async () => { + render(); + + const cancelButton = await screen.findByRole('button', { name: 'Cancel' }); + + await userEvent.click(cancelButton); + + expect(onClose).toHaveBeenCalledTimes(1); + }); + + it('calls the submit function when Save button is clicked', async () => { + render(); + + const saveButton = await screen.findByRole('button', { name: 'Save' }); + + await userEvent.click(saveButton); + + expect(onSubmit).toHaveBeenCalledTimes(1); + }); +}); diff --git a/src/components/Table/TableQueue.jsx b/src/components/Table/TableQueue.jsx index d4d0d543237..d657df5007f 100644 --- a/src/components/Table/TableQueue.jsx +++ b/src/components/Table/TableQueue.jsx @@ -1,12 +1,13 @@ import React, { useState, useEffect, useMemo, useContext } from 'react'; import { connect } from 'react-redux'; -import { GridContainer } from '@trussworks/react-uswds'; +import { GridContainer, Button } from '@trussworks/react-uswds'; import { useTable, useFilters, usePagination, useSortBy } from 'react-table'; import PropTypes from 'prop-types'; import styles from './TableQueue.module.scss'; import TableCSVExportButton from './TableCSVExportButton'; +import BulkAssignmentModal from 'components/BulkAssignment/BulkAssignmentModal'; import Table from 'components/Table/Table'; import LoadingPlaceholder from 'shared/LoadingPlaceholder'; import SomethingWentWrong from 'shared/SomethingWentWrong'; @@ -51,6 +52,8 @@ const TableQueue = ({ csvExportQueueFetcher, csvExportQueueFetcherKey, sessionStorageKey, + isSupervisor, + isBulkAssignmentFFEnabled, officeUser, activeRole, }) => { @@ -88,6 +91,7 @@ const TableQueue = ({ }, [currentPageSize, sessionStorageKey]); const [pageCount, setPageCount] = useState(0); + const [isBulkAssignModalVisible, setIsBulkAssignModalVisible] = useState(false); const { id, desc } = paramSort.length ? paramSort[0] : {}; @@ -98,7 +102,13 @@ const TableQueue = ({ : { selectedGbloc: undefined }; const multiSelectValueDelimiter = ','; + const handleShowBulkAssignMoveModal = () => { + setIsBulkAssignModalVisible(true); + }; + const handleCloseBulkAssignModal = () => { + setIsBulkAssignModalVisible(false); + }; const { queueResult: { totalCount = 0, @@ -307,48 +317,62 @@ const TableQueue = ({ }; return ( - -
-

{`${title} (${totalCount})`}

- {showCSVExport && ( - +
+
+ {isBulkAssignModalVisible && ( + )} + +
+

{`${title} (${totalCount})`}

+
+ {isSupervisor && isBulkAssignmentFFEnabled && ( + + )} + {showCSVExport && ( + + )} +
+
+ {renderFilterPillButtonList()} +
+ + + - {renderFilterPillButtonList()} -
-
- - + ); }; diff --git a/src/components/Table/TableQueue.module.scss b/src/components/Table/TableQueue.module.scss index 0a240bfbb8c..0da067b63ac 100644 --- a/src/components/Table/TableQueue.module.scss +++ b/src/components/Table/TableQueue.module.scss @@ -26,6 +26,12 @@ justify-content: space-between; align-items: flex-end; } + .queueButtonWrapper { + display: flex; + flex-direction: row; + justify-content: flex-end; + align-items: flex-end; + } .csvDownloadLink { padding: 10px; @@ -62,4 +68,4 @@ .pillButtonRow { padding-left: 8px; -} \ No newline at end of file +} diff --git a/src/pages/Office/MoveQueue/MoveQueue.jsx b/src/pages/Office/MoveQueue/MoveQueue.jsx index c4ba38e6677..ac091408682 100644 --- a/src/pages/Office/MoveQueue/MoveQueue.jsx +++ b/src/pages/Office/MoveQueue/MoveQueue.jsx @@ -32,6 +32,7 @@ import { isNullUndefinedOrWhitespace } from 'shared/utils'; import NotFound from 'components/NotFound/NotFound'; import { isBooleanFlagEnabled } from 'utils/featureFlags'; import handleQueueAssignment from 'utils/queues'; +import { elevatedPrivilegeTypes } from 'constants/userPrivileges'; export const columns = (moveLockFlag, isQueueManagementEnabled, showBranchFilter = true) => { const cols = [ @@ -192,13 +193,15 @@ export const columns = (moveLockFlag, isQueueManagementEnabled, showBranchFilter return cols; }; -const MoveQueue = ({ isQueueManagementFFEnabled }) => { +const MoveQueue = ({ isQueueManagementFFEnabled, userPrivileges, isBulkAssignmentFFEnabled }) => { const navigate = useNavigate(); const { queueType } = useParams(); const [search, setSearch] = useState({ moveCode: null, dodID: null, customerName: null, paymentRequestCode: null }); const [searchHappened, setSearchHappened] = useState(false); const [moveLockFlag, setMoveLockFlag] = useState(false); - + const supervisor = userPrivileges + ? userPrivileges.some((p) => p.privilegeType === elevatedPrivilegeTypes.SUPERVISOR) + : false; useEffect(() => { const fetchData = async () => { const lockedMoveFlag = await isBooleanFlagEnabled('move_lock'); @@ -343,6 +346,8 @@ const MoveQueue = ({ isQueueManagementFFEnabled }) => { csvExportQueueFetcherKey="queueMoves" sessionStorageKey={queueType} key={queueType} + isSupervisor={supervisor} + isBulkAssignmentFFEnabled={isBulkAssignmentFFEnabled} /> ); diff --git a/src/pages/Office/PaymentRequestQueue/PaymentRequestQueue.jsx b/src/pages/Office/PaymentRequestQueue/PaymentRequestQueue.jsx index dfdf09a0c67..a46518a2627 100644 --- a/src/pages/Office/PaymentRequestQueue/PaymentRequestQueue.jsx +++ b/src/pages/Office/PaymentRequestQueue/PaymentRequestQueue.jsx @@ -31,6 +31,7 @@ import NotFound from 'components/NotFound/NotFound'; import { isBooleanFlagEnabled } from 'utils/featureFlags'; import { DEFAULT_EMPTY_VALUE, PAYMENT_REQUEST_STATUS } from 'shared/constants'; import handleQueueAssignment from 'utils/queues'; +import { elevatedPrivilegeTypes } from 'constants/userPrivileges'; export const columns = (moveLockFlag, isQueueManagementEnabled, showBranchFilter = true) => { const cols = [ @@ -190,12 +191,15 @@ export const columns = (moveLockFlag, isQueueManagementEnabled, showBranchFilter return cols; }; -const PaymentRequestQueue = ({ isQueueManagementFFEnabled }) => { +const PaymentRequestQueue = ({ isQueueManagementFFEnabled, userPrivileges, isBulkAssignmentFFEnabled }) => { const { queueType } = useParams(); const navigate = useNavigate(); const [search, setSearch] = useState({ moveCode: null, dodID: null, customerName: null, paymentRequestCode: null }); const [searchHappened, setSearchHappened] = useState(false); const [moveLockFlag, setMoveLockFlag] = useState(false); + const supervisor = userPrivileges + ? userPrivileges.some((p) => p.privilegeType === elevatedPrivilegeTypes.SUPERVISOR) + : false; useEffect(() => { const fetchData = async () => { @@ -328,6 +332,8 @@ const PaymentRequestQueue = ({ isQueueManagementFFEnabled }) => { csvExportQueueFetcherKey="queuePaymentRequests" sessionStorageKey={queueType} key={queueType} + isSupervisor={supervisor} + isBulkAssignmentFFEnabled={isBulkAssignmentFFEnabled} /> ); diff --git a/src/pages/Office/ServicesCounselingQueue/ServicesCounselingQueue.jsx b/src/pages/Office/ServicesCounselingQueue/ServicesCounselingQueue.jsx index 77d986fa43e..6518eda8080 100644 --- a/src/pages/Office/ServicesCounselingQueue/ServicesCounselingQueue.jsx +++ b/src/pages/Office/ServicesCounselingQueue/ServicesCounselingQueue.jsx @@ -428,7 +428,12 @@ export const closeoutColumns = ( return cols; }; -const ServicesCounselingQueue = ({ userPrivileges, isQueueManagementFFEnabled, officeUser }) => { +const ServicesCounselingQueue = ({ + userPrivileges, + isQueueManagementFFEnabled, + officeUser, + isBulkAssignmentFFEnabled, +}) => { const { queueType } = useParams(); const { data, isLoading, isError } = useUserQueries(); @@ -663,6 +668,8 @@ const ServicesCounselingQueue = ({ userPrivileges, isQueueManagementFFEnabled, o csvExportQueueFetcherKey="queueMoves" sessionStorageKey={queueType} key={queueType} + isSupervisor={supervisor} + isBulkAssignmentFFEnabled={isBulkAssignmentFFEnabled} /> ); @@ -690,6 +697,8 @@ const ServicesCounselingQueue = ({ userPrivileges, isQueueManagementFFEnabled, o csvExportQueueFetcherKey="queueMoves" sessionStorageKey={queueType} key={queueType} + isSupervisor={supervisor} + isBulkAssignmentFFEnabled={isBulkAssignmentFFEnabled} /> ); diff --git a/src/pages/Office/index.jsx b/src/pages/Office/index.jsx index 4ca83220d96..8ae42ba6af5 100644 --- a/src/pages/Office/index.jsx +++ b/src/pages/Office/index.jsx @@ -44,6 +44,7 @@ import withRouter from 'utils/routing'; import { OktaLoggedOutBanner, OktaNeedsLoggedOutBanner } from 'components/OktaLogoutBanner'; import SelectedGblocProvider from 'components/Office/GblocSwitcher/SelectedGblocProvider'; import MaintenancePage from 'pages/Maintenance/MaintenancePage'; +import { FEATURE_FLAG_KEYS } from 'shared/constants'; // Lazy load these dependencies (they correspond to unique routes & only need to be loaded when that URL is accessed) const SignIn = lazy(() => import('pages/SignIn/SignIn')); @@ -114,6 +115,7 @@ export class OfficeApp extends Component { hqRoleFlag: !!props.hqRoleFlag, gsrRoleFlag: undefined, queueManagementFlag: undefined, + bulkAssignmentFlag: undefined, }; } @@ -158,6 +160,10 @@ export class OfficeApp extends Component { this.setState({ queueManagementFlag: isQueueManagementFlagValue, }); + const isBulkAssignmentFlagValue = await isBooleanFlagEnabled(FEATURE_FLAG_KEYS.BULK_ASSIGNMENT); + this.setState({ + bulkAssignmentFlag: isBulkAssignmentFlagValue, + }); } catch (error) { retryPageLoading(error); } @@ -177,8 +183,17 @@ export class OfficeApp extends Component { } render() { - const { hasError, error, info, oktaLoggedOut, oktaNeedsLoggedOut, hqRoleFlag, gsrRoleFlag, queueManagementFlag } = - this.state; + const { + hasError, + error, + info, + oktaLoggedOut, + oktaNeedsLoggedOut, + hqRoleFlag, + gsrRoleFlag, + queueManagementFlag, + bulkAssignmentFlag, + } = this.state; const { activeRole, officeUserId, @@ -322,6 +337,7 @@ export class OfficeApp extends Component { } @@ -349,7 +365,11 @@ export class OfficeApp extends Component { end element={ - + } /> @@ -360,7 +380,11 @@ export class OfficeApp extends Component { end element={ - + } /> diff --git a/src/shared/constants.js b/src/shared/constants.js index c08f9e80434..884691d5c3c 100644 --- a/src/shared/constants.js +++ b/src/shared/constants.js @@ -209,6 +209,7 @@ export const FEATURE_FLAG_KEYS = { MOBILE_HOME: 'mobile_home', UNACCOMPANIED_BAGGAGE: 'unaccompanied_baggage', ENABLE_ALASKA: 'enable_alaska', + BULK_ASSIGNMENT: 'bulk_assignment', }; export const MOVE_DOCUMENT_TYPE = {