{"version":3,"file":"formStoreFactory-a9c16392.js","sources":["../../../app/javascript/common/components/transferOwnerModal.vue","../../../app/javascript/common/components/transferOwnerModal.vue?vue&type=template&lang.js","../../../app/javascript/common/utils/asyncQueue.ts","../../../app/javascript/formability/form_builder/store/modules/formStoreFactory.ts","../../../app/javascript/common/mixins/storeFactoryMixins/formStoreFactoryTrackedMixin.ts"],"sourcesContent":["\n\n","\n\n
\n

Are you sure?

\n
\n

\n \n Transferring ownership will remove the owner role from the current owner, and may remove permissions necessary to access this {{display}}. Are you sure you want to proceed?\n \n

\n
\n\n
\n \n \n
\n
\n
\n","import {Logger} from \"~/services/logger\"\nimport {decoupledPromise} from \"~/utils/promiseUtils\"\n\nexport interface IQueue {\n push: (action: IQueueAction) => void\n size: number\n}\n\nexport interface IQueueAction {\n type: string,\n resolver: () => Promise\n}\n\nexport interface IQueueableAction extends IQueueAction {\n action: () => Promise\n}\n\nexport default class AsyncQueue implements IQueue {\n private counter: number = 0\n private currentAction: IQueueableAction\n private queue: IQueueableAction[] = []\n private allPromise: Promise\n private allResolve: (value?: unknown) => void\n\n constructor(options: { debug?: boolean } = {}) {\n if (options.debug === true) {\n Logger.start('Queue', 'debug')\n }\n }\n\n get size(): number {\n return this.queue.length\n }\n\n push(action: IQueueAction): void {\n const counter = ++this.counter\n this.queue.push({\n ...action,\n action: async () => {\n Logger.debug('Queue', `${counter} | ${action.type} | taking action`)\n await action.resolver()\n Logger.debug('Queue', `${counter} | ${action.type} | action done`)\n if (this.queue.length) {\n this.run()\n } else {\n Logger.debug('Queue', `${counter} | ${action.type} | queue empty`)\n this.end()\n }\n },\n })\n\n if (!this.currentAction) {\n Logger.debug('Queue', `${counter} | ${action.type} | starting action queue`)\n this.run()\n }\n }\n\n all(): Promise {\n return new Promise(async resolve => {\n // resolve when queue is empty\n if (this.allPromise) {\n Logger.debug('Queue', 'await \"all\" promise')\n await this.allPromise\n }\n Logger.debug('Queue', 'resolve \"all\" promise')\n resolve()\n })\n }\n\n /**\n * When queue is empty, use this method to get everything ready for the next queue\n * @private\n */\n private end(): void {\n this.currentAction = null\n this.allResolve()\n this.allPromise = this.allResolve = null\n }\n\n /**\n * Pop action off the queue and execute it\n * Start tracking a promise to resolve when queue is empty\n * @private\n */\n private run(): void {\n if (!this.allPromise) {\n ({ promise: this.allPromise, resolve: this.allResolve } = decoupledPromise())\n }\n this.currentAction = this.queue.shift()\n this.currentAction.action()\n }\n}","import Form from \"../../models/form\";\nimport OrganizationProvider from \"../../../../common/providers/organizationProvider\";\nimport storeFactoryTrackedMixin from \"../../../../common/mixins/storeFactoryMixins/formStoreFactoryTrackedMixin\";\nimport storeFactoryShareMixin from \"../../../../common/mixins/storeFactoryMixins/storeFactoryShareMixin\";\nimport VersionProvider from \"../../../../common/providers/versionProvider\";\nimport DocumentShareProvider from \"../../../../common/providers/documentShareProvider\";\nimport Selected from \"./selected\";\nimport {VueRouter} from \"vue-router/types/router\";\nimport FormTemplate from \"../../../../common/models/templates/formTemplate\";\nimport {IFormModule} from \"../../../../common/interfaces/vuexModuleInterfaces\";\nimport storeFactoryMergeMixin from \"../../../../common/mixins/storeFactoryMixins/storeFactoryMergeMixin\";\nimport Peeker from \"../../../../common/services/peeker\";\nimport { decoupledPromise } from '~/utils/promiseUtils'\nimport AsyncQueue, { IQueue } from \"~/utils/asyncQueue\"\n\nexport default function (form: Form | FormTemplate, router?: VueRouter, peeker?: Peeker, profileConfigs?: []) {\n const actionQueue: IQueue = new AsyncQueue()\n\n const baseStore: IFormModule = {\n namespaced: true,\n state: {\n formsAvailable: [],\n organizationProvider: new OrganizationProvider(),\n versionProvider: new VersionProvider(form),\n documentShareProvider: new DocumentShareProvider(),\n router: router,\n templates: [],\n peeker: peeker,\n profileConfigs: profileConfigs\n },\n mutations: {\n updateFromJson(state, {json}) {\n Selected.form.get().loadRootFromJson(json);\n },\n updateFormProperties(state, {response, props}) {\n const thisForm = Selected.form.get()\n props['form'].forEach(prop => thisForm[prop] = response[prop]);\n response.workflow_steps.forEach(workflowStep => {\n props['workflow_step'].forEach(prop => {\n thisForm[\"workflow_steps\"][workflowStep.client_id][prop] = workflowStep[prop]\n })\n })\n },\n updateFormsAvailable(state, { formsAvailable }) {\n state.formsAvailable = formsAvailable.filter(f => f.id !== Selected.form.get().id);\n },\n addTemplates(state, {templates}) {\n templates.forEach(t => {\n const templateModel = state.templates.find(template => template.client_id === t.client_id);\n const index = state.templates.indexOf(templateModel);\n if (index !== -1) {\n state.templates[index] = t;\n } else {\n state.templates.push(t);\n }\n });\n }\n },\n actions: {\n saveToServer({ commit, state, getters }) {\n let resolver\n const promise = new Promise((resolve, reject) => {\n resolver = () => {\n const { promise: queuePromise, resolve: queueResolve } = decoupledPromise()\n const unpersistedChangeSets = getters.unpersistedChangeSets\n if (unpersistedChangeSets.length === 0) {\n resolve({})\n queueResolve()\n return\n }\n\n const selectedForm = Selected.form.get()\n selectedForm.runWithProvider(provider => {\n provider.save(selectedForm, getters.getJsonChanges).then(([data]) => {\n commit('updateFormProperties', { response: data[provider.modelRoot], props: { form: ['u_at', 'snapshots'], workflow_step: ['id'] } })\n commit('persistChanges', { changes: unpersistedChangeSets })\n resolve(data)\n queueResolve()\n }).catch(reject)\n })\n return queuePromise\n }\n });\n actionQueue.push({ type: 'save', resolver })\n return promise\n },\n\n backUp({commit, state, getters}) {\n const selectedForm = Selected.form.get();\n return new Promise((resolve, reject) => {\n const unpersistedChangeSets = getters.unpersistedChangeSets;\n selectedForm.runWithProvider(provider => {\n provider.backUp(selectedForm, getters.getJsonChanges).then(\n ([data]) => {\n selectedForm.loadRootFromJson(data[provider.modelRoot]);\n commit('persistChanges', {changes: unpersistedChangeSets});\n resolve();\n }\n )\n });\n });\n },\n\n loadFormsAvailable({commit, state}) {\n const selectedForm = Selected.form.get();\n if (selectedForm.isTemplate) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n selectedForm.runWithProvider(provider => {\n provider.loadFormsAvailable(selectedForm.organization_id).then(\n ([data]) => {\n commit('updateFormsAvailable', {formsAvailable: data[provider.collectionRoot]});\n resolve();\n }\n )\n })\n });\n },\n\n addToGroup({commit, state, getters}, {organizationId, groupId, userId, role_ids, invitationId=null}) {\n return new Promise((resolve, reject) => {\n state.organizationProvider.addToGroup({\n organizationId: organizationId,\n groupId: groupId,\n userId: userId,\n role_ids: role_ids,\n invitationId: invitationId\n }).then(\n result => {\n resolve(result.membership);\n }\n );\n });\n },\n\n updateMembershipFromJson({commit, state, getters}, json) {\n return new Promise((resolve, reject) => {\n state.organizationProvider.updateMembership(json).then(\n result => {\n resolve(result.membership);\n }\n );\n });\n },\n\n removeMembership({commit, state}, {organizationId, groupId, membershipId}) {\n return new Promise((resolve, reject) => {\n state.organizationProvider.removeMembership({\n organizationId: organizationId,\n groupId: groupId,\n membershipId: membershipId\n }).then(\n result => {\n resolve();\n }\n );\n });\n },\n\n invite({commit, state}, {organizationId, groupId, memberships, invitation}) {\n return new Promise((resolve, reject) => {\n state.organizationProvider.invite({\n organizationId: organizationId,\n groupId: groupId,\n memberships: memberships.map(m => m.asJson()),\n invitation: invitation\n }).then(\n result => {\n resolve(result);\n }\n );\n });\n },\n\n publish({commit, state, getters}) {\n const selectedForm = Selected.form.get();\n return new Promise((resolve, reject) => {\n const unpersistedChangeSets = getters.unpersistedChangeSets;\n selectedForm.runWithProvider(provider => {\n provider.publish(selectedForm, getters.getJsonChanges).then(\n ([response]) => {\n const formJson = response[provider.modelRoot];\n formJson.is_published = response.success;\n commit('updateFromJson', {json: formJson});\n commit('persistChanges', {changes: unpersistedChangeSets});\n resolve();\n })\n });\n });\n },\n\n unpublish({commit, state}) {\n const selectedForm = Selected.form.get();\n return new Promise((resolve, reject) => {\n selectedForm.runWithProvider(provider => {\n provider.unpublish(selectedForm).then(\n ([response]) => {\n const formJson = response[provider.modelRoot];\n formJson.is_published = !response.success;\n commit('updateFromJson', {json: formJson});\n resolve();\n });\n });\n });\n },\n\n requestPublish({state}) {\n const selectedForm = Selected.form.get();\n return new Promise((resolve, reject) => {\n selectedForm.runWithProvider(provider => {\n provider.requestPublish(selectedForm).then(\n ([response]) => {\n const formJson = response[provider.modelRoot];\n if (formJson.snapshots) {\n selectedForm.snapshots = formJson.snapshots;\n }\n resolve(formJson.request);\n });\n });\n });\n },\n\n requestUnpublish({state}) {\n const selectedForm = Selected.form.get();\n return new Promise((resolve, reject) => {\n selectedForm.runWithProvider(provider => {\n provider.requestUnpublish(selectedForm).then(\n ([response]) => {\n const formJson = response[provider.modelRoot];\n resolve(formJson.request);\n });\n });\n });\n },\n\n cancelRequest({state}) {\n const selectedForm = Selected.form.get();\n return new Promise((resolve, reject) => {\n selectedForm.runWithProvider(provider => {\n provider.cancelRequest(selectedForm).then(\n ([response]) => {\n const formJson = response[provider.modelRoot];\n resolve(formJson.request);\n });\n });\n });\n },\n\n revertToSnapshot({commit, state, getters}, {snapshot_id}: {snapshot_id: string}) {\n const selectedForm = Selected.form.get();\n return new Promise((resolve, reject) => {\n selectedForm.runWithProvider(provider => {\n provider.revertToSnapshot(selectedForm, snapshot_id, getters.getJsonChanges).then(\n ([response]) => {\n const formJson = response[provider.modelRoot];\n commit('updateFromJson', {json: formJson});\n commit('clearUndoRedo');\n resolve();\n })\n });\n });\n },\n }\n };\n\n return window.AppConfig.mergeJson(\n baseStore,\n storeFactoryTrackedMixin(form),\n storeFactoryShareMixin(form),\n storeFactoryMergeMixin(),\n );\n}","import Vue from \"vue\";\nimport StoreTrackableInterface from \"../../interfaces/storeTrackableInterface\";\nimport UndoRedoHelper from \"../../helpers/undoRedoHelper\";\nimport {RelationType} from \"../../models/relationType\";\n\nexport default function (builderModel: T) {\n return {\n state: {\n done: [],\n undone: [],\n helper: {\n mergeJson(...arg: any[]): object {\n if (arguments.length === 0) {\n return {};\n }\n const first = arguments[0];\n for (let i = 1; i < arguments.length; i++) {\n const other = arguments[i];\n const propertyNames = Object.getOwnPropertyNames(other);\n for (let j = 0; j < propertyNames.length; j++) {\n const propertyName = propertyNames[j];\n if (propertyName === \"__ob__\") continue;\n const property = other[propertyName];\n if (Array.isArray(property)) {\n let toAdd = property;\n if (!first[propertyName]) {\n first[propertyName] = [];\n } else {\n toAdd = [];\n // Merge objects based on matching client id\n for (const newItem of property) {\n let found = false;\n for (const existingItem of first[propertyName]) {\n if (existingItem.client_id && existingItem.client_id === newItem.client_id) {\n this.mergeJson(existingItem, newItem);\n found = true;\n break;\n }\n }\n if (!found) {\n toAdd.push(newItem);\n }\n }\n }\n /**\n * @see {formStoreFactoryTrackedMixin.test.ts} array of primitives should take 2nd obj, array of client_id objs should merge together\n */\n if (toAdd.length === 0 || toAdd.length > 0 && typeof toAdd[0] === 'object' && toAdd[0].client_id) {\n first[propertyName] = first[propertyName].concat(toAdd);\n } else {\n first[propertyName] = toAdd\n }\n } else if (property && typeof property === 'object') {\n if (!first[propertyName]) {\n first[propertyName] = {};\n }\n this.mergeJson(first[propertyName], property);\n } else {\n first[propertyName] = property;\n }\n }\n }\n return first;\n },\n\n getChangesJsonFromChangeSets(rootModel: T, unpersistedChangeSets, forward = true): object {\n if (unpersistedChangeSets === null || !unpersistedChangeSets.length) {\n return {};\n }\n const changeSetsArray = Array.isArray(unpersistedChangeSets) ? unpersistedChangeSets : [unpersistedChangeSets];\n let json: any = {};\n const changesSet = changeSetsArray[0];\n const changes = changesSet.changes;\n\n json = this.getChangesJson(rootModel, changes, forward);\n\n if (changeSetsArray.length > 1) {\n json = this.mergeJson(json, this.getChangesJsonFromChangeSets(rootModel, changeSetsArray.splice(1), forward));\n }\n\n return json;\n },\n\n getChangesJson(parentModel: T, changes, isForward = true): object {\n const json: any = {};\n const rootModel = parentModel.rootModel;\n const parentEmbeddedModels = parentModel.EMBEDDED_MODELS;\n const parentEmbeddedModelKeys = Object.keys(parentEmbeddedModels);\n\n\n for (const key in changes) {\n if (parentEmbeddedModelKeys.includes(key)) {\n if (parentEmbeddedModels[key].relationType === RelationType.singleObject) {\n let childKeyName;\n if (parentModel.EMBEDDED_HASHES.includes(key)) {\n childKeyName = key;\n } else {\n childKeyName = `${key}_attributes`;\n }\n json[childKeyName] = this.getChangesJson(parentModel[key], changes[key], isForward);\n } else {\n json[`${key}_attributes`] = json[`${key}_attributes`] || [];\n for (let i = 0, len = changes[key].length; i < len; i++) {\n const change = changes[key][i];\n const foundModel = change._model.repo.find(change.client_id);\n // if it is not found then it has been deleted since it's last change\n if (foundModel) {\n UndoRedoHelper.pushOrReplace(\n json[`${key}_attributes`],\n this.getChangesJson(foundModel, change, isForward)\n );\n }\n }\n }\n } else if (['id', 'client_id'].includes(key)) {\n json[key] = changes[key];\n } else if (key === 'is_persisted') {\n\n } else if (key === '_destroy') {\n UndoRedoHelper.handleDestroy(json, changes, isForward);\n } else {\n if (isForward) {\n json[key] = changes[key].newVal;\n } else {\n json[key] = changes[key].oldVal;\n }\n }\n }\n\n return json;\n },\n\n destroyedItemsSorted(destroyedItems: Array, isForward: boolean) : Array {\n return isForward ? destroyedItems.slice() : destroyedItems.slice().reverse();\n },\n\n loadChangeSet(rootModel: T, changeSet, isForward = false): void {\n const changes = changeSet.changes;\n this.loadProperties(rootModel, changes, isForward);\n rootModel.clearChanges();\n rootModel.queueSendChangesToServer();\n },\n\n loadProperties(parentModel: T, changes, isForward = false): void {\n const rootModel = parentModel.rootModel;\n const object = (parentModel).constructor.repo.find(changes.client_id || changes.id);\n if (!object) {\n return;\n }\n\n const parentEmbeddedModels = parentModel.EMBEDDED_MODELS;\n const parentEmbeddedModelKeys = Object.keys(parentEmbeddedModels);\n\n for (const key in changes) {\n if (parentEmbeddedModelKeys.includes(key)) {\n if (parentEmbeddedModels[key].relationType === RelationType.singleObject) {\n this.loadProperties(parentModel[key], changes[key], isForward);\n } else {\n for (let i = 0, len = changes[key].length; i < len; i++) {\n const change = changes[key][i];\n this.loadProperties(change._model.repo.find(change.client_id), change, isForward);\n }\n }\n } else if (key === '_destroy') {\n for (const client_id in changes[key]) {\n const destroyedItemsSorted = this.destroyedItemsSorted(changes._destroy[client_id], isForward);\n for (const destroyObject of destroyedItemsSorted) {\n const val = isForward ? destroyObject.newVal : destroyObject.oldVal;\n let parentObj = null;\n let itemKey = null;\n if (parentEmbeddedModelKeys.includes(destroyObject.parentRoot)) {\n if (parentEmbeddedModels[destroyObject.parentRoot].relationType === RelationType.singleObject) {\n parentObj = object;\n itemKey = destroyObject.parentRoot;\n } else {\n parentObj = object[destroyObject.parentRoot];\n itemKey = client_id;\n }\n }\n if (val) {\n Vue.set(parentObj, itemKey, destroyObject.object.loadFromJson(val));\n } else {\n Vue.delete(parentObj, itemKey);\n }\n }\n }\n } else if (key !== 'id' && key !== 'client_id') {\n object[key] = isForward ? changes[key].newVal : changes[key].oldVal;\n }\n }\n }\n },\n },\n mutations: {\n saveChanges(state, {changes, area, peekerOptions}) {\n state.done.push({changes: changes, area: area, is_persisted: false, peekerOptions});\n state.undone = [];\n },\n undo(state) {\n builderModel.saveChangesToStore();\n if (state.done.length > 0) {\n const peekChangeSet = state.done[state.done.length - 1];\n if (state.peeker) {\n if (peekChangeSet.peekerOptions && state.router && peekChangeSet.peekerOptions.area !== state.router.currentRoute.fullPath) {\n state.peeker.peek(peekChangeSet.peekerOptions);\n return;\n }\n }\n const changeSet = state.done.pop();\n changeSet.is_persisted = !changeSet.is_persisted;\n state.undone.push(changeSet);\n state.helper.loadChangeSet(builderModel, changeSet, false);\n }\n },\n redo(state) {\n if (state.undone.length > 0) {\n const peekChangeSet = state.undone[state.undone.length - 1];\n if (state.peeker) {\n if (peekChangeSet.peekerOptions && state.router && peekChangeSet.peekerOptions.area !== state.router.currentRoute.fullPath) {\n state.peeker.peek(peekChangeSet.peekerOptions);\n return;\n }\n }\n const changeSet = state.undone.pop();\n changeSet.is_persisted = !changeSet.is_persisted;\n state.done.push(changeSet);\n state.helper.loadChangeSet(builderModel, changeSet, true);\n }\n },\n clearUndoRedo(state) {\n state.done = [];\n state.undone = [];\n },\n persistChanges(state, { changes }) {\n changes.forEach((change) => {\n change.is_persisted = true;\n });\n },\n },\n getters: {\n unpersistedChangeSets: (state) => {\n return state.done.filter((change) => !change.is_persisted).concat(state.undone.filter((change) => !change.is_persisted));\n },\n unpersistedDoneChangeSets: (state) => {\n return state.done.filter((change) => !change.is_persisted);\n },\n unpersistedUndoneChangeSets: (state) => {\n return state.undone.filter((change) => !change.is_persisted);\n },\n getJsonChanges: (state, getters) => {\n const doneJson = state.helper.getChangesJsonFromChangeSets(builderModel, getters.unpersistedDoneChangeSets, true);\n const undoneJson = state.helper.getChangesJsonFromChangeSets(builderModel, getters.unpersistedUndoneChangeSets, false);\n return state.helper.mergeJson(doneJson, undoneJson);\n }\n }\n };\n}\n"],"names":["__vue2_script","Vue","extend","mixins","ModalComponentMixin","props","display","type","String","default","methods","confirm","this","$emit","_vm","_h","$createElement","_c","_self","attrs","state","index","on","emitHideModal","slot","staticClass","_v","_s","click","AsyncQueue","constructor","options","counter","queue","debug","Logger","start","size","length","push","action","async","resolver","run","end","currentAction","all","Promise","resolve","allPromise","allResolve","promise","decoupledPromise","shift","formStoreFactory","form","router","peeker","profileConfigs","actionQueue","baseStore","namespaced","formsAvailable","organizationProvider","OrganizationProvider","versionProvider","VersionProvider","documentShareProvider","DocumentShareProvider","templates","mutations","updateFromJson","json","Selected","get","loadRootFromJson","updateFormProperties","response","thisForm","forEach","prop","workflow_steps","workflowStep","client_id","updateFormsAvailable","filter","f","id","addTemplates","t","templateModel","find","template","indexOf","actions","saveToServer","commit","getters","reject","queuePromise","queueResolve","unpersistedChangeSets","selectedForm","runWithProvider","provider","save","getJsonChanges","then","data","modelRoot","workflow_step","changes","catch","backUp","loadFormsAvailable","isTemplate","organization_id","collectionRoot","addToGroup","organizationId","groupId","userId","role_ids","invitationId","result","membership","updateMembershipFromJson","updateMembership","removeMembership","membershipId","invite","memberships","invitation","map","m","asJson","publish","formJson","is_published","success","unpublish","requestPublish","snapshots","request","requestUnpublish","cancelRequest","revertToSnapshot","snapshot_id","window","AppConfig","mergeJson","builderModel","done","undone","helper","arg","arguments","first","i","other","propertyNames","Object","getOwnPropertyNames","j","propertyName","property","Array","isArray","toAdd","newItem","found","existingItem","concat","getChangesJsonFromChangeSets","rootModel","forward","changeSetsArray","getChangesJson","splice","parentModel","isForward","parentEmbeddedModels","EMBEDDED_MODELS","parentEmbeddedModelKeys","keys","key","includes","relationType","RelationType","singleObject","childKeyName","EMBEDDED_HASHES","len","change","foundModel","_model","repo","UndoRedoHelper","pushOrReplace","handleDestroy","newVal","oldVal","destroyedItemsSorted","destroyedItems","slice","reverse","loadChangeSet","changeSet","loadProperties","clearChanges","queueSendChangesToServer","object","_destroy","destroyObject","val","parentObj","itemKey","parentRoot","set","loadFromJson","delete","saveChanges","area","peekerOptions","is_persisted","undo","saveChangesToStore","peekChangeSet","currentRoute","fullPath","peek","pop","redo","clearUndoRedo","persistChanges","unpersistedDoneChangeSets","unpersistedUndoneChangeSets","doneJson","undoneJson","storeFactoryShareMixin","storeFactoryMergeMixin"],"mappings":"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"}