Added add dialog #410
This commit is contained in:
parent
a3ebd07093
commit
74dba4b981
@ -4,13 +4,14 @@ from typing import Optional
|
|||||||
import discord
|
import discord
|
||||||
from cpl_core.database import TableABC
|
from cpl_core.database import TableABC
|
||||||
|
|
||||||
|
from bot_data.model.scheduled_event_interval_enum import ScheduledEventIntervalEnum
|
||||||
from bot_data.model.server import Server
|
from bot_data.model.server import Server
|
||||||
|
|
||||||
|
|
||||||
class ScheduledEvent(TableABC):
|
class ScheduledEvent(TableABC):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
interval: str,
|
interval: ScheduledEventIntervalEnum,
|
||||||
name: str,
|
name: str,
|
||||||
description: str,
|
description: str,
|
||||||
channel_id: int,
|
channel_id: int,
|
||||||
@ -43,11 +44,11 @@ class ScheduledEvent(TableABC):
|
|||||||
return self._id
|
return self._id
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def interval(self) -> str:
|
def interval(self) -> ScheduledEventIntervalEnum:
|
||||||
return self._interval
|
return self._interval
|
||||||
|
|
||||||
@interval.setter
|
@interval.setter
|
||||||
def interval(self, value: str):
|
def interval(self, value: ScheduledEventIntervalEnum):
|
||||||
self._interval = value
|
self._interval = value
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -145,11 +146,11 @@ class ScheduledEvent(TableABC):
|
|||||||
return str(
|
return str(
|
||||||
f"""
|
f"""
|
||||||
INSERT INTO `ScheduledEvents` (
|
INSERT INTO `ScheduledEvents` (
|
||||||
`Interval`, `Name`, `Description`, `ChannelId`, `StartTime`, `EndTime`, `EntityType`, `Location`, `ServerId`,
|
`Interval`, `Name`, `Description`, `ChannelId`, `StartTime`, `EndTime`, `EntityType`, `Location`, `ServerId`
|
||||||
) VALUES (
|
) VALUES (
|
||||||
'{self._interval}',
|
'{self._interval.value}',
|
||||||
'{self._name}',
|
'{self._name}',
|
||||||
'{self._description}',
|
{"NULL" if self._description is None else f"'{self._description}'"},
|
||||||
{"NULL" if self._channel_id is None else f"'{self._channel_id}'"},
|
{"NULL" if self._channel_id is None else f"'{self._channel_id}'"},
|
||||||
'{self._start_time}',
|
'{self._start_time}',
|
||||||
{"NULL" if self._end_time is None else f"'{self._end_time}'"},
|
{"NULL" if self._end_time is None else f"'{self._end_time}'"},
|
||||||
@ -165,7 +166,7 @@ class ScheduledEvent(TableABC):
|
|||||||
return str(
|
return str(
|
||||||
f"""
|
f"""
|
||||||
UPDATE `ScheduledEvents`
|
UPDATE `ScheduledEvents`
|
||||||
SET `Interval` = '{self._interval}',
|
SET `Interval` = '{self._interval.value}',
|
||||||
`Name` = '{self._name}',
|
`Name` = '{self._name}',
|
||||||
`Description` = '{self._start_time}',
|
`Description` = '{self._start_time}',
|
||||||
`ChannelId` = {"NULL" if self._channel_id is None else f"'{self._channel_id}'"},
|
`ChannelId` = {"NULL" if self._channel_id is None else f"'{self._channel_id}'"},
|
||||||
|
8
bot/src/bot_data/model/scheduled_event_interval_enum.py
Normal file
8
bot/src/bot_data/model/scheduled_event_interval_enum.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
class ScheduledEventIntervalEnum(Enum):
|
||||||
|
daily = "daily"
|
||||||
|
weekly = "weekly"
|
||||||
|
monthly = "monthly"
|
||||||
|
yearly = "yearly"
|
@ -1,9 +1,9 @@
|
|||||||
CREATE TABLE IF NOT EXISTS `ScheduledEvents`
|
CREATE TABLE IF NOT EXISTS `ScheduledEvents`
|
||||||
(
|
(
|
||||||
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
`Id` BIGINT NOT NULL AUTO_INCREMENT,
|
||||||
`Interval` VARCHAR(255) NOT NULL,
|
`Interval` ENUM ('daily', 'weekly', 'monthly', 'yearly') NOT NULL,
|
||||||
`Name` VARCHAR(255) NOT NULL,
|
`Name` VARCHAR(255) NOT NULL,
|
||||||
`Description` VARCHAR(255) NOT NULL,
|
`Description` VARCHAR(255) NULL,
|
||||||
`ChannelId` BIGINT NULL,
|
`ChannelId` BIGINT NULL,
|
||||||
`StartTime` DATETIME(6) NOT NULL,
|
`StartTime` DATETIME(6) NOT NULL,
|
||||||
`EndTime` DATETIME(6) NULL,
|
`EndTime` DATETIME(6) NULL,
|
||||||
@ -19,9 +19,9 @@ CREATE TABLE IF NOT EXISTS `ScheduledEvents`
|
|||||||
CREATE TABLE IF NOT EXISTS `ScheduledEventsHistory`
|
CREATE TABLE IF NOT EXISTS `ScheduledEventsHistory`
|
||||||
(
|
(
|
||||||
`Id` BIGINT(20) NOT NULL,
|
`Id` BIGINT(20) NOT NULL,
|
||||||
`Interval` VARCHAR(255) NOT NULL,
|
`Interval` ENUM ('daily', 'weekly', 'monthly', 'yearly') NOT NULL,
|
||||||
`Name` VARCHAR(255) NOT NULL,
|
`Name` VARCHAR(255) NOT NULL,
|
||||||
`Description` VARCHAR(255) NOT NULL,
|
`Description` VARCHAR(255) NULL,
|
||||||
`ChannelId` BIGINT NULL,
|
`ChannelId` BIGINT NULL,
|
||||||
`StartTime` DATETIME(6) NOT NULL,
|
`StartTime` DATETIME(6) NOT NULL,
|
||||||
`EndTime` DATETIME(6) NULL,
|
`EndTime` DATETIME(6) NULL,
|
||||||
|
@ -7,6 +7,7 @@ from bot_core.logging.database_logger import DatabaseLogger
|
|||||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
from bot_data.abc.scheduled_event_repository_abc import ScheduledEventRepositoryABC
|
from bot_data.abc.scheduled_event_repository_abc import ScheduledEventRepositoryABC
|
||||||
from bot_data.model.scheduled_event import ScheduledEvent
|
from bot_data.model.scheduled_event import ScheduledEvent
|
||||||
|
from bot_data.model.scheduled_event_interval_enum import ScheduledEventIntervalEnum
|
||||||
|
|
||||||
|
|
||||||
class ScheduledEventRepositoryService(ScheduledEventRepositoryABC):
|
class ScheduledEventRepositoryService(ScheduledEventRepositoryABC):
|
||||||
@ -32,17 +33,17 @@ class ScheduledEventRepositoryService(ScheduledEventRepositoryABC):
|
|||||||
|
|
||||||
def _scheduled_event_from_result(self, sql_result: tuple) -> ScheduledEvent:
|
def _scheduled_event_from_result(self, sql_result: tuple) -> ScheduledEvent:
|
||||||
return ScheduledEvent(
|
return ScheduledEvent(
|
||||||
self._get_value_from_result(sql_result[0]), # interval
|
self._get_value_from_result(ScheduledEventIntervalEnum(sql_result[1])), # interval
|
||||||
self._get_value_from_result(sql_result[1]), # name
|
self._get_value_from_result(sql_result[2]), # name
|
||||||
self._get_value_from_result(sql_result[2]), # description
|
self._get_value_from_result(sql_result[3]), # description
|
||||||
int(self._get_value_from_result(sql_result[3])), # channel_id
|
int(self._get_value_from_result(sql_result[4])), # channel_id
|
||||||
self._get_value_from_result(sql_result[4]), # start_time
|
self._get_value_from_result(sql_result[5]), # start_time
|
||||||
self._get_value_from_result(sql_result[5]), # end_time
|
self._get_value_from_result(sql_result[6]), # end_time
|
||||||
self._get_value_from_result(sql_result[6]), # entity_type
|
self._get_value_from_result(sql_result[7]), # entity_type
|
||||||
self._get_value_from_result(sql_result[7]), # location
|
self._get_value_from_result(sql_result[8]), # location
|
||||||
self._servers.get_server_by_id((sql_result[8])), # server
|
self._servers.get_server_by_id((sql_result[9])), # server
|
||||||
self._get_value_from_result(sql_result[9]), # created_at
|
self._get_value_from_result(sql_result[10]), # created_at
|
||||||
self._get_value_from_result(sql_result[10]), # modified_at
|
self._get_value_from_result(sql_result[11]), # modified_at
|
||||||
id=self._get_value_from_result(sql_result[0]),
|
id=self._get_value_from_result(sql_result[0]),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -63,7 +63,9 @@ class FilterABC(ABC):
|
|||||||
self.__setattr__(f"_{attr}", attr_type(values[attr]))
|
self.__setattr__(f"_{attr}", attr_type(values[attr]))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _filter_by_attributes(attrs: list[Callable], values: List[T]) -> List[R]:
|
def _filter_by_attributes(attrs: list[dict], values: List[T]) -> List[R]:
|
||||||
for attr in attrs:
|
for attr in attrs:
|
||||||
values = values.where(attr)
|
if attr["attr"] is None:
|
||||||
|
continue
|
||||||
|
values = values.where(attr["func"])
|
||||||
return values
|
return values
|
||||||
|
@ -51,15 +51,15 @@ class ScheduledEventFilter(FilterABC):
|
|||||||
|
|
||||||
query = self._filter_by_attributes(
|
query = self._filter_by_attributes(
|
||||||
[
|
[
|
||||||
lambda x: x.id == self._id,
|
{"attr": self._id, "func": lambda x: x.id == self._id},
|
||||||
lambda x: x.interval == self._interval,
|
{"attr": self._interval, "func": lambda x: x.interval == self._interval},
|
||||||
lambda x: x.name == self._name,
|
{"attr": self._name, "func": lambda x: x.name == self._name},
|
||||||
lambda x: x.description == self._description,
|
{"attr": self._description, "func": lambda x: x.description == self._description},
|
||||||
lambda x: x.channel_id == self._channel_id,
|
{"attr": self._channel_id, "func": lambda x: x.channel_id == self._channel_id},
|
||||||
lambda x: x.start_time == self._start_time,
|
{"attr": self._start_time, "func": lambda x: x.start_time == self._start_time},
|
||||||
lambda x: x.end_time == self._end_time,
|
{"attr": self._end_time, "func": lambda x: x.end_time == self._end_time},
|
||||||
lambda x: x.entity_type == self._entity_type,
|
{"attr": self._entity_type, "func": lambda x: x.entity_type == self._entity_type},
|
||||||
lambda x: x.location == self._location,
|
{"attr": self._location, "func": lambda x: x.location == self._location},
|
||||||
],
|
],
|
||||||
query,
|
query,
|
||||||
)
|
)
|
||||||
|
@ -4,6 +4,7 @@ from bot_graphql.mutations.achievement_mutation import AchievementMutation
|
|||||||
from bot_graphql.mutations.auto_role_mutation import AutoRoleMutation
|
from bot_graphql.mutations.auto_role_mutation import AutoRoleMutation
|
||||||
from bot_graphql.mutations.auto_role_rule_mutation import AutoRoleRuleMutation
|
from bot_graphql.mutations.auto_role_rule_mutation import AutoRoleRuleMutation
|
||||||
from bot_graphql.mutations.level_mutation import LevelMutation
|
from bot_graphql.mutations.level_mutation import LevelMutation
|
||||||
|
from bot_graphql.mutations.scheduled_event_mutation import ScheduledEventMutation
|
||||||
from bot_graphql.mutations.server_config_mutation import ServerConfigMutation
|
from bot_graphql.mutations.server_config_mutation import ServerConfigMutation
|
||||||
from bot_graphql.mutations.short_role_name_mutation import ShortRoleNameMutation
|
from bot_graphql.mutations.short_role_name_mutation import ShortRoleNameMutation
|
||||||
from bot_graphql.mutations.technician_config_mutation import TechnicianConfigMutation
|
from bot_graphql.mutations.technician_config_mutation import TechnicianConfigMutation
|
||||||
@ -23,6 +24,7 @@ class Mutation(MutationType):
|
|||||||
achievement_mutation: AchievementMutation,
|
achievement_mutation: AchievementMutation,
|
||||||
user_joined_game_server: UserJoinedGameServerMutation,
|
user_joined_game_server: UserJoinedGameServerMutation,
|
||||||
technician_config: TechnicianConfigMutation,
|
technician_config: TechnicianConfigMutation,
|
||||||
|
scheduled_event: ScheduledEventMutation,
|
||||||
server_config: ServerConfigMutation,
|
server_config: ServerConfigMutation,
|
||||||
short_role_name_mutation: ShortRoleNameMutation,
|
short_role_name_mutation: ShortRoleNameMutation,
|
||||||
):
|
):
|
||||||
@ -36,4 +38,5 @@ class Mutation(MutationType):
|
|||||||
self.set_field("userJoinedGameServer", lambda *_: user_joined_game_server)
|
self.set_field("userJoinedGameServer", lambda *_: user_joined_game_server)
|
||||||
self.set_field("shortRoleName", lambda *_: short_role_name_mutation)
|
self.set_field("shortRoleName", lambda *_: short_role_name_mutation)
|
||||||
self.set_field("technicianConfig", lambda *_: technician_config)
|
self.set_field("technicianConfig", lambda *_: technician_config)
|
||||||
|
self.set_field("scheduledEvent", lambda *_: scheduled_event)
|
||||||
self.set_field("serverConfig", lambda *_: server_config)
|
self.set_field("serverConfig", lambda *_: server_config)
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
|
||||||
from cpl_core.database.context import DatabaseContextABC
|
from cpl_core.database.context import DatabaseContextABC
|
||||||
from cpl_discord.service import DiscordBotServiceABC
|
from cpl_discord.service import DiscordBotServiceABC
|
||||||
|
|
||||||
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
from bot_data.abc.server_repository_abc import ServerRepositoryABC
|
||||||
from bot_data.abc.scheduled_event_repository_abc import ScheduledEventRepositoryABC
|
from bot_data.abc.scheduled_event_repository_abc import ScheduledEventRepositoryABC
|
||||||
from bot_data.model.scheduled_event import ScheduledEvent
|
from bot_data.model.scheduled_event import ScheduledEvent
|
||||||
|
from bot_data.model.scheduled_event_interval_enum import ScheduledEventIntervalEnum
|
||||||
from bot_data.model.user_role_enum import UserRoleEnum
|
from bot_data.model.user_role_enum import UserRoleEnum
|
||||||
from bot_graphql.abc.query_abc import QueryABC
|
from bot_graphql.abc.query_abc import QueryABC
|
||||||
from modules.permission.service.permission_service import PermissionService
|
from modules.permission.service.permission_service import PermissionService
|
||||||
@ -35,14 +38,14 @@ class ScheduledEventMutation(QueryABC):
|
|||||||
self._can_user_mutate_data(server, UserRoleEnum.moderator)
|
self._can_user_mutate_data(server, UserRoleEnum.moderator)
|
||||||
|
|
||||||
scheduled_event = ScheduledEvent(
|
scheduled_event = ScheduledEvent(
|
||||||
input["interval"],
|
ScheduledEventIntervalEnum(input["interval"]),
|
||||||
input["name"],
|
input["name"],
|
||||||
input["description"],
|
input["description"] if "description" in input else None,
|
||||||
input["channel_id"],
|
input["channelId"] if "channelId" in input else None,
|
||||||
input["start_time"],
|
datetime.strptime(input["startTime"], "%Y-%m-%dT%H:%M:%S.%fZ"),
|
||||||
input["end_time"],
|
datetime.strptime(input["endTime"], "%Y-%m-%dT%H:%M:%S.%fZ") if "endTime" in input else None,
|
||||||
input["entity_type"],
|
input["entityType"],
|
||||||
input["location"],
|
input["location"] if "location" in input else None,
|
||||||
server,
|
server,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -70,10 +73,10 @@ class ScheduledEventMutation(QueryABC):
|
|||||||
scheduled_event.interval = input["interval"] if "interval" in input else scheduled_event.interval
|
scheduled_event.interval = input["interval"] if "interval" in input else scheduled_event.interval
|
||||||
scheduled_event.name = input["name"] if "name" in input else scheduled_event.name
|
scheduled_event.name = input["name"] if "name" in input else scheduled_event.name
|
||||||
scheduled_event.description = input["description"] if "description" in input else scheduled_event.description
|
scheduled_event.description = input["description"] if "description" in input else scheduled_event.description
|
||||||
scheduled_event.channel_id = input["channel_id"] if "channel_id" in input else scheduled_event.channel_id
|
scheduled_event.channel_id = input["channelId"] if "channelId" in input else scheduled_event.channel_id
|
||||||
scheduled_event.start_time = input["start_time"] if "start_time" in input else scheduled_event.start_time
|
scheduled_event.start_time = input["startTime"] if "startTime" in input else scheduled_event.start_time
|
||||||
scheduled_event.end_time = input["end_time"] if "end_time" in input else scheduled_event.end_time
|
scheduled_event.end_time = input["endTime"] if "endTime" in input else scheduled_event.end_time
|
||||||
scheduled_event.entity_type = input["entity_type"] if "entity_type" in input else scheduled_event.entity_type
|
scheduled_event.entity_type = input["entityType"] if "entityType" in input else scheduled_event.entity_type
|
||||||
scheduled_event.location = input["location"] if "location" in input else scheduled_event.location
|
scheduled_event.location = input["location"] if "location" in input else scheduled_event.location
|
||||||
|
|
||||||
self._scheduled_events.update_scheduled_event(scheduled_event)
|
self._scheduled_events.update_scheduled_event(scheduled_event)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "web",
|
"name": "web",
|
||||||
"version": "1.2.2",
|
"version": "1.2.dev410",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"update-version": "ts-node update-version.ts",
|
"update-version": "ts-node update-version.ts",
|
||||||
|
@ -21,7 +21,8 @@ export interface Channel {
|
|||||||
export enum ChannelType {
|
export enum ChannelType {
|
||||||
category = "CategoryChannel",
|
category = "CategoryChannel",
|
||||||
text = "TextChannel",
|
text = "TextChannel",
|
||||||
voice = "VoiceChannel"
|
voice = "VoiceChannel",
|
||||||
|
stage = "StageChannel"
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Role {
|
export interface Role {
|
||||||
|
@ -9,12 +9,12 @@ export enum EventType {
|
|||||||
|
|
||||||
export interface ScheduledEvent extends DataWithHistory {
|
export interface ScheduledEvent extends DataWithHistory {
|
||||||
id?: number;
|
id?: number;
|
||||||
interval?: string;
|
interval?: ScheduledEventInterval;
|
||||||
name?: string;
|
name?: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
channelId?: string;
|
channelId?: string;
|
||||||
startTime?: string;
|
startTime?: Date;
|
||||||
endTime?: string;
|
endTime?: Date;
|
||||||
entityType?: EventType;
|
entityType?: EventType;
|
||||||
location?: string;
|
location?: string;
|
||||||
server?: Server;
|
server?: Server;
|
||||||
@ -32,3 +32,10 @@ export interface ScheduledEventFilter {
|
|||||||
location?: string;
|
location?: string;
|
||||||
server?: ServerFilter;
|
server?: ServerFilter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum ScheduledEventInterval {
|
||||||
|
daily = "daily",
|
||||||
|
weekly = "weekly",
|
||||||
|
monthly = "monthly",
|
||||||
|
yearly = "yearly"
|
||||||
|
}
|
||||||
|
@ -185,14 +185,16 @@ export class Mutations {
|
|||||||
endTime: $endTime,
|
endTime: $endTime,
|
||||||
entityType: $entityType,
|
entityType: $entityType,
|
||||||
location: $location,
|
location: $location,
|
||||||
serverId: $serverId}
|
serverId: $serverId
|
||||||
) {
|
}) {
|
||||||
id
|
interval
|
||||||
name
|
name
|
||||||
description
|
description
|
||||||
attribute
|
channelId
|
||||||
operator
|
startTime
|
||||||
value
|
endTime
|
||||||
|
entityType
|
||||||
|
location
|
||||||
server {
|
server {
|
||||||
id
|
id
|
||||||
}
|
}
|
||||||
@ -215,12 +217,17 @@ export class Mutations {
|
|||||||
location: $location,
|
location: $location,
|
||||||
serverId: $serverId}
|
serverId: $serverId}
|
||||||
) {
|
) {
|
||||||
id
|
interval
|
||||||
name
|
name
|
||||||
description
|
description
|
||||||
attribute
|
channelId
|
||||||
operator
|
startTime
|
||||||
value
|
endTime
|
||||||
|
entityType
|
||||||
|
location
|
||||||
|
server {
|
||||||
|
id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -397,7 +404,6 @@ export class Mutations {
|
|||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static createUserWarning = `
|
static createUserWarning = `
|
||||||
mutation createUserWarning($name: String, $description: String, $attribute: String, $operator: String, $value: String, $serverId: ID) {
|
mutation createUserWarning($name: String, $description: String, $attribute: String, $operator: String, $value: String, $serverId: ID) {
|
||||||
userWarning {
|
userWarning {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { CommonModule } from "@angular/common";
|
import { CommonModule, DatePipe } from "@angular/common";
|
||||||
import { HttpClientModule } from "@angular/common/http";
|
import { HttpClientModule } from "@angular/common/http";
|
||||||
import { NgModule } from "@angular/core";
|
import { NgModule } from "@angular/core";
|
||||||
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
|
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
|
||||||
@ -38,6 +38,8 @@ import { FileUploadModule } from "primeng/fileupload";
|
|||||||
import { SelectButtonModule } from "primeng/selectbutton";
|
import { SelectButtonModule } from "primeng/selectbutton";
|
||||||
import { TabViewModule } from "primeng/tabview";
|
import { TabViewModule } from "primeng/tabview";
|
||||||
import { RadioButtonModule } from "primeng/radiobutton";
|
import { RadioButtonModule } from "primeng/radiobutton";
|
||||||
|
import { InputTextareaModule } from "primeng/inputtextarea";
|
||||||
|
import { InputMaskModule } from "primeng/inputmask";
|
||||||
|
|
||||||
|
|
||||||
const PrimeNGModules = [
|
const PrimeNGModules = [
|
||||||
@ -69,7 +71,9 @@ const PrimeNGModules = [
|
|||||||
FileUploadModule,
|
FileUploadModule,
|
||||||
SelectButtonModule,
|
SelectButtonModule,
|
||||||
TabViewModule,
|
TabViewModule,
|
||||||
RadioButtonModule
|
RadioButtonModule,
|
||||||
|
InputTextareaModule,
|
||||||
|
InputMaskModule
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
@ -102,6 +106,9 @@ const PrimeNGModules = [
|
|||||||
MultiSelectColumnsComponent,
|
MultiSelectColumnsComponent,
|
||||||
FeatureFlagListComponent,
|
FeatureFlagListComponent,
|
||||||
DataImportAndExportComponent
|
DataImportAndExportComponent
|
||||||
|
],
|
||||||
|
providers: [
|
||||||
|
DatePipe
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
export class SharedModule {
|
export class SharedModule {
|
||||||
|
@ -1,28 +1,77 @@
|
|||||||
<div class="edit-dialog">
|
<div class="edit-dialog">
|
||||||
<p-dialog [header]="header" [(visible)]="visible" [modal]="true"
|
<p-dialog [contentStyle]="{'overflow':'visible'}" [header]="header" [(visible)]="visible" [modal]="true"
|
||||||
[draggable]="false" [resizable]="false"
|
[draggable]="false" [resizable]="false"
|
||||||
[style]="{ width: '50vw' }">
|
[style]="{ width: '500px', height: '575px' }">
|
||||||
<form [formGroup]="inputForm">
|
<form [formGroup]="inputForm">
|
||||||
<p-tabView [(activeIndex)]="activeIndex">
|
<p-tabView [(activeIndex)]="activeIndex">
|
||||||
<p-tabPanel header="{{'view.server.scheduled_events.edit_dialog.location.tab_name' | translate}}">
|
<p-tabPanel header="{{'view.server.scheduled_events.edit_dialog.location.tab_name' | translate}}">
|
||||||
|
<div class="form">
|
||||||
|
<div style="display: flex; flex-direction: column; gap: 5px;">
|
||||||
|
{{'view.server.scheduled_events.edit_dialog.location.interval' | translate}}:
|
||||||
|
<p-dropdown [options]="interval"
|
||||||
|
formControlName="interval"
|
||||||
|
placeholder="{{'view.server.scheduled_events.edit_dialog.location.interval' | translate}}"></p-dropdown>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="type">
|
||||||
<div *ngFor="let enum of EventType | keyvalue" class="field-checkbox">
|
<div *ngFor="let enum of EventType | keyvalue" class="field-checkbox">
|
||||||
<p-radioButton [inputId]="enum.key" [value]="enum.value" formControlName="entityType"></p-radioButton>
|
<p-radioButton [inputId]="enum.key" [value]="enum.value" formControlName="entityType"></p-radioButton>
|
||||||
<label [for]="enum.key"
|
<label [for]="enum.key"
|
||||||
class="ml-2">{{'view.server.scheduled_events.edit_dialog.location.' + enum.key | translate}}</label>
|
class="ml-2">{{'view.server.scheduled_events.edit_dialog.location.' + enum.key | translate}}</label>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="input">
|
||||||
|
<p-dropdown *ngIf="inputForm.controls.entityType.value == 1"
|
||||||
|
[options]="stageChannels"
|
||||||
|
optionLabel="name"
|
||||||
|
optionValue="id"
|
||||||
|
formControlName="channelId"
|
||||||
|
placeholder="{{'view.server.scheduled_events.edit_dialog.location.stage_input' | translate}}"></p-dropdown>
|
||||||
|
<p-dropdown *ngIf="inputForm.controls.entityType.value == 2"
|
||||||
|
[options]="voiceChannels"
|
||||||
|
optionLabel="name"
|
||||||
|
optionValue="id"
|
||||||
|
formControlName="channelId"
|
||||||
|
placeholder="{{'view.server.scheduled_events.edit_dialog.location.voice_input' | translate}}"></p-dropdown>
|
||||||
|
<input *ngIf="inputForm.controls.entityType.value == 3" pInputText class="table-edit-input"
|
||||||
|
formControlName="location"
|
||||||
|
placeholder="{{'view.server.scheduled_events.edit_dialog.location.somewhere_else' | translate}}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</p-tabPanel>
|
</p-tabPanel>
|
||||||
<p-tabPanel header="{{'view.server.scheduled_events.edit_dialog.event_info.tab_name' | translate}}">
|
<p-tabPanel header="{{'view.server.scheduled_events.edit_dialog.event_info.tab_name' | translate}}">
|
||||||
<p>
|
<div class="form">
|
||||||
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem
|
<div style="display: flex; flex-direction: column; gap: 5px;">
|
||||||
aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
|
{{'view.server.scheduled_events.edit_dialog.event_info.event_topic' | translate}}:
|
||||||
Nemo
|
<input pInputText class="table-edit-input"
|
||||||
enim
|
formControlName="name"
|
||||||
ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos
|
placeholder="{{'view.server.scheduled_events.edit_dialog.event_info.event_topic_input' | translate}}">
|
||||||
qui
|
</div>
|
||||||
ratione voluptatem sequi nesciunt. Consectetur, adipisci velit, sed quia non numquam eius modi.
|
|
||||||
</p>
|
<div style="display: flex; flex-direction: column; gap: 5px;">
|
||||||
|
{{'view.server.scheduled_events.edit_dialog.event_info.start_date_time' | translate}}:
|
||||||
|
<p-calendar formControlName="startTime" dateFormat="dd.mm.yy" [showIcon]="true"
|
||||||
|
[showTime]="true" [stepMinute]="15"></p-calendar>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex; flex-direction: column; gap: 5px;">
|
||||||
|
{{'view.server.scheduled_events.edit_dialog.event_info.end_date_time' | translate}}:
|
||||||
|
<p-calendar formControlName="endTime" dateFormat="dd.mm.yy" [showIcon]="true"
|
||||||
|
[showTime]="true" [stepMinute]="15"></p-calendar>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex; flex-direction: column; gap: 5px;">
|
||||||
|
{{'view.server.scheduled_events.edit_dialog.event_info.description' | translate}}:
|
||||||
|
<textarea rows="5" cols="30" pInputTextarea [autoResize]="true"
|
||||||
|
class="table-edit-input"
|
||||||
|
formControlName="description"
|
||||||
|
placeholder="{{'view.server.scheduled_events.edit_dialog.event_info.description_input' | translate}}"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</p-tabPanel>
|
</p-tabPanel>
|
||||||
</p-tabView>
|
</p-tabView>
|
||||||
|
</form>
|
||||||
<ng-template pTemplate="footer">
|
<ng-template pTemplate="footer">
|
||||||
<div style="display: flex;">
|
<div style="display: flex;">
|
||||||
<div class="btn-wrapper" style="flex: 1;">
|
<div class="btn-wrapper" style="flex: 1;">
|
||||||
@ -33,12 +82,11 @@
|
|||||||
<button pButton label="{{'common.abort' | translate}}" class="btn danger-btn"
|
<button pButton label="{{'common.abort' | translate}}" class="btn danger-btn"
|
||||||
(click)="visible = false"></button>
|
(click)="visible = false"></button>
|
||||||
<button *ngIf="activeIndex < 1" pButton label="{{'common.continue' | translate}}" class="btn"
|
<button *ngIf="activeIndex < 1" pButton label="{{'common.continue' | translate}}" class="btn"
|
||||||
(click)="next()"></button>
|
(click)="next()" [disabled]="!inputForm"></button>
|
||||||
<button *ngIf="activeIndex == 1" pButton label="{{'common.save' | translate}}" class="btn"
|
<button *ngIf="activeIndex == 1" pButton label="{{'common.save' | translate}}" class="btn"
|
||||||
(click)="saveEvent()" [disabled]="!inputForm.valid"></button>
|
(click)="saveEvent()" [disabled]="!inputForm.valid"></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</form>
|
|
||||||
</p-dialog>
|
</p-dialog>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,14 +1,26 @@
|
|||||||
import { Component, EventEmitter, Input, Output } from "@angular/core";
|
import { Component, EventEmitter, Input, OnInit, Output } from "@angular/core";
|
||||||
import { EventType, ScheduledEvent } from "../../../../../../models/data/scheduled_events.model";
|
import {
|
||||||
|
EventType,
|
||||||
|
ScheduledEvent,
|
||||||
|
ScheduledEventInterval
|
||||||
|
} from "../../../../../../models/data/scheduled_events.model";
|
||||||
import { TranslateService } from "@ngx-translate/core";
|
import { TranslateService } from "@ngx-translate/core";
|
||||||
import { FormBuilder, FormControl, Validators } from "@angular/forms";
|
import { FormBuilder, FormControl, FormGroup, Validators } from "@angular/forms";
|
||||||
|
import { SingleDiscordQuery } from "../../../../../../models/graphql/query.model";
|
||||||
|
import { Queries } from "../../../../../../models/graphql/queries.model";
|
||||||
|
import { Channel, ChannelType, Guild } from "../../../../../../models/data/discord.model";
|
||||||
|
import { DataService } from "../../../../../../services/data/data.service";
|
||||||
|
import { SpinnerService } from "../../../../../../services/spinner/spinner.service";
|
||||||
|
import { ActivatedRoute } from "@angular/router";
|
||||||
|
import { Server } from "../../../../../../models/data/server.model";
|
||||||
|
import { DatePipe } from "@angular/common";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: "app-edit-scheduled-event-dialog",
|
selector: "app-edit-scheduled-event-dialog",
|
||||||
templateUrl: "./edit-scheduled-event-dialog.component.html",
|
templateUrl: "./edit-scheduled-event-dialog.component.html",
|
||||||
styleUrls: ["./edit-scheduled-event-dialog.component.scss"]
|
styleUrls: ["./edit-scheduled-event-dialog.component.scss"]
|
||||||
})
|
})
|
||||||
export class EditScheduledEventDialogComponent {
|
export class EditScheduledEventDialogComponent implements OnInit {
|
||||||
@Input() event?: ScheduledEvent;
|
@Input() event?: ScheduledEvent;
|
||||||
@Output() save = new EventEmitter<ScheduledEvent>();
|
@Output() save = new EventEmitter<ScheduledEvent>();
|
||||||
|
|
||||||
@ -19,8 +31,9 @@ export class EditScheduledEventDialogComponent {
|
|||||||
set visible(val: boolean) {
|
set visible(val: boolean) {
|
||||||
if (!val) {
|
if (!val) {
|
||||||
this.event = undefined;
|
this.event = undefined;
|
||||||
|
this.inputForm.reset();
|
||||||
|
this.activeIndex = 0;
|
||||||
}
|
}
|
||||||
this.visible = val;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get header() {
|
get header() {
|
||||||
@ -32,26 +45,118 @@ export class EditScheduledEventDialogComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public activeIndex: number = 0;
|
public activeIndex: number = 0;
|
||||||
public inputForm = this.fb.group({
|
public inputForm!: FormGroup<{
|
||||||
|
entityType: FormControl<number | undefined | null>;
|
||||||
|
name: FormControl<string | undefined | null>;
|
||||||
|
description: FormControl<string | undefined | null>;
|
||||||
|
interval: FormControl<ScheduledEventInterval | undefined | null>;
|
||||||
|
location: FormControl<string | undefined | null>;
|
||||||
|
startTime: FormControl<Date | undefined | null>;
|
||||||
|
id: FormControl<number | undefined | null>;
|
||||||
|
endTime: FormControl<Date | undefined | null>;
|
||||||
|
channelId: FormControl<string | undefined | null>
|
||||||
|
}>;
|
||||||
|
server: Server = {};
|
||||||
|
public voiceChannels: Channel[] = [];
|
||||||
|
public stageChannels: Channel[] = [];
|
||||||
|
public guild: Guild = { channels: [], emojis: [], roles: [] };
|
||||||
|
public times: string[] = [];
|
||||||
|
public now = new Date();
|
||||||
|
public interval = Object.keys(ScheduledEventInterval).map(k => (
|
||||||
|
{
|
||||||
|
label: this.translate.instant(`view.server.scheduled_events.edit_dialog.location.intervals.${k}`),
|
||||||
|
value: k
|
||||||
|
}
|
||||||
|
));
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private translate: TranslateService,
|
||||||
|
private fb: FormBuilder,
|
||||||
|
private data: DataService,
|
||||||
|
private spinner: SpinnerService,
|
||||||
|
private route: ActivatedRoute,
|
||||||
|
private datePipe: DatePipe
|
||||||
|
) {
|
||||||
|
for (let i = 0; i < 25; i++) {
|
||||||
|
let time = "";
|
||||||
|
if (i < 10) {
|
||||||
|
time = `0${i}`;
|
||||||
|
} else {
|
||||||
|
time = `${i}`;
|
||||||
|
}
|
||||||
|
this.times.push(`${time}:00`);
|
||||||
|
this.times.push(`${time}:15`);
|
||||||
|
this.times.push(`${time}:30`);
|
||||||
|
this.times.push(`${time}:45`);
|
||||||
|
}
|
||||||
|
this.setInputForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ngOnInit() {
|
||||||
|
this.data.getServerFromRoute(this.route).then(server => {
|
||||||
|
this.server = server;
|
||||||
|
this.spinner.showSpinner();
|
||||||
|
|
||||||
|
this.data.query<SingleDiscordQuery>(Queries.guildsQuery, {
|
||||||
|
id: server?.discordId
|
||||||
|
}
|
||||||
|
).subscribe(data => {
|
||||||
|
if (data.discord.guilds) {
|
||||||
|
this.guild = data.discord.guilds[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.voiceChannels = this.guild.channels.filter(x => x.type === ChannelType.voice);
|
||||||
|
this.stageChannels = this.guild.channels.filter(x => x.type === ChannelType.stage);
|
||||||
|
this.setInputForm();
|
||||||
|
this.spinner.hideSpinner();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public setInputForm() {
|
||||||
|
if (this.now.getMinutes() % 15 != 0) {
|
||||||
|
if (this.now.getMinutes() < 15) {
|
||||||
|
this.now.setMinutes(15);
|
||||||
|
} else if (this.now.getMinutes() < 30) {
|
||||||
|
this.now.setMinutes(30);
|
||||||
|
} else if (this.now.getMinutes() < 45) {
|
||||||
|
this.now.setMinutes(45);
|
||||||
|
} else if (this.now.getMinutes() > 45) {
|
||||||
|
this.now.setMinutes(0);
|
||||||
|
this.now.setHours(this.now.getHours() + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.now.setSeconds(0);
|
||||||
|
|
||||||
|
this.inputForm = this.fb.group({
|
||||||
id: new FormControl<number | undefined>(this.event?.id),
|
id: new FormControl<number | undefined>(this.event?.id),
|
||||||
interval: new FormControl<string | undefined>(this.event?.interval, [Validators.required]),
|
interval: new FormControl<ScheduledEventInterval | undefined>(this.event?.interval, [Validators.required]),
|
||||||
entityType: new FormControl<number | undefined>(this.event?.entityType, [Validators.required]),
|
entityType: new FormControl<number | undefined>(this.event?.entityType, [Validators.required]),
|
||||||
channelId: new FormControl<string | undefined>(this.event?.channelId, this.event?.entityType == EventType.voice || this.event?.entityType == EventType.stageInstance ? [Validators.required] : []),
|
channelId: new FormControl<string | undefined>(this.event?.channelId, this.event?.entityType == EventType.voice || this.event?.entityType == EventType.stageInstance ? [Validators.required] : []),
|
||||||
location: new FormControl<string | undefined>(this.event?.location, this.event?.entityType == EventType.external ? [Validators.required] : []),
|
location: new FormControl<string | undefined>(this.event?.location, this.event?.entityType == EventType.external ? [Validators.required] : []),
|
||||||
name: new FormControl<string | undefined>(this.event?.name, [Validators.required]),
|
name: new FormControl<string | undefined>(this.event?.name, [Validators.required]),
|
||||||
startTime: new FormControl<string | undefined>(this.event?.startTime, [Validators.required]),
|
startTime: new FormControl<Date | undefined>(this.event?.startTime ? new Date(this.event.startTime) : this.now, [Validators.required]),
|
||||||
endTime: new FormControl<string | undefined>(this.event?.endTime),
|
endTime: new FormControl<Date | undefined>(this.event?.endTime ? new Date(this.event.endTime) : undefined),
|
||||||
description: new FormControl<string | undefined>(this.event?.description)
|
description: new FormControl<string | undefined>(this.event?.description)
|
||||||
});
|
});
|
||||||
|
|
||||||
constructor(
|
|
||||||
private translate: TranslateService,
|
|
||||||
private fb: FormBuilder
|
|
||||||
) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public saveEvent() {
|
public saveEvent() {
|
||||||
|
this.event = {
|
||||||
|
id: this.inputForm.controls.id.value ?? undefined,
|
||||||
|
interval: this.inputForm.controls.interval.value ?? undefined,
|
||||||
|
name: this.inputForm.controls.name.value ?? undefined,
|
||||||
|
description: this.inputForm.controls.description.value ?? undefined,
|
||||||
|
channelId: this.inputForm.controls.channelId.value ?? undefined,
|
||||||
|
startTime: this.inputForm.controls.startTime.value ?? undefined,
|
||||||
|
endTime: this.inputForm.controls.endTime.value ?? undefined,
|
||||||
|
entityType: this.inputForm.controls.entityType.value ?? undefined,
|
||||||
|
location: this.inputForm.controls.location.value ?? undefined,
|
||||||
|
server: this.server
|
||||||
|
};
|
||||||
|
|
||||||
this.save.emit(this.event);
|
this.save.emit(this.event);
|
||||||
|
this.event = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
public next() {
|
public next() {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<app-edit-scheduled-event-dialog [event]="editableScheduledEvent" (save)="onRowEditSave($event)"></app-edit-scheduled-event-dialog>
|
<app-edit-scheduled-event-dialog [event]="editableScheduledEvent"
|
||||||
|
(save)="onRowEditSave($event)"></app-edit-scheduled-event-dialog>
|
||||||
|
|
||||||
<h1>
|
<h1>
|
||||||
{{'view.server.scheduled_events.header' | translate}}
|
{{'view.server.scheduled_events.header' | translate}}
|
||||||
@ -123,7 +124,7 @@
|
|||||||
</form>
|
</form>
|
||||||
</th>
|
</th>
|
||||||
|
|
||||||
<th class="table-header-small"></th>
|
<th hideable-th="interval" [parent]="this"></th>
|
||||||
|
|
||||||
<th hideable-th="name" [parent]="this">
|
<th hideable-th="name" [parent]="this">
|
||||||
<form [formGroup]="filterForm">
|
<form [formGroup]="filterForm">
|
||||||
@ -132,12 +133,24 @@
|
|||||||
</form>
|
</form>
|
||||||
</th>
|
</th>
|
||||||
|
|
||||||
<th class="table-header-small"></th>
|
<th hideable-th="description" [parent]="this">
|
||||||
<th class="table-header-small"></th>
|
<form [formGroup]="filterForm">
|
||||||
<th class="table-header-small"></th>
|
<input type="text" pInputText formControlName="description"
|
||||||
<th class="table-header-small"></th>
|
placeholder="{{'common.description' | translate}}">
|
||||||
<th class="table-header-small"></th>
|
</form>
|
||||||
<th class="table-header-small"></th>
|
</th>
|
||||||
|
|
||||||
|
<th hideable-th="channel_id" [parent]="this">
|
||||||
|
<form [formGroup]="filterForm">
|
||||||
|
<input type="number" pInputText formControlName="channelId"
|
||||||
|
placeholder="{{'common.channel_id' | translate}}">
|
||||||
|
</form>
|
||||||
|
</th>
|
||||||
|
|
||||||
|
<th hideable-th="start_time" [parent]="this"></th>
|
||||||
|
<th hideable-th="end_time" [parent]="this"></th>
|
||||||
|
<th hideable-th="type" [parent]="this"></th>
|
||||||
|
<th hideable-th="location" [parent]="this"></th>
|
||||||
<th class="table-header-small-dropdown"></th>
|
<th class="table-header-small-dropdown"></th>
|
||||||
<th class="table-header-small-dropdown"></th>
|
<th class="table-header-small-dropdown"></th>
|
||||||
<th class="table-header-actions"></th>
|
<th class="table-header-actions"></th>
|
||||||
@ -148,133 +161,56 @@
|
|||||||
<tr [pEditableRow]="scheduledEvent">
|
<tr [pEditableRow]="scheduledEvent">
|
||||||
<td hideable-td="id" [parent]="this">
|
<td hideable-td="id" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.id' | translate}}:</span>
|
<span class="p-column-title">{{'common.id' | translate}}:</span>
|
||||||
<p-cellEditor>
|
|
||||||
<ng-template pTemplate="input">
|
|
||||||
{{scheduledEvent.id}}
|
{{scheduledEvent.id}}
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.id}}
|
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td hideable-td="interval" [parent]="this">
|
<td hideable-td="interval" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.interval' | translate}}:</span>
|
<span class="p-column-title">{{'common.interval' | translate}}:</span>
|
||||||
<p-cellEditor>
|
|
||||||
<ng-template pTemplate="input">
|
|
||||||
<input class="table-edit-input" pInputText type="text" [(ngModel)]="scheduledEvent.interval">
|
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.interval}}
|
{{scheduledEvent.interval}}
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td hideable-td="name" [parent]="this">
|
<td hideable-td="name" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.name' | translate}}:</span>
|
<span class="p-column-title">{{'common.name' | translate}}:</span>
|
||||||
<p-cellEditor>
|
|
||||||
<ng-template pTemplate="input">
|
|
||||||
<input class="table-edit-input" pInputText type="text" [(ngModel)]="scheduledEvent.name">
|
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.name}}
|
{{scheduledEvent.name}}
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td hideable-td="description" [parent]="this">
|
<td hideable-td="description" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.description' | translate}}:</span>
|
<span class="p-column-title">{{'common.description' | translate}}:</span>
|
||||||
<p-cellEditor>
|
|
||||||
<ng-template pTemplate="input">
|
|
||||||
<input class="table-edit-input" pInputText type="text" [(ngModel)]="scheduledEvent.description">
|
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.description}}
|
{{scheduledEvent.description}}
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td hideable-td="channel_id" [parent]="this">
|
<td hideable-td="channel_id" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.channel_id' | translate}}:</span>
|
<span class="p-column-title">{{'common.channel_id' | translate}}:</span>
|
||||||
<p-cellEditor>
|
{{scheduledEvent.channelId}}
|
||||||
<ng-template pTemplate="input">
|
|
||||||
<input class="table-edit-input" pInputText type="text" [(ngModel)]="scheduledEvent.channel_id">
|
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.channel_id}}
|
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td hideable-td="start_time" [parent]="this">
|
<td hideable-td="start_time" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.start_time' | translate}}:</span>
|
<span class="p-column-title">{{'common.start_time' | translate}}:</span>
|
||||||
<p-cellEditor>
|
{{scheduledEvent.startTime}}
|
||||||
<ng-template pTemplate="input">
|
|
||||||
<input class="table-edit-input" pInputText type="text" [(ngModel)]="scheduledEvent.start_time">
|
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.start_time}}
|
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td hideable-td="end_time" [parent]="this">
|
<td hideable-td="end_time" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.end_time' | translate}}:</span>
|
<span class="p-column-title">{{'common.end_time' | translate}}:</span>
|
||||||
<p-cellEditor>
|
{{scheduledEvent.endTime}}
|
||||||
<ng-template pTemplate="input">
|
|
||||||
<input class="table-edit-input" pInputText type="text" [(ngModel)]="scheduledEvent.end_time">
|
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.end_time}}
|
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td hideable-td="type" [parent]="this">
|
<td hideable-td="type" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.type' | translate}}:</span>
|
<span class="p-column-title">{{'common.type' | translate}}:</span>
|
||||||
<p-cellEditor>
|
{{scheduledEvent.entityType}}
|
||||||
<ng-template pTemplate="input">
|
|
||||||
<input class="table-edit-input" pInputText type="text" [(ngModel)]="scheduledEvent.type">
|
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.type}}
|
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td hideable-td="location" [parent]="this">
|
<td hideable-td="location" [parent]="this">
|
||||||
<span class="p-column-title">{{'common.location' | translate}}:</span>
|
<span class="p-column-title">{{'common.location' | translate}}:</span>
|
||||||
<p-cellEditor>
|
|
||||||
<ng-template pTemplate="input">
|
|
||||||
<input class="table-edit-input" pInputText type="text" [(ngModel)]="scheduledEvent.location">
|
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.location}}
|
{{scheduledEvent.location}}
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td>
|
<td>
|
||||||
<span class="p-column-title">{{'common.created_at' | translate}}:</span>
|
<span class="p-column-title">{{'common.created_at' | translate}}:</span>
|
||||||
<p-cellEditor>
|
|
||||||
<ng-template pTemplate="input">
|
|
||||||
{{scheduledEvent.createdAt | date:'dd.MM.yy HH:mm'}}
|
{{scheduledEvent.createdAt | date:'dd.MM.yy HH:mm'}}
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.createdAt | date:'dd.MM.yy HH:mm'}}
|
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span class="p-column-title">{{'common.modified_at' | translate}}:</span>
|
<span class="p-column-title">{{'common.modified_at' | translate}}:</span>
|
||||||
<p-cellEditor>
|
|
||||||
<ng-template pTemplate="input">
|
|
||||||
{{scheduledEvent.modifiedAt | date:'dd.MM.yy HH:mm'}}
|
{{scheduledEvent.modifiedAt | date:'dd.MM.yy HH:mm'}}
|
||||||
</ng-template>
|
|
||||||
<ng-template pTemplate="output">
|
|
||||||
{{scheduledEvent.modifiedAt | date:'dd.MM.yy HH:mm'}}
|
|
||||||
</ng-template>
|
|
||||||
</p-cellEditor>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="btn-wrapper">
|
<div class="btn-wrapper">
|
||||||
|
@ -118,7 +118,7 @@ export class ScheduledEventsComponent extends ComponentWithTable implements OnIn
|
|||||||
startTime: new FormControl<string | null>(null),
|
startTime: new FormControl<string | null>(null),
|
||||||
endTime: new FormControl<string | null>(null),
|
endTime: new FormControl<string | null>(null),
|
||||||
entityType: new FormControl<EventType | null>(null),
|
entityType: new FormControl<EventType | null>(null),
|
||||||
location: new FormControl<string | null>(null),
|
location: new FormControl<string | null>(null)
|
||||||
});
|
});
|
||||||
|
|
||||||
this.filterForm.valueChanges.pipe(
|
this.filterForm.valueChanges.pipe(
|
||||||
@ -221,7 +221,15 @@ export class ScheduledEventsComponent extends ComponentWithTable implements OnIn
|
|||||||
if (this.isEditingNew) {
|
if (this.isEditingNew) {
|
||||||
this.spinner.showSpinner();
|
this.spinner.showSpinner();
|
||||||
this.data.mutation<ScheduledEventMutationResult>(Mutations.createScheduledEvent, {
|
this.data.mutation<ScheduledEventMutationResult>(Mutations.createScheduledEvent, {
|
||||||
|
id: newScheduledEvent.id,
|
||||||
|
interval: newScheduledEvent.interval,
|
||||||
name: newScheduledEvent.name,
|
name: newScheduledEvent.name,
|
||||||
|
description: newScheduledEvent.description,
|
||||||
|
channelId: newScheduledEvent.channelId,
|
||||||
|
startTime: newScheduledEvent.startTime,
|
||||||
|
endTime: newScheduledEvent.endTime,
|
||||||
|
entityType: newScheduledEvent.entityType,
|
||||||
|
location: newScheduledEvent.location,
|
||||||
serverId: this.server.id
|
serverId: this.server.id
|
||||||
}
|
}
|
||||||
).pipe(catchError(err => {
|
).pipe(catchError(err => {
|
||||||
@ -240,7 +248,15 @@ export class ScheduledEventsComponent extends ComponentWithTable implements OnIn
|
|||||||
this.spinner.showSpinner();
|
this.spinner.showSpinner();
|
||||||
this.data.mutation<ScheduledEventMutationResult>(Mutations.updateScheduledEvent, {
|
this.data.mutation<ScheduledEventMutationResult>(Mutations.updateScheduledEvent, {
|
||||||
id: newScheduledEvent.id,
|
id: newScheduledEvent.id,
|
||||||
|
interval: newScheduledEvent.interval,
|
||||||
name: newScheduledEvent.name,
|
name: newScheduledEvent.name,
|
||||||
|
description: newScheduledEvent.description,
|
||||||
|
channelId: newScheduledEvent.channelId,
|
||||||
|
startTime: newScheduledEvent.startTime,
|
||||||
|
endTime: newScheduledEvent.endTime,
|
||||||
|
entityType: newScheduledEvent.entityType,
|
||||||
|
location: newScheduledEvent.location,
|
||||||
|
serverId: this.server.id
|
||||||
}
|
}
|
||||||
).pipe(catchError(err => {
|
).pipe(catchError(err => {
|
||||||
this.spinner.hideSpinner();
|
this.spinner.hideSpinner();
|
||||||
@ -250,6 +266,7 @@ export class ScheduledEventsComponent extends ComponentWithTable implements OnIn
|
|||||||
this.toastService.success(this.translate.instant("view.server.ScheduledEvents.message.scheduled_event_update"), this.translate.instant("view.server.ScheduledEvents.message.scheduled_event_update_d", { name: newScheduledEvent.name }));
|
this.toastService.success(this.translate.instant("view.server.ScheduledEvents.message.scheduled_event_update"), this.translate.instant("view.server.ScheduledEvents.message.scheduled_event_update_d", { name: newScheduledEvent.name }));
|
||||||
this.loadNextPage();
|
this.loadNextPage();
|
||||||
});
|
});
|
||||||
|
this.editableScheduledEvent = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
public deleteScheduledEvent(ScheduledEvent: ScheduledEvent): void {
|
public deleteScheduledEvent(ScheduledEvent: ScheduledEvent): void {
|
||||||
@ -272,6 +289,7 @@ export class ScheduledEventsComponent extends ComponentWithTable implements OnIn
|
|||||||
}
|
}
|
||||||
|
|
||||||
public addScheduledEvent(table: Table): void {
|
public addScheduledEvent(table: Table): void {
|
||||||
|
this.isEditingNew = true;
|
||||||
this.editableScheduledEvent = JSON.parse(JSON.stringify(this.newScheduledEventTemplate));
|
this.editableScheduledEvent = JSON.parse(JSON.stringify(this.newScheduledEventTemplate));
|
||||||
// const newScheduledEvent = JSON.parse(JSON.stringify(this.newScheduledEventTemplate));
|
// const newScheduledEvent = JSON.parse(JSON.stringify(this.newScheduledEventTemplate));
|
||||||
//
|
//
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from "@angular/core";
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from "@angular/common";
|
||||||
|
|
||||||
import { ScheduledEventsRoutingModule } from './scheduled-events-routing.module';
|
import { ScheduledEventsRoutingModule } from "./scheduled-events-routing.module";
|
||||||
import { ScheduledEventsComponent } from "./components/scheduled-events/scheduled-events.component";
|
import { ScheduledEventsComponent } from "./components/scheduled-events/scheduled-events.component";
|
||||||
import { SharedModule } from "../../../shared/shared.module";
|
import { SharedModule } from "../../../shared/shared.module";
|
||||||
import { EditScheduledEventDialogComponent } from './components/edit-scheduled-event-dialog/edit-scheduled-event-dialog.component';
|
import {
|
||||||
|
EditScheduledEventDialogComponent
|
||||||
|
} from "./components/edit-scheduled-event-dialog/edit-scheduled-event-dialog.component";
|
||||||
|
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
@ -16,6 +18,8 @@ import { EditScheduledEventDialogComponent } from './components/edit-scheduled-e
|
|||||||
CommonModule,
|
CommonModule,
|
||||||
SharedModule,
|
SharedModule,
|
||||||
ScheduledEventsRoutingModule
|
ScheduledEventsRoutingModule
|
||||||
]
|
],
|
||||||
|
exports: []
|
||||||
})
|
})
|
||||||
export class ScheduledEventsModule { }
|
export class ScheduledEventsModule {
|
||||||
|
}
|
||||||
|
@ -4,7 +4,7 @@ import { BehaviorSubject, forkJoin, Observable } from "rxjs";
|
|||||||
import { AuthRoles } from "../../models/auth/auth-roles.enum";
|
import { AuthRoles } from "../../models/auth/auth-roles.enum";
|
||||||
import { AuthService } from "../auth/auth.service";
|
import { AuthService } from "../auth/auth.service";
|
||||||
import { TranslateService } from "@ngx-translate/core";
|
import { TranslateService } from "@ngx-translate/core";
|
||||||
import { NavigationEnd, Router } from "@angular/router";
|
import { Router } from "@angular/router";
|
||||||
import { ThemeService } from "../theme/theme.service";
|
import { ThemeService } from "../theme/theme.service";
|
||||||
import { Server } from "../../models/data/server.model";
|
import { Server } from "../../models/data/server.model";
|
||||||
import { UserDTO } from "../../models/auth/auth-user.dto";
|
import { UserDTO } from "../../models/auth/auth-user.dto";
|
||||||
@ -113,7 +113,7 @@ export class SidebarService {
|
|||||||
|
|
||||||
this.serverScheduledEvents = {
|
this.serverScheduledEvents = {
|
||||||
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.scheduled_events") : "",
|
label: this.isSidebarOpen ? this.translateService.instant("sidebar.server.scheduled_events") : "",
|
||||||
icon: "pi pi-calender",
|
icon: "pi pi-calendar",
|
||||||
visible: true,
|
visible: true,
|
||||||
routerLink: `server/${this.server?.id}/scheduled-events`
|
routerLink: `server/${this.server?.id}/scheduled-events`
|
||||||
};
|
};
|
||||||
|
@ -335,6 +335,7 @@
|
|||||||
"config": "Konfiguration",
|
"config": "Konfiguration",
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"members": "Mitglieder",
|
"members": "Mitglieder",
|
||||||
|
"scheduled_events": "Geplante Events",
|
||||||
"server": {
|
"server": {
|
||||||
"achievements": "Errungenschaften",
|
"achievements": "Errungenschaften",
|
||||||
"auto_roles": "Auto Rollen",
|
"auto_roles": "Auto Rollen",
|
||||||
@ -343,6 +344,7 @@
|
|||||||
"levels": "Level",
|
"levels": "Level",
|
||||||
"members": "Mitglieder",
|
"members": "Mitglieder",
|
||||||
"profile": "Dein Profil",
|
"profile": "Dein Profil",
|
||||||
|
"scheduled_events": "Geplante Events",
|
||||||
"short_role_names": "Rollen Kürzel"
|
"short_role_names": "Rollen Kürzel"
|
||||||
},
|
},
|
||||||
"server_empty": "Kein Server ausgewählt",
|
"server_empty": "Kein Server ausgewählt",
|
||||||
@ -551,16 +553,24 @@
|
|||||||
"add_header": "Event hinzufügen",
|
"add_header": "Event hinzufügen",
|
||||||
"edit_header": "Event bearbeiten",
|
"edit_header": "Event bearbeiten",
|
||||||
"event_info": {
|
"event_info": {
|
||||||
|
"description": "Beschreibung",
|
||||||
"description_input": "Erzähl den Leuten ein wenig mehr über dein Event. Markdown, neue Zeilen und Links werden unterstützt.",
|
"description_input": "Erzähl den Leuten ein wenig mehr über dein Event. Markdown, neue Zeilen und Links werden unterstützt.",
|
||||||
"event_topic": "Thema",
|
"event_topic": "Thema",
|
||||||
"event_topic_input": "Worum geht es bei deinem Event?",
|
"event_topic_input": "Worum geht es bei deinem Event?",
|
||||||
"header": "Worum geht es bei deinem Event?",
|
"header": "Worum geht es bei deinem Event?",
|
||||||
"start_date": "Startdatum",
|
"start_date_time": "Startzeitpunkt",
|
||||||
"start_time": "Startzeit",
|
"end_date_time": "Endzeitpunkt",
|
||||||
"tab_name": "Eventinformationen"
|
"tab_name": "Eventinformationen"
|
||||||
},
|
},
|
||||||
"location": {
|
"location": {
|
||||||
"header": "Wo ist dein Event?",
|
"header": "Wo ist dein Event?",
|
||||||
|
"interval": "Interval",
|
||||||
|
"intervals": {
|
||||||
|
"daily": "Täglich",
|
||||||
|
"weekly": "Wöchentlich",
|
||||||
|
"monthly": "Monatlich",
|
||||||
|
"yearly": "Jährlich"
|
||||||
|
},
|
||||||
"somewhere_else": "Irgendwo anders",
|
"somewhere_else": "Irgendwo anders",
|
||||||
"somewhere_else_input": "Ort eingeben",
|
"somewhere_else_input": "Ort eingeben",
|
||||||
"stage": "Stage-Kanal",
|
"stage": "Stage-Kanal",
|
||||||
|
@ -338,6 +338,7 @@
|
|||||||
"levels": "Level",
|
"levels": "Level",
|
||||||
"members": "Members",
|
"members": "Members",
|
||||||
"profile": "Your profile",
|
"profile": "Your profile",
|
||||||
|
"scheduled_events": "Scheduled events",
|
||||||
"short_role_names": "Short role names"
|
"short_role_names": "Short role names"
|
||||||
},
|
},
|
||||||
"server_empty": "No server selected",
|
"server_empty": "No server selected",
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
"WebVersion": {
|
"WebVersion": {
|
||||||
"Major": "1",
|
"Major": "1",
|
||||||
"Minor": "2",
|
"Minor": "2",
|
||||||
"Micro": "2"
|
"Micro": "dev410"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -689,8 +689,42 @@ p-inputNumber {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
min-height: 101px !important;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.type {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
|
||||||
|
.field-checkbox {
|
||||||
|
display: flex;
|
||||||
|
gap: 15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input,
|
||||||
|
.p-dropdown {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
p-calendar {
|
||||||
|
.p-calendar {
|
||||||
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,3 +113,4 @@ p-table {
|
|||||||
.pi-sort-amount-down:before {
|
.pi-sort-amount-down:before {
|
||||||
content: "\e913" !important;
|
content: "\e913" !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -705,6 +705,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.p-datepicker {
|
.p-datepicker {
|
||||||
|
color: $primaryTextColor !important;
|
||||||
|
|
||||||
.p-datepicker-header {
|
.p-datepicker-header {
|
||||||
color: $primaryHeaderColor !important;
|
color: $primaryHeaderColor !important;
|
||||||
background-color: $primaryBackgroundColor !important;
|
background-color: $primaryBackgroundColor !important;
|
||||||
@ -764,6 +766,19 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.edit-dialog {
|
.edit-dialog {
|
||||||
|
textarea {
|
||||||
|
background-color: $secondaryBackgroundColor;
|
||||||
|
color: $primaryTextColor;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: $primaryHeaderColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
border-color: $primaryHeaderColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.p-dialog-content {
|
.p-dialog-content {
|
||||||
.p-tabview {
|
.p-tabview {
|
||||||
.p-tabview-nav li .p-tabview-nav-link:not(.p-disabled):focus {
|
.p-tabview-nav li .p-tabview-nav-link:not(.p-disabled):focus {
|
||||||
@ -784,4 +799,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.p-radiobutton {
|
||||||
|
.p-radiobutton-box.p-highlight {
|
||||||
|
border-color: $primaryHeaderColor !important;
|
||||||
|
background: $primaryHeaderColor !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-radiobutton-box:not(.p-disabled):not(.p-highlight):hover {
|
||||||
|
border-color: $primaryHeaderColor !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.p-radiobutton-box:not(.p-disabled).p-focus {
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user