Friday, September 20, 2024 2:51:24 AM
> settings

Customize


Authenticate

> index.js
import Vue from 'vue/dist/vue.esm.js';
import _ from "lodash";
import {
    getData,
    COLORS
} from "../utilities";
import AjaxMethods from "./methods/ajax";
import * as UIkit from "uikit";

// This is binding to a class name, so elem is actually a DOM object
export default function (elem) {
    let data = getData(elem, [
        // Server data
        "community", "channels", "users",

        // Player data
        "user", "communities",

        // Shared data
        "servers", "types", "pendingRequests", "typePresets"
    ]);

    const app = new Vue({
        el: elem,
        mixins: [AjaxMethods],
        data: {
            // Server data
            community: data.community,
            channels: data.channels,
            users: data.users,

            // Player data
            user: data.user,
            communities: data.communities,

            // Shared data
            servers: data.servers,
            types: data.types,
            typePresets: data.typePresets,
            pendingRequests: data.pendingRequests,
            pendingRequestsInputDisabled: false,
            newRouteCommunity: undefined,
            newRouteChannel: undefined,
            newRouteServers: [],
            newRouteUsers: [],
            newRouteTypes: [],
            newRouteServerRadio: "any",
            newRouteTypesRadio: "any",
            newRouteInputDisabled: false,
            editRouteCommunity: undefined,
            editRouteChannel: undefined,
            editRouteSelectedServer: undefined
        },
        mounted: function () {
            let colors = _.values(COLORS);
            for (let request of this.pendingRequests) {
                Vue.set(request, "color", _.sample(colors));
            }

            UIkit.util.on("#create-new-route-modal", "beforeshow", () => {
                this.resetNewRouteVars();
            });
        },
        computed: {
            createRequestButtonEnabled: function () {
                return !this.newRouteInputDisabled && this.newRouteChannel && (this.newRouteCommunity || this.newRouteUsers);
            },
            availableRouteData: function () {
                let routes = [];

                if (this.currentContext === this.community) {
                    if (!this.editRouteChannel) return [];

                    routes = this.editRouteChannel.routes;
                } else {
                    if (!this.editRouteCommunity) return [];

                    routes = _.flatMap(this.editRouteCommunity.channels, function (category) {
                        return _.flatMap(category.channels, (channel) => channel.routes);
                    });
                }

                // A route is considered editable if it has available types to edit
                return _.filter(routes, (route) => !_.isEmpty(this.availableServers(route)));
            }
        },
        methods: {
            availableServers: function (route) {
                let servers = _.filter(route.servers, (server) => {
                    return _.isUndefined(server.deleted) && !_.isEmpty(this.availableTypes(server));
                });

                return _.sortBy(servers, ["name"]);
            },
            availableTypes: function (server) {
                return _.filter(server.types, (type) => {
                    return _.isUndefined(type.deleted);
                });
            },
            requestSelectAllCheckbox: function (request) {
                return this.$refs[`request-${request.user.id}-${request.server.id}-${request.channel.id}-select-all`][0];
            },
            toggleRequestType: function (request, type, event) {
                let checked = event.target.checked;

                if (_.isUndefined(type)) {
                    _.each(request.types, (type) => { Vue.set(type, "selected", checked) });
                } else {
                    Vue.set(type, "selected", checked);

                    let allTypesSize = request.types.length;
                    let selectedTypesSize = _.filter(request.types, "selected").length;
                    let selectAllCheckbox = this.requestSelectAllCheckbox(request);

                    selectAllCheckbox.checked = (selectedTypesSize === allTypesSize);
                    selectAllCheckbox.indeterminate = (selectedTypesSize > 0 && selectedTypesSize < allTypesSize);
                }
            },
            resetNewRouteVars: function () {
                this.newRouteCommunity = this.editRouteCommunity || undefined;
                this.newRouteChannel = this.editRouteChannel || undefined;
                this.newRouteServers = [];
                this.newRouteUsers = [];
                this.newRouteTypes = [];
                this.newRouteServerRadio = "any";
                this.newRouteTypesRadio = "any";
            },
            typeTooltip: function (tooltipName, type, route_data) {
                let tooltips = {
                    enable: [
                        `${route_data.user.name} has not accepted this request yet. ESM will send a message to <span class="esm-text-color-toast-blue">#${route_data.channel.name}</span> if they accept it`,
                        `Click to permanently stop routing ${type.name} notifications to this channel`
                    ],
                    delete: [
                        `Click to delete pending request`,
                        `Click to permanently stop routing ${type.name} notifications to this channel`
                    ]
                };

                return tooltips[tooltipName][type.editable ? 1 : 0];
            },
            updateAvailableRoutes: function (typeIds, action) {
                let vueInstance = this;

                let servers = _.flatMap(this.availableRouteData, "servers");

                // Cache the servers up front so this code can support one or many acceptances, and doesn't require looping over every server for each ID
                let serverIndexByTypeId = {};
                _.each(servers, (server, index) => {
                    _.each(server.types, (type) => {
                        serverIndexByTypeId[type.id] = index;
                    });
                });

                // Update the types that were accepted/declined
                _.each(typeIds, function (typeId) {
                    let server = servers[serverIndexByTypeId[typeId]];
                    if (server == null) return;

                    let type = _.find(server.types, ["id", typeId]);
                    if (_.isUndefined(type)) return;

                    if (action === "decline") {
                        return _.pull(server.types, type);
                    }

                    if (vueInstance.currentContext == vueInstance.community) {
                        Vue.set(type, "community_accepted", true);
                    } else {
                        Vue.set(type, "user_accepted", true);
                    }

                    if (type.user_accepted && type.community_accepted) {
                        Vue.set(type, "enabled", true);
                        Vue.set(type, "editable", true);
                    }
                });
            }
        }
    });
}
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8