Friday, September 20, 2024 4:31:02 AM
> settings

Customize


Authenticate

> ajax.js
import axios from 'axios';
import Vue from 'vue/dist/vue.esm.js';

export default {
    computed: {
        currentContext: function () {
            return this.community || this.user;
        },
        urlPrefix: function () {
            return (this.currentContext == this.community) ? "communities" : "users";
        }
    },
    methods: {
        ajaxCreateRequest: function () {
            let servers = this.newRouteServerRadio;
            if (this.newRouteServerRadio === "custom") {
                servers = this.newRouteServers.map(server => server.id);
            }

            let types = this.newRouteTypesRadio;
            if (this.newRouteTypesRadio === "custom") {
                types = this.newRouteTypes.map(type => type.id);
            }

            let data = {
                channel_id: this.newRouteChannel.id,
                server_ids: servers,
                types: types
            };

            if (this.currentContext === this.community) {
                data.user_ids = this.newRouteUsers.map(user => user.id);
            } else {
                data.community_id = this.newRouteCommunity.id;
            }

            this.newRouteInputDisabled = true;
            axios.post(
                `/${this.urlPrefix}/${this.currentContext.public_id}/notification_routing`,
                data
            ).then((res) => {
                UIkit.modal($("#create-new-route-modal")).hide();

                Vue.set(this.newRouteChannel, "routes", res.data.routes);
                this.resetNewRouteVars();

                Toaster.success(res.data.message);
            }).catch((error) => {
                Toaster.error(DEFAULT_ERROR);
                console.log(error.toJSON());
            }).finally(() => {
                this.newRouteInputDisabled = false;
            });
        },
        ajaxUpdateRequest: function (request, action) {
            this.pendingRequestsInputDisabled = true;
            let typeIds = _.map(_.filter(request.types, "selected"), "id");

            axios.patch(
                // action: accept, decline
                `/${this.urlPrefix}/${this.currentContext.public_id}/notification_routing/${action}_requests`,
                { ids: typeIds }
            ).then((res) => {
                // Remove the request
                if (typeIds.length === request.types.length) {
                    Vue.delete(this.pendingRequests, _.indexOf(this.pendingRequests, request));
                } else {
                    typeIds.forEach((id) => {
                        Vue.delete(request.types, _.findIndex(request.types, { id: id }));
                    });
                }

                // The selected types will be removed but the select all will still show partially checked
                this.requestSelectAllCheckbox(request).indeterminate = false;
                this.updateAvailableRoutes(typeIds, action);

                Toaster.success(res.data.message);
            }).catch((error) => {
                Toaster.error(DEFAULT_ERROR);
                console.log(error);
            }).finally(() => {
                this.pendingRequestsInputDisabled = false;
            });
        },
        ajaxUpdateAllRequests: function (action) {
            if (!confirm(`Are you sure you want to ${action} all pending requests?`)) return;

            this.pendingRequestsInputDisabled = true;

            axios.put(
                // action: accept, decline
                `/${this.urlPrefix}/${this.currentContext.public_id}/notification_routing/${action}_all_requests`
            ).then((res) => {
                let typeIds = _.flatMap(this.pendingRequests, (request) => {
                    return _.map(request.types, (type) => type.id);
                });

                this.updateAvailableRoutes(typeIds, action);

                this.pendingRequests = [];
                Toaster.success(res.data.message);
            }).catch((error) => {
                Toaster.error(DEFAULT_ERROR);
                console.log(error);
            }).finally(() => {
                this.pendingRequestsInputDisabled = false;
            });
        },
        ajaxUpdateRouteType: function (type) {
            axios.patch(
                `/${this.urlPrefix}/${this.currentContext.public_id}/notification_routing/${type.id}`,
                { enabled: !type.enabled }
            ).then((res) => {
                Toaster.success(res.data.message);
            }).catch((error) => {
                Toaster.error(DEFAULT_ERROR);
                console.log(error);
            });
        },
        ajaxDeleteRoute: function (route, type) {
            if (!confirm(`Are you sure you want to stop routing ${type.name} notifications?`)) return;

            Vue.set(type, "deleted", true);

            axios.delete(
                `/${this.urlPrefix}/${this.currentContext.public_id}/notification_routing/${type.id}`
            ).then((res) => {
                _.pull(this.editRouteSelectedServer.types, type);

                // Remove the server if it's empty
                if (_.isEmpty(this.availableTypes(this.editRouteSelectedServer))) {
                    _.pull(route.servers, this.editRouteSelectedServer);
                }

                Toaster.success(res.data.message);
            }).catch((error) => {
                Toaster.error(DEFAULT_ERROR);
                console.log(error);
                Vue.delete(type, "deleted");
            });
        },
        ajaxDeleteAllTypes: function (route) {
            if (!confirm(`Are you sure you want to stop routing all of ${route.user.name}'s notifications from ${this.editRouteSelectedServer.name}?`)) return;

            Vue.set(this.editRouteSelectedServer, "deleted", true);

            axios.delete(
                `/${this.urlPrefix}/${this.currentContext.public_id}/notification_routing/destroy_many`,
                {
                    data: {
                        ids: _.map(this.editRouteSelectedServer.types, "id")
                    }
                }
            ).then((res) => {
                // Remove the server
                _.pull(route.servers, this.editRouteSelectedServer);

                Toaster.success(res.data.message);
            }).catch((error) => {
                Toaster.error(DEFAULT_ERROR);
                console.log(error);
                Vue.delete(this.editRouteSelectedServer, "deleted");
            });
        }
    }
}
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8