{"version":3,"sources":["webpack:///./src/pages/admin/admin.ts","webpack:///./src/pages/admin/admin-arcgis-sources/admin-arcgis-sources.ts","webpack:///./src/pages/admin/admin-arcgis-sources/admin-arcgis-sources.html","webpack:///./src/pages/admin/admin-arcgis-sources/admin-edit-arcgis-sources/admin-edit-arcgis-sources.ts","webpack:///./src/pages/admin/admin-arcgis-sources/admin-edit-arcgis-sources/admin-edit-arcgis-sources.html","webpack:///./src/pages/admin/admin-edit-organization/admin-edit-organization.ts","webpack:///./src/pages/admin/admin-edit-organization/admin-edit-organization.html","webpack:///./src/pages/admin/admin-edit-permissions/admin-edit-permissions.ts","webpack:///./src/pages/admin/admin-edit-permissions/admin-edit-permissions.html","webpack:///./src/pages/admin/admin-edit-role/admin-edit-role.ts","webpack:///./src/pages/admin/admin-edit-role/admin-edit-role.html","webpack:///./src/pages/admin/admin-edit-user-programs/admin-edit-user-programs.ts","webpack:///./src/pages/admin/admin-edit-user-programs/admin-edit-user-programs.html","webpack:///./src/pages/admin/admin-edit-user/admin-edit-user.ts","webpack:///./src/pages/admin/admin-edit-user/admin-edit-user.html","webpack:///./src/pages/admin/admin-files/admin-files.ts","webpack:///./src/pages/admin/admin-files/admin-files.html","webpack:///./src/pages/admin/admin.html"],"names":["log","getLogger","AdminPage","alerts","api","router","dialogService","RoleEditViewModel","UserEditViewModel","OrganizationEditViewModel","PermissionEditViewModel","Role","User","Organization","selectedRows","params","$eager","tokenFields","name","path","label","type","actions","id","service","icon","next","fields","jobsFields","format","jobsStatus","organizationFields","pageLinks","desc","this","auth","me","create","level","dismissable","activePage","some","link","page","roles","find","query","scopes","$contains","$limit","then","result","data","map","r","organizations","org","userSearch","length","$or","username","$ilike","email","fullname","user","roleName","_pending","role","role_name","role_id","warn","Promise","all","usersRoles","remove","user_id","newRole","users","patch","organizationId","programUsersRoles","p","public","catch","e","message","orgIdArray","orgId","join","rows","open","viewModel","model","whenClosed","wasCancelled","deleteOrgs","deletePartnerOrgs","orgParams","error","forEach","deletedOrg","mutated","filter","partner_orgs","includes","partner","po","AdminArcgisSources","sources","pageNumber","perPage","arcGISSources","$skip","response","total","newPage","attached","newPerPage","source","update","output","newSource","validationUrl","useReferer","use_cert","s","module","exports","AdminEditArcgisSources","dialogController","controllerFactory","getFileName","f","endsWith","cert_name","controller","createForCurrentScope","files","ensure","required","on","validate","object","valid","ok","AdminEditOrganization","partnerOptions","selectedPartners","organization","orgs","$select","$ne","$sort","value","sp","license_limit","Error","AdminEditPermissions","selectedScopes","permissionType","adminChecked","permissionList","disabled","permission","app","permissions","populatePermissions","incomingPermissions","key","Object","entries","push","keys","item","i","perm","j","obj","assign","parsePermissions","AdminEditRole","AdminEditUserPrograms","fetchAllPrograms","programs","programUserRolesResult","programUserList","skip","allPrograms","concat","d","program","program_id","programRole","programUser","userRoleId","programTitle","title","programId","roleTitle","roleId","action","undefined","event","inputValue","AdminEditUser","loading","globalRoleId","createNewUser","updateUser","createUser","updateUserRoles","newUser","patchedUser","programOrgId","updateProgram","get","managementOrganizationId","program_org_id","AdminFiles","storage","actionService","cacheKey","folderPaths","selectedFolderPath","debug","folder","Array","from","Set","file","selectedFiles","target","loadingMessage","errorMessage","showError","updateCache","updateFiles","$path","$paginate","searchString","$search"],"mappings":"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","file":"app~3b3975bd.7bdd454b525c92572e25.chunk.js","sourcesContent":["\nimport { autoinject, LogManager, PLATFORM, bindable } from 'aurelia-framework';\nimport { Paginated, Params } from '@feathersjs/feathers';\n\nimport { AlertService } from '../../services/util/Alert';\n\nimport { ValidatedUser } from '../../types/Users';\nimport { ValidatedRole } from '../../types/Roles';\n\nimport { AdminEditRole } from './admin-edit-role/admin-edit-role';\nPLATFORM.moduleName('./admin-edit-role/admin-edit-role');\n\nimport { AdminEditUser } from './admin-edit-user/admin-edit-user';\nPLATFORM.moduleName('./admin-edit-user/admin-edit-user');\n\nimport { AdminEditOrganization } from './admin-edit-organization/admin-edit-organization';\nPLATFORM.moduleName('./admin-edit-organization/admin-edit-organization');\n\n// Custom permissions dialog\nimport { AdminEditPermissions } from './admin-edit-permissions/admin-edit-permissions';\nPLATFORM.moduleName('./admin-edit-permissions/admin-edit-permissions');\n\nimport { Field } from '@wsb_dev/datafi-shared/lib/types/Field';\nimport { getFields } from '@wsb_dev/datafi-shared/lib/util/fields/getFields';\nimport { DatafiProAPI } from '../../services/api/DatafiProAPI';\nimport { BaseModel, GenerateCSVData, RequestData, Role, SaveFileActionData } from '@wsb_dev/datafi-shared/lib/types';\nimport { userHasPermission } from '@wsb_dev/datafi-shared/lib/util/users/userHasPermission';\nimport { Redirect, Router } from 'aurelia-router';\nimport { ValidatedOrganization } from '../../types/Organizations';\nimport { MDCDelete } from '../../components/mdc-delete-dialog/mdc-delete-dialog';\nimport { DialogService } from 'aurelia-dialog';\n\nconst log = LogManager.getLogger('dfp:admin');\n\n@autoinject\nexport class AdminPage {\n\n    RoleEditViewModel = AdminEditRole;\n    UserEditViewModel = AdminEditUser;\n    OrganizationEditViewModel = AdminEditOrganization;\n\n    // Custom permissions dialog\n    PermissionEditViewModel = AdminEditPermissions;\n\n    Role: typeof ValidatedRole = ValidatedRole;\n    User: typeof ValidatedUser = ValidatedUser;\n    Organization: typeof ValidatedOrganization = ValidatedOrganization;\n\n    roles: ValidatedRole[];\n    organizations: ValidatedOrganization[];\n    @bindable selectedRows: BaseModel[] = [];\n    @bindable orgParams;\n\n    userSearch: string;\n    params: Params = {\n        $eager: 'roles.role',\n    };\n\n    tokenFields: Field[] = getFields([{\n        name: 'token_name',\n        path: 'token_name',\n    }, {\n        name: 'user.fullname',\n        path: 'user.fullname',\n        label: 'User',\n    }, {\n        name: 'user.username',\n        path: 'user.username',\n        label: 'Username',\n    }, {\n        path: 'enabled',\n        name: 'enabled',\n    }, {\n        path: 'client_type',\n        name: 'client_type',\n    }, {\n        path: 'clients',\n        name: 'clients',\n    }, {\n        name: 'updatedAt',\n        path: 'updatedAt',\n        label: 'Last used/updated',\n        type: 'date',\n    }, {\n        name: 'user.id',\n        path: 'user.id',\n        label: 'User ID',\n    }, {\n        name: 'token',\n        path: 'token',\n        label: 'Token',\n    }, {\n        path: 'id',\n        name: 'id',\n        label: 'Token ID',\n    }])\n\n    actions = [\n        {\n            id: 'Query',\n            service: 'api/v1/users',\n            label: 'Export Users',\n            icon: 'cloud_download',\n            next: {\n                id: 'GenerateCSV',\n                fields: [\n                    { name: 'id' },\n                    { name: 'username' },\n                    { name: 'email' },\n                    { name: 'fullname' },\n                    { name: 'createdAt' },\n                    { name: 'updatedAt' },\n                ],\n                next: {\n                    id: 'SaveFile',\n                    name: 'users.csv',\n                } as SaveFileActionData,\n            } as GenerateCSVData,\n        } as RequestData,\n    ]\n\n    jobsFields: Field[] = getFields([\n        { label: 'ID', name: 'id', path: 'id', type: 'number', format: 'd' },\n        { label: 'Created At', name: 'createdAt', path: 'createdAt', type: 'date' },\n        { label: 'Updated At', name: 'updatedAt', path: 'updatedAt', type: 'date' },\n        { label: 'Status', name: 'status', path: 'status' },\n        { label: 'Name', name: 'name', path: 'name' },\n        { label: 'Job Size (MB)', name: 'dataSize', path: 'dataSize', format: '.1r' },\n        { label: 'Attempts', name: 'attempts', path: 'options.attempts', format: 'd' },\n        { label: 'Delay', name: 'delay', path: 'options.delay', format: 'd' },\n        { label: 'User ID', name: 'user_id', path: 'user_id', format: 'd' },\n        { label: 'Program ID', name: 'program_id', path: 'program_id', format: 'd' },\n        { label: 'Webhook ID', name: 'webhook_id', path: 'webhook_id', format: 'd' },\n        { label: 'Result', name: 'result', path: 'result.id' },\n        { label: 'Error', name: 'error', path: 'error' },\n    ])\n    jobsStatus = ['completed', 'failed', 'waiting', 'active', 'delayed'];\n\n    organizationFields: Field[] = getFields([\n        { name: 'id', path: 'id', type: 'number' },\n        { name: 'name', path: 'name' },\n    ]);\n\n    activePage?: string;\n    pageLinks = [{\n        label: 'Users',\n        path: 'users',\n        desc: 'Manage user data.',\n        icon: 'person',\n    },\n    {\n        label: 'Roles',\n        path: 'roles',\n        desc: 'Manage the permissions for global and app roles.',\n        icon: 'verifieduser',\n    },\n    {\n        label: 'Files',\n        path: 'files',\n        desc: 'Manage files and file structure.',\n        icon: 'folder',\n    },\n    {\n        label: 'Tokens',\n        path: 'tokens',\n        desc: 'Manage token data.',\n        icon: 'key',\n    },\n    {\n        label: 'Jobs',\n        path: 'jobs',\n        desc: 'View executed job data.',\n        icon: 'work_history',\n    },\n    {\n        label: 'Organizations',\n        path: 'organizations',\n        desc: 'Manage organization data.',\n        icon: 'groups',\n    },\n    {\n        label: 'ArcGIS Sources',\n        path: 'arcgis-sources',\n        desc: 'Manage ArcGIS sources for token validation.',\n        icon: 'map',\n    },\n    ];\n\n    constructor(\n        private alerts: AlertService,\n        private api: DatafiProAPI,\n        private router: Router,\n        private dialogService: DialogService,\n    ) { }\n\n    canActivate() {\n        if (userHasPermission(this.api.auth.me, '*', '*')) {\n            return true;\n        }\n        this.alerts.create({\n            label: 'You do not have permission to access this page',\n            level: 'warning',\n            dismissable: true,\n        });\n        return new Redirect('/');\n    }\n\n    async activate(params) {\n        this.activePage = this.pageLinks.some((link) => link.path === params.page) ? params.page : null;\n        // get roles\n        await this.api.roles.find({\n            query: { scopes: { $contains: '[\"app\"]' }, $limit: 50 },\n        }).then((result: Paginated<ValidatedRole>) => this.roles = result.data.map((r) => new ValidatedRole(r)));\n\n        //get organizations\n        await this.api.organizations.find({\n            query: { $limit: 50 },\n        }).then((result: Paginated<ValidatedOrganization>) => this.organizations = result.data.map((org) => new ValidatedOrganization(org)));\n    }\n\n    searchUsers() {\n        this.params = {\n            $eager: 'roles.role',\n        };\n        if (this.userSearch.length > 1) {\n            this.params = {\n                ... this.params,\n                $or: [\n                    { username: { $ilike: '%' + this.userSearch + '%' } },\n                    { email: { $ilike: '%' + this.userSearch + '%' } },\n                    { fullname: { $ilike: '%' + this.userSearch + '%' } },\n                ],\n            };\n        }\n    }\n\n    async updateUserRole(user: ValidatedUser, roleName: string) {\n        if (user._pending) {\n            return;\n        }\n        user._pending = true;\n        const role = this.roles.find((role) => role.role_name === roleName);\n        const existingUserRole = user.roles?.find((r) => r.role_id === role?.id);\n        if (existingUserRole) {\n            log.warn(`Role was already present and was not added: ${role.role_name}`);\n            return;\n        }\n\n        // delete existing role\n        if (user.roles?.length) {\n            await Promise.all(user.roles?.map((role) => {\n                if (!role?.id) { return; }\n                return this.api.usersRoles.remove(role.id);\n            }));\n        }\n\n        // create new role\n        if (role) {\n            await this.api.usersRoles.create({\n                user_id: user.id,\n                role_id: role.id,\n            }).then((newRole) => {\n                user.roles = [{ ...newRole, role }];\n            });\n        }\n\n        // TODO fix caching on backend to remove this line\n        await this.api.users.patch(user.id, {});\n        user._pending = false;\n\n        this.alerts.create({\n            label: `${user.fullname || user.username} role was updated`,\n            level: 'success',\n            dismissable: true,\n        });\n    }\n\n    async updateUserOrganization(user: ValidatedUser, id) {\n        if (user._pending) {\n            return;\n        }\n        user._pending = true;\n        await this.api.users.patch(user.id, { organizationId: id });\n        await this.api.programUsersRoles.find({ query: { user_id: user.id }, $limit: 50 }).then((result: any) => {\n            if (result?.data.length) {\n                return result.data.map((p) => {\n                    return this.api.programUsersRoles.patch(p.id, { organizationId: id });\n                });\n            }\n        });\n        user._pending = false;\n\n        this.alerts.create({\n            label: `Organization updated for user: ${user.fullname || user.username}`,\n            level: 'success',\n            dismissable: true,\n        });\n    }\n\n    async toggleRolePublic(role: Role): Promise<void> {\n        return this.api.roles.patch(role.id, { public: role.public })\n            .then(() => {\n                this.alerts.create({\n                    label: role.public ? `${role.role_name} has been set to public` : `${role.role_name} has been set to private`,\n                    level: 'success',\n                    dismissable: true,\n                });\n            }).catch((e) => {\n                this.alerts.create({ label: `Error: ${e.message}`, level: 'error', dismissable: true });\n            });\n    }\n\n    getOrgDisplay(orgIdArray) {\n        if (!orgIdArray) return orgIdArray;\n        return orgIdArray.map((orgId) => {\n            return this.organizations.find((org) => org.id === orgId)?.name || 'Not Found';\n        }).join(', ');\n    }\n\n    deleteDialog(rows: BaseModel[]) {\n        return this.dialogService.open({\n            viewModel: MDCDelete,\n            model: rows,\n        }).whenClosed((result) => {\n            if (result.wasCancelled) {\n                return;\n            }\n            this.deleteOrgs(rows);\n        });\n    }\n\n    deleteOrgs(rows: BaseModel[]): Promise<void> {\n        return Promise.all(rows.map((org) => {\n            return this.api.organizations.remove(org.id);\n        })).then(async () => {\n            this.alerts.create({\n                label: 'Organization(s) deleted', dismissable: true,\n            });\n            await this.deletePartnerOrgs(rows);\n            this.selectedRows = [];\n            this.orgParams = { ...this.orgParams };\n        }).catch((e) => {\n            log.error(e);\n            this.alerts.create({\n                label: e,\n                level: 'error',\n                dismissable: true,\n            });\n        });\n    }\n\n    async deletePartnerOrgs(rows: BaseModel[]) {\n        await rows.forEach(async (deletedOrg) => {\n            const partners = this.organizations.filter((org) => org.partner_orgs?.includes(deletedOrg.id));\n            const mutated = partners.map((partner) => {\n                partner.partner_orgs = partner.partner_orgs.filter((po) => po !== deletedOrg.id);\n                return partner;\n            });\n            return Promise.all(mutated.map((org) => {\n                return this.api.organizations.patch(org.id, org);\n            })).catch((e) => {\n                log.error(e);\n                this.alerts.create({\n                    label: e,\n                    level: 'error',\n                    dismissable: true,\n                });\n            });\n        });\n    }\n}\n","import { bindable, LogManager, autoinject, PLATFORM } from 'aurelia-framework';\nimport { DatafiProAPI } from '../../../services/api/DatafiProAPI';\nimport { AlertService } from '../../../services/util/Alert';\nimport { DialogService } from 'aurelia-dialog';\nimport { Paginated } from '@feathersjs/feathers';\nimport { AdminEditArcgisSources } from './admin-edit-arcgis-sources/admin-edit-arcgis-sources';\nimport { MDCDelete } from '../../../components/mdc-delete-dialog/mdc-delete-dialog';\nPLATFORM.moduleName('./admin-edit-arcgis-sources/admin-edit-arcgis-sources');\nconst log = LogManager.getLogger('dfp:admin:arcgis-sources');\n@autoinject\n\nexport class AdminArcgisSources {\n    @bindable sources: any[] = [];\n    @bindable total: number;\n    @bindable pageNumber = 1;\n    @bindable perPage = 10;\n\n    constructor(\n        private api: DatafiProAPI,\n        private alerts: AlertService,\n        private dialogService: DialogService,\n    ) { }\n\n    async attached(): Promise<void> {\n        await this.api.arcGISSources.find({\n            query: {\n                $limit: this.perPage,\n                $skip: (this.pageNumber - 1) * this.perPage,\n            },\n        }).then((response: Paginated<any>) => {\n            this.sources = response.data;\n            this.total = response.total;\n        }).catch((e) => {\n            log.error(e);\n            this.alerts.create({\n                label: 'Error loading ArcGIS sources',\n                level: 'error',\n                dismissable: true,\n            });\n        });\n    }\n\n    pageNumberChanged(newPage: number): void {\n        this.pageNumber = newPage;\n        this.attached();\n    }\n\n    perPageChanged(newPerPage: number): void {\n        this.perPage = newPerPage;\n        this.attached();\n    }\n\n    edit(source: any): void {\n        this.dialogService.open({\n            viewModel: AdminEditArcgisSources,\n            model: source,\n        }).whenClosed((response) => {\n            if (response.wasCancelled) {\n                return;\n            }\n            this.api.arcGISSources.update(source.id, response.output).then(() => {\n                this.attached();\n                this.alerts.create({\n                    label: `ArcGIS source \"${source.name}\" updated successfully.`,\n                    level: 'success',\n                    dismissable: true,\n                });\n            }).catch((e) => {\n                log.error(e);\n                this.alerts.create({\n                    label: `Error updating ArcGIS source \"${source.name}\": ${e.message}`,\n                    level: 'error',\n                    dismissable: true,\n                });\n                return;\n            });\n        });\n    }\n\n    create(): void {\n        const newSource = {\n            name: '',\n            validationUrl: '',\n            useReferer: false,\n            use_cert: false,\n        };\n        this.dialogService.open({\n            viewModel: AdminEditArcgisSources,\n            model: newSource,\n        }).whenClosed((response) => {\n            if (response.wasCancelled) {\n                return;\n            }\n            this.api.arcGISSources.create(newSource)\n                .then(() => {\n                    this.alerts.create({\n                        label: `ArcGIS source \"${newSource.name}\" created successfully.`,\n                        level: 'success',\n                        dismissable: true,\n                    });\n                    this.attached();\n                })\n                .catch((e) => {\n                    log.error(e);\n                    this.alerts.create({\n                        label: `Error creating ArcGIS source \"${e.message}\".`,\n                        level: 'error',\n                        dismissable: true,\n                    });\n                });\n        });\n    }\n\n    delete(source: any): void {\n        this.dialogService.open({\n            viewModel: MDCDelete,\n            model: source,\n        }).whenClosed((response) => {\n            if (response.wasCancelled) {\n                return;\n            }\n            this.api.arcGISSources.remove(source.id)\n                .then(() => {\n                    this.alerts.create({\n                        label: `ArcGIS source \"${source.name}\" deleted successfully.`,\n                        level: 'success',\n                        dismissable: true,\n                    });\n                    this.sources = this.sources.filter((s) => s.id !== source.id);\n                })\n                .catch((e) => {\n                    log.error(e);\n                    this.alerts.create({\n                        label: `Error deleting ArcGIS source \"${source.name}\".`,\n                        level: 'error',\n                        dismissable: true,\n                    });\n                });\n        });\n    }\n}\n","// Module\nvar code = \"<template> <require from=\\\"../../../components/mdc-pagination/mdc-pagination\\\"></require> <button mdc-button raised type=\\\"button\\\" class=\\\"mb-3\\\" click.delegate=\\\"create()\\\"> <mdc-icon>add</mdc-icon> New ArcGIS Source </button> <h3 class=\\\"mb-4\\\">ArcGIS Sources</h3> <mdc-data-table class=\\\"admin\\\"> <table> <thead> <th></th> <th>ID</th> <th>Name</th> <th>Validation URL</th> <th>Use Referer</th> <th>Use Cert</th> <th>Cert</th> <th></th> </thead> <tbody> <tr mdc-data-table-row repeat.for=\\\"source of sources\\\"> <td> <button mdc-icon-button class=\\\"button--color--secondary mr-2\\\" click.trigger=\\\"edit(source)\\\" icon=\\\"edit\\\"> </button> </td> <td>${source.id}</td> <td>${source.name}</td> <td>${source.validationUrl}</td> <td>${source.useReferer}</td> <td>${source.use_cert}</td> <td>${source.cert_name}</td> <td> <button class=\\\"button--color--danger\\\" mdc-icon-button icon=\\\"delete\\\" click.delegate=\\\"delete(source)\\\"> </button> </td> </tr> </tbody> </table> </mdc-data-table> <mdc-pagination per-page-options.bind=\\\"[10,25,50,100]\\\" per-page.from-view=\\\"perPage\\\" page.two-way=\\\"pageNumber\\\" total.bind=\\\"total\\\"> </mdc-pagination> </template> \";\n// Exports\nmodule.exports = code;","import { DialogController } from 'aurelia-dialog';\nimport { autoinject } from 'aurelia-framework';\nimport { ValidationController, ValidationControllerFactory, ValidationRules } from 'aurelia-validation';\nimport { AlertService } from '../../../../services/util/Alert';\nimport { DatafiProAPI } from '../../../../services/api/DatafiProAPI';\n\n@autoinject\nexport class AdminEditArcgisSources {\n    source: any;\n    controller: ValidationController;\n    constructor(\n        private dialogController: DialogController,\n        private controllerFactory: ValidationControllerFactory,\n        private alerts: AlertService,\n        private api: DatafiProAPI,\n    ) {\n        this.controller = this.controllerFactory.createForCurrentScope();\n    }\n    activate(model: any): void {\n        this.source = model;\n    }\n\n    getFileName = (f: File): string => {\n        if (f.name.endsWith('.pem')) {\n            this.source.cert_name = f.name;\n            return `templates/arcgis-sources/${f.name}`;\n        } else {\n            this.alerts.create({\n                label: 'Invalid file type. Please upload a .pem file.',\n                level: 'error',\n                dismissable: true,\n            });\n        }\n    }\n\n    async deleteFile(source: any): Promise<void> {\n        this.api.files.remove(`templates/arcgis-sources/${source.cert_name}`).then(() => {\n            this.alerts.create({\n                label: `Certificate \"${source.cert_name}\" deleted successfully.`,\n                level: 'success',\n                dismissable: true,\n            });\n        }).catch((e) => {\n            this.alerts.create({\n                label: `Error deleting certificate \"${source.cert_name}\": ${e.message}`,\n                level: 'error',\n                dismissable: true,\n            });\n        });\n\n        this.api.arcGISSources.patch(source.id, {\n            cert_name: '',\n        }).catch((e) => {\n            this.alerts.create({\n                label: `Error updating ArcGIS source \"${source.name}\": ${e.message}`,\n                level: 'error',\n                dismissable: true,\n            });\n        });\n\n        this.source.cert_name = '';\n    }\n\n    async save(source: any) {\n        ValidationRules\n            .ensure('name').required()\n            .ensure('validationUrl').required()\n            .ensure('useReferer').required()\n            .ensure('use_cert').required()\n            .on(source);\n\n        const validation = await this.controller.validate({ object: source });\n\n        if (!validation.valid) {\n            this.alerts.create({\n                level: 'error',\n                label: 'Please fix validation errors before saving.',\n                dismissable: true,\n            });\n            return;\n        }\n\n        this.dialogController.ok(source);\n    }\n}\n","// Module\nvar code = \"<template> <require from=\\\"components/mdc-upload-field/mdc-upload-field\\\"></require> <ux-dialog> <ux-dialog-header> <h3>Edit ArcGIS Source</h3> </ux-dialog-header> <ux-dialog-body> <form class=\\\"p-4\\\"> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"source.name & validate\\\" label=\\\"ArcGIS Source Name\\\" required> </mdc-text-field> <mdc-text-field class=\\\"w-100 mt-4\\\" if.bind=\\\"source.id !== 0\\\" value.bind=\\\"source.validationUrl & validate\\\" label=\\\"Validation URL\\\" required> </mdc-text-field> <h4 class=\\\"mt-10\\\">Configuration</h4> <h5 class=\\\"mb-2\\\">Use Referer Header</h5> <mdc-form-field class=\\\"mr-4\\\"> <mdc-radio model.bind=\\\"true\\\" checked.bind=\\\"source.useReferer\\\"></mdc-radio> <label>Yes</label> </mdc-form-field> <mdc-form-field> <mdc-radio model.bind=\\\"false\\\" checked.bind=\\\"source.useReferer\\\"></mdc-radio> <label>No</label> </mdc-form-field> <h5 class=\\\"mt-4 mb-2\\\">Use Custom Certificate</h5> <mdc-form-field class=\\\"mr-4\\\"> <mdc-radio model.bind=\\\"true\\\" checked.bind=\\\"source.use_cert\\\"></mdc-radio> <label>Yes</label> </mdc-form-field> <mdc-form-field> <mdc-radio model.bind=\\\"false\\\" checked.bind=\\\"source.use_cert\\\"></mdc-radio> <label>No</label> </mdc-form-field> <div if.bind=\\\"source.use_cert\\\" class=\\\"mt-10\\\"> <h4 class=\\\"mb-3\\\">Certificate Management</h4> <div if.bind=\\\"source.cert_name\\\"> <div class=\\\"p-relative d-flex align-center justify-between\\\"> <span class=\\\"font-weight-medium p-relative d-flex align-center\\\"><mdc-icon class=\\\"mr-2 text-success\\\">verified_user</mdc-icon>${source.cert_name}</span> <button class=\\\"button--color--danger\\\" mdc-icon-button icon=\\\"delete\\\" click.delegate=\\\"deleteFile(source)\\\" title=\\\"Delete certificate\\\"> </button> </div> </div> <h5 class=\\\"mb-2\\\">${source.cert_name ? 'Replace' : 'Upload'} root .pem Certificate</h5> <mdc-upload-field get-file-name.bind=\\\"getFileName\\\"> </mdc-upload-field> </div> </form> </ux-dialog-body> <ux-dialog-footer> <button class=\\\"button--color--secondary float-left\\\" click.delegate=\\\"dialogController.close()\\\" mdc-button> Cancel </button> <button class=\\\"button--raised--primary\\\" click.delegate=\\\"save(source)\\\" mdc-button raised> Save </button> </ux-dialog-footer> </ux-dialog> </template> \";\n// Exports\nmodule.exports = code;","import { ValidationController } from 'aurelia-validation';\nimport { DialogController } from 'aurelia-dialog';\nimport { LogManager, autoinject } from 'aurelia-framework';\nimport { ValidationControllerFactory } from 'aurelia-validation';\nimport { AlertService } from '../../../services/util/Alert';\nimport { DatafiProAPI } from '../../../services/api/DatafiProAPI';\nimport { ValidatedOrganization } from '../../../types/Organizations';\nimport { Paginated } from '@feathersjs/feathers';\nimport { debounced } from '../../../util/decorators/debounced';\n\nconst log = LogManager.getLogger('dfp:admin');\n\n@autoinject\nexport class AdminEditOrganization {\n\n    organization: ValidatedOrganization;\n    controller: ValidationController;\n    partnerOptions = [];\n    selectedPartners = [];\n\n    constructor(\n        private controllerFactory: ValidationControllerFactory,\n        private dialogController: DialogController,\n        private alerts: AlertService,\n        private api: DatafiProAPI,\n    ) {\n        this.controller = this.controllerFactory.createForCurrentScope();\n    }\n\n    async activate(organization) {\n        this.organization = new ValidatedOrganization(organization);\n\n        const orgs = await this.api.organizations.find({ query: {\n            $select: ['id', 'name'],\n            id: { $ne: 0 },\n            $sort: { id: 1 },\n            $limit: 50,\n        }}) as Paginated<ValidatedOrganization>;\n        this.partnerOptions = orgs.data.filter((org) => org.id !== this.organization.id).map((org) => {\n            return { value: { value: org.id, label: org.name }, label: org.name };\n        });\n        this.selectedPartners = orgs.data.map((org) => {\n            return { value: org.id, label: org.name };\n        }).filter((org) => this.organization.partner_orgs?.includes(org.value));\n    }\n\n    @debounced(500)\n    handlePartnerOrg() {\n        this.organization.partner_orgs = this.selectedPartners.map((sp) => sp.value);\n    }\n\n    saveOrganization(organization: ValidatedOrganization) {\n        if (this.organization && !this.organization.license_limit) { this.organization.license_limit = null; }\n        return this.controller.validate({\n            object: organization,\n        }).then((result) => {\n            if (!result.valid) {\n                throw new Error('Form is not valid');\n            }\n            if (!organization.id) {\n                return this.api.organizations.create(organization);\n            }\n            return this.api.organizations.update(organization.id, organization);\n        }).then((organization) => {\n            this.alerts.create({\n                label: 'Organization saved',\n                dismissable: true,\n            });\n            this.dialogController.ok(organization);\n        }).catch((e) => {\n            log.error(e);\n            this.alerts.create({\n                label: e.message,\n                level: 'error',\n                dismissable: true,\n            });\n        });\n    }\n}\n","// Module\nvar code = \"<template> <require from=\\\"../../../components/mdc-multiselect/mdc-multiselect\\\"></require> <ux-dialog> <ux-dialog-header> <h3 class=\\\"align-header\\\">Edit Organization</h3> <button click.delegate=\\\"dialogController.cancel()\\\" class=\\\"button--color--secondary float-right\\\" icon=\\\"close\\\" mdc-icon-button></button> </ux-dialog-header> <ux-dialog-body> <form submit.trigger=\\\"saveOrganization(organization)\\\"> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"organization.name & validate\\\" type=\\\"text\\\" label=\\\"Organization Name\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <mdc-multiselect if.bind=\\\"organization.id !== 0\\\" options.bind=\\\"partnerOptions\\\" value.two-way=\\\"selectedPartners\\\" label=\\\"Partner Orgs\\\" change.delegate=\\\"handlePartnerOrg()\\\"> </mdc-multiselect> <mdc-text-field class=\\\"w-100 mt-4\\\" if.bind=\\\"organization.id !== 0\\\" value.bind=\\\"organization.license_limit\\\" type=\\\"number\\\" label=\\\"License Limit\\\"></mdc-text-field> <button class=\\\"mt-8 button--raised--secondary float-right\\\" click.delegate=\\\"saveOrganization(organization)\\\" type=\\\"submit\\\" mdc-button raised> <mdc-icon>save</mdc-icon><span>Save Organization</span> </button> <button class=\\\"mt-8 button--color--secondary\\\" click.delegate=\\\"dialogController.close()\\\" type=\\\"submit\\\" mdc-button>Cancel</button> </form> </ux-dialog-body> <div class=\\\"mdc-dialog__scrim\\\"></div> </ux-dialog> </template> \";\n// Exports\nmodule.exports = code;","import { ValidationController } from 'aurelia-validation';\nimport { DialogController } from 'aurelia-dialog';\nimport { LogManager, autoinject } from 'aurelia-framework';\nimport { ValidationControllerFactory } from 'aurelia-validation';\nimport { AlertService } from '../../../services/util/Alert';\nimport { ValidatedRole } from '../../../types/Roles';\nimport { bindable } from 'aurelia-framework';\nimport { RoleScope } from '@wsb_dev/datafi-shared/lib/types/Roles';\nimport { DatafiProAPI } from '../../../services/api/DatafiProAPI';\n\nconst log = LogManager.getLogger('dfp:admin');\n\nexport interface PermissionType {\n    type: string,\n    value: string,\n}\n\nexport interface PermissionList {\n    name: string;\n    label: string;\n    disabled?: Record<string, boolean>;\n    permission?: PermissionType[];\n    /**\n     * set if the permission type is an application level permission only\n     */\n    app?: boolean;\n}\n@autoinject\nexport class AdminEditPermissions {\n    role: ValidatedRole;\n    controller: ValidationController;\n\n    scopes = [\n        'app',\n        'program',\n    ]\n    selectedScopes: string[] = [];\n\n    @bindable permissionType: PermissionType[] = [\n        { type: 'Edit', value: 'edit' },\n        { type: 'Read', value: 'read' },\n        { type: 'Remove', value: 'remove' },\n        { type: 'Create', value: 'create' },\n    ]\n\n    @bindable adminChecked = false;\n\n    @bindable permissionList: PermissionList[] = [\n        { name: 'api/v1/form-submissions', label: 'Form Submissions (datafi pro forms)', disabled: {}, permission: [] },\n        { name: 'api/v1/files', label: 'Files', disabled: {}, permission: [] },\n        { name: 'api/v1/geocode', label: 'Geocoding', disabled: {}, permission: [], app: true },\n        { name: 'api/v1/jobs', label: 'Jobs', disabled: {}, permission: [] },\n        { name: 'api/v1/organizations', label: 'Organizations', disabled: {}, permission: [] },\n        { name: 'api/v1/programs', label: 'Programs', disabled: {}, permission: [] },\n        { name: 'api/v1/programs-asset-types', label: 'Program Asset Types', disabled: {}, permission: [] },\n        { name: 'api/v1/programs-assets', label: 'Program Assets', disabled: {}, permission: [] },\n        { name: 'api/v1/programs-configs', label: 'Program Configuration', disabled: {}, permission: [] },\n        { name: 'api/v1/programs-secrets', label: 'Program Secrets', disabled: {}, permission: [] },\n        { name: 'api/v1/programs-surveys', label: 'Program Surveys', disabled: {}, permission: [] },\n        { name: 'api/v1/programs-users-roles', label: 'Program User Location/Roles', disabled: {}, permission: [] },\n        { name: 'api/v1/programs-webhooks', label: 'Program Webhooks', disabled: {}, permission: [] },\n        { name: 'api/v1/projects', label: 'Projects', disabled: {}, permission: [] },\n        { name: 'api/v1/projects-files', label: 'Project Files', disabled: {}, permission: [] },\n        { name: 'api/v2/surveys-media', label: 'Survey Media', disabled: {}, permission: [] },\n        { name: 'api/v2/surveys', label: 'Surveys (Kobo)', disabled: {}, permission: [] },\n        { name: 'api/v1/tokens', label: 'Tokens', disabled: {}, permission: [], app: true },\n        { name: 'api/v1/roles', label: 'Roles', disabled: {}, permission: [], app: true },\n        { name: 'api/v1/users', label: 'Users', disabled: {}, permission: [], app: true },\n        { name: 'api/v1/users-roles', label: 'User Roles', disabled: {}, permission: [], app: true },\n    ]\n\n    constructor(\n        private controllerFactory: ValidationControllerFactory,\n        private dialogController: DialogController,\n        private alerts: AlertService,\n        private api: DatafiProAPI,\n    ) {\n        this.role = new ValidatedRole({});\n        this.controller = this.controllerFactory.createForCurrentScope();\n    }\n\n    activate(role: ValidatedRole) {\n        this.role = new ValidatedRole(role);\n\n        if (this.role.scopes) {\n            this.selectedScopes = this.role.scopes;\n        }\n        if (this.role.permissions) {\n            this.populatePermissions(this.role);\n        }\n    }\n\n    populatePermissions(role) {\n        const incomingPermissions = [];\n        for (const [key, value] of Object.entries(role.permissions)) {\n            (key === '*') ? this.adminChecked = true : incomingPermissions.push([key, Object.keys(value)]);\n        }\n\n        this.permissionList.forEach((item) => {\n            for (let i = 0; i < incomingPermissions.length; i++) {\n                if (incomingPermissions[i][0] === item.name) {\n                    this.permissionType.forEach((perm) => {\n                        for (let j = 0; j < incomingPermissions[i][1].length; j++) {\n                            if (incomingPermissions[i][1][j] === perm.value) {\n                                item.permission.push(perm);\n                            }\n                        }\n                    });\n                }\n            }\n        });\n    }\n\n    validateSelection() {\n        if (!this.adminChecked) {\n            this.permissionList.forEach((item) => {\n                this.permissionType.forEach((perm) => item.disabled[perm.value] = false);\n            });\n        } else {\n            this.permissionList.forEach((item) => {\n                item.permission = []; // uncheck all checkboxes\n                this.permissionType.forEach((perm) => item.disabled[perm.value] = true);\n            });\n        }\n    }\n\n    parsePermissions() {\n        const obj = {};\n        let permissions = {};\n        if (!this.adminChecked) {\n            this.permissionList.forEach((item) => {\n                if (item.permission.length === 1) {\n                    // If only 1 permission type selected\n                    item.permission.forEach((perm) => {\n                        Object.assign(obj, { [item.name]: { [perm.value]: 1 } });\n                    });\n                } else if (item.permission.length > 1) {\n                    // If more than 1 permission type selected\n                    item.permission.forEach((perm) => {\n                        Object.assign(permissions, { [perm.value]: 1 });\n                    });\n                    Object.assign(obj, { [item.name]: permissions });\n                    permissions = {};\n                }\n            });\n        } else {\n            Object.assign(obj, { '*': { '*': '*' } });\n        }\n        return obj;\n    }\n\n    saveRole(role: ValidatedRole) {\n        role.permissions = this.parsePermissions();\n\n        return this.controller.validate({\n            object: role,\n        }).then((result) => {\n            role.scopes = this.selectedScopes as RoleScope[];\n            if (!result.valid) {\n                throw new Error('Form is not valid');\n            }\n            if (!role.id) {\n                return this.api.roles.create(role);\n            }\n\n            return this.api.roles.update(role.id, role);\n        }).then((role) => {\n            this.alerts.create({\n                label: 'Role saved',\n                dismissable: true,\n            });\n            this.role = new ValidatedRole({});\n            this.dialogController.ok(role);\n        }).catch((e) => {\n            log.error(e);\n            this.alerts.create({\n                label: e.message,\n                level: 'error',\n                dismissable: true,\n            });\n        });\n    }\n}\n","// Module\nvar code = \"<template> <require from=\\\"components/mdc-json-field/mdc-json-field\\\"></require> <ux-dialog> <ux-dialog-body style=\\\"width:700px\\\"> <form submit.trigger=\\\"saveRole(role)\\\"> <h4>Basic Information</h4> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"role.role_name & validate\\\" type=\\\"text\\\" label=\\\"Role Name\\\" placeholder=\\\"pipeline_manager\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"role.description & validate\\\" type=\\\"text\\\" label=\\\"Role Description\\\" placeholder=\\\"This role allows users to...\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <h4>Scope</h4> <mdc-form-field repeat.for=\\\"scope of scopes\\\"> <mdc-checkbox checked.bind=\\\"selectedScopes\\\" value.bind=\\\"scope\\\"></mdc-checkbox> <label>${scope | title}</label> </mdc-form-field> <h4 if.bind=\\\"!adminChecked\\\">Public</h4> <mdc-form-field if.bind=\\\"!adminChecked\\\" class=\\\"mb-4 ml-3\\\"> <button mdc-switch selected.bind=\\\"role.public\\\"></button> <label>Public</label> </mdc-form-field> <h4>Permissions</h4> <mdc-form-field class=\\\"mb-4 ml-3\\\"> <button mdc-switch selected.bind=\\\"showAdvancedEditor\\\"></button> <label>Show Advanced Editor</label> </mdc-form-field> <div if.bind=\\\"!showAdvancedEditor\\\"> <div class=\\\"overflow-auto\\\" if.bind=\\\"!adminChecked\\\"> <table> <thead> <th>Name</th> <th repeat.for=\\\"p of permissionType\\\">${p.type}</th> </thead> <tbody> <tr mdc-data-table-row repeat.for=\\\"list of permissionList\\\" if.bind=\\\"!list.app || role.scopes.includes('app')\\\"> <td> ${list.label} </td> <td repeat.for=\\\"type of permissionType\\\"> <mdc-checkbox disabled.bind=\\\"list.disabled[type.value]\\\" change.delegate=\\\"validateSelection()\\\" model.bind=\\\"type\\\" checked.bind=\\\"list.permission\\\"></mdc-checkbox> </td> </tr> </tbody> </table> </div> <hr/> <mdc-form-field> <mdc-checkbox change.delegate=\\\"validateSelection()\\\" checked.bind=\\\"adminChecked\\\"></mdc-checkbox> <label>Admin - enable full application permissions to this role</label> </mdc-form-field> </div> <mdc-json-field if.bind=\\\"showAdvancedEditor\\\" value.two-way=\\\"role.permissions\\\"></mdc-json-field> </form> </ux-dialog-body> <ux-dialog-footer> <button class=\\\"button--color--secondary float-left\\\" click.delegate=\\\"dialogController.close()\\\" type=\\\"submit\\\" mdc-button>Cancel</button> <button attach-focus class=\\\"button--raised--secondary\\\" click.delegate=\\\"saveRole(role)\\\" type=\\\"submit\\\" mdc-button raised> <mdc-icon>save</mdc-icon><span>Save Role</span> </button> </ux-dialog-footer> <div class=\\\"mdc-dialog__scrim\\\"></div> </ux-dialog> </template> \";\n// Exports\nmodule.exports = code;","import { ValidationController } from 'aurelia-validation';\nimport { DialogController } from 'aurelia-dialog';\nimport { LogManager, autoinject } from 'aurelia-framework';\nimport { ValidationControllerFactory } from 'aurelia-validation';\nimport { AlertService } from '../../../services/util/Alert';\nimport { ValidatedRole } from '../../../types/Roles';\nimport { DatafiProAPI } from '../../../services/api/DatafiProAPI';\n\nconst log = LogManager.getLogger('dfp:admin');\n\n@autoinject\nexport class AdminEditRole {\n\n    role: ValidatedRole;\n    controller: ValidationController;\n\n    scopes = [\n        'app',\n        'program',\n    ]\n\n    constructor(\n        private controllerFactory: ValidationControllerFactory,\n        private dialogController: DialogController,\n        private alerts: AlertService,\n        private api: DatafiProAPI,\n    ) {\n        this.role = new ValidatedRole({});\n        this.controller = this.controllerFactory.createForCurrentScope();\n    }\n\n    activate(role: ValidatedRole) {\n        this.role = new ValidatedRole(role);\n    }\n\n    saveRole(role: ValidatedRole) {\n        return this.controller.validate({\n            object: role,\n        }).then((result) => {\n            if (!result.valid) {\n                throw new Error('Form is not valid');\n            }\n            if (!role.id) {\n                return this.api.roles.create(role);\n            }\n            return this.api.roles.update(role.id, role);\n        }).then((role) => {\n            this.alerts.create({\n                label: 'Role saved',\n                dismissable: true,\n            });\n            this.role = new ValidatedRole({});\n            this.dialogController.ok(role);\n        }).catch((e) => {\n            log.error(e);\n            this.alerts.create({\n                label: e.message,\n                level: 'error',\n                dismissable: true,\n            });\n        });\n    }\n}\n","// Module\nvar code = \"<template> <ux-dialog> <ux-dialog-body> <form submit.trigger=\\\"saveRole(role)\\\"> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"role.role_name & validate\\\" type=\\\"text\\\" label=\\\"Role Name\\\" placeholder=\\\"pipeline_manager\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> </form> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"role.description & validate\\\" type=\\\"text\\\" label=\\\"Role Description\\\" placeholder=\\\"This role allows users to...\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <mdc-form-field repeat.for=\\\"scope of scopes\\\"> <mdc-checkbox checked.bind=\\\"role.scopes\\\" value.bind=\\\"scope\\\"></mdc-checkbox> <label>${scope | title}</label> </mdc-form-field> <button class=\\\"mt-8 button--raised--secondary float-right\\\" click.delegate=\\\"saveRole(role)\\\" type=\\\"submit\\\" mdc-button raised> <mdc-icon>save</mdc-icon><span>Save Role</span> </button> <button class=\\\"mt-8 button--color--secondary\\\" click.delegate=\\\"dialogController.close()\\\" type=\\\"submit\\\" mdc-button>Cancel</button>  </ux-dialog-body> </ux-dialog> </template> \";\n// Exports\nmodule.exports = code;","import { Paginated } from '@feathersjs/feathers';\nimport { ProgramUserRole, Role } from '@wsb_dev/datafi-shared/lib/types';\nimport { autoinject } from 'aurelia-dependency-injection';\nimport { bindable } from 'aurelia-templating';\nimport { DatafiProAPI } from 'services/api/DatafiProAPI';\nimport { AlertService } from 'services/util/Alert';\nimport { Program } from 'types/Program';\nimport { ValidatedRole } from 'types/Roles';\nimport { ValidatedUser } from 'types/Users';\n\nexport interface ProgramUser {\n    userRoleId?: number;\n    programTitle: string;\n    programId: number;\n    roleTitle?: string;\n    roleId: number;\n    organizationId?: number;\n    action: 'create' | 'update' | 'remove';\n}\n\n@autoinject\nexport class AdminEditUserPrograms {\n    @bindable user: ValidatedUser;\n    @bindable programUser: ProgramUser[];\n    programs: Program[];\n    roles: ValidatedRole[];\n    inputValue: string;\n\n    constructor(\n        private api: DatafiProAPI,\n        private alerts: AlertService,\n    ) {}\n\n    async attached(): Promise<void> {\n        this.roles = await this.api.roles.find({ $limit: 50, query: { scopes: ['program'] } })\n            .then((result: Paginated<Role>) => result.data);\n\n        await this.fetchAllPrograms().then((programs: Program[]) => {\n            this.programs = programs;\n        });\n\n        if (!this.user.id) return;\n\n        this.api.programUsersRoles.find({\n            query: {\n                user_id: this.user.id,\n                $limit: 50,\n            },\n        }).then((programUserRolesResult: Paginated<ProgramUserRole>) => {\n            if (programUserRolesResult?.data.length) {\n                return this.programUserList(programUserRolesResult.data);\n            }\n        });\n    }\n\n    async fetchAllPrograms(skip = 0, allPrograms = []): Promise<Program[]> {\n        const limit = 25;\n        const result = await this.api.programs.find({\n            query: {\n                $select: ['id', 'title'],\n                $eager: 'roles.role',\n                $limit: limit,\n                $skip: skip,\n            },\n        }) as Paginated<Program>;\n\n        allPrograms = allPrograms.concat(result.data);\n        if (skip + limit < result.total) {\n            return this.fetchAllPrograms(skip + limit, allPrograms);\n        }\n\n        return allPrograms;\n    }\n\n    programUserList(roles: ProgramUserRole[]): void {\n        roles.forEach((d) => {\n            if (d.user_id !== this.user.id) return;\n            const program = this.programs.find((p: Program) => p.id === d.program_id);\n            const programRole = program?.roles.find((r) => r.user_id === d.user_id);\n\n            if (programRole) {\n                this.programUser.push({\n                    userRoleId: d.id,\n                    programTitle: program.title,\n                    programId: program.id,\n                    roleTitle: programRole.role.role_name,\n                    roleId: programRole.role.id,\n                    organizationId: d?.organizationId,\n                    action: undefined,\n                });\n            }\n        });\n    }\n\n    addProgram(id: number): void {\n        const program = this.programs.find((p) => p.id === id);\n        if (!program) return;\n\n        const programUser = this.programUser.find((p) => p.programId === id) as ProgramUser;\n        if (programUser && programUser.action !== 'remove') {\n            this.alerts.create({\n                label: 'Program already assigned',\n                level: 'warning',\n                dismissable: true,\n            });\n        }\n\n        if (programUser?.userRoleId) {\n            const existingUser = this.programUser.find((user) => user.userRoleId === programUser.userRoleId);\n            existingUser.action = undefined;\n        } else {\n            this.programUser.push({\n                programTitle: program.title,\n                roleId: this.roles[0].id,\n                programId: program.id,\n                action: 'create',\n            });\n        }\n    }\n\n    removeProgram(programId: number, event?: number) {\n        if (event === 0) return;\n\n        this.programUser = this.programUser.map((p) => {\n            if (p.programId === programId) {\n                p.action = 'remove';\n            }\n            return p;\n        });\n    }\n\n    updateRole(roleId: number, programId: number) {\n        this.programUser.map((p) => {\n            if (p.programId === programId) {\n                const role = this.roles.find((r) => r.id === roleId);\n                if (role) {\n                    p.roleId = role.id;\n                    p.roleTitle = role.role_name;\n                    p.organizationId = this.user?.organizationId;\n                    p.action = p.action || 'update';\n                }\n            }\n        });\n    }\n\n    userChanged() {\n        this.inputValue = '';\n    }\n}\n","// Module\nvar code = \"<template> <p class=\\\"mt-10\\\">Program Managment</p> <div mdc-menu-surface-anchor> <mdc-text-field outlined label=\\\"Add user to a Program\\\" ref=\\\"programInput\\\" value.bind=\\\"inputValue\\\"> </mdc-text-field> <mdc-text-field-helper-line></mdc-text-field-helper-line> <mdc-lookup options.bind=\\\"programs\\\" display-field=\\\"title\\\" input.bind=\\\"programInput\\\" preload-options hoist-to-body change.delegate=\\\"addProgram($event.detail.value.id)\\\"> </mdc-lookup> </div> <mdc-data-table class=\\\"w-100 custom-table mt-3\\\"> <table> <thead> <th>Current Programs</th> <th>Role</th> <th></th> </thead> <tbody> <tr mdc-data-table-row repeat.for=\\\"p of programUser\\\" if.bind=\\\"p.action !== 'remove'\\\"> <td> <strong>${p.programTitle}</strong> </td> <td> <mdc-select naturalWidth fixed mdcselect:change.delegate=\\\"updateRole(p.roleId, p.programId)\\\" value.bind=\\\"p.roleId\\\" label=\\\"Role\\\"> <mdc-list> <mdc-list-item repeat.for=\\\"r of roles\\\" value.bind=\\\"r.id\\\">${r.role_name} </mdc-list-item> </mdc-list> </mdc-select> </td> <td> <button class=\\\"mdc-button\\\" click.delegate=\\\"removeProgram(p.programId, $event.detail)\\\">Remove</button> </td> </tr> </tbody> </table> </mdc-data-table> </template>\";\n// Exports\nmodule.exports = code;","import { ValidationController, ValidationControllerFactory } from 'aurelia-validation';\nimport { LogManager, autoinject, bindable } from 'aurelia-framework';\nimport { ValidatedUser } from '../../../types/Users';\nimport { ValidatedRole } from '../../../types/Roles';\nimport { DialogController } from 'aurelia-dialog';\nimport { AlertService } from '../../../services/util/Alert';\nimport { DatafiProAPI } from '../../../services/api/DatafiProAPI';\nimport { ValidatedOrganization } from '../../../types/Organizations';\nimport { ProgramUser } from '../admin-edit-user-programs/admin-edit-user-programs';\nimport { Paginated } from '@feathersjs/feathers';\nconst log = LogManager.getLogger('dfp:admin');\n\n@autoinject\nexport class AdminEditUser {\n    controller: ValidationController\n    user: ValidatedUser;\n    organizations: ValidatedOrganization[];\n    roles: ValidatedRole[];\n    globalRoleId: number;\n    @bindable programUser: ProgramUser[] = [];\n    @bindable loading = false;\n\n    constructor(\n        private controllerFactory: ValidationControllerFactory,\n        private dialogController: DialogController,\n        private alerts: AlertService,\n        private api: DatafiProAPI,\n    ) {\n        this.user = new ValidatedUser({}, this.api.files);\n        this.controller = this.controllerFactory.createForCurrentScope();\n    }\n\n    async activate(user: ValidatedUser): Promise<void> {\n        this.user = new ValidatedUser(user, this.api.files);\n        this.globalRoleId = user.roles.filter((role) => role.role.scopes.includes('app'))[0]?.role_id;\n\n        const orgs = await this.api.organizations.find({ query: { $limit: 50 } }) as Paginated<ValidatedOrganization>;\n        this.organizations = orgs.data.map((org) => new ValidatedOrganization(org));\n\n        const roles = await this.api.roles.find({ query: { scopes: { $contains: '[\"app\"]' }, $limit: 50 } }) as Paginated<ValidatedRole>;\n        this.roles = roles.data.map((role) => new ValidatedRole(role));\n    }\n\n    async saveUser(user: ValidatedUser, createNewUser?: boolean): Promise<void> {\n        return this.controller.validate({\n            object: user,\n        }).then(async (result) => {\n            if (!result.valid || !this.globalRoleId) {\n                throw new Error('Form is not valid');\n            }\n            this.loading = true;\n            const role = this.roles.find((role) => role.id === this.globalRoleId);\n            if (!user.id) {\n                return await this.createUser(user, role);\n            } else {\n                return await this.updateUser(user, role);\n            }\n        }).then(async (user: ValidatedUser) => {\n            if (this.programUser.length) {\n                await this.updateUserRoles(user);\n            }\n            this.alerts.create({\n                label: 'User saved',\n                dismissable: true,\n            });\n            if (!createNewUser) {\n                this.dialogController.ok(user);\n            } else {\n                this.loading = false;\n                this.user = new ValidatedUser({}, this.api.files);\n                this.globalRoleId = undefined;\n                this.programUser = [];\n            }\n        }).catch((e) => {\n            log.error(`[admin-edit-user]: Error saving ${user}: ${e.message}`);\n            this.alerts.create({\n                label: `Error saving user: ${e.message}`,\n                level: 'error',\n                dismissable: true,\n            });\n            this.loading = false;\n        });\n    }\n\n    updateOrganization(): void {\n        this.programUser.forEach((p) =>  {\n            p.organizationId = this.user.organizationId;\n            p.action = p.action || 'update';\n        });\n    }\n\n    private async createUser(user: ValidatedUser, role: ValidatedRole) {\n        const newUser = await this.api.users.create(user);\n        if (role) {\n            const newRole = await this.api.usersRoles.create({ user_id: newUser.id, role_id: this.globalRoleId });\n            newUser.roles = [{ ...newRole, role }];\n        }\n        return newUser;\n    }\n\n    private async updateUser(user: ValidatedUser, role: ValidatedRole) {\n        const existingUserRole = user.roles?.find((r) => r.role_id === this.globalRoleId);\n        if (existingUserRole) {\n            return this.api.users.patch(user?.id, user);\n        }\n\n        if (user.roles?.length) {\n            await Promise.all(user?.roles.map((role) => role?.id && this.api.usersRoles.remove(role.id)));\n        }\n\n        if (role) {\n            const newRole = await this.api.usersRoles.create({ user_id: user.id, role_id: this.globalRoleId });\n            const patchedUser = await this.api.users.patch(user.id, user);\n            patchedUser.roles = [{ ...newRole, role }];\n            return patchedUser;\n        }\n    }\n\n    private async updateUserRoles(user: ValidatedUser) {\n        let programOrgId: number;\n        const updateProgram = async (programId: number) => {\n            await this.api.programs.get(programId).then((result) => {\n                programOrgId = result.managementOrganizationId;\n                this.api.programs.patch(programId, result);\n            }).catch((e) => {\n                this.alerts.create({\n                    label: `Error saving user to program: ${e.message}`,\n                    level: 'error',\n                    dismissable: true,\n                });\n            });\n        };\n\n        return Promise.all(this.programUser.map(async (p) => {\n            if (p.action === 'remove') {\n                if (!p.userRoleId) return;\n                await updateProgram(p.programId);\n                return this.api.programUsersRoles.remove(p.userRoleId);\n            } else if (p.action === 'create') {\n                await updateProgram(p.programId);\n                return this.api.programUsersRoles.create({ user_id: this.user.id ? this.user.id : user.id, program_id: p.programId, role_id: p.roleId, organizationId: user?.organizationId, program_org_id: programOrgId });\n            } else if (p.action === 'update') {\n                await updateProgram(p.programId);\n                return this.api.programUsersRoles.patch(p.userRoleId, { role_id: p.roleId, organizationId: user?.organizationId  });\n            }\n        }));\n    }\n}\n","// Module\nvar code = \"<template> <require from=\\\"../admin-edit-user-programs/admin-edit-user-programs\\\"></require> <ux-dialog> <ux-dialog-header> <h3 class=\\\"align-header\\\">Edit User</h3> <button click.delegate=\\\"dialogController.cancel()\\\" class=\\\"button--color--secondary float-right\\\" icon=\\\"close\\\" mdc-icon-button></button> </ux-dialog-header> <ux-dialog-body> <div if.bind=\\\"loading\\\" class=\\\"dialog-loading-overlay\\\"> <mdc-circular-progress size=\\\"100\\\" stroke-width=\\\"10\\\"></mdc-circular-progress> </div> <form submit.trigger=\\\"saveUser(user)\\\"> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"user.fullname & validate\\\" type=\\\"text\\\" label=\\\"Name\\\" placeholder=\\\"John Smith\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"user.username & validate\\\" type=\\\"text\\\" label=\\\"Username\\\" placeholder=\\\"myusername\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"user.email & validate\\\" type=\\\"email\\\" label=\\\"Email\\\" placeholder=\\\"user@domain.com\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <mdc-text-field class=\\\"w-100\\\" value.bind=\\\"user.password & validate\\\" type=\\\"password\\\" label=\\\"Password\\\" placeholder=\\\"secret12345\\\"> </mdc-text-field> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <mdc-select class=\\\"w-100\\\" value.bind=\\\"globalRoleId\\\" fixed required label=\\\"Global Role\\\"> <mdc-list> <mdc-list-item value.bind=\\\"role.id\\\" repeat.for=\\\"role of roles\\\"> ${role.role_name}</mdc-list-item> </mdc-list> </mdc-select> <mdc-select class=\\\"w-100 mt-4\\\" required value.bind=\\\"user.organizationId & validate\\\" fixed label=\\\"Organization\\\" mdcselect:change.delegate=\\\"updateOrganization()\\\"> <mdc-list> <mdc-list-item value.bind=\\\"org.id\\\" repeat.for=\\\"org of organizations\\\"> ${org.name}</mdc-list-item> </mdc-list> </mdc-select> <mdc-text-field-helper-line> <mdc-text-field-helper-text validation>Required</mdc-text-field-helper-text> </mdc-text-field-helper-line> <mdc-form-field> <mdc-checkbox checked.bind=\\\"user.licenseExempt\\\"></mdc-checkbox> <label>License exempt</label> </mdc-form-field> <admin-edit-user-programs user.bind=\\\"user\\\" program-user.bind=\\\"programUser\\\"></admin-edit-user-programs> </form> </ux-dialog-body> <ux-dialog-footer> <button class=\\\"float-left button--color--secondary\\\" click.delegate=\\\"dialogController.close()\\\" type=\\\"submit\\\" mdc-button>Cancel</button> <button class=\\\"button--color--secondary\\\" click.delegate=\\\"saveUser(user, true)\\\" type=\\\"submit\\\" mdc-button> <mdc-icon>save</mdc-icon> <span>Save and New</span> </button> <button attach-focus class=\\\"button--raised--secondary\\\" disabled.bind=\\\"pending\\\" click.delegate=\\\"saveUser(user)\\\" type=\\\"submit\\\" mdc-button raised class=\\\"demo-button-primary\\\"> <mdc-icon>save</mdc-icon> <span>Save User</span> </button> </ux-dialog-footer> <div class=\\\"mdc-dialog__scrim\\\"></div> </ux-dialog> </template> \";\n// Exports\nmodule.exports = code;","import { Paginated } from '@feathersjs/feathers';\nimport { APIFile } from '@wsb_dev/datafi-shared/lib/types/File';\nimport { bindable, LogManager, autoinject } from 'aurelia-framework';\nimport { DatafiProAPI } from 'services/api/DatafiProAPI';\nimport { AlertService } from 'services/util/Alert';\nimport { BrowserStorage } from 'services/util/BrowserStorage';\nimport { ActionService } from '../../../services/actions/ActionService';\nimport { SaveFileActionData } from '@wsb_dev/datafi-shared/lib/types/ActionTaskTypes';\nconst log = LogManager.getLogger('dfp:admin:files');\n@autoinject\n\nexport class AdminFiles {\n    selectedFiles: APIFile[];\n    cacheKey = 'admin';\n    folderPaths = ['templates', 'templates/datafi-classic', 'houston-cnp-811'];\n\n    @bindable selectedFolderPath: string;\n    @bindable total: number;\n    @bindable pageNumber = 1;\n    @bindable perPage = 10;\n    searchString: string;\n\n    constructor(\n        private api: DatafiProAPI,\n        private alerts: AlertService,\n        private storage: BrowserStorage,\n        private actionService: ActionService,\n    ) { }\n\n    async attached(): Promise<void> {\n        await this.storage.get(this.cacheKey)\n            .catch((e) => {\n                log.debug(e);\n                return {\n                    id: this.cacheKey,\n                    data: {},\n                };\n            })\n            .then((item) => {\n                if (item.data?.folderPaths?.length) {\n                    item.data.folderPaths.forEach((path) => {\n                        if (!this.folderPaths.includes(path)) {\n                            this.folderPaths.push(path);\n                        }\n                    });\n                }\n                this.selectedFolderPath = item.data?.selectedFolderPath || 'templates';\n            });\n    }\n\n    addFolder(folder: string): void {\n        if (!folder) {\n            return;\n        }\n        this.folderPaths.push(folder);\n        this.folderPaths = Array.from(new Set(this.folderPaths));\n        this.selectedFolderPath = folder;\n    }\n\n    async deleteFile(file: APIFile): Promise<void> {\n        this.api.files.remove(file.id).then(() => {\n            this.alerts.create({\n                label: `File ${file.name} deleted`,\n                level: 'success',\n                dismissable: true,\n            });\n            this.selectedFiles = this.selectedFiles.filter((f) => f.id !== file.id);\n        },\n        ).catch((e) => {\n            log.error(e);\n            this.alerts.create({\n                label: `Error deleting file ${file.name}`,\n                level: 'error',\n                dismissable: true,\n            });\n        });\n    }\n\n    downloadFile(file: APIFile): void {\n        this.actionService.create({\n            id: 'SaveFile',\n            target: [{ id: file.id }],\n            loadingMessage: `Downloading ${file.name}`,\n            errorMessage: `Error downloading ${file.name}`,\n            showError: true,\n            name: file.name,\n        } as SaveFileActionData);\n    }\n\n    folderPathsChanged(): void {\n        this.updateCache();\n        this.updateFiles();\n    }\n\n    getFileName = (f: File): string => {\n        return `${this.selectedFolderPath}/${f.name}`;\n    }\n\n    pageNumberChanged(): void {\n        this.updateFiles();\n    }\n\n    perPageChanged(): void {\n        this.updateFiles();\n    }\n\n    selectedFolderPathChanged(): void {\n        this.updateCache();\n\n        if (!this.selectedFolderPath) {\n            return;\n        }\n        this.updateFiles();\n    }\n\n    updateCache(): void{\n        this.storage.create({\n            id: this.cacheKey,\n            data: {\n                folderPaths: this.folderPaths,\n                selectedFolderPath: this.selectedFolderPath,\n            },\n        });\n    }\n\n    async updateFiles(): Promise<void> {\n        const query = {\n            $path: `${this.selectedFolderPath}/`,\n            $paginate: true,\n            $skip: (this.pageNumber - 1) * this.perPage,\n            $limit: this.perPage,\n            ...this.searchString ? { $search: this.searchString } : {},\n        };\n        await this.api.files.find({query: query}).then((result: Paginated<APIFile[]>) => {\n            this.total = result.total;\n            this.selectedFiles = result.data;\n        });\n    }\n}\n","// Module\nvar code = \"<template> <require from=\\\"components/mdc-upload-field/mdc-upload-field\\\"></require> <require from=\\\"../../../components/mdc-pagination/mdc-pagination\\\"></require> <div class=\\\"columns\\\"> <div class=\\\"column col-4\\\"> <div class=\\\"mw-400 mx-auto\\\"> <div class=\\\"d-flex align-center mb-10\\\"> <mdc-text-field label=\\\"Create a new folder in AWS S3\\\" value.bind=\\\"tempFolder\\\" class=\\\"flex-grow-1\\\"></mdc-text-field> <button mdc-icon-button class=\\\"ml-3\\\" click.delegate=\\\"addFolder(tempFolder)\\\" icon=\\\"add\\\"></button> </div> <div class=\\\"d-flex mb-10\\\"> <mdc-select class=\\\"w-100\\\" label=\\\"Choose a folder\\\" value.two-way=\\\"selectedFolderPath\\\"> <mdc-list> <mdc-list-item></mdc-list-item> <mdc-list-item repeat.for=\\\"i of folderPaths\\\" value.bind=\\\"i\\\">${i}</mdc-list-item> </mdc-list> </mdc-select> </div> <mdc-upload-field get-file-name.bind=\\\"getFileName\\\" created.delegate=\\\"updateFiles()\\\" removed.delegate=\\\"updateFiles()\\\"></mdc-upload-field> </div> </div> <div class=\\\"column col-8\\\"> <h3 class=\\\"mt-4\\\">Folder content for: ${selectedFolderPath}</h3> <mdc-text-field outlined class=\\\"mw-xs mb-7\\\" value.bind=\\\"searchString\\\" type=\\\"text\\\" label=\\\"Search for a file\\\" input.delegate=\\\"updateFiles() & debounce\\\"> </mdc-text-field> <mdc-data-table class=\\\"admin\\\"> <table> <thead> <th></th> <th>Name</th> <th>Size (MB)</th> <th>Modified date</th> <th></th> </thead> <tbody> <tr mdc-data-table-row repeat.for=\\\"file of selectedFiles\\\"> <td> <button mdc-icon-button class=\\\"button--color--secondary mr-2\\\" click.trigger=\\\"downloadFile(file)\\\" icon=\\\"download\\\"> </button>  </td> <td>${file.name}</td> <td>${file.size}</td> <td>${file.modifiedDate | date}</td> <td> <button class=\\\"button--color--danger\\\" mdc-icon-button icon=\\\"delete\\\" click.delegate=\\\"deleteFile(file)\\\"> </button> </td> </tr> </tbody> </table> </mdc-data-table> <mdc-pagination per-page-options.bind=\\\"[10,25,50,100]\\\" per-page.from-view=\\\"perPage\\\" page.two-way=\\\"pageNumber\\\" total.bind=\\\"total\\\"> </mdc-pagination> </div> </div> </template>\";\n// Exports\nmodule.exports = code;","// Module\nvar code = \"<template> <require from=\\\"components/admin/admin-table\\\"></require> <require from=\\\"components/admin/admin-generate-token/admin-generate-token\\\"></require> <require from=\\\"../admin/admin-files/admin-files\\\"></require> <require from=\\\"../admin/admin-arcgis-sources/admin-arcgis-sources\\\"></require> <div class=\\\"h-100 d-flex flex-column\\\"> <ul class=\\\"breadcrumb mdc-typography--subtitle1 mx-4 p-4\\\"> <li> <a route-href=\\\"route: admin\\\"> <span class=\\\"breadcrumb__inner\\\"> <span class=\\\"breadcrumb__title\\\">Home</span> <span>Admin</span> </span> </a> </li> <li if.bind=\\\"activePage\\\"> <a route-href=\\\"route: admin; params.bind: {page: activePage}\\\"> <span class=\\\"breadcrumb__inner\\\"> <span class=\\\"breadcrumb__title\\\">Page</span> <span style=\\\"text-transform:capitalize\\\">${activePage}</span> </span> </a> </li> </ul> <div class=\\\"px-4 pb-8 flex-grow-1\\\"> <mdc-layout-grid class=\\\"px-4 py-0\\\" if.bind=\\\"!activePage\\\"> <mdc-layout-grid-inner> <mdc-layout-grid-cell repeat.for=\\\"link of pageLinks\\\" span=\\\"4\\\"> <mdc-card outlined> <mdc-card-primary-action click.delegate=\\\"router.navigateToRoute('admin', {page: link.path})\\\"> <div class=\\\"card__container\\\"> <div class=\\\"mdc-card__media\\\"> <mdc-icon class=\\\"card__image icon-lg mt-4 ml-8 icon-gray\\\">${link.icon}</mdc-icon> </div> <div class=\\\"card__info pl-0 mr-3\\\"> <div class=\\\"card__primary\\\"> <h2 class=\\\"card__title m-0\\\" mdc-headline6>${link.label}</h2>  </div> <div class=\\\"card__secondary\\\" mdc-body2> ${link.desc} </div> </div> </div> </mdc-card-primary-action> </mdc-card> </mdc-layout-grid-cell> </mdc-layout-grid-inner> </mdc-layout-grid> <div if.bind=\\\"activePage === 'users'\\\" class=\\\"mx-4 h-100 d-flex flex-column\\\"> <mdc-text-field class=\\\"mb-2 w-50\\\" value.bind=\\\"userSearch\\\" type=\\\"text\\\" label=\\\"Search for a user\\\" input.delegate=\\\"searchUsers()\\\"> </mdc-text-field> <div class=\\\"flex-grow-1 h-100 p-relative\\\"> <div class=\\\"absolute-cover\\\"> <admin-table title=\\\"Users\\\" can-edit.bind=\\\"true\\\" can-delete.bind=\\\"true\\\" can-create.bind=\\\"true\\\" row-type.bind=\\\"User\\\" actions.bind=\\\"actions\\\" params.bind=\\\"params\\\" service.bind=\\\"api.users\\\" dialog-view-model.bind=\\\"UserEditViewModel\\\" title=\\\"User\\\" class=\\\"d-block h-100\\\"> <template replace-part=\\\"table\\\"> <mdc-data-table pagination page-sizes.bind=\\\"[10,25,50]\\\" page-size.two-way=\\\"perPage\\\" records-count.bind=\\\"total\\\" active-page.bind=\\\"page\\\" class=\\\"admin h-100\\\" busy.bind=\\\"busy\\\" mdcdatatable:navigation.trigger=\\\"handleNavigation($event.detail.type)\\\" sticky-header> <mdc-menu anchor-margin.bind=\\\"{top: 50, left: 60}\\\" view-model.ref=\\\"allMenu\\\" anchor.bind=\\\"hierarchicalAnchor\\\" hoistToBody> <mdc-list class=\\\"p-0\\\"> <mdc-list-item click.delegate=\\\"clearSelected()\\\"> <span class=\\\"mdc-list-item__text d-inline-flex\\\"> <mdc-icon class=\\\"mr-1\\\">clear_all</mdc-icon>Clear Selected </span> </mdc-list-item> <mdc-list-item repeat.for=\\\"action of actions\\\" disabled.bind=\\\"action.__pending\\\" click.delegate=\\\"handleAction(action)\\\"> <span class=\\\"mdc-list-item__text d-inline-flex\\\"> <mdc-icon class=\\\"mr-1\\\">${action.icon}</mdc-icon>${action.label} </span> <mdc-linear-progress if.bind=\\\"action.__pending\\\" open.bind=\\\"true\\\"> </mdc-linear-progress> </mdc-list-item> <mdc-list-item class=\\\"list-item--color--danger\\\" if.bind=\\\"canDelete && selectedRows.length\\\" click.delegate=\\\"delete(selectedRows)\\\"> <span class=\\\"mdc-list-item__text d-inline-flex\\\"> <mdc-icon class=\\\"mr-1\\\">delete</mdc-icon>Delete Selected </span> </mdc-list-item> <mdc-list-item class=\\\"list-item--color--success\\\" if.bind=\\\"canCreate\\\" click.delegate=\\\"create()\\\"> <span class=\\\"mdc-list-item__text d-inline-flex\\\"> <mdc-icon class=\\\"mr-1\\\">add</mdc-icon>Create ${title} </span> </mdc-list-item> </mdc-list>  </mdc-menu> <table> <thead> <th> <mdc-checkbox checked.one-way=\\\"isAllSelected(rows, selectedRows)\\\" change.delegate=\\\"selectAll()\\\"></mdc-checkbox> <div if.bind=\\\"actions.length\\\" class=\\\"d-inline\\\"> <button mdc-button click.trigger=\\\"allMenu.open = !allMenu.open\\\" ref=\\\"hierarchicalAnchor\\\"> Actions <mdc-icon>arrow_drop_down</mdc-icon> </button> </div> </th> <th>ID</th> <th>Name <button class=\\\"mdc-icon-button material-icons mdc-data-table__sort-icon-button\\\" click.delegate=\\\"handleSort('fullname', $event)\\\" aria-label=\\\"Sort by fullname\\\"> <mdc-icon if.bind=\\\"sort.fullname === 1\\\">arrow_downward</mdc-icon> <mdc-icon else>arrow_upward</mdc-icon> </button> </th> <th>Username <button class=\\\"mdc-icon-button material-icons mdc-data-table__sort-icon-button\\\" click.delegate=\\\"handleSort('username', $event)\\\" aria-label=\\\"Sort by username\\\"> <mdc-icon if.bind=\\\"sort.username === 1\\\">arrow_downward</mdc-icon> <mdc-icon else>arrow_upward</mdc-icon> </button> </th> <th>Email <button class=\\\"mdc-icon-button material-icons mdc-data-table__sort-icon-button\\\" click.delegate=\\\"handleSort('email', $event)\\\" aria-label=\\\"Sort by email\\\"> <mdc-icon if.bind=\\\"sort.email === 1\\\">arrow_downward</mdc-icon> <mdc-icon else>arrow_upward</mdc-icon> </button> </th> <th>Global Application Role</th> <th>Organization</th> </thead> <tbody> <tr mdc-data-table-row repeat.for=\\\"row of rows\\\"> <td> <mdc-checkbox change.delegate=\\\"toggle(row)\\\" checked.bind=\\\"row.__checked\\\"> </mdc-checkbox> <button click.delegate=\\\"edit(row)\\\" mdc-icon-button icon=\\\"edit\\\"></button> </td> <td>${row.id}</td> <td>${row.fullname}</td> <td>${row.username}</td> <td>${row.email}</td> <td> <mdc-select value.to-view=\\\"row.roles[0].role.role_name\\\" change.delegate=\\\"updateUserRole(row, $event.target.value)\\\" fixed outlined> <mdc-list> <mdc-list-item value=\\\"\\\">None</mdc-list-item> <mdc-list-item value.bind=\\\"a.role_name\\\" repeat.for=\\\"a of roles\\\"> ${a.role_name | title}</mdc-list-item> </mdc-list> </mdc-select> </td> <td> <mdc-select value.to-view=\\\"row.organizationId\\\" change.delegate=\\\"updateUserOrganization(row, $event.target.value)\\\" fixed outlined> <mdc-list> <mdc-list-item value.bind=\\\"org.id\\\" repeat.for=\\\"org of organizations\\\"> ${org.name}</mdc-list-item> </mdc-list> </mdc-select> </td> </tr> </tbody> </table> </mdc-data-table> </template> </admin-table> </div> </div> </div> <div if.bind=\\\"activePage === 'roles'\\\" class=\\\"mx-4 h-100 d-flex\\\"> <div class=\\\"flex-grow-1 p-relative mb-10\\\"> <div class=\\\"absolute-cover\\\"> <admin-table row-type.bind=\\\"Role\\\" can-edit=\\\"true\\\" can-delete=\\\"true\\\" can-create=\\\"true\\\" service.bind=\\\"api.roles\\\" dialog-view-model.bind=\\\"PermissionEditViewModel\\\" title=\\\"Role\\\" class=\\\"d-block h-100\\\"> <template replace-part=\\\"table\\\"> <mdc-data-table pagination page-sizes.bind=\\\"[10,25,50]\\\" page-size.two-way=\\\"perPage\\\" records-count.bind=\\\"total\\\" active-page.bind=\\\"page\\\" class=\\\"admin h-100\\\" busy.bind=\\\"busy\\\" mdcdatatable:navigation.trigger=\\\"handleNavigation($event.detail.type)\\\" sticky-header> <table> <thead> <th> <mdc-checkbox></mdc-checkbox> </th> <th>Edit</th> <th>Name</th> <th>Scopes</th> <th>Public</th> <th>Description</th> </thead> <tbody> <tr mdc-data-table-row repeat.for=\\\"row of rows\\\"> <td> <mdc-checkbox change.delegate=\\\"toggle(row)\\\" checked.bind=\\\"row.__checked\\\"> </mdc-checkbox> </td> <td> <button click.delegate=\\\"edit(row)\\\" mdc-icon-button icon=\\\"edit\\\"></button> </td> <td>${row.role_name}</td> <td> <div class=\\\"mdc-chip\\\" role=\\\"row\\\" repeat.for=\\\"scope of row.scopes\\\"> <div class=\\\"mdc-chip__ripple\\\"></div> <span role=\\\"gridcell\\\"> <span role=\\\"button\\\" tabindex=\\\"0\\\" class=\\\"mdc-chip__primary-action\\\"> <span class=\\\"mdc-chip__text\\\">${scope | title}</span> </span> </span> </div> </td> <td> <mdc-form-field> <button mdc-switch selected.bind=\\\"row.public\\\" if.bind=\\\"!('*' in row.permissions)\\\" change.delegate=\\\"toggleRolePublic(row)\\\"></button> </mdc-form-field> </td> <td>${row.description}</td> </tr> </tbody> </table> </mdc-data-table> </template> </admin-table> </div> </div> </div> <div if.bind=\\\"activePage === 'files'\\\" class=\\\"mx-4\\\"> <admin-files></admin-files> </div> <div if.bind=\\\"activePage === 'arcgis-sources'\\\" class=\\\"mx-4\\\"> <admin-arcgis-sources></admin-arcgis-sources> </div> <div if.bind=\\\"activePage === 'tokens'\\\" accordion=\\\"admin\\\" class=\\\"mx-4\\\"> <div class=\\\"divider\\\"></div> <h5>Generate an API Token</h5> <admin-generate-token></admin-generate-token> <div class=\\\"divider\\\"></div> <admin-table service.bind=\\\"api.tokens\\\" title=\\\"Token\\\" can-delete=\\\"true\\\" params.bind=\\\"{$eager: 'user'}\\\" fields.bind=\\\"tokenFields\\\"></admin-table> </div> <div if.bind=\\\"activePage === 'jobs'\\\" class=\\\"mx-4\\\"> <admin-table service.bind=\\\"api.jobs\\\" fields.bind=\\\"jobsFields\\\" sort.bind=\\\"{createdAt: -1}\\\"></admin-table> </div> <div if.bind=\\\"activePage === 'organizations'\\\" class=\\\"mx-4 h-100 d-flex\\\"> <div class=\\\"flex-grow-1 p-relative mb-10\\\"> <div class=\\\"absolute-cover\\\"> <admin-table service.bind=\\\"api.organizations\\\" row-type.bind=\\\"Organization\\\" fields.bind=\\\"organizationFields\\\" dialog-view-model.bind=\\\"OrganizationEditViewModel\\\" title=\\\"Organization\\\" can-edit=\\\"true\\\" can-delete=\\\"true\\\" can-create=\\\"true\\\" sort.bind=\\\"{ id: 1 }\\\" class=\\\"d-block h-100\\\" selected-rows.two-way=\\\"selectedRows\\\" params.two-way=\\\"orgParams\\\" rows.two-way=\\\"organizations\\\"> <template replace-part=\\\"actions\\\"> <button mdc-button raised type=\\\"button\\\" class=\\\"mb-3\\\" click.delegate=\\\"create()\\\"> <mdc-icon>add</mdc-icon> New ${title} </button> <button class=\\\"button--color--danger mb-3 ml-3\\\" mdc-button raised type=\\\"button\\\" if.bind=\\\"selectedRows.length\\\" click.delegate=\\\"deleteDialog(selectedRows)\\\"> <mdc-icon>delete</mdc-icon> Delete Selected </button> </template> <template replace-part=\\\"table\\\"> <mdc-data-table pagination page-sizes.bind=\\\"[10,25,50]\\\" page-size.two-way=\\\"perPage\\\" records-count.bind=\\\"total\\\" active-page.bind=\\\"page\\\" class=\\\"admin h-100\\\" busy.bind=\\\"busy\\\" mdcdatatable:navigation.trigger=\\\"handleNavigation($event.detail.type)\\\" sticky-header> <table> <thead> <th> <mdc-checkbox if.bind=\\\"row.id !== 0\\\" checked.one-way=\\\"isAllSelected(rows, selectedRows)\\\" change.delegate=\\\"selectAll()\\\"></mdc-checkbox> </th> <th>Edit</th> <th>Id</th> <th>Name</th> <th>Partners</th> <th>License Limit</th> </thead> <tbody> <tr mdc-data-table-row repeat.for=\\\"row of rows\\\"> <td> <mdc-checkbox disabled.bind=\\\"row.id === 0\\\" change.delegate=\\\"toggle(row)\\\" checked.bind=\\\"row.__checked\\\"> </mdc-checkbox> </td> <td> <button click.delegate=\\\"edit(row)\\\" mdc-icon-button icon=\\\"edit\\\"></button> </td> <td>${row.id}</td> <td>${row.name}</td> <td>${getOrgDisplay(row.partner_orgs)}</td> <td>${row.license_limit}</td> </tr> </tbody> </table> </mdc-data-table> </template> </admin-table> </div> </div> </div> </div> </div> </template> \";\n// Exports\nmodule.exports = code;"],"sourceRoot":""}